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"
32 #include "backlight.h"
36 #ifdef HAVE_TOUCHSCREEN
37 #include "touchscreen.h"
38 static int mouse_coords
= 0;
40 /* how long until repeat kicks in */
41 #define REPEAT_START 6
43 /* the speed repeat starts at */
44 #define REPEAT_INTERVAL_START 4
46 /* speed repeat finishes at */
47 #define REPEAT_INTERVAL_FINISH 2
49 #ifdef HAVE_TOUCHSCREEN
50 #define USB_KEY SDLK_c /* SDLK_u is taken by BUTTON_MIDLEFT */
52 #define USB_KEY SDLK_u
55 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
56 int _remote_type
=REMOTETYPE_H100_LCD
;
64 struct event_queue button_queue
;
66 static int btn
= 0; /* Hopefully keeps track of currently pressed keys... */
68 #ifdef HAS_BUTTON_HOLD
69 bool hold_button_state
= false;
70 bool button_hold(void) {
71 return hold_button_state
;
75 #ifdef HAS_REMOTE_BUTTON_HOLD
76 bool remote_hold_button_state
= false;
77 bool remote_button_hold(void) {
78 return remote_hold_button_state
;
82 void button_event(int key
, bool pressed
)
85 static bool usb_connected
= false;
86 if (usb_connected
&& key
!= USB_KEY
)
91 #ifdef HAVE_TOUCHSCREEN
92 case BUTTON_TOUCHSCREEN
:
93 switch (touchscreen_get_mode())
95 case TOUCHSCREEN_POINT
:
96 new_btn
= BUTTON_TOUCHSCREEN
;
98 case TOUCHSCREEN_BUTTON
:
100 static int touchscreen_buttons
[3][3] = {
101 {BUTTON_TOPLEFT
, BUTTON_TOPMIDDLE
, BUTTON_TOPRIGHT
},
102 {BUTTON_MIDLEFT
, BUTTON_CENTER
, BUTTON_MIDRIGHT
},
103 {BUTTON_BOTTOMLEFT
, BUTTON_BOTTOMMIDDLE
, BUTTON_BOTTOMRIGHT
},
105 int px_x
= ((mouse_coords
&0xffff0000)>>16);
106 int px_y
= ((mouse_coords
&0x0000ffff));
107 new_btn
= touchscreen_buttons
[px_y
/(LCD_HEIGHT
/3)][px_x
/(LCD_WIDTH
/3)];
114 new_btn
= BUTTON_TOPLEFT
;
119 new_btn
= BUTTON_TOPMIDDLE
;
123 new_btn
= BUTTON_TOPRIGHT
;
128 new_btn
= BUTTON_MIDLEFT
;
132 new_btn
= BUTTON_CENTER
;
137 new_btn
= BUTTON_MIDRIGHT
;
141 new_btn
= BUTTON_BOTTOMLEFT
;
146 new_btn
= BUTTON_BOTTOMMIDDLE
;
150 new_btn
= BUTTON_BOTTOMRIGHT
;
155 touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT
? TOUCHSCREEN_BUTTON
: TOUCHSCREEN_POINT
);
156 printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT
? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
164 usb_connected
= !usb_connected
;
166 queue_post(&button_queue
, SYS_USB_CONNECTED
, 0);
168 queue_post(&button_queue
, SYS_USB_DISCONNECTED
, 0);
172 #ifdef HAS_BUTTON_HOLD
176 hold_button_state
= !hold_button_state
;
177 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
182 #ifdef HAS_REMOTE_BUTTON_HOLD
186 remote_hold_button_state
= !remote_hold_button_state
;
187 DEBUGF("Remote hold button is %s\n",
188 remote_hold_button_state
?"ON":"OFF");
193 #if CONFIG_KEYPAD == GIGABEAT_PAD
196 new_btn
= BUTTON_LEFT
;
200 new_btn
= BUTTON_RIGHT
;
208 new_btn
= BUTTON_DOWN
;
212 new_btn
= BUTTON_POWER
;
215 new_btn
= BUTTON_POWER
;
224 new_btn
= BUTTON_SELECT
;
228 new_btn
= BUTTON_MENU
;
231 new_btn
= BUTTON_VOL_UP
;
234 new_btn
= BUTTON_VOL_DOWN
;
237 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
240 new_btn
= BUTTON_LEFT
;
244 new_btn
= BUTTON_RIGHT
;
252 new_btn
= BUTTON_DOWN
;
256 new_btn
= BUTTON_POWER
;
261 new_btn
= BUTTON_PLAY
;
264 new_btn
= BUTTON_BACK
;
268 new_btn
= BUTTON_SELECT
;
273 new_btn
= BUTTON_MENU
;
276 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
279 new_btn
= BUTTON_LEFT
;
283 new_btn
= BUTTON_RIGHT
;
291 new_btn
= BUTTON_DOWN
;
295 new_btn
= BUTTON_PLAY
;
298 new_btn
= BUTTON_POWER
;
303 new_btn
= BUTTON_POWER
;
307 new_btn
= BUTTON_REC
;
311 new_btn
= BUTTON_SELECT
;
314 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
317 new_btn
= BUTTON_LEFT
;
321 new_btn
= BUTTON_RIGHT
;
325 new_btn
= BUTTON_VOL_UP
;
329 new_btn
= BUTTON_VOL_DOWN
;
333 new_btn
= BUTTON_MODE
;
337 new_btn
= BUTTON_REC
;
341 new_btn
= BUTTON_PLAY
;
344 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
345 || (CONFIG_KEYPAD == IPOD_4G_PAD)
348 new_btn
= BUTTON_LEFT
;
352 new_btn
= BUTTON_RIGHT
;
356 new_btn
= BUTTON_SCROLL_BACK
;
360 new_btn
= BUTTON_SCROLL_FWD
;
364 new_btn
= BUTTON_PLAY
;
368 new_btn
= BUTTON_SELECT
;
372 new_btn
= BUTTON_MENU
;
375 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
378 new_btn
= BUTTON_LEFT
;
382 new_btn
= BUTTON_RIGHT
;
386 new_btn
= BUTTON_SCROLL_UP
;
390 new_btn
= BUTTON_SCROLL_DOWN
;
394 new_btn
= BUTTON_POWER
;
397 new_btn
= BUTTON_POWER
;
401 new_btn
= BUTTON_REW
;
403 case SDLK_KP_MULTIPLY
:
409 new_btn
= BUTTON_PLAY
;
412 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
417 case REMOTETYPE_UNPLUGGED
:
418 _remote_type
=REMOTETYPE_H100_LCD
;
419 DEBUGF("Changed remote type to H100\n");
421 case REMOTETYPE_H100_LCD
:
422 _remote_type
=REMOTETYPE_H300_LCD
;
423 DEBUGF("Changed remote type to H300\n");
425 case REMOTETYPE_H300_LCD
:
426 _remote_type
=REMOTETYPE_H300_NONLCD
;
427 DEBUGF("Changed remote type to H300 NON-LCD\n");
429 case REMOTETYPE_H300_NONLCD
:
430 _remote_type
=REMOTETYPE_UNPLUGGED
;
431 DEBUGF("Changed remote type to none\n");
437 new_btn
= BUTTON_LEFT
;
441 new_btn
= BUTTON_RIGHT
;
449 new_btn
= BUTTON_DOWN
;
458 new_btn
= BUTTON_OFF
;
462 new_btn
= BUTTON_REC
;
466 new_btn
= BUTTON_SELECT
;
470 new_btn
= BUTTON_MODE
;
473 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
476 new_btn
= BUTTON_LEFT
;
480 new_btn
= BUTTON_RIGHT
;
488 new_btn
= BUTTON_DOWN
;
492 new_btn
= BUTTON_PLAY
;
501 new_btn
= BUTTON_SELECT
;
505 new_btn
= BUTTON_MODE
;
508 #elif CONFIG_KEYPAD == ONDIO_PAD
511 new_btn
= BUTTON_LEFT
;
515 new_btn
= BUTTON_RIGHT
;
523 new_btn
= BUTTON_DOWN
;
528 new_btn
= BUTTON_OFF
;
532 new_btn
= BUTTON_MENU
;
535 #elif CONFIG_KEYPAD == PLAYER_PAD
538 new_btn
= BUTTON_LEFT
;
542 new_btn
= BUTTON_RIGHT
;
546 new_btn
= BUTTON_PLAY
;
550 new_btn
= BUTTON_STOP
;
558 new_btn
= BUTTON_MENU
;
561 #elif CONFIG_KEYPAD == RECORDER_PAD
564 new_btn
= BUTTON_LEFT
;
568 new_btn
= BUTTON_RIGHT
;
576 new_btn
= BUTTON_DOWN
;
585 new_btn
= BUTTON_OFF
;
591 case SDLK_KP_MULTIPLY
:
601 new_btn
= BUTTON_PLAY
;
604 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
607 new_btn
= BUTTON_LEFT
;
611 new_btn
= BUTTON_RIGHT
;
619 new_btn
= BUTTON_DOWN
;
628 new_btn
= BUTTON_OFF
;
634 case SDLK_KP_MULTIPLY
:
644 new_btn
= BUTTON_SELECT
;
647 #elif CONFIG_KEYPAD == SANSA_E200_PAD
650 new_btn
= BUTTON_LEFT
;
654 new_btn
= BUTTON_RIGHT
;
658 new_btn
= BUTTON_SCROLL_BACK
;
662 new_btn
= BUTTON_SCROLL_FWD
;
670 new_btn
= BUTTON_DOWN
;
674 new_btn
= BUTTON_POWER
;
678 new_btn
= BUTTON_REC
;
682 new_btn
= BUTTON_SELECT
;
685 #elif CONFIG_KEYPAD == SANSA_C200_PAD
688 new_btn
= BUTTON_LEFT
;
692 new_btn
= BUTTON_RIGHT
;
700 new_btn
= BUTTON_DOWN
;
703 new_btn
= BUTTON_POWER
;
706 new_btn
= BUTTON_REC
;
711 new_btn
= BUTTON_SELECT
;
714 new_btn
= BUTTON_VOL_DOWN
;
717 new_btn
= BUTTON_VOL_UP
;
720 #elif CONFIG_KEYPAD == MROBE500_PAD
722 new_btn
= BUTTON_RC_HEART
;
725 new_btn
= BUTTON_RC_MODE
;
728 new_btn
= BUTTON_RC_VOL_DOWN
;
731 new_btn
= BUTTON_RC_VOL_UP
;
735 case SDLK_LEFTBRACKET
:
737 new_btn
= BUTTON_LEFT
;
741 case SDLK_RIGHTBRACKET
:
742 case SDLK_KP_MULTIPLY
:
743 new_btn
= BUTTON_RIGHT
;
746 new_btn
= BUTTON_RC_PLAY
;
749 new_btn
= BUTTON_RC_DOWN
;
753 new_btn
= BUTTON_POWER
;
755 #elif CONFIG_KEYPAD == MROBE100_PAD
757 new_btn
= BUTTON_RC_HEART
;
760 new_btn
= BUTTON_RC_MODE
;
763 new_btn
= BUTTON_RC_VOL_DOWN
;
766 new_btn
= BUTTON_RC_VOL_UP
;
769 new_btn
= BUTTON_RC_FF
;
772 new_btn
= BUTTON_RC_REW
;
775 new_btn
= BUTTON_RC_PLAY
;
778 new_btn
= BUTTON_RC_DOWN
;
781 new_btn
= BUTTON_DISPLAY
;
784 new_btn
= BUTTON_MENU
;
787 new_btn
= BUTTON_PLAY
;
790 new_btn
= BUTTON_LEFT
;
793 new_btn
= BUTTON_RIGHT
;
799 new_btn
= BUTTON_DOWN
;
803 new_btn
= BUTTON_SELECT
;
805 case SDLK_KP_MULTIPLY
:
808 new_btn
= BUTTON_POWER
;
811 #elif CONFIG_KEYPAD == COWON_D2_PAD
812 case SDLK_KP_MULTIPLY
:
817 new_btn
= BUTTON_POWER
;
821 new_btn
= BUTTON_PLUS
;
825 new_btn
= BUTTON_MINUS
;
831 new_btn
= BUTTON_MENU
;
833 #elif CONFIG_KEYPAD == IAUDIO67_PAD
835 new_btn
= BUTTON_RIGHT
;
838 new_btn
= BUTTON_LEFT
;
841 new_btn
= BUTTON_STOP
;
846 new_btn
= BUTTON_PLAY
;
849 new_btn
= BUTTON_VOLUP
;
852 new_btn
= BUTTON_VOLDOWN
;
855 new_btn
= BUTTON_MENU
;
858 new_btn
= BUTTON_POWER
;
860 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
862 new_btn
= BUTTON_BACK
;
865 new_btn
= BUTTON_MENU
;
868 new_btn
= BUTTON_CUSTOM
;
871 new_btn
= BUTTON_PLAY
;
875 new_btn
= BUTTON_LEFT
;
879 new_btn
= BUTTON_RIGHT
;
887 new_btn
= BUTTON_DOWN
;
891 new_btn
= BUTTON_SELECT
;
893 case SDLK_KP_MULTIPLY
:
896 new_btn
= BUTTON_POWER
;
898 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
900 new_btn
= BUTTON_PREV
;
903 new_btn
= BUTTON_NEXT
;
906 new_btn
= BUTTON_BACK
;
909 new_btn
= BUTTON_PLAY
;
912 new_btn
= BUTTON_MENU
;
916 new_btn
= BUTTON_LEFT
;
920 new_btn
= BUTTON_RIGHT
;
928 new_btn
= BUTTON_DOWN
;
932 new_btn
= BUTTON_SELECT
;
934 case SDLK_KP_MULTIPLY
:
937 new_btn
= BUTTON_POWER
;
940 new_btn
= BUTTON_VOL_DOWN
;
943 new_btn
= BUTTON_VOL_UP
;
945 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
947 new_btn
= BUTTON_PREV
;
950 new_btn
= BUTTON_NEXT
;
955 new_btn
= BUTTON_PLAY
;
959 new_btn
= BUTTON_MENU
;
967 new_btn
= BUTTON_DOWN
;
971 new_btn
= BUTTON_SELECT
;
973 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
976 new_btn
= BUTTON_LEFT
;
980 new_btn
= BUTTON_RIGHT
;
984 new_btn
= BUTTON_SCROLL_BACK
;
988 new_btn
= BUTTON_SCROLL_FWD
;
996 new_btn
= BUTTON_DOWN
;
1000 new_btn
= BUTTON_POWER
;
1002 case SDLK_KP_MULTIPLY
:
1003 new_btn
= BUTTON_HOME
;
1009 new_btn
= BUTTON_SELECT
;
1011 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
1014 new_btn
= BUTTON_LEFT
;
1018 new_btn
= BUTTON_RIGHT
;
1022 new_btn
= BUTTON_UP
;
1026 new_btn
= BUTTON_DOWN
;
1030 case SDLK_KP_MULTIPLY
:
1031 new_btn
= BUTTON_HOME
;
1035 new_btn
= BUTTON_SELECT
;
1039 new_btn
= BUTTON_VOL_DOWN
;
1043 new_btn
= BUTTON_VOL_UP
;
1047 new_btn
= BUTTON_POWER
;
1049 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1052 new_btn
= BUTTON_LEFT
;
1056 new_btn
= BUTTON_RIGHT
;
1060 new_btn
= BUTTON_UP
;
1064 new_btn
= BUTTON_DOWN
;
1067 new_btn
= BUTTON_POWER
;
1070 new_btn
= BUTTON_SELECT
;
1073 new_btn
= BUTTON_VOL_DOWN
;
1076 new_btn
= BUTTON_VOL_UP
;
1078 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1081 new_btn
= BUTTON_LEFT
;
1085 new_btn
= BUTTON_RIGHT
;
1089 new_btn
= BUTTON_UP
;
1093 new_btn
= BUTTON_DOWN
;
1097 new_btn
= BUTTON_PLAY
;
1100 new_btn
= BUTTON_PREV
;
1103 new_btn
= BUTTON_NEXT
;
1107 new_btn
= BUTTON_POWER
;
1110 new_btn
= BUTTON_VOL_UP
;
1113 new_btn
= BUTTON_VOL_DOWN
;
1115 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1118 new_btn
= BUTTON_LEFT
;
1122 new_btn
= BUTTON_RIGHT
;
1126 new_btn
= BUTTON_UP
;
1130 new_btn
= BUTTON_DOWN
;
1134 new_btn
= BUTTON_SELECT
;
1138 new_btn
= BUTTON_POWER
;
1141 new_btn
= BUTTON_PLAYLIST
;
1144 new_btn
= BUTTON_VOL_UP
;
1147 new_btn
= BUTTON_VOL_DOWN
;
1150 new_btn
= BUTTON_MENU
;
1153 new_btn
= BUTTON_VIEW
;
1155 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1157 new_btn
= BUTTON_POWER
;
1162 case SDLK_RIGHTBRACKET
:
1163 case SDLK_KP_MULTIPLY
:
1164 new_btn
= BUTTON_VOL_UP
;
1169 case SDLK_LEFTBRACKET
:
1170 case SDLK_KP_DIVIDE
:
1171 new_btn
= BUTTON_VOL_DOWN
;
1175 new_btn
= BUTTON_MENU
;
1177 #elif CONFIG_KEYPAD == ONDAVX777_PAD
1179 new_btn
= BUTTON_POWER
;
1181 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1184 new_btn
= BUTTON_LEFT
;
1188 new_btn
= BUTTON_RIGHT
;
1192 new_btn
= BUTTON_UP
;
1196 new_btn
= BUTTON_DOWN
;
1200 new_btn
= BUTTON_PLAY
;
1204 new_btn
= BUTTON_FFWD
;
1206 #ifdef SAMSUNG_YH820
1212 new_btn
= BUTTON_REW
;
1215 new_btn
= BUTTON_REC
;
1217 #elif CONFIG_KEYPAD == MINI2440_PAD
1219 new_btn
= BUTTON_LEFT
;
1222 new_btn
= BUTTON_RIGHT
;
1225 new_btn
= BUTTON_UP
;
1228 new_btn
= BUTTON_DOWN
;
1232 new_btn
= BUTTON_POWER
;
1240 new_btn
= BUTTON_SELECT
;
1242 case SDLK_KP_PERIOD
:
1244 new_btn
= BUTTON_MENU
;
1247 new_btn
= BUTTON_VOL_UP
;
1250 new_btn
= BUTTON_VOL_DOWN
;
1253 #error No keymap defined!
1254 #endif /* CONFIG_KEYPAD */
1259 sim_trigger_screendump();
1265 /* Call to make up for scrollwheel target implementation. This is
1266 * not handled in the main button.c driver, but on the target
1267 * implementation (look at button-e200.c for example if you are trying to
1268 * figure out why using button_get_data needed a hack before).
1270 #if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK)
1271 if((new_btn
== BUTTON_SCROLL_FWD
|| new_btn
== BUTTON_SCROLL_BACK
) &&
1274 /* Clear these buttons from the data - adding them to the queue is
1275 * handled in the scrollwheel drivers for the targets. They do not
1276 * store the scroll forward/back buttons in their button data for
1277 * the button_read call.
1279 #ifdef HAVE_BACKLIGHT
1282 #ifdef HAVE_BUTTON_LIGHT
1285 queue_post(&button_queue
, new_btn
, 1<<24);
1286 new_btn
&= ~(BUTTON_SCROLL_FWD
| BUTTON_SCROLL_BACK
);
1295 #if defined(HAVE_BUTTON_DATA) && defined(HAVE_TOUCHSCREEN)
1296 int button_read_device(int* data
)
1298 *data
= mouse_coords
;
1300 int button_read_device(void)
1304 #ifdef HAS_BUTTON_HOLD
1305 int hold_button
= button_hold();
1307 #ifdef HAVE_BACKLIGHT
1308 /* light handling */
1309 static int hold_button_old
= false;
1310 if (hold_button
!= hold_button_old
)
1312 hold_button_old
= hold_button
;
1313 backlight_hold_changed(hold_button
);
1325 #ifdef HAVE_TOUCHSCREEN
1326 extern bool debug_wps
;
1327 void mouse_tick_task(void)
1329 static int last_check
= 0;
1331 if (TIME_BEFORE(current_tick
, last_check
+(HZ
/10)))
1333 last_check
= current_tick
;
1334 if (SDL_GetMouseState(&x
, &y
) & SDL_BUTTON(SDL_BUTTON_LEFT
))
1341 if(x
<0 || y
<0 || x
>SIM_LCD_WIDTH
|| y
>SIM_LCD_HEIGHT
)
1345 mouse_coords
= (x
<<16)|y
;
1346 button_event(BUTTON_TOUCHSCREEN
, true);
1348 printf("Mouse at: (%d, %d)\n", x
, y
);
1353 void button_init_sdl(void)
1355 #ifdef HAVE_TOUCHSCREEN
1356 tick_add_task(mouse_tick_task
);