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
build_flags =
-DHARDWARE=2
-DCORE_DEBUG_LEVEL=4
-DCORE_DEBUG_LEVEL=3
-DNDEF_DEBUG=1
upload_protocol = espota
upload_port = muziekdoos.local

View File

@@ -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())
{

View File

@@ -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);

View File

@@ -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:

View File

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

View File

@@ -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)
{
}

View File

@@ -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);