Backlight bei Inaktivität aus.
[hackover2013-badge-firmware.git] / badge / ui / event.c
1 #include "event.h"
2 #include "../backlight.h"
3
4 #include <core/gpio/gpio.h>
5 #include <core/pmu/pmu.h>
6 #include <core/timer32/timer32.h>
7
8 #ifdef R0KET
9 #include <r0ketports.h>
10 #else
11 #include <badge/pinconfig.h>
12 #endif
13
14 enum {
15 BACKLIGHT_ACTIVITY_TIMEOUT = 2307
16 };
17
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;
22
23 enum {
24 BADGE_EVENT_FLAG_INPUT = 1,
25 BADGE_EVENT_FLAG_TIMER = 2
26 };
27
28 uint8_t badge_input_raw(void) {
29 uint8_t result = 0;
30
31 #ifdef R0KET
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 ; }
39 #else
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 ; }
46 #endif
47
48 return result;
49 }
50
51 uint8_t badge_event_current_input_state(void) {
52 return badge_event_new_input_state(event_buffer);
53 }
54
55 void badge_event_irq(void) {
56 uint8_t old_state = badge_event_current_input_state();
57 uint8_t new_state = badge_input_raw();
58
59 if(new_state != old_state) {
60 if(activity_counter == 0) {
61 badge_backlight_enable();
62 }
63 activity_counter = BACKLIGHT_ACTIVITY_TIMEOUT;
64
65 event_buffer = badge_event_new(BADGE_EVENT_USER_INPUT,
66 old_state,
67 new_state);
68 event_flag |= BADGE_EVENT_FLAG_INPUT;
69 }
70
71 if(activity_counter == 0) {
72 badge_backlight_disable();
73 } else {
74 --activity_counter;
75 }
76
77 event_flag |= BADGE_EVENT_FLAG_TIMER;
78 }
79
80 badge_event_t badge_event_wait(void) {
81 while(!event_flag) {
82 pmuSleep();
83 }
84
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;
89 return event;
90 }
91
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);
95 }
96
97 void badge_event_start(void) {
98 timer32Init(0, TIMER32_CCLK_10MS / 100 * 133);
99 timer32SetIntHandler(badge_event_irq);
100 timer32Enable(0);
101 }
102
103 void badge_event_stop (void) {
104 timer32Disable(0);
105 }
This page took 0.062102 seconds and 5 git commands to generate.