From 3a1ce1fe2073e3dc5c25cf4f1802fb589d92f1ab Mon Sep 17 00:00:00 2001 From: Michael Hayes Date: Thu, 3 Oct 2013 16:40:02 +1300 Subject: [PATCH] Use a finite state machine --- apps/gobble7/gobble7.c | 59 ++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/apps/gobble7/gobble7.c b/apps/gobble7/gobble7.c index 3cbe5ef..1a8cccb 100644 --- a/apps/gobble7/gobble7.c +++ b/apps/gobble7/gobble7.c @@ -15,17 +15,24 @@ #include "things.h" -#define DISPLAY_RATE 200 +#define DISPLAY_TASK_RATE 200 -#define NAVSWITCH_RATE 50 +#define NAVSWITCH_TASK_RATE 50 -#define THINGS_MOVE_RATE 10 +#define THINGS_MOVE_TASK_RATE 10 -#define MONSTER_FLASH_RATE 5 +#define MONSTER_FLASH_TASK_RATE 5 -static bool running = 0; -static bool game_over = 1; +typedef enum game_state +{ + GAME_WAIT, /* Waiting to start. */ + GAME_RUNNING, /* Things running around. */ + GAME_PAUSED /* Things paused. */ +} game_state_t; + + +static game_state_t game_state = GAME_WAIT; static int duration = 0; @@ -38,7 +45,7 @@ static void display_task (__unused__ void *data) static void monster_flash_task (__unused__ void *data) { /* Flash the monster. */ - if (running) + if (game_state == GAME_RUNNING) things_monster_toggle (); } @@ -46,7 +53,7 @@ static void monster_flash_task (__unused__ void *data) static void things_move_task (__unused__ void *data) { /* Move the things. */ - if (running) + if (game_state == GAME_RUNNING) { duration++; things_move (); @@ -70,26 +77,34 @@ static void navswitch_task (__unused__ void *data) /* Pause/resume things running around. */ if (navswitch_push_event_p (NAVSWITCH_PUSH)) { - if (! running && game_over) + switch (game_state) { + case GAME_WAIT: + game_state = GAME_RUNNING; srand (timer_get ()); tinygl_clear (); things_create (); - duration = 0; - game_over = 0; + led_set (LED1, 1); + break; + + case GAME_RUNNING: + game_state = GAME_PAUSED; + led_set (LED1, 0); + break; + + case GAME_PAUSED: + game_state = GAME_RUNNING; + led_set (LED1, 1); + break; } - - running = !running; - led_set (LED1, running); } - if (running && things_killed_p ()) + if (game_state == GAME_RUNNING && things_killed_p ()) { char buffer[6]; - running = 0; - game_over = 1; + game_state = GAME_WAIT; led_set (LED1, 0); sprintf (buffer, "%d", duration); tinygl_text (buffer); @@ -101,10 +116,10 @@ int main (void) { task_t tasks[] = { - {.func = display_task, .period = TASK_RATE / DISPLAY_RATE}, - {.func = navswitch_task, .period = TASK_RATE / NAVSWITCH_RATE}, - {.func = things_move_task, .period = TASK_RATE / THINGS_MOVE_RATE}, - {.func = monster_flash_task, .period = TASK_RATE / MONSTER_FLASH_RATE}, + {.func = display_task, .period = TASK_RATE / DISPLAY_TASK_RATE}, + {.func = navswitch_task, .period = TASK_RATE / NAVSWITCH_TASK_RATE}, + {.func = things_move_task, .period = TASK_RATE / THINGS_MOVE_TASK_RATE}, + {.func = monster_flash_task, .period = TASK_RATE / MONSTER_FLASH_TASK_RATE}, }; @@ -113,7 +128,7 @@ int main (void) led_init (); led_set (LED1, 0); - tinygl_init (DISPLAY_RATE); + tinygl_init (DISPLAY_TASK_RATE); tinygl_font_set (&font3x5_1); tinygl_text_mode_set (TINYGL_TEXT_MODE_SCROLL); tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);