optimize statemachine

This commit is contained in:
2023-01-02 07:42:16 +01:00
parent ae2dde8e63
commit bde3daae53
5 changed files with 59 additions and 39 deletions

View File

@@ -95,6 +95,26 @@ void handleConfig(void)
{
}
bool getUIDvalid(String uid)
{
JsonArray array = settingsDoc["tags"].as<JsonArray>();
for (JsonVariant v : array)
{
String taguid((const char*)v["TagUID"]);
uint16_t result = uid.compareTo(taguid);
log_v("compare %s(config) with %s(read) = %d",taguid.c_str(), uid.c_str(), result);
if (!result)
{
String filename((const char*)v["audiofile"]);
log_i("Tag found in config");
return true;
}
}
log_e("taguid %s not found",uid.c_str() );
return false;
}
String getConfigSong(String uid)
{
JsonArray array = settingsDoc["tags"].as<JsonArray>();

View File

@@ -3,6 +3,7 @@
#include "Arduino.h"
String getConfigSong(String uid);
bool getUIDvalid(String uid);
String GetWifiPassword(String ssid);

View File

@@ -56,6 +56,18 @@ String StateToString(GameStates gamestate)
}
}
void GameStartPlayingSong(void)
{
// 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);
}
void handleGame(void)
{
switch (gameState)
@@ -66,14 +78,12 @@ void handleGame(void)
setLedBlink(true);
if (newState)
{
// log_i("activeState = Init");
// newState = false;
handleNewState();
}
if (getSensorInitStatus() && getAudioInitStatus() && getRFIDInitStatus())
{
log_i("All systems init OK, Game ready");
setGameState(stateIdle);
//log_i("nextState = idle");
}
}
break;
@@ -84,13 +94,19 @@ void handleGame(void)
if (newState)
{
handleNewState();
setRFIDscanState(false);
idleTime = millis();
}
if (getRFIDlastUID() == "")
if (!getRFIDlastUIDValid())
{
// no UID found, go RFID scanning
setGameState(stateScanning);
//log_i("nextState = Scanning");
}
else
{
// valid RFID found arm system
setGameState(stateArmed);
}
}
break;
@@ -101,19 +117,18 @@ void handleGame(void)
if (newState)
{
handleNewState();
//log_i("activeState = RFID scanning");
setRFIDscanState(true);
//newState = false;
}
if (getRFIDlastUID() != "")
if (getRFIDlastUIDValid())
{
setGameState(stateArmed);
// valid RFID found arm system
setRFIDscanState(false);
//log_i("nextState = Armed");
setGameState(stateArmed);
}
}
break;
case stateArmed:
{
SetLedColor(CRGB::Green);
@@ -121,44 +136,37 @@ void handleGame(void)
if (newState)
{
handleNewState();
// log_i("activeState = Game Armed");
setRFIDscanState(true);
// newState = false;
idleTime = millis();
}
if (!hallIsIdle())
{
// hall has detected movement, start playing
setGameState(stateStartPlaying);
//log_i("nextState = Start playing");
}
else
{
uint32_t now = millis();
if(now - idleTime > TIMEOUT_ARMED)
{
setGameState(stateIdle);
setRFIDscanState(false);
log_i("Armed timed-out, clear current UID and go back to Idle");
clearRFIDlastUID();
//log_i("nextState = idle");
setGameState(stateIdle);
}
}
}
break;
case stateStartPlaying:
{
SetLedColor(CRGB::Pink);
setLedBlink(true);
if (newState)
{
//log_i("activeState = startPlaying");
//newState = false;
handleNewState();
setRFIDscanState(false);
PowerKeepAlive();
}
if (hallIsIdle())
@@ -167,15 +175,8 @@ void handleGame(void)
}
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);
GameStartPlayingSong();
setGameState(statePlaying);
}
}
break;
@@ -186,13 +187,10 @@ void handleGame(void)
if (newState)
{
handleNewState();
// log_i("activeState = Playing");
// newState = false;
}
if (hallIsIdle())
{
setAudioState(false);
setGameState(stateStopPlaying);
}
}
@@ -204,12 +202,11 @@ void handleGame(void)
if (newState)
{
handleNewState();
// log_i("activeState = stopPlaying");
// newState = false;
}
if (!getAudioState())
{
setAudioState(false);
setGameState(stateStopped);
}
}
@@ -220,10 +217,9 @@ void handleGame(void)
setLedBlink(false);
if (newState)
{
// log_i("activeState = stopped");
// newState = false;
handleNewState();
}
if (!getAudioState())
{
setGameState(stateIdle);
@@ -232,6 +228,8 @@ void handleGame(void)
break;
default:
{
log_w("Unknown state go to Idle");
setGameState(stateIdle);
}
break;
}

View File

@@ -48,12 +48,12 @@ String getRFIDlastUID(void)
bool getRFIDlastUIDValid(void)
{
if(getRFIDlastUID() != "")
if(lastUid == "")
{
return true;
}
return false;
}
return (getUIDvalid(lastUid));
}
void setRFIDscanState(bool state)
{

View File

@@ -16,4 +16,5 @@ void handleRfid(void);
bool getRFIDInitStatus(void);
String getRFIDlastUID(void);
void setRFIDscanState(bool state);
bool getRFIDlastUIDValid(void);
void clearRFIDlastUID(void);