2 #include "../backlight.h"
4 #include <core/gpio/gpio.h>
5 #include <core/pmu/pmu.h>
6 #include <core/timer32/timer32.h>
9 #include <r0ketports.h>
11 #include <badge/pinconfig.h>
15 BACKLIGHT_ACTIVITY_TIMEOUT
= 2307
18 // We depend on input being popped often, so no queue.
19 static badge_event_t
volatile event_buffer
;
20 static uint8_t volatile event_flag
;
21 static uint16_t volatile activity_counter
= BACKLIGHT_ACTIVITY_TIMEOUT
;
24 BADGE_EVENT_FLAG_INPUT
= 1,
25 BADGE_EVENT_FLAG_TIMER
= 2
28 uint8_t badge_input_raw(void) {
32 if (gpioGetValue(RB_BTN3
) == 0) { result
|= BADGE_EVENT_KEY_DOWN
; }
33 if (gpioGetValue(RB_BTN2
) == 0) { result
|= BADGE_EVENT_KEY_UP
; }
34 if (gpioGetValue(RB_BTN4
) == 0) { result
|= BADGE_EVENT_KEY_CENTER
; }
35 if (gpioGetValue(RB_BTN0
) == 0) { result
|= BADGE_EVENT_KEY_RIGHT
; }
36 if (gpioGetValue(RB_BTN1
) == 0) { result
|= BADGE_EVENT_KEY_LEFT
; }
37 if (gpioGetValue(RB_HB0
) == 0) { result
|= BADGE_EVENT_KEY_BTN_A
; }
38 if (gpioGetValue(RB_HB1
) == 0) { result
|= BADGE_EVENT_KEY_BTN_B
; }
40 if (gpioGetValue(HOB_PORT(HOB_BTN_UP
), HOB_PIN(HOB_BTN_UP
)) == 0) { result
|= BADGE_EVENT_KEY_UP
; }
41 if (gpioGetValue(HOB_PORT(HOB_BTN_DOWN
), HOB_PIN(HOB_BTN_DOWN
)) == 0) { result
|= BADGE_EVENT_KEY_DOWN
; }
42 if (gpioGetValue(HOB_PORT(HOB_BTN_LEFT
), HOB_PIN(HOB_BTN_LEFT
)) == 0) { result
|= BADGE_EVENT_KEY_LEFT
; }
43 if (gpioGetValue(HOB_PORT(HOB_BTN_RIGHT
), HOB_PIN(HOB_BTN_RIGHT
)) == 0) { result
|= BADGE_EVENT_KEY_RIGHT
; }
44 if (gpioGetValue(HOB_PORT(HOB_BTN_A
), HOB_PIN(HOB_BTN_A
)) == 0) { result
|= BADGE_EVENT_KEY_BTN_A
; }
45 if (gpioGetValue(HOB_PORT(HOB_BTN_B
), HOB_PIN(HOB_BTN_B
)) == 0) { result
|= BADGE_EVENT_KEY_BTN_B
; }
51 uint8_t badge_event_current_input_state(void) {
52 return badge_event_new_input_state(event_buffer
);
55 void badge_event_irq(void) {
56 uint8_t old_state
= badge_event_current_input_state();
57 uint8_t new_state
= badge_input_raw();
59 if(new_state
!= old_state
) {
60 if(activity_counter
== 0) {
61 badge_backlight_enable();
63 activity_counter
= BACKLIGHT_ACTIVITY_TIMEOUT
;
65 event_buffer
= badge_event_new(BADGE_EVENT_USER_INPUT
,
68 event_flag
|= BADGE_EVENT_FLAG_INPUT
;
71 if(activity_counter
== 0) {
72 badge_backlight_disable();
77 event_flag
|= BADGE_EVENT_FLAG_TIMER
;
80 badge_event_t
badge_event_wait(void) {
85 // User input takes precedence.
86 if(event_flag
& BADGE_EVENT_FLAG_INPUT
) {
87 badge_event_t event
= event_buffer
;
88 event_flag
&= ~BADGE_EVENT_FLAG_INPUT
;
92 uint8_t state
= badge_event_current_input_state();
93 event_flag
&= ~BADGE_EVENT_FLAG_TIMER
;
94 return badge_event_new(BADGE_EVENT_GAME_TICK
, state
, state
);
97 void badge_event_start(void) {
98 timer32Init(0, TIMER32_CCLK_10MS
/ 100 * 133);
99 timer32SetIntHandler(badge_event_irq
);
103 void badge_event_stop (void) {