239 lines
4.1 KiB
C++
239 lines
4.1 KiB
C++
#include "game.h"
|
|
|
|
//#include "math.h"
|
|
|
|
bool newState = true;
|
|
uint32_t idleTime = 0;
|
|
|
|
|
|
|
|
static const char *Gameenum_str[]
|
|
{
|
|
"stateInit",
|
|
"stateIdle",
|
|
"stateScanning",
|
|
"stateArmed",
|
|
"stateStartPlaying",
|
|
"statePlaying",
|
|
"stateStopPlaying",
|
|
"stateStopped"
|
|
};
|
|
|
|
|
|
GameStates gameState = GameStates::stateInit;
|
|
|
|
void initGame(void)
|
|
{
|
|
log_i("Game: init: done");
|
|
}
|
|
|
|
void setGameState(GameStates newstate)
|
|
{
|
|
gameState = newstate;
|
|
newState = true;
|
|
log_i("NewState = %s", StateToString(newstate).c_str());
|
|
}
|
|
|
|
void handleNewState(void)
|
|
{
|
|
if (newState)
|
|
{
|
|
log_i("ActiveState = %s" , StateToString(gameState).c_str());
|
|
newState = false;
|
|
}
|
|
}
|
|
|
|
String StateToString(GameStates gamestate)
|
|
{
|
|
try
|
|
{
|
|
return Gameenum_str[gamestate];
|
|
}
|
|
catch(const std::exception& e)
|
|
{
|
|
log_e("statestring size does not match");
|
|
return "statestringerror";
|
|
}
|
|
}
|
|
|
|
void handleGame(void)
|
|
{
|
|
switch (gameState)
|
|
{
|
|
case stateInit:
|
|
{
|
|
SetLedColor(CRGB::White);
|
|
setLedBlink(true);
|
|
if (newState)
|
|
{
|
|
// log_i("activeState = Init");
|
|
// newState = false;
|
|
handleNewState();
|
|
}
|
|
if (getSensorInitStatus() && getAudioInitStatus() && getRFIDInitStatus())
|
|
{
|
|
setGameState(stateIdle);
|
|
//log_i("nextState = idle");
|
|
}
|
|
}
|
|
break;
|
|
case stateIdle:
|
|
{
|
|
SetLedColor(CRGB::Purple);
|
|
setLedBlink(false);
|
|
if (newState)
|
|
{
|
|
handleNewState();
|
|
idleTime = millis();
|
|
}
|
|
|
|
if (getRFIDlastUID() == "")
|
|
{
|
|
setGameState(stateScanning);
|
|
//log_i("nextState = Scanning");
|
|
}
|
|
}
|
|
break;
|
|
case stateScanning:
|
|
{
|
|
SetLedColor(CRGB::Green);
|
|
setLedBlink(true);
|
|
if (newState)
|
|
{
|
|
handleNewState();
|
|
//log_i("activeState = RFID scanning");
|
|
setRFIDscanState(true);
|
|
//newState = false;
|
|
}
|
|
|
|
if (getRFIDlastUID() != "")
|
|
{
|
|
setGameState(stateArmed);
|
|
setRFIDscanState(false);
|
|
//log_i("nextState = Armed");
|
|
}
|
|
}
|
|
break;
|
|
case stateArmed:
|
|
{
|
|
SetLedColor(CRGB::Green);
|
|
setLedBlink(true);
|
|
if (newState)
|
|
{
|
|
handleNewState();
|
|
// log_i("activeState = Game Armed");
|
|
setRFIDscanState(true);
|
|
// newState = false;
|
|
idleTime = millis();
|
|
}
|
|
|
|
if (!hallIsIdle())
|
|
{
|
|
setGameState(stateStartPlaying);
|
|
//log_i("nextState = Start playing");
|
|
}
|
|
else
|
|
{
|
|
uint32_t now = millis();
|
|
if(now - idleTime > TIMEOUT_ARMED)
|
|
{
|
|
setGameState(stateIdle);
|
|
setRFIDscanState(false);
|
|
clearRFIDlastUID();
|
|
//log_i("nextState = idle");
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
break;
|
|
case stateStartPlaying:
|
|
{
|
|
SetLedColor(CRGB::Pink);
|
|
setLedBlink(true);
|
|
if (newState)
|
|
{
|
|
//log_i("activeState = startPlaying");
|
|
//newState = false;
|
|
handleNewState();
|
|
setRFIDscanState(false);
|
|
PowerKeepAlive();
|
|
|
|
}
|
|
|
|
if (hallIsIdle())
|
|
{
|
|
setGameState(stateIdle);
|
|
}
|
|
else
|
|
{
|
|
// get filefrom config
|
|
String lastUID = getRFIDlastUID();
|
|
log_i("uid=%s", lastUID.c_str());
|
|
String nextSong = getConfigSong(lastUID);
|
|
log_i("nextSong=%s", nextSong.c_str());
|
|
playSong(nextSong);
|
|
setAudioState(true);
|
|
setGameState(statePlaying);
|
|
|
|
}
|
|
}
|
|
break;
|
|
case statePlaying:
|
|
{
|
|
SetLedColor(CRGB::Pink);
|
|
setLedBlink(false);
|
|
if (newState)
|
|
{
|
|
handleNewState();
|
|
// log_i("activeState = Playing");
|
|
// newState = false;
|
|
}
|
|
|
|
if (hallIsIdle())
|
|
{
|
|
setAudioState(false);
|
|
setGameState(stateStopPlaying);
|
|
}
|
|
}
|
|
break;
|
|
case stateStopPlaying:
|
|
{
|
|
SetLedColor(CRGB::Teal);
|
|
setLedBlink(true);
|
|
if (newState)
|
|
{
|
|
handleNewState();
|
|
// log_i("activeState = stopPlaying");
|
|
// newState = false;
|
|
}
|
|
|
|
if (!getAudioState())
|
|
{
|
|
setGameState(stateStopped);
|
|
}
|
|
}
|
|
break;
|
|
case stateStopped:
|
|
{
|
|
SetLedColor(CRGB::Teal);
|
|
setLedBlink(false);
|
|
if (newState)
|
|
{
|
|
// log_i("activeState = stopped");
|
|
// newState = false;
|
|
handleNewState();
|
|
}
|
|
if (!getAudioState())
|
|
{
|
|
setGameState(stateIdle);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
}
|
|
break;
|
|
}
|
|
}
|