Entwurf einer pinconfig.h, die von IOCON_-Sondernamen unabhängig benutzbar ist.
[hackover2013-badge-firmware.git] / badge / ui / event.c
1 #include "event.h"
2
3 #include <core/gpio/gpio.h>
4 #include <core/timer32/timer32.h>
5 #include <r0ketports.h>
6
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;
10
11 enum {
12 BADGE_EVENT_FLAG_INPUT = 1,
13 BADGE_EVENT_FLAG_TIMER = 2
14 };
15
16 static uint8_t badge_input_raw(void) {
17 uint8_t result = BTN_NONE;
18
19 #if HW_IS_PROTOTYPE
20 if (gpioGetValue(RB_BTN3 ) == 1) { result |= BADGE_EVENT_KEY_UP ; }
21 if (gpioGetValue(RB_BTN2 ) == 1) { result |= BADGE_EVENT_KEY_DOWN ; }
22 if (gpioGetValue(RB_BTN4 ) == 1) { result |= BADGE_EVENT_KEY_CENTER; }
23 if (gpioGetValue(RB_BTN0 ) == 1) { result |= BADGE_EVENT_KEY_LEFT ; }
24 if (gpioGetValue(RB_BTN1 ) == 1) { result |= BADGE_EVENT_KEY_RIGHT ; }
25 if (gpioGetValue(RB_BTN_A) == 1) { result |= BADGE_EVENT_KEY_BTN_A ; }
26 if (gpioGetValue(RB_BTN_B) == 1) { result |= BADGE_EVENT_KEY_BTN_B ; }
27 #else
28 if (gpioGetValue(RB_BTN3) == 0) { result |= BADGE_EVENT_KEY_UP ; }
29 if (gpioGetValue(RB_BTN2) == 0) { result |= BADGE_EVENT_KEY_DOWN ; }
30 if (gpioGetValue(RB_BTN4) == 0) { result |= BADGE_EVENT_KEY_CENTER; }
31 if (gpioGetValue(RB_BTN0) == 0) { result |= BADGE_EVENT_KEY_LEFT ; }
32 if (gpioGetValue(RB_BTN1) == 0) { result |= BADGE_EVENT_KEY_RIGHT ; }
33 if (gpioGetValue(RB_HB0 ) == 0) { result |= BADGE_EVENT_KEY_BTN_A ; }
34 if (gpioGetValue(RB_HB1 ) == 0) { result |= BADGE_EVENT_KEY_BTN_B ; }
35 #endif
36
37 return result;
38 }
39
40 uint8_t badge_event_current_input_state(void) {
41 return badge_event_new_input_state(event_buffer);
42 }
43
44 void badge_event_irq(void) {
45 uint8_t old_state = badge_event_current_input_state();
46 uint8_t new_state = badge_input_raw();
47
48 if(new_state != old_state) {
49 event_buffer = badge_event_new(BADGE_EVENT_USER_INPUT,
50 old_state,
51 new_state);
52 event_flag |= BADGE_EVENT_FLAG_INPUT;
53 }
54
55 event_flag |= BADGE_EVENT_FLAG_TIMER;
56 }
57
58 badge_event_t badge_event_wait(void) {
59 while(!event_flag)
60 ;
61
62 // User input takes precedence.
63 if(event_flag & BADGE_EVENT_FLAG_INPUT) {
64 badge_event_t event = event_buffer;
65 event_flag &= ~BADGE_EVENT_FLAG_INPUT;
66 return event;
67 }
68
69 uint8_t state = badge_event_current_input_state();
70 event_flag &= ~BADGE_EVENT_FLAG_TIMER;
71 return badge_event_new(BADGE_EVENT_GAME_TICK, state, state);
72 }
73
74 void badge_event_start(void) {
75 timer32Init(0, TIMER32_CCLK_10MS * 2);
76 timer32SetIntHandler(badge_event_irq);
77 timer32Enable(0);
78 }
This page took 0.0492 seconds and 5 git commands to generate.