fork
Configure Feed
Select the types of activity you want to include in your feed.
A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
fork
Configure Feed
Select the types of activity you want to include in your feed.
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 == CREATIVE_ZENXFI3_PAD
230#define FLIPIT_LEFT BUTTON_BACK
231#define FLIPIT_RIGHT BUTTON_MENU
232#define FLIPIT_UP BUTTON_UP
233#define FLIPIT_DOWN BUTTON_DOWN
234#define FLIPIT_NEXT BUTTON_VOL_UP
235#define FLIPIT_PREV BUTTON_VOL_DOWN
236#define FLIPIT_QUIT BUTTON_POWER
237#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_BACK)
238#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_DOWN)
239#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_MENU)
240#define FLIPIT_TOGGLE_PRE BUTTON_PLAY
241#define FLIPIT_TOGGLE (BUTTON_PLAY | BUTTON_REL)
242
243#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
244
245#define FLIPIT_LEFT BUTTON_LEFT
246#define FLIPIT_RIGHT BUTTON_RIGHT
247#define FLIPIT_UP BUTTON_UP
248#define FLIPIT_DOWN BUTTON_DOWN
249#define FLIPIT_QUIT BUTTON_POWER
250#define FLIPIT_SHUFFLE BUTTON_MENU
251#define FLIPIT_SOLVE BUTTON_VIEW
252#define FLIPIT_STEP_BY_STEP BUTTON_PLAYLIST
253#define FLIPIT_TOGGLE BUTTON_SELECT
254
255#elif CONFIG_KEYPAD == PHILIPS_HDD6330_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_NEXT
265#define FLIPIT_TOGGLE BUTTON_PLAY
266
267#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
268
269#define FLIPIT_LEFT BUTTON_PREV
270#define FLIPIT_RIGHT BUTTON_NEXT
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_RIGHT
276#define FLIPIT_STEP_BY_STEP BUTTON_LEFT
277#define FLIPIT_TOGGLE BUTTON_PLAY
278
279#elif CONFIG_KEYPAD == ONDAVX747_PAD || CONFIG_KEYPAD == MROBE500_PAD
280
281#define FLIPIT_QUIT BUTTON_POWER
282
283#elif CONFIG_KEYPAD == ONDAVX777_PAD
284
285#define FLIPIT_QUIT BUTTON_POWER
286
287#elif (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) || \
288 (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD)
289
290#define FLIPIT_LEFT BUTTON_LEFT
291#define FLIPIT_RIGHT BUTTON_RIGHT
292#define FLIPIT_UP BUTTON_UP
293#define FLIPIT_DOWN BUTTON_DOWN
294#define FLIPIT_QUIT (BUTTON_REW|BUTTON_REPEAT)
295#define FLIPIT_SHUFFLE (BUTTON_REW|BUTTON_REL)
296#define FLIPIT_SOLVE (BUTTON_FFWD|BUTTON_REPEAT)
297#define FLIPIT_STEP_BY_STEP (BUTTON_FFWD|BUTTON_REL)
298#define FLIPIT_TOGGLE BUTTON_PLAY
299
300#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
301
302#define FLIPIT_LEFT BUTTON_PREV
303#define FLIPIT_RIGHT BUTTON_NEXT
304#define FLIPIT_UP BUTTON_UP
305#define FLIPIT_DOWN BUTTON_DOWN
306#define FLIPIT_QUIT BUTTON_REC
307#define FLIPIT_SHUFFLE BUTTON_PLAY
308#define FLIPIT_SOLVE BUTTON_MENU
309#define FLIPIT_STEP_BY_STEP BUTTON_CANCEL
310#define FLIPIT_TOGGLE BUTTON_OK
311
312#elif CONFIG_KEYPAD == MPIO_HD200_PAD
313
314#define FLIPIT_LEFT BUTTON_VOL_DOWN
315#define FLIPIT_RIGHT BUTTON_VOL_UP
316#define FLIPIT_UP BUTTON_REW
317#define FLIPIT_DOWN BUTTON_FF
318#define FLIPIT_QUIT (BUTTON_REC|BUTTON_PLAY)
319#define FLIPIT_SHUFFLE BUTTON_FUNC
320#define FLIPIT_SOLVE BUTTON_REC
321#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_REW)
322#define FLIPIT_TOGGLE (BUTTON_PLAY|BUTTON_FF)
323
324#elif CONFIG_KEYPAD == MPIO_HD300_PAD
325
326#define FLIPIT_LEFT BUTTON_REW
327#define FLIPIT_RIGHT BUTTON_FF
328#define FLIPIT_UP BUTTON_UP
329#define FLIPIT_DOWN BUTTON_DOWN
330#define FLIPIT_QUIT (BUTTON_MENU|BUTTON_REPEAT)
331#define FLIPIT_SHUFFLE BUTTON_PLAY
332#define FLIPIT_SOLVE BUTTON_MENU
333#define FLIPIT_STEP_BY_STEP BUTTON_REC
334#define FLIPIT_TOGGLE BUTTON_ENTER
335
336#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
337
338#define FLIPIT_LEFT BUTTON_LEFT
339#define FLIPIT_RIGHT BUTTON_RIGHT
340#define FLIPIT_UP BUTTON_UP
341#define FLIPIT_DOWN BUTTON_DOWN
342#define FLIPIT_QUIT BUTTON_POWER
343#define FLIPIT_SHUFFLE BUTTON_PLAYPAUSE
344#define FLIPIT_SOLVE BUTTON_BACK
345#define FLIPIT_STEP_BY_STEP BUTTON_BOTTOMLEFT
346#define FLIPIT_TOGGLE BUTTON_SELECT
347
348#elif CONFIG_KEYPAD == SANSA_CONNECT_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_VOL_UP
356#define FLIPIT_SOLVE BUTTON_PREV
357#define FLIPIT_STEP_BY_STEP BUTTON_NEXT
358#define FLIPIT_TOGGLE BUTTON_SELECT
359
360#elif CONFIG_KEYPAD == SAMSUNG_YPR0_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_BACK
367#define FLIPIT_SHUFFLE BUTTON_MENU
368#define FLIPIT_SOLVE BUTTON_USER
369#define FLIPIT_STEP_BY_STEP BUTTON_POWER
370#define FLIPIT_TOGGLE BUTTON_SELECT
371
372#elif CONFIG_KEYPAD == HM60X_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_POWER
379#define FLIPIT_SHUFFLE (BUTTON_UP|BUTTON_POWER)
380#define FLIPIT_SOLVE (BUTTON_DOWN|BUTTON_POWER)
381#define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_POWER)
382#define FLIPIT_TOGGLE BUTTON_SELECT
383
384#elif CONFIG_KEYPAD == HM801_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_PREV
392#define FLIPIT_SOLVE BUTTON_NEXT
393#define FLIPIT_STEP_BY_STEP BUTTON_PLAY
394#define FLIPIT_TOGGLE BUTTON_SELECT
395
396#elif CONFIG_KEYPAD == DX50_PAD
397
398#define FLIPIT_LEFT BUTTON_LEFT
399#define FLIPIT_RIGHT BUTTON_RIGHT
400#define FLIPIT_UP BUTTON_VOL_UP
401#define FLIPIT_DOWN BUTTON_VOL_DOWN
402#define FLIPIT_QUIT (BUTTON_POWER|BUTTON_REL)
403#define FLIPIT_SHUFFLE (BUTTON_VOL_UP|BUTTON_POWER)
404#define FLIPIT_SOLVE (BUTTON_VOL_DOWN|BUTTON_POWER)
405#define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_POWER)
406#define FLIPIT_TOGGLE BUTTON_PLAY
407
408#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
409
410#define FLIPIT_QUIT BUTTON_POWER
411#define FLIPIT_TOGGLE BUTTON_MENU
412
413#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD
414
415#define FLIPIT_LEFT BUTTON_LEFT
416#define FLIPIT_RIGHT BUTTON_RIGHT
417#define FLIPIT_UP BUTTON_UP
418#define FLIPIT_DOWN BUTTON_DOWN
419#define FLIPIT_QUIT (BUTTON_POWER|BUTTON_REL)
420#define FLIPIT_SHUFFLE (BUTTON_VOLDOWN)
421#define FLIPIT_SOLVE (BUTTON_SELECT|BUTTON_VOLUP)
422#define FLIPIT_STEP_BY_STEP (BUTTON_LEFT|BUTTON_VOLUP)
423#define FLIPIT_TOGGLE BUTTON_SELECT
424
425#elif CONFIG_KEYPAD == XDUOO_X3_PAD || CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD
426
427#define FLIPIT_LEFT BUTTON_PREV
428#define FLIPIT_RIGHT BUTTON_NEXT
429#define FLIPIT_UP BUTTON_HOME
430#define FLIPIT_DOWN BUTTON_OPTION
431#define FLIPIT_QUIT BUTTON_POWER
432#define FLIPIT_SHUFFLE (BUTTON_HOME | BUTTON_PREV)
433#define FLIPIT_SOLVE (BUTTON_HOME | BUTTON_NEXT)
434#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
435#define FLIPIT_TOGGLE BUTTON_PLAY
436
437#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_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 == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
450
451#define FLIPIT_LEFT BUTTON_HOME
452#define FLIPIT_RIGHT BUTTON_VOL_DOWN
453#define FLIPIT_UP BUTTON_PREV
454#define FLIPIT_DOWN BUTTON_NEXT
455#define FLIPIT_QUIT BUTTON_POWER
456#define FLIPIT_SHUFFLE (BUTTON_POWER | BUTTON_PREV)
457#define FLIPIT_SOLVE (BUTTON_POWER | BUTTON_NEXT)
458#define FLIPIT_STEP_BY_STEP (BUTTON_POWER | BUTTON_PLAY)
459#define FLIPIT_TOGGLE BUTTON_PLAY
460
461#elif CONFIG_KEYPAD == EROSQ_PAD
462
463#define FLIPIT_LEFT BUTTON_SCROLL_BACK
464#define FLIPIT_RIGHT BUTTON_SCROLL_FWD
465#define FLIPIT_UP BUTTON_PREV
466#define FLIPIT_DOWN BUTTON_NEXT
467#define FLIPIT_QUIT BUTTON_POWER
468#define FLIPIT_SHUFFLE BUTTON_MENU
469#define FLIPIT_SOLVE BUTTON_VOL_DOWN
470#define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP
471#define FLIPIT_TOGGLE BUTTON_PLAY
472
473#elif CONFIG_KEYPAD == FIIO_M3K_PAD
474
475#define FLIPIT_LEFT BUTTON_LEFT
476#define FLIPIT_RIGHT BUTTON_RIGHT
477#define FLIPIT_UP BUTTON_UP
478#define FLIPIT_DOWN BUTTON_DOWN
479#define FLIPIT_QUIT BUTTON_POWER
480#define FLIPIT_SHUFFLE BUTTON_PLAY
481#define FLIPIT_SOLVE BUTTON_VOL_DOWN
482#define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP
483#define FLIPIT_TOGGLE BUTTON_SELECT
484
485#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
486/* use touchscreen */
487
488#elif CONFIG_KEYPAD == SDL_PAD
489/* use touchscreen */
490#elif CONFIG_KEYPAD == MA_PAD
491
492#define FLIPIT_LEFT BUTTON_LEFT
493#define FLIPIT_RIGHT BUTTON_RIGHT
494#define FLIPIT_UP BUTTON_UP
495#define FLIPIT_DOWN BUTTON_DOWN
496#define FLIPIT_QUIT (BUTTON_BACK|BUTTON_REPEAT)
497#define FLIPIT_SHUFFLE BUTTON_MENU
498#define FLIPIT_SOLVE (BUTTON_MENU|BUTTON_REPEAT)
499#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY|BUTTON_REPEAT)
500#define FLIPIT_TOGGLE BUTTON_PLAY
501
502#elif CONFIG_KEYPAD == RG_NANO_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_NEXT BUTTON_R
509#define FLIPIT_PREV BUTTON_L
510#define FLIPIT_QUIT BUTTON_START
511#define FLIPIT_SHUFFLE BUTTON_B
512#define FLIPIT_SOLVE BUTTON_X
513#define FLIPIT_STEP_BY_STEP BUTTON_Y
514#define FLIPIT_TOGGLE BUTTON_A
515
516#elif CONFIG_KEYPAD == CTRU_PAD
517
518#define FLIPIT_LEFT BUTTON_LEFT
519#define FLIPIT_RIGHT BUTTON_RIGHT
520#define FLIPIT_UP BUTTON_UP
521#define FLIPIT_DOWN BUTTON_DOWN
522#define FLIPIT_QUIT BUTTON_BACK
523#define FLIPIT_SHUFFLE BUTTON_MENU
524#define FLIPIT_SOLVE BUTTON_USER
525#define FLIPIT_STEP_BY_STEP BUTTON_POWER
526#define FLIPIT_TOGGLE BUTTON_SELECT
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 /* print instructions */
856 bool print_instructions = true;
857 rb->lcd_clear_display();
858 rb->lcd_setfont(FONT_SYSFIXED);
859#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
860 (CONFIG_KEYPAD == IRIVER_H300_PAD)
861 rb->lcd_putsxy(2, 8, "[STOP] to stop");
862 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
863 rb->lcd_putsxy(2, 28, "[MODE] shuffle");
864 rb->lcd_putsxy(2, 38, "[PLAY] solution");
865 rb->lcd_putsxy(2, 48, "[REC] step by step");
866#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
867 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
868 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
869 rb->lcd_putsxy(2, 8, "Long [SELECT] to stop");
870 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
871 rb->lcd_putsxy(2, 28, "[S-LEFT] shuffle");
872 rb->lcd_putsxy(2, 38, "[S-PLAY] solution");
873 rb->lcd_putsxy(2, 48, "[S-RIGHT] step by step");
874#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
875 rb->lcd_putsxy(2, 8, "[POWER] to stop");
876 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
877 rb->lcd_putsxy(2, 28, "[REC] shuffle");
878 rb->lcd_putsxy(2, 38, "[PLAY..] solution");
879 rb->lcd_putsxy(2, 48, "[PLAY] step by step");
880#elif CONFIG_KEYPAD == GIGABEAT_PAD
881 rb->lcd_putsxy(2, 8, "[POWER] to stop");
882 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
883 rb->lcd_putsxy(2, 28, "[MENU] shuffle");
884 rb->lcd_putsxy(2, 38, "[VOL+] solution");
885 rb->lcd_putsxy(2, 48, "[VOL-] step by step");
886#elif CONFIG_KEYPAD == IRIVER_H10_PAD
887 rb->lcd_putsxy(2, 8, "[POWER] to stop");
888 rb->lcd_putsxy(2, 18, "[REW] toggle");
889 rb->lcd_putsxy(2, 28, "[PL-LEFT] shuffle");
890 rb->lcd_putsxy(2, 38, "[PL-RIGHT] solution");
891 rb->lcd_putsxy(2, 48, "[PL-UP] step by step");
892#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
893 rb->lcd_putsxy(2, 8, "[BACK] to stop");
894 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
895 rb->lcd_putsxy(2, 28, "[MENU] shuffle");
896 rb->lcd_putsxy(2, 38, "[VOL+] solution");
897 rb->lcd_putsxy(2, 48, "[VOL-] step by step");
898#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
899 (CONFIG_KEYPAD == SANSA_C200_PAD)
900 rb->lcd_putsxy(2, 8, "[POWER] to stop");
901 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
902 rb->lcd_putsxy(2, 28, "[REC-LEFT] shuffle");
903 rb->lcd_putsxy(2, 38, "[REC-RIGHT] solution");
904 rb->lcd_putsxy(2, 48, "[REC-SEL] step by step");
905#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
906 rb->lcd_putsxy(2, 8, "[REC] to stop");
907 rb->lcd_putsxy(2, 18, "[PLAY] toggle");
908 rb->lcd_putsxy(2, 28, "[MODE] shuffle");
909 rb->lcd_putsxy(2, 38, "[MENU..] solution");
910 rb->lcd_putsxy(2, 48, "[MENU] step by step");
911#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
912 rb->lcd_putsxy(2, 8, "[POWER] to stop");
913 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
914 rb->lcd_putsxy(2, 28, "[VOL+] shuffle");
915 rb->lcd_putsxy(2, 38, "[PREV] solution");
916 rb->lcd_putsxy(2, 48, "[NEXT] step by step");
917#elif (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) || \
918 (CONFIG_KEYPAD == SAMSUNG_YH820_PAD)
919 rb->lcd_putsxy(2, 8, "Long [REW] to stop");
920 rb->lcd_putsxy(2, 18, "[PLAY] toggle");
921 rb->lcd_putsxy(2, 28, "[REW] shuffle");
922 rb->lcd_putsxy(2, 38, "Long [FFWD] solution");
923 rb->lcd_putsxy(2, 48, "[FFWD] step by step");
924#elif defined(HAVE_TOUCHSCREEN)
925 rb->lcd_putsxy(2, 8, "[BOTTOMLEFT] to stop");
926 rb->lcd_putsxy(2, 18, "[CENTRE] toggle");
927 rb->lcd_putsxy(2, 28, "[TOPRIGHT] shuffle");
928 rb->lcd_putsxy(2, 38, "[BOTTOMLEFT] solution");
929 rb->lcd_putsxy(2, 48, "[BOTTOMRIGHT] step by step");
930#else
931 print_instructions = false;
932#endif
933
934 if (print_instructions)
935 {
936 rb->lcd_update();
937 rb->button_get_w_tmo(HZ*3);
938 rb->lcd_clear_display();
939 }
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}