diff --git a/FW/leo_muziekdoos_esp32/platformio.ini b/FW/leo_muziekdoos_esp32/platformio.ini index 212fccf..228aa2d 100644 --- a/FW/leo_muziekdoos_esp32/platformio.ini +++ b/FW/leo_muziekdoos_esp32/platformio.ini @@ -21,7 +21,7 @@ lib_ldf_mode = deep+ extra_scripts = ./littlefsbuilder.py build_flags = -DHARDWARE=2 - -DCORE_DEBUG_LEVEL=4 + -DCORE_DEBUG_LEVEL=3 -DNDEF_DEBUG=1 upload_protocol = espota upload_port = muziekdoos.local diff --git a/FW/leo_muziekdoos_esp32/src/game.cpp b/FW/leo_muziekdoos_esp32/src/game.cpp index e1969a3..4d80733 100644 --- a/FW/leo_muziekdoos_esp32/src/game.cpp +++ b/FW/leo_muziekdoos_esp32/src/game.cpp @@ -5,17 +5,55 @@ bool newState = true; uint32_t idleTime = 0; -GamneStates gameState = GamneStates::stateInit; + + +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(GamneStates newstate) +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) @@ -24,69 +62,100 @@ void handleGame(void) { case stateInit: { + SetLedColor(CRGB::White); + setLedBlink(true); if (newState) { - log_i("activeState = Init"); - newState = false; + // log_i("activeState = Init"); + // newState = false; + handleNewState(); } if (getSensorInitStatus() && getAudioInitStatus() && getRFIDInitStatus()) { setGameState(stateIdle); - log_i("nextState = idle"); + //log_i("nextState = idle"); } } break; case stateIdle: { + SetLedColor(CRGB::Purple); + setLedBlink(false); if (newState) { - log_i("activeState = Idle"); - newState = false; + handleNewState(); idleTime = millis(); } if (getRFIDlastUID() == "") { setGameState(stateScanning); - log_i("nextState = Scanning"); - } - else - { - if (!hallIsIdle()) - { - setGameState(stateStartPlaying); - log_i("nextState = Start playing"); - } - else - { - setRFIDscanState(true); - } + //log_i("nextState = Scanning"); } } break; case stateScanning: { + SetLedColor(CRGB::Green); + setLedBlink(true); if (newState) { - log_i("activeState = RFID scanning"); + handleNewState(); + //log_i("activeState = RFID scanning"); setRFIDscanState(true); - newState = false; + //newState = false; } if (getRFIDlastUID() != "") { - setGameState(stateIdle); + setGameState(stateArmed); setRFIDscanState(false); - log_i("nextState = idle"); + //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; + //log_i("activeState = startPlaying"); + //newState = false; + handleNewState(); setRFIDscanState(false); PowerKeepAlive(); @@ -106,15 +175,19 @@ void handleGame(void) playSong(nextSong); setAudioState(true); setGameState(statePlaying); + } } break; case statePlaying: { + SetLedColor(CRGB::Pink); + setLedBlink(false); if (newState) { - log_i("activeState = Playing"); - newState = false; + handleNewState(); + // log_i("activeState = Playing"); + // newState = false; } if (hallIsIdle()) @@ -126,10 +199,13 @@ void handleGame(void) break; case stateStopPlaying: { + SetLedColor(CRGB::Teal); + setLedBlink(true); if (newState) { - log_i("activeState = stopPlaying"); - newState = false; + handleNewState(); + // log_i("activeState = stopPlaying"); + // newState = false; } if (!getAudioState()) @@ -140,10 +216,13 @@ void handleGame(void) break; case stateStopped: { + SetLedColor(CRGB::Teal); + setLedBlink(false); if (newState) { - log_i("activeState = stopped"); - newState = false; + // log_i("activeState = stopped"); + // newState = false; + handleNewState(); } if (!getAudioState()) { diff --git a/FW/leo_muziekdoos_esp32/src/game.h b/FW/leo_muziekdoos_esp32/src/game.h index 92490a5..32a7079 100644 --- a/FW/leo_muziekdoos_esp32/src/game.h +++ b/FW/leo_muziekdoos_esp32/src/game.h @@ -9,17 +9,19 @@ #include "power.h" #define TIMEOUT_IDLE 20000 +#define TIMEOUT_ARMED 10000 typedef enum{ stateInit, stateIdle, stateScanning, + stateArmed, stateStartPlaying, statePlaying, stateStopPlaying, stateStopped, stateLAST -}GamneStates; +}GameStates; void initGame(void); void handleGame(void); @@ -27,3 +29,6 @@ bool hallIsIdle(void); void handleHallSensor(void); +String StateToString(GameStates state); + + diff --git a/FW/leo_muziekdoos_esp32/src/ota.cpp b/FW/leo_muziekdoos_esp32/src/ota.cpp index c3335c0..18efb93 100644 --- a/FW/leo_muziekdoos_esp32/src/ota.cpp +++ b/FW/leo_muziekdoos_esp32/src/ota.cpp @@ -132,6 +132,7 @@ bool OtaProcess_class::initialize(void) ArduinoOTA.begin(); log_i("Ota ready, IPaddress:%s", WiFi.localIP()); m_otaState = otaInitDone; + setLedBlink(true); } break; case otaInitDone: diff --git a/FW/leo_muziekdoos_esp32/src/rfid.cpp b/FW/leo_muziekdoos_esp32/src/rfid.cpp index 40be3e0..125be09 100644 --- a/FW/leo_muziekdoos_esp32/src/rfid.cpp +++ b/FW/leo_muziekdoos_esp32/src/rfid.cpp @@ -46,6 +46,15 @@ String getRFIDlastUID(void) return lastUid; } +bool getRFIDlastUIDValid(void) +{ + if(getRFIDlastUID() != "") + { + return true; + } + return false; +} + void setRFIDscanState(bool state) { RfidScanActive = state; diff --git a/FW/leo_muziekdoos_esp32/src/sensor.cpp b/FW/leo_muziekdoos_esp32/src/sensor.cpp index d4a4842..9f7bde2 100644 --- a/FW/leo_muziekdoos_esp32/src/sensor.cpp +++ b/FW/leo_muziekdoos_esp32/src/sensor.cpp @@ -13,48 +13,23 @@ uint16_t BatterySensor = 0; uint16_t BatteryVoltage = 0; uint32_t BatteryWarningFirst = 0; -uint16_t HallSensor = 0; -HALLSENSORSTATES hall_sensor_state = HALLSENSORSTATES::hall_idle; - -uint32_t last_hall_read = 0; -uint16_t last_hall_sample = 0; -uint16_t last_hall_Delta = 0; -uint8_t hall_idle_count = 0; -uint8_t hall_decrease_count = 0; -uint8_t hall_increase_count = 0; bool hall_is_Idle = true; -bool hallinitOK = false; - -String HALLSENSORSTATES_STR[] = { - "hall_idle", - "hall_increasing", - "hall_tipover", - "hall_decreasing", - "unknown"}; - -String getHallSensorStateStr(HALLSENSORSTATES state) -{ - if (state < sizeof(HALLSENSORSTATES)) - { - return HALLSENSORSTATES_STR[state]; - } - log_d("unknown state %d", state); - return "unknown state"; -} +bool ADSinitOK = false; +bool ASinitOK = false; bool getSensorInitStatus(void) { - return hallinitOK; -} - -uint16_t getHall(void) -{ - return HallSensor; + return (ADSinitOK & ASinitOK); } uint16_t getvbatt(uint8_t dummy = 0) { + if(!ADSinitOK) + { + log_e("battery not initialized due to ADS error"); + return 0; + } int16_t readbatt = ADS.readADC(MEAS_ADC); log_i("readvbat=%d", readbatt); return readbatt; @@ -65,41 +40,49 @@ bool hallIsIdle(void) return hall_is_Idle; } -void initBattery(void) -{ - battery.onDemand(MEAS_EN, LOW); - battery.begin(VBATTREF, (R12 + R13) / R13, &sigmoidal); // R1 = 220K, R2 = 100K, factor = (R1+R2)/R2 -} - -void initAS5600(void) -{ - as5600.begin(); // set direction pin. - as5600.setDirection(AS5600_CLOCK_WISE); // default, just be explicit. - int b = as5600.isConnected(); - Serial.print("Connect: "); - Serial.println(b); -} - -void initSensor(void) +bool initADS(void) { log_i("sensor init ADS1x15:"); bool result = ADS.begin(I2C_SDA, I2C_SCL); ADS.setMode(0); - + result = ADS.isConnected(); + ADSinitOK = result; + if(!result) + { + log_e("Failed to init ADS1x15"); + } + return result; +} + +void initBattery(void) +{ + if(!ADSinitOK) + { + log_e("battery not initialized due to ADS error"); + return; + } + battery.onDemand(MEAS_EN, LOW); + battery.begin(VBATTREF, (R12 + R13) / R13, &sigmoidal); // R1 = 220K, R2 = 100K, factor = (R1+R2)/R2 +} + +bool initAS5600(void) +{ + as5600.begin(); // set direction pin. + as5600.setDirection(AS5600_CLOCK_WISE); // default, just be explicit. + bool result = as5600.isConnected(); + ASinitOK = result; + if(!result) + { + log_e("error initilizing AS5600"); + } + return result; +} + +void initSensor(void) +{ + initADS(); initBattery(); initAS5600(); - - if (!result) - { - log_e("sensor init: FAIL"); - } - else - { - log_i("sensor init: OK"); - hallinitOK = true; - } - - } bool CheckBattery(void) @@ -164,29 +147,35 @@ void handleBatterySensor(void) } } -HALLSENSORSTATES getprogressstate(uint16_t sample) -{ - return hall_idle; -} - void handleHallSensor(void) { - readsensor(); + uint32_t timeNow = millis(); + + if (timeNow - lastADS < ADSINTERVAL) + { + return; + } + lastADS = timeNow; + int angle = as5600.getCumulativePosition(); - log_i("sensor angle %d", angle); + log_v("sensor angle %d", angle); if( angle > HALLTHRESHOLD) { + if(hall_is_Idle) + { + log_i("hall state changed (&i)", angle); + } hall_is_Idle = false; } else { + if(!hall_is_Idle) + { + log_i("hall state changed (&i)", angle); + } hall_is_Idle = true; + } as5600.resetPosition(); -} - -void readsensor(void) -{ - } \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/src/sensor.h b/FW/leo_muziekdoos_esp32/src/sensor.h index caccb0a..3f8d5d4 100644 --- a/FW/leo_muziekdoos_esp32/src/sensor.h +++ b/FW/leo_muziekdoos_esp32/src/sensor.h @@ -8,25 +8,25 @@ #include "AS5600.h" #include "Wire.h" -#define ADSINTERVAL 100 +#define ADSINTERVAL 300 #define VBATTINTERVALL 15000 #define VBATTMEASPRECHARGE 500 #define LOWBATTPERIOD 30000 -#define HALLINTERVAL 50 -#define HALLCNTTHRESHOLD 20 -#define HALLIDLETHRESHOLD 20 -#define HALLIDLESAMPLES 15 -#define HALLPLAYSAMPLES 24 -#define HALLTHRESHOLD 5 +#define HALLINTERVAL 100 +// #define HALLCNTTHRESHOLD 20 +// #define HALLIDLETHRESHOLD 20 +// #define HALLIDLESAMPLES 15 +// #define HALLPLAYSAMPLES 24 +#define HALLTHRESHOLD 2 -typedef enum -{ - hall_idle, - hall_increasing, - hall_tipover, - hall_decreasing, -}HALLSENSORSTATES; +// typedef enum +// { +// hall_idle, +// hall_increasing, +// hall_tipover, +// hall_decreasing, +// }HALLSENSORSTATES; void initSensor(void);