A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 Vicentini Martin
11 *
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.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22
23/* variable button definitions */
24#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
25 (CONFIG_KEYPAD == IRIVER_H300_PAD)
26#define FLIPIT_LEFT BUTTON_LEFT
27#define FLIPIT_RIGHT BUTTON_RIGHT
28#define FLIPIT_UP BUTTON_UP
29#define FLIPIT_DOWN BUTTON_DOWN
30#define FLIPIT_QUIT BUTTON_OFF
31#define FLIPIT_SHUFFLE BUTTON_MODE
32#define FLIPIT_SOLVE BUTTON_ON
33#define FLIPIT_STEP_BY_STEP BUTTON_REC
34#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
35#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
36
37#define FLIPIT_RC_QUIT BUTTON_RC_STOP
38
39#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
40 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
41 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
42
43#define FLIPIT_SCROLLWHEEL
44#define FLIPIT_LEFT BUTTON_LEFT
45#define FLIPIT_RIGHT BUTTON_RIGHT
46#define FLIPIT_UP BUTTON_MENU
47#define FLIPIT_DOWN BUTTON_PLAY
48#define FLIPIT_NEXT BUTTON_SCROLL_FWD
49#define FLIPIT_PREV BUTTON_SCROLL_BACK
50#define FLIPIT_QUIT (BUTTON_SELECT | BUTTON_REPEAT)
51#define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
52#define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_PLAY)
53#define FLIPIT_STEP_BY_STEP (BUTTON_SELECT | BUTTON_RIGHT)
54#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
55#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
56
57#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
58
59#define FLIPIT_LEFT BUTTON_LEFT
60#define FLIPIT_RIGHT BUTTON_RIGHT
61#define FLIPIT_UP BUTTON_UP
62#define FLIPIT_DOWN BUTTON_DOWN
63#define FLIPIT_QUIT BUTTON_POWER
64#define FLIPIT_SHUFFLE BUTTON_REC
65#define FLIPIT_SOLVE_PRE BUTTON_PLAY
66#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_REPEAT)
67#define FLIPIT_STEP_PRE BUTTON_PLAY
68#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_REL)
69#define FLIPIT_TOGGLE BUTTON_SELECT
70
71#elif CONFIG_KEYPAD == GIGABEAT_PAD
72
73#define FLIPIT_LEFT BUTTON_LEFT
74#define FLIPIT_RIGHT BUTTON_RIGHT
75#define FLIPIT_UP BUTTON_UP
76#define FLIPIT_DOWN BUTTON_DOWN
77#define FLIPIT_QUIT BUTTON_POWER
78#define FLIPIT_SHUFFLE BUTTON_MENU
79#define FLIPIT_SOLVE BUTTON_VOL_UP
80#define FLIPIT_STEP_BY_STEP BUTTON_VOL_DOWN
81#define FLIPIT_TOGGLE BUTTON_SELECT
82
83#elif CONFIG_KEYPAD == SANSA_E200_PAD
84
85#define FLIPIT_SCROLLWHEEL
86#define FLIPIT_LEFT BUTTON_LEFT
87#define FLIPIT_RIGHT BUTTON_RIGHT
88#define FLIPIT_UP BUTTON_UP
89#define FLIPIT_DOWN BUTTON_DOWN
90#define FLIPIT_NEXT BUTTON_SCROLL_FWD
91#define FLIPIT_PREV BUTTON_SCROLL_BACK
92#define FLIPIT_QUIT BUTTON_POWER
93#define FLIPIT_SHUFFLE (BUTTON_REC | BUTTON_LEFT)
94#define FLIPIT_SOLVE (BUTTON_REC | BUTTON_RIGHT)
95#define FLIPIT_STEP_BY_STEP (BUTTON_REC | BUTTON_SELECT)
96#define FLIPIT_TOGGLE BUTTON_SELECT
97
98#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
99
100#define FLIPIT_SCROLLWHEEL
101#define FLIPIT_LEFT BUTTON_LEFT
102#define FLIPIT_RIGHT BUTTON_RIGHT
103#define FLIPIT_UP BUTTON_UP
104#define FLIPIT_DOWN BUTTON_DOWN
105#define FLIPIT_NEXT BUTTON_SCROLL_FWD
106#define FLIPIT_PREV BUTTON_SCROLL_BACK
107#define FLIPIT_QUIT (BUTTON_HOME|BUTTON_REPEAT)
108#define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
109#define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_DOWN)
110#define FLIPIT_STEP_BY_STEP (BUTTON_SELECT | BUTTON_RIGHT)
111#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
112#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
113
114#elif CONFIG_KEYPAD == SANSA_C200_PAD
115
116#define FLIPIT_LEFT BUTTON_LEFT
117#define FLIPIT_RIGHT BUTTON_RIGHT
118#define FLIPIT_UP BUTTON_UP
119#define FLIPIT_DOWN BUTTON_DOWN
120#define FLIPIT_QUIT BUTTON_POWER
121#define FLIPIT_SHUFFLE (BUTTON_REC | BUTTON_LEFT)
122#define FLIPIT_SOLVE (BUTTON_REC | BUTTON_RIGHT)
123#define FLIPIT_STEP_BY_STEP (BUTTON_REC | BUTTON_SELECT)
124#define FLIPIT_TOGGLE BUTTON_SELECT
125
126#elif CONFIG_KEYPAD == SANSA_CLIP_PAD
127
128#define FLIPIT_LEFT BUTTON_LEFT
129#define FLIPIT_RIGHT BUTTON_RIGHT
130#define FLIPIT_UP BUTTON_UP
131#define FLIPIT_DOWN BUTTON_DOWN
132#define FLIPIT_QUIT BUTTON_POWER
133#define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_LEFT)
134#define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_RIGHT)
135#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_SELECT)
136#define FLIPIT_TOGGLE BUTTON_SELECT
137
138#elif CONFIG_KEYPAD == SANSA_M200_PAD
139
140#define FLIPIT_LEFT BUTTON_LEFT
141#define FLIPIT_RIGHT BUTTON_RIGHT
142#define FLIPIT_UP BUTTON_UP
143#define FLIPIT_DOWN BUTTON_DOWN
144#define FLIPIT_QUIT BUTTON_POWER
145#define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
146#define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_RIGHT)
147#define FLIPIT_STEP_BY_STEP (BUTTON_SELECT | BUTTON_UP)
148#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
149
150#elif CONFIG_KEYPAD == SONY_NWZ_PAD
151#define FLIPIT_LEFT BUTTON_LEFT
152#define FLIPIT_RIGHT BUTTON_RIGHT
153#define FLIPIT_UP BUTTON_UP
154#define FLIPIT_DOWN BUTTON_DOWN
155#define FLIPIT_QUIT (BUTTON_BACK|BUTTON_REPEAT)
156#define FLIPIT_SHUFFLE BUTTON_BACK
157#define FLIPIT_SOLVE (BUTTON_PLAY|BUTTON_REPEAT)
158#define FLIPIT_STEP_BY_STEP BUTTON_POWER
159#define FLIPIT_TOGGLE BUTTON_PLAY
160
161#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD
162#define FLIPIT_LEFT BUTTON_LEFT
163#define FLIPIT_RIGHT BUTTON_RIGHT
164#define FLIPIT_UP BUTTON_UP
165#define FLIPIT_DOWN BUTTON_DOWN
166#define FLIPIT_QUIT BUTTON_BACK
167#define FLIPIT_SHUFFLE BUTTON_SHORTCUT
168#define FLIPIT_SOLVE BUTTON_PLAYPAUSE
169#define FLIPIT_STEP_BY_STEP BUTTON_MENU
170#define FLIPIT_TOGGLE BUTTON_SELECT
171
172#elif CONFIG_KEYPAD == IRIVER_H10_PAD
173
174#define FLIPIT_LEFT BUTTON_LEFT
175#define FLIPIT_RIGHT BUTTON_RIGHT
176#define FLIPIT_UP BUTTON_SCROLL_UP
177#define FLIPIT_DOWN BUTTON_SCROLL_DOWN
178#define FLIPIT_QUIT BUTTON_POWER
179#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_LEFT)
180#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_RIGHT)
181#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_SCROLL_UP)
182#define FLIPIT_TOGGLE_PRE BUTTON_REW
183#define FLIPIT_TOGGLE (BUTTON_REW | BUTTON_REL)
184
185#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
186
187#define FLIPIT_LEFT BUTTON_LEFT
188#define FLIPIT_RIGHT BUTTON_RIGHT
189#define FLIPIT_UP BUTTON_UP
190#define FLIPIT_DOWN BUTTON_DOWN
191#define FLIPIT_QUIT BUTTON_BACK
192#define FLIPIT_SHUFFLE BUTTON_MENU
193#define FLIPIT_SOLVE BUTTON_VOL_UP
194#define FLIPIT_STEP_BY_STEP BUTTON_VOL_DOWN
195#define FLIPIT_TOGGLE BUTTON_SELECT
196
197#elif CONFIG_KEYPAD == MROBE100_PAD
198
199#define FLIPIT_LEFT BUTTON_LEFT
200#define FLIPIT_RIGHT BUTTON_RIGHT
201#define FLIPIT_UP BUTTON_UP
202#define FLIPIT_DOWN BUTTON_DOWN
203#define FLIPIT_QUIT BUTTON_POWER
204#define FLIPIT_SHUFFLE BUTTON_MENU
205#define FLIPIT_SOLVE BUTTON_PLAY
206#define FLIPIT_STEP_BY_STEP BUTTON_DISPLAY
207#define FLIPIT_TOGGLE BUTTON_SELECT
208
209#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
210
211#define FLIPIT_LEFT BUTTON_RC_REW
212#define FLIPIT_RIGHT BUTTON_RC_FF
213#define FLIPIT_UP BUTTON_RC_VOL_UP
214#define FLIPIT_DOWN BUTTON_RC_VOL_DOWN
215#define FLIPIT_QUIT BUTTON_RC_REC
216#define FLIPIT_SHUFFLE BUTTON_RC_MODE
217#define FLIPIT_SOLVE_PRE BUTTON_RC_MENU
218#define FLIPIT_SOLVE (BUTTON_RC_MENU|BUTTON_REPEAT)
219#define FLIPIT_STEP_PRE BUTTON_RC_MENU
220#define FLIPIT_STEP_BY_STEP (BUTTON_RC_MENU|BUTTON_REL)
221#define FLIPIT_TOGGLE BUTTON_RC_PLAY
222
223#define FLIPIT_RC_QUIT BUTTON_REC
224
225#elif CONFIG_KEYPAD == COWON_D2_PAD
226
227#define FLIPIT_QUIT BUTTON_POWER
228
229#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
230
231#define FLIPIT_LEFT BUTTON_LEFT
232#define FLIPIT_RIGHT BUTTON_RIGHT
233#define FLIPIT_UP BUTTON_UP
234#define FLIPIT_DOWN BUTTON_DOWN
235#define FLIPIT_QUIT BUTTON_BACK
236#define FLIPIT_SHUFFLE BUTTON_CUSTOM
237#define FLIPIT_SOLVE BUTTON_PLAY
238#define FLIPIT_STEP_BY_STEP BUTTON_MENU
239#define FLIPIT_TOGGLE BUTTON_SELECT
240
241#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD
242#define FLIPIT_LEFT BUTTON_BACK
243#define FLIPIT_RIGHT BUTTON_MENU
244#define FLIPIT_UP BUTTON_UP
245#define FLIPIT_DOWN BUTTON_DOWN
246#define FLIPIT_NEXT BUTTON_VOL_UP
247#define FLIPIT_PREV BUTTON_VOL_DOWN
248#define FLIPIT_QUIT BUTTON_POWER
249#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_BACK)
250#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_DOWN)
251#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_MENU)
252#define FLIPIT_TOGGLE_PRE BUTTON_PLAY
253#define FLIPIT_TOGGLE (BUTTON_PLAY | BUTTON_REL)
254
255#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
256
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_POWER
262#define FLIPIT_SHUFFLE BUTTON_MENU
263#define FLIPIT_SOLVE BUTTON_VIEW
264#define FLIPIT_STEP_BY_STEP BUTTON_PLAYLIST
265#define FLIPIT_TOGGLE BUTTON_SELECT
266
267#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
268
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_NEXT
277#define FLIPIT_TOGGLE BUTTON_PLAY
278
279#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
280
281#define FLIPIT_LEFT BUTTON_PREV
282#define FLIPIT_RIGHT BUTTON_NEXT
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_RIGHT
288#define FLIPIT_STEP_BY_STEP BUTTON_LEFT
289#define FLIPIT_TOGGLE BUTTON_PLAY
290
291#elif CONFIG_KEYPAD == ONDAVX747_PAD || CONFIG_KEYPAD == MROBE500_PAD
292
293#define FLIPIT_QUIT BUTTON_POWER
294
295#elif CONFIG_KEYPAD == ONDAVX777_PAD
296
297#define FLIPIT_QUIT BUTTON_POWER
298
299#elif (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) || \
300 (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD)
301
302#define FLIPIT_LEFT BUTTON_LEFT
303#define FLIPIT_RIGHT BUTTON_RIGHT
304#define FLIPIT_UP BUTTON_UP
305#define FLIPIT_DOWN BUTTON_DOWN
306#define FLIPIT_QUIT (BUTTON_REW|BUTTON_REPEAT)
307#define FLIPIT_SHUFFLE (BUTTON_REW|BUTTON_REL)
308#define FLIPIT_SOLVE (BUTTON_FFWD|BUTTON_REPEAT)
309#define FLIPIT_STEP_BY_STEP (BUTTON_FFWD|BUTTON_REL)
310#define FLIPIT_TOGGLE BUTTON_PLAY
311
312#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
313
314#define FLIPIT_LEFT BUTTON_PREV
315#define FLIPIT_RIGHT BUTTON_NEXT
316#define FLIPIT_UP BUTTON_UP
317#define FLIPIT_DOWN BUTTON_DOWN
318#define FLIPIT_QUIT BUTTON_REC
319#define FLIPIT_SHUFFLE BUTTON_PLAY
320#define FLIPIT_SOLVE BUTTON_MENU
321#define FLIPIT_STEP_BY_STEP BUTTON_CANCEL
322#define FLIPIT_TOGGLE BUTTON_OK
323
324#elif CONFIG_KEYPAD == MPIO_HD200_PAD
325
326#define FLIPIT_LEFT BUTTON_VOL_DOWN
327#define FLIPIT_RIGHT BUTTON_VOL_UP
328#define FLIPIT_UP BUTTON_REW
329#define FLIPIT_DOWN BUTTON_FF
330#define FLIPIT_QUIT (BUTTON_REC|BUTTON_PLAY)
331#define FLIPIT_SHUFFLE BUTTON_FUNC
332#define FLIPIT_SOLVE BUTTON_REC
333#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_REW)
334#define FLIPIT_TOGGLE (BUTTON_PLAY|BUTTON_FF)
335
336#elif CONFIG_KEYPAD == MPIO_HD300_PAD
337
338#define FLIPIT_LEFT BUTTON_REW
339#define FLIPIT_RIGHT BUTTON_FF
340#define FLIPIT_UP BUTTON_UP
341#define FLIPIT_DOWN BUTTON_DOWN
342#define FLIPIT_QUIT (BUTTON_MENU|BUTTON_REPEAT)
343#define FLIPIT_SHUFFLE BUTTON_PLAY
344#define FLIPIT_SOLVE BUTTON_MENU
345#define FLIPIT_STEP_BY_STEP BUTTON_REC
346#define FLIPIT_TOGGLE BUTTON_ENTER
347
348#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
349
350#define FLIPIT_LEFT BUTTON_LEFT
351#define FLIPIT_RIGHT BUTTON_RIGHT
352#define FLIPIT_UP BUTTON_UP
353#define FLIPIT_DOWN BUTTON_DOWN
354#define FLIPIT_QUIT BUTTON_POWER
355#define FLIPIT_SHUFFLE BUTTON_PLAYPAUSE
356#define FLIPIT_SOLVE BUTTON_BACK
357#define FLIPIT_STEP_BY_STEP BUTTON_BOTTOMLEFT
358#define FLIPIT_TOGGLE BUTTON_SELECT
359
360#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
361
362#define FLIPIT_LEFT BUTTON_LEFT
363#define FLIPIT_RIGHT BUTTON_RIGHT
364#define FLIPIT_UP BUTTON_UP
365#define FLIPIT_DOWN BUTTON_DOWN
366#define FLIPIT_QUIT BUTTON_POWER
367#define FLIPIT_SHUFFLE BUTTON_VOL_UP
368#define FLIPIT_SOLVE BUTTON_PREV
369#define FLIPIT_STEP_BY_STEP BUTTON_NEXT
370#define FLIPIT_TOGGLE BUTTON_SELECT
371
372#elif CONFIG_KEYPAD == SAMSUNG_YPR0_PAD
373
374#define FLIPIT_LEFT BUTTON_LEFT
375#define FLIPIT_RIGHT BUTTON_RIGHT
376#define FLIPIT_UP BUTTON_UP
377#define FLIPIT_DOWN BUTTON_DOWN
378#define FLIPIT_QUIT BUTTON_BACK
379#define FLIPIT_SHUFFLE BUTTON_MENU
380#define FLIPIT_SOLVE BUTTON_USER
381#define FLIPIT_STEP_BY_STEP BUTTON_POWER
382#define FLIPIT_TOGGLE BUTTON_SELECT
383
384#elif CONFIG_KEYPAD == HM60X_PAD
385
386#define FLIPIT_LEFT BUTTON_LEFT
387#define FLIPIT_RIGHT BUTTON_RIGHT
388#define FLIPIT_UP BUTTON_UP
389#define FLIPIT_DOWN BUTTON_DOWN
390#define FLIPIT_QUIT BUTTON_POWER
391#define FLIPIT_SHUFFLE (BUTTON_UP|BUTTON_POWER)
392#define FLIPIT_SOLVE (BUTTON_DOWN|BUTTON_POWER)
393#define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_POWER)
394#define FLIPIT_TOGGLE BUTTON_SELECT
395
396#elif CONFIG_KEYPAD == HM801_PAD
397
398#define FLIPIT_LEFT BUTTON_LEFT
399#define FLIPIT_RIGHT BUTTON_RIGHT
400#define FLIPIT_UP BUTTON_UP
401#define FLIPIT_DOWN BUTTON_DOWN
402#define FLIPIT_QUIT BUTTON_POWER
403#define FLIPIT_SHUFFLE BUTTON_PREV
404#define FLIPIT_SOLVE BUTTON_NEXT
405#define FLIPIT_STEP_BY_STEP BUTTON_PLAY
406#define FLIPIT_TOGGLE BUTTON_SELECT
407
408#elif CONFIG_KEYPAD == DX50_PAD
409
410#define FLIPIT_LEFT BUTTON_LEFT
411#define FLIPIT_RIGHT BUTTON_RIGHT
412#define FLIPIT_UP BUTTON_VOL_UP
413#define FLIPIT_DOWN BUTTON_VOL_DOWN
414#define FLIPIT_QUIT (BUTTON_POWER|BUTTON_REL)
415#define FLIPIT_SHUFFLE (BUTTON_VOL_UP|BUTTON_POWER)
416#define FLIPIT_SOLVE (BUTTON_VOL_DOWN|BUTTON_POWER)
417#define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_POWER)
418#define FLIPIT_TOGGLE BUTTON_PLAY
419
420#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
421
422#define FLIPIT_QUIT BUTTON_POWER
423#define FLIPIT_TOGGLE BUTTON_MENU
424
425#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD
426
427#define FLIPIT_LEFT BUTTON_LEFT
428#define FLIPIT_RIGHT BUTTON_RIGHT
429#define FLIPIT_UP BUTTON_UP
430#define FLIPIT_DOWN BUTTON_DOWN
431#define FLIPIT_QUIT (BUTTON_POWER|BUTTON_REL)
432#define FLIPIT_SHUFFLE (BUTTON_VOLDOWN)
433#define FLIPIT_SOLVE (BUTTON_SELECT|BUTTON_VOLUP)
434#define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_VOLUP)
435#define FLIPIT_TOGGLE BUTTON_SELECT
436
437#elif CONFIG_KEYPAD == XDUOO_X3_PAD || CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD
438
439#define FLIPIT_LEFT BUTTON_PREV
440#define FLIPIT_RIGHT BUTTON_NEXT
441#define FLIPIT_UP BUTTON_HOME
442#define FLIPIT_DOWN BUTTON_OPTION
443#define FLIPIT_QUIT BUTTON_POWER
444#define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_PREV)
445#define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_NEXT)
446#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
447#define FLIPIT_TOGGLE BUTTON_PLAY
448
449#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD
450
451#define FLIPIT_LEFT BUTTON_PREV
452#define FLIPIT_RIGHT BUTTON_NEXT
453#define FLIPIT_UP BUTTON_HOME
454#define FLIPIT_DOWN BUTTON_OPTION
455#define FLIPIT_QUIT BUTTON_POWER
456#define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_PREV)
457#define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_NEXT)
458#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
459#define FLIPIT_TOGGLE BUTTON_PLAY
460
461#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
462
463#define FLIPIT_LEFT BUTTON_HOME
464#define FLIPIT_RIGHT BUTTON_VOL_DOWN
465#define FLIPIT_UP BUTTON_PREV
466#define FLIPIT_DOWN BUTTON_NEXT
467#define FLIPIT_QUIT BUTTON_POWER
468#define FLIPIT_SHUFFLE (BUTTON_POWER | BUTTON_PREV)
469#define FLIPIT_SOLVE (BUTTON_POWER | BUTTON_NEXT)
470#define FLIPIT_STEP_BY_STEP (BUTTON_POWER | BUTTON_PLAY)
471#define FLIPIT_TOGGLE BUTTON_PLAY
472
473#elif CONFIG_KEYPAD == EROSQ_PAD
474
475#define FLIPIT_LEFT BUTTON_SCROLL_BACK
476#define FLIPIT_RIGHT BUTTON_SCROLL_FWD
477#define FLIPIT_UP BUTTON_PREV
478#define FLIPIT_DOWN BUTTON_NEXT
479#define FLIPIT_QUIT BUTTON_POWER
480#define FLIPIT_SHUFFLE BUTTON_MENU
481#define FLIPIT_SOLVE BUTTON_VOL_DOWN
482#define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP
483#define FLIPIT_TOGGLE BUTTON_PLAY
484
485#elif CONFIG_KEYPAD == FIIO_M3K_PAD
486
487#define FLIPIT_LEFT BUTTON_LEFT
488#define FLIPIT_RIGHT BUTTON_RIGHT
489#define FLIPIT_UP BUTTON_UP
490#define FLIPIT_DOWN BUTTON_DOWN
491#define FLIPIT_QUIT BUTTON_POWER
492#define FLIPIT_SHUFFLE BUTTON_PLAY
493#define FLIPIT_SOLVE BUTTON_VOL_DOWN
494#define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP
495#define FLIPIT_TOGGLE BUTTON_SELECT
496
497#elif CONFIG_KEYPAD == SHANLING_Q1_PAD
498/* use touchscreen */
499
500#elif CONFIG_KEYPAD == SDL_PAD
501/* use touchscreen */
502#elif CONFIG_KEYPAD == MA_PAD
503
504#define FLIPIT_LEFT BUTTON_LEFT
505#define FLIPIT_RIGHT BUTTON_RIGHT
506#define FLIPIT_UP BUTTON_UP
507#define FLIPIT_DOWN BUTTON_DOWN
508#define FLIPIT_QUIT (BUTTON_BACK|BUTTON_REPEAT)
509#define FLIPIT_SHUFFLE BUTTON_MENU
510#define FLIPIT_SOLVE (BUTTON_MENU|BUTTON_REPEAT)
511#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_REPEAT)
512#define FLIPIT_TOGGLE BUTTON_PLAY
513
514#elif CONFIG_KEYPAD == RG_NANO_PAD
515
516#define FLIPIT_LEFT BUTTON_LEFT
517#define FLIPIT_RIGHT BUTTON_RIGHT
518#define FLIPIT_UP BUTTON_UP
519#define FLIPIT_DOWN BUTTON_DOWN
520#define FLIPIT_NEXT BUTTON_R
521#define FLIPIT_PREV BUTTON_L
522#define FLIPIT_QUIT BUTTON_START
523#define FLIPIT_SHUFFLE BUTTON_B
524#define FLIPIT_SOLVE BUTTON_X
525#define FLIPIT_STEP_BY_STEP BUTTON_Y
526#define FLIPIT_TOGGLE BUTTON_A
527
528#else
529#error No keymap defined!
530#endif
531
532#ifdef HAVE_TOUCHSCREEN
533#ifndef FLIPIT_LEFT
534#define FLIPIT_LEFT BUTTON_MIDLEFT
535#endif
536#ifndef FLIPIT_RIGHT
537#define FLIPIT_RIGHT BUTTON_MIDRIGHT
538#endif
539#ifndef FLIPIT_UP
540#define FLIPIT_UP BUTTON_TOPMIDDLE
541#endif
542#ifndef FLIPIT_DOWN
543#define FLIPIT_DOWN BUTTON_BOTTOMMIDDLE
544#endif
545#ifndef FLIPIT_QUIT
546#define FLIPIT_QUIT BUTTON_TOPLEFT
547#endif
548#ifndef FLIPIT_SHUFFLE
549#define FLIPIT_SHUFFLE BUTTON_TOPRIGHT
550#endif
551#ifndef FLIPIT_SOLVE
552#define FLIPIT_SOLVE BUTTON_BOTTOMLEFT
553#endif
554#ifndef FLIPIT_STEP_BY_STEP
555#define FLIPIT_STEP_BY_STEP BUTTON_BOTTOMRIGHT
556#endif
557#ifndef FLIPIT_TOGGLE
558#define FLIPIT_TOGGLE BUTTON_CENTER
559#endif
560#endif
561
562static int spots[20];
563static int toggle[20];
564static int cursor_pos, moves;
565
566#include "pluginbitmaps/flipit_cursor.h"
567#include "pluginbitmaps/flipit_tokens.h"
568
569#define PANEL_HEIGHT 12
570#define TK_WIDTH BMPWIDTH_flipit_cursor
571#define TK_HEIGHT BMPHEIGHT_flipit_cursor
572#define TK_SPACE MAX(0, MIN((LCD_WIDTH - 5*TK_WIDTH)/4, \
573 (LCD_HEIGHT - PANEL_HEIGHT - 4*TK_HEIGHT)/4))
574#define GRID_WIDTH (5*TK_WIDTH + 4*TK_SPACE)
575#define GRID_LEFT ((LCD_WIDTH - GRID_WIDTH)/2)
576#define GRID_HEIGHT (4*TK_HEIGHT + 4*TK_SPACE) /* includes grid-panel space */
577#define GRID_TOP MAX(0, ((LCD_HEIGHT - PANEL_HEIGHT - GRID_HEIGHT)/2))
578
579/* draw a spot at the coordinates (x,y), range of p is 0-19 */
580static void draw_spot(int p)
581{
582 rb->lcd_bitmap_part( flipit_tokens, 0, spots[p] * TK_HEIGHT,
583 STRIDE(SCREEN_MAIN, BMPWIDTH_flipit_tokens,
584 BMPHEIGHT_flipit_tokens),
585 GRID_LEFT + (p%5) * (TK_WIDTH+TK_SPACE),
586 GRID_TOP + (p/5) * (TK_HEIGHT+TK_SPACE),
587 TK_WIDTH, TK_HEIGHT );
588}
589
590/* draw the cursor at the current cursor position */
591static void draw_cursor(void)
592{
593#ifdef HAVE_LCD_COLOR
594 rb->lcd_bitmap_transparent( flipit_cursor,
595 GRID_LEFT + (cursor_pos%5) * (TK_WIDTH+TK_SPACE),
596 GRID_TOP + (cursor_pos/5) * (TK_HEIGHT+TK_SPACE),
597 TK_WIDTH, TK_HEIGHT );
598#else
599 rb->lcd_set_drawmode(DRMODE_FG);
600 rb->lcd_mono_bitmap( flipit_cursor,
601 GRID_LEFT + (cursor_pos%5) * (TK_WIDTH+TK_SPACE),
602 GRID_TOP + (cursor_pos/5) * (TK_HEIGHT+TK_SPACE),
603 TK_WIDTH, TK_HEIGHT );
604 rb->lcd_set_drawmode(DRMODE_SOLID);
605#endif
606}
607
608/* draw the info panel ... duh */
609static void draw_info_panel(void)
610{
611 char s[32];
612
613 rb->lcd_set_drawmode( DRMODE_SOLID|DRMODE_INVERSEVID );
614 rb->lcd_fillrect( GRID_LEFT, GRID_TOP + 4*(TK_HEIGHT+TK_SPACE),
615 GRID_WIDTH, PANEL_HEIGHT );
616 rb->lcd_set_drawmode( DRMODE_SOLID );
617 rb->lcd_drawrect( GRID_LEFT, GRID_TOP + 4*(TK_HEIGHT+TK_SPACE),
618 GRID_WIDTH, PANEL_HEIGHT );
619
620 rb->snprintf( s, sizeof(s), "Flips: %d", moves );
621 rb->lcd_putsxy( (LCD_WIDTH - rb->lcd_getstringsize(s, NULL, NULL)) / 2,
622 GRID_TOP + 4*(TK_HEIGHT+TK_SPACE) + 2, s );
623}
624
625/* clear the cursor where it is */
626static inline void clear_cursor(void)
627{
628 draw_spot( cursor_pos );
629}
630
631/* check if the puzzle is finished */
632static bool flipit_finished(void)
633{
634 int i;
635 for (i=0; i<20; i++)
636 if (!spots[i])
637 return false;
638 clear_cursor();
639 return true;
640}
641
642/* draws the toggled spots */
643static void flipit_toggle(void)
644{
645 spots[cursor_pos] = 1-spots[cursor_pos];
646 toggle[cursor_pos] = 1-toggle[cursor_pos];
647 draw_spot(cursor_pos);
648 if (cursor_pos%5 > 0) {
649 spots[cursor_pos-1] = 1-spots[cursor_pos-1];
650 draw_spot(cursor_pos-1);
651 }
652 if (cursor_pos%5 < 4) {
653 spots[cursor_pos+1] = 1-spots[cursor_pos+1];
654 draw_spot(cursor_pos+1);
655 }
656 if (cursor_pos/5 > 0) {
657 spots[cursor_pos-5] = 1-spots[cursor_pos-5];
658 draw_spot(cursor_pos-5);
659 }
660 if (cursor_pos/5 < 3) {
661 spots[cursor_pos+5] = 1-spots[cursor_pos+5];
662 draw_spot(cursor_pos+5);
663 }
664 moves++;
665
666 draw_info_panel();
667
668 if (flipit_finished())
669 clear_cursor();
670}
671
672/* move the cursor in any direction */
673static void move_cursor(int x, int y)
674{
675 if (!(flipit_finished())) {
676 clear_cursor();
677 cursor_pos = ( x + 5 + cursor_pos%5 )%5
678 + ( ( y + 4 + cursor_pos/5 )%4 )*5;
679 draw_cursor();
680 }
681 rb->lcd_update();
682}
683
684/* initialize the board */
685static void flipit_init(void)
686{
687 int i;
688
689 rb->lcd_clear_display();
690 for (i=0; i<20; i++) {
691 spots[i]=1;
692 toggle[i]=1;
693 draw_spot(i);
694 }
695 rb->lcd_update();
696
697 for (i=0; i<20; i++) {
698 cursor_pos = (rb->rand() % 20);
699 flipit_toggle();
700 }
701
702 cursor_pos = 0;
703 draw_cursor();
704 moves = 0;
705 draw_info_panel();
706 rb->lcd_update();
707}
708
709/* the main game loop */
710static bool flipit_loop(void)
711{
712 int i;
713 int button;
714#if defined(FLIPIT_SOLVE_PRE) || defined(FLIPIT_STEP_PRE) || \
715 defined(FLIPIT_TOGGLE_PRE) || defined(FLIPIT_UP_PRE)
716 int lastbutton = BUTTON_NONE;
717#endif
718
719 flipit_init();
720 while(true) {
721 button = rb->button_get(true);
722 switch (button) {
723#ifdef FLIPIT_RC_QUIT
724 case FLIPIT_RC_QUIT:
725#endif
726 case FLIPIT_QUIT:
727 /* get out of here */
728 return PLUGIN_OK;
729
730 case FLIPIT_SHUFFLE:
731 /* mix up the pieces */
732 flipit_init();
733 break;
734
735 case FLIPIT_SOLVE:
736#ifdef FLIPIT_SOLVE_PRE
737 if (lastbutton != FLIPIT_SOLVE_PRE)
738 break;
739#endif
740 /* solve the puzzle */
741 if (!flipit_finished()) {
742 for (i=0; i<20; i++)
743 if (!toggle[i]) {
744 clear_cursor();
745 cursor_pos = i;
746 flipit_toggle();
747 draw_cursor();
748 rb->lcd_update();
749 rb->sleep(HZ*2/3);
750 }
751 }
752 break;
753
754 case FLIPIT_STEP_BY_STEP:
755#ifdef FLIPIT_STEP_PRE
756 if (lastbutton != FLIPIT_STEP_PRE)
757 break;
758#endif
759 if (!flipit_finished()) {
760 for (i=0; i<20; i++)
761 if (!toggle[i]) {
762 clear_cursor();
763 cursor_pos = i;
764 flipit_toggle();
765 draw_cursor();
766 rb->lcd_update();
767 break;
768 }
769 }
770 break;
771
772 case FLIPIT_TOGGLE:
773#ifdef FLIPIT_TOGGLE_PRE
774 if (lastbutton != FLIPIT_TOGGLE_PRE)
775 break;
776#endif
777 /* toggle the pieces */
778 if (!flipit_finished()) {
779 flipit_toggle();
780 draw_cursor();
781 rb->lcd_update();
782 }
783 break;
784
785 case FLIPIT_LEFT:
786 move_cursor(-1, 0);
787 break;
788
789 case FLIPIT_RIGHT:
790 move_cursor(1, 0);
791 break;
792 /*move cursor though the entire field*/
793#ifdef FLIPIT_SCROLLWHEEL
794 case FLIPIT_PREV:
795 case FLIPIT_PREV|BUTTON_REPEAT:
796 if ((cursor_pos)%5 == 0) {
797 move_cursor(-1, -1);
798 }
799 else {
800 move_cursor(-1, 0);
801 }
802 break;
803
804 case FLIPIT_NEXT:
805 case FLIPIT_NEXT|BUTTON_REPEAT:
806 if ((cursor_pos+1)%5 == 0) {
807 move_cursor(1, 1);
808 }
809 else {
810 move_cursor(1, 0);
811 }
812 break;
813#endif
814 case FLIPIT_UP:
815#ifdef FLIPIT_UP_PRE
816 if (lastbutton != FLIPIT_UP_PRE)
817 break;
818#endif
819 move_cursor(0, -1);
820 break;
821
822 case FLIPIT_DOWN:
823 move_cursor(0, 1);
824 break;
825
826 default:
827 if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
828 return PLUGIN_USB_CONNECTED;
829 break;
830 }
831#if defined(FLIPIT_SOLVE_PRE) || defined(FLIPIT_STEP_PRE) || \
832 defined(FLIPIT_TOGGLE_PRE) || defined(FLIPIT_UP_PRE)
833 if (button != BUTTON_NONE)
834 lastbutton = button;
835#endif
836 }
837}
838
839/* called function from outside */
840enum plugin_status plugin_start(const void* parameter)
841{
842 int i, rc;
843
844 (void)parameter;
845
846#ifdef HAVE_LCD_COLOR
847 rb->lcd_set_background(LCD_WHITE);
848 rb->lcd_set_foreground(LCD_BLACK);
849#endif
850
851#if LCD_DEPTH > 1
852 rb->lcd_set_backdrop(NULL);
853#endif
854
855 rb->splash(HZ, "FlipIt!");
856
857 /* print instructions */
858 rb->lcd_clear_display();
859 rb->lcd_setfont(FONT_SYSFIXED);
860#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
861 (CONFIG_KEYPAD == IRIVER_H300_PAD)
862 rb->lcd_putsxy(2, 8, "[STOP] to stop");
863 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
864 rb->lcd_putsxy(2, 28, "[MODE] shuffle");
865 rb->lcd_putsxy(2, 38, "[PLAY] solution");
866 rb->lcd_putsxy(2, 48, "[REC] step by step");
867#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
868 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
869 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
870 rb->lcd_putsxy(2, 8, "Long [SELECT] to stop");
871 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
872 rb->lcd_putsxy(2, 28, "[S-LEFT] shuffle");
873 rb->lcd_putsxy(2, 38, "[S-PLAY] solution");
874 rb->lcd_putsxy(2, 48, "[S-RIGHT] step by step");
875#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
876 rb->lcd_putsxy(2, 8, "[POWER] to stop");
877 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
878 rb->lcd_putsxy(2, 28, "[REC] shuffle");
879 rb->lcd_putsxy(2, 38, "[PLAY..] solution");
880 rb->lcd_putsxy(2, 48, "[PLAY] step by step");
881#elif CONFIG_KEYPAD == GIGABEAT_PAD
882 rb->lcd_putsxy(2, 8, "[POWER] to stop");
883 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
884 rb->lcd_putsxy(2, 28, "[MENU] shuffle");
885 rb->lcd_putsxy(2, 38, "[VOL+] solution");
886 rb->lcd_putsxy(2, 48, "[VOL-] step by step");
887#elif CONFIG_KEYPAD == IRIVER_H10_PAD
888 rb->lcd_putsxy(2, 8, "[POWER] to stop");
889 rb->lcd_putsxy(2, 18, "[REW] toggle");
890 rb->lcd_putsxy(2, 28, "[PL-LEFT] shuffle");
891 rb->lcd_putsxy(2, 38, "[PL-RIGHT] solution");
892 rb->lcd_putsxy(2, 48, "[PL-UP] step by step");
893#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
894 rb->lcd_putsxy(2, 8, "[BACK] to stop");
895 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
896 rb->lcd_putsxy(2, 28, "[MENU] shuffle");
897 rb->lcd_putsxy(2, 38, "[VOL+] solution");
898 rb->lcd_putsxy(2, 48, "[VOL-] step by step");
899#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
900 (CONFIG_KEYPAD == SANSA_C200_PAD)
901 rb->lcd_putsxy(2, 8, "[POWER] to stop");
902 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
903 rb->lcd_putsxy(2, 28, "[REC-LEFT] shuffle");
904 rb->lcd_putsxy(2, 38, "[REC-RIGHT] solution");
905 rb->lcd_putsxy(2, 48, "[REC-SEL] step by step");
906#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
907 rb->lcd_putsxy(2, 8, "[REC] to stop");
908 rb->lcd_putsxy(2, 18, "[PLAY] toggle");
909 rb->lcd_putsxy(2, 28, "[MODE] shuffle");
910 rb->lcd_putsxy(2, 38, "[MENU..] solution");
911 rb->lcd_putsxy(2, 48, "[MENU] step by step");
912#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
913 rb->lcd_putsxy(2, 8, "[POWER] to stop");
914 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
915 rb->lcd_putsxy(2, 28, "[VOL+] shuffle");
916 rb->lcd_putsxy(2, 38, "[PREV] solution");
917 rb->lcd_putsxy(2, 48, "[NEXT] step by step");
918#elif (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) || \
919 (CONFIG_KEYPAD == SAMSUNG_YH820_PAD)
920 rb->lcd_putsxy(2, 8, "Long [REW] to stop");
921 rb->lcd_putsxy(2, 18, "[PLAY] toggle");
922 rb->lcd_putsxy(2, 28, "[REW] shuffle");
923 rb->lcd_putsxy(2, 38, "Long [FFWD] solution");
924 rb->lcd_putsxy(2, 48, "[FFWD] step by step");
925#endif
926
927#ifdef HAVE_TOUCHSCREEN
928 rb->lcd_putsxy(2, 8, "[BOTTOMLEFT] to stop");
929 rb->lcd_putsxy(2, 18, "[CENTRE] toggle");
930 rb->lcd_putsxy(2, 28, "[TOPRIGHT] shuffle");
931 rb->lcd_putsxy(2, 38, "[BOTTOMLEFT] solution");
932 rb->lcd_putsxy(2, 48, "[BOTTOMRIGHT] step by step");
933#endif
934
935 rb->lcd_update();
936
937 rb->button_get_w_tmo(HZ*3);
938
939 rb->lcd_clear_display();
940 draw_info_panel();
941 for (i=0; i<20; i++) {
942 spots[i]=1;
943 draw_spot(i);
944 }
945 rb->lcd_update();
946 rb->sleep(HZ*3/2);
947 rb->srand(*rb->current_tick);
948
949 rc = flipit_loop();
950 return rc;
951}