1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Vicentini Martin
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 ****************************************************************************/
25 /* variable button definitions */
26 #if CONFIG_KEYPAD == RECORDER_PAD
27 #define FLIPIT_LEFT BUTTON_LEFT
28 #define FLIPIT_RIGHT BUTTON_RIGHT
29 #define FLIPIT_UP BUTTON_UP
30 #define FLIPIT_DOWN BUTTON_DOWN
31 #define FLIPIT_QUIT BUTTON_OFF
32 #define FLIPIT_SHUFFLE BUTTON_F1
33 #define FLIPIT_SOLVE BUTTON_F2
34 #define FLIPIT_STEP_BY_STEP BUTTON_F3
35 #define FLIPIT_TOGGLE BUTTON_PLAY
37 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
38 #define FLIPIT_LEFT BUTTON_LEFT
39 #define FLIPIT_RIGHT BUTTON_RIGHT
40 #define FLIPIT_UP BUTTON_UP
41 #define FLIPIT_DOWN BUTTON_DOWN
42 #define FLIPIT_QUIT BUTTON_OFF
43 #define FLIPIT_SHUFFLE BUTTON_F1
44 #define FLIPIT_SOLVE BUTTON_F2
45 #define FLIPIT_STEP_BY_STEP BUTTON_F3
46 #define FLIPIT_TOGGLE BUTTON_SELECT
48 #elif CONFIG_KEYPAD == PLAYER_PAD
49 #define FLIPIT_LEFT BUTTON_LEFT
50 #define FLIPIT_RIGHT BUTTON_RIGHT
51 #define FLIPIT_UP_PRE BUTTON_ON
52 #define FLIPIT_UP (BUTTON_ON | BUTTON_REL)
53 #define FLIPIT_DOWN BUTTON_MENU
54 #define FLIPIT_QUIT BUTTON_STOP
55 #define FLIPIT_SHUFFLE (BUTTON_ON | BUTTON_LEFT)
56 #define FLIPIT_SOLVE (BUTTON_ON | BUTTON_RIGHT)
57 #define FLIPIT_STEP_BY_STEP (BUTTON_ON | BUTTON_PLAY)
58 #define FLIPIT_TOGGLE BUTTON_PLAY
60 #elif CONFIG_KEYPAD == ONDIO_PAD
61 #define FLIPIT_LEFT BUTTON_LEFT
62 #define FLIPIT_RIGHT BUTTON_RIGHT
63 #define FLIPIT_UP BUTTON_UP
64 #define FLIPIT_DOWN BUTTON_DOWN
65 #define FLIPIT_QUIT BUTTON_OFF
66 #define FLIPIT_SHUFFLE (BUTTON_MENU | BUTTON_LEFT)
67 #define FLIPIT_SOLVE (BUTTON_MENU | BUTTON_UP)
68 #define FLIPIT_STEP_BY_STEP (BUTTON_MENU | BUTTON_RIGHT)
69 #define FLIPIT_TOGGLE_PRE BUTTON_MENU
70 #define FLIPIT_TOGGLE (BUTTON_MENU | BUTTON_REL)
72 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
73 (CONFIG_KEYPAD == IRIVER_H300_PAD)
74 #define FLIPIT_LEFT BUTTON_LEFT
75 #define FLIPIT_RIGHT BUTTON_RIGHT
76 #define FLIPIT_UP BUTTON_UP
77 #define FLIPIT_DOWN BUTTON_DOWN
78 #define FLIPIT_QUIT BUTTON_OFF
79 #define FLIPIT_SHUFFLE BUTTON_MODE
80 #define FLIPIT_SOLVE BUTTON_ON
81 #define FLIPIT_STEP_BY_STEP BUTTON_REC
82 #define FLIPIT_TOGGLE_PRE BUTTON_SELECT
83 #define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
85 #define FLIPIT_RC_QUIT BUTTON_RC_STOP
87 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
88 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
89 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
91 #define FLIPIT_SCROLLWHEEL
92 #define FLIPIT_LEFT BUTTON_LEFT
93 #define FLIPIT_RIGHT BUTTON_RIGHT
94 #define FLIPIT_UP BUTTON_MENU
95 #define FLIPIT_DOWN BUTTON_PLAY
96 #define FLIPIT_NEXT BUTTON_SCROLL_FWD
97 #define FLIPIT_PREV BUTTON_SCROLL_BACK
98 #define FLIPIT_QUIT (BUTTON_SELECT | BUTTON_MENU)
99 #define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
100 #define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_PLAY)
101 #define FLIPIT_STEP_BY_STEP (BUTTON_SELECT | BUTTON_RIGHT)
102 #define FLIPIT_TOGGLE_PRE BUTTON_SELECT
103 #define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
105 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
107 #define FLIPIT_LEFT BUTTON_LEFT
108 #define FLIPIT_RIGHT BUTTON_RIGHT
109 #define FLIPIT_UP BUTTON_UP
110 #define FLIPIT_DOWN BUTTON_DOWN
111 #define FLIPIT_QUIT BUTTON_POWER
112 #define FLIPIT_SHUFFLE BUTTON_REC
113 #define FLIPIT_SOLVE_PRE BUTTON_PLAY
114 #define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_REPEAT)
115 #define FLIPIT_STEP_PRE BUTTON_PLAY
116 #define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_REL)
117 #define FLIPIT_TOGGLE BUTTON_SELECT
119 #elif CONFIG_KEYPAD == GIGABEAT_PAD
121 #define FLIPIT_LEFT BUTTON_LEFT
122 #define FLIPIT_RIGHT BUTTON_RIGHT
123 #define FLIPIT_UP BUTTON_UP
124 #define FLIPIT_DOWN BUTTON_DOWN
125 #define FLIPIT_QUIT BUTTON_POWER
126 #define FLIPIT_SHUFFLE BUTTON_MENU
127 #define FLIPIT_SOLVE BUTTON_VOL_UP
128 #define FLIPIT_STEP_BY_STEP BUTTON_VOL_DOWN
129 #define FLIPIT_TOGGLE BUTTON_SELECT
131 #elif CONFIG_KEYPAD == SANSA_E200_PAD
133 #define FLIPIT_SCROLLWHEEL
134 #define FLIPIT_LEFT BUTTON_LEFT
135 #define FLIPIT_RIGHT BUTTON_RIGHT
136 #define FLIPIT_UP BUTTON_UP
137 #define FLIPIT_DOWN BUTTON_DOWN
138 #define FLIPIT_NEXT BUTTON_SCROLL_FWD
139 #define FLIPIT_PREV BUTTON_SCROLL_BACK
140 #define FLIPIT_QUIT BUTTON_POWER
141 #define FLIPIT_SHUFFLE (BUTTON_REC | BUTTON_LEFT)
142 #define FLIPIT_SOLVE (BUTTON_REC | BUTTON_RIGHT)
143 #define FLIPIT_STEP_BY_STEP (BUTTON_REC | BUTTON_SELECT)
144 #define FLIPIT_TOGGLE BUTTON_SELECT
146 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
148 #define FLIPIT_SCROLLWHEEL
149 #define FLIPIT_LEFT BUTTON_LEFT
150 #define FLIPIT_RIGHT BUTTON_RIGHT
151 #define FLIPIT_UP BUTTON_UP
152 #define FLIPIT_DOWN BUTTON_DOWN
153 #define FLIPIT_NEXT BUTTON_SCROLL_FWD
154 #define FLIPIT_PREV BUTTON_SCROLL_BACK
155 #define FLIPIT_QUIT (BUTTON_HOME|BUTTON_REPEAT)
156 #define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
157 #define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_DOWN)
158 #define FLIPIT_STEP_BY_STEP (BUTTON_SELECT | BUTTON_RIGHT)
159 #define FLIPIT_TOGGLE_PRE BUTTON_SELECT
160 #define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
162 #elif CONFIG_KEYPAD == SANSA_C200_PAD
164 #define FLIPIT_LEFT BUTTON_LEFT
165 #define FLIPIT_RIGHT BUTTON_RIGHT
166 #define FLIPIT_UP BUTTON_UP
167 #define FLIPIT_DOWN BUTTON_DOWN
168 #define FLIPIT_QUIT BUTTON_POWER
169 #define FLIPIT_SHUFFLE (BUTTON_REC | BUTTON_LEFT)
170 #define FLIPIT_SOLVE (BUTTON_REC | BUTTON_RIGHT)
171 #define FLIPIT_STEP_BY_STEP (BUTTON_REC | BUTTON_SELECT)
172 #define FLIPIT_TOGGLE BUTTON_SELECT
174 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
176 #define FLIPIT_LEFT BUTTON_LEFT
177 #define FLIPIT_RIGHT BUTTON_RIGHT
178 #define FLIPIT_UP BUTTON_UP
179 #define FLIPIT_DOWN BUTTON_DOWN
180 #define FLIPIT_QUIT BUTTON_POWER
181 #define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_LEFT)
182 #define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_RIGHT)
183 #define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_SELECT)
184 #define FLIPIT_TOGGLE BUTTON_SELECT
186 #elif CONFIG_KEYPAD == SANSA_M200_PAD
188 #define FLIPIT_LEFT BUTTON_LEFT
189 #define FLIPIT_RIGHT BUTTON_RIGHT
190 #define FLIPIT_UP BUTTON_UP
191 #define FLIPIT_DOWN BUTTON_DOWN
192 #define FLIPIT_QUIT BUTTON_POWER
193 #define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
194 #define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_RIGHT)
195 #define FLIPIT_STEP_BY_STEP (BUTTON_SELECT | BUTTON_UP)
196 #define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
198 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
200 #define FLIPIT_LEFT BUTTON_LEFT
201 #define FLIPIT_RIGHT BUTTON_RIGHT
202 #define FLIPIT_UP BUTTON_SCROLL_UP
203 #define FLIPIT_DOWN BUTTON_SCROLL_DOWN
204 #define FLIPIT_QUIT BUTTON_POWER
205 #define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_LEFT)
206 #define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_RIGHT)
207 #define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_SCROLL_UP)
208 #define FLIPIT_TOGGLE_PRE BUTTON_REW
209 #define FLIPIT_TOGGLE (BUTTON_REW | BUTTON_REL)
211 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
213 #define FLIPIT_LEFT BUTTON_LEFT
214 #define FLIPIT_RIGHT BUTTON_RIGHT
215 #define FLIPIT_UP BUTTON_UP
216 #define FLIPIT_DOWN BUTTON_DOWN
217 #define FLIPIT_QUIT BUTTON_BACK
218 #define FLIPIT_SHUFFLE BUTTON_MENU
219 #define FLIPIT_SOLVE BUTTON_VOL_UP
220 #define FLIPIT_STEP_BY_STEP BUTTON_VOL_DOWN
221 #define FLIPIT_TOGGLE BUTTON_SELECT
223 #elif CONFIG_KEYPAD == MROBE100_PAD
225 #define FLIPIT_LEFT BUTTON_LEFT
226 #define FLIPIT_RIGHT BUTTON_RIGHT
227 #define FLIPIT_UP BUTTON_UP
228 #define FLIPIT_DOWN BUTTON_DOWN
229 #define FLIPIT_QUIT BUTTON_POWER
230 #define FLIPIT_SHUFFLE BUTTON_MENU
231 #define FLIPIT_SOLVE BUTTON_PLAY
232 #define FLIPIT_STEP_BY_STEP BUTTON_DISPLAY
233 #define FLIPIT_TOGGLE BUTTON_SELECT
235 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
237 #define FLIPIT_LEFT BUTTON_RC_REW
238 #define FLIPIT_RIGHT BUTTON_RC_FF
239 #define FLIPIT_UP BUTTON_RC_VOL_UP
240 #define FLIPIT_DOWN BUTTON_RC_VOL_DOWN
241 #define FLIPIT_QUIT BUTTON_RC_REC
242 #define FLIPIT_SHUFFLE BUTTON_RC_MODE
243 #define FLIPIT_SOLVE_PRE BUTTON_RC_MENU
244 #define FLIPIT_SOLVE (BUTTON_RC_MENU|BUTTON_REPEAT)
245 #define FLIPIT_STEP_PRE BUTTON_RC_MENU
246 #define FLIPIT_STEP_BY_STEP (BUTTON_RC_MENU|BUTTON_REL)
247 #define FLIPIT_TOGGLE BUTTON_RC_PLAY
249 #define FLIPIT_RC_QUIT BUTTON_REC
251 #elif CONFIG_KEYPAD == COWON_D2_PAD
253 #define FLIPIT_QUIT BUTTON_POWER
255 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
257 #define FLIPIT_LEFT BUTTON_LEFT
258 #define FLIPIT_RIGHT BUTTON_RIGHT
259 #define FLIPIT_UP BUTTON_UP
260 #define FLIPIT_DOWN BUTTON_DOWN
261 #define FLIPIT_QUIT BUTTON_BACK
262 #define FLIPIT_SHUFFLE BUTTON_CUSTOM
263 #define FLIPIT_SOLVE BUTTON_PLAY
264 #define FLIPIT_STEP_BY_STEP BUTTON_MENU
265 #define FLIPIT_TOGGLE BUTTON_SELECT
267 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
269 #define FLIPIT_LEFT BUTTON_LEFT
270 #define FLIPIT_RIGHT BUTTON_RIGHT
271 #define FLIPIT_UP BUTTON_UP
272 #define FLIPIT_DOWN BUTTON_DOWN
273 #define FLIPIT_QUIT BUTTON_POWER
274 #define FLIPIT_SHUFFLE BUTTON_MENU
275 #define FLIPIT_SOLVE BUTTON_VIEW
276 #define FLIPIT_STEP_BY_STEP BUTTON_PLAYLIST
277 #define FLIPIT_TOGGLE BUTTON_SELECT
279 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
281 #define FLIPIT_LEFT BUTTON_LEFT
282 #define FLIPIT_RIGHT BUTTON_RIGHT
283 #define FLIPIT_UP BUTTON_UP
284 #define FLIPIT_DOWN BUTTON_DOWN
285 #define FLIPIT_QUIT BUTTON_POWER
286 #define FLIPIT_SHUFFLE BUTTON_MENU
287 #define FLIPIT_SOLVE BUTTON_VIEW
288 #define FLIPIT_STEP_BY_STEP BUTTON_NEXT
289 #define FLIPIT_TOGGLE BUTTON_PLAY
291 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
293 #define FLIPIT_LEFT BUTTON_PREV
294 #define FLIPIT_RIGHT BUTTON_NEXT
295 #define FLIPIT_UP BUTTON_UP
296 #define FLIPIT_DOWN BUTTON_DOWN
297 #define FLIPIT_QUIT BUTTON_POWER
298 #define FLIPIT_SHUFFLE BUTTON_MENU
299 #define FLIPIT_SOLVE BUTTON_RIGHT
300 #define FLIPIT_STEP_BY_STEP BUTTON_LEFT
301 #define FLIPIT_TOGGLE BUTTON_PLAY
303 #elif CONFIG_KEYPAD == ONDAVX747_PAD || CONFIG_KEYPAD == MROBE500_PAD
305 #define FLIPIT_QUIT BUTTON_POWER
307 #elif CONFIG_KEYPAD == ONDAVX777_PAD
309 #define FLIPIT_QUIT BUTTON_POWER
311 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
313 #define FLIPIT_LEFT BUTTON_LEFT
314 #define FLIPIT_RIGHT BUTTON_RIGHT
315 #define FLIPIT_UP BUTTON_UP
316 #define FLIPIT_DOWN BUTTON_DOWN
317 #define FLIPIT_QUIT BUTTON_REC
318 #define FLIPIT_SHUFFLE BUTTON_PLAY
319 #define FLIPIT_SOLVE BUTTON_FFWD
320 #define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_UP)
321 #define FLIPIT_TOGGLE (BUTTON_PLAY|BUTTON_DOWN)
323 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
325 #define FLIPIT_LEFT BUTTON_PREV
326 #define FLIPIT_RIGHT BUTTON_NEXT
327 #define FLIPIT_UP BUTTON_UP
328 #define FLIPIT_DOWN BUTTON_DOWN
329 #define FLIPIT_QUIT BUTTON_REC
330 #define FLIPIT_SHUFFLE BUTTON_PLAY
331 #define FLIPIT_SOLVE BUTTON_MENU
332 #define FLIPIT_STEP_BY_STEP BUTTON_CANCEL
333 #define FLIPIT_TOGGLE BUTTON_OK
335 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
337 #define FLIPIT_LEFT BUTTON_VOL_DOWN
338 #define FLIPIT_RIGHT BUTTON_VOL_UP
339 #define FLIPIT_UP BUTTON_REW
340 #define FLIPIT_DOWN BUTTON_FF
341 #define FLIPIT_QUIT (BUTTON_REC|BUTTON_PLAY)
342 #define FLIPIT_SHUFFLE BUTTON_FUNC
343 #define FLIPIT_SOLVE BUTTON_REC
344 #define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_REW)
345 #define FLIPIT_TOGGLE (BUTTON_PLAY|BUTTON_FF)
347 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
349 #define FLIPIT_LEFT BUTTON_REW
350 #define FLIPIT_RIGHT BUTTON_FF
351 #define FLIPIT_UP BUTTON_UP
352 #define FLIPIT_DOWN BUTTON_DOWN
353 #define FLIPIT_QUIT (BUTTON_MENU|BUTTON_REPEAT)
354 #define FLIPIT_SHUFFLE BUTTON_PLAY
355 #define FLIPIT_SOLVE BUTTON_MENU
356 #define FLIPIT_STEP_BY_STEP BUTTON_REC
357 #define FLIPIT_TOGGLE BUTTON_ENTER
359 #elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
361 #define FLIPIT_LEFT BUTTON_LEFT
362 #define FLIPIT_RIGHT BUTTON_RIGHT
363 #define FLIPIT_UP BUTTON_UP
364 #define FLIPIT_DOWN BUTTON_DOWN
365 #define FLIPIT_QUIT BUTTON_POWER
366 #define FLIPIT_SHUFFLE BUTTON_PLAYPAUSE
367 #define FLIPIT_SOLVE BUTTON_BACK
368 #define FLIPIT_STEP_BY_STEP BUTTON_BOTTOMLEFT
369 #define FLIPIT_TOGGLE BUTTON_SELECT
371 #elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
373 #define FLIPIT_LEFT BUTTON_LEFT
374 #define FLIPIT_RIGHT BUTTON_RIGHT
375 #define FLIPIT_UP BUTTON_UP
376 #define FLIPIT_DOWN BUTTON_DOWN
377 #define FLIPIT_QUIT BUTTON_POWER
378 #define FLIPIT_SHUFFLE BUTTON_VOL_UP
379 #define FLIPIT_SOLVE BUTTON_PREV
380 #define FLIPIT_STEP_BY_STEP BUTTON_NEXT
381 #define FLIPIT_TOGGLE BUTTON_SELECT
383 #elif CONFIG_KEYPAD == SAMSUNG_YPR0_PAD
385 #define FLIPIT_LEFT BUTTON_LEFT
386 #define FLIPIT_RIGHT BUTTON_RIGHT
387 #define FLIPIT_UP BUTTON_UP
388 #define FLIPIT_DOWN BUTTON_DOWN
389 #define FLIPIT_QUIT BUTTON_BACK
390 #define FLIPIT_SHUFFLE BUTTON_MENU
391 #define FLIPIT_SOLVE BUTTON_USER
392 #define FLIPIT_STEP_BY_STEP BUTTON_POWER
393 #define FLIPIT_TOGGLE BUTTON_SELECT
395 #elif CONFIG_KEYPAD == HM60X_PAD
397 #define FLIPIT_LEFT BUTTON_LEFT
398 #define FLIPIT_RIGHT BUTTON_RIGHT
399 #define FLIPIT_UP BUTTON_UP
400 #define FLIPIT_DOWN BUTTON_DOWN
401 #define FLIPIT_QUIT BUTTON_POWER
402 #define FLIPIT_SHUFFLE (BUTTON_UP|BUTTON_POWER)
403 #define FLIPIT_SOLVE (BUTTON_DOWN|BUTTON_POWER)
404 #define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_POWER)
405 #define FLIPIT_TOGGLE BUTTON_SELECT
407 #elif CONFIG_KEYPAD == HM801_PAD
409 #define FLIPIT_LEFT BUTTON_LEFT
410 #define FLIPIT_RIGHT BUTTON_RIGHT
411 #define FLIPIT_UP BUTTON_UP
412 #define FLIPIT_DOWN BUTTON_DOWN
413 #define FLIPIT_QUIT BUTTON_POWER
414 #define FLIPIT_SHUFFLE BUTTON_PREV
415 #define FLIPIT_SOLVE BUTTON_NEXT
416 #define FLIPIT_STEP_BY_STEP BUTTON_PLAY
417 #define FLIPIT_TOGGLE BUTTON_SELECT
420 #error No keymap defined!
423 #ifdef HAVE_TOUCHSCREEN
425 #define FLIPIT_LEFT BUTTON_MIDLEFT
428 #define FLIPIT_RIGHT BUTTON_MIDRIGHT
431 #define FLIPIT_UP BUTTON_TOPMIDDLE
434 #define FLIPIT_DOWN BUTTON_BOTTOMMIDDLE
437 #define FLIPIT_QUIT BUTTON_TOPLEFT
439 #ifndef FLIPIT_SHUFFLE
440 #define FLIPIT_SHUFFLE BUTTON_TOPRIGHT
443 #define FLIPIT_SOLVE BUTTON_BOTTOMLEFT
445 #ifndef FLIPIT_STEP_BY_STEP
446 #define FLIPIT_STEP_BY_STEP BUTTON_BOTTOMRIGHT
448 #ifndef FLIPIT_TOGGLE
449 #define FLIPIT_TOGGLE BUTTON_CENTER
453 static int spots
[20];
454 static int toggle
[20];
455 static int cursor_pos
, moves
;
457 #ifdef HAVE_LCD_BITMAP
459 #include "pluginbitmaps/flipit_cursor.h"
460 #include "pluginbitmaps/flipit_tokens.h"
462 #define PANEL_HEIGHT 12
463 #define TK_WIDTH BMPWIDTH_flipit_cursor
464 #define TK_HEIGHT BMPHEIGHT_flipit_cursor
465 #define TK_SPACE MAX(0, MIN((LCD_WIDTH - 5*TK_WIDTH)/4, \
466 (LCD_HEIGHT - PANEL_HEIGHT - 4*TK_HEIGHT)/4))
467 #define GRID_WIDTH (5*TK_WIDTH + 4*TK_SPACE)
468 #define GRID_LEFT ((LCD_WIDTH - GRID_WIDTH)/2)
469 #define GRID_HEIGHT (4*TK_HEIGHT + 4*TK_SPACE) /* includes grid-panel space */
470 #define GRID_TOP MAX(0, ((LCD_HEIGHT - PANEL_HEIGHT - GRID_HEIGHT)/2))
472 /* draw a spot at the coordinates (x,y), range of p is 0-19 */
473 static void draw_spot(int p
)
475 rb
->lcd_bitmap_part( flipit_tokens
, 0, spots
[p
] * TK_HEIGHT
,
476 STRIDE(SCREEN_MAIN
, BMPWIDTH_flipit_tokens
,
477 BMPHEIGHT_flipit_tokens
),
478 GRID_LEFT
+ (p
%5) * (TK_WIDTH
+TK_SPACE
),
479 GRID_TOP
+ (p
/5) * (TK_HEIGHT
+TK_SPACE
),
480 TK_WIDTH
, TK_HEIGHT
);
483 /* draw the cursor at the current cursor position */
484 static void draw_cursor(void)
486 #ifdef HAVE_LCD_COLOR
487 rb
->lcd_bitmap_transparent( flipit_cursor
,
488 GRID_LEFT
+ (cursor_pos
%5) * (TK_WIDTH
+TK_SPACE
),
489 GRID_TOP
+ (cursor_pos
/5) * (TK_HEIGHT
+TK_SPACE
),
490 TK_WIDTH
, TK_HEIGHT
);
492 rb
->lcd_set_drawmode(DRMODE_FG
);
493 rb
->lcd_mono_bitmap( flipit_cursor
,
494 GRID_LEFT
+ (cursor_pos
%5) * (TK_WIDTH
+TK_SPACE
),
495 GRID_TOP
+ (cursor_pos
/5) * (TK_HEIGHT
+TK_SPACE
),
496 TK_WIDTH
, TK_HEIGHT
);
497 rb
->lcd_set_drawmode(DRMODE_SOLID
);
501 /* draw the info panel ... duh */
502 static void draw_info_panel(void)
506 rb
->lcd_set_drawmode( DRMODE_SOLID
|DRMODE_INVERSEVID
);
507 rb
->lcd_fillrect( GRID_LEFT
, GRID_TOP
+ 4*(TK_HEIGHT
+TK_SPACE
),
508 GRID_WIDTH
, PANEL_HEIGHT
);
509 rb
->lcd_set_drawmode( DRMODE_SOLID
);
510 rb
->lcd_drawrect( GRID_LEFT
, GRID_TOP
+ 4*(TK_HEIGHT
+TK_SPACE
),
511 GRID_WIDTH
, PANEL_HEIGHT
);
513 rb
->snprintf( s
, sizeof(s
), "Flips: %d", moves
);
514 rb
->lcd_putsxy( (LCD_WIDTH
- rb
->lcd_getstringsize(s
, NULL
, NULL
)) / 2,
515 GRID_TOP
+ 4*(TK_HEIGHT
+TK_SPACE
) + 2, s
);
518 #else /* HAVE_LCD_CHARCELLS */
520 static const unsigned char tk_pat
[4][7] = {
521 { 0x0e, 0x11, 0x0e, 0x00, 0x0e, 0x11, 0x0e }, /* white - white */
522 { 0x0e, 0x11, 0x0e, 0x00, 0x0e, 0x1f, 0x0e }, /* white - black */
523 { 0x0e, 0x1f, 0x0e, 0x00, 0x0e, 0x11, 0x0e }, /* black - white */
524 { 0x0e, 0x1f, 0x0e, 0x00, 0x0e, 0x1f, 0x0e } /* black - black */
527 static unsigned char cur_pat
[7];
528 static unsigned long gfx_chars
[5];
530 static void release_gfx(void)
534 for (i
= 0; i
< 5; i
++)
536 rb
->lcd_unlock_pattern(gfx_chars
[i
]);
539 static bool init_gfx(void)
543 for (i
= 0; i
< 5; i
++) {
544 if ((gfx_chars
[i
] = rb
->lcd_get_locked_pattern()) == 0) {
549 for (i
= 0; i
< 4; i
++)
550 rb
->lcd_define_pattern(gfx_chars
[i
], tk_pat
[i
]);
554 /* draw a spot at the coordinates (x,y), range of p is 0-19 */
555 static void draw_spot(int p
)
560 rb
->lcd_putc (p
%5, p
/10, gfx_chars
[2*spots
[p
]+spots
[p
+5]]);
563 /* draw the cursor at the current cursor position */
564 static void draw_cursor(void)
566 if ((cursor_pos
/5) & 1) {
567 rb
->memcpy( cur_pat
, tk_pat
[2*spots
[cursor_pos
-5]+spots
[cursor_pos
]], 7 );
572 rb
->memcpy( cur_pat
, tk_pat
[2*spots
[cursor_pos
]+spots
[cursor_pos
+5]], 7 );
576 rb
->lcd_define_pattern(gfx_chars
[4], cur_pat
);
577 rb
->lcd_putc( cursor_pos
%5, cursor_pos
/10, gfx_chars
[4] );
580 /* draw the info panel ... duh */
581 static void draw_info_panel(void)
583 rb
->lcd_puts( 6, 0, "Flips" );
584 rb
->lcd_putsf( 6, 1, "%d", moves
);
589 /* clear the cursor where it is */
590 static inline void clear_cursor(void)
592 draw_spot( cursor_pos
);
595 /* check if the puzzle is finished */
596 static bool flipit_finished(void)
606 /* draws the toggled spots */
607 static void flipit_toggle(void)
609 spots
[cursor_pos
] = 1-spots
[cursor_pos
];
610 toggle
[cursor_pos
] = 1-toggle
[cursor_pos
];
611 draw_spot(cursor_pos
);
612 if (cursor_pos
%5 > 0) {
613 spots
[cursor_pos
-1] = 1-spots
[cursor_pos
-1];
614 draw_spot(cursor_pos
-1);
616 if (cursor_pos
%5 < 4) {
617 spots
[cursor_pos
+1] = 1-spots
[cursor_pos
+1];
618 draw_spot(cursor_pos
+1);
620 if (cursor_pos
/5 > 0) {
621 spots
[cursor_pos
-5] = 1-spots
[cursor_pos
-5];
622 draw_spot(cursor_pos
-5);
624 if (cursor_pos
/5 < 3) {
625 spots
[cursor_pos
+5] = 1-spots
[cursor_pos
+5];
626 draw_spot(cursor_pos
+5);
632 if (flipit_finished())
636 /* move the cursor in any direction */
637 static void move_cursor(int x
, int y
)
639 if (!(flipit_finished())) {
641 cursor_pos
= ( x
+ 5 + cursor_pos
%5 )%5
642 + ( ( y
+ 4 + cursor_pos
/5 )%4 )*5;
648 /* initialize the board */
649 static void flipit_init(void)
653 rb
->lcd_clear_display();
654 for (i
=0; i
<20; i
++) {
661 for (i
=0; i
<20; i
++) {
662 cursor_pos
= (rb
->rand() % 20);
673 /* the main game loop */
674 static bool flipit_loop(void)
678 #if defined(FLIPIT_SOLVE_PRE) || defined(FLIPIT_STEP_PRE) || \
679 defined(FLIPIT_TOGGLE_PRE) || defined(FLIPIT_UP_PRE)
680 int lastbutton
= BUTTON_NONE
;
685 button
= rb
->button_get(true);
687 #ifdef FLIPIT_RC_QUIT
691 /* get out of here */
695 /* mix up the pieces */
700 #ifdef FLIPIT_SOLVE_PRE
701 if (lastbutton
!= FLIPIT_SOLVE_PRE
)
704 /* solve the puzzle */
705 if (!flipit_finished()) {
718 case FLIPIT_STEP_BY_STEP
:
719 #ifdef FLIPIT_STEP_PRE
720 if (lastbutton
!= FLIPIT_STEP_PRE
)
723 if (!flipit_finished()) {
737 #ifdef FLIPIT_TOGGLE_PRE
738 if (lastbutton
!= FLIPIT_TOGGLE_PRE
)
741 /* toggle the pieces */
742 if (!flipit_finished()) {
756 /*move cursor though the entire field*/
757 #ifdef FLIPIT_SCROLLWHEEL
759 case FLIPIT_PREV
|BUTTON_REPEAT
:
760 if ((cursor_pos
)%5 == 0) {
769 case FLIPIT_NEXT
|BUTTON_REPEAT
:
770 if ((cursor_pos
+1)%5 == 0) {
780 if (lastbutton
!= FLIPIT_UP_PRE
)
791 if (rb
->default_event_handler(button
) == SYS_USB_CONNECTED
)
792 return PLUGIN_USB_CONNECTED
;
795 #if defined(FLIPIT_SOLVE_PRE) || defined(FLIPIT_STEP_PRE) || \
796 defined(FLIPIT_TOGGLE_PRE) || defined(FLIPIT_UP_PRE)
797 if (button
!= BUTTON_NONE
)
803 /* called function from outside */
804 enum plugin_status
plugin_start(const void* parameter
)
810 #ifdef HAVE_LCD_COLOR
811 rb
->lcd_set_background(LCD_WHITE
);
812 rb
->lcd_set_foreground(LCD_BLACK
);
816 rb
->lcd_set_backdrop(NULL
);
819 rb
->splash(HZ
, "FlipIt!");
821 #ifdef HAVE_LCD_BITMAP
822 /* print instructions */
823 rb
->lcd_clear_display();
824 rb
->lcd_setfont(FONT_SYSFIXED
);
825 #if CONFIG_KEYPAD == RECORDER_PAD
826 rb
->lcd_putsxy(2, 8, "[OFF] to stop");
827 rb
->lcd_putsxy(2, 18, "[PLAY] toggle");
828 rb
->lcd_putsxy(2, 28, "[F1] shuffle");
829 rb
->lcd_putsxy(2, 38, "[F2] solution");
830 rb
->lcd_putsxy(2, 48, "[F3] step by step");
831 #elif CONFIG_KEYPAD == ONDIO_PAD
832 rb
->lcd_putsxy(2, 8, "[OFF] to stop");
833 rb
->lcd_putsxy(2, 18, "[MODE] toggle");
834 rb
->lcd_putsxy(2, 28, "[M-LEFT] shuffle");
835 rb
->lcd_putsxy(2, 38, "[M-UP] solution");
836 rb
->lcd_putsxy(2, 48, "[M-RIGHT] step by step");
837 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
838 (CONFIG_KEYPAD == IRIVER_H300_PAD)
839 rb
->lcd_putsxy(2, 8, "[STOP] to stop");
840 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
841 rb
->lcd_putsxy(2, 28, "[MODE] shuffle");
842 rb
->lcd_putsxy(2, 38, "[PLAY] solution");
843 rb
->lcd_putsxy(2, 48, "[REC] step by step");
844 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
845 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
846 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
847 rb
->lcd_putsxy(2, 8, "[S-MENU] to stop");
848 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
849 rb
->lcd_putsxy(2, 28, "[S-LEFT] shuffle");
850 rb
->lcd_putsxy(2, 38, "[S-PLAY] solution");
851 rb
->lcd_putsxy(2, 48, "[S-RIGHT] step by step");
852 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
853 rb
->lcd_putsxy(2, 8, "[POWER] to stop");
854 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
855 rb
->lcd_putsxy(2, 28, "[REC] shuffle");
856 rb
->lcd_putsxy(2, 38, "[PLAY..] solution");
857 rb
->lcd_putsxy(2, 48, "[PLAY] step by step");
858 #elif CONFIG_KEYPAD == GIGABEAT_PAD
859 rb
->lcd_putsxy(2, 8, "[POWER] to stop");
860 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
861 rb
->lcd_putsxy(2, 28, "[MENU] shuffle");
862 rb
->lcd_putsxy(2, 38, "[VOL+] solution");
863 rb
->lcd_putsxy(2, 48, "[VOL-] step by step");
864 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
865 rb
->lcd_putsxy(2, 8, "[POWER] to stop");
866 rb
->lcd_putsxy(2, 18, "[REW] toggle");
867 rb
->lcd_putsxy(2, 28, "[PL-LEFT] shuffle");
868 rb
->lcd_putsxy(2, 38, "[PL-RIGHT] solution");
869 rb
->lcd_putsxy(2, 48, "[PL-UP] step by step");
870 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
871 rb
->lcd_putsxy(2, 8, "[BACK] to stop");
872 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
873 rb
->lcd_putsxy(2, 28, "[MENU] shuffle");
874 rb
->lcd_putsxy(2, 38, "[VOL+] solution");
875 rb
->lcd_putsxy(2, 48, "[VOL-] step by step");
876 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
877 (CONFIG_KEYPAD == SANSA_C200_PAD)
878 rb
->lcd_putsxy(2, 8, "[POWER] to stop");
879 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
880 rb
->lcd_putsxy(2, 28, "[REC-LEFT] shuffle");
881 rb
->lcd_putsxy(2, 38, "[REC-RIGHT] solution");
882 rb
->lcd_putsxy(2, 48, "[REC-SEL] step by step");
883 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
884 rb
->lcd_putsxy(2, 8, "[REC] to stop");
885 rb
->lcd_putsxy(2, 18, "[PLAY] toggle");
886 rb
->lcd_putsxy(2, 28, "[MODE] shuffle");
887 rb
->lcd_putsxy(2, 38, "[MENU..] solution");
888 rb
->lcd_putsxy(2, 48, "[MENU] step by step");
889 #elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
890 rb
->lcd_putsxy(2, 8, "[POWER] to stop");
891 rb
->lcd_putsxy(2, 18, "[SELECT] toggle");
892 rb
->lcd_putsxy(2, 28, "[VOL+] shuffle");
893 rb
->lcd_putsxy(2, 38, "[PREV] solution");
894 rb
->lcd_putsxy(2, 48, "[NEXT] step by step");
897 #ifdef HAVE_TOUCHSCREEN
898 rb
->lcd_putsxy(2, 8, "[BOTTOMLEFT] to stop");
899 rb
->lcd_putsxy(2, 18, "[CENTRE] toggle");
900 rb
->lcd_putsxy(2, 28, "[TOPRIGHT] shuffle");
901 rb
->lcd_putsxy(2, 38, "[BOTTOMLEFT] solution");
902 rb
->lcd_putsxy(2, 48, "[BOTTOMRIGHT] step by step");
906 #else /* HAVE_LCD_CHARCELLS */
910 rb
->button_get_w_tmo(HZ
*3);
912 rb
->lcd_clear_display();
914 for (i
=0; i
<20; i
++) {
920 rb
->srand(*rb
->current_tick
);
923 #ifdef HAVE_LCD_CHARCELLS