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... */
61 #ifdef HAS_BUTTON_HOLD
62 bool hold_button_state
= false;
63 bool button_hold(void) {
64 return hold_button_state
;
68 #ifdef HAS_REMOTE_BUTTON_HOLD
69 bool remote_hold_button_state
= false;
70 bool remote_button_hold(void) {
71 return remote_hold_button_state
;
75 void button_event(int key
, bool pressed
)
78 static bool usb_connected
= false;
79 if (usb_connected
&& key
!= SDLK_u
)
84 #ifdef HAVE_TOUCHSCREEN
85 case BUTTON_TOUCHSCREEN
:
86 switch (touchscreen_get_mode())
88 case TOUCHSCREEN_POINT
:
89 new_btn
= BUTTON_TOUCHSCREEN
;
91 case TOUCHSCREEN_BUTTON
:
93 static int touchscreen_buttons
[3][3] = {
94 {BUTTON_TOPLEFT
, BUTTON_TOPMIDDLE
, BUTTON_TOPRIGHT
},
95 {BUTTON_MIDLEFT
, BUTTON_CENTER
, BUTTON_MIDRIGHT
},
96 {BUTTON_BOTTOMLEFT
, BUTTON_BOTTOMMIDDLE
, BUTTON_BOTTOMRIGHT
},
98 int px_x
= ((mouse_coords
&0xffff0000)>>16);
99 int px_y
= ((mouse_coords
&0x0000ffff));
100 new_btn
= touchscreen_buttons
[px_y
/(LCD_HEIGHT
/3)][px_x
/(LCD_WIDTH
/3)];
106 new_btn
= BUTTON_TOPLEFT
;
109 new_btn
= BUTTON_TOPMIDDLE
;
112 new_btn
= BUTTON_TOPRIGHT
;
115 new_btn
= BUTTON_MIDLEFT
;
118 new_btn
= BUTTON_CENTER
;
121 new_btn
= BUTTON_MIDRIGHT
;
124 new_btn
= BUTTON_BOTTOMLEFT
;
127 new_btn
= BUTTON_BOTTOMMIDDLE
;
130 new_btn
= BUTTON_BOTTOMRIGHT
;
135 touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT
? TOUCHSCREEN_BUTTON
: TOUCHSCREEN_POINT
);
136 printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT
? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
144 usb_connected
= !usb_connected
;
146 queue_post(&button_queue
, SYS_USB_CONNECTED
, 0);
148 queue_post(&button_queue
, SYS_USB_DISCONNECTED
, 0);
152 #ifdef HAS_BUTTON_HOLD
156 hold_button_state
= !hold_button_state
;
157 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
162 #ifdef HAS_REMOTE_BUTTON_HOLD
166 remote_hold_button_state
= !remote_hold_button_state
;
167 DEBUGF("Remote hold button is %s\n",
168 remote_hold_button_state
?"ON":"OFF");
173 #if CONFIG_KEYPAD == GIGABEAT_PAD
176 new_btn
= BUTTON_LEFT
;
180 new_btn
= BUTTON_RIGHT
;
188 new_btn
= BUTTON_DOWN
;
192 new_btn
= BUTTON_POWER
;
195 new_btn
= BUTTON_POWER
;
204 new_btn
= BUTTON_SELECT
;
208 new_btn
= BUTTON_MENU
;
211 new_btn
= BUTTON_VOL_UP
;
214 new_btn
= BUTTON_VOL_DOWN
;
217 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
220 new_btn
= BUTTON_LEFT
;
224 new_btn
= BUTTON_RIGHT
;
232 new_btn
= BUTTON_DOWN
;
236 new_btn
= BUTTON_POWER
;
241 new_btn
= BUTTON_PLAY
;
244 new_btn
= BUTTON_BACK
;
248 new_btn
= BUTTON_SELECT
;
253 new_btn
= BUTTON_MENU
;
256 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
259 new_btn
= BUTTON_LEFT
;
263 new_btn
= BUTTON_RIGHT
;
271 new_btn
= BUTTON_DOWN
;
275 new_btn
= BUTTON_PLAY
;
278 new_btn
= BUTTON_POWER
;
283 new_btn
= BUTTON_POWER
;
287 new_btn
= BUTTON_REC
;
291 new_btn
= BUTTON_SELECT
;
294 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
297 new_btn
= BUTTON_LEFT
;
301 new_btn
= BUTTON_RIGHT
;
305 new_btn
= BUTTON_VOL_UP
;
309 new_btn
= BUTTON_VOL_DOWN
;
313 new_btn
= BUTTON_MODE
;
317 new_btn
= BUTTON_REC
;
321 new_btn
= BUTTON_PLAY
;
324 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
325 || (CONFIG_KEYPAD == IPOD_4G_PAD)
328 new_btn
= BUTTON_LEFT
;
332 new_btn
= BUTTON_RIGHT
;
336 new_btn
= BUTTON_SCROLL_BACK
;
340 new_btn
= BUTTON_SCROLL_FWD
;
344 new_btn
= BUTTON_PLAY
;
348 new_btn
= BUTTON_SELECT
;
352 new_btn
= BUTTON_MENU
;
355 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
358 new_btn
= BUTTON_LEFT
;
362 new_btn
= BUTTON_RIGHT
;
366 new_btn
= BUTTON_SCROLL_UP
;
370 new_btn
= BUTTON_SCROLL_DOWN
;
374 new_btn
= BUTTON_POWER
;
377 new_btn
= BUTTON_POWER
;
381 new_btn
= BUTTON_REW
;
383 case SDLK_KP_MULTIPLY
:
389 new_btn
= BUTTON_PLAY
;
392 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
397 case REMOTETYPE_UNPLUGGED
:
398 _remote_type
=REMOTETYPE_H100_LCD
;
399 DEBUGF("Changed remote type to H100\n");
401 case REMOTETYPE_H100_LCD
:
402 _remote_type
=REMOTETYPE_H300_LCD
;
403 DEBUGF("Changed remote type to H300\n");
405 case REMOTETYPE_H300_LCD
:
406 _remote_type
=REMOTETYPE_H300_NONLCD
;
407 DEBUGF("Changed remote type to H300 NON-LCD\n");
409 case REMOTETYPE_H300_NONLCD
:
410 _remote_type
=REMOTETYPE_UNPLUGGED
;
411 DEBUGF("Changed remote type to none\n");
417 new_btn
= BUTTON_LEFT
;
421 new_btn
= BUTTON_RIGHT
;
429 new_btn
= BUTTON_DOWN
;
438 new_btn
= BUTTON_OFF
;
442 new_btn
= BUTTON_REC
;
446 new_btn
= BUTTON_SELECT
;
450 new_btn
= BUTTON_MODE
;
453 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
456 new_btn
= BUTTON_LEFT
;
460 new_btn
= BUTTON_RIGHT
;
468 new_btn
= BUTTON_DOWN
;
472 new_btn
= BUTTON_PLAY
;
481 new_btn
= BUTTON_SELECT
;
485 new_btn
= BUTTON_MODE
;
488 #elif CONFIG_KEYPAD == ONDIO_PAD
491 new_btn
= BUTTON_LEFT
;
495 new_btn
= BUTTON_RIGHT
;
503 new_btn
= BUTTON_DOWN
;
508 new_btn
= BUTTON_OFF
;
512 new_btn
= BUTTON_MENU
;
515 #elif CONFIG_KEYPAD == PLAYER_PAD
518 new_btn
= BUTTON_LEFT
;
522 new_btn
= BUTTON_RIGHT
;
526 new_btn
= BUTTON_PLAY
;
530 new_btn
= BUTTON_STOP
;
538 new_btn
= BUTTON_MENU
;
541 #elif CONFIG_KEYPAD == RECORDER_PAD
544 new_btn
= BUTTON_LEFT
;
548 new_btn
= BUTTON_RIGHT
;
556 new_btn
= BUTTON_DOWN
;
565 new_btn
= BUTTON_OFF
;
571 case SDLK_KP_MULTIPLY
:
581 new_btn
= BUTTON_PLAY
;
584 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
587 new_btn
= BUTTON_LEFT
;
591 new_btn
= BUTTON_RIGHT
;
599 new_btn
= BUTTON_DOWN
;
608 new_btn
= BUTTON_OFF
;
614 case SDLK_KP_MULTIPLY
:
624 new_btn
= BUTTON_SELECT
;
627 #elif CONFIG_KEYPAD == SANSA_E200_PAD
630 new_btn
= BUTTON_LEFT
;
634 new_btn
= BUTTON_RIGHT
;
638 new_btn
= BUTTON_SCROLL_BACK
;
642 new_btn
= BUTTON_SCROLL_FWD
;
650 new_btn
= BUTTON_DOWN
;
654 new_btn
= BUTTON_POWER
;
658 new_btn
= BUTTON_REC
;
662 new_btn
= BUTTON_SELECT
;
665 #elif CONFIG_KEYPAD == SANSA_C200_PAD
668 new_btn
= BUTTON_LEFT
;
672 new_btn
= BUTTON_RIGHT
;
680 new_btn
= BUTTON_DOWN
;
683 new_btn
= BUTTON_POWER
;
686 new_btn
= BUTTON_REC
;
691 new_btn
= BUTTON_SELECT
;
694 new_btn
= BUTTON_VOL_DOWN
;
697 new_btn
= BUTTON_VOL_UP
;
700 #elif CONFIG_KEYPAD == MROBE500_PAD
702 new_btn
= BUTTON_RC_HEART
;
705 new_btn
= BUTTON_RC_MODE
;
708 new_btn
= BUTTON_RC_VOL_DOWN
;
711 new_btn
= BUTTON_RC_VOL_UP
;
714 new_btn
= BUTTON_LEFT
;
717 new_btn
= BUTTON_RIGHT
;
720 new_btn
= BUTTON_RC_PLAY
;
723 new_btn
= BUTTON_RC_DOWN
;
727 new_btn
= BUTTON_POWER
;
729 #elif CONFIG_KEYPAD == MROBE100_PAD
731 new_btn
= BUTTON_RC_HEART
;
734 new_btn
= BUTTON_RC_MODE
;
737 new_btn
= BUTTON_RC_VOL_DOWN
;
740 new_btn
= BUTTON_RC_VOL_UP
;
743 new_btn
= BUTTON_RC_FF
;
746 new_btn
= BUTTON_RC_REW
;
749 new_btn
= BUTTON_RC_PLAY
;
752 new_btn
= BUTTON_RC_DOWN
;
755 new_btn
= BUTTON_DISPLAY
;
758 new_btn
= BUTTON_MENU
;
761 new_btn
= BUTTON_PLAY
;
764 new_btn
= BUTTON_LEFT
;
767 new_btn
= BUTTON_RIGHT
;
773 new_btn
= BUTTON_DOWN
;
777 new_btn
= BUTTON_SELECT
;
779 case SDLK_KP_MULTIPLY
:
782 new_btn
= BUTTON_POWER
;
785 #elif CONFIG_KEYPAD == COWON_D2_PAD
787 new_btn
= BUTTON_POWER
;
790 new_btn
= BUTTON_PLUS
;
793 new_btn
= BUTTON_MINUS
;
796 new_btn
= BUTTON_MENU
;
798 #elif CONFIG_KEYPAD == IAUDIO67_PAD
800 new_btn
= BUTTON_RIGHT
;
803 new_btn
= BUTTON_LEFT
;
806 new_btn
= BUTTON_STOP
;
811 new_btn
= BUTTON_PLAY
;
814 new_btn
= BUTTON_VOLUP
;
817 new_btn
= BUTTON_VOLDOWN
;
820 new_btn
= BUTTON_MENU
;
823 new_btn
= BUTTON_POWER
;
825 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
827 new_btn
= BUTTON_BACK
;
830 new_btn
= BUTTON_MENU
;
833 new_btn
= BUTTON_CUSTOM
;
836 new_btn
= BUTTON_PLAY
;
840 new_btn
= BUTTON_LEFT
;
844 new_btn
= BUTTON_RIGHT
;
852 new_btn
= BUTTON_DOWN
;
856 new_btn
= BUTTON_SELECT
;
858 case SDLK_KP_MULTIPLY
:
861 new_btn
= BUTTON_POWER
;
863 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
865 new_btn
= BUTTON_PREV
;
868 new_btn
= BUTTON_NEXT
;
871 new_btn
= BUTTON_BACK
;
874 new_btn
= BUTTON_PLAY
;
877 new_btn
= BUTTON_MENU
;
881 new_btn
= BUTTON_LEFT
;
885 new_btn
= BUTTON_RIGHT
;
893 new_btn
= BUTTON_DOWN
;
897 new_btn
= BUTTON_SELECT
;
899 case SDLK_KP_MULTIPLY
:
902 new_btn
= BUTTON_POWER
;
905 new_btn
= BUTTON_VOL_DOWN
;
908 new_btn
= BUTTON_VOL_UP
;
910 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
912 new_btn
= BUTTON_PREV
;
915 new_btn
= BUTTON_NEXT
;
920 new_btn
= BUTTON_PLAY
;
924 new_btn
= BUTTON_MENU
;
932 new_btn
= BUTTON_DOWN
;
936 new_btn
= BUTTON_SELECT
;
938 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
941 new_btn
= BUTTON_LEFT
;
945 new_btn
= BUTTON_RIGHT
;
949 new_btn
= BUTTON_SCROLL_BACK
;
953 new_btn
= BUTTON_SCROLL_FWD
;
961 new_btn
= BUTTON_DOWN
;
965 new_btn
= BUTTON_POWER
;
967 case SDLK_KP_MULTIPLY
:
968 new_btn
= BUTTON_HOME
;
974 new_btn
= BUTTON_SELECT
;
976 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
979 new_btn
= BUTTON_LEFT
;
983 new_btn
= BUTTON_RIGHT
;
991 new_btn
= BUTTON_DOWN
;
995 case SDLK_KP_MULTIPLY
:
996 new_btn
= BUTTON_HOME
;
1000 new_btn
= BUTTON_SELECT
;
1004 new_btn
= BUTTON_VOL_DOWN
;
1008 new_btn
= BUTTON_VOL_UP
;
1012 new_btn
= BUTTON_POWER
;
1014 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1017 new_btn
= BUTTON_LEFT
;
1021 new_btn
= BUTTON_RIGHT
;
1025 new_btn
= BUTTON_UP
;
1029 new_btn
= BUTTON_DOWN
;
1032 new_btn
= BUTTON_POWER
;
1035 new_btn
= BUTTON_SELECT
;
1038 new_btn
= BUTTON_VOL_DOWN
;
1041 new_btn
= BUTTON_VOL_UP
;
1043 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1046 new_btn
= BUTTON_LEFT
;
1050 new_btn
= BUTTON_RIGHT
;
1054 new_btn
= BUTTON_UP
;
1058 new_btn
= BUTTON_DOWN
;
1062 new_btn
= BUTTON_PLAY
;
1065 new_btn
= BUTTON_PREV
;
1068 new_btn
= BUTTON_NEXT
;
1072 new_btn
= BUTTON_POWER
;
1075 new_btn
= BUTTON_VOL_UP
;
1078 new_btn
= BUTTON_VOL_DOWN
;
1080 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1083 new_btn
= BUTTON_LEFT
;
1087 new_btn
= BUTTON_RIGHT
;
1091 new_btn
= BUTTON_UP
;
1095 new_btn
= BUTTON_DOWN
;
1099 new_btn
= BUTTON_SELECT
;
1103 new_btn
= BUTTON_POWER
;
1106 new_btn
= BUTTON_PLAYLIST
;
1109 new_btn
= BUTTON_VOL_UP
;
1112 new_btn
= BUTTON_VOL_DOWN
;
1115 new_btn
= BUTTON_MENU
;
1118 new_btn
= BUTTON_VIEW
;
1120 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1122 new_btn
= BUTTON_POWER
;
1126 new_btn
= BUTTON_VOL_UP
;
1130 new_btn
= BUTTON_VOL_DOWN
;
1134 new_btn
= BUTTON_MENU
;
1136 #elif CONFIG_KEYPAD == ONDAVX777_PAD
1138 new_btn
= BUTTON_POWER
;
1140 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1143 new_btn
= BUTTON_LEFT
;
1147 new_btn
= BUTTON_RIGHT
;
1151 new_btn
= BUTTON_UP
;
1155 new_btn
= BUTTON_DOWN
;
1159 new_btn
= BUTTON_PLAY
;
1163 new_btn
= BUTTON_FFWD
;
1165 #ifdef SAMSUNG_YH820
1171 new_btn
= BUTTON_REW
;
1174 new_btn
= BUTTON_REC
;
1176 #elif CONFIG_KEYPAD == MINI2440_PAD
1178 new_btn
= BUTTON_LEFT
;
1181 new_btn
= BUTTON_RIGHT
;
1184 new_btn
= BUTTON_UP
;
1187 new_btn
= BUTTON_DOWN
;
1191 new_btn
= BUTTON_POWER
;
1199 new_btn
= BUTTON_SELECT
;
1201 case SDLK_KP_PERIOD
:
1203 new_btn
= BUTTON_MENU
;
1206 new_btn
= BUTTON_VOL_UP
;
1209 new_btn
= BUTTON_VOL_DOWN
;
1212 #error No keymap defined!
1213 #endif /* CONFIG_KEYPAD */
1218 sim_trigger_screendump();
1224 /* Call to make up for scrollwheel target implementation. This is
1225 * not handled in the main button.c driver, but on the target
1226 * implementation (look at button-e200.c for example if you are trying to
1227 * figure out why using button_get_data needed a hack before).
1229 #if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK)
1230 if((new_btn
== BUTTON_SCROLL_FWD
|| new_btn
== BUTTON_SCROLL_BACK
) &&
1233 /* Clear these buttons from the data - adding them to the queue is
1234 * handled in the scrollwheel drivers for the targets. They do not
1235 * store the scroll forward/back buttons in their button data for
1236 * the button_read call.
1238 queue_post(&button_queue
, new_btn
, 1<<24);
1239 new_btn
&= ~(BUTTON_SCROLL_FWD
| BUTTON_SCROLL_BACK
);
1248 #if defined(HAVE_BUTTON_DATA) && defined(HAVE_TOUCHSCREEN)
1249 int button_read_device(int* data
)
1251 *data
= mouse_coords
;
1253 int button_read_device(void)
1257 #ifdef HAS_BUTTON_HOLD
1258 int hold_button
= button_hold();
1260 #ifdef HAVE_BACKLIGHT
1261 /* light handling */
1262 static int hold_button_old
= false;
1263 if (hold_button
!= hold_button_old
)
1265 hold_button_old
= hold_button
;
1266 backlight_hold_changed(hold_button
);
1278 #ifdef HAVE_TOUCHSCREEN
1279 extern bool debug_wps
;
1280 void mouse_tick_task(void)
1282 static int last_check
= 0;
1284 if (TIME_BEFORE(current_tick
, last_check
+(HZ
/10)))
1286 last_check
= current_tick
;
1287 if (SDL_GetMouseState(&x
, &y
) & SDL_BUTTON(SDL_BUTTON_LEFT
))
1294 if(x
<0 || y
<0 || x
>SIM_LCD_WIDTH
|| y
>SIM_LCD_HEIGHT
)
1298 mouse_coords
= (x
<<16)|y
;
1299 button_event(BUTTON_TOUCHSCREEN
, true);
1301 printf("Mouse at: (%d, %d)\n", x
, y
);
1306 void button_init_sdl(void)
1308 #ifdef HAVE_TOUCHSCREEN
1309 tick_add_task(mouse_tick_task
);