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 */
34 static int mouse_coords
= 0;
36 /* how long until repeat kicks in */
37 #define REPEAT_START 6
39 /* the speed repeat starts at */
40 #define REPEAT_INTERVAL_START 4
42 /* speed repeat finishes at */
43 #define REPEAT_INTERVAL_FINISH 2
45 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
46 int _remote_type
=REMOTETYPE_H100_LCD
;
54 struct event_queue button_queue
;
56 static int btn
= 0; /* Hopefully keeps track of currently pressed keys... */
59 static bool filter_first_keypress
;
61 void set_backlight_filter_keypress(bool value
)
63 filter_first_keypress
= value
;
65 #ifdef HAVE_REMOTE_LCD
66 static bool remote_filter_first_keypress
;
68 void set_remote_backlight_filter_keypress(bool value
)
70 remote_filter_first_keypress
= value
;
75 #ifdef HAS_BUTTON_HOLD
76 bool hold_button_state
= false;
77 bool button_hold(void) {
78 return hold_button_state
;
82 #ifdef HAS_REMOTE_BUTTON_HOLD
83 bool remote_hold_button_state
= false;
84 bool remote_button_hold(void) {
85 return remote_hold_button_state
;
90 void button_event(int key
, bool pressed
)
96 static int repeat_speed
= REPEAT_INTERVAL_START
;
97 static int repeat_count
= 0;
98 static bool repeat
= false;
99 static bool post
= false;
100 #ifdef HAVE_BACKLIGHT
101 static bool skip_release
= false;
102 #ifdef HAVE_REMOTE_LCD
103 static bool skip_remote_release
= false;
106 static bool usb_connected
= false;
107 if (usb_connected
&& key
!= SDLK_u
)
113 case BUTTON_TOUCHPAD
:
114 new_btn
= BUTTON_TOUCHPAD
;
121 usb_connected
= !usb_connected
;
123 queue_post(&button_queue
, SYS_USB_CONNECTED
, 0);
125 queue_post(&button_queue
, SYS_USB_DISCONNECTED
, 0);
129 #ifdef HAS_BUTTON_HOLD
133 hold_button_state
= !hold_button_state
;
134 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
139 #ifdef HAS_REMOTE_BUTTON_HOLD
143 remote_hold_button_state
= !remote_hold_button_state
;
144 DEBUGF("Remote hold button is %s\n",
145 remote_hold_button_state
?"ON":"OFF");
150 #if CONFIG_KEYPAD == GIGABEAT_PAD
153 new_btn
= BUTTON_LEFT
;
157 new_btn
= BUTTON_RIGHT
;
165 new_btn
= BUTTON_DOWN
;
169 new_btn
= BUTTON_POWER
;
172 new_btn
= BUTTON_POWER
;
181 new_btn
= BUTTON_SELECT
;
185 new_btn
= BUTTON_MENU
;
188 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
191 new_btn
= BUTTON_LEFT
;
195 new_btn
= BUTTON_RIGHT
;
203 new_btn
= BUTTON_DOWN
;
207 new_btn
= BUTTON_POWER
;
212 new_btn
= BUTTON_PLAY
;
215 new_btn
= BUTTON_BACK
;
219 new_btn
= BUTTON_SELECT
;
224 new_btn
= BUTTON_MENU
;
227 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
230 new_btn
= BUTTON_LEFT
;
234 new_btn
= BUTTON_RIGHT
;
242 new_btn
= BUTTON_DOWN
;
246 new_btn
= BUTTON_PLAY
;
249 new_btn
= BUTTON_POWER
;
254 new_btn
= BUTTON_POWER
;
258 new_btn
= BUTTON_REC
;
262 new_btn
= BUTTON_SELECT
;
265 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
268 new_btn
= BUTTON_LEFT
;
272 new_btn
= BUTTON_RIGHT
;
276 new_btn
= BUTTON_VOL_UP
;
280 new_btn
= BUTTON_VOL_DOWN
;
284 new_btn
= BUTTON_MODE
;
288 new_btn
= BUTTON_REC
;
292 new_btn
= BUTTON_PLAY
;
295 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
296 || (CONFIG_KEYPAD == IPOD_4G_PAD)
299 new_btn
= BUTTON_LEFT
;
303 new_btn
= BUTTON_RIGHT
;
307 new_btn
= BUTTON_SCROLL_BACK
;
311 new_btn
= BUTTON_SCROLL_FWD
;
315 new_btn
= BUTTON_PLAY
;
319 new_btn
= BUTTON_SELECT
;
323 new_btn
= BUTTON_MENU
;
326 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
329 new_btn
= BUTTON_LEFT
;
333 new_btn
= BUTTON_RIGHT
;
337 new_btn
= BUTTON_SCROLL_UP
;
341 new_btn
= BUTTON_SCROLL_DOWN
;
345 new_btn
= BUTTON_POWER
;
348 new_btn
= BUTTON_POWER
;
352 new_btn
= BUTTON_REW
;
354 case SDLK_KP_MULTIPLY
:
360 new_btn
= BUTTON_PLAY
;
363 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
368 case REMOTETYPE_UNPLUGGED
:
369 _remote_type
=REMOTETYPE_H100_LCD
;
370 DEBUGF("Changed remote type to H100\n");
372 case REMOTETYPE_H100_LCD
:
373 _remote_type
=REMOTETYPE_H300_LCD
;
374 DEBUGF("Changed remote type to H300\n");
376 case REMOTETYPE_H300_LCD
:
377 _remote_type
=REMOTETYPE_H300_NONLCD
;
378 DEBUGF("Changed remote type to H300 NON-LCD\n");
380 case REMOTETYPE_H300_NONLCD
:
381 _remote_type
=REMOTETYPE_UNPLUGGED
;
382 DEBUGF("Changed remote type to none\n");
388 new_btn
= BUTTON_LEFT
;
392 new_btn
= BUTTON_RIGHT
;
400 new_btn
= BUTTON_DOWN
;
409 new_btn
= BUTTON_OFF
;
413 new_btn
= BUTTON_REC
;
417 new_btn
= BUTTON_SELECT
;
421 new_btn
= BUTTON_MODE
;
424 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
427 new_btn
= BUTTON_LEFT
;
431 new_btn
= BUTTON_RIGHT
;
439 new_btn
= BUTTON_DOWN
;
443 new_btn
= BUTTON_PLAY
;
452 new_btn
= BUTTON_SELECT
;
456 new_btn
= BUTTON_MODE
;
459 #elif CONFIG_KEYPAD == ONDIO_PAD
462 new_btn
= BUTTON_LEFT
;
466 new_btn
= BUTTON_RIGHT
;
474 new_btn
= BUTTON_DOWN
;
479 new_btn
= BUTTON_OFF
;
483 new_btn
= BUTTON_MENU
;
486 #elif CONFIG_KEYPAD == PLAYER_PAD
489 new_btn
= BUTTON_LEFT
;
493 new_btn
= BUTTON_RIGHT
;
497 new_btn
= BUTTON_PLAY
;
501 new_btn
= BUTTON_STOP
;
509 new_btn
= BUTTON_MENU
;
512 #elif CONFIG_KEYPAD == RECORDER_PAD
515 new_btn
= BUTTON_LEFT
;
519 new_btn
= BUTTON_RIGHT
;
527 new_btn
= BUTTON_DOWN
;
536 new_btn
= BUTTON_OFF
;
542 case SDLK_KP_MULTIPLY
:
552 new_btn
= BUTTON_PLAY
;
555 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
558 new_btn
= BUTTON_LEFT
;
562 new_btn
= BUTTON_RIGHT
;
570 new_btn
= BUTTON_DOWN
;
579 new_btn
= BUTTON_OFF
;
585 case SDLK_KP_MULTIPLY
:
595 new_btn
= BUTTON_SELECT
;
598 #elif CONFIG_KEYPAD == SANSA_E200_PAD
601 new_btn
= BUTTON_LEFT
;
605 new_btn
= BUTTON_RIGHT
;
609 new_btn
= BUTTON_SCROLL_BACK
;
613 new_btn
= BUTTON_SCROLL_FWD
;
619 new_btn
= BUTTON_DOWN
;
622 new_btn
= BUTTON_POWER
;
625 new_btn
= BUTTON_REC
;
629 new_btn
= BUTTON_SELECT
;
632 #elif CONFIG_KEYPAD == SANSA_C200_PAD
635 new_btn
= BUTTON_LEFT
;
639 new_btn
= BUTTON_RIGHT
;
647 new_btn
= BUTTON_DOWN
;
650 new_btn
= BUTTON_POWER
;
653 new_btn
= BUTTON_REC
;
658 new_btn
= BUTTON_SELECT
;
661 new_btn
= BUTTON_VOL_DOWN
;
664 new_btn
= BUTTON_VOL_UP
;
667 #elif CONFIG_KEYPAD == MROBE500_PAD
670 new_btn
= BUTTON_LEFT
;
674 new_btn
= BUTTON_RIGHT
;
678 new_btn
= BUTTON_RC_PLAY
;
682 new_btn
= BUTTON_RC_DOWN
;
686 new_btn
= BUTTON_POWER
;
689 new_btn
= BUTTON_POWER
;
694 new_btn
= BUTTON_RC_VOL_UP
;
698 new_btn
= BUTTON_RC_HEART
;
702 new_btn
= BUTTON_RC_MODE
;
705 #elif CONFIG_KEYPAD == MROBE100_PAD
707 new_btn
= BUTTON_DISPLAY
;
710 new_btn
= BUTTON_MENU
;
713 new_btn
= BUTTON_PLAY
;
717 new_btn
= BUTTON_LEFT
;
721 new_btn
= BUTTON_RIGHT
;
729 new_btn
= BUTTON_DOWN
;
733 new_btn
= BUTTON_SELECT
;
735 case SDLK_KP_MULTIPLY
:
738 new_btn
= BUTTON_POWER
;
741 #elif CONFIG_KEYPAD == COWOND2_PAD
744 new_btn
= BUTTON_LEFT
;
748 new_btn
= BUTTON_RIGHT
;
756 new_btn
= BUTTON_DOWN
;
759 new_btn
= BUTTON_POWER
;
764 new_btn
= BUTTON_SELECT
;
767 new_btn
= BUTTON_PLUS
;
770 new_btn
= BUTTON_MINUS
;
773 new_btn
= BUTTON_MENU
;
776 #error No keymap defined!
777 #endif /* CONFIG_KEYPAD */
782 queue_broadcast(SYS_SCREENDUMP
, 0);
793 /* Lots of stuff copied from real button.c. Not good, I think... */
795 /* Find out if a key has been released */
796 diff
= btn
^ lastbtn
;
797 if(diff
&& (btn
& diff
) == 0)
799 #ifdef HAVE_BACKLIGHT
800 #ifdef HAVE_REMOTE_LCD
801 if(diff
& BUTTON_REMOTE
)
802 if(!skip_remote_release
)
803 queue_post(&button_queue
, BUTTON_REL
| diff
, data
);
805 skip_remote_release
= false;
809 queue_post(&button_queue
, BUTTON_REL
| diff
, data
);
811 skip_release
= false;
813 queue_post(&button_queue
, BUTTON_REL
| diff
, data
);
821 /* normal keypress */
822 if ( btn
!= lastbtn
)
826 repeat_speed
= REPEAT_INTERVAL_START
;
838 /* yes we have repeat */
840 if (repeat_speed
< REPEAT_INTERVAL_FINISH
)
841 repeat_speed
= REPEAT_INTERVAL_FINISH
;
842 count
= repeat_speed
;
849 if (count
++ > REPEAT_START
)
855 count
= REPEAT_INTERVAL_START
;
863 if (queue_empty(&button_queue
))
865 queue_post(&button_queue
, BUTTON_REPEAT
| btn
, data
);
866 #ifdef HAVE_BACKLIGHT
867 #ifdef HAVE_REMOTE_LCD
868 if(btn
& BUTTON_REMOTE
)
870 if(skip_remote_release
)
871 skip_remote_release
= false;
876 skip_release
= false;
883 #ifdef HAVE_BACKLIGHT
884 #ifdef HAVE_REMOTE_LCD
885 if (btn
& BUTTON_REMOTE
) {
886 if (!remote_filter_first_keypress
887 || is_remote_backlight_on(false))
888 queue_post(&button_queue
, btn
, data
);
890 skip_remote_release
= true;
894 if (!filter_first_keypress
895 || is_backlight_on(false))
896 queue_post(&button_queue
, btn
, data
);
899 #else /* no backlight, nothing to skip */
900 queue_post(&button_queue
, btn
, data
);
905 #ifdef HAVE_REMOTE_LCD
906 if(btn
& BUTTON_REMOTE
)
907 remote_backlight_on();
920 lastbtn
= btn
& ~(BUTTON_REL
| BUTTON_REPEAT
);
923 /* Again copied from real button.c... */
925 int button_queue_count( void )
927 return queue_count(&button_queue
);
930 long button_get(bool block
)
932 struct queue_event ev
;
934 if ( block
|| !queue_empty(&button_queue
) ) {
935 queue_wait(&button_queue
, &ev
);
936 button_data
= ev
.data
;
942 long button_get_w_tmo(int ticks
)
944 struct queue_event ev
;
945 queue_wait_w_tmo(&button_queue
, &ev
, ticks
);
946 if (ev
.id
== SYS_TIMEOUT
)
949 button_data
= ev
.data
;
954 intptr_t button_get_data(void)
959 /* Needed by the accelerating wheel driver for Sansa e200 */
965 extern bool debug_wps
;
966 void mouse_tick_task(void)
968 static int last_check
= 0;
970 if (TIME_BEFORE(current_tick
, last_check
+(HZ
/10)))
972 last_check
= current_tick
;
973 if (SDL_GetMouseState(&x
, &y
) & SDL_BUTTON(SDL_BUTTON_LEFT
))
975 mouse_coords
= (x
<<16)|y
;
976 button_event(BUTTON_TOUCHPAD
, true);
978 printf("Mouse at: (%d, %d)\n", x
, y
);
980 else if (lastbtn
== BUTTON_TOUCHPAD
)
982 button_event(BUTTON_TOUCHPAD
, false);
987 void button_init(void)
990 tick_add_task(mouse_tick_task
);
994 int button_status(void)
999 void button_clear_queue(void)
1001 queue_clear(&button_queue
);