diff --git a/src/ad8232/CMakeLists.txt b/src/ad8232/CMakeLists.txt index 8c04807b..6fe2d9a7 100644 --- a/src/ad8232/CMakeLists.txt +++ b/src/ad8232/CMakeLists.txt @@ -1,5 +1,9 @@ -set (libname "ad8232") -set (libdescription "upm ad8232 heart rate monitor") -set (module_src ${libname}.cxx) -set (module_hpp ${libname}.hpp) -upm_module_init() +upm_mixed_module_init (NAME ad8232 + DESCRIPTION "upm ad8232sensor module" + C_HDR ad8232.h + C_SRC ad8232.c + CPP_HDR ad8232.hpp + CPP_SRC ad8232.cxx + FTI_SRC ad8232_fti.c + CPP_WRAPS_C + REQUIRES mraa) \ No newline at end of file diff --git a/src/ad8232/ad8232.c b/src/ad8232/ad8232.c new file mode 100644 index 00000000..02a4fb16 --- /dev/null +++ b/src/ad8232/ad8232.c @@ -0,0 +1,87 @@ +/* + * Author: Jon Trulson + * 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 "ad8232.h" + +ad8232_context ad8232_init(int lo_plus, int lo_minus, int output, + float a_ref) { + ad8232_context dev = + (ad8232_context) malloc(sizeof(struct _ad8232_context)); + + if(dev == NULL){ + printf("Unable to assign memory to the Heart Rate Monitor structure"); + return NULL; + } + + dev->gpio_lo_plus_pin = lo_plus; + dev->gpio_lo_minus_pin = lo_minus; + dev->aio_pin = output; + + dev->aio = mraa_aio_init(dev->aio_pin); + dev->gpio_lo_plus = mraa_gpio_init(dev->gpio_lo_plus_pin); + dev->gpio_lo_minus = mraa_gpio_init(dev->gpio_lo_minus_pin); + + if (dev->aio == NULL || dev->gpio_lo_minus == NULL || + dev->gpio_lo_plus == NULL){ + printf("The pins did not initialize correctly"); + return NULL; + } + + if (mraa_gpio_dir(dev->gpio_lo_minus, MRAA_GPIO_IN) != MRAA_SUCCESS || + mraa_gpio_dir(dev->gpio_lo_plus, MRAA_GPIO_IN) != MRAA_SUCCESS){ + printf("Couldn't set the direction for the GPIO pins"); + return NULL; + } + + dev->a_res = (1 << mraa_aio_get_bit(dev->aio)); + return dev; +} + +void ad8232_close(ad8232_context dev){ + if (dev->gpio_lo_minus != NULL) + mraa_gpio_close(dev->gpio_lo_minus); + if (dev->gpio_lo_plus != NULL) + mraa_gpio_close(dev->gpio_lo_plus); + if (dev->aio != NULL) + mraa_aio_close(dev->aio); + + free(dev); +} + +upm_result_t ad8232_get_value(ad8232_context dev, int* value) { + int reading = 0; + + if (mraa_gpio_read(dev->gpio_lo_minus) || + mraa_gpio_read(dev->gpio_lo_plus)) { + reading = 0; + } + else { + reading = mraa_aio_read(dev->aio); + } + + *value = reading; + + return UPM_SUCCESS; +} diff --git a/src/ad8232/ad8232.h b/src/ad8232/ad8232.h new file mode 100644 index 00000000..862f085f --- /dev/null +++ b/src/ad8232/ad8232.h @@ -0,0 +1,61 @@ +/* + * Author: Jon Trulson + * 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. + */ + +#ifndef AD8232_H_ +#define AD8232_H_ + +#include +#include +#include + +#include "upm.h" +#include "mraa/aio.h" +#include "mraa/gpio.h" + +#define AD8232_DEFAULT_AREF 3.3 + +/** + * device context + */ +typedef struct _ad8232_context { + mraa_aio_context aio; + mraa_gpio_context gpio_lo_plus; + mraa_gpio_context gpio_lo_minus; + uint8_t aio_pin; + uint8_t gpio_lo_plus_pin; + uint8_t gpio_lo_minus_pin; + int a_res; +} *ad8232_context; + +/** + * Sensor Init function + */ +ad8232_context ad8232_init(int lo_plus, int lo_minus, int output, float a_ref); + +void ad8232_close(ad8232_context dev); + +upm_result_t ad8232_get_value(ad8232_context dev, int* value); + +#endif /* AD8232_H_ */ \ No newline at end of file diff --git a/src/ad8232/ad8232_fti.c b/src/ad8232/ad8232_fti.c new file mode 100644 index 00000000..beb6c74f --- /dev/null +++ b/src/ad8232/ad8232_fti.c @@ -0,0 +1,92 @@ +/* + * Author: Jon Trulson + * 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 "ad8232.h" +#include "upm_fti.h" + +/** + * This file implements the Function Table Interface (FTI) for this sensor + */ + +const char upm_ad8232_name[] = "AD8232"; +const char upm_ad8232_description[] = "AD8232 Heart Rate Monitor"; +const upm_protocol_t upm_ad8232_protocol[] = {UPM_ANALOG, UPM_GPIO}; +const upm_sensor_t upm_ad8232_category[] = {UPM_HEART_RATE}; + +// forward declarations +upm_sensor_descriptor_t upm_ad8232_get_descriptor (void* dev); +const void* upm_ad8232_get_ft(upm_sensor_t sensor_type); +void* upm_ad8232_init_name(); +void upm_ad8232_close(void* dev); +upm_result_t upm_ad8232_get_value(void* dev, int* value, + upm_heart_rate_u rate_unit); + +upm_sensor_descriptor_t upm_ad8232_get_descriptor (void* dev){ + upm_sensor_descriptor_t usd; + usd.name = upm_ad8232_name; + usd.description = upm_ad8232_description; + usd.protocol_size = 2; + usd.protocol = upm_ad8232_protocol; + usd.category_size = 1; + usd.category = upm_ad8232_category; + return usd; +} + +static const upm_sensor_ft ft = +{ + .upm_sensor_init_name = &upm_ad8232_init_name, + .upm_sensor_close = &upm_ad8232_close, + //.upm_sensor_get_descriptor = &upm_ad8232_get_descriptor +}; + +static const upm_heart_rate_ft hft = +{ + .upm_heart_rate_get_value = &upm_ad8232_get_value +}; + +const void* upm_ad8232_get_ft(upm_sensor_t sensor_type){ + if(sensor_type == UPM_HEART_RATE){ + return &hft; + } + else if(sensor_type == UPM_SENSOR){ + return &ft; + } + + return NULL; +} + +void* upm_ad8232_init_name(){ + return NULL; +} + +void upm_ad8232_close(void* dev){ + ad8232_close(dev); +} + +upm_result_t upm_ad8232_get_value(void* dev, int* value, + upm_heart_rate_u rate_unit){ + // rate_unit does not apply to this device, so... + return ad8232_get_value(dev, value); +} \ No newline at end of file