diff options
| author | Selene ToyKeeper | 2019-07-30 20:16:16 -0600 |
|---|---|---|
| committer | Selene ToyKeeper | 2019-07-30 20:16:16 -0600 |
| commit | 319fbbcb6de77d26fd5d3e935dea47cd4c12ed07 (patch) | |
| tree | ab5a7bdf171b6ac8eb4f67674ee075cc0ec58933 /spaghetti-monster | |
| parent | fsm-ramping: turn opamp chip on and off automatically based on ramp level (diff) | |
| download | anduril-319fbbcb6de77d26fd5d3e935dea47cd4c12ed07.tar.gz anduril-319fbbcb6de77d26fd5d3e935dea47cd4c12ed07.tar.bz2 anduril-319fbbcb6de77d26fd5d3e935dea47cd4c12ed07.zip | |
anduril: allow RGB LEDs to stay on (in voltage mode) while main LEDs are on
(also, refactored RGB aux LED code a little; moved color table to ROM)
Diffstat (limited to '')
| -rw-r--r-- | spaghetti-monster/anduril/anduril.c | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index 9853878..a82ba4b 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -310,6 +310,7 @@ void indicator_blink(uint8_t arg); #endif #if defined(USE_AUX_RGB_LEDS) && defined(TICK_DURING_STANDBY) void rgb_led_update(uint8_t mode, uint8_t arg); +void rgb_led_voltage_readout(uint8_t bright); /* * 0: R * 1: RG @@ -321,6 +322,15 @@ void rgb_led_update(uint8_t mode, uint8_t arg); * 7: rainbow * 8: voltage */ +const PROGMEM uint8_t rgb_led_colors[] = { + 0b00000001, // 0: red + 0b00000101, // 1: yellow + 0b00000100, // 2: green + 0b00010100, // 3: cyan + 0b00010000, // 4: blue + 0b00010001, // 5: purple + 0b00010101, // 6: white +}; #define RGB_LED_NUM_COLORS 10 #define RGB_LED_NUM_PATTERNS 4 #ifndef RGB_LED_OFF_DEFAULT @@ -2269,36 +2279,28 @@ void rgb_led_update(uint8_t mode, uint8_t arg) { if ((! go_to_standby) && (pattern > 2)) { pattern = 2; } - uint8_t colors[] = { - 0b00000001, // 0: red - 0b00000101, // 1: yellow - 0b00000100, // 2: green - 0b00010100, // 3: cyan - 0b00010000, // 4: blue - 0b00010001, // 5: purple - 0b00010101, // 6: white - }; + const uint8_t *colors = rgb_led_colors; uint8_t actual_color = 0; if (color < 7) { // normal color - actual_color = colors[color]; + actual_color = pgm_read_byte(colors + color); } else if (color == 7) { // rainbow if (0 == (arg & 0x03)) { rainbow = (rainbow + 1) % 6; } - actual_color = colors[rainbow]; + actual_color = pgm_read_byte(colors + rainbow); } else { // voltage // show actual voltage while asleep... if (go_to_standby) { // choose a color based on battery voltage - if (volts >= 38) actual_color = colors[4]; - else if (volts >= 33) actual_color = colors[2]; - else actual_color = colors[0]; + if (volts >= 38) actual_color = pgm_read_byte(colors + 4); + else if (volts >= 33) actual_color = pgm_read_byte(colors + 2); + else actual_color = pgm_read_byte(colors + 0); } // ... but during preview, cycle colors quickly else { - actual_color = colors[((arg>>1) % 3) << 1]; + actual_color = pgm_read_byte(colors + (((arg>>1) % 3) << 1)); } } @@ -2322,6 +2324,31 @@ void rgb_led_update(uint8_t mode, uint8_t arg) { break; } } + +void rgb_led_voltage_readout(uint8_t bright) { + uint8_t volts = voltage; + if (volts < 29) { + rgb_led_set(0); + } + else { + uint8_t levels[] = { + 30, 0, + 33, 1, + 35, 2, + 37, 3, + 39, 4, + 40, 5, + 255, 6, + }; + uint8_t i; + for (i = 0; volts > levels[i]; i += 2) { + if (levels[i] >= volts) break; + } + uint8_t color = pgm_read_byte(rgb_led_colors + i); + if (bright) color = color << 1; + rgb_led_set(color); + } +} #endif @@ -2559,6 +2586,10 @@ void loop() { StatePtr state = current_state; + #ifdef USE_AUX_RGB_LEDS_WHILE_RAMPING + rgb_led_voltage_readout(1); + #endif + if (0) {} #ifdef USE_STROBE_STATE |
