diff options
Diffstat (limited to 'spaghetti-monster/baton.c')
| -rw-r--r-- | spaghetti-monster/baton.c | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/spaghetti-monster/baton.c b/spaghetti-monster/baton.c index ed2b444..ea8d49f 100644 --- a/spaghetti-monster/baton.c +++ b/spaghetti-monster/baton.c @@ -24,9 +24,9 @@ #define USE_DELAY_ZERO #include "spaghetti-monster.h" -// ../../bin/level_calc.py 2 7 7135 3 0.25 150 FET 1 10 1500 -uint8_t pwm1_modes[] = { 3, 27, 130, 255, 255, 255, 0, }; -uint8_t pwm2_modes[] = { 0, 0, 0, 12, 62, 141, 255, }; +// moon + ../../bin/level_calc.py 2 6 7135 18 10 150 FET 1 10 1500 +uint8_t pwm1_modes[] = { 3, 18, 110, 255, 255, 255, 0, }; +uint8_t pwm2_modes[] = { 0, 0, 0, 9, 58, 138, 255, }; // FSM states uint8_t off_state(EventPtr event, uint16_t arg); @@ -34,11 +34,13 @@ uint8_t steady_state(EventPtr event, uint16_t arg); uint8_t party_strobe_state(EventPtr event, uint16_t arg); // brightness control -uint8_t current_mode = 0; +uint8_t memorized_level = 0; +uint8_t actual_level = 0; -void set_mode(uint8_t mode) { - PWM1_LVL = pwm1_modes[mode]; - PWM2_LVL = pwm2_modes[mode]; +void set_mode(uint8_t lvl) { + actual_level = lvl; + PWM1_LVL = pwm1_modes[lvl]; + PWM2_LVL = pwm2_modes[lvl]; } uint8_t off_state(EventPtr event, uint16_t arg) { @@ -49,14 +51,18 @@ uint8_t off_state(EventPtr event, uint16_t arg) { // TODO: standby_mode(); return 0; } - // 1 click: regular mode - else if (event == EV_1click) { - set_state(steady_state, current_mode); - return 0; + // hold (initially): go to lowest level, but allow abort for regular click + else if (event == EV_click1_press) { + set_mode(0); } // 1 click (before timeout): go to memorized level, but allow abort for double click else if (event == EV_click1_release) { - set_mode(current_mode); + set_mode(memorized_level); + } + // 1 click: regular mode + else if (event == EV_1click) { + set_state(steady_state, memorized_level); + return 0; } // 2 clicks: highest mode else if (event == EV_2clicks) { @@ -68,10 +74,6 @@ uint8_t off_state(EventPtr event, uint16_t arg) { set_state(party_strobe_state, 0); return 0; } - // hold (initially): go to lowest level, but allow abort for regular click - else if (event == EV_click1_press) { - set_mode(0); - } // hold: go to lowest level else if (event == EV_click1_hold) { set_state(steady_state, 0); @@ -80,10 +82,12 @@ uint8_t off_state(EventPtr event, uint16_t arg) { } uint8_t steady_state(EventPtr event, uint16_t arg) { - //static volatile uint8_t current_mode = 0; // turn LED on when we first enter the mode if (event == EV_enter_state) { - current_mode = arg; + // remember this level, unless it's moon or turbo + if ((arg > 0) && (arg < sizeof(pwm1_modes)-1)) + memorized_level = arg; + // use the requested level even if not memorized set_mode(arg); return 0; } @@ -92,16 +96,26 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { set_state(off_state, 0); return 0; } - // 2 clicks: go to strobe modes + // 2 clicks: go to/from highest level else if (event == EV_2clicks) { + if (actual_level < sizeof(pwm1_modes)-1) { + memorized_level = actual_level; // in case we're on moon + set_mode(sizeof(pwm1_modes)-1); + } + else + set_mode(memorized_level); + return 0; + } + // 3 clicks: go to strobe modes + else if (event == EV_3clicks) { set_state(party_strobe_state, 0xff); return 0; } // hold: change brightness else if (event == EV_click1_hold) { if ((arg % HOLD_TIMEOUT) == 0) { - current_mode = (current_mode+1) % sizeof(pwm1_modes); - set_mode(current_mode); + memorized_level = (memorized_level+1) % sizeof(pwm1_modes); + set_mode(memorized_level); } return 0; } @@ -137,7 +151,7 @@ uint8_t party_strobe_state(EventPtr event, uint16_t arg) { } // 2 clicks: go back to regular modes else if (event == EV_2clicks) { - set_state(steady_state, current_mode); + set_state(steady_state, memorized_level); return 0; } // hold: change speed |
