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 /* how long until repeat kicks in */
34 #define REPEAT_START 6
36 /* the speed repeat starts at */
37 #define REPEAT_INTERVAL_START 4
39 /* speed repeat finishes at */
40 #define REPEAT_INTERVAL_FINISH 2
42 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
43 int _remote_type
=REMOTETYPE_H100_LCD
;
51 struct event_queue button_queue
;
53 static int btn
= 0; /* Hopefully keeps track of currently pressed keys... */
56 static bool filter_first_keypress
;
58 void set_backlight_filter_keypress(bool value
)
60 filter_first_keypress
= value
;
62 #ifdef HAVE_REMOTE_LCD
63 static bool remote_filter_first_keypress
;
65 void set_remote_backlight_filter_keypress(bool value
)
67 remote_filter_first_keypress
= value
;
72 #ifdef HAS_BUTTON_HOLD
73 bool hold_button_state
= false;
74 bool button_hold(void) {
75 return hold_button_state
;
79 #ifdef HAS_REMOTE_BUTTON_HOLD
80 bool remote_hold_button_state
= false;
81 bool remote_button_hold(void) {
82 return remote_hold_button_state
;
86 void button_event(int key
, bool pressed
)
92 static int repeat_speed
= REPEAT_INTERVAL_START
;
93 static int repeat_count
= 0;
94 static bool repeat
= false;
95 static bool post
= false;
97 static bool skip_release
= false;
98 #ifdef HAVE_REMOTE_LCD
99 static bool skip_remote_release
= false;
102 static bool usb_connected
= false;
103 if (usb_connected
&& key
!= SDLK_u
)
111 usb_connected
= !usb_connected
;
113 queue_post(&button_queue
, SYS_USB_CONNECTED
, 0);
115 queue_post(&button_queue
, SYS_USB_DISCONNECTED
, 0);
119 #ifdef HAS_BUTTON_HOLD
123 hold_button_state
= !hold_button_state
;
124 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
129 #ifdef HAS_REMOTE_BUTTON_HOLD
133 remote_hold_button_state
= !remote_hold_button_state
;
134 DEBUGF("Remote hold button is %s\n",
135 remote_hold_button_state
?"ON":"OFF");
140 #if CONFIG_KEYPAD == GIGABEAT_PAD
143 new_btn
= BUTTON_LEFT
;
147 new_btn
= BUTTON_RIGHT
;
155 new_btn
= BUTTON_DOWN
;
159 new_btn
= BUTTON_POWER
;
162 new_btn
= BUTTON_POWER
;
171 new_btn
= BUTTON_SELECT
;
175 new_btn
= BUTTON_MENU
;
178 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
181 new_btn
= BUTTON_LEFT
;
185 new_btn
= BUTTON_RIGHT
;
193 new_btn
= BUTTON_DOWN
;
197 new_btn
= BUTTON_PLAY
;
200 new_btn
= BUTTON_POWER
;
205 new_btn
= BUTTON_POWER
;
209 new_btn
= BUTTON_REC
;
213 new_btn
= BUTTON_SELECT
;
216 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
217 || (CONFIG_KEYPAD == IPOD_4G_PAD)
220 new_btn
= BUTTON_LEFT
;
224 new_btn
= BUTTON_RIGHT
;
228 new_btn
= BUTTON_SCROLL_BACK
;
232 new_btn
= BUTTON_SCROLL_FWD
;
236 new_btn
= BUTTON_PLAY
;
240 new_btn
= BUTTON_SELECT
;
244 new_btn
= BUTTON_MENU
;
247 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
250 new_btn
= BUTTON_LEFT
;
254 new_btn
= BUTTON_RIGHT
;
258 new_btn
= BUTTON_SCROLL_UP
;
262 new_btn
= BUTTON_SCROLL_DOWN
;
266 new_btn
= BUTTON_POWER
;
269 new_btn
= BUTTON_POWER
;
273 new_btn
= BUTTON_REW
;
275 case SDLK_KP_MULTIPLY
:
281 new_btn
= BUTTON_PLAY
;
284 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
289 case REMOTETYPE_UNPLUGGED
:
290 _remote_type
=REMOTETYPE_H100_LCD
;
291 DEBUGF("Changed remote type to H100\n");
293 case REMOTETYPE_H100_LCD
:
294 _remote_type
=REMOTETYPE_H300_LCD
;
295 DEBUGF("Changed remote type to H300\n");
297 case REMOTETYPE_H300_LCD
:
298 _remote_type
=REMOTETYPE_H300_NONLCD
;
299 DEBUGF("Changed remote type to H300 NON-LCD\n");
301 case REMOTETYPE_H300_NONLCD
:
302 _remote_type
=REMOTETYPE_UNPLUGGED
;
303 DEBUGF("Changed remote type to none\n");
309 new_btn
= BUTTON_LEFT
;
313 new_btn
= BUTTON_RIGHT
;
321 new_btn
= BUTTON_DOWN
;
330 new_btn
= BUTTON_OFF
;
334 new_btn
= BUTTON_REC
;
338 new_btn
= BUTTON_SELECT
;
342 new_btn
= BUTTON_MODE
;
345 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
348 new_btn
= BUTTON_LEFT
;
352 new_btn
= BUTTON_RIGHT
;
360 new_btn
= BUTTON_DOWN
;
364 new_btn
= BUTTON_PLAY
;
373 new_btn
= BUTTON_SELECT
;
377 new_btn
= BUTTON_MODE
;
380 #elif CONFIG_KEYPAD == ONDIO_PAD
383 new_btn
= BUTTON_LEFT
;
387 new_btn
= BUTTON_RIGHT
;
395 new_btn
= BUTTON_DOWN
;
400 new_btn
= BUTTON_OFF
;
404 new_btn
= BUTTON_MENU
;
407 #elif CONFIG_KEYPAD == PLAYER_PAD
410 new_btn
= BUTTON_LEFT
;
414 new_btn
= BUTTON_RIGHT
;
418 new_btn
= BUTTON_PLAY
;
422 new_btn
= BUTTON_STOP
;
430 new_btn
= BUTTON_MENU
;
433 #elif CONFIG_KEYPAD == RECORDER_PAD
436 new_btn
= BUTTON_LEFT
;
440 new_btn
= BUTTON_RIGHT
;
448 new_btn
= BUTTON_DOWN
;
457 new_btn
= BUTTON_OFF
;
463 case SDLK_KP_MULTIPLY
:
473 new_btn
= BUTTON_PLAY
;
476 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
479 new_btn
= BUTTON_LEFT
;
483 new_btn
= BUTTON_RIGHT
;
491 new_btn
= BUTTON_DOWN
;
500 new_btn
= BUTTON_OFF
;
506 case SDLK_KP_MULTIPLY
:
516 new_btn
= BUTTON_SELECT
;
519 #elif CONFIG_KEYPAD == SANSA_E200_PAD
522 new_btn
= BUTTON_LEFT
;
526 new_btn
= BUTTON_RIGHT
;
530 new_btn
= BUTTON_SCROLL_UP
;
534 new_btn
= BUTTON_SCROLL_DOWN
;
540 new_btn
= BUTTON_DOWN
;
543 new_btn
= BUTTON_POWER
;
546 new_btn
= BUTTON_REC
;
550 new_btn
= BUTTON_SELECT
;
553 #endif /* CONFIG_KEYPAD */
569 /* Lots of stuff copied from real button.c. Not good, I think... */
571 /* Find out if a key has been released */
572 diff
= btn
^ lastbtn
;
573 if(diff
&& (btn
& diff
) == 0)
575 #ifdef HAVE_BACKLIGHT
576 #ifdef HAVE_REMOTE_LCD
577 if(diff
& BUTTON_REMOTE
)
578 if(!skip_remote_release
)
579 queue_post(&button_queue
, BUTTON_REL
| diff
, 0);
581 skip_remote_release
= false;
585 queue_post(&button_queue
, BUTTON_REL
| diff
, 0);
587 skip_release
= false;
589 queue_post(&button_queue
, BUTTON_REL
| diff
, 0);
597 /* normal keypress */
598 if ( btn
!= lastbtn
)
602 repeat_speed
= REPEAT_INTERVAL_START
;
614 /* yes we have repeat */
616 if (repeat_speed
< REPEAT_INTERVAL_FINISH
)
617 repeat_speed
= REPEAT_INTERVAL_FINISH
;
618 count
= repeat_speed
;
625 if (count
++ > REPEAT_START
)
631 count
= REPEAT_INTERVAL_START
;
639 if (queue_empty(&button_queue
))
641 queue_post(&button_queue
, BUTTON_REPEAT
| btn
, 0);
642 #ifdef HAVE_BACKLIGHT
643 #ifdef HAVE_REMOTE_LCD
644 if(btn
& BUTTON_REMOTE
)
646 if(skip_remote_release
)
647 skip_remote_release
= false;
652 skip_release
= false;
659 #ifdef HAVE_BACKLIGHT
660 #ifdef HAVE_REMOTE_LCD
661 if (btn
& BUTTON_REMOTE
) {
662 if (!remote_filter_first_keypress
|| is_remote_backlight_on())
663 queue_post(&button_queue
, btn
, 0);
665 skip_remote_release
= true;
669 if (!filter_first_keypress
|| is_backlight_on())
670 queue_post(&button_queue
, btn
, 0);
673 #else /* no backlight, nothing to skip */
674 queue_post(&button_queue
, btn
, 0);
679 #ifdef HAVE_REMOTE_LCD
680 if(btn
& BUTTON_REMOTE
)
681 remote_backlight_on();
694 lastbtn
= btn
& ~(BUTTON_REL
| BUTTON_REPEAT
);
697 /* Again copied from real button.c... */
699 long button_get(bool block
)
703 if ( block
|| !queue_empty(&button_queue
) ) {
704 queue_wait(&button_queue
, &ev
);
705 button_data
= ev
.data
;
711 long button_get_w_tmo(int ticks
)
714 queue_wait_w_tmo(&button_queue
, &ev
, ticks
);
715 if (ev
.id
== SYS_TIMEOUT
)
718 button_data
= ev
.data
;
723 intptr_t button_get_data(void)
725 /* Needed by the accelerating wheel driver for Sansa e200 */
729 void button_init(void)
733 int button_status(void)
738 void button_clear_queue(void)
740 queue_clear(&button_queue
);