summaryrefslogtreecommitdiff
path: root/firmware/drivers/button.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/button.c')
-rw-r--r--firmware/drivers/button.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index c0cd046db6..cfe98e298a 100644
--- a/firmware/drivers/button.c
+++ b/firmware/drivers/button.c
@@ -34,6 +34,9 @@
34struct event_queue button_queue; 34struct event_queue button_queue;
35 35
36long last_keypress; 36long last_keypress;
37#ifdef HAVE_RECORDER_KEYPAD
38static bool flipped; /* bottons can be flipped to match the LCD flip */
39#endif
37 40
38/* how often we check to see if a button is pressed */ 41/* how often we check to see if a button is pressed */
39#define POLL_FREQUENCY HZ/20 42#define POLL_FREQUENCY HZ/20
@@ -212,6 +215,47 @@ void button_init()
212#endif 215#endif
213 queue_init(&button_queue); 216 queue_init(&button_queue);
214 tick_add_task(button_tick); 217 tick_add_task(button_tick);
218 last_keypress = current_tick;
219 flipped = false;
220}
221
222
223/*
224 * set the flip attribute
225 * better only call this when the queue is empty
226 */
227void button_set_flip(bool flip)
228{
229 flipped = flip;
230}
231
232
233/*
234 * helper function to swap UP/DOWN, LEFT/RIGHT, F1/F3
235 */
236static int button_flip(int button)
237{
238 int newbutton;
239
240 newbutton = button &
241 ~(BUTTON_UP | BUTTON_DOWN
242 | BUTTON_LEFT | BUTTON_RIGHT
243 | BUTTON_F1 | BUTTON_F3);
244
245 if (button & BUTTON_UP)
246 newbutton |= BUTTON_DOWN;
247 if (button & BUTTON_DOWN)
248 newbutton |= BUTTON_UP;
249 if (button & BUTTON_LEFT)
250 newbutton |= BUTTON_RIGHT;
251 if (button & BUTTON_RIGHT)
252 newbutton |= BUTTON_LEFT;
253 if (button & BUTTON_F1)
254 newbutton |= BUTTON_F3;
255 if (button & BUTTON_F3)
256 newbutton |= BUTTON_F1;
257
258 return newbutton;
215} 259}
216 260
217/* 261/*
@@ -276,6 +320,9 @@ static int button_read(void)
276#endif 320#endif
277 } 321 }
278 } 322 }
323
324 if (btn && flipped)
325 return button_flip(btn); /* swap upside down */
279 326
280 return btn; 327 return btn;
281} 328}