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 == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
266 || (CONFIG_KEYPAD == IPOD_4G_PAD)
269 new_btn
= BUTTON_LEFT
;
273 new_btn
= BUTTON_RIGHT
;
277 new_btn
= BUTTON_SCROLL_BACK
;
281 new_btn
= BUTTON_SCROLL_FWD
;
285 new_btn
= BUTTON_PLAY
;
289 new_btn
= BUTTON_SELECT
;
293 new_btn
= BUTTON_MENU
;
296 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
299 new_btn
= BUTTON_LEFT
;
303 new_btn
= BUTTON_RIGHT
;
307 new_btn
= BUTTON_SCROLL_UP
;
311 new_btn
= BUTTON_SCROLL_DOWN
;
315 new_btn
= BUTTON_POWER
;
318 new_btn
= BUTTON_POWER
;
322 new_btn
= BUTTON_REW
;
324 case SDLK_KP_MULTIPLY
:
330 new_btn
= BUTTON_PLAY
;
333 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
338 case REMOTETYPE_UNPLUGGED
:
339 _remote_type
=REMOTETYPE_H100_LCD
;
340 DEBUGF("Changed remote type to H100\n");
342 case REMOTETYPE_H100_LCD
:
343 _remote_type
=REMOTETYPE_H300_LCD
;
344 DEBUGF("Changed remote type to H300\n");
346 case REMOTETYPE_H300_LCD
:
347 _remote_type
=REMOTETYPE_H300_NONLCD
;
348 DEBUGF("Changed remote type to H300 NON-LCD\n");
350 case REMOTETYPE_H300_NONLCD
:
351 _remote_type
=REMOTETYPE_UNPLUGGED
;
352 DEBUGF("Changed remote type to none\n");
358 new_btn
= BUTTON_LEFT
;
362 new_btn
= BUTTON_RIGHT
;
370 new_btn
= BUTTON_DOWN
;
379 new_btn
= BUTTON_OFF
;
383 new_btn
= BUTTON_REC
;
387 new_btn
= BUTTON_SELECT
;
391 new_btn
= BUTTON_MODE
;
394 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
397 new_btn
= BUTTON_LEFT
;
401 new_btn
= BUTTON_RIGHT
;
409 new_btn
= BUTTON_DOWN
;
413 new_btn
= BUTTON_PLAY
;
422 new_btn
= BUTTON_SELECT
;
426 new_btn
= BUTTON_MODE
;
429 #elif CONFIG_KEYPAD == ONDIO_PAD
432 new_btn
= BUTTON_LEFT
;
436 new_btn
= BUTTON_RIGHT
;
444 new_btn
= BUTTON_DOWN
;
449 new_btn
= BUTTON_OFF
;
453 new_btn
= BUTTON_MENU
;
456 #elif CONFIG_KEYPAD == PLAYER_PAD
459 new_btn
= BUTTON_LEFT
;
463 new_btn
= BUTTON_RIGHT
;
467 new_btn
= BUTTON_PLAY
;
471 new_btn
= BUTTON_STOP
;
479 new_btn
= BUTTON_MENU
;
482 #elif CONFIG_KEYPAD == RECORDER_PAD
485 new_btn
= BUTTON_LEFT
;
489 new_btn
= BUTTON_RIGHT
;
497 new_btn
= BUTTON_DOWN
;
506 new_btn
= BUTTON_OFF
;
512 case SDLK_KP_MULTIPLY
:
522 new_btn
= BUTTON_PLAY
;
525 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
528 new_btn
= BUTTON_LEFT
;
532 new_btn
= BUTTON_RIGHT
;
540 new_btn
= BUTTON_DOWN
;
549 new_btn
= BUTTON_OFF
;
555 case SDLK_KP_MULTIPLY
:
565 new_btn
= BUTTON_SELECT
;
568 #elif CONFIG_KEYPAD == SANSA_E200_PAD
571 new_btn
= BUTTON_LEFT
;
575 new_btn
= BUTTON_RIGHT
;
579 new_btn
= BUTTON_SCROLL_BACK
;
583 new_btn
= BUTTON_SCROLL_FWD
;
589 new_btn
= BUTTON_DOWN
;
592 new_btn
= BUTTON_POWER
;
595 new_btn
= BUTTON_REC
;
599 new_btn
= BUTTON_SELECT
;
602 #elif CONFIG_KEYPAD == SANSA_C200_PAD
605 new_btn
= BUTTON_LEFT
;
609 new_btn
= BUTTON_RIGHT
;
617 new_btn
= BUTTON_DOWN
;
620 new_btn
= BUTTON_POWER
;
623 new_btn
= BUTTON_REC
;
628 new_btn
= BUTTON_SELECT
;
631 new_btn
= BUTTON_VOL_DOWN
;
634 new_btn
= BUTTON_VOL_UP
;
637 #elif CONFIG_KEYPAD == MROBE500_PAD
640 new_btn
= BUTTON_LEFT
;
644 new_btn
= BUTTON_RIGHT
;
648 new_btn
= BUTTON_RC_PLAY
;
652 new_btn
= BUTTON_RC_DOWN
;
656 new_btn
= BUTTON_POWER
;
659 new_btn
= BUTTON_POWER
;
664 new_btn
= BUTTON_RC_VOL_UP
;
668 new_btn
= BUTTON_RC_HEART
;
672 new_btn
= BUTTON_RC_MODE
;
675 #elif CONFIG_KEYPAD == MROBE100_PAD
677 new_btn
= BUTTON_DISPLAY
;
680 new_btn
= BUTTON_MENU
;
683 new_btn
= BUTTON_PLAY
;
687 new_btn
= BUTTON_LEFT
;
691 new_btn
= BUTTON_RIGHT
;
699 new_btn
= BUTTON_DOWN
;
703 new_btn
= BUTTON_SELECT
;
705 case SDLK_KP_MULTIPLY
:
708 new_btn
= BUTTON_POWER
;
711 #elif CONFIG_KEYPAD == COWOND2_PAD
714 new_btn
= BUTTON_LEFT
;
718 new_btn
= BUTTON_RIGHT
;
726 new_btn
= BUTTON_DOWN
;
729 new_btn
= BUTTON_POWER
;
734 new_btn
= BUTTON_SELECT
;
737 new_btn
= BUTTON_PLUS
;
740 new_btn
= BUTTON_MINUS
;
743 new_btn
= BUTTON_MENU
;
746 #error No keymap defined!
747 #endif /* CONFIG_KEYPAD */
752 queue_broadcast(SYS_SCREENDUMP
, 0);
763 /* Lots of stuff copied from real button.c. Not good, I think... */
765 /* Find out if a key has been released */
766 diff
= btn
^ lastbtn
;
767 if(diff
&& (btn
& diff
) == 0)
769 #ifdef HAVE_BACKLIGHT
770 #ifdef HAVE_REMOTE_LCD
771 if(diff
& BUTTON_REMOTE
)
772 if(!skip_remote_release
)
773 queue_post(&button_queue
, BUTTON_REL
| diff
, data
);
775 skip_remote_release
= false;
779 queue_post(&button_queue
, BUTTON_REL
| diff
, data
);
781 skip_release
= false;
783 queue_post(&button_queue
, BUTTON_REL
| diff
, data
);
791 /* normal keypress */
792 if ( btn
!= lastbtn
)
796 repeat_speed
= REPEAT_INTERVAL_START
;
808 /* yes we have repeat */
810 if (repeat_speed
< REPEAT_INTERVAL_FINISH
)
811 repeat_speed
= REPEAT_INTERVAL_FINISH
;
812 count
= repeat_speed
;
819 if (count
++ > REPEAT_START
)
825 count
= REPEAT_INTERVAL_START
;
833 if (queue_empty(&button_queue
))
835 queue_post(&button_queue
, BUTTON_REPEAT
| btn
, data
);
836 #ifdef HAVE_BACKLIGHT
837 #ifdef HAVE_REMOTE_LCD
838 if(btn
& BUTTON_REMOTE
)
840 if(skip_remote_release
)
841 skip_remote_release
= false;
846 skip_release
= false;
853 #ifdef HAVE_BACKLIGHT
854 #ifdef HAVE_REMOTE_LCD
855 if (btn
& BUTTON_REMOTE
) {
856 if (!remote_filter_first_keypress
|| is_remote_backlight_on())
857 queue_post(&button_queue
, btn
, data
);
859 skip_remote_release
= true;
863 if (!filter_first_keypress
|| is_backlight_on())
864 queue_post(&button_queue
, btn
, data
);
867 #else /* no backlight, nothing to skip */
868 queue_post(&button_queue
, btn
, data
);
873 #ifdef HAVE_REMOTE_LCD
874 if(btn
& BUTTON_REMOTE
)
875 remote_backlight_on();
888 lastbtn
= btn
& ~(BUTTON_REL
| BUTTON_REPEAT
);
891 /* Again copied from real button.c... */
893 int button_queue_count( void )
895 return queue_count(&button_queue
);
898 long button_get(bool block
)
900 struct queue_event ev
;
902 if ( block
|| !queue_empty(&button_queue
) ) {
903 queue_wait(&button_queue
, &ev
);
904 button_data
= ev
.data
;
910 long button_get_w_tmo(int ticks
)
912 struct queue_event ev
;
913 queue_wait_w_tmo(&button_queue
, &ev
, ticks
);
914 if (ev
.id
== SYS_TIMEOUT
)
917 button_data
= ev
.data
;
922 intptr_t button_get_data(void)
927 /* Needed by the accelerating wheel driver for Sansa e200 */
933 extern bool debug_wps
;
934 void mouse_tick_task(void)
936 static int last_check
= 0;
938 if (TIME_BEFORE(current_tick
, last_check
+(HZ
/10)))
940 last_check
= current_tick
;
941 if (SDL_GetMouseState(&x
, &y
) & SDL_BUTTON(SDL_BUTTON_LEFT
))
943 mouse_coords
= (x
<<16)|y
;
944 button_event(BUTTON_TOUCHPAD
, true);
946 printf("Mouse at: (%d, %d)\n", x
, y
);
948 else if (lastbtn
== BUTTON_TOUCHPAD
)
950 button_event(BUTTON_TOUCHPAD
, false);
955 void button_init(void)
958 tick_add_task(mouse_tick_task
);
962 int button_status(void)
967 void button_clear_queue(void)
969 queue_clear(&button_queue
);