clean up statemachine and simplify sensor
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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(stateIdle);
|
setGameState(stateArmed);
|
||||||
setRFIDscanState(false);
|
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;
|
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())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user