From 7851656847738192e0e12cfe77861ba58d98cf6f Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 6 Sep 2019 04:38:00 -0600 Subject: added button LED support to D4v2 (in a way which doesn't break backward compatibility... ... but it really needs some refactoring to reduce code duplication) --- hwdef-Emisar_D4v2.h | 10 +++++++-- spaghetti-monster/anduril/anduril.c | 33 ++++++++++++++++++++++++----- spaghetti-monster/anduril/cfg-emisar-d4v2.h | 4 ++++ spaghetti-monster/fsm-misc.c | 23 ++++++++++++++++++++ spaghetti-monster/fsm-misc.h | 6 ++++++ spaghetti-monster/fsm-ramping.c | 3 +++ 6 files changed, 72 insertions(+), 7 deletions(-) diff --git a/hwdef-Emisar_D4v2.h b/hwdef-Emisar_D4v2.h index 0460fad..addf429 100644 --- a/hwdef-Emisar_D4v2.h +++ b/hwdef-Emisar_D4v2.h @@ -9,7 +9,7 @@ * 3 PA4 green aux LED * 4 PA3 blue aux LED * 5 PA2 e-switch - * 6 PA1 (none) + * 6 PA1 button LED * 7 PA0 (none) * 8 GND GND * 9 VCC VCC @@ -65,17 +65,23 @@ #define AUXLED_RGB_DDR DDRA // DDRA or DDRB or DDRC #define AUXLED_RGB_PUE PUEA // PUEA or PUEB or PUEC +#define BUTTON_LED_PIN PA1 // pin 6 +#define BUTTON_LED_PORT PORTA // for all "PA" pins +#define BUTTON_LED_DDR DDRA // for all "PA" pins +#define BUTTON_LED_PUE PUEA // for all "PA" pins + // with so many pins, doing this all with #ifdefs gets awkward... // ... so just hardcode it in each hwdef file instead inline void hwdef_setup() { // enable output ports // 7135 DDRB = (1 << PWM1_PIN); - // FET, aux R/G/B + // FET, aux R/G/B, button LED DDRA = (1 << PWM2_PIN) | (1 << AUXLED_R_PIN) | (1 << AUXLED_G_PIN) | (1 << AUXLED_B_PIN) + | (1 << BUTTON_LED_PIN) ; // configure PWM diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index 8ab66f5..5032dcd 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -2257,7 +2257,13 @@ void rgb_led_update(uint8_t mode, uint8_t arg) { // turn off aux LEDs when battery is empty // (but if voltage==0, that means we just booted and don't know yet) uint8_t volts = voltage; // save a few bytes by caching volatile value - if ((volts) && (volts < VOLTAGE_LOW)) { rgb_led_set(0); return; } + if ((volts) && (volts < VOLTAGE_LOW)) { + rgb_led_set(0); + #ifdef USE_BUTTON_LED + button_led_set(0); + #endif + return; + } uint8_t pattern = (mode>>4); // off, low, high, blinking, ... more? uint8_t color = mode & 0x0f; @@ -2307,17 +2313,34 @@ void rgb_led_update(uint8_t mode, uint8_t arg) { frame = (frame + 1) % sizeof(animation); pattern = animation[frame]; } + uint8_t result; + #ifdef USE_BUTTON_LED + uint8_t button_led_result; + #endif switch (pattern) { case 0: // off - rgb_led_set(0); + result = 0; + #ifdef USE_BUTTON_LED + button_led_result = 0; + #endif break; case 1: // low - rgb_led_set(actual_color); + result = actual_color; + #ifdef USE_BUTTON_LED + button_led_result = 1; + #endif break; - case 2: // high - rgb_led_set(actual_color << 1); + default: // high + result = (actual_color << 1); + #ifdef USE_BUTTON_LED + button_led_result = 2; + #endif break; } + rgb_led_set(result); + #ifdef USE_BUTTON_LED + button_led_set(button_led_result); + #endif } #endif diff --git a/spaghetti-monster/anduril/cfg-emisar-d4v2.h b/spaghetti-monster/anduril/cfg-emisar-d4v2.h index b83c65c..d0d2cf6 100644 --- a/spaghetti-monster/anduril/cfg-emisar-d4v2.h +++ b/spaghetti-monster/anduril/cfg-emisar-d4v2.h @@ -4,7 +4,11 @@ // this light has three aux LED channels: R, G, B #define USE_AUX_RGB_LEDS +// it also has an independent LED in the button +#define USE_BUTTON_LED // the aux LEDs are front-facing, so turn them off while main LEDs are on +// TODO: the whole "indicator LED" thing needs to be refactored into +// "aux LED(s)" and "button LED(s)" since they work a bit differently #ifdef USE_INDICATOR_LED_WHILE_RAMPING #undef USE_INDICATOR_LED_WHILE_RAMPING #endif diff --git a/spaghetti-monster/fsm-misc.c b/spaghetti-monster/fsm-misc.c index 8e88cbd..18dc7c5 100644 --- a/spaghetti-monster/fsm-misc.c +++ b/spaghetti-monster/fsm-misc.c @@ -147,6 +147,29 @@ void indicator_led_auto() { */ #endif // USE_INDICATOR_LED +#ifdef USE_BUTTON_LED +// TODO: Refactor this and RGB LED function to merge code and save space +void button_led_set(uint8_t lvl) { + switch (lvl) { + case 0: // LED off + BUTTON_LED_DDR &= 0xff ^ (1 << BUTTON_LED_PIN); + BUTTON_LED_PUE &= 0xff ^ (1 << BUTTON_LED_PIN); + BUTTON_LED_PORT &= 0xff ^ (1 << BUTTON_LED_PIN); + break; + case 1: // LED low + BUTTON_LED_DDR &= 0xff ^ (1 << BUTTON_LED_PIN); + BUTTON_LED_PUE |= (1 << BUTTON_LED_PIN); + BUTTON_LED_PORT |= (1 << BUTTON_LED_PIN); + break; + default: // LED high + BUTTON_LED_DDR |= (1 << BUTTON_LED_PIN); + BUTTON_LED_PUE |= (1 << BUTTON_LED_PIN); + BUTTON_LED_PORT |= (1 << BUTTON_LED_PIN); + break; + } +} +#endif + #ifdef USE_AUX_RGB_LEDS void rgb_led_set(uint8_t value) { // value: 0b00BBGGRR diff --git a/spaghetti-monster/fsm-misc.h b/spaghetti-monster/fsm-misc.h index a39d31a..66d31ba 100644 --- a/spaghetti-monster/fsm-misc.h +++ b/spaghetti-monster/fsm-misc.h @@ -43,10 +43,16 @@ uint8_t blink(uint8_t num, uint8_t speed); */ #ifdef USE_INDICATOR_LED +// FIXME: Remove this, replace with button_led() // lvl: 0=off, 1=low, 2=high void indicator_led(uint8_t lvl); #endif +#ifdef USE_BUTTON_LED +// lvl: 0=off, 1=low, 2=high +void button_led_set(uint8_t lvl); +#endif + #ifdef USE_AUX_RGB_LEDS // value: 0b00BBGGRR // each pair of bits: 0=off, 1=low, 2=high diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index efa07e4..37c8073 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -46,6 +46,9 @@ void set_level(uint8_t level) { #endif #ifdef USE_AUX_RGB_LEDS rgb_led_set(0); + #ifdef USE_BUTTON_LED + button_led_set((level > 0) + (level > MAX_1x7135)); + #endif #endif } #endif -- cgit v1.2.3 From f1ff71108531137d4a94b913175084781987199d Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 7 Sep 2019 00:30:39 -0600 Subject: slowed down rainbow RGB mode, added a ramp-down on stuck-button for safety purposes --- spaghetti-monster/anduril/anduril.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index 5032dcd..e8524a8 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -792,6 +792,10 @@ uint8_t steady_state(Event event, uint16_t arg) { // (off->hold->stepped_min->release causes this state) else if (actual_level <= mode_min) { ramp_direction = 1; } } + // if the button is stuck, err on the side of safety and ramp down + else if ((arg > TICKS_PER_SECOND * 5) && (actual_level >= mode_max)) { + ramp_direction = -1; + } memorized_level = nearest_level((int16_t)actual_level \ + (ramp_step_size * ramp_direction)); #else @@ -2286,7 +2290,9 @@ void rgb_led_update(uint8_t mode, uint8_t arg) { actual_color = colors[color]; } else if (color == 7) { // rainbow - if (0 == (arg & 0x03)) { + uint8_t speed = 0x03; // awake speed + if (go_to_standby) speed = 0x0f; // asleep speed + if (0 == (arg & speed)) { rainbow = (rainbow + 1) % 6; } actual_color = colors[rainbow]; -- cgit v1.2.3 From 481ba09b19630d2742fdc34a81484524838439f3 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 22 Nov 2019 15:55:51 -0700 Subject: added -fwhole-program gcc flag, suggested by Agro. Signficantly reduces ROM size! :) --- bin/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/build.sh b/bin/build.sh index fbb24ea..3992c38 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -14,7 +14,7 @@ export PROGRAM=$1 ; shift export MCU=attiny$ATTINY export CC=avr-gcc export OBJCOPY=avr-objcopy -export CFLAGS="-Wall -g -Os -mmcu=$MCU -c -std=gnu99 -fgnu89-inline -DATTINY=$ATTINY -I.. -I../.. -I../../.. -fshort-enums" +export CFLAGS="-Wall -g -Os -mmcu=$MCU -c -std=gnu99 -fgnu89-inline -fwhole-program -DATTINY=$ATTINY -I.. -I../.. -I../../.. -fshort-enums" export OFLAGS="-Wall -g -Os -mmcu=$MCU" export LDFLAGS="-fgnu89-inline" export OBJCOPYFLAGS='--set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex' -- cgit v1.2.3 From 00b94bcce6cd96a1d007578915c9d4347efb36eb Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sun, 24 Nov 2019 21:35:40 -0700 Subject: enabled muggle mode again in all build targets, since it fits now --- spaghetti-monster/anduril/cfg-blf-q8.h | 5 ----- spaghetti-monster/anduril/cfg-emisar-d18.h | 6 ------ spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h | 6 ------ spaghetti-monster/anduril/cfg-mateminco-mf01s.h | 6 ------ 4 files changed, 23 deletions(-) diff --git a/spaghetti-monster/anduril/cfg-blf-q8.h b/spaghetti-monster/anduril/cfg-blf-q8.h index 31c22ff..970fedb 100644 --- a/spaghetti-monster/anduril/cfg-blf-q8.h +++ b/spaghetti-monster/anduril/cfg-blf-q8.h @@ -13,11 +13,6 @@ // lockout: blinking (3) #define INDICATOR_LED_DEFAULT_MODE ((3<<2) + 2) -// doesn't quite fit -//#ifdef USE_MUGGLE_MODE -//#undef USE_MUGGLE_MODE -//#endif - // copied from Emisar D4 ramp // ../../bin/level_calc.py 1 65 7135 1 0.8 150 // ... mixed with this: diff --git a/spaghetti-monster/anduril/cfg-emisar-d18.h b/spaghetti-monster/anduril/cfg-emisar-d18.h index 02e8f01..16fbacd 100644 --- a/spaghetti-monster/anduril/cfg-emisar-d18.h +++ b/spaghetti-monster/anduril/cfg-emisar-d18.h @@ -16,12 +16,6 @@ #define USE_TENCLICK_THERMAL_CONFIG -// save space, and remove a mode which doesn't make much sense on this light -#ifdef USE_MUGGLE_MODE -#undef USE_MUGGLE_MODE -#endif - - // level_calc.py seventh 3 150 7135 1 1.4 117.99 7135 6 1 1706.86 FET 3 10 13000 // (designed to make 1x hit at level 50, and Nx hit at level 100) #define RAMP_LENGTH 150 diff --git a/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h b/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h index a1d366d..bbf751b 100644 --- a/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h +++ b/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h @@ -15,12 +15,6 @@ #define INDICATOR_LED_DEFAULT_MODE ((3<<2) + 1) -// doesn't quite fit -#ifdef USE_MUGGLE_MODE -#undef USE_MUGGLE_MODE -#endif - - // don't blink during ramp, it's irrelevant and annoying on this light #define BLINK_AT_RAMP_CEILING #undef BLINK_AT_RAMP_MIDDLE diff --git a/spaghetti-monster/anduril/cfg-mateminco-mf01s.h b/spaghetti-monster/anduril/cfg-mateminco-mf01s.h index 22b497b..0585b38 100644 --- a/spaghetti-monster/anduril/cfg-mateminco-mf01s.h +++ b/spaghetti-monster/anduril/cfg-mateminco-mf01s.h @@ -14,12 +14,6 @@ #define INDICATOR_LED_DEFAULT_MODE ((3<<2) + 1) -// doesn't quite fit -//#ifdef USE_MUGGLE_MODE -//#undef USE_MUGGLE_MODE -//#endif - - // don't blink during ramp, it's irrelevant and annoying on this light #define BLINK_AT_RAMP_CEILING #undef BLINK_AT_RAMP_MIDDLE -- cgit v1.2.3