summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-10-16 00:40:40 +0000
committerJens Arnold <amiconn@rockbox.org>2006-10-16 00:40:40 +0000
commit50d275dc373826335aca3373dfa51957ec8e2ba7 (patch)
treea89d72da65c12b49f1c98d6f961a0d8499c0a57f /apps/plugins
parent634f1d6b591ca4f8779f19bc3df54eb632c44db6 (diff)
downloadrockbox-50d275dc373826335aca3373dfa51957ec8e2ba7.zip
rockbox-50d275dc373826335aca3373dfa51957ec8e2ba7.tar.gz
rockbox-50d275dc373826335aca3373dfa51957ec8e2ba7.tar.bz2
rockbox-50d275dc373826335aca3373dfa51957ec8e2ba7.tar.xz
FlipIt: Ported to archos Player :-)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11231 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/plugins/flipit.c231
2 files changed, 170 insertions, 63 deletions
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index b0e5f70..e0c97d6 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -6,6 +6,7 @@ cube.c
dict.c
favorites.c
firmware_flash.c
+flipit.c
logo.c
metronome.c
mosaique.c
@@ -48,7 +49,6 @@ brickmania.c
calculator.c
chip8.c
demystify.c
-flipit.c
jewels.c
minesweeper.c
oscilloscope.c
diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c
index 0b98788..0ee1026 100644
--- a/apps/plugins/flipit.c
+++ b/apps/plugins/flipit.c
@@ -17,48 +17,57 @@
*
****************************************************************************/
#include "plugin.h"
-#ifdef HAVE_LCD_BITMAP
PLUGIN_HEADER
/* variable button definitions */
#if CONFIG_KEYPAD == RECORDER_PAD
-#define FLIPIT_UP BUTTON_UP
-#define FLIPIT_DOWN BUTTON_DOWN
-#define FLIPIT_QUIT BUTTON_OFF
-#define FLIPIT_SHUFFLE BUTTON_F1
-#define FLIPIT_SOLVE BUTTON_F2
+#define FLIPIT_UP BUTTON_UP
+#define FLIPIT_DOWN BUTTON_DOWN
+#define FLIPIT_QUIT BUTTON_OFF
+#define FLIPIT_SHUFFLE BUTTON_F1
+#define FLIPIT_SOLVE BUTTON_F2
#define FLIPIT_STEP_BY_STEP BUTTON_F3
-#define FLIPIT_TOGGLE BUTTON_PLAY
+#define FLIPIT_TOGGLE BUTTON_PLAY
+
+#elif CONFIG_KEYPAD == PLAYER_PAD
+#define FLIPIT_UP_PRE BUTTON_ON
+#define FLIPIT_UP (BUTTON_ON | BUTTON_REL)
+#define FLIPIT_DOWN BUTTON_MENU
+#define FLIPIT_QUIT BUTTON_STOP
+#define FLIPIT_SHUFFLE (BUTTON_ON | BUTTON_LEFT)
+#define FLIPIT_SOLVE (BUTTON_ON | BUTTON_RIGHT)
+#define FLIPIT_STEP_BY_STEP (BUTTON_ON | BUTTON_PLAY)
+#define FLIPIT_TOGGLE BUTTON_PLAY
#elif CONFIG_KEYPAD == ONDIO_PAD
-#define FLIPIT_UP BUTTON_UP
-#define FLIPIT_DOWN BUTTON_DOWN
-#define FLIPIT_QUIT BUTTON_OFF
-#define FLIPIT_SHUFFLE (BUTTON_MENU | BUTTON_LEFT)
-#define FLIPIT_SOLVE (BUTTON_MENU | BUTTON_UP)
+#define FLIPIT_UP BUTTON_UP
+#define FLIPIT_DOWN BUTTON_DOWN
+#define FLIPIT_QUIT BUTTON_OFF
+#define FLIPIT_SHUFFLE (BUTTON_MENU | BUTTON_LEFT)
+#define FLIPIT_SOLVE (BUTTON_MENU | BUTTON_UP)
#define FLIPIT_STEP_BY_STEP (BUTTON_MENU | BUTTON_RIGHT)
-#define FLIPIT_TOGGLE_PRE BUTTON_MENU
-#define FLIPIT_TOGGLE (BUTTON_MENU | BUTTON_REL)
+#define FLIPIT_TOGGLE_PRE BUTTON_MENU
+#define FLIPIT_TOGGLE (BUTTON_MENU | BUTTON_REL)
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
(CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define FLIPIT_UP BUTTON_UP
-#define FLIPIT_DOWN BUTTON_DOWN
-#define FLIPIT_QUIT BUTTON_OFF
-#define FLIPIT_SHUFFLE BUTTON_MODE
-#define FLIPIT_SOLVE BUTTON_ON
+#define FLIPIT_UP BUTTON_UP
+#define FLIPIT_DOWN BUTTON_DOWN
+#define FLIPIT_QUIT BUTTON_OFF
+#define FLIPIT_SHUFFLE BUTTON_MODE
+#define FLIPIT_SOLVE BUTTON_ON
#define FLIPIT_STEP_BY_STEP BUTTON_REC
-#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
-#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
+#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
+#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
#define FLIPIT_RC_QUIT BUTTON_RC_STOP
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
(CONFIG_KEYPAD == IPOD_3G_PAD)
-#define FLIPIT_UP BUTTON_MENU
-#define FLIPIT_DOWN BUTTON_PLAY
+#define FLIPIT_UP BUTTON_MENU
+#define FLIPIT_DOWN BUTTON_PLAY
#define FLIPIT_QUIT (BUTTON_SELECT | BUTTON_MENU)
#define FLIPIT_SHUFFLE (BUTTON_SELECT | BUTTON_LEFT)
#define FLIPIT_SOLVE (BUTTON_SELECT | BUTTON_PLAY)
@@ -68,36 +77,36 @@ PLUGIN_HEADER
#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
-#define FLIPIT_UP BUTTON_UP
-#define FLIPIT_DOWN BUTTON_DOWN
-#define FLIPIT_QUIT BUTTON_POWER
-#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_LEFT)
-#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_RIGHT)
+#define FLIPIT_UP BUTTON_UP
+#define FLIPIT_DOWN BUTTON_DOWN
+#define FLIPIT_QUIT BUTTON_POWER
+#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_LEFT)
+#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_RIGHT)
#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_UP)
-#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
-#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
+#define FLIPIT_TOGGLE_PRE BUTTON_SELECT
+#define FLIPIT_TOGGLE (BUTTON_SELECT | BUTTON_REL)
#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
-#define FLIPIT_UP BUTTON_UP
-#define FLIPIT_DOWN BUTTON_DOWN
-#define FLIPIT_QUIT BUTTON_A
-#define FLIPIT_SHUFFLE (BUTTON_POWER | BUTTON_LEFT)
-#define FLIPIT_SOLVE (BUTTON_POWER | BUTTON_RIGHT)
+#define FLIPIT_UP BUTTON_UP
+#define FLIPIT_DOWN BUTTON_DOWN
+#define FLIPIT_QUIT BUTTON_A
+#define FLIPIT_SHUFFLE (BUTTON_POWER | BUTTON_LEFT)
+#define FLIPIT_SOLVE (BUTTON_POWER | BUTTON_RIGHT)
#define FLIPIT_STEP_BY_STEP (BUTTON_POWER | BUTTON_UP)
-#define FLIPIT_TOGGLE_PRE BUTTON_MENU
-#define FLIPIT_TOGGLE (BUTTON_MENU | BUTTON_REL)
+#define FLIPIT_TOGGLE_PRE BUTTON_MENU
+#define FLIPIT_TOGGLE (BUTTON_MENU | BUTTON_REL)
#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
-#define FLIPIT_UP BUTTON_SCROLL_UP
-#define FLIPIT_DOWN BUTTON_SCROLL_DOWN
-#define FLIPIT_QUIT BUTTON_POWER
-#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_LEFT)
-#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_RIGHT)
+#define FLIPIT_UP BUTTON_SCROLL_UP
+#define FLIPIT_DOWN BUTTON_SCROLL_DOWN
+#define FLIPIT_QUIT BUTTON_POWER
+#define FLIPIT_SHUFFLE (BUTTON_PLAY | BUTTON_LEFT)
+#define FLIPIT_SOLVE (BUTTON_PLAY | BUTTON_RIGHT)
#define FLIPIT_STEP_BY_STEP (BUTTON_PLAY | BUTTON_SCROLL_UP)
-#define FLIPIT_TOGGLE_PRE BUTTON_REW
-#define FLIPIT_TOGGLE (BUTTON_REW | BUTTON_REL)
+#define FLIPIT_TOGGLE_PRE BUTTON_REW
+#define FLIPIT_TOGGLE (BUTTON_REW | BUTTON_REL)
#endif
@@ -106,6 +115,8 @@ static int spots[20];
static int toggle[20];
static int cursor_pos, moves;
+#ifdef HAVE_LCD_BITMAP
+
#include "flipit_cursor.h"
#include "flipit_tokens.h"
@@ -146,12 +157,6 @@ static void draw_cursor(void)
#endif
}
-/* clear the cursor where it is */
-static inline void clear_cursor(void)
-{
- draw_spot( cursor_pos );
-}
-
/* draw the info panel ... duh */
static void draw_info_panel(void)
{
@@ -169,6 +174,86 @@ static void draw_info_panel(void)
GRID_TOP + 4*(TK_HEIGHT+TK_SPACE) + 2, s );
}
+#else /* HAVE_LCD_CHARCELLS */
+
+static const unsigned char tk_pat[4][7] = {
+ { 0x0e, 0x11, 0x0e, 0x00, 0x0e, 0x11, 0x0e }, /* white - white */
+ { 0x0e, 0x11, 0x0e, 0x00, 0x0e, 0x1f, 0x0e }, /* white - black */
+ { 0x0e, 0x1f, 0x0e, 0x00, 0x0e, 0x11, 0x0e }, /* black - white */
+ { 0x0e, 0x1f, 0x0e, 0x00, 0x0e, 0x1f, 0x0e } /* black - black */
+};
+
+static unsigned char cur_pat[7];
+static unsigned char gfx_chars[5];
+
+static void release_gfx(void)
+{
+ int i;
+
+ for (i = 0; i < 5; i++)
+ if (gfx_chars[i])
+ rb->lcd_unlock_pattern(gfx_chars[i]);
+}
+
+static bool init_gfx(void)
+{
+ int i;
+
+ for (i = 0; i < 5; i++) {
+ if ((gfx_chars[i] = rb->lcd_get_locked_pattern()) == 0) {
+ release_gfx();
+ return false;
+ }
+ }
+ for (i = 0; i < 4; i++)
+ rb->lcd_define_pattern(gfx_chars[i], tk_pat[i]);
+ return true;
+}
+
+/* draw a spot at the coordinates (x,y), range of p is 0-19 */
+static void draw_spot(int p)
+{
+ if ((p/5) & 1)
+ p -= 5;
+
+ rb->lcd_putc (p%5, p/10, gfx_chars[2*spots[p]+spots[p+5]]);
+}
+
+/* draw the cursor at the current cursor position */
+static void draw_cursor(void)
+{
+ if ((cursor_pos/5) & 1) {
+ rb->memcpy( cur_pat, tk_pat[2*spots[cursor_pos-5]+spots[cursor_pos]], 7 );
+ cur_pat[4] ^= 0x15;
+ cur_pat[6] ^= 0x11;
+ }
+ else {
+ rb->memcpy( cur_pat, tk_pat[2*spots[cursor_pos]+spots[cursor_pos+5]], 7 );
+ cur_pat[0] ^= 0x15;
+ cur_pat[2] ^= 0x11;
+ }
+ rb->lcd_define_pattern(gfx_chars[4], cur_pat);
+ rb->lcd_putc( cursor_pos%5, cursor_pos/10, gfx_chars[4] );
+}
+
+/* draw the info panel ... duh */
+static void draw_info_panel(void)
+{
+ char s[16];
+
+ rb->lcd_puts( 6, 0, "Flips" );
+ rb->snprintf( s, sizeof(s), "%d", moves );
+ rb->lcd_puts( 6, 1, s );
+}
+
+#endif /* LCD */
+
+/* clear the cursor where it is */
+static inline void clear_cursor(void)
+{
+ draw_spot( cursor_pos );
+}
+
/* check if the puzzle is finished */
static bool flipit_finished(void)
{
@@ -219,21 +304,25 @@ static void move_cursor(int x, int y)
+ ( ( y + 4 + cursor_pos/5 )%4 )*5;
draw_cursor();
}
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
}
/* initialize the board */
static void flipit_init(void)
{
int i;
+
rb->lcd_clear_display();
- moves = 0;
for (i=0; i<20; i++) {
spots[i]=1;
toggle[i]=1;
draw_spot(i);
}
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
for (i=0; i<20; i++) {
cursor_pos = (rb->rand() % 20);
flipit_toggle();
@@ -243,7 +332,9 @@ static void flipit_init(void)
draw_cursor();
moves = 0;
draw_info_panel();
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
}
/* the main game loop */
@@ -278,7 +369,9 @@ static bool flipit_loop(void)
cursor_pos = i;
flipit_toggle();
draw_cursor();
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
rb->sleep(HZ*2/3);
}
}
@@ -292,7 +385,9 @@ static bool flipit_loop(void)
cursor_pos = i;
flipit_toggle();
draw_cursor();
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
break;
}
}
@@ -307,7 +402,9 @@ static bool flipit_loop(void)
if (!flipit_finished()) {
flipit_toggle();
draw_cursor();
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
}
break;
@@ -320,6 +417,10 @@ static bool flipit_loop(void)
break;
case FLIPIT_UP:
+#ifdef FLIPIT_UP_PRE
+ if (lastbutton != FLIPIT_UP_PRE)
+ break;
+#endif
move_cursor(0, -1);
break;
@@ -340,7 +441,10 @@ static bool flipit_loop(void)
/* called function from outside */
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
- int w, h, i;
+ int i, rc;
+#ifdef HAVE_LCD_BITMAP
+ int w, h;
+#endif
(void)parameter;
rb = api;
@@ -349,15 +453,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
rb->lcd_set_background(LCD_WHITE);
#endif
- /* print title */
- rb->lcd_getstringsize("FlipIt!", &w, &h);
- w = (w+1)/2;
- h = (h+1)/2;
- rb->lcd_clear_display();
- rb->lcd_putsxy(LCD_WIDTH/2-w, (LCD_HEIGHT/2)-h, "FlipIt!");
- rb->lcd_update();
- rb->sleep(HZ);
+ rb->splash(HZ, true, "FlipIt!");
+#ifdef HAVE_LCD_BITMAP
/* print instructions */
rb->lcd_clear_display();
rb->lcd_setfont(FONT_SYSFIXED);
@@ -388,6 +486,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
rb->lcd_putsxy(2, 48, "[S-RIGHT] step by step");
#endif
rb->lcd_update();
+#else /* HAVE_LCD_CHARCELLS */
+ if (!init_gfx())
+ return PLUGIN_ERROR;
+#endif
rb->button_get_w_tmo(HZ*3);
rb->lcd_clear_display();
@@ -396,10 +498,15 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
spots[i]=1;
draw_spot(i);
}
+#ifdef HAVE_LCD_BITMAP
rb->lcd_update();
+#endif
rb->sleep(HZ*3/2);
rb->srand(*rb->current_tick);
- return flipit_loop();
-}
+ rc = flipit_loop();
+#ifdef HAVE_LCD_CHARCELLS
+ release_gfx();
#endif
+ return rc;
+}