202 lines
3.4 KiB
C++
202 lines
3.4 KiB
C++
#ifndef UNIT_TEST
|
|
|
|
#include "Arduino.h"
|
|
#include "board.h"
|
|
#include "chainGame.h"
|
|
#include "detectled.h"
|
|
#include "magicSwitchBoard.h"
|
|
#include "simpleled.h"
|
|
#include "buttons.h"
|
|
#include "led.h"
|
|
#include "power.h"
|
|
|
|
|
|
#define GAMESELECTTIMEOUT 10000 // 10sec * 1000ms
|
|
|
|
typedef enum
|
|
{
|
|
none,
|
|
sleep,
|
|
idle,
|
|
SimpleLed,
|
|
ChainGame,
|
|
magicSwitchBoard,
|
|
detectLED,
|
|
last
|
|
} game;
|
|
|
|
game currentGame = none;
|
|
game nextGame = none;
|
|
bool newstate = false;
|
|
uint8_t gameState = 0;
|
|
uint64_t GameSelectTimer = 0;
|
|
|
|
void setNewState(game nextstate)
|
|
{
|
|
if (nextstate != currentGame)
|
|
{
|
|
currentGame = nextstate;
|
|
newstate = true;
|
|
}
|
|
}
|
|
|
|
void HandleIdle(bool newstate)
|
|
{
|
|
//green button first released
|
|
if (!buttonIsPressed(YELLOW) && buttonIsPressed(RED) && buttonIsPressed(GREEN) && (nextGame == none))
|
|
{
|
|
//prepare for next game
|
|
nextGame = ChainGame;
|
|
ResetChainGame();
|
|
turnOffLed(YELLOW);
|
|
}
|
|
|
|
//red button first released
|
|
if (buttonIsPressed(YELLOW) && !buttonIsPressed(RED) && buttonIsPressed(GREEN) & (nextGame == none))
|
|
{
|
|
//prepare for next game
|
|
nextGame = magicSwitchBoard;
|
|
turnOffLed(RED);
|
|
}
|
|
|
|
//green button first released
|
|
if (buttonIsPressed(YELLOW) && buttonIsPressed(RED) && !buttonIsPressed(GREEN) & (nextGame == none))
|
|
{
|
|
//prepare for next game
|
|
nextGame = SimpleLed;
|
|
turnOffLed(GREEN);
|
|
}
|
|
|
|
//wait for all buttons to be switched off
|
|
if (!anybutton())
|
|
{
|
|
setNewState(nextGame);
|
|
nextGame = none;
|
|
}
|
|
}
|
|
|
|
void HandleGameSelectTimeout(void)
|
|
{
|
|
uint64_t currentmillis = millis();
|
|
// yellow && red && green all on
|
|
if (buttonIsPressed(YELLOW) && buttonIsPressed(RED) && buttonIsPressed(GREEN))
|
|
{
|
|
//all buttons pressed, wait for next game
|
|
if (!GameSelectTimer)
|
|
{
|
|
GameSelectTimer = currentmillis;
|
|
}
|
|
else
|
|
{
|
|
//check timeout
|
|
if (currentmillis - GameSelectTimer > GAMESELECTTIMEOUT)
|
|
{
|
|
setNewState(idle);
|
|
GameSelectTimer = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//no gameselect sequence initiated
|
|
GameSelectTimer = currentmillis;
|
|
}
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
initLeds();
|
|
initButtons();
|
|
initPower();
|
|
|
|
initDetectLed();
|
|
initMagicSwitchBoard();
|
|
initSimpleLed();
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
handleButtons();
|
|
HandlePower();
|
|
if(getPowerState() != on)
|
|
{
|
|
return;
|
|
}
|
|
HandleGameSelectTimeout();
|
|
|
|
switch (currentGame)
|
|
{
|
|
case idle:
|
|
{
|
|
HandleIdle(newstate);
|
|
newstate = false;
|
|
}
|
|
break;
|
|
|
|
case SimpleLed:
|
|
{
|
|
handleSimpleLed(newstate);
|
|
newstate = false;
|
|
}
|
|
break;
|
|
|
|
case magicSwitchBoard:
|
|
{
|
|
handleMagicSwitchBoard(newstate);
|
|
newstate = false;
|
|
}
|
|
break;
|
|
|
|
case detectLED:
|
|
{
|
|
handleDetectLed(newstate);
|
|
newstate = false;
|
|
}
|
|
break;
|
|
|
|
case ChainGame:
|
|
default:
|
|
{
|
|
HandleChainGame(newstate);
|
|
newstate = false;
|
|
}
|
|
break;
|
|
|
|
case none:
|
|
{
|
|
delay(1000);
|
|
turnOffAllLed();
|
|
if (buttonIsPressed(GREEN) && currentGame == none)
|
|
{
|
|
setNewState(ChainGame);
|
|
turnOnLed(GREEN);
|
|
}
|
|
if (buttonIsPressed(RED) && currentGame == none)
|
|
{
|
|
setNewState(magicSwitchBoard);
|
|
turnOnLed(RED);
|
|
}
|
|
|
|
if (buttonIsPressed(YELLOW) && currentGame == none)
|
|
{
|
|
setNewState(SimpleLed);
|
|
turnOnLed(YELLOW);
|
|
}
|
|
|
|
if (currentGame == none)
|
|
{
|
|
setNewState(SimpleLed);
|
|
}
|
|
|
|
//wait for all buttons idle
|
|
while (anybutton())
|
|
{
|
|
}
|
|
|
|
turnOffAllLed();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endif |