diff options
| -rw-r--r-- | spaghetti-monster/darkhorse.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/spaghetti-monster/darkhorse.c b/spaghetti-monster/darkhorse.c index 1244864..6a17943 100644 --- a/spaghetti-monster/darkhorse.c +++ b/spaghetti-monster/darkhorse.c @@ -87,50 +87,51 @@ uint8_t off_state(EventPtr event, uint16_t arg) { // turn emitter off when entering state if (event == EV_enter_state) { set_level(0); + empty_event_sequence(); // sleep while off (lower power use) standby_mode(); - return 0; + return EVENT_HANDLED; } // hold (initially): go to lowest level, but allow abort for regular click else if (event == EV_click1_press) { set_low_mode(); - return 0; + return EVENT_HANDLED; } // 1 click (before timeout): go to high level, but allow abort for double click else if (event == EV_click1_release) { set_hi_mode(); - return 0; + return EVENT_HANDLED; } // 1 click: high mode else if (event == EV_1click) { set_state(hi_mode_state, 0); - return 0; + return EVENT_HANDLED; } // click, hold (initially): go to medium mode, but allow abort else if (event == EV_click2_press) { set_med_mode(); - return 0; + return EVENT_HANDLED; } // 2 clicks: medium mode else if (event == EV_2clicks) { set_state(med_mode_state, 0); - return 0; + return EVENT_HANDLED; } // click, click, hold (initially): light off, prep for blinkies else if (event == EV_click3_press) { set_level(0); - return 0; + return EVENT_HANDLED; } // 3 clicks: strobe mode else if (event == EV_3clicks) { set_state(strobe_beacon_state, 0); - return 0; + return EVENT_HANDLED; } #ifdef USE_BATTCHECK // 4 clicks: battcheck mode else if (event == EV_4clicks) { set_state(battcheck_state, 0); - return MISCHIEF_MANAGED; + return EVENT_HANDLED; } #endif // hold: go to low mode, but allow ramping up @@ -139,21 +140,21 @@ uint8_t off_state(EventPtr event, uint16_t arg) { // give the user time to release at low mode if (arg >= HOLD_TIMEOUT) set_state(low_mode_state, 0); - return 0; + return EVENT_HANDLED; } // hold, release quickly: go to low mode else if (event == EV_click1_hold_release) { set_state(low_mode_state, 0); - return 0; + return EVENT_HANDLED; } /* TODO: implement // click-release-hold: discrete ramp through all levels else if (event == EV_click2_hold) { set_state(steady_state, MAX_LEVEL); - return 0; + return EVENT_HANDLED; } */ - return 1; + return EVENT_NOT_HANDLED; } @@ -209,7 +210,7 @@ uint8_t any_mode_state(EventPtr event, uint16_t arg, uint8_t *primary, uint8_t * if (stepdown < MAX_LEVEL/4) stepdown = MAX_LEVEL/4; set_level(stepdown); } - return 0; + return EVENT_HANDLED; } // underheating: increase slowly if we're lower than the target // (proportional to how low we are) @@ -219,7 +220,7 @@ uint8_t any_mode_state(EventPtr event, uint16_t arg, uint8_t *primary, uint8_t * if (stepup > target_level) stepup = target_level; set_level(stepup); } - return 0; + return EVENT_HANDLED; } #endif return EVENT_NOT_HANDLED; @@ -240,11 +241,6 @@ uint8_t hi_mode_state(EventPtr event, uint16_t arg) { #ifdef USE_BATTCHECK uint8_t battcheck_state(EventPtr event, uint16_t arg) { - // 1 click: off - if (event == EV_1click) { - set_state(off_state, 0); - return MISCHIEF_MANAGED; - } return EVENT_NOT_HANDLED; } #endif @@ -253,9 +249,16 @@ uint8_t battcheck_state(EventPtr event, uint16_t arg) { uint8_t strobe_beacon_state(EventPtr event, uint16_t arg) { // 1 click: off if (event == EV_1click) { + interrupt_nice_delays(); set_state(off_state, 0); return MISCHIEF_MANAGED; } + // 1 click (initially): cancel current blink + if (event == EV_click1_release) { + // only cancel if the light is actually on + if (actual_level) interrupt_nice_delays(); + return MISCHIEF_MANAGED; + } // 2 clicks: rotate through blinky modes else if (event == EV_2clicks) { strobe_beacon_mode = (strobe_beacon_mode + 1) & 3; @@ -327,6 +330,7 @@ void loop() { else if (current_state == battcheck_state) { nice_delay_ms(500); // wait a moment to measure voltage battcheck(); + empty_event_sequence(); set_state(off_state, 0); } #endif |
