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 <keithp@keithp.com>
char
ao_button_get(void) __critical;
char
ao_button_get(void) __critical;
+void
+ao_button_clear(void) __critical;
+
#define NUM_BUTTONS ((sizeof ao_buttons) / sizeof (ao_buttons[0]))
#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)
{
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);
+ }
+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)
{
void
ao_p0_isr(void) ao_arch_interrupt(13)
{