Browse Source

rgbled: added LED_MODE_RGB to allow for constant RGB values

this allows apps to fully control the 3 LED elements
sbg
Andrew Tridgell 12 years ago committed by Lorenz Meier
parent
commit
21a919d973
  1. 48
      src/drivers/rgbled/rgbled.cpp
  2. 14
      src/include/device/rgbled.h

48
src/drivers/rgbled/rgbled.cpp

@ -80,7 +80,8 @@ @@ -80,7 +80,8 @@
enum ledModes {
LED_MODE_TEST,
LED_MODE_SYSTEMSTATE,
LED_MODE_OFF
LED_MODE_OFF,
LED_MODE_RGB
};
class RGBLED : public device::I2C
@ -119,6 +120,9 @@ private: @@ -119,6 +120,9 @@ private:
int led_colors[8];
int led_blink;
// RGB values for MODE_RGB
struct RGBLEDSet rgb;
int mode;
int running;
@ -178,6 +182,7 @@ RGBLED::setMode(enum ledModes new_mode) @@ -178,6 +182,7 @@ RGBLED::setMode(enum ledModes new_mode)
switch (new_mode) {
case LED_MODE_SYSTEMSTATE:
case LED_MODE_TEST:
case LED_MODE_RGB:
mode = new_mode;
if (!running) {
running = true;
@ -185,6 +190,7 @@ RGBLED::setMode(enum ledModes new_mode) @@ -185,6 +190,7 @@ RGBLED::setMode(enum ledModes new_mode)
work_queue(LPWORK, &_work, (worker_t)&RGBLED::led_trampoline, this, 1);
}
break;
case LED_MODE_OFF:
default:
@ -237,6 +243,12 @@ RGBLED::ioctl(struct file *filp, int cmd, unsigned long arg) @@ -237,6 +243,12 @@ RGBLED::ioctl(struct file *filp, int cmd, unsigned long arg)
int ret = ENOTTY;
switch (cmd) {
case RGBLED_SET: {
/* set the specified RGB values */
memcpy(&rgb, (struct RGBLEDSet *)arg, sizeof(rgb));
setMode(LED_MODE_RGB);
return OK;
}
default:
break;
@ -290,6 +302,11 @@ RGBLED::led() @@ -290,6 +302,11 @@ RGBLED::led()
break;
case LED_MODE_RGB:
set_rgb(rgb.red, rgb.green, rgb.blue);
running = false;
return;
case LED_MODE_OFF:
default:
return;
@ -308,10 +325,12 @@ RGBLED::led() @@ -308,10 +325,12 @@ RGBLED::led()
led_thread_runcount++;
if(running) {
/* re-queue ourselves to run again later */
work_queue(LPWORK, &_work, (worker_t)&RGBLED::led_trampoline, this, led_interval);
} else if (mode == LED_MODE_RGB) {
// no need to run again until the colour changes
set_on(true);
} else {
set_on(false);
}
@ -412,7 +431,7 @@ void rgbled_usage(); @@ -412,7 +431,7 @@ void rgbled_usage();
void rgbled_usage() {
warnx("missing command: try 'start', 'systemstate', 'test', 'info', 'off'");
warnx("missing command: try 'start', 'systemstate', 'test', 'info', 'off', 'rgb'");
warnx("options:");
warnx(" -b i2cbus (%d)", PX4_I2C_BUS_LED);
errx(0, " -a addr (0x%x)", ADDR);
@ -461,9 +480,9 @@ rgbled_main(int argc, char *argv[]) @@ -461,9 +480,9 @@ rgbled_main(int argc, char *argv[])
/* need the driver past this point */
if (g_rgbled == nullptr) {
fprintf(stderr, "not started\n");
rgbled_usage();
exit(0);
fprintf(stderr, "not started\n");
rgbled_usage();
exit(0);
}
if (!strcmp(verb, "test")) {
@ -486,5 +505,22 @@ rgbled_main(int argc, char *argv[]) @@ -486,5 +505,22 @@ rgbled_main(int argc, char *argv[])
exit(0);
}
if (!strcmp(verb, "rgb")) {
int fd = open(RGBLED_DEVICE_PATH, 0);
if (fd == -1) {
errx(1, "Unable to open " RGBLED_DEVICE_PATH);
}
if (argc < 4) {
errx(1, "Usage: rgbled rgb <red> <green> <blue>");
}
struct RGBLEDSet v;
v.red = strtol(argv[1], NULL, 0);
v.green = strtol(argv[2], NULL, 0);
v.blue = strtol(argv[3], NULL, 0);
int ret = ioctl(fd, RGBLED_SET, (unsigned long)&v);
close(fd);
exit(ret);
}
rgbled_usage();
}

14
src/include/device/rgbled.h

@ -65,3 +65,17 @@ @@ -65,3 +65,17 @@
* The script is terminated by a zero command.
*/
#define RGBLED_SET_USER_SCRIPT _RGBLEDIOC(3)
/** set constant RGB values */
#define RGBLED_SET _RGBLEDIOC(4)
/*
structure passed to RGBLED_SET ioctl()
Note that the driver scales the brightness to 0 to 255, regardless
of the hardware scaling
*/
struct RGBLEDSet {
uint8_t red;
uint8_t green;
uint8_t blue;
};

Loading…
Cancel
Save