A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
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 == 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}