led: update to use gpioled if desired, better C code wrapper

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
Mihai Tudor Panu 2018-01-08 16:36:26 -08:00
parent b367a63010
commit b244fe45d1
4 changed files with 111 additions and 22 deletions

View File

@ -42,29 +42,85 @@ led_context led_init(int pin){
if (!dev)
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)
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 (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 (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;
}

View File

@ -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);
}

View File

@ -33,6 +33,11 @@
#include <stdint.h>
#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_ */

View File

@ -27,7 +27,6 @@
#pragma once
#include <string>
#include <mraa/gpio.hpp>
#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;
};
}