diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index b2f632032c..b6496e4d45 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -16,29 +16,29 @@ bounce.c calculator.c chip8.c cube.c +flipit.c grayscale.c jpeg.c -rockblox.c -snow.c -video.c - -#ifdef HAVE_RTC /* Recorder models only */ -calendar.c -clock.c -#endif - -#if CONFIG_KEYPAD != ONDIO_PAD -/* gradually bring in the ones not working yet */ -flipit.c mandelbrot.c minesweeper.c mosaique.c oscillograph.c pong.c +rockblox.c sliding_puzzle.c snake.c snake2.c +snow.c sokoban.c +video.c + +#ifdef HAVE_RTC /* Recorder models only */ +calendar.c +clock.c +#endif /* #ifdef HAVE_RTC */ + +#if CONFIG_KEYPAD != ONDIO_PAD +/* gradually bring in the ones not working yet */ solitaire.c splitedit.c star.c diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c index 0b7893c969..973e27e299 100644 --- a/apps/plugins/flipit.c +++ b/apps/plugins/flipit.c @@ -19,6 +19,24 @@ #include "plugin.h" #ifdef HAVE_LCD_BITMAP +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#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 + +#elif CONFIG_KEYPAD == ONDIO_PAD +#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) + +#endif + static struct plugin_api* rb; static int spots[20]; static int toggle[20]; @@ -152,19 +170,23 @@ static void flipit_init(void) { /* the main game loop */ static bool flipit_loop(void) { int i; + int button; + int lastbutton = BUTTON_NONE; + flipit_init(); while(true) { - switch (rb->button_get(true)) { - case BUTTON_OFF: + button = rb->button_get(true); + switch (button) { + case FLIPIT_QUIT: /* get out of here */ return PLUGIN_OK; - case BUTTON_F1: + case FLIPIT_SHUFFLE: /* mix up the pieces */ flipit_init(); break; - case BUTTON_F2: + case FLIPIT_SOLVE: /* solve the puzzle */ if (!flipit_finished()) { for (i=0; i<20; i++) @@ -179,7 +201,7 @@ static bool flipit_loop(void) { } break; - case BUTTON_F3: + case FLIPIT_STEP_BY_STEP: if (!flipit_finished()) { for (i=0; i<20; i++) if (!toggle[i]) { @@ -193,7 +215,11 @@ static bool flipit_loop(void) { } break; - case BUTTON_PLAY: + case FLIPIT_TOGGLE: +#ifdef FLIPIT_TOGGLE_PRE + if (lastbutton != FLIPIT_TOGGLE_PRE) + break; +#endif /* toggle the pieces */ if (!flipit_finished()) { flipit_toggle(); @@ -221,10 +247,13 @@ static bool flipit_loop(void) { move_cursor(0, 1); break; - case SYS_USB_CONNECTED: - rb->usb_screen(); - return PLUGIN_USB_CONNECTED; + default: + if (rb->default_event_handler(button) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; } + if (button != BUTTON_NONE) + lastbutton = button; } } @@ -249,11 +278,19 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) /* print instructions */ rb->lcd_clear_display(); rb->lcd_setfont(FONT_SYSFIXED); +#if CONFIG_KEYPAD == RECORDER_PAD rb->lcd_putsxy(2, 8, "[OFF] to stop"); rb->lcd_putsxy(2, 18, "[PLAY] toggle"); rb->lcd_putsxy(2, 28, "[F1] shuffle"); rb->lcd_putsxy(2, 38, "[F2] solution"); rb->lcd_putsxy(2, 48, "[F3] step by step"); +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->lcd_putsxy(2, 8, "[OFF] to stop"); + rb->lcd_putsxy(2, 18, "[MENU] toggle"); + rb->lcd_putsxy(2, 28, "[M-LEFT] shuffle"); + rb->lcd_putsxy(2, 38, "[M-UP] solution"); + rb->lcd_putsxy(2, 48, "[M-RIGHT] step by step"); +#endif rb->lcd_update(); rb->sleep(HZ*3); diff --git a/apps/plugins/mandelbrot.c b/apps/plugins/mandelbrot.c index 5547d86535..2e9cb97eec 100644 --- a/apps/plugins/mandelbrot.c +++ b/apps/plugins/mandelbrot.c @@ -23,6 +23,27 @@ #ifdef HAVE_LCD_BITMAP // this is not fun on the player # include "gray.h" +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define MANDELBROT_QUIT BUTTON_OFF +#define MANDELBROT_ZOOM_IN BUTTON_PLAY +#define MANDELBROT_ZOOM_OUT BUTTON_ON +#define MANDELBROT_MAXITER_INC BUTTON_F2 +#define MANDELBROT_MAXITER_DEC BUTTON_F1 +#define MANDELBROT_RESET BUTTON_F3 + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define MANDELBROT_QUIT BUTTON_OFF +#define MANDELBROT_ZOOM_IN_PRE BUTTON_MENU +#define MANDELBROT_ZOOM_IN (BUTTON_MENU | BUTTON_REL) +#define MANDELBROT_ZOOM_IN2 (BUTTON_MENU | BUTTON_UP) +#define MANDELBROT_ZOOM_OUT (BUTTON_MENU | BUTTON_DOWN) +#define MANDELBROT_MAXITER_INC (BUTTON_MENU | BUTTON_RIGHT) +#define MANDELBROT_MAXITER_DEC (BUTTON_MENU | BUTTON_LEFT) +#define MANDELBROT_RESET (BUTTON_MENU | BUTTON_OFF) + +#endif + static struct plugin_api* rb; static char buff[32]; static int lcd_aspect_ratio; @@ -101,9 +122,17 @@ void calc_mandelbrot_set(void){ } } +void cleanup(void *parameter) +{ + (void)parameter; + + gray_release_buffer(); +} enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { + int button; + int lastbutton = BUTTON_NONE; int grayscales; bool redraw = true; @@ -141,12 +170,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) redraw = false; - switch (rb->button_get(true)) { - case BUTTON_OFF: + button = rb->button_get(true); + switch (button) { + case MANDELBROT_QUIT: gray_release_buffer(); return PLUGIN_OK; - case BUTTON_ON: + case MANDELBROT_ZOOM_OUT: x_min -= ((delta>>13)*(lcd_aspect_ratio>>13)); x_max += ((delta>>13)*(lcd_aspect_ratio>>13)); y_min -= delta; @@ -156,7 +186,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) break; - case BUTTON_PLAY: + case MANDELBROT_ZOOM_IN: +#ifdef MANDELBROT_ZOOM_IN_PRE + if (lastbutton != MANDELBROT_ZOOM_IN_PRE) + break; +#endif +#ifdef MANDELBROT_ZOOM_IN2 + case MANDELBROT_ZOOM_IN2: +#endif x_min += ((delta>>13)*(lcd_aspect_ratio>>13)); x_max -= ((delta>>13)*(lcd_aspect_ratio>>13)); y_min += delta; @@ -189,33 +226,36 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) redraw = true; break; - case BUTTON_F1: + case MANDELBROT_MAXITER_DEC: if (max_iter>5){ max_iter -= 5; redraw = true; } break; - case BUTTON_F2: + case MANDELBROT_MAXITER_INC: if (max_iter < 195){ max_iter += 5; redraw = true; } break; - case BUTTON_F3: + case MANDELBROT_RESET: init_mandelbrot_set(); redraw = true; break; - case SYS_USB_CONNECTED: - gray_release_buffer(); - rb->usb_screen(); - return PLUGIN_USB_CONNECTED; + default: + if (rb->default_event_handler_ex(button, cleanup, NULL) + == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; } + if (button != BUTTON_NONE) + lastbutton = button; } gray_release_buffer(); - return false; + return PLUGIN_OK; } #endif #endif diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c index 127d96d3d5..e60cfb4688 100644 --- a/apps/plugins/minesweeper.c +++ b/apps/plugins/minesweeper.c @@ -33,11 +33,32 @@ use F3 to see how many mines are left (supposing all your flags are correct) #ifdef HAVE_LCD_BITMAP -//what the minesweeper() function can return +//what the minesweeper() function can return +#define MINESWEEPER_USB 3 #define MINESWEEPER_QUIT 2 #define MINESWEEPER_LOSE 1 #define MINESWEEPER_WIN 0 +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define MINESWP_QUIT BUTTON_OFF +#define MINESWP_START BUTTON_ON +#define MINESWP_TOGGLE BUTTON_PLAY +#define MINESWP_TOGGLE2 BUTTON_F1 +#define MINESWP_DISCOVER BUTTON_ON +#define MINESWP_DISCOVER2 BUTTON_F2 +#define MINESWP_INFO BUTTON_F3 + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define MINESWP_QUIT BUTTON_OFF +#define MINESWP_START BUTTON_MENU +#define MINESWP_TOGGLE_PRE BUTTON_MENU +#define MINESWP_TOGGLE (BUTTON_MENU | BUTTON_REL) +#define MINESWP_DISCOVER (BUTTON_MENU | BUTTON_REPEAT) +#define MINESWP_INFO (BUTTON_MENU | BUTTON_OFF) + +#endif + /* here is a global api struct pointer. while not strictly necessary, it's nice not to have to pass the api pointer in all function calls @@ -254,6 +275,8 @@ void minesweeper_putmines(int p, int x, int y){ int minesweeper(void) { int i,j; + int button; + int lastbutton = BUTTON_NONE; /* the cursor coordinates */ int x=0,y=0; @@ -277,12 +300,17 @@ int minesweeper(void) rb->snprintf(str, 20, "%d%% mines", p); rb->lcd_putsxy(1,19,str); rb->lcd_putsxy(1,28,"down / up"); +#if CONFIG_KEYPAD == RECORDER_PAD rb->lcd_putsxy(1,44,"ON to start"); +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->lcd_putsxy(1,44,"MENU to start"); +#endif rb->lcd_update(); - switch(rb->button_get(true)){ + button = rb->button_get(true); + switch(button){ case BUTTON_DOWN: case BUTTON_LEFT: p = (p + 98)%100; @@ -293,12 +321,17 @@ int minesweeper(void) p = (p + 2)%100; break; - case BUTTON_ON:/* start playing */ + case MINESWP_START:/* start playing */ i = 1; break; - case BUTTON_OFF:/* quit program */ + case MINESWP_QUIT:/* quit program */ return MINESWEEPER_QUIT; + + default: + if (rb->default_event_handler(button) == SYS_USB_CONNECTED) + return MINESWEEPER_USB; + break; } if(i==1) break; @@ -345,34 +378,41 @@ int minesweeper(void) /* update the screen */ rb->lcd_update(); - switch(rb->button_get(true)){ + button = rb->button_get(true); + switch(button){ /* quit minesweeper (you really shouldn't use this button ...) */ - case BUTTON_OFF: + case MINESWP_QUIT: return MINESWEEPER_QUIT; /* move cursor left */ case BUTTON_LEFT: + case (BUTTON_LEFT | BUTTON_REPEAT): x = (x + width - 1)%width; break; /* move cursor right */ case BUTTON_RIGHT: + case (BUTTON_RIGHT | BUTTON_REPEAT): x = (x + 1)%width; break; /* move cursor down */ case BUTTON_DOWN: + case (BUTTON_DOWN | BUTTON_REPEAT): y = (y + 1)%height; break; /* move cursor up */ case BUTTON_UP: + case (BUTTON_UP | BUTTON_REPEAT): y = (y + height - 1)%height; break; /* discover a tile (and it's neighbors if .neighbors == 0) */ - case BUTTON_ON: - case BUTTON_F2: + case MINESWP_DISCOVER: +#ifdef MINESWP_DISCOVER2 + case MINESWP_DISCOVER2: +#endif if(minefield[y][x].flag) break; /* we put the mines on the first "click" so that you don't */ /* lose on the first "click" */ @@ -393,14 +433,20 @@ int minesweeper(void) break; /* toggle flag under cursor */ - case BUTTON_PLAY: - case BUTTON_F1: + case MINESWP_TOGGLE: +#ifdef MINESWP_TOGGLE_PRE + if (lastbutton != MINESWP_TOGGLE_PRE) + break; +#endif +#ifdef MINESWP_TOGGLE2 + case MINESWP_TOGGLE2: +#endif minefield[y][x].flag = (minefield[y][x].flag + 1)%2; break; /* show how many mines you think you have found and how many */ /* there really are on the game */ - case BUTTON_F3: + case MINESWP_INFO: tiles_left = 0; for(i=0;isplash(HZ*2, true, "You found %d mines out of %d", tiles_left, mine_num); break; + + default: + if (rb->default_event_handler(button) == SYS_USB_CONNECTED) + return MINESWEEPER_USB; + break; } + if (button != BUTTON_NONE) + lastbutton = button; } } @@ -431,6 +484,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) case MINESWEEPER_LOSE: rb->splash(HZ*2, true, "You Lost :("); break; + + case MINESWEEPER_USB: + return PLUGIN_USB_CONNECTED; default: break; diff --git a/apps/plugins/mosaique.c b/apps/plugins/mosaique.c index ed4ad560c1..09c56c3bc3 100644 --- a/apps/plugins/mosaique.c +++ b/apps/plugins/mosaique.c @@ -23,6 +23,19 @@ #define LARGE 55 #define HAUT 31 +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define MOSAIQUE_QUIT BUTTON_OFF +#define MOSAIQUE_SPEED BUTTON_F1 +#define MOSAIQUE_RESTART BUTTON_PLAY + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define MOSAIQUE_QUIT BUTTON_OFF +#define MOSAIQUE_SPEED BUTTON_LEFT +#define MOSAIQUE_SPEED2 BUTTON_RIGHT +#define MOSAIQUE_RESTART BUTTON_MENU + +#endif enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { @@ -74,32 +87,36 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) rb->sleep(HZ/timer); button = rb->button_get(false); - if ( button == BUTTON_OFF) + switch (button) { - return false; - } - - if ( button == BUTTON_F1 ) - { - timer = timer+5; - if (timer>20) - timer=5; - } - - if ( button == BUTTON_PLAY ) - { - sx = rb->rand()%20+1; - sy = rb->rand()%20+1; - x=0; - y=0; - rb->lcd_clear_display(); - } - - if ( button == SYS_USB_CONNECTED) { - rb->usb_screen(); - return 0; - } + case MOSAIQUE_QUIT: + + return PLUGIN_OK; + + case MOSAIQUE_SPEED: +#ifdef MOSAIQUE_SPEED2 + case MOSAIQUE_SPEED2: +#endif + timer = timer+5; + if (timer>20) + timer=5; + break; + + case MOSAIQUE_RESTART: + sx = rb->rand()%20+1; + sy = rb->rand()%20+1; + x=0; + y=0; + rb->lcd_clear_display(); + break; + + + default: + if (rb->default_event_handler(button) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; + } } } diff --git a/apps/plugins/oscillograph.c b/apps/plugins/oscillograph.c index a34aa8bfa9..5beeb8891b 100644 --- a/apps/plugins/oscillograph.c +++ b/apps/plugins/oscillograph.c @@ -29,6 +29,28 @@ #define MAX_PEAK 0x8000 +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define OSCILLOGRAPH_QUIT BUTTON_OFF +#define OSCILLOGRAPH_SPEED_UP BUTTON_UP +#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN +#define OSCILLOGRAPH_ROLL BUTTON_F1 +#define OSCILLOGRAPH_MODE BUTTON_F2 +#define OSCILLOGRAPH_SPEED_RESET BUTTON_F3 +#define OSCILLOGRAPH_PAUSE BUTTON_PLAY + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define OSCILLOGRAPH_QUIT BUTTON_OFF +#define OSCILLOGRAPH_SPEED_UP BUTTON_UP +#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN +#define OSCILLOGRAPH_ROLL BUTTON_RIGHT +#define OSCILLOGRAPH_MODE BUTTON_MENU +#define OSCILLOGRAPH_SPEED_RESET BUTTON_LEFT + +#endif + +/* global api struct pointer */ +static struct plugin_api* rb; /* number of ticks between two volume samples */ static int speed = 1; /* roll == true -> lcd rolls */ @@ -36,13 +58,27 @@ static bool roll = true; /* see DRAW_MODE_XXX constants for valid values */ static int drawMode = DRAW_MODE_FILLED; +/** + * cleanup on return / usb + */ +void cleanup(void *parameter) +{ + (void)parameter; + + /* restore to default roll position. + Looks funny if you forget to do this... */ + rb->lcd_roll(0); + rb->lcd_update(); +} + /** * Displays a vertically scrolling oscillosgraph using * hardware scrolling of the display. The user can change * speed */ -enum plugin_status plugin_start(struct plugin_api* rb, void* parameter) +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { + int button; /* stores current volume value left */ int left; /* stores current volume value right */ @@ -57,8 +93,9 @@ enum plugin_status plugin_start(struct plugin_api* rb, void* parameter) bool exit = false; - TEST_PLUGIN_API(rb); + TEST_PLUGIN_API(api); (void)parameter; + rb = api; /* the main loop */ while (!exit) { @@ -135,28 +172,31 @@ enum plugin_status plugin_start(struct plugin_api* rb, void* parameter) it must be ensured that at least 1 is passed. */ /* react to user input */ - switch (rb->button_get_w_tmo(MAX(speed, 1))) { - case BUTTON_UP: + button = rb->button_get_w_tmo(MAX(speed, 1)); + switch (button) { + case OSCILLOGRAPH_SPEED_UP: speed++; draw = true; break; - case BUTTON_DOWN: + case OSCILLOGRAPH_SPEED_DOWN: speed--; draw = true; break; - case BUTTON_PLAY: +#ifdef OSCILLOGRAPH_PAUSE + case OSCILLOGRAPH_PAUSE: /* pause the demo */ rb->button_get(true); break; +#endif - case BUTTON_F1: + case OSCILLOGRAPH_ROLL: /* toggle rolling */ roll = !roll; break; - case BUTTON_F2: + case OSCILLOGRAPH_MODE: /* step through the display modes */ drawMode ++; drawMode = drawMode % DRAW_MODE_COUNT; @@ -170,18 +210,20 @@ enum plugin_status plugin_start(struct plugin_api* rb, void* parameter) rb->lcd_roll(0); break; - case BUTTON_F3: + case OSCILLOGRAPH_SPEED_RESET: speed = 1; draw = true; break; - case BUTTON_OFF: + case OSCILLOGRAPH_QUIT: exit = true; break; - case SYS_USB_CONNECTED: - rb->usb_screen(); - return PLUGIN_USB_CONNECTED; + default: + if (rb->default_event_handler_ex(button, cleanup, NULL) + == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; } if (draw) { @@ -191,14 +233,10 @@ enum plugin_status plugin_start(struct plugin_api* rb, void* parameter) rb->lcd_update_rect(0, (y + LCD_HEIGHT - 8) % LCD_HEIGHT, LCD_WIDTH, 8); } - } + } } - /* restore to default roll position. - Looks funny if you forget to do this... */ - rb->lcd_roll(0); - rb->lcd_update(); - + cleanup(NULL); /* standard return */ return PLUGIN_OK; } diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index 705b13b0fa..c7547d6de4 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -33,6 +33,23 @@ #define MOVE_STEP 2 /* move pad this many steps up/down each move */ +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define PONG_QUIT BUTTON_OFF +#define PONG_LEFT_UP BUTTON_F1 +#define PONG_LEFT_DOWN BUTTON_LEFT +#define PONG_RIGHT_UP BUTTON_F3 +#define PONG_RIGHT_DOWN BUTTON_RIGHT + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define PONG_QUIT BUTTON_OFF +#define PONG_LEFT_UP BUTTON_LEFT +#define PONG_LEFT_DOWN BUTTON_MENU +#define PONG_RIGHT_UP BUTTON_UP +#define PONG_RIGHT_DOWN BUTTON_DOWN + +#endif + static struct plugin_api* rb; struct pong { @@ -232,7 +249,7 @@ void padmove(int *pos, int dir) *pos = 0; } -bool keys(struct pong *p) +int keys(struct pong *p) { int key; @@ -243,22 +260,25 @@ bool keys(struct pong *p) while(end > *rb->current_tick) { key = rb->button_get_w_tmo(end - *rb->current_tick); - if(key & BUTTON_OFF) - return false; /* exit game NOW */ + if(key & PONG_QUIT) + return 0; /* exit game NOW */ - if(key & BUTTON_LEFT) /* player left goes down */ + if(key & PONG_LEFT_DOWN) /* player left goes down */ padmove(&p->w_pad[0], MOVE_STEP); - if(key & BUTTON_F1) /* player left goes up */ - padmove(&p->w_pad[0], - MOVE_STEP); + if(key & PONG_LEFT_UP) /* player left goes up */ + padmove(&p->w_pad[0], -MOVE_STEP); - if(key & BUTTON_RIGHT) /* player right goes down */ + if(key & PONG_RIGHT_DOWN) /* player right goes down */ padmove(&p->w_pad[1], MOVE_STEP); - if(key & BUTTON_F3) /* player right goes up */ + if(key & PONG_RIGHT_UP) /* player right goes up */ padmove(&p->w_pad[1], -MOVE_STEP); + + if(rb->default_event_handler(key) == SYS_USB_CONNECTED) + return -1; /* exit game because of USB */ } - return true; /* return false to exit game */ + return 1; /* return 0 to exit game */ } void showscore(struct pong *p) @@ -273,7 +293,7 @@ void showscore(struct pong *p) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { struct pong pong; - bool game = true; + int game = 1; /* init the struct with some silly values to start with */ @@ -302,7 +322,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) rb->lcd_clear_display(); /* go go go */ - while(game) { + while(game > 0) { showscore(&pong); pad(&pong, 0); /* draw left pad */ pad(&pong, 1); /* draw right pad */ @@ -313,7 +333,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) game = keys(&pong); /* deal with keys */ } - return PLUGIN_OK; + return (game == 0) ? PLUGIN_OK : PLUGIN_USB_CONNECTED; } #endif /* HAVE_LCD_BITMAP */ diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c index 423ab7fcf1..789e8789e8 100644 --- a/apps/plugins/sliding_puzzle.c +++ b/apps/plugins/sliding_puzzle.c @@ -19,6 +19,20 @@ #include "plugin.h" #ifdef HAVE_LCD_BITMAP +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define PUZZLE_QUIT BUTTON_OFF +#define PUZZLE_SHUFFLE BUTTON_F1 +#define PUZZLE_PICTURE BUTTON_F2 + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define PUZZLE_QUIT BUTTON_OFF +#define PUZZLE_SHUFFLE_PICTURE_PRE BUTTON_MENU +#define PUZZLE_SHUFFLE (BUTTON_MENU | BUTTON_REPEAT) +#define PUZZLE_PICTURE (BUTTON_MENU | BUTTON_REL) + +#endif + static struct plugin_api* rb; static int spots[20]; static int hole = 19, moves; @@ -232,20 +246,31 @@ static void puzzle_init(void) /* the main game loop */ static int puzzle_loop(void) { + int button; + int lastbutton = BUTTON_NONE; int i; puzzle_init(); while(true) { - switch (rb->button_get(true)) { - case BUTTON_OFF: + button = rb->button_get(true); + switch (button) { + case PUZZLE_QUIT: /* get out of here */ return PLUGIN_OK; - case BUTTON_F1: + case PUZZLE_SHUFFLE: +#ifdef PUZZLE_SHUFFLE_PICTURE_PRE + if (lastbutton != PUZZLE_SHUFFLE_PICTURE_PRE) + break; +#endif /* mix up the pieces */ puzzle_init(); break; - case BUTTON_F2: + case PUZZLE_PICTURE: +#ifdef PUZZLE_SHUFFLE_PICTURE_PRE + if (lastbutton != PUZZLE_SHUFFLE_PICTURE_PRE) + break; +#endif /* change picture */ pic = (pic==true?false:true); for (i=0; i<20; i++) @@ -273,10 +298,13 @@ static int puzzle_loop(void) move_spot(0, 1); break; - case SYS_USB_CONNECTED: - rb->usb_screen(); - return PLUGIN_USB_CONNECTED; + default: + if (rb->default_event_handler(button) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; } + if (button != BUTTON_NONE) + lastbutton = button; } } @@ -300,9 +328,15 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) /* print instructions */ rb->lcd_clear_display(); rb->lcd_setfont(FONT_SYSFIXED); +#if CONFIG_KEYPAD == RECORDER_PAD rb->lcd_putsxy(3, 18, "[OFF] to stop"); rb->lcd_putsxy(3, 28, "[F1] shuffle"); rb->lcd_putsxy(3, 38, "[F2] change pic"); +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->lcd_putsxy(0, 18, "[OFF] to stop"); + rb->lcd_putsxy(0, 28, "[MENU..] shuffle"); + rb->lcd_putsxy(0, 38, "[MENU] change pic"); +#endif rb->lcd_update(); rb->sleep(HZ*2); diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c index e99cb1c952..242c432e8b 100644 --- a/apps/plugins/snake.c +++ b/apps/plugins/snake.c @@ -33,6 +33,17 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #include "plugin.h" #ifdef HAVE_LCD_BITMAP +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define SNAKE_QUIT BUTTON_OFF +#define SNAKE_PLAYPAUSE BUTTON_PLAY + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define SNAKE_QUIT BUTTON_OFF +#define SNAKE_PLAYPAUSE BUTTON_MENU + +#endif + static int board[28][16],snakelength; static unsigned int score,hiscore=0; static short dir,frames,apple,level=1,dead=0; @@ -156,26 +167,39 @@ void redraw (void) } void game_pause (void) { + int button; rb->lcd_clear_display(); rb->lcd_putsxy(3,12,"Game Paused"); +#if CONFIG_KEYPAD == RECORDER_PAD rb->lcd_putsxy(3,22,"[Play] to resume"); +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->lcd_putsxy(3,22,"[Menu] to resume"); +#endif rb->lcd_putsxy(3,32,"[Off] to quit"); rb->lcd_update(); while (1) { - switch (rb->button_get(true)) { - case BUTTON_OFF: + button=rb->button_get(true); + switch (button) { + case SNAKE_QUIT: dead=1; return; - case BUTTON_PLAY: + case SNAKE_PLAYPAUSE: redraw(); rb->sleep(HZ/2); return; + default: + if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { + dead=2; + return; + } + break; } } } void game (void) { + int button; short x,y; while (1) { frame(); @@ -198,7 +222,8 @@ void game (void) { rb->sleep(HZ/level); - switch (rb->button_get(false)) { + button=rb->button_get(false); + switch (button) { case BUTTON_UP: if (dir!=2) dir=0; break; @@ -211,17 +236,24 @@ void game (void) { case BUTTON_LEFT: if (dir!=1) dir=3; break; - case BUTTON_OFF: + case SNAKE_QUIT: dead=1; return; - case BUTTON_PLAY: + case SNAKE_PLAYPAUSE: game_pause(); break; - } + default: + if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { + dead=2; + return; + } + break; + } } } void game_init(void) { + int button; short x,y; char plevel[10],phscore[20]; @@ -244,12 +276,17 @@ void game_init(void) { rb->lcd_puts(0,0, plevel); rb->lcd_puts(0,1, "(1-slow, 9-fast)"); rb->lcd_puts(0,2, "OFF - quit"); +#if CONFIG_KEYPAD == RECORDER_PAD rb->lcd_puts(0,3, "PLAY - start/pause"); +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->lcd_puts(0,3, "MENU - start/pause"); +#endif rb->lcd_puts(0,4, phscore); rb->lcd_update(); - while (1) { - switch (rb->button_get(true)) { + while (1) { + button=rb->button_get(true); + switch (button) { case BUTTON_RIGHT: case BUTTON_UP: if (level<9) @@ -260,13 +297,19 @@ void game_init(void) { if (level>1) level--; break; - case BUTTON_OFF: + case SNAKE_QUIT: dead=1; return; break; - case BUTTON_PLAY: + case SNAKE_PLAYPAUSE: return; break; + default: + if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { + dead=2; + return; + } + break; } rb->snprintf(plevel,sizeof(plevel),"Level - %d",level); rb->lcd_puts(0,0, plevel); @@ -283,8 +326,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) game_init(); rb->lcd_clear_display(); - game(); - return false; + game(); + return (dead==1)?PLUGIN_OK:PLUGIN_USB_CONNECTED; } #endif diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c index e83e298beb..3f6db5c550 100644 --- a/apps/plugins/snake2.c +++ b/apps/plugins/snake2.c @@ -33,6 +33,27 @@ Head and Tail are stored #define WIDTH 28 #define HEIGHT 16 +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define SNAKE2_QUIT BUTTON_OFF +#define SNAKE2_LEVEL_UP BUTTON_UP +#define SNAKE2_LEVEL_UP2 BUTTON_RIGHT +#define SNAKE2_LEVEL_DOWN BUTTON_DOWN +#define SNAKE2_LEVEL_DOWN2 BUTTON_LEFT +#define SNAKE2_SELECT_MAZE BUTTON_F1 +#define SNAKE2_SELECT_TYPE BUTTON_F3 +#define SNAKE2_PLAYPAUSE BUTTON_PLAY + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define SNAKE2_QUIT BUTTON_OFF +#define SNAKE2_LEVEL_UP BUTTON_UP +#define SNAKE2_LEVEL_DOWN BUTTON_DOWN +#define SNAKE2_SELECT_MAZE BUTTON_LEFT +#define SNAKE2_SELECT_TYPE BUTTON_RIGHT +#define SNAKE2_PLAYPAUSE BUTTON_MENU + +#endif + static int max_levels = 0; static char (*level_cache)[HEIGHT][WIDTH]; @@ -770,24 +791,37 @@ void frame (void) void game_pause (void) { + int button; + rb->lcd_clear_display(); rb->lcd_putsxy(33,12,"Paused"); rb->lcd_update(); while (1) { - switch (rb->button_get(true)) + button = rb->button_get(true); + switch (button) { - case BUTTON_PLAY: + case SNAKE2_PLAYPAUSE: redraw(); rb->sleep(HZ/2); return; + + default: + if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { + dead = 1; + quit = 2; + return; + } + break; } } } void game (void) { + int button; + redraw(); /*main loop:*/ while (1) @@ -821,7 +855,8 @@ void game (void) rb->sleep(HZ/speed); - switch (rb->button_get(false)) + button = rb->button_get(false); + switch (button) { case BUTTON_UP: case BUTTON_UP | BUTTON_REPEAT: @@ -843,14 +878,21 @@ void game (void) if (dir != EAST) set_direction(WEST); break; - case BUTTON_OFF: + case SNAKE2_QUIT: dead=1; return; - case BUTTON_PLAY: + case SNAKE2_PLAYPAUSE: game_pause(); break; - } + + default: + if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { + quit = 2; + return; + } + break; + } } } @@ -862,37 +904,42 @@ void game_init(void) dead=0; apple=0; score=0; - + int button; clear_board(); load_level( level_from_file ); while (1) { - switch (rb->button_get(true)) + button=rb->button_get(true); + switch (button) { - case BUTTON_RIGHT: - case BUTTON_UP: + case SNAKE2_LEVEL_UP: +#ifdef SNAKE2_LEVEL_UP2 + case SNAKE2_LEVEL_UP2: +#endif if (level<10) level+=1; break; - case BUTTON_LEFT: - case BUTTON_DOWN: + case SNAKE2_LEVEL_DOWN: +#ifdef SNAKE2_LEVEL_DOWN2 + case SNAKE2_LEVEL_DOWN2: +#endif if (level>1) level-=1; break; - case BUTTON_OFF: + case SNAKE2_QUIT: quit=1; return; break; - case BUTTON_PLAY: + case SNAKE2_PLAYPAUSE: speed = level*20; return; break; - case BUTTON_F3: + case SNAKE2_SELECT_TYPE: if(game_type==0)game_type=1; else game_type=0; break; - case BUTTON_F1: + case SNAKE2_SELECT_MAZE: level_from_file++; if(level_from_file > num_levels) @@ -902,6 +949,12 @@ void game_init(void) load_level( level_from_file ); + break; + default: + if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { + quit = 2; + return; + } break; } @@ -910,13 +963,22 @@ void game_init(void) /*TODO: CENTER ALL TEXT!!!!*/ rb->snprintf(plevel,sizeof(plevel),"Speed - %d",level); rb->lcd_putsxy(LCD_WIDTH/2 - 30,5, plevel); +#if CONFIG_KEYPAD == RECORDER_PAD rb->snprintf(plevel,sizeof(plevel),"F1 - Maze %d",level_from_file); rb->lcd_putsxy(18, 20, plevel); if(game_type==0) rb->lcd_putsxy(18, 30, "F3 - Game A"); else rb->lcd_putsxy(18, 30, "F3 - Game B"); - +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->snprintf(plevel,sizeof(plevel),"Left - Maze %d",level_from_file); + rb->lcd_putsxy(18, 20, plevel); + if(game_type==0) + rb->lcd_putsxy(12, 30, "Right - Game A"); + else + rb->lcd_putsxy(12, 30, "Right - Game B"); +#endif + rb->snprintf(phscore,sizeof(phscore),"Hi Score: %d",hiscore); rb->lcd_putsxy(LCD_WIDTH/2 - 37,50, phscore); rb->lcd_update(); @@ -953,7 +1015,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) } } - return false; + return (quit==1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED; } #endif diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index ff13b470f5..6365e6c3ae 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -33,6 +33,24 @@ #define SOKOBAN_LEVEL_SIZE (ROWS*COLS) +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define SOKOBAN_QUIT BUTTON_OFF +#define SOKOBAN_UNDO BUTTON_ON +#define SOKOBAN_LEVEL_UP BUTTON_F3 +#define SOKOBAN_LEVEL_DOWN BUTTON_F1 +#define SOKOBAN_LEVEL_REPEAT BUTTON_F2 + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define SOKOBAN_QUIT BUTTON_OFF +#define SOKOBAN_UNDO_PRE BUTTON_MENU +#define SOKOBAN_UNDO (BUTTON_MENU | BUTTON_REL) +#define SOKOBAN_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT) +#define SOKOBAN_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT) +#define SOKOBAN_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP) + +#endif + static void init_undo(void); static void undo(void); static void add_undo(int button); @@ -443,7 +461,7 @@ static bool sokoban_loop(void) { char new_spot; bool moved = true; - int i = 0, button = 0; + int i = 0, button = 0, lastbutton = 0; short r = 0, c = 0; current_info.level.level = 1; @@ -465,27 +483,32 @@ static bool sokoban_loop(void) { case BUTTON_OFF: /* get out of here */ - return PLUGIN_OK; + return PLUGIN_OK; - case BUTTON_ON: - case BUTTON_ON | BUTTON_REPEAT: + case SOKOBAN_UNDO: +#ifdef SOKOBAN_UNDO_PRE + if (lastbutton != SOKOBAN_UNDO_PRE) + break; +#else /* repeat can't work here for Ondio */ + case SOKOBAN_UNDO | BUTTON_REPEAT: +#endif /* this is UNDO */ undo(); rb->lcd_clear_display(); - update_screen(); + update_screen(); moved = false; break; - case BUTTON_F3: - case BUTTON_F3 | BUTTON_REPEAT: + case SOKOBAN_LEVEL_UP: + case SOKOBAN_LEVEL_UP | BUTTON_REPEAT: /* increase level */ init_undo(); current_info.level.boxes_to_go=0; moved = true; break; - case BUTTON_F1: - case BUTTON_F1 | BUTTON_REPEAT: + case SOKOBAN_LEVEL_DOWN: + case SOKOBAN_LEVEL_DOWN | BUTTON_REPEAT: /* previous level */ init_undo(); if (current_info.level.level > 1) @@ -495,8 +518,8 @@ static bool sokoban_loop(void) moved = false; break; - case BUTTON_F2: - case BUTTON_F2 | BUTTON_REPEAT: + case SOKOBAN_LEVEL_REPEAT: + case SOKOBAN_LEVEL_REPEAT | BUTTON_REPEAT: /* same level */ init_undo(); draw_level(); @@ -504,7 +527,7 @@ static bool sokoban_loop(void) break; case BUTTON_LEFT: - switch(current_info.board[r][c-1]) + switch(current_info.board[r][c-1]) { case ' ': /* if it is a blank spot */ case '.': /* if it is a home spot */ @@ -527,7 +550,7 @@ static bool sokoban_loop(void) case '.': /* going from a blank to home */ current_info.board[r][c-2] = '%'; current_info.board[r][c-1] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = ' '; current_info.level.boxes_to_go--; break; @@ -551,7 +574,7 @@ static bool sokoban_loop(void) case '.': /* if we are going from a home to home */ current_info.board[r][c-2] = '%'; current_info.board[r][c-1] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = '.'; break; @@ -580,7 +603,7 @@ static bool sokoban_loop(void) current_info.player.spot = new_spot; break; - case '$': + case '$': switch(current_info.board[r][c+2]) { case ' ': /* going from blank to blank */ current_info.board[r][c+2] = current_info.board[r][c+1]; @@ -592,7 +615,7 @@ static bool sokoban_loop(void) case '.': /* going from a blank to home */ current_info.board[r][c+2] = '%'; current_info.board[r][c+1] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = ' '; current_info.level.boxes_to_go--; break; @@ -616,7 +639,7 @@ static bool sokoban_loop(void) case '.': current_info.board[r][c+2] = '%'; current_info.board[r][c+1] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = '.'; break; @@ -657,7 +680,7 @@ static bool sokoban_loop(void) case '.': /* going from a blank to home */ current_info.board[r-2][c] = '%'; current_info.board[r-1][c] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = ' '; current_info.level.boxes_to_go--; break; @@ -681,7 +704,7 @@ static bool sokoban_loop(void) case '.': /* if we are going from a home to home */ current_info.board[r-2][c] = '%'; current_info.board[r-1][c] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = '.'; break; @@ -722,7 +745,7 @@ static bool sokoban_loop(void) case '.': /* going from a blank to home */ current_info.board[r+2][c] = '%'; current_info.board[r+1][c] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = ' '; current_info.level.boxes_to_go--; break; @@ -746,7 +769,7 @@ static bool sokoban_loop(void) case '.': /* going from a home to home */ current_info.board[r+2][c] = '%'; current_info.board[r+1][c] = current_info.board[r][c]; - current_info.board[r][c] = current_info.player.spot; + current_info.board[r][c] = current_info.player.spot; current_info.player.spot = '.'; break; @@ -765,19 +788,21 @@ static bool sokoban_loop(void) current_info.player.row++; break; - case SYS_USB_CONNECTED: - rb->usb_screen(); - return PLUGIN_USB_CONNECTED; - default: + if (rb->default_event_handler(button) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + moved = false; break; } + if (button != BUTTON_NONE) + lastbutton = button; + if (moved) { current_info.level.moves++; rb->lcd_clear_display(); - update_screen(); + update_screen(); } /* We have completed this level */ @@ -845,11 +870,19 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) rb->lcd_clear_display(); +#if CONFIG_KEYPAD == RECORDER_PAD rb->lcd_putsxy(3, 6, "[OFF] To Stop"); rb->lcd_putsxy(3, 16, "[ON] To Undo"); rb->lcd_putsxy(3, 26, "[F1] - Level"); rb->lcd_putsxy(3, 36, "[F2] Same Level"); rb->lcd_putsxy(3, 46, "[F3] + Level"); +#elif CONFIG_KEYPAD == ONDIO_PAD + rb->lcd_putsxy(3, 6, "[OFF] To Stop"); + rb->lcd_putsxy(3, 16, "[MENU] To Undo"); + rb->lcd_putsxy(3, 26, "[M-LEFT] - Level"); + rb->lcd_putsxy(3, 36, "[M-UP] Same Level"); + rb->lcd_putsxy(3, 46, "[M-RIGHT] + Level"); +#endif rb->lcd_update(); rb->sleep(HZ*2);