|
| 1 | +#include "console.h" |
| 2 | +#include "gpio.h" |
| 3 | +#include "gpio_extra.h" |
| 4 | +#include "gpio_interrupt.h" |
| 5 | +#include "hstimer.h" |
| 6 | +#include "interrupts.h" |
| 7 | +#include "keyboard.h" |
| 8 | +#include "printf.h" |
| 9 | +#include "uart.h" |
| 10 | +#include "timer.h" |
| 11 | + |
| 12 | +#define BUTTON GPIO_PB4 |
| 13 | + |
| 14 | +static volatile int elapsed, last_button, last_scan, nbutton, nscan; |
| 15 | + |
| 16 | +static void button_click(void *aux_data) { |
| 17 | + gpio_interrupt_clear(BUTTON); |
| 18 | + last_button = elapsed; |
| 19 | + nbutton++; |
| 20 | +} |
| 21 | + |
| 22 | +static void second_elapsed(void *aux_data) { |
| 23 | + hstimer_interrupt_clear(HSTIMER0); |
| 24 | + elapsed++; |
| 25 | +} |
| 26 | + |
| 27 | +static void clock_edge(void *aux_data) { |
| 28 | + static int nClock; // count clock edges, 11 edges = one scancode |
| 29 | + |
| 30 | + gpio_interrupt_clear(KEYBOARD_CLOCK); |
| 31 | + nClock++; |
| 32 | + if (nClock % 11 == 0) { |
| 33 | + last_scan = elapsed; |
| 34 | + nscan++; |
| 35 | + } |
| 36 | +} |
| 37 | + |
| 38 | +void configure_button(void) { |
| 39 | + gpio_interrupt_init(); |
| 40 | + gpio_set_input(BUTTON); |
| 41 | + gpio_set_pullup(BUTTON); |
| 42 | + gpio_interrupt_config(BUTTON, GPIO_INTERRUPT_NEGATIVE_EDGE, true); // debounce = true |
| 43 | + gpio_interrupt_register_handler(BUTTON, button_click, NULL); |
| 44 | + gpio_interrupt_enable(BUTTON); |
| 45 | +} |
| 46 | + |
| 47 | +void configure_alarm(void) { |
| 48 | + // countdown expressed in number of usecs |
| 49 | + hstimer_init(HSTIMER0, 1000000); |
| 50 | + hstimer_enable(HSTIMER0); // start timer |
| 51 | + interrupts_register_handler(INTERRUPT_SOURCE_HSTIMER0, second_elapsed, NULL); |
| 52 | + interrupts_enable_source(INTERRUPT_SOURCE_HSTIMER0); |
| 53 | +} |
| 54 | + |
| 55 | +void configure_keyboard(void) { |
| 56 | + gpio_interrupt_init(); |
| 57 | + keyboard_init(KEYBOARD_CLOCK, KEYBOARD_DATA); |
| 58 | + gpio_interrupt_config(KEYBOARD_CLOCK, GPIO_INTERRUPT_NEGATIVE_EDGE, false); // no debounce! |
| 59 | + gpio_interrupt_register_handler(KEYBOARD_CLOCK, clock_edge, NULL); |
| 60 | + gpio_interrupt_enable(KEYBOARD_CLOCK); |
| 61 | +} |
| 62 | + |
| 63 | +void main(void) { |
| 64 | + uart_init(); |
| 65 | + interrupts_init(); |
| 66 | + |
| 67 | + configure_button(); |
| 68 | + configure_alarm(); |
| 69 | + configure_keyboard(); |
| 70 | + |
| 71 | + interrupts_global_enable(); |
| 72 | + |
| 73 | + console_init(12, 20, GL_INDIGO, GL_WHITE); |
| 74 | + |
| 75 | + while (1) { |
| 76 | + console_printf("\f\n Time now %02d:%02d\n\n" |
| 77 | + "\n scancode count %d" |
| 78 | + "\n last @t %02d:%02d\n" |
| 79 | + "\n button count %d" |
| 80 | + "\n last @t %02d:%02d", |
| 81 | + elapsed/60, elapsed % 60, |
| 82 | + nscan, last_scan/60, last_scan % 60, |
| 83 | + nbutton, last_button/60, last_button % 60); |
| 84 | + timer_delay(1); |
| 85 | + } |
| 86 | +} |
0 commit comments