From 4de8bf6da4d725bb0514d032b0708c5cf420e8fa Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 12 Nov 2011 18:30:56 -0800 Subject: [PATCH] altos: debounce buttons Provide API to clear out any button events that happen during startup, and then discard button events 'too close' together. Signed-off-by: Keith Packard --- src/cc1111/ao_arch.h | 3 +++ src/cc1111/ao_button.c | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/cc1111/ao_arch.h b/src/cc1111/ao_arch.h index 001165fa..eb8ce9be 100644 --- a/src/cc1111/ao_arch.h +++ b/src/cc1111/ao_arch.h @@ -231,6 +231,9 @@ ao_button_init(void); char ao_button_get(void) __critical; +void +ao_button_clear(void) __critical; + /* ao_string.c */ void diff --git a/src/cc1111/ao_button.c b/src/cc1111/ao_button.c index 77a8dde8..69f3475f 100644 --- a/src/cc1111/ao_button.c +++ b/src/cc1111/ao_button.c @@ -36,11 +36,17 @@ static __code struct { #define NUM_BUTTONS ((sizeof ao_buttons) / sizeof (ao_buttons[0])) +static __xdata uint16_t ao_button_tick[NUM_BUTTONS]; + static void ao_button_insert(char n) { - ao_fifo_insert(ao_button_fifo, n); - ao_wakeup(&ao_button_fifo); + uint16_t now = ao_time(); + if ((now - ao_button_tick[n]) > 20) { + ao_button_tick[n] = now; + ao_fifo_insert(ao_button_fifo, n); + ao_wakeup(&ao_button_fifo); + } } static void @@ -77,6 +83,15 @@ ao_button_get(void) __critical return b; } +void +ao_button_clear(void) __critical +{ + char b; + + while (!ao_fifo_empty(ao_button_fifo)) + ao_fifo_remove(ao_button_fifo, b); +} + void ao_p0_isr(void) ao_arch_interrupt(13) { -- 2.30.2