Files
Leo-led-truck/src/main.cpp

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