rgbled: added LED_MODE_RGB to allow for constant RGB values

this allows apps to fully control the 3 LED elements
This commit is contained in:
Andrew Tridgell
2013-08-14 15:02:15 +02:00
committed by Lorenz Meier
parent e14d034528
commit 21a919d973
2 changed files with 56 additions and 6 deletions
+42 -6
View File
@@ -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:
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)
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)
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)
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()
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()
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();
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[])
/* 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[])
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();
}