Some cleanup for the RGB LED driver, added ioctl to set color

This commit is contained in:
Julian Oes
2013-08-15 17:43:01 +02:00
parent 0c4e3dce0e
commit 901cef922c
2 changed files with 102 additions and 93 deletions
@@ -32,7 +32,7 @@
****************************************************************************/ ****************************************************************************/
/** /**
* @file rgbled.h * @file drv_rgbled.h
* *
* RGB led device API * RGB led device API
*/ */
@@ -69,6 +69,9 @@
/** set constant RGB values */ /** set constant RGB values */
#define RGBLED_SET _RGBLEDIOC(4) #define RGBLED_SET _RGBLEDIOC(4)
/** set color */
#define RGBLED_SET_COLOR _RGBLEDIOC(5)
/* /*
structure passed to RGBLED_SET ioctl() structure passed to RGBLED_SET ioctl()
Note that the driver scales the brightness to 0 to 255, regardless Note that the driver scales the brightness to 0 to 255, regardless
@@ -79,3 +82,22 @@ struct RGBLEDSet {
uint8_t green; uint8_t green;
uint8_t blue; uint8_t blue;
}; };
typedef enum {
RGBLED_COLOR_OFF,
RGBLED_COLOR_RED,
RGBLED_COLOR_YELLOW,
RGBLED_COLOR_PURPLE,
RGBLED_COLOR_GREEN,
RGBLED_COLOR_BLUE,
RGBLED_COLOR_WHITE,
RGBLED_COLOR_AMBER,
} rgbled_color_t;
typedef enum {
RGBLED_BLINK_ON,
RGBLED_BLINK_FAST,
RGBLED_BLINK_NORMAL,
RGBLED_BLINK_SLOW,
RGBLED_BLINK_OFF
} rgbled_blinkmode_t;
+79 -92
View File
@@ -61,10 +61,10 @@
#include <board_config.h> #include <board_config.h>
#include "device/rgbled.h" #include <drivers/drv_rgbled.h>
#define LED_ONTIME 120 #define RGBLED_ONTIME 120
#define LED_OFFTIME 120 #define RGBLED_OFFTIME 120
#define ADDR PX4_I2C_OBDEV_LED /**< I2C adress of TCA62724FMG */ #define ADDR PX4_I2C_OBDEV_LED /**< I2C adress of TCA62724FMG */
#define SUB_ADDR_START 0x01 /**< write everything (with auto-increment) */ #define SUB_ADDR_START 0x01 /**< write everything (with auto-increment) */
@@ -78,10 +78,10 @@
enum ledModes { enum ledModes {
LED_MODE_TEST, RGBLED_MODE_TEST,
LED_MODE_SYSTEMSTATE, RGBLED_MODE_SYSTEMSTATE,
LED_MODE_OFF, RGBLED_MODE_OFF,
LED_MODE_RGB RGBLED_MODE_RGB
}; };
class RGBLED : public device::I2C class RGBLED : public device::I2C
@@ -98,35 +98,18 @@ public:
virtual int ioctl(struct file *filp, int cmd, unsigned long arg); virtual int ioctl(struct file *filp, int cmd, unsigned long arg);
private: private:
enum ledColors {
LED_COLOR_OFF,
LED_COLOR_RED,
LED_COLOR_YELLOW,
LED_COLOR_PURPLE,
LED_COLOR_GREEN,
LED_COLOR_BLUE,
LED_COLOR_WHITE,
LED_COLOR_AMBER,
};
enum ledBlinkModes {
LED_BLINK_ON,
LED_BLINK_OFF
};
work_s _work; work_s _work;
int led_colors[8]; rgbled_color_t _led_colors[8];
int led_blink; rgbled_blinkmode_t _led_blinkmode;
// RGB values for MODE_RGB // RGB values for MODE_RGB
struct RGBLEDSet rgb; struct RGBLEDSet _rgb;
int mode; int _mode;
int running; int _running;
void setLEDColor(int ledcolor); void setLEDColor(rgbled_color_t ledcolor);
static void led_trampoline(void *arg); static void led_trampoline(void *arg);
void led(); void led();
@@ -147,10 +130,10 @@ extern "C" __EXPORT int rgbled_main(int argc, char *argv[]);
RGBLED::RGBLED(int bus, int rgbled) : RGBLED::RGBLED(int bus, int rgbled) :
I2C("rgbled", RGBLED_DEVICE_PATH, bus, rgbled, 100000), I2C("rgbled", RGBLED_DEVICE_PATH, bus, rgbled, 100000),
led_colors({0,0,0,0,0,0,0,0}), _led_colors({RGBLED_COLOR_OFF,RGBLED_COLOR_OFF,RGBLED_COLOR_OFF,RGBLED_COLOR_OFF,RGBLED_COLOR_OFF,RGBLED_COLOR_OFF,RGBLED_COLOR_OFF,RGBLED_COLOR_OFF}),
led_blink(LED_BLINK_OFF), _led_blinkmode(RGBLED_BLINK_OFF),
mode(LED_MODE_OFF), _mode(RGBLED_MODE_OFF),
running(false) _running(false)
{ {
memset(&_work, 0, sizeof(_work)); memset(&_work, 0, sizeof(_work));
} }
@@ -179,25 +162,25 @@ int
RGBLED::setMode(enum ledModes new_mode) RGBLED::setMode(enum ledModes new_mode)
{ {
switch (new_mode) { switch (new_mode) {
case LED_MODE_SYSTEMSTATE: case RGBLED_MODE_SYSTEMSTATE:
case LED_MODE_TEST: case RGBLED_MODE_TEST:
case LED_MODE_RGB: case RGBLED_MODE_RGB:
mode = new_mode; _mode = new_mode;
if (!running) { if (!_running) {
running = true; _running = true;
set_on(true); set_on(true);
work_queue(LPWORK, &_work, (worker_t)&RGBLED::led_trampoline, this, 1); work_queue(LPWORK, &_work, (worker_t)&RGBLED::led_trampoline, this, 1);
} }
break; break;
case LED_MODE_OFF: case RGBLED_MODE_OFF:
default: default:
if (running) { if (_running) {
running = false; _running = false;
set_on(false); set_on(false);
} }
mode = LED_MODE_OFF; _mode = RGBLED_MODE_OFF;
break; break;
} }
@@ -244,10 +227,14 @@ RGBLED::ioctl(struct file *filp, int cmd, unsigned long arg)
switch (cmd) { switch (cmd) {
case RGBLED_SET: { case RGBLED_SET: {
/* set the specified RGB values */ /* set the specified RGB values */
memcpy(&rgb, (struct RGBLEDSet *)arg, sizeof(rgb)); memcpy(&_rgb, (struct RGBLEDSet *)arg, sizeof(_rgb));
setMode(LED_MODE_RGB); setMode(RGBLED_MODE_RGB);
return OK; return OK;
} }
case RGBLED_SET_COLOR: {
/* set the specified color name */
setLEDColor((rgbled_color_t)arg);
}
default: default:
break; break;
@@ -271,42 +258,42 @@ void
RGBLED::led() RGBLED::led()
{ {
static int led_thread_runcount=0; static int led_thread_runcount=0;
static int led_interval = 1000; static int _led_interval = 1000;
switch (mode) { switch (_mode) {
case LED_MODE_TEST: case RGBLED_MODE_TEST:
/* Demo LED pattern for now */ /* Demo LED pattern for now */
led_colors[0] = LED_COLOR_YELLOW; _led_colors[0] = RGBLED_COLOR_YELLOW;
led_colors[1] = LED_COLOR_AMBER; _led_colors[1] = RGBLED_COLOR_AMBER;
led_colors[2] = LED_COLOR_RED; _led_colors[2] = RGBLED_COLOR_RED;
led_colors[3] = LED_COLOR_PURPLE; _led_colors[3] = RGBLED_COLOR_PURPLE;
led_colors[4] = LED_COLOR_BLUE; _led_colors[4] = RGBLED_COLOR_BLUE;
led_colors[5] = LED_COLOR_GREEN; _led_colors[5] = RGBLED_COLOR_GREEN;
led_colors[6] = LED_COLOR_WHITE; _led_colors[6] = RGBLED_COLOR_WHITE;
led_colors[7] = LED_COLOR_OFF; _led_colors[7] = RGBLED_COLOR_OFF;
led_blink = LED_BLINK_ON; _led_blinkmode = RGBLED_BLINK_ON;
break; break;
case LED_MODE_SYSTEMSTATE: case RGBLED_MODE_SYSTEMSTATE:
/* XXX TODO set pattern */ /* XXX TODO set pattern */
led_colors[0] = LED_COLOR_OFF; _led_colors[0] = RGBLED_COLOR_OFF;
led_colors[1] = LED_COLOR_OFF; _led_colors[1] = RGBLED_COLOR_OFF;
led_colors[2] = LED_COLOR_OFF; _led_colors[2] = RGBLED_COLOR_OFF;
led_colors[3] = LED_COLOR_OFF; _led_colors[3] = RGBLED_COLOR_OFF;
led_colors[4] = LED_COLOR_OFF; _led_colors[4] = RGBLED_COLOR_OFF;
led_colors[5] = LED_COLOR_OFF; _led_colors[5] = RGBLED_COLOR_OFF;
led_colors[6] = LED_COLOR_OFF; _led_colors[6] = RGBLED_COLOR_OFF;
led_colors[7] = LED_COLOR_OFF; _led_colors[7] = RGBLED_COLOR_OFF;
led_blink = LED_BLINK_OFF; _led_blinkmode = RGBLED_BLINK_OFF;
break; break;
case LED_MODE_RGB: case RGBLED_MODE_RGB:
set_rgb(rgb.red, rgb.green, rgb.blue); set_rgb(_rgb.red, _rgb.green, _rgb.blue);
running = false; _running = false;
return; return;
case LED_MODE_OFF: case RGBLED_MODE_OFF:
default: default:
return; return;
break; break;
@@ -314,20 +301,20 @@ RGBLED::led()
if (led_thread_runcount & 1) { if (led_thread_runcount & 1) {
if (led_blink == LED_BLINK_ON) if (_led_blinkmode == RGBLED_BLINK_ON)
setLEDColor(LED_COLOR_OFF); setLEDColor(RGBLED_COLOR_OFF);
led_interval = LED_OFFTIME; _led_interval = RGBLED_OFFTIME;
} else { } else {
setLEDColor(led_colors[(led_thread_runcount/2) % 8]); setLEDColor(_led_colors[(led_thread_runcount/2) % 8]);
led_interval = LED_ONTIME; _led_interval = RGBLED_ONTIME;
} }
led_thread_runcount++; led_thread_runcount++;
if(running) { if(_running) {
/* re-queue ourselves to run again later */ /* re-queue ourselves to run again later */
work_queue(LPWORK, &_work, (worker_t)&RGBLED::led_trampoline, this, led_interval); work_queue(LPWORK, &_work, (worker_t)&RGBLED::led_trampoline, this, _led_interval);
} else if (mode == LED_MODE_RGB) { } else if (_mode == RGBLED_MODE_RGB) {
// no need to run again until the colour changes // no need to run again until the colour changes
set_on(true); set_on(true);
} else { } else {
@@ -335,30 +322,30 @@ RGBLED::led()
} }
} }
void RGBLED::setLEDColor(int ledcolor) { void RGBLED::setLEDColor(rgbled_color_t ledcolor) {
switch (ledcolor) { switch (ledcolor) {
case LED_COLOR_OFF: // off case RGBLED_COLOR_OFF: // off
set_rgb(0,0,0); set_rgb(0,0,0);
break; break;
case LED_COLOR_RED: // red case RGBLED_COLOR_RED: // red
set_rgb(255,0,0); set_rgb(255,0,0);
break; break;
case LED_COLOR_YELLOW: // yellow case RGBLED_COLOR_YELLOW: // yellow
set_rgb(255,70,0); set_rgb(255,70,0);
break; break;
case LED_COLOR_PURPLE: // purple case RGBLED_COLOR_PURPLE: // purple
set_rgb(255,0,255); set_rgb(255,0,255);
break; break;
case LED_COLOR_GREEN: // green case RGBLED_COLOR_GREEN: // green
set_rgb(0,255,0); set_rgb(0,255,0);
break; break;
case LED_COLOR_BLUE: // blue case RGBLED_COLOR_BLUE: // blue
set_rgb(0,0,255); set_rgb(0,0,255);
break; break;
case LED_COLOR_WHITE: // white case RGBLED_COLOR_WHITE: // white
set_rgb(255,255,255); set_rgb(255,255,255);
break; break;
case LED_COLOR_AMBER: // amber case RGBLED_COLOR_AMBER: // amber
set_rgb(255,20,0); set_rgb(255,20,0);
break; break;
} }
@@ -499,12 +486,12 @@ rgbled_main(int argc, char *argv[])
} }
if (!strcmp(verb, "test")) { if (!strcmp(verb, "test")) {
g_rgbled->setMode(LED_MODE_TEST); g_rgbled->setMode(RGBLED_MODE_TEST);
exit(0); exit(0);
} }
if (!strcmp(verb, "systemstate")) { if (!strcmp(verb, "systemstate")) {
g_rgbled->setMode(LED_MODE_SYSTEMSTATE); g_rgbled->setMode(RGBLED_MODE_SYSTEMSTATE);
exit(0); exit(0);
} }
@@ -514,7 +501,7 @@ rgbled_main(int argc, char *argv[])
} }
if (!strcmp(verb, "off")) { if (!strcmp(verb, "off")) {
g_rgbled->setMode(LED_MODE_OFF); g_rgbled->setMode(RGBLED_MODE_OFF);
exit(0); exit(0);
} }