diff options
Diffstat (limited to '')
| -rw-r--r-- | spaghetti-monster/fsm-pcint.c | 25 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-pcint.h | 5 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-standby.c | 1 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-wdt.c | 33 |
4 files changed, 57 insertions, 7 deletions
diff --git a/spaghetti-monster/fsm-pcint.c b/spaghetti-monster/fsm-pcint.c index 763c1fe..c04375a 100644 --- a/spaghetti-monster/fsm-pcint.c +++ b/spaghetti-monster/fsm-pcint.c @@ -59,10 +59,25 @@ ISR(PCINT0_vect) { //DEBUG_FLASH; - uint8_t pushed; + /* + uint8_t pressed; // add event to current sequence - if (button_is_pressed()) { + pressed = button_is_pressed(); + PCINT_inner(pressed); + */ + if (! PCINT_since_WDT) { + PCINT_since_WDT = 1; + PCINT_inner(button_is_pressed()); + } +} + +// should only be called from PCINT and WDT +// (is a separate function to reduce code duplication) +void PCINT_inner(uint8_t pressed) { + uint8_t pushed; + + if (pressed) { pushed = push_event(A_PRESS); } else { pushed = push_event(A_RELEASE); @@ -70,7 +85,9 @@ ISR(PCINT0_vect) { // check if sequence matches any defined sequences // if so, send event to current state callback - if (pushed) emit_current_event(0); + if (pushed) { + button_last_state = pressed; + emit_current_event(0); + } } - #endif diff --git a/spaghetti-monster/fsm-pcint.h b/spaghetti-monster/fsm-pcint.h index cda5ad7..a94fc82 100644 --- a/spaghetti-monster/fsm-pcint.h +++ b/spaghetti-monster/fsm-pcint.h @@ -21,9 +21,12 @@ #define FSM_PCINT_H //static volatile uint8_t button_was_pressed; -#define BP_SAMPLES 16 +#define BP_SAMPLES 32 +volatile uint8_t button_last_state; +volatile uint8_t PCINT_since_WDT; uint8_t button_is_pressed(); inline void PCINT_on(); inline void PCINT_off(); +void PCINT_inner(uint8_t pressed); #endif diff --git a/spaghetti-monster/fsm-standby.c b/spaghetti-monster/fsm-standby.c index 5ef666f..eb631d6 100644 --- a/spaghetti-monster/fsm-standby.c +++ b/spaghetti-monster/fsm-standby.c @@ -37,6 +37,7 @@ void sleep_until_eswitch_pressed() // make sure switch isn't currently pressed while (button_is_pressed()) {} empty_event_sequence(); // cancel pending input on suspend + PCINT_since_WDT = 0; // ensure PCINT won't ignore itself PCINT_on(); // wake on e-switch event diff --git a/spaghetti-monster/fsm-wdt.c b/spaghetti-monster/fsm-wdt.c index 7cbe0d2..bee2914 100644 --- a/spaghetti-monster/fsm-wdt.c +++ b/spaghetti-monster/fsm-wdt.c @@ -50,13 +50,42 @@ ISR(WDT_vect) { ticks_since_last_event = (ticks_since_last_event + 1) \ | (ticks_since_last_event & 0x8000); + // just in case the pin change interrupt missed something + uint8_t le_num = last_event_num(); + uint8_t last_event = 0; + if (le_num >= 1) last_event = current_event[le_num-1]; + uint8_t pressed = button_is_pressed(); + uint8_t was_pressed_before = (last_event == A_PRESS) || (last_event == A_HOLD); + //if (pressed != button_last_state) { + if (pressed != was_pressed_before) { + PCINT_inner(pressed); + /* + uint8_t pushed; + if (pressed) { + pushed = push_event(A_PRESS); + } else { + pushed = push_event(A_RELEASE); + } + + // check if sequence matches any defined sequences + // if so, send event to current state callback + if (pushed) { + button_last_state = pressed; + emit_current_event(0); + } + */ + } + PCINT_since_WDT = 0; + // if time since last event exceeds timeout, // append timeout to current event sequence, then // send event to current state callback // preload recent events - uint8_t le_num = last_event_num(); - uint8_t last_event = 0; + //uint8_t le_num = last_event_num(); + le_num = last_event_num(); + //uint8_t last_event = 0; + last_event = 0; uint8_t prev_event = 0; if (le_num >= 1) last_event = current_event[le_num-1]; if (le_num >= 2) prev_event = current_event[le_num-2]; |
