From c54f47138d909bbc5e18fb909ee4d7a62c818f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 9 Dec 2018 21:29:18 +0100 Subject: control: add leds control code --- control/ledctl.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 control/ledctl.c (limited to 'control/ledctl.c') diff --git a/control/ledctl.c b/control/ledctl.c new file mode 100644 index 0000000..d6fdd1e --- /dev/null +++ b/control/ledctl.c @@ -0,0 +1,127 @@ +#include "ledctl.h" + +enum { + MODE_SOLID_RED, + MODE_SOLID_GREEN, + MODE_SOLID_BLUE, + MODE_SOLID_YELLOW, + MODE_RAINBOW, +} mode; +int brightness = 7; +int enabled = 0; +int current_brightness = 0; + +const char *mode_string[] = { + [MODE_SOLID_RED] = "#FF0000", + [MODE_SOLID_GREEN] = "#00FF00", + [MODE_SOLID_BLUE] = "#0000FF", + [MODE_SOLID_YELLOW] = "#FFFF00", + [MODE_RAINBOW] = "{\"type\":\"rainbow\", \"wait\":50}", +}; + + +enum { + STATE_DEFAULT, + STATE_COLOR_SELECT, + STATE_BRIGHTNESS_SELECT, +} state = STATE_DEFAULT; + + +void update_brightness() { + if (!enabled) + current_brightness = 0; + else + current_brightness = brightness > 7 ? 100 : (1 << (brightness - 1)); + bc_radio_pub_int("led/brightness/set", ¤t_brightness); +} + +void update_mode() { + if (mode == MODE_RAINBOW) + bc_radio_pub_string("led/effect/set", mode_string[mode]); + else + bc_radio_pub_string("led/color/set", mode_string[mode]); +} + +void click_left() { + switch (state) { + case STATE_DEFAULT: + enabled = 1; + update_brightness(); + break; + case STATE_BRIGHTNESS_SELECT: + if (brightness <= 8) + brightness++; + update_brightness(); + break; + case STATE_COLOR_SELECT: + if (mode >= MODE_RAINBOW) + mode = MODE_SOLID_RED; + else + mode++; + update_mode(); + break; + default: + break; + } +} + +void click_right() { + switch (state) { + case STATE_DEFAULT: + enabled = 0; + update_brightness(); + break; + case STATE_BRIGHTNESS_SELECT: + if (brightness >= 1) + brightness--; + update_brightness(); + break; + case STATE_COLOR_SELECT: + if (mode <= MODE_SOLID_RED) + mode = MODE_RAINBOW; + else + mode--; + update_mode(); + break; + default: + break; + } +} + +void hold_left() { + switch (state) { + case STATE_DEFAULT: + state = STATE_BRIGHTNESS_SELECT; + // TODO update image + break; + case STATE_COLOR_SELECT: + state = STATE_COLOR_SELECT; + // TODO + break; + case STATE_BRIGHTNESS_SELECT: + state = STATE_DEFAULT; + // TODO + break; + default: + break; + } +} + +void hold_right() { + switch (state) { + case STATE_DEFAULT: + state = STATE_COLOR_SELECT; + // TODO update image + break; + case STATE_COLOR_SELECT: + state = STATE_DEFAULT; + // TODO + break; + case STATE_BRIGHTNESS_SELECT: + state = STATE_BRIGHTNESS_SELECT; + // TODO + break; + default: + break; + } +} -- cgit v1.2.3