diff --git a/src/game.cpp b/src/game.cpp index d7e2383..e7384c9 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4,26 +4,37 @@ #include "simpleled.h" #include "magicSwitchBoard.h" #include "chainGame.h" -#include "detectled.h" +//#include "detectled.h" std::vector gameslist; uint64_t GameSelectTimer = 0; e_state currentState = state_init; +bool gamesConstructed = false; c_game *game_simpleled = new c_simpleLed(YELLOW); c_game *game_magicswitchboard = new c_magicSwitchBoard(RED); c_game *game_chaingame = new c_chaingame(GREEN); -c_game *game_detectled = new c_detectled(NONE); +// c_game *game_detectled = new c_detectled(NONE); + +void setGameState(e_state newstate); +void constructGames(void); void initGames(void) { - gameslist.clear(); - gameslist.push_back(game_simpleled); - gameslist.push_back(game_magicswitchboard); - gameslist.push_back(game_chaingame); - gameslist.push_back(game_detectled); + constructGames(); + setGameState(state_init); +} - activateGame(simpleled); +void constructGames(void) +{ + if (!gamesConstructed) + { + gameslist.clear(); + gameslist.push_back(game_simpleled); + gameslist.push_back(game_magicswitchboard); + gameslist.push_back(game_chaingame); + gamesConstructed = true; + } } c_game *getGame(e_game game) @@ -135,14 +146,14 @@ void HandleGameSelectTimeout(void) // yellow && red && green all on if (allButtons()) { - //all buttons pressed, wait for next game + // all buttons pressed, wait for next game if (!GameSelectTimer) { GameSelectTimer = currentmillis; } else { - //check timeout + // check timeout if (currentmillis - GameSelectTimer > GAMESELECTTIMEOUT) { currentState = state_idle; @@ -152,7 +163,7 @@ void HandleGameSelectTimeout(void) } else { - //no gameselect sequence initiated + // no gameselect sequence initiated GameSelectTimer = currentmillis; } } @@ -160,29 +171,36 @@ void HandleGameSelectTimeout(void) void HandleGameIdle(void) { e_game nextGame = none; + if(!gamesConstructed) + { + initGames(); + } for (auto &&thisgame : gameslist) { if (onlyButton(thisgame->getGameColor()) && (nextGame == none)) { - //prepare for next game + // prepare for next game nextGame = thisgame->getIndex(); - turnOffLed(thisgame->getGameColor()); + turnOnLed(thisgame->getGameColor()); break; } } - //wait for all buttons to be switched off + // wait for all buttons to be switched off if (!anybutton()) { - activateGame(nextGame); - currentState = state_play; + if (nextGame != none) + { + activateGame(nextGame); + setGameState(state_play); + } } } void setGameState(e_state newstate) { - currentState = state_play; + currentState = newstate; } e_state getCurrentState(void) @@ -196,6 +214,24 @@ void handleGames(void) switch (getCurrentState()) { + case state_init: + { + disableAllGames(); + setGameState(state_init); + GameSelectTimer = 0; + + if (anybutton()) + { + setGameState(state_idle); + } + else + { + activateGame(simpleled); + setGameState(state_play); + } + } + break; + case state_idle: { HandleGameIdle(); @@ -207,32 +243,9 @@ void handleGames(void) runGames(); } break; - - case state_init: + default: { - //delay(1000); - turnOffAllLed(); - activateGame(simpleled); - - for (auto &&thisgame : gameslist) - { - if (onlyButton(thisgame->getGameColor())) - { - //prepare for next game - activateGame(thisgame->getIndex()); - turnOnLed(thisgame->getGameColor()); - break; - } - } - - //wait for all buttons idle - while (anybutton()) - { - } - - turnOffAllLed(); - setGameState(state_play); + currentState = state_init; } - break; } } diff --git a/src/game.h b/src/game.h index 361e55e..cc5603f 100644 --- a/src/game.h +++ b/src/game.h @@ -48,12 +48,15 @@ public: e_ledcolor getGameColor(void) { return _gamecolor; } }; +e_game getActiveGame(void); c_game *getGame(e_game game, e_ledcolor gamecolor); void runGame(e_game game); void runGames(void); void activateGame(e_game nextgame); +void disableAllGames(void); void initGames(void); void handleGames(); + #endif //GAMEH \ No newline at end of file diff --git a/src/power.cpp b/src/power.cpp index ef9d997..1fa2825 100644 --- a/src/power.cpp +++ b/src/power.cpp @@ -150,7 +150,7 @@ void handlePowerState(void) { if (!buttonread) { - powerstate = on; + powerstate = powerinit; powerOn(); turnOffAllLed(); delay(200); @@ -164,6 +164,12 @@ void handlePowerState(void) } } break; + case powerinit: + { + initGames(); + powerstate = on; + } + break; case on: { if (buttonPower.pressedFor(100)) diff --git a/src/power.h b/src/power.h index 57e47ac..37912f5 100644 --- a/src/power.h +++ b/src/power.h @@ -3,6 +3,7 @@ #include "led.h" #include "buttons.h" #include "board.h" +#include "game.h" #ifdef BTN_PWR #include "JC_Button.h" @@ -21,6 +22,7 @@ typedef enum off, poweringOn, poweringOn2, + powerinit, on, poweringOff, poweringOff2,