1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Felix Arends
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.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
21 #include "lcd-charcells.h"
22 #include "lcd-remote.h"
26 #include "backlight.h"
31 static intptr_t button_data
; /* data value from last message dequeued */
33 /* Special thread-synced queue_post for button driver or any other preemptive sim thread */
34 extern void queue_syncpost(struct event_queue
*q
, long id
, intptr_t data
);
35 /* Special thread-synced queue_broadcast for button driver or any other preemptive sim thread */
36 extern int queue_syncbroadcast(long id
, intptr_t data
);
38 /* how long until repeat kicks in */
39 #define REPEAT_START 6
41 /* the speed repeat starts at */
42 #define REPEAT_INTERVAL_START 4
44 /* speed repeat finishes at */
45 #define REPEAT_INTERVAL_FINISH 2
47 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
48 int _remote_type
=REMOTETYPE_H100_LCD
;
56 struct event_queue button_queue
;
58 static int btn
= 0; /* Hopefully keeps track of currently pressed keys... */
61 static bool filter_first_keypress
;
63 void set_backlight_filter_keypress(bool value
)
65 filter_first_keypress
= value
;
67 #ifdef HAVE_REMOTE_LCD
68 static bool remote_filter_first_keypress
;
70 void set_remote_backlight_filter_keypress(bool value
)
72 remote_filter_first_keypress
= value
;
77 #ifdef HAS_BUTTON_HOLD
78 bool hold_button_state
= false;
79 bool button_hold(void) {
80 return hold_button_state
;
84 #ifdef HAS_REMOTE_BUTTON_HOLD
85 bool remote_hold_button_state
= false;
86 bool remote_button_hold(void) {
87 return remote_hold_button_state
;
91 void button_event(int key
, bool pressed
)
97 static int repeat_speed
= REPEAT_INTERVAL_START
;
98 static int repeat_count
= 0;
99 static bool repeat
= false;
100 static bool post
= false;
101 #ifdef HAVE_BACKLIGHT
102 static bool skip_release
= false;
103 #ifdef HAVE_REMOTE_LCD
104 static bool skip_remote_release
= false;
107 static bool usb_connected
= false;
108 if (usb_connected
&& key
!= SDLK_u
)
116 usb_connected
= !usb_connected
;
118 queue_syncpost(&button_queue
, SYS_USB_CONNECTED
, 0);
120 queue_syncpost(&button_queue
, SYS_USB_DISCONNECTED
, 0);
124 #ifdef HAS_BUTTON_HOLD
128 hold_button_state
= !hold_button_state
;
129 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
134 #ifdef HAS_REMOTE_BUTTON_HOLD
138 remote_hold_button_state
= !remote_hold_button_state
;
139 DEBUGF("Remote hold button is %s\n",
140 remote_hold_button_state
?"ON":"OFF");
145 #if CONFIG_KEYPAD == GIGABEAT_PAD
148 new_btn
= BUTTON_LEFT
;
152 new_btn
= BUTTON_RIGHT
;
160 new_btn
= BUTTON_DOWN
;
164 new_btn
= BUTTON_POWER
;
167 new_btn
= BUTTON_POWER
;
176 new_btn
= BUTTON_SELECT
;
180 new_btn
= BUTTON_MENU
;
183 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
186 new_btn
= BUTTON_LEFT
;
190 new_btn
= BUTTON_RIGHT
;
198 new_btn
= BUTTON_DOWN
;
202 new_btn
= BUTTON_PLAY
;
205 new_btn
= BUTTON_POWER
;
210 new_btn
= BUTTON_POWER
;
214 new_btn
= BUTTON_REC
;
218 new_btn
= BUTTON_SELECT
;
221 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
222 || (CONFIG_KEYPAD == IPOD_4G_PAD)
225 new_btn
= BUTTON_LEFT
;
229 new_btn
= BUTTON_RIGHT
;
233 new_btn
= BUTTON_SCROLL_BACK
;
237 new_btn
= BUTTON_SCROLL_FWD
;
241 new_btn
= BUTTON_PLAY
;
245 new_btn
= BUTTON_SELECT
;
249 new_btn
= BUTTON_MENU
;
252 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
255 new_btn
= BUTTON_LEFT
;
259 new_btn
= BUTTON_RIGHT
;
263 new_btn
= BUTTON_SCROLL_UP
;
267 new_btn
= BUTTON_SCROLL_DOWN
;
271 new_btn
= BUTTON_POWER
;
274 new_btn
= BUTTON_POWER
;
278 new_btn
= BUTTON_REW
;
280 case SDLK_KP_MULTIPLY
:
286 new_btn
= BUTTON_PLAY
;
289 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
294 case REMOTETYPE_UNPLUGGED
:
295 _remote_type
=REMOTETYPE_H100_LCD
;
296 DEBUGF("Changed remote type to H100\n");
298 case REMOTETYPE_H100_LCD
:
299 _remote_type
=REMOTETYPE_H300_LCD
;
300 DEBUGF("Changed remote type to H300\n");
302 case REMOTETYPE_H300_LCD
:
303 _remote_type
=REMOTETYPE_H300_NONLCD
;
304 DEBUGF("Changed remote type to H300 NON-LCD\n");
306 case REMOTETYPE_H300_NONLCD
:
307 _remote_type
=REMOTETYPE_UNPLUGGED
;
308 DEBUGF("Changed remote type to none\n");
314 new_btn
= BUTTON_LEFT
;
318 new_btn
= BUTTON_RIGHT
;
326 new_btn
= BUTTON_DOWN
;
335 new_btn
= BUTTON_OFF
;
339 new_btn
= BUTTON_REC
;
343 new_btn
= BUTTON_SELECT
;
347 new_btn
= BUTTON_MODE
;
350 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
353 new_btn
= BUTTON_LEFT
;
357 new_btn
= BUTTON_RIGHT
;
365 new_btn
= BUTTON_DOWN
;
369 new_btn
= BUTTON_PLAY
;
378 new_btn
= BUTTON_SELECT
;
382 new_btn
= BUTTON_MODE
;
385 #elif CONFIG_KEYPAD == ONDIO_PAD
388 new_btn
= BUTTON_LEFT
;
392 new_btn
= BUTTON_RIGHT
;
400 new_btn
= BUTTON_DOWN
;
405 new_btn
= BUTTON_OFF
;
409 new_btn
= BUTTON_MENU
;
412 #elif CONFIG_KEYPAD == PLAYER_PAD
415 new_btn
= BUTTON_LEFT
;
419 new_btn
= BUTTON_RIGHT
;
423 new_btn
= BUTTON_PLAY
;
427 new_btn
= BUTTON_STOP
;
435 new_btn
= BUTTON_MENU
;
438 #elif CONFIG_KEYPAD == RECORDER_PAD
441 new_btn
= BUTTON_LEFT
;
445 new_btn
= BUTTON_RIGHT
;
453 new_btn
= BUTTON_DOWN
;
462 new_btn
= BUTTON_OFF
;
468 case SDLK_KP_MULTIPLY
:
478 new_btn
= BUTTON_PLAY
;
481 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
484 new_btn
= BUTTON_LEFT
;
488 new_btn
= BUTTON_RIGHT
;
496 new_btn
= BUTTON_DOWN
;
505 new_btn
= BUTTON_OFF
;
511 case SDLK_KP_MULTIPLY
:
521 new_btn
= BUTTON_SELECT
;
524 #elif CONFIG_KEYPAD == SANSA_E200_PAD
527 new_btn
= BUTTON_LEFT
;
531 new_btn
= BUTTON_RIGHT
;
535 new_btn
= BUTTON_SCROLL_UP
;
539 new_btn
= BUTTON_SCROLL_DOWN
;
545 new_btn
= BUTTON_DOWN
;
548 new_btn
= BUTTON_POWER
;
551 new_btn
= BUTTON_REC
;
555 new_btn
= BUTTON_SELECT
;
558 #elif CONFIG_KEYPAD == SANSA_C200_PAD
561 new_btn
= BUTTON_LEFT
;
565 new_btn
= BUTTON_RIGHT
;
573 new_btn
= BUTTON_DOWN
;
576 new_btn
= BUTTON_POWER
;
579 new_btn
= BUTTON_REC
;
584 new_btn
= BUTTON_SELECT
;
587 new_btn
= BUTTON_VOL_DOWN
;
590 new_btn
= BUTTON_VOL_UP
;
593 #endif /* CONFIG_KEYPAD */
598 queue_syncbroadcast(SYS_SCREENDUMP
, 0);
609 /* Lots of stuff copied from real button.c. Not good, I think... */
611 /* Find out if a key has been released */
612 diff
= btn
^ lastbtn
;
613 if(diff
&& (btn
& diff
) == 0)
615 #ifdef HAVE_BACKLIGHT
616 #ifdef HAVE_REMOTE_LCD
617 if(diff
& BUTTON_REMOTE
)
618 if(!skip_remote_release
)
619 queue_syncpost(&button_queue
, BUTTON_REL
| diff
, 0);
621 skip_remote_release
= false;
625 queue_syncpost(&button_queue
, BUTTON_REL
| diff
, 0);
627 skip_release
= false;
629 queue_syncpost(&button_queue
, BUTTON_REL
| diff
, 0);
637 /* normal keypress */
638 if ( btn
!= lastbtn
)
642 repeat_speed
= REPEAT_INTERVAL_START
;
654 /* yes we have repeat */
656 if (repeat_speed
< REPEAT_INTERVAL_FINISH
)
657 repeat_speed
= REPEAT_INTERVAL_FINISH
;
658 count
= repeat_speed
;
665 if (count
++ > REPEAT_START
)
671 count
= REPEAT_INTERVAL_START
;
679 if (queue_empty(&button_queue
))
681 queue_syncpost(&button_queue
, BUTTON_REPEAT
| btn
, 0);
682 #ifdef HAVE_BACKLIGHT
683 #ifdef HAVE_REMOTE_LCD
684 if(btn
& BUTTON_REMOTE
)
686 if(skip_remote_release
)
687 skip_remote_release
= false;
692 skip_release
= false;
699 #ifdef HAVE_BACKLIGHT
700 #ifdef HAVE_REMOTE_LCD
701 if (btn
& BUTTON_REMOTE
) {
702 if (!remote_filter_first_keypress
|| is_remote_backlight_on())
703 queue_syncpost(&button_queue
, btn
, 0);
705 skip_remote_release
= true;
709 if (!filter_first_keypress
|| is_backlight_on())
710 queue_syncpost(&button_queue
, btn
, 0);
713 #else /* no backlight, nothing to skip */
714 queue_syncpost(&button_queue
, btn
, 0);
719 #ifdef HAVE_REMOTE_LCD
720 if(btn
& BUTTON_REMOTE
)
721 remote_backlight_on();
734 lastbtn
= btn
& ~(BUTTON_REL
| BUTTON_REPEAT
);
737 /* Again copied from real button.c... */
739 long button_get(bool block
)
743 if ( block
|| !queue_empty(&button_queue
) ) {
744 queue_wait(&button_queue
, &ev
);
745 button_data
= ev
.data
;
751 long button_get_w_tmo(int ticks
)
754 queue_wait_w_tmo(&button_queue
, &ev
, ticks
);
755 if (ev
.id
== SYS_TIMEOUT
)
758 button_data
= ev
.data
;
763 intptr_t button_get_data(void)
765 /* Needed by the accelerating wheel driver for Sansa e200 */
769 void button_init(void)
773 int button_status(void)
778 void button_clear_queue(void)
780 queue_clear(&button_queue
);