From bde3daae5387ac5446004ffb52b04240d4a748fb Mon Sep 17 00:00:00 2001 From: Willem Oldemans Date: Mon, 2 Jan 2023 07:42:16 +0100 Subject: [PATCH] optimize statemachine --- FW/leo_muziekdoos_esp32/src/config.cpp | 20 ++++++++ FW/leo_muziekdoos_esp32/src/config.h | 1 + FW/leo_muziekdoos_esp32/src/game.cpp | 70 +++++++++++++------------- FW/leo_muziekdoos_esp32/src/rfid.cpp | 6 +-- FW/leo_muziekdoos_esp32/src/rfid.h | 1 + 5 files changed, 59 insertions(+), 39 deletions(-) diff --git a/FW/leo_muziekdoos_esp32/src/config.cpp b/FW/leo_muziekdoos_esp32/src/config.cpp index 8eaaf0d..63d641f 100644 --- a/FW/leo_muziekdoos_esp32/src/config.cpp +++ b/FW/leo_muziekdoos_esp32/src/config.cpp @@ -95,6 +95,26 @@ void handleConfig(void) { } +bool getUIDvalid(String uid) +{ + JsonArray array = settingsDoc["tags"].as(); + 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(); diff --git a/FW/leo_muziekdoos_esp32/src/config.h b/FW/leo_muziekdoos_esp32/src/config.h index a0a83ef..813581c 100644 --- a/FW/leo_muziekdoos_esp32/src/config.h +++ b/FW/leo_muziekdoos_esp32/src/config.h @@ -3,6 +3,7 @@ #include "Arduino.h" String getConfigSong(String uid); +bool getUIDvalid(String uid); String GetWifiPassword(String ssid); diff --git a/FW/leo_muziekdoos_esp32/src/game.cpp b/FW/leo_muziekdoos_esp32/src/game.cpp index 4d80733..9664a46 100644 --- a/FW/leo_muziekdoos_esp32/src/game.cpp +++ b/FW/leo_muziekdoos_esp32/src/game.cpp @@ -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; } diff --git a/FW/leo_muziekdoos_esp32/src/rfid.cpp b/FW/leo_muziekdoos_esp32/src/rfid.cpp index 125be09..bedc625 100644 --- a/FW/leo_muziekdoos_esp32/src/rfid.cpp +++ b/FW/leo_muziekdoos_esp32/src/rfid.cpp @@ -48,11 +48,11 @@ String getRFIDlastUID(void) bool getRFIDlastUIDValid(void) { - if(getRFIDlastUID() != "") + if(lastUid == "") { - return true; + return false; } - return false; + return (getUIDvalid(lastUid)); } void setRFIDscanState(bool state) diff --git a/FW/leo_muziekdoos_esp32/src/rfid.h b/FW/leo_muziekdoos_esp32/src/rfid.h index 1f119c1..e8c1e14 100644 --- a/FW/leo_muziekdoos_esp32/src/rfid.h +++ b/FW/leo_muziekdoos_esp32/src/rfid.h @@ -16,4 +16,5 @@ void handleRfid(void); bool getRFIDInitStatus(void); String getRFIDlastUID(void); void setRFIDscanState(bool state); +bool getRFIDlastUIDValid(void); void clearRFIDlastUID(void); \ No newline at end of file