1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Felix Arends
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
23 #include "lcd-charcells.h"
24 #include "lcd-remote.h"
28 #include "backlight.h"
30 #include "sim_tasks.h"
31 #include "button-sdl.h"
35 #ifdef HAVE_TOUCHSCREEN
36 #include "touchscreen.h"
37 static int mouse_coords
= 0;
39 /* how long until repeat kicks in */
40 #define REPEAT_START 6
42 /* the speed repeat starts at */
43 #define REPEAT_INTERVAL_START 4
45 /* speed repeat finishes at */
46 #define REPEAT_INTERVAL_FINISH 2
48 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
49 int _remote_type
=REMOTETYPE_H100_LCD
;
57 struct event_queue button_queue
;
59 static int btn
= 0; /* Hopefully keeps track of currently pressed keys... */
62 static bool filter_first_keypress
;
64 void set_backlight_filter_keypress(bool value
)
66 filter_first_keypress
= value
;
68 #ifdef HAVE_REMOTE_LCD
69 static bool remote_filter_first_keypress
;
71 void set_remote_backlight_filter_keypress(bool value
)
73 remote_filter_first_keypress
= value
;
78 #ifdef HAS_BUTTON_HOLD
79 bool hold_button_state
= false;
80 bool button_hold(void) {
81 return hold_button_state
;
85 #ifdef HAS_REMOTE_BUTTON_HOLD
86 bool remote_hold_button_state
= false;
87 bool remote_button_hold(void) {
88 return remote_hold_button_state
;
92 void button_event(int key
, bool pressed
)
95 static bool usb_connected
= false;
96 if (usb_connected
&& key
!= SDLK_u
)
101 #ifdef HAVE_TOUCHSCREEN
102 case BUTTON_TOUCHSCREEN
:
103 switch (touchscreen_get_mode())
105 case TOUCHSCREEN_POINT
:
106 new_btn
= BUTTON_TOUCHSCREEN
;
108 case TOUCHSCREEN_BUTTON
:
110 static int touchscreen_buttons
[3][3] = {
111 {BUTTON_TOPLEFT
, BUTTON_TOPMIDDLE
, BUTTON_TOPRIGHT
},
112 {BUTTON_MIDLEFT
, BUTTON_CENTER
, BUTTON_MIDRIGHT
},
113 {BUTTON_BOTTOMLEFT
, BUTTON_BOTTOMMIDDLE
, BUTTON_BOTTOMRIGHT
},
115 int px_x
= ((mouse_coords
&0xffff0000)>>16);
116 int px_y
= ((mouse_coords
&0x0000ffff));
117 new_btn
= touchscreen_buttons
[px_y
/(LCD_HEIGHT
/3)][px_x
/(LCD_WIDTH
/3)];
123 new_btn
= BUTTON_TOPLEFT
;
126 new_btn
= BUTTON_TOPMIDDLE
;
129 new_btn
= BUTTON_TOPRIGHT
;
132 new_btn
= BUTTON_MIDLEFT
;
135 new_btn
= BUTTON_CENTER
;
138 new_btn
= BUTTON_MIDRIGHT
;
141 new_btn
= BUTTON_BOTTOMLEFT
;
144 new_btn
= BUTTON_BOTTOMMIDDLE
;
147 new_btn
= BUTTON_BOTTOMRIGHT
;
152 touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT
? TOUCHSCREEN_BUTTON
: TOUCHSCREEN_POINT
);
153 printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT
? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
161 usb_connected
= !usb_connected
;
163 queue_post(&button_queue
, SYS_USB_CONNECTED
, 0);
165 queue_post(&button_queue
, SYS_USB_DISCONNECTED
, 0);
169 #ifdef HAS_BUTTON_HOLD
173 hold_button_state
= !hold_button_state
;
174 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
179 #ifdef HAS_REMOTE_BUTTON_HOLD
183 remote_hold_button_state
= !remote_hold_button_state
;
184 DEBUGF("Remote hold button is %s\n",
185 remote_hold_button_state
?"ON":"OFF");
190 #if CONFIG_KEYPAD == GIGABEAT_PAD
193 new_btn
= BUTTON_LEFT
;
197 new_btn
= BUTTON_RIGHT
;
205 new_btn
= BUTTON_DOWN
;
209 new_btn
= BUTTON_POWER
;
212 new_btn
= BUTTON_POWER
;
221 new_btn
= BUTTON_SELECT
;
225 new_btn
= BUTTON_MENU
;
228 new_btn
= BUTTON_VOL_UP
;
231 new_btn
= BUTTON_VOL_DOWN
;
234 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
237 new_btn
= BUTTON_LEFT
;
241 new_btn
= BUTTON_RIGHT
;
249 new_btn
= BUTTON_DOWN
;
253 new_btn
= BUTTON_POWER
;
258 new_btn
= BUTTON_PLAY
;
261 new_btn
= BUTTON_BACK
;
265 new_btn
= BUTTON_SELECT
;
270 new_btn
= BUTTON_MENU
;
273 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
276 new_btn
= BUTTON_LEFT
;
280 new_btn
= BUTTON_RIGHT
;
288 new_btn
= BUTTON_DOWN
;
292 new_btn
= BUTTON_PLAY
;
295 new_btn
= BUTTON_POWER
;
300 new_btn
= BUTTON_POWER
;
304 new_btn
= BUTTON_REC
;
308 new_btn
= BUTTON_SELECT
;
311 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
314 new_btn
= BUTTON_LEFT
;
318 new_btn
= BUTTON_RIGHT
;
322 new_btn
= BUTTON_VOL_UP
;
326 new_btn
= BUTTON_VOL_DOWN
;
330 new_btn
= BUTTON_MODE
;
334 new_btn
= BUTTON_REC
;
338 new_btn
= BUTTON_PLAY
;
341 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
342 || (CONFIG_KEYPAD == IPOD_4G_PAD)
345 new_btn
= BUTTON_LEFT
;
349 new_btn
= BUTTON_RIGHT
;
353 new_btn
= BUTTON_SCROLL_BACK
;
357 new_btn
= BUTTON_SCROLL_FWD
;
361 new_btn
= BUTTON_PLAY
;
365 new_btn
= BUTTON_SELECT
;
369 new_btn
= BUTTON_MENU
;
372 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
375 new_btn
= BUTTON_LEFT
;
379 new_btn
= BUTTON_RIGHT
;
383 new_btn
= BUTTON_SCROLL_UP
;
387 new_btn
= BUTTON_SCROLL_DOWN
;
391 new_btn
= BUTTON_POWER
;
394 new_btn
= BUTTON_POWER
;
398 new_btn
= BUTTON_REW
;
400 case SDLK_KP_MULTIPLY
:
406 new_btn
= BUTTON_PLAY
;
409 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
414 case REMOTETYPE_UNPLUGGED
:
415 _remote_type
=REMOTETYPE_H100_LCD
;
416 DEBUGF("Changed remote type to H100\n");
418 case REMOTETYPE_H100_LCD
:
419 _remote_type
=REMOTETYPE_H300_LCD
;
420 DEBUGF("Changed remote type to H300\n");
422 case REMOTETYPE_H300_LCD
:
423 _remote_type
=REMOTETYPE_H300_NONLCD
;
424 DEBUGF("Changed remote type to H300 NON-LCD\n");
426 case REMOTETYPE_H300_NONLCD
:
427 _remote_type
=REMOTETYPE_UNPLUGGED
;
428 DEBUGF("Changed remote type to none\n");
434 new_btn
= BUTTON_LEFT
;
438 new_btn
= BUTTON_RIGHT
;
446 new_btn
= BUTTON_DOWN
;
455 new_btn
= BUTTON_OFF
;
459 new_btn
= BUTTON_REC
;
463 new_btn
= BUTTON_SELECT
;
467 new_btn
= BUTTON_MODE
;
470 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
473 new_btn
= BUTTON_LEFT
;
477 new_btn
= BUTTON_RIGHT
;
485 new_btn
= BUTTON_DOWN
;
489 new_btn
= BUTTON_PLAY
;
498 new_btn
= BUTTON_SELECT
;
502 new_btn
= BUTTON_MODE
;
505 #elif CONFIG_KEYPAD == ONDIO_PAD
508 new_btn
= BUTTON_LEFT
;
512 new_btn
= BUTTON_RIGHT
;
520 new_btn
= BUTTON_DOWN
;
525 new_btn
= BUTTON_OFF
;
529 new_btn
= BUTTON_MENU
;
532 #elif CONFIG_KEYPAD == PLAYER_PAD
535 new_btn
= BUTTON_LEFT
;
539 new_btn
= BUTTON_RIGHT
;
543 new_btn
= BUTTON_PLAY
;
547 new_btn
= BUTTON_STOP
;
555 new_btn
= BUTTON_MENU
;
558 #elif CONFIG_KEYPAD == RECORDER_PAD
561 new_btn
= BUTTON_LEFT
;
565 new_btn
= BUTTON_RIGHT
;
573 new_btn
= BUTTON_DOWN
;
582 new_btn
= BUTTON_OFF
;
588 case SDLK_KP_MULTIPLY
:
598 new_btn
= BUTTON_PLAY
;
601 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
604 new_btn
= BUTTON_LEFT
;
608 new_btn
= BUTTON_RIGHT
;
616 new_btn
= BUTTON_DOWN
;
625 new_btn
= BUTTON_OFF
;
631 case SDLK_KP_MULTIPLY
:
641 new_btn
= BUTTON_SELECT
;
644 #elif CONFIG_KEYPAD == SANSA_E200_PAD
647 new_btn
= BUTTON_LEFT
;
651 new_btn
= BUTTON_RIGHT
;
655 new_btn
= BUTTON_SCROLL_BACK
;
659 new_btn
= BUTTON_SCROLL_FWD
;
667 new_btn
= BUTTON_DOWN
;
671 new_btn
= BUTTON_POWER
;
675 new_btn
= BUTTON_REC
;
679 new_btn
= BUTTON_SELECT
;
682 #elif CONFIG_KEYPAD == SANSA_C200_PAD
685 new_btn
= BUTTON_LEFT
;
689 new_btn
= BUTTON_RIGHT
;
697 new_btn
= BUTTON_DOWN
;
700 new_btn
= BUTTON_POWER
;
703 new_btn
= BUTTON_REC
;
708 new_btn
= BUTTON_SELECT
;
711 new_btn
= BUTTON_VOL_DOWN
;
714 new_btn
= BUTTON_VOL_UP
;
717 #elif CONFIG_KEYPAD == MROBE500_PAD
719 new_btn
= BUTTON_RC_HEART
;
722 new_btn
= BUTTON_RC_MODE
;
725 new_btn
= BUTTON_RC_VOL_DOWN
;
728 new_btn
= BUTTON_RC_VOL_UP
;
731 new_btn
= BUTTON_LEFT
;
734 new_btn
= BUTTON_RIGHT
;
737 new_btn
= BUTTON_RC_PLAY
;
740 new_btn
= BUTTON_RC_DOWN
;
744 new_btn
= BUTTON_POWER
;
746 #elif CONFIG_KEYPAD == MROBE100_PAD
748 new_btn
= BUTTON_RC_HEART
;
751 new_btn
= BUTTON_RC_MODE
;
754 new_btn
= BUTTON_RC_VOL_DOWN
;
757 new_btn
= BUTTON_RC_VOL_UP
;
760 new_btn
= BUTTON_RC_FF
;
763 new_btn
= BUTTON_RC_REW
;
766 new_btn
= BUTTON_RC_PLAY
;
769 new_btn
= BUTTON_RC_DOWN
;
772 new_btn
= BUTTON_DISPLAY
;
775 new_btn
= BUTTON_MENU
;
778 new_btn
= BUTTON_PLAY
;
781 new_btn
= BUTTON_LEFT
;
784 new_btn
= BUTTON_RIGHT
;
790 new_btn
= BUTTON_DOWN
;
794 new_btn
= BUTTON_SELECT
;
796 case SDLK_KP_MULTIPLY
:
799 new_btn
= BUTTON_POWER
;
802 #elif CONFIG_KEYPAD == COWOND2_PAD
804 new_btn
= BUTTON_POWER
;
807 new_btn
= BUTTON_PLUS
;
810 new_btn
= BUTTON_MINUS
;
813 new_btn
= BUTTON_MENU
;
815 #elif CONFIG_KEYPAD == IAUDIO67_PAD
817 new_btn
= BUTTON_RIGHT
;
820 new_btn
= BUTTON_LEFT
;
823 new_btn
= BUTTON_STOP
;
828 new_btn
= BUTTON_PLAY
;
831 new_btn
= BUTTON_VOLUP
;
834 new_btn
= BUTTON_VOLDOWN
;
837 new_btn
= BUTTON_MENU
;
840 new_btn
= BUTTON_POWER
;
842 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
844 new_btn
= BUTTON_BACK
;
847 new_btn
= BUTTON_MENU
;
850 new_btn
= BUTTON_CUSTOM
;
853 new_btn
= BUTTON_PLAY
;
857 new_btn
= BUTTON_LEFT
;
861 new_btn
= BUTTON_RIGHT
;
869 new_btn
= BUTTON_DOWN
;
873 new_btn
= BUTTON_SELECT
;
875 case SDLK_KP_MULTIPLY
:
878 new_btn
= BUTTON_POWER
;
880 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
882 new_btn
= BUTTON_PREV
;
885 new_btn
= BUTTON_NEXT
;
888 new_btn
= BUTTON_BACK
;
891 new_btn
= BUTTON_PLAY
;
894 new_btn
= BUTTON_MENU
;
898 new_btn
= BUTTON_LEFT
;
902 new_btn
= BUTTON_RIGHT
;
910 new_btn
= BUTTON_DOWN
;
914 new_btn
= BUTTON_SELECT
;
916 case SDLK_KP_MULTIPLY
:
919 new_btn
= BUTTON_POWER
;
922 new_btn
= BUTTON_VOL_DOWN
;
925 new_btn
= BUTTON_VOL_UP
;
927 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
929 new_btn
= BUTTON_PREV
;
932 new_btn
= BUTTON_NEXT
;
937 new_btn
= BUTTON_PLAY
;
941 new_btn
= BUTTON_MENU
;
949 new_btn
= BUTTON_DOWN
;
953 new_btn
= BUTTON_SELECT
;
955 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
958 new_btn
= BUTTON_LEFT
;
962 new_btn
= BUTTON_RIGHT
;
966 new_btn
= BUTTON_SCROLL_BACK
;
970 new_btn
= BUTTON_SCROLL_FWD
;
978 new_btn
= BUTTON_DOWN
;
982 new_btn
= BUTTON_POWER
;
984 case SDLK_KP_MULTIPLY
:
985 new_btn
= BUTTON_HOME
;
991 new_btn
= BUTTON_SELECT
;
993 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
996 new_btn
= BUTTON_LEFT
;
1000 new_btn
= BUTTON_RIGHT
;
1004 new_btn
= BUTTON_UP
;
1008 new_btn
= BUTTON_DOWN
;
1012 case SDLK_KP_MULTIPLY
:
1013 new_btn
= BUTTON_HOME
;
1017 new_btn
= BUTTON_SELECT
;
1021 new_btn
= BUTTON_VOL_DOWN
;
1025 new_btn
= BUTTON_VOL_UP
;
1029 new_btn
= BUTTON_POWER
;
1031 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1034 new_btn
= BUTTON_LEFT
;
1038 new_btn
= BUTTON_RIGHT
;
1042 new_btn
= BUTTON_UP
;
1046 new_btn
= BUTTON_DOWN
;
1049 new_btn
= BUTTON_POWER
;
1052 new_btn
= BUTTON_SELECT
;
1055 new_btn
= BUTTON_VOL_DOWN
;
1058 new_btn
= BUTTON_VOL_UP
;
1060 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1063 new_btn
= BUTTON_LEFT
;
1067 new_btn
= BUTTON_RIGHT
;
1071 new_btn
= BUTTON_UP
;
1075 new_btn
= BUTTON_DOWN
;
1079 new_btn
= BUTTON_PLAY
;
1082 new_btn
= BUTTON_PREV
;
1085 new_btn
= BUTTON_NEXT
;
1089 new_btn
= BUTTON_POWER
;
1092 new_btn
= BUTTON_VOL_UP
;
1095 new_btn
= BUTTON_VOL_DOWN
;
1097 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1100 new_btn
= BUTTON_LEFT
;
1104 new_btn
= BUTTON_RIGHT
;
1108 new_btn
= BUTTON_UP
;
1112 new_btn
= BUTTON_DOWN
;
1116 new_btn
= BUTTON_SELECT
;
1120 new_btn
= BUTTON_POWER
;
1123 new_btn
= BUTTON_PLAYLIST
;
1126 new_btn
= BUTTON_VOL_UP
;
1129 new_btn
= BUTTON_VOL_DOWN
;
1132 new_btn
= BUTTON_MENU
;
1135 new_btn
= BUTTON_VIEW
;
1137 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1139 new_btn
= BUTTON_POWER
;
1143 new_btn
= BUTTON_VOL_UP
;
1147 new_btn
= BUTTON_VOL_DOWN
;
1151 new_btn
= BUTTON_MENU
;
1153 #elif CONFIG_KEYPAD == ONDAVX777_PAD
1155 new_btn
= BUTTON_POWER
;
1157 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1160 new_btn
= BUTTON_LEFT
;
1164 new_btn
= BUTTON_RIGHT
;
1168 new_btn
= BUTTON_UP
;
1172 new_btn
= BUTTON_DOWN
;
1176 new_btn
= BUTTON_PLAY
;
1180 new_btn
= BUTTON_FFWD
;
1182 #ifdef SAMSUNG_YH820
1188 new_btn
= BUTTON_REW
;
1191 new_btn
= BUTTON_REC
;
1194 #error No keymap defined!
1195 #endif /* CONFIG_KEYPAD */
1200 sim_trigger_screendump();
1211 #ifdef HAVE_BUTTON_DATA
1212 int button_read_device(int* data
)
1216 int button_read_device(void)
1220 #ifdef HAS_BUTTON_HOLD
1221 int hold_button
= button_hold();
1223 #ifdef HAVE_BACKLIGHT
1224 /* light handling */
1225 static int hold_button_old
= false;
1226 if (hold_button
!= hold_button_old
)
1228 hold_button_old
= hold_button
;
1229 backlight_hold_changed(hold_button
);
1241 #ifdef HAVE_TOUCHSCREEN
1242 extern bool debug_wps
;
1243 void mouse_tick_task(void)
1245 static int last_check
= 0;
1247 if (TIME_BEFORE(current_tick
, last_check
+(HZ
/10)))
1249 last_check
= current_tick
;
1250 if (SDL_GetMouseState(&x
, &y
) & SDL_BUTTON(SDL_BUTTON_LEFT
))
1257 if(x
<0 || y
<0 || x
>SIM_LCD_WIDTH
|| y
>SIM_LCD_HEIGHT
)
1261 mouse_coords
= (x
<<16)|y
;
1262 button_event(BUTTON_TOUCHSCREEN
, true);
1264 printf("Mouse at: (%d, %d)\n", x
, y
);
1270 intptr_t button_get_data_sdl(void)
1272 #ifdef HAVE_TOUCHSCREEN
1273 /* pass the mouse coordinates to the button driver */
1274 return mouse_coords
;
1276 /* pass scrollwheel acceleration to the button driver */
1281 void button_init_sdl(void)
1283 #ifdef HAVE_TOUCHSCREEN
1284 tick_add_task(mouse_tick_task
);