From ef05435261fac31790303dbff16bcc194e9e5cb5 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 19 Aug 2017 15:33:33 -0600 Subject: Fixed unreliability of short-click detection. (it was doing stuff like "press, release, release, timeout" so it didn't match "press, release, timeout") (it may have also been missing the exact tick it needed, so I made it use >= instead of ==, but this is theoretical and harmless if I was wrong) Made baton mode memory work a bit better for both regular and strobe modes. Made baton fast strobe pulses shorter for better motion freezing. Added USE_DELAY_ZERO option as an alternate for USE_FINE_DELAY. --- spaghetti-monster/baton.c | 17 +++++++++++------ spaghetti-monster/spaghetti-monster.h | 17 +++++++++++++---- tk-delay.h | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/spaghetti-monster/baton.c b/spaghetti-monster/baton.c index de63914..ed2b444 100644 --- a/spaghetti-monster/baton.c +++ b/spaghetti-monster/baton.c @@ -21,16 +21,19 @@ #define USE_LVP #define USE_DEBUG_BLINK #define USE_DELAY_MS +#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, }; +// FSM states uint8_t off_state(EventPtr event, uint16_t arg); 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; void set_mode(uint8_t mode) { @@ -43,6 +46,7 @@ uint8_t off_state(EventPtr event, uint16_t arg) { if (event == EV_enter_state) { PWM1_LVL = 0; PWM2_LVL = 0; + // TODO: standby_mode(); return 0; } // 1 click: regular mode @@ -90,7 +94,7 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { } // 2 clicks: go to strobe modes else if (event == EV_2clicks) { - set_state(party_strobe_state, 2); + set_state(party_strobe_state, 0xff); return 0; } // hold: change brightness @@ -106,18 +110,19 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { uint8_t party_strobe_state(EventPtr event, uint16_t arg) { static volatile uint8_t frames = 0; - static volatile uint8_t between = 0; + static volatile uint8_t between = 2; if (event == EV_enter_state) { - between = arg; + if (arg < 64) between = arg; frames = 0; return 0; } - // strobe the emitter + // tick: strobe the emitter else if (event == EV_tick) { if (frames == 0) { PWM1_LVL = 255; PWM2_LVL = 0; - delay_ms(1); + if (between < 3) delay_zero(); + else delay_ms(1); PWM1_LVL = 0; } //frames = (frames + 1) % between; @@ -132,7 +137,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, 1); + set_state(steady_state, current_mode); return 0; } // hold: change speed diff --git a/spaghetti-monster/spaghetti-monster.h b/spaghetti-monster/spaghetti-monster.h index e51416a..cfabea8 100644 --- a/spaghetti-monster/spaghetti-monster.h +++ b/spaghetti-monster/spaghetti-monster.h @@ -243,8 +243,10 @@ void empty_event_sequence() { void push_event(uint8_t ev_type) { ticks_since_last_event = 0; // something happened uint8_t i; - for(i=0; current_event[i] && (i= HOLD_TIMEOUT) { push_event(A_HOLD); emit_current_event(0); } @@ -478,7 +487,7 @@ ISR(WDT_vect) { empty_event_sequence(); } // end and clear event after release timeout - else if (ticks_since_last_event == RELEASE_TIMEOUT) { + else if (ticks_since_last_event >= RELEASE_TIMEOUT) { push_event(A_RELEASE_TIMEOUT); emit_current_event(0); empty_event_sequence(); diff --git a/tk-delay.h b/tk-delay.h index a05f5c1..0619419 100644 --- a/tk-delay.h +++ b/tk-delay.h @@ -40,7 +40,7 @@ void _delay_ms(uint16_t n) //#endif } #endif -#ifdef USE_FINE_DELAY +#if defined(USE_FINE_DELAY) || defined(USE_DELAY_ZERO) #define delay_zero _delay_zero void _delay_zero() { _delay_loop_2(BOGOMIPS/3); -- cgit v1.2.3