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) String getConfigSong(String uid)
{ {
JsonArray array = settingsDoc["tags"].as<JsonArray>(); JsonArray array = settingsDoc["tags"].as<JsonArray>();

View File

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

View File

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

View File

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