Files
Leo-led-truck/src/main.cpp
2021-02-18 19:54:08 +01:00

195 lines
3.3 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"
#define TIMEOUT 15000 // 15sec * 1000ms
#define GAMESELECTTIMEOUT 10000 // 7sec * 1000ms
typedef enum
{
none,
sleep,
idle,
SimpleLed,
ChainGame,
magicSwitchBoard,
detectLED,
last
} game;
game currentGame = none;
game nextGame = none;
uint8_t gameState = 0;
uint64_t lasttimeOut = 0;
uint64_t GameSelectTimer = 0;
void HandleIdle(void)
{
//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 = detectLED;
turnOffLed(GREEN);
}
//wait for all buttons to be switched off
if (!anybutton())
{
currentGame = nextGame;
nextGame = none;
}
}
void HandleGameSelectTimeout(void)
{
uint64_t currentmillis = millis();
if (buttonIsPressed(YELLOW) && buttonIsPressed(RED) && buttonIsPressed(GREEN))
//if (yellow && red && green)
{
//all buttons pressed, wait for next game
if (!GameSelectTimer)
{
GameSelectTimer = currentmillis;
}
else
{
//check timeout
if (currentmillis - GameSelectTimer > GAMESELECTTIMEOUT)
{
currentGame = idle;
GameSelectTimer = 0;
}
}
}
else
{
//no gameselect sequence initiated
GameSelectTimer = currentmillis;
}
}
// void HandleTimeOut(void)
// {
// uint64_t currentmillis = millis();
// if (!lasttimeOut)
// {
// lasttimeOut = currentmillis;
// }
// //check if lastTime is initialized or timeout expired
// if ((currentmillis - lasttimeOut > TIMEOUT))
// {
// //handle timeout
// }
// else
// {
// if (anybutton())
// {
// //game in progress, update timer
// lasttimeOut = currentmillis;
// }
// }
// }
void setup()
{
initLeds();
initButtons();
initDetectLed();
initSimpleLed();
}
void loop()
{
handleButtons();
//HandleTimeOut();
HandleGameSelectTimeout();
switch (currentGame)
{
case idle:
{
HandleIdle();
}
break;
case SimpleLed:
{
handleSimpleLed();
}
break;
case magicSwitchBoard:
{
handleMagicSwitchBoard();
}
break;
case detectLED:
{
handleDetectLed();
}
break;
case ChainGame:
default:
{
HandleChainGame();
}
break;
case none:
{
currentGame = SimpleLed;
if (buttonIsPressed(YELLOW))
{
currentGame = ChainGame;
turnOnLed(YELLOW);
}
if (buttonIsPressed(RED))
{
currentGame = magicSwitchBoard;
turnOnLed(RED);
}
if (buttonIsPressed(GREEN))
{
currentGame = detectLED;
turnOnLed(GREEN);
}
while (anybutton())
;
turnOffAllLed();
}
break;
}
}
#endif