diff --git a/src/led/led.c b/src/led/led.c index 008228bc..2f39e9f0 100644 --- a/src/led/led.c +++ b/src/led/led.c @@ -40,31 +40,87 @@ led_context led_init(int pin){ (led_context)malloc(sizeof(struct _led_context)); if (!dev) - return NULL; + return NULL; + + dev->name = NULL; + dev->gpioled = NULL; dev->led_pin = pin; dev->gpio = mraa_gpio_init(dev->led_pin); - if (mraa_gpio_dir(dev->gpio, MRAA_GPIO_OUT) != MRAA_SUCCESS) - return NULL; + if (mraa_gpio_dir(dev->gpio, MRAA_GPIO_OUT) != MRAA_SUCCESS) { + printf("%s: Unable to set pin %d as output.\n", __FUNCTION__, pin); + free(dev); + return NULL; + } + + return dev; +} + +led_context led_init_str(const char* name){ + // make sure 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; + } + + led_context dev = + (led_context)malloc(sizeof(struct _led_context)); + + if (!dev) + return NULL; + + dev->led_pin = -1; + dev->gpio = NULL; + + dev->name = name; + dev->gpioled = mraa_led_init(name); + + if (!dev->gpioled) { + printf("%s: Unable to initialize gpioled device (%s).\n", __FUNCTION__, dev->name); + free(dev); + return NULL; + } + + dev->max_brightness = mraa_led_read_max_brightness(dev->gpioled); return dev; } void led_close(led_context dev){ + if (dev->gpio) { + mraa_gpio_close(dev->gpio); + } + if (dev->gpioled) { + mraa_led_close(dev->gpioled); + } free(dev); } upm_result_t led_on(led_context dev){ - if (mraa_gpio_write(dev->gpio, 1) != MRAA_SUCCESS) - return UPM_ERROR_OPERATION_FAILED; - + if (dev->gpio) { + // using gpio pin + if (mraa_gpio_write(dev->gpio, 1) != MRAA_SUCCESS) + return UPM_ERROR_OPERATION_FAILED; + } else { + // using gpioled device + if (mraa_led_set_brightness(dev->gpioled, dev->max_brightness) != MRAA_SUCCESS) + return UPM_ERROR_OPERATION_FAILED; + } return UPM_SUCCESS; } upm_result_t led_off(led_context dev){ - if (mraa_gpio_write(dev->gpio, 0) != MRAA_SUCCESS) - return UPM_ERROR_OPERATION_FAILED; - + if (dev->gpio) { + // using gpio pin + if (mraa_gpio_write(dev->gpio, 0) != MRAA_SUCCESS) + return UPM_ERROR_OPERATION_FAILED; + } else { + // using gpioled device + if (mraa_led_set_brightness(dev->gpioled, 0) != MRAA_SUCCESS) + return UPM_ERROR_OPERATION_FAILED; + } return UPM_SUCCESS; } diff --git a/src/led/led.cxx b/src/led/led.cxx index ee74f939..ee088dd0 100644 --- a/src/led/led.cxx +++ b/src/led/led.cxx @@ -35,33 +35,41 @@ using namespace upm; Led::Led(int pin) { - if ( !(m_gpio = mraa_gpio_init(pin)) ) { + if ( !(m_led = led_init(pin)) ) { throw std::invalid_argument(std::string(__FUNCTION__) + ": mraa_gpio_init() failed, invalid pin?"); return; } - mraa_gpio_dir(m_gpio, MRAA_GPIO_OUT); +} + +Led::Led(std::string name) +{ + if ( !(m_led = led_init_str(name.c_str())) ) { + throw std::invalid_argument(std::string(__FUNCTION__) + + ": mraa_led_init() failed, invalid led name?"); + return; + } } Led::~Led() { - mraa_gpio_close(m_gpio); + led_close(m_led); } -mraa_result_t Led::write(int value) +upm_result_t Led::write(int value) { if (value >= 1) { - return mraa_gpio_write(m_gpio, 1); + return led_on(m_led); } - return mraa_gpio_write(m_gpio, 0); + return led_off(m_led); } -mraa_result_t Led::on() +upm_result_t Led::on() { return write(1); } -mraa_result_t Led::off() +upm_result_t Led::off() { return write(0); } diff --git a/src/led/led.h b/src/led/led.h index 64cc4664..1caa2147 100644 --- a/src/led/led.h +++ b/src/led/led.h @@ -33,6 +33,11 @@ #include #include "upm.h" #include "mraa/gpio.h" +#include "mraa/led.h" + +#ifdef __cplusplus +extern "C" { +#endif /** * @file led.h @@ -47,7 +52,10 @@ */ typedef struct _led_context { mraa_gpio_context gpio; + mraa_led_context gpioled; int led_pin; + const char* name; + int max_brightness; } *led_context; /** @@ -58,6 +66,14 @@ typedef struct _led_context { */ led_context led_init(int pin); +/** + * LED Initialization function + * + * @param name Linux gpioled device to use + * @return The sensor context + */ +led_context led_init_str(const char* name); + /** * LED Initialization function * @@ -81,4 +97,8 @@ upm_result_t led_on(led_context dev); */ upm_result_t led_off(led_context dev); +#ifdef __cplusplus +} +#endif + #endif /* LED_LED_H_ */ diff --git a/src/led/led.hpp b/src/led/led.hpp index 88e28ce4..d93e4f19 100644 --- a/src/led/led.hpp +++ b/src/led/led.hpp @@ -27,7 +27,6 @@ #pragma once #include -#include #include "led.h" namespace upm { @@ -67,6 +66,12 @@ class Led { * @param pin Pin to use */ Led(int pin); + /** + * LED constructor + * + * @param name Linux gpioled device name + */ + Led(std::string name); /** * LED destructor */ @@ -82,24 +87,24 @@ class Led { * * @return 0 if successful, non-zero otherwise */ - mraa_result_t write(int value); + upm_result_t write(int value); /** * Turns the LED off * * @return 0 if successful, non-zero otherwise */ - mraa_result_t off(); + upm_result_t off(); /** * Turns the LED on * * @return 0 if successful, non-zero otherwise */ - mraa_result_t on(); + upm_result_t on(); std::string name() { return "LED Sensor"; } private: - mraa_gpio_context m_gpio; + led_context m_led; }; }