clean up statemachine and simplify sensor

This commit is contained in:
2023-01-01 20:11:24 +01:00
parent 01be1b6a93
commit ae2dde8e63
7 changed files with 205 additions and 122 deletions

View File

@@ -21,7 +21,7 @@ lib_ldf_mode = deep+
extra_scripts = ./littlefsbuilder.py extra_scripts = ./littlefsbuilder.py
build_flags = build_flags =
-DHARDWARE=2 -DHARDWARE=2
-DCORE_DEBUG_LEVEL=4 -DCORE_DEBUG_LEVEL=3
-DNDEF_DEBUG=1 -DNDEF_DEBUG=1
upload_protocol = espota upload_protocol = espota
upload_port = muziekdoos.local upload_port = muziekdoos.local

View File

@@ -5,17 +5,55 @@
bool newState = true; bool newState = true;
uint32_t idleTime = 0; 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) void initGame(void)
{ {
log_i("Game: init: done"); log_i("Game: init: done");
} }
void setGameState(GamneStates newstate) void setGameState(GameStates newstate)
{ {
gameState = newstate; gameState = newstate;
newState = true; 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) void handleGame(void)
@@ -24,69 +62,100 @@ void handleGame(void)
{ {
case stateInit: case stateInit:
{ {
SetLedColor(CRGB::White);
setLedBlink(true);
if (newState) if (newState)
{ {
log_i("activeState = Init"); // log_i("activeState = Init");
newState = false; // newState = false;
handleNewState();
} }
if (getSensorInitStatus() && getAudioInitStatus() && getRFIDInitStatus()) if (getSensorInitStatus() && getAudioInitStatus() && getRFIDInitStatus())
{ {
setGameState(stateIdle); setGameState(stateIdle);
log_i("nextState = idle"); //log_i("nextState = idle");
} }
} }
break; break;
case stateIdle: case stateIdle:
{ {
SetLedColor(CRGB::Purple);
setLedBlink(false);
if (newState) if (newState)
{ {
log_i("activeState = Idle"); handleNewState();
newState = false;
idleTime = millis(); idleTime = millis();
} }
if (getRFIDlastUID() == "") if (getRFIDlastUID() == "")
{ {
setGameState(stateScanning); setGameState(stateScanning);
log_i("nextState = Scanning"); //log_i("nextState = Scanning");
}
else
{
if (!hallIsIdle())
{
setGameState(stateStartPlaying);
log_i("nextState = Start playing");
}
else
{
setRFIDscanState(true);
}
} }
} }
break; break;
case stateScanning: case stateScanning:
{ {
SetLedColor(CRGB::Green);
setLedBlink(true);
if (newState) if (newState)
{ {
log_i("activeState = RFID scanning"); handleNewState();
//log_i("activeState = RFID scanning");
setRFIDscanState(true); setRFIDscanState(true);
newState = false; //newState = false;
} }
if (getRFIDlastUID() != "") 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); setGameState(stateIdle);
setRFIDscanState(false); setRFIDscanState(false);
log_i("nextState = idle"); clearRFIDlastUID();
//log_i("nextState = idle");
} }
} }
}
break; break;
case stateStartPlaying: case stateStartPlaying:
{ {
SetLedColor(CRGB::Pink);
setLedBlink(true);
if (newState) if (newState)
{ {
log_i("activeState = startPlaying"); //log_i("activeState = startPlaying");
newState = false; //newState = false;
handleNewState();
setRFIDscanState(false); setRFIDscanState(false);
PowerKeepAlive(); PowerKeepAlive();
@@ -106,15 +175,19 @@ void handleGame(void)
playSong(nextSong); playSong(nextSong);
setAudioState(true); setAudioState(true);
setGameState(statePlaying); setGameState(statePlaying);
} }
} }
break; break;
case statePlaying: case statePlaying:
{ {
SetLedColor(CRGB::Pink);
setLedBlink(false);
if (newState) if (newState)
{ {
log_i("activeState = Playing"); handleNewState();
newState = false; // log_i("activeState = Playing");
// newState = false;
} }
if (hallIsIdle()) if (hallIsIdle())
@@ -126,10 +199,13 @@ void handleGame(void)
break; break;
case stateStopPlaying: case stateStopPlaying:
{ {
SetLedColor(CRGB::Teal);
setLedBlink(true);
if (newState) if (newState)
{ {
log_i("activeState = stopPlaying"); handleNewState();
newState = false; // log_i("activeState = stopPlaying");
// newState = false;
} }
if (!getAudioState()) if (!getAudioState())
@@ -140,10 +216,13 @@ void handleGame(void)
break; break;
case stateStopped: case stateStopped:
{ {
SetLedColor(CRGB::Teal);
setLedBlink(false);
if (newState) if (newState)
{ {
log_i("activeState = stopped"); // log_i("activeState = stopped");
newState = false; // newState = false;
handleNewState();
} }
if (!getAudioState()) if (!getAudioState())
{ {

View File

@@ -9,17 +9,19 @@
#include "power.h" #include "power.h"
#define TIMEOUT_IDLE 20000 #define TIMEOUT_IDLE 20000
#define TIMEOUT_ARMED 10000
typedef enum{ typedef enum{
stateInit, stateInit,
stateIdle, stateIdle,
stateScanning, stateScanning,
stateArmed,
stateStartPlaying, stateStartPlaying,
statePlaying, statePlaying,
stateStopPlaying, stateStopPlaying,
stateStopped, stateStopped,
stateLAST stateLAST
}GamneStates; }GameStates;
void initGame(void); void initGame(void);
void handleGame(void); void handleGame(void);
@@ -27,3 +29,6 @@ bool hallIsIdle(void);
void handleHallSensor(void); void handleHallSensor(void);
String StateToString(GameStates state);

View File

@@ -132,6 +132,7 @@ bool OtaProcess_class::initialize(void)
ArduinoOTA.begin(); ArduinoOTA.begin();
log_i("Ota ready, IPaddress:%s", WiFi.localIP()); log_i("Ota ready, IPaddress:%s", WiFi.localIP());
m_otaState = otaInitDone; m_otaState = otaInitDone;
setLedBlink(true);
} }
break; break;
case otaInitDone: case otaInitDone:

View File

@@ -46,6 +46,15 @@ String getRFIDlastUID(void)
return lastUid; return lastUid;
} }
bool getRFIDlastUIDValid(void)
{
if(getRFIDlastUID() != "")
{
return true;
}
return false;
}
void setRFIDscanState(bool state) void setRFIDscanState(bool state)
{ {
RfidScanActive = state; RfidScanActive = state;

View File

@@ -13,48 +13,23 @@ uint16_t BatterySensor = 0;
uint16_t BatteryVoltage = 0; uint16_t BatteryVoltage = 0;
uint32_t BatteryWarningFirst = 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 hall_is_Idle = true;
bool hallinitOK = false; bool ADSinitOK = false;
bool ASinitOK = 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 getSensorInitStatus(void) bool getSensorInitStatus(void)
{ {
return hallinitOK; return (ADSinitOK & ASinitOK);
}
uint16_t getHall(void)
{
return HallSensor;
} }
uint16_t getvbatt(uint8_t dummy = 0) 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); int16_t readbatt = ADS.readADC(MEAS_ADC);
log_i("readvbat=%d", readbatt); log_i("readvbat=%d", readbatt);
return readbatt; return readbatt;
@@ -65,41 +40,49 @@ bool hallIsIdle(void)
return hall_is_Idle; return hall_is_Idle;
} }
void initBattery(void) bool initADS(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)
{ {
log_i("sensor init ADS1x15:"); log_i("sensor init ADS1x15:");
bool result = ADS.begin(I2C_SDA, I2C_SCL); bool result = ADS.begin(I2C_SDA, I2C_SCL);
ADS.setMode(0); 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(); initBattery();
initAS5600(); initAS5600();
if (!result)
{
log_e("sensor init: FAIL");
}
else
{
log_i("sensor init: OK");
hallinitOK = true;
}
} }
bool CheckBattery(void) bool CheckBattery(void)
@@ -164,29 +147,35 @@ void handleBatterySensor(void)
} }
} }
HALLSENSORSTATES getprogressstate(uint16_t sample)
{
return hall_idle;
}
void handleHallSensor(void) void handleHallSensor(void)
{ {
readsensor(); uint32_t timeNow = millis();
if (timeNow - lastADS < ADSINTERVAL)
{
return;
}
lastADS = timeNow;
int angle = as5600.getCumulativePosition(); int angle = as5600.getCumulativePosition();
log_i("sensor angle %d", angle); log_v("sensor angle %d", angle);
if( angle > HALLTHRESHOLD) if( angle > HALLTHRESHOLD)
{ {
if(hall_is_Idle)
{
log_i("hall state changed (&i)", angle);
}
hall_is_Idle = false; hall_is_Idle = false;
} }
else else
{ {
if(!hall_is_Idle)
{
log_i("hall state changed (&i)", angle);
}
hall_is_Idle = true; hall_is_Idle = true;
} }
as5600.resetPosition(); as5600.resetPosition();
} }
void readsensor(void)
{
}

View File

@@ -8,25 +8,25 @@
#include "AS5600.h" #include "AS5600.h"
#include "Wire.h" #include "Wire.h"
#define ADSINTERVAL 100 #define ADSINTERVAL 300
#define VBATTINTERVALL 15000 #define VBATTINTERVALL 15000
#define VBATTMEASPRECHARGE 500 #define VBATTMEASPRECHARGE 500
#define LOWBATTPERIOD 30000 #define LOWBATTPERIOD 30000
#define HALLINTERVAL 50 #define HALLINTERVAL 100
#define HALLCNTTHRESHOLD 20 // #define HALLCNTTHRESHOLD 20
#define HALLIDLETHRESHOLD 20 // #define HALLIDLETHRESHOLD 20
#define HALLIDLESAMPLES 15 // #define HALLIDLESAMPLES 15
#define HALLPLAYSAMPLES 24 // #define HALLPLAYSAMPLES 24
#define HALLTHRESHOLD 5 #define HALLTHRESHOLD 2
typedef enum // typedef enum
{ // {
hall_idle, // hall_idle,
hall_increasing, // hall_increasing,
hall_tipover, // hall_tipover,
hall_decreasing, // hall_decreasing,
}HALLSENSORSTATES; // }HALLSENSORSTATES;
void initSensor(void); void initSensor(void);