blob: 0b922c0820372885d8583d03d096e2f878eb10c5 [file] [log] [blame]
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Felix Arends
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include "uisdl.h"
Jens Arnold8325e0b2006-05-23 07:48:43 +000021#include "lcd-charcell.h"
Hristo Kovachev17921702006-08-15 08:33:38 +000022#include "lcd-remote.h"
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +000023#include "config.h"
24#include "button.h"
25#include "kernel.h"
26#include "backlight.h"
27#include "misc.h"
28
Hristo Kovachev17921702006-08-15 08:33:38 +000029#include "debug.h"
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +000030/* how long until repeat kicks in */
31#define REPEAT_START 6
32
33/* the speed repeat starts at */
34#define REPEAT_INTERVAL_START 4
35
36/* speed repeat finishes at */
37#define REPEAT_INTERVAL_FINISH 2
38
Hristo Kovachev17921702006-08-15 08:33:38 +000039#if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
40int _remote_type=REMOTETYPE_H100_LCD;
41
42int remote_type(void)
43{
44 return _remote_type;
45}
46#endif
47
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +000048struct event_queue button_queue;
49
50static int btn = 0; /* Hopefully keeps track of currently pressed keys... */
51
Björn Stenbergda5fb182006-03-24 13:47:24 +000052#ifdef CONFIG_BACKLIGHT
53static bool filter_first_keypress;
54
55void set_backlight_filter_keypress(bool value)
56{
57 filter_first_keypress = value;
58}
Hristo Kovacheva70c6b92006-03-25 19:16:45 +000059#ifdef HAVE_REMOTE_LCD
60static bool remote_filter_first_keypress;
61
62void set_remote_backlight_filter_keypress(bool value)
63{
64 remote_filter_first_keypress = value;
65}
66#endif
Björn Stenbergda5fb182006-03-24 13:47:24 +000067#endif
68
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +000069void button_event(int key, bool pressed)
70{
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +000071 int new_btn = 0;
72 int diff = 0;
73 static int count = 0;
74 static int lastbtn;
75 static int repeat_speed = REPEAT_INTERVAL_START;
76 static int repeat_count = 0;
77 static bool repeat = false;
Jens Arnold237d3c42006-02-19 13:34:12 +000078 static bool post = false;
Hristo Kovacheva70c6b92006-03-25 19:16:45 +000079#ifdef CONFIG_BACKLIGHT
80 static bool skip_release = false;
81#ifdef HAVE_REMOTE_LCD
82 static bool skip_remote_release = false;
83#endif
84#endif
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +000085
86 switch (key)
87 {
Hristo Kovachev17921702006-08-15 08:33:38 +000088#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
89 case SDLK_t:
90 if(pressed)
91 switch(_remote_type)
92 {
93 case REMOTETYPE_UNPLUGGED:
94 _remote_type=REMOTETYPE_H100_LCD;
95 DEBUGF("Changed remote type to H100\n");
96 break;
97 case REMOTETYPE_H100_LCD:
98 _remote_type=REMOTETYPE_H300_LCD;
99 DEBUGF("Changed remote type to H300\n");
100 break;
101 case REMOTETYPE_H300_LCD:
102 _remote_type=REMOTETYPE_H300_NONLCD;
103 DEBUGF("Changed remote type to H300 NON-LCD\n");
104 break;
105 case REMOTETYPE_H300_NONLCD:
106 _remote_type=REMOTETYPE_UNPLUGGED;
107 DEBUGF("Changed remote type to none\n");
108 break;
109 }
110 break;
111#endif
112
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000113 case SDLK_KP4:
114 case SDLK_LEFT:
115 new_btn = BUTTON_LEFT;
116 break;
117 case SDLK_KP6:
118 case SDLK_RIGHT:
119 new_btn = BUTTON_RIGHT;
120 break;
121
122 case SDLK_KP8:
123 case SDLK_UP:
124#ifdef BUTTON_UP
125 new_btn = BUTTON_UP;
Dan Everton853085c2006-02-14 11:46:18 +0000126#elif defined BUTTON_SCROLL_BACK
127 new_btn = BUTTON_SCROLL_BACK;
Hristo Kovachev9dc0e622006-08-11 08:35:27 +0000128#elif defined BUTTON_SCROLL_UP
129 new_btn = BUTTON_SCROLL_UP;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000130#elif defined BUTTON_PLAY
131 new_btn = BUTTON_PLAY;
132#endif
133 break;
134
135 case SDLK_KP2:
136 case SDLK_DOWN:
137#ifdef BUTTON_DOWN
138 new_btn = BUTTON_DOWN;
Dan Everton853085c2006-02-14 11:46:18 +0000139#elif defined BUTTON_SCROLL_FWD
140 new_btn = BUTTON_SCROLL_FWD;
Hristo Kovachev9dc0e622006-08-11 08:35:27 +0000141#elif defined BUTTON_SCROLL_DOWN
142 new_btn = BUTTON_SCROLL_DOWN;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000143#elif defined BUTTON_STOP
144 new_btn = BUTTON_STOP;
145#endif
146 break;
147
148 case SDLK_KP_PLUS:
Antoine Cellerierebfb4f32006-07-22 23:10:51 +0000149 case SDLK_F8:
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000150#ifdef BUTTON_ON
151 new_btn = BUTTON_ON;
152#elif defined(BUTTON_SELECT) && defined(BUTTON_PLAY)
153 new_btn = BUTTON_PLAY;
Marcoen Hirschberg338e2bb2006-02-24 15:42:52 +0000154#elif defined BUTTON_POWER
155 new_btn = BUTTON_POWER;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000156#endif
157 break;
158
Peter D'Hoye5aa017b2006-07-19 00:39:30 +0000159 case SDLK_ESCAPE:
160#if defined BUTTON_POWER
161 new_btn = BUTTON_POWER;
162#endif
163 break;
164
Marcoen Hirschberg338e2bb2006-02-24 15:42:52 +0000165 case SDLK_KP_ENTER:
Marcoen Hirschberg4e96f7d2006-03-09 13:55:10 +0000166 case SDLK_RETURN:
167 case SDLK_a:
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000168#ifdef BUTTON_OFF
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000169 new_btn = BUTTON_OFF;
Marcoen Hirschberg338e2bb2006-02-24 15:42:52 +0000170#elif defined BUTTON_A
171 new_btn = BUTTON_A;
Tomasz Malesinskia19032c2006-08-18 19:14:11 +0000172#elif defined BUTTON_EQ
173 new_btn = BUTTON_EQ;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000174#endif
Marcoen Hirschberg338e2bb2006-02-24 15:42:52 +0000175 break;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000176
177#ifdef BUTTON_F1
178 case SDLK_KP_DIVIDE:
179 case SDLK_F1:
180 new_btn = BUTTON_F1;
181 break;
182 case SDLK_KP_MULTIPLY:
183 case SDLK_F2:
184 new_btn = BUTTON_F2;
185 break;
186 case SDLK_KP_MINUS:
187 case SDLK_F3:
188 new_btn = BUTTON_F3;
189 break;
190#elif defined(BUTTON_REC)
191 case SDLK_KP_DIVIDE:
192 case SDLK_F1:
193 new_btn = BUTTON_REC;
194 break;
Hristo Kovachev9dc0e622006-08-11 08:35:27 +0000195#elif defined BUTTON_REW
196 case SDLK_KP_DIVIDE:
197 case SDLK_F1:
198 new_btn = BUTTON_REW;
199 break;
200 case SDLK_KP_MULTIPLY:
201 case SDLK_F2:
202 new_btn = BUTTON_FF;
203 break;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000204#endif
205
206 case SDLK_KP5:
207 case SDLK_SPACE:
208#if defined(BUTTON_PLAY) && !defined(BUTTON_SELECT)
209 new_btn = BUTTON_PLAY;
210#elif defined(BUTTON_SELECT)
211 new_btn = BUTTON_SELECT;
212#endif
213 break;
214
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000215 case SDLK_KP0:
216 case SDLK_F5:
217 if(pressed)
218 {
219 screen_dump();
220 return;
221 }
222 break;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000223
Linus Nielsen Feltzing621bcc22006-02-04 23:15:15 +0000224 case SDLK_KP_PERIOD:
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000225 case SDLK_INSERT:
226#ifdef BUTTON_MENU
227 new_btn = BUTTON_MENU;
228#elif defined(BUTTON_MODE)
229 new_btn = BUTTON_MODE;
230#endif
231 break;
232 }
233
234 if (pressed)
235 btn |= new_btn;
236 else
237 btn &= ~new_btn;
238
239 /* Lots of stuff copied from real button.c. Not good, I think... */
240
241 /* Find out if a key has been released */
242 diff = btn ^ lastbtn;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000243 if(diff && (btn & diff) == 0)
244 {
Hristo Kovacheva70c6b92006-03-25 19:16:45 +0000245#ifdef CONFIG_BACKLIGHT
246#ifdef HAVE_REMOTE_LCD
247 if(diff & BUTTON_REMOTE)
248 if(!skip_remote_release)
249 queue_post(&button_queue, BUTTON_REL | diff, NULL);
250 else
251 skip_remote_release = false;
252 else
253#endif
254 if(!skip_release)
255 queue_post(&button_queue, BUTTON_REL | diff, NULL);
256 else
257 skip_release = false;
258#else
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000259 queue_post(&button_queue, BUTTON_REL | diff, NULL);
Hristo Kovacheva70c6b92006-03-25 19:16:45 +0000260#endif
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000261 }
Hristo Kovacheva70c6b92006-03-25 19:16:45 +0000262
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000263 else
264 {
265 if ( btn )
266 {
267 /* normal keypress */
268 if ( btn != lastbtn )
269 {
270 post = true;
271 repeat = false;
272 repeat_speed = REPEAT_INTERVAL_START;
273
274 }
275 else /* repeat? */
276 {
277 if ( repeat )
278 {
Jens Arnold237d3c42006-02-19 13:34:12 +0000279 if (!post)
280 count--;
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000281 if (count == 0)
282 {
283 post = true;
284 /* yes we have repeat */
285 repeat_speed--;
286 if (repeat_speed < REPEAT_INTERVAL_FINISH)
287 repeat_speed = REPEAT_INTERVAL_FINISH;
288 count = repeat_speed;
289
290 repeat_count++;
291 }
292 }
293 else
294 {
295 if (count++ > REPEAT_START)
296 {
297 post = true;
298 repeat = true;
299 repeat_count = 0;
300 /* initial repeat */
301 count = REPEAT_INTERVAL_START;
302 }
303 }
304 }
305 if ( post )
306 {
307 if(repeat)
Jens Arnold237d3c42006-02-19 13:34:12 +0000308 {
309 if (queue_empty(&button_queue))
310 {
311 queue_post(&button_queue, BUTTON_REPEAT | btn, NULL);
Hristo Kovacheva70c6b92006-03-25 19:16:45 +0000312#ifdef CONFIG_BACKLIGHT
313#ifdef HAVE_REMOTE_LCD
314 if(btn & BUTTON_REMOTE)
315 {
316 if(skip_remote_release)
317 skip_remote_release = false;
318 }
319 else
320#endif
321 if(skip_release)
322 skip_release = false;
323#endif
Jens Arnold237d3c42006-02-19 13:34:12 +0000324 post = false;
325 }
326 }
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000327 else
Jens Arnold237d3c42006-02-19 13:34:12 +0000328 {
Björn Stenbergda5fb182006-03-24 13:47:24 +0000329#ifdef CONFIG_BACKLIGHT
Hristo Kovacheva70c6b92006-03-25 19:16:45 +0000330#ifdef HAVE_REMOTE_LCD
331 if (btn & BUTTON_REMOTE) {
332 if (!remote_filter_first_keypress || is_remote_backlight_on())
333 queue_post(&button_queue, btn, NULL);
334 else
335 skip_remote_release = true;
336 }
337 else
338#endif
339 if (!filter_first_keypress || is_backlight_on())
340 queue_post(&button_queue, btn, NULL);
341 else
342 skip_release = true;
343#else /* no backlight, nothing to skip */
Björn Stenbergda5fb182006-03-24 13:47:24 +0000344 queue_post(&button_queue, btn, NULL);
Hristo Kovacheva70c6b92006-03-25 19:16:45 +0000345#endif
Jens Arnold237d3c42006-02-19 13:34:12 +0000346 post = false;
347 }
Linus Nielsen Feltzingfc72c532006-02-03 15:19:58 +0000348
349#ifdef HAVE_REMOTE_LCD
350 if(btn & BUTTON_REMOTE)
351 remote_backlight_on();
352 else
353#endif
354 backlight_on();
355
356 }
357 }
358 else
359 {
360 repeat = false;
361 count = 0;
362 }
363 }
364 lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT);
365}
366
367/* Again copied from real button.c... */
368
369long button_get(bool block)
370{
371 struct event ev;
372
373 if ( block || !queue_empty(&button_queue) ) {
374 queue_wait(&button_queue, &ev);
375 return ev.id;
376 }
377 return BUTTON_NONE;
378}
379
380long button_get_w_tmo(int ticks)
381{
382 struct event ev;
383 queue_wait_w_tmo(&button_queue, &ev, ticks);
384 return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE;
385}
386
387void button_init(void)
388{
389}
390
391int button_status(void)
392{
393 return btn;
394}
395
396void button_clear_queue(void)
397{
398 queue_clear(&button_queue);
399}
400
401#ifdef HAS_BUTTON_HOLD
402bool button_hold(void) {
403 /* temp fix for hold button on irivers */
404 return false;
405}
406#endif
407
408#ifdef HAS_REMOTE_BUTTON_HOLD
409bool remote_button_hold(void) {
410 /* temp fix for hold button on irivers */
411 return false;
412}
413#endif
414