From fde727b601c1f71d4e66f2b247bce153ec380ae9 Mon Sep 17 00:00:00 2001 From: Abhishek Malik Date: Tue, 8 Nov 2016 12:14:32 -0800 Subject: [PATCH] Button: Adding C sources and C examples This commit adds C sources and examples for the button sensor. Signed-off-by: Abhishek Malik --- examples/c/CMakeLists.txt | 2 + examples/c/button.c | 59 +++++++++++++++++++++++ examples/c/button_intr.c | 54 +++++++++++++++++++++ src/button/CMakeLists.txt | 2 + src/button/button.c | 86 ++++++++++++++++++++++++++++++++++ src/button/button.h | 98 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 301 insertions(+) create mode 100644 examples/c/button.c create mode 100644 examples/c/button_intr.c create mode 100644 src/button/button.c create mode 100644 src/button/button.h diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt index 29e2466b..eecfa318 100644 --- a/examples/c/CMakeLists.txt +++ b/examples/c/CMakeLists.txt @@ -135,6 +135,8 @@ add_example (buzzer) add_example (ppd42ns) add_example (guvas12d) add_example (otp538u) +add_example (button) +add_example (button_intr) # Custom examples add_custom_example (nmea_gps_i2c-example-c nmea_gps_i2c.c nmea_gps) diff --git a/examples/c/button.c b/examples/c/button.c new file mode 100644 index 00000000..cccdde72 --- /dev/null +++ b/examples/c/button.c @@ -0,0 +1,59 @@ +/* + * Authors: Abhishek Malik + * Copyright (c) 2016 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include "button.h" + +#include "upm_utilities.h" +#include "mraa.h" + +int counter; + +void button_isr(void *arg){ + counter++; +} + +int main() +{ + counter = 0; + if (mraa_init() != MRAA_SUCCESS) + { + perror("Failed to initialize mraa\n"); + return -1; + } + + button_context dev = button_init(2); + + button_install_isr(dev, MRAA_GPIO_EDGE_RISING, button_isr, NULL); + while(1){ + printf("Interrupts: %d\n", counter); + upm_delay(3); + } + + return 0; +} diff --git a/examples/c/button_intr.c b/examples/c/button_intr.c new file mode 100644 index 00000000..c2702e45 --- /dev/null +++ b/examples/c/button_intr.c @@ -0,0 +1,54 @@ +/* + * Authors: Abhishek Malik + * Copyright (c) 2014 - 2016 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include "button.h" + +#include "upm_utilities.h" +#include "mraa.h" + +int main() +{ + if (mraa_init() != MRAA_SUCCESS) + { + perror("Failed to initialize mraa\n"); + return -1; + } + + button_context dev = button_init(2); + bool abc = 0; + while(1){ + if(button_get_value(dev, &abc) != UPM_SUCCESS){ + printf("an error has occured\n"); + } + upm_delay(1); + printf("value retrieved: %d\n", abc); + } + + return 0; +} diff --git a/src/button/CMakeLists.txt b/src/button/CMakeLists.txt index f272cbe6..25bbeba7 100644 --- a/src/button/CMakeLists.txt +++ b/src/button/CMakeLists.txt @@ -1,5 +1,7 @@ upm_mixed_module_init (NAME button DESCRIPTION "Momentary on/off button" + C_HDR button.h + C_SRC button.c CPP_HDR button.hpp CPP_SRC button.cxx REQUIRES mraa) diff --git a/src/button/button.c b/src/button/button.c new file mode 100644 index 00000000..9f109efe --- /dev/null +++ b/src/button/button.c @@ -0,0 +1,86 @@ +/* + * Authors: Brendan Le Foll + * Mihai Tudor Panu + * Sarah Knepper + * Abhishek Malik + * Copyright (c) 2014 - 2016 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "button.h" + +button_context button_init(int pin){ + // make sure that mraa is initialized + int mraa_rv; + if((mraa_rv = mraa_init()) != MRAA_SUCCESS){ + printf("%s: mraa_init() failed (%d).\n", __FUNCTION__, mraa_rv); + return NULL; + } + + button_context dev = (button_context) malloc(sizeof(struct _button_context)); + + if (dev == NULL){ + printf("Unable to allocate space for the sensor structure\n"); + return NULL; + } + + dev->gpio_pin = pin; + + dev->gpio = mraa_gpio_init(dev->gpio_pin); + mraa_gpio_dir(dev->gpio, MRAA_GPIO_IN); + dev->isr_installed = false; + + return dev; +} + +void button_close(button_context dev){ + mraa_gpio_close(dev->gpio); + free(dev); +} + +upm_result_t button_get_value(button_context dev, bool* val){ + int ret = mraa_gpio_read(dev->gpio); + + if(ret > 0) + *val = true; + else + *val = false; + + return UPM_SUCCESS; +} + +upm_result_t button_install_isr(button_context dev, mraa_gpio_edge_t edge_level, void (*isr)(void *), void *arg){ + button_uninstall_isr(dev); + + mraa_gpio_isr(dev->gpio, edge_level, isr, arg); + dev->isr_installed = true; + + return UPM_SUCCESS; +} + +upm_result_t button_uninstall_isr(button_context dev){ + if(dev->isr_installed) + mraa_gpio_isr_exit(dev->gpio); + + dev->isr_installed = false; + + return UPM_SUCCESS; +} diff --git a/src/button/button.h b/src/button/button.h new file mode 100644 index 00000000..1883f872 --- /dev/null +++ b/src/button/button.h @@ -0,0 +1,98 @@ +/* + * Authors: Brendan Le Foll + * Mihai Tudor Panu + * Sarah Knepper + * Abhishek Malik + * Copyright (c) 2014 - 2016 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include +#include +#include +#include + +#include "upm.h" +#include "mraa/gpio.h" + +/** + * @brief Button library + * @defgroup buttonlib libupm-button + * @ingroup seeed gpio button gsk + */ + +/** + * @library buttonlib + * @sensor button + * @comname Button + * @altname Grove Button + * @type button + * @man seeed + * @con gpio + * @kit gsk + * + * @brief API for the Button + * + * Basic UPM module for the button sensor + * + * @image html button.jpg + * @snippet button.cxx Interesting + */ + +typedef struct _button_context { + mraa_gpio_context gpio; + uint8_t gpio_pin; + bool isr_installed; +} *button_context; + +/** + * button init function + * + * @param gpio Pin to use + */ +button_context button_init(int pin); + +/** + * button destructor + */ +void button_close(button_context dev); +/** + * Gets the value from the GPIO pin + * + * @return Value from the GPIO pin + */ +upm_result_t button_get_value(button_context dev, bool* val); +/** + * Installs an interrupt service routine (ISR) to be called when + * the button is activated or deactivated. + * + * @param fptr Pointer to a function to be called on interrupt + * @param arg Pointer to an object to be supplied as an + * argument to the ISR. + */ +upm_result_t button_install_isr(button_context dev, mraa_gpio_edge_t edge_level, void (*isr)(void *), void *arg); +/** + * Uninstalls the previously installed ISR + * + */ +upm_result_t button_uninstall_isr(button_context);