aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster/fsm-wdt.c
diff options
context:
space:
mode:
authorSelene ToyKeeper2018-11-11 06:09:07 -0700
committerSelene ToyKeeper2018-11-11 06:09:07 -0700
commit6b41b5df92128c8810cbe14fd56258d90c3bb2b2 (patch)
tree5c2d5d80e54922e17edbcfd49317a84107b97bf5 /spaghetti-monster/fsm-wdt.c
parentRewrote the event system to use a single byte for each event instead of an ar... (diff)
downloadanduril-6b41b5df92128c8810cbe14fd56258d90c3bb2b2.tar.gz
anduril-6b41b5df92128c8810cbe14fd56258d90c3bb2b2.tar.bz2
anduril-6b41b5df92128c8810cbe14fd56258d90c3bb2b2.zip
Several fixes...
- Made momentary+lockout modes smaller and work better. - Fixed buggy timing on hold events; made ticks_since_last_event reset when it should. - Reduced ROM size by caching volatile ticks_since_last_event sometimes. - Swapped what the top Event bit means, because it makes event handlers easier to write. - Made the maximum click event keep triggering if user keeps pressing, instead of dropping everything after the limit.
Diffstat (limited to '')
-rw-r--r--spaghetti-monster/fsm-wdt.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/spaghetti-monster/fsm-wdt.c b/spaghetti-monster/fsm-wdt.c
index cfff1fa..3606c67 100644
--- a/spaghetti-monster/fsm-wdt.c
+++ b/spaghetti-monster/fsm-wdt.c
@@ -76,32 +76,38 @@ ISR(WDT_vect) {
uint8_t pressed = button_is_pressed();
if (was_pressed != pressed) PCINT_inner(pressed);
- //if (ticks_since_last_event < 0xff) ticks_since_last_event ++;
+ // cache this here to reduce ROM size, because it's volatile
+ uint16_t ticks_since_last = ticks_since_last_event;
+
// increment, but loop from max back to half
- ticks_since_last_event = (ticks_since_last_event + 1) \
- | (ticks_since_last_event & 0x8000);
+ //if (ticks_since_last < 0xff) ticks_since_last ++;
+ ticks_since_last = (ticks_since_last + 1) \
+ | (ticks_since_last & 0x8000);
+ // copy back to the original
+ ticks_since_last_event = ticks_since_last;
// if time since last event exceeds timeout,
// append timeout to current event sequence, then
// send event to current state callback
// callback on each timer tick
- if ((current_event & B_FLAGS) == (B_HOLD | B_PRESS)) {
+ if ((current_event & B_FLAGS) == (B_CLICK | B_HOLD | B_PRESS)) {
emit(EV_tick, 0); // override tick counter while holding button
}
else {
- emit(EV_tick, ticks_since_last_event);
+ emit(EV_tick, ticks_since_last);
}
// user held button long enough to count as a long click?
if (current_event & B_PRESS) {
// during a "hold", send a hold event each tick, with a timer
if (current_event & B_HOLD) {
- emit_current_event(ticks_since_last_event);
+ emit_current_event(ticks_since_last);
}
// has button been down long enough to become a "hold"?
else {
- if (ticks_since_last_event >= HOLD_TIMEOUT) {
+ if (ticks_since_last >= HOLD_TIMEOUT) {
+ //ticks_since_last_event = 0;
current_event |= B_HOLD;
emit_current_event(0);
}
@@ -118,8 +124,9 @@ 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 >= RELEASE_TIMEOUT) {
current_event |= B_TIMEOUT;
+ //ticks_since_last_event = 0;
emit_current_event(0);
empty_event_sequence();
}