From 02d371e769585b2e9cebdb9346b2f11fc4c0a40e Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 26 Aug 2017 04:57:37 -0600 Subject: Fixed bug: strobes could interfere with hold-from-off next time light was used. (because it'd enter standby mode during the strobe pulse, then continue the flow at next activation by turning the light off) Replaced bare return values with ones defined in the FSM library. --- spaghetti-monster/darkhorse.c | 44 +++++++++++++++++++++++-------------------- 1 file 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 -- cgit v1.2.3