clean up statemachine and simplify sensor
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(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);
|
||||
setRFIDscanState(false);
|
||||
log_i("nextState = idle");
|
||||
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())
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -46,6 +46,15 @@ String getRFIDlastUID(void)
|
||||
return lastUid;
|
||||
}
|
||||
|
||||
bool getRFIDlastUIDValid(void)
|
||||
{
|
||||
if(getRFIDlastUID() != "")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void setRFIDscanState(bool state)
|
||||
{
|
||||
RfidScanActive = state;
|
||||
|
||||
@@ -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);
|
||||
|
||||
initBattery();
|
||||
initAS5600();
|
||||
|
||||
result = ADS.isConnected();
|
||||
ADSinitOK = result;
|
||||
if(!result)
|
||||
{
|
||||
log_e("sensor init: FAIL");
|
||||
log_e("Failed to init ADS1x15");
|
||||
}
|
||||
else
|
||||
return result;
|
||||
}
|
||||
|
||||
void initBattery(void)
|
||||
{
|
||||
log_i("sensor init: OK");
|
||||
hallinitOK = true;
|
||||
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();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user