21fe821a9e2c653e84609b32a3b9bbe9d0bf4c35
3 #include <core/gpio/gpio.h>
4 #include <core/timer32/timer32.h>
5 #include <r0ketports.h>
7 // We depend on input being popped often, so no queue.
8 static badge_event_t
volatile event_buffer
;
9 static uint8_t volatile event_flag
;
12 BADGE_EVENT_FLAG_INPUT
= 1,
13 BADGE_EVENT_FLAG_TIMER
= 2
16 static uint8_t badge_input_raw(void) {
17 uint8_t result
= BTN_NONE
;
19 if (gpioGetValue(RB_BTN3
) == 0) { result
|= BADGE_EVENT_KEY_UP
; }
20 if (gpioGetValue(RB_BTN2
) == 0) { result
|= BADGE_EVENT_KEY_DOWN
; }
21 if (gpioGetValue(RB_BTN4
) == 0) { result
|= BADGE_EVENT_KEY_CENTER
; }
22 if (gpioGetValue(RB_BTN0
) == 0) { result
|= BADGE_EVENT_KEY_LEFT
; }
23 if (gpioGetValue(RB_BTN1
) == 0) { result
|= BADGE_EVENT_KEY_RIGHT
; }
25 if (gpioGetValue(RB_HB0
) == 0) { result
|= BADGE_EVENT_KEY_UP
; }
26 if (gpioGetValue(RB_HB1
) == 0) { result
|= BADGE_EVENT_KEY_UP
; }
31 uint8_t badge_event_current_input_state(void) {
32 return badge_event_new_input_state(event_buffer
);
35 void badge_event_irq(void) {
36 uint8_t old_state
= badge_event_current_input_state();
37 uint8_t new_state
= badge_input_raw();
39 if(new_state
!= old_state
) {
40 event_buffer
= badge_event_new(BADGE_EVENT_USER_INPUT
,
43 event_flag
|= BADGE_EVENT_FLAG_INPUT
;
46 event_flag
|= BADGE_EVENT_FLAG_TIMER
;
49 badge_event_t
badge_event_wait(void) {
53 // User input takes precedence.
54 if(event_flag
& BADGE_EVENT_FLAG_INPUT
) {
55 badge_event_t event
= event_buffer
;
56 event_flag
&= ~BADGE_EVENT_FLAG_INPUT
;
60 uint8_t state
= badge_event_current_input_state();
61 event_flag
&= ~BADGE_EVENT_FLAG_TIMER
;
62 return badge_event_new(BADGE_EVENT_GAME_TICK
, state
, state
);
65 void badge_event_start(void) {
66 timer32Init(0, TIMER32_CCLK_10MS
* 2);
67 timer32SetIntHandler(badge_event_irq
);
This page took 0.039047 seconds and 3 git commands to generate.