diff options
| -rw-r--r-- | spaghetti-monster/darkhorse.c | 63 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-events.c | 7 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-events.h | 1 |
3 files changed, 64 insertions, 7 deletions
diff --git a/spaghetti-monster/darkhorse.c b/spaghetti-monster/darkhorse.c index 2bfa2e9..5a522a4 100644 --- a/spaghetti-monster/darkhorse.c +++ b/spaghetti-monster/darkhorse.c @@ -33,8 +33,7 @@ uint8_t off_state(EventPtr event, uint16_t arg); uint8_t low_mode_state(EventPtr event, uint16_t arg); uint8_t med_mode_state(EventPtr event, uint16_t arg); uint8_t hi_mode_state(EventPtr event, uint16_t arg); -//uint8_t strobe_state(EventPtr event, uint16_t arg); -//uint8_t beacon_state(EventPtr event, uint16_t arg); +uint8_t strobe_beacon_state(EventPtr event, uint16_t arg); #ifdef USE_BATTCHECK uint8_t battcheck_state(EventPtr event, uint16_t arg); #endif @@ -53,6 +52,12 @@ uint8_t H2 = 1; uint8_t low_modes[] = {12, 1, 4, 9}; // 3.3 lm, 2.0 lm, 0.8 lm, 0.3 lm uint8_t med_modes[] = {56, 21, 29, 37}; // 101 lm, 35 lm, 20 lm, 10 lm uint8_t hi_modes[] = {MAX_LEVEL, 81, 96, 113}; // 1500 lm, 678 lm, 430 lm, 270 lm +// strobe/beacon modes: +// 0: 0.2 Hz beacon at L1 +// 1: 0.2 Hz beacon at H1 +// 2: 4 Hz strobe at H1 +// 3: 19 Hz strobe at H1 +uint8_t strobe_beacon_mode = 0; #ifdef USE_THERMAL_REGULATION // brightness before thermal step-down @@ -117,12 +122,10 @@ uint8_t off_state(EventPtr event, uint16_t arg) { return 0; } // 3 clicks: strobe mode - /* TODO: implement else if (event == EV_3clicks) { - set_state(party_strobe_state, 255); + set_state(strobe_beacon_state, 0); return 0; } - */ #ifdef USE_BATTCHECK // 4 clicks: battcheck mode else if (event == EV_4clicks) { @@ -252,6 +255,22 @@ uint8_t battcheck_state(EventPtr event, uint16_t arg) { #endif +uint8_t strobe_beacon_state(EventPtr event, uint16_t arg) { + // 1 click: off + if (event == EV_1click) { + set_state(off_state, 0); + return MISCHIEF_MANAGED; + } + // 2 clicks: rotate through blinky modes + else if (event == EV_2clicks) { + strobe_beacon_mode = (strobe_beacon_mode + 1) & 3; + interrupt_nice_delays(); + return MISCHIEF_MANAGED; + } + return EVENT_NOT_HANDLED; +} + + void low_voltage() { // TODO: rewrite this /* @@ -280,8 +299,40 @@ void setup() { } void loop() { + if (current_state == strobe_beacon_state) { + switch(strobe_beacon_mode) { + // 0.2 Hz beacon at L1 + case 0: + set_level(low_modes[0]); + nice_delay_ms(500); + set_level(0); + nice_delay_ms(4500); + break; + // 0.2 Hz beacon at H1 + case 1: + set_level(hi_modes[0]); + nice_delay_ms(500); + set_level(0); + nice_delay_ms(4500); + break; + // 4 Hz tactical strobe at H1 + case 2: + set_level(hi_modes[0]); + nice_delay_ms(83); + set_level(0); + nice_delay_ms(167); + break; + // 19 Hz tactical strobe at H1 + case 3: + set_level(hi_modes[0]); + nice_delay_ms(17); + set_level(0); + nice_delay_ms(35); + break; + } + } #ifdef USE_BATTCHECK - if (current_state == battcheck_state) { + else if (current_state == battcheck_state) { nice_delay_ms(500); // wait a moment to measure voltage battcheck(); set_state(off_state, 0); diff --git a/spaghetti-monster/fsm-events.c b/spaghetti-monster/fsm-events.c index 29ef415..90d0ffa 100644 --- a/spaghetti-monster/fsm-events.c +++ b/spaghetti-monster/fsm-events.c @@ -106,6 +106,10 @@ void process_emissions() { } } +// explicitly interrupt these "nice" delays +volatile uint8_t nice_delay_interrupt = 0; +inline void interrupt_nice_delays() { nice_delay_interrupt = 1; } + // like delay_ms, except it aborts on state change // return value: // 0: state changed @@ -115,7 +119,8 @@ uint8_t nice_delay_ms(uint16_t ms) { while(ms-- > 0) { _delay_loop_2(BOGOMIPS*98/100); process_emissions(); - if (old_state != current_state) { + if ((nice_delay_interrupt) || (old_state != current_state)) { + nice_delay_interrupt = 0; return 0; // state changed; abort } } diff --git a/spaghetti-monster/fsm-events.h b/spaghetti-monster/fsm-events.h index 141a0dc..f2a0181 100644 --- a/spaghetti-monster/fsm-events.h +++ b/spaghetti-monster/fsm-events.h @@ -223,5 +223,6 @@ void emit_current_event(uint16_t arg); uint8_t nice_delay_ms(uint16_t ms); //uint8_t nice_delay_4ms(uint8_t ms); //uint8_t nice_delay_s(); +inline void interrupt_nice_delays(); #endif |
