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.

at master 951 lines 32 kB view raw
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}