From c340ab9d2a1fe2003c582c84d5649de6e2bfc057 Mon Sep 17 00:00:00 2001 From: willem Date: Sun, 2 Jan 2022 18:50:22 +0100 Subject: [PATCH] extend power statemachine --- FW/leo_muziekdoos_esp32/src/audio.cpp | 8 +++ FW/leo_muziekdoos_esp32/src/led.cpp | 86 +++++++++++++++++++-------- FW/leo_muziekdoos_esp32/src/led.h | 6 +- FW/leo_muziekdoos_esp32/src/main.cpp | 12 +++- FW/leo_muziekdoos_esp32/src/ota.cpp | 26 +++++++- FW/leo_muziekdoos_esp32/src/ota.h | 17 ++++-- FW/leo_muziekdoos_esp32/src/power.cpp | 55 ++++++++++++++++- FW/leo_muziekdoos_esp32/src/power.h | 7 ++- 8 files changed, 178 insertions(+), 39 deletions(-) diff --git a/FW/leo_muziekdoos_esp32/src/audio.cpp b/FW/leo_muziekdoos_esp32/src/audio.cpp index b83aa8b..01affc8 100644 --- a/FW/leo_muziekdoos_esp32/src/audio.cpp +++ b/FW/leo_muziekdoos_esp32/src/audio.cpp @@ -105,6 +105,14 @@ void initAudio() void setAudioState(bool state) { audioState = state; + if (state) + { + digitalWrite(DAC_SDMODE, HIGH); + } + else + { + digitalWrite(DAC_SDMODE, LOW); + } log_i("set Audio state %d", state); } diff --git a/FW/leo_muziekdoos_esp32/src/led.cpp b/FW/leo_muziekdoos_esp32/src/led.cpp index 8634af2..a5d85bc 100644 --- a/FW/leo_muziekdoos_esp32/src/led.cpp +++ b/FW/leo_muziekdoos_esp32/src/led.cpp @@ -3,8 +3,28 @@ CRGB leds[NUM_LEDS]; bool ledstate = false; +bool blinkState = false; +CRGB ledcolor = CRGB::Black; uint32_t lastLedTime = 0; +void setLedBlink(bool blink) +{ + blinkState = blink; +} + +void SetLedColor(CRGB color) +{ + ledcolor = color; + setLedBlink(false); +} + +void SetLedColor(CRGB color, bool blink) +{ + SetLedColor(color); + setLedBlink(blink); +} + + void initLed(void) { FastLED.addLeds(leds, NUM_LEDS); // GRB ordering is typical @@ -16,42 +36,58 @@ void handleLed(void) uint32_t timeNow = millis(); if (timeNow - lastLedTime > LEDTIMEOUT) { - if (ledstate) + if (blinkState) { - if (getPowerState() == POWERSTATES::on) + if (!ledstate) { - if(getAudioState()) - { - leds[0] = CRGB::Purple; - } - else if( getRFIDlastUID() != "") - { - leds[0] = CRGB::Yellow; - } - else - { - leds[0] = CRGB::Green; - } - } - else if (getPowerState() == POWERSTATES::poweringOn2) - { - leds[0] = CRGB::Blue; - } - else if (getPowerState() == POWERSTATES::poweringOff2) - { - leds[0] = CRGB::Orange; + leds[0] = CRGB::Black; } else { - leds[0] = CRGB::Red; + leds[0] = ledcolor; } + ledstate = !ledstate; } else { - leds[0] = CRGB::Black; + leds[0] = ledcolor; } + + // if (ledstate) + // { + // if (getPowerState() == POWERSTATES::on) + // { + // if(getAudioState()) + // { + // leds[0] = CRGB::Purple; + // } + // else if( getRFIDlastUID() != "") + // { + // leds[0] = CRGB::Yellow; + // } + // else + // { + // leds[0] = CRGB::Green; + // } + // } + // else if (getPowerState() == POWERSTATES::poweringOn2) + // { + // leds[0] = CRGB::Blue; + // } + // else if (getPowerState() == POWERSTATES::poweringOff2) + // { + // leds[0] = CRGB::Orange; + // } + // else + // { + // leds[0] = CRGB::Red; + // } + // } + // else + // { + // leds[0] = CRGB::Black; + // } FastLED.show(); - ledstate = !ledstate; lastLedTime = timeNow; } } \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/src/led.h b/FW/leo_muziekdoos_esp32/src/led.h index 7e469a6..81ab93e 100644 --- a/FW/leo_muziekdoos_esp32/src/led.h +++ b/FW/leo_muziekdoos_esp32/src/led.h @@ -9,4 +9,8 @@ #define LEDTIMEOUT 500 void initLed(void); -void handleLed(void); \ No newline at end of file +void handleLed(void); + +void setLedBlink(bool blink); +void SetLedColor(CRGB color); +void SetLedColor(CRGB color, bool blink); diff --git a/FW/leo_muziekdoos_esp32/src/main.cpp b/FW/leo_muziekdoos_esp32/src/main.cpp index d010ef3..a5487c6 100644 --- a/FW/leo_muziekdoos_esp32/src/main.cpp +++ b/FW/leo_muziekdoos_esp32/src/main.cpp @@ -45,7 +45,15 @@ void loop() handleSensor(); handleHallSensor(); handleGame(); - handleOta(); - log_v("main: looptime = %d", millis() - looptime); } + else if(getPowerState() == POWERSTATES::overTheAir2) + { + handleOta(); + } + else + { + /* noting */ + } + log_v("main: looptime = %d", millis() - looptime); + } diff --git a/FW/leo_muziekdoos_esp32/src/ota.cpp b/FW/leo_muziekdoos_esp32/src/ota.cpp index a49dd66..8963c95 100644 --- a/FW/leo_muziekdoos_esp32/src/ota.cpp +++ b/FW/leo_muziekdoos_esp32/src/ota.cpp @@ -1,5 +1,8 @@ #include "ota.h" +OtaProcess_class ota(100); + + bool OtaProcess_class::initialize(void) { if (m_newState) @@ -47,6 +50,7 @@ bool OtaProcess_class::initialize(void) .onStart([]() { String type; + ota.m_otaState = otaStart; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; @@ -59,12 +63,13 @@ bool OtaProcess_class::initialize(void) // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() Serial.println("Start updating " + type); }) .onEnd([]() - { log_i("End"); }) + { log_i("End"); ota.m_otaState = otaDone; }) .onProgress([](unsigned int progress, unsigned int total) - { log_i("Progress: %u%%\r", (progress / (total / 100))); }) + { log_i("Progress: %u%%\r", (progress / (total / 100))); ota.m_otaState = otaBusy; }) .onError([](ota_error_t error) { log_e("Error[%u]: ", error); + ota.m_otaState = otaError; if (error == OTA_AUTH_ERROR) log_e("Auth Failed"); else if (error == OTA_BEGIN_ERROR) log_e("Begin Failed"); else if (error == OTA_CONNECT_ERROR) log_e("Connect Failed"); @@ -151,10 +156,27 @@ void OtaProcess_class::stopped(void) } } +void otaEnable(void) +{ + ota.setProcessState(PROCESS_STATE::processInit); +} + +void otaDisable(void) +{ + ota.setProcessState(PROCESS_STATE::processDisabled); +} + void initOta(void) { + /* noting */ +} + +OTASTATES getOtaState(void) +{ + return ota.m_otaState; } void handleOta(void) { + ota.run(); } \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/src/ota.h b/FW/leo_muziekdoos_esp32/src/ota.h index 26ee7d3..671fd4a 100644 --- a/FW/leo_muziekdoos_esp32/src/ota.h +++ b/FW/leo_muziekdoos_esp32/src/ota.h @@ -6,18 +6,20 @@ #include "LITTLEFS.h" -class OtaProcess_class : public processClass -{ typedef enum{ otaInit, otaConnect, otaSetup, - otaStart, otaInitDone, + otaStart, + otaBusy, + otaDone, otaError }OTASTATES; +class OtaProcess_class : public processClass +{ + - OTASTATES m_otaState = otaInit; void active(void); bool initialize(void); @@ -28,7 +30,12 @@ class OtaProcess_class : public processClass public: OtaProcess_class(uint32_t timeout):processClass(timeout){} + + OTASTATES m_otaState = otaInit; + }; void initOta(void); -void handleOta(void); \ No newline at end of file +void handleOta(void); +OTASTATES getOtaState(void); +void otaEnable(void); \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/src/power.cpp b/FW/leo_muziekdoos_esp32/src/power.cpp index 8007cf4..fb28f41 100644 --- a/FW/leo_muziekdoos_esp32/src/power.cpp +++ b/FW/leo_muziekdoos_esp32/src/power.cpp @@ -9,6 +9,7 @@ uint64_t measure_timer = 0; POWERSTATES powerstate = off; Button buttonPower(PWR_BTN, 250UL, 1U, 0); +extern OtaProcess_class ota; Battery battery(VBATTMIN, VBATTMAX, MEAS_ADC, &getvbatt); @@ -46,7 +47,7 @@ void powerOff(void) digitalWrite(DAC_SDMODE, LOW); digitalWrite(PWR_HOLD, LOW); delay(1000); - ESP.restart(); + // ESP.restart(); } bool measureBattery(void) @@ -83,6 +84,7 @@ void handlePowerState(void) powerstate = poweringOn; } powerOff(); + SetLedColor(CRGB::Red); log_w("Powered-off"); } break; @@ -91,17 +93,22 @@ void handlePowerState(void) if (buttonPower.pressedFor(POWERBUTTONDELAY)) { powerstate = poweringOn2; + SetLedColor(CRGB::White); + log_i("poweron 3/3 => Go"); } - else if (buttonPower.pressedFor(500)) + else if (buttonPower.pressedFor(POWERBUTTONDELAY / 2)) { log_i("poweron 2/3"); + SetLedColor(CRGB::WhiteSmoke); } else if (buttonPower.pressedFor(200)) { log_i("poweron 1/3"); + SetLedColor(CRGB::GhostWhite); } - else + + if (!buttonread) { powerstate = off; } @@ -119,12 +126,21 @@ void handlePowerState(void) // powerstate = lowBatt; // } } + else + { + log_i("Release for poweron, hold for %d to OTA", (POWERBUTTONOTADELAY - buttonPower.getPressedFor())); + } + if (buttonPower.pressedFor(POWERBUTTONOTADELAY)) + { + powerstate = overTheAir; + } } break; case powerinit: { // init all log_i("powerinit"); + SetLedColor(CRGB::Green); powerstate = on; } break; @@ -149,15 +165,19 @@ void handlePowerState(void) { powerstate = poweringOff2; setAudioState(false); + SetLedColor(CRGB::Red, true); + log_w("poweringoff: 3/3 ==> powerOff"); } else if (buttonPower.pressedFor(500)) { log_w("poweringoff: 2/3"); + SetLedColor(CRGB::Orange, true); } else if (buttonPower.pressedFor(200)) { log_w("poweringoff: 1/3"); + SetLedColor(CRGB::Brown, true); } else { @@ -170,6 +190,7 @@ void handlePowerState(void) if (!buttonread) { powerstate = off; + SetLedColor(CRGB::Red, true); } } break; @@ -177,6 +198,7 @@ void handlePowerState(void) { log_w("timeout ==> off"); powerstate = off; + SetLedColor(CRGB::Red); powerOff(); delay(5000); } @@ -189,6 +211,33 @@ void handlePowerState(void) log_w("lowbatt"); } } + case overTheAir: + { + if (!buttonread) + { + powerstate = overTheAir2; + otaEnable(); + SetLedColor(CRGB::Blue); + powerOn(); + } + log_i("ota state active, release powerbutton"); + } + case overTheAir2: + { + if (getOtaState() == OTASTATES::otaBusy) + { + SetLedColor(CRGB::Blue, true); + log_i("ota state active, ota busy ==> On"); + + } + if (getOtaState() == OTASTATES::otaDone) + { + log_i("ota state active, ota Done ==> On"); + + powerstate = POWERSTATES::on; + SetLedColor(CRGB::Green, true); + } + } break; } } diff --git a/FW/leo_muziekdoos_esp32/src/power.h b/FW/leo_muziekdoos_esp32/src/power.h index d9418ea..a88e258 100644 --- a/FW/leo_muziekdoos_esp32/src/power.h +++ b/FW/leo_muziekdoos_esp32/src/power.h @@ -6,11 +6,14 @@ #include "Battery.h" #include "sensor.h" #include "audio.h" +#include "ota.h" +#include "led.h" #define TIMEOUT_POWER (5 * 1000 * 60) //5minutes timeout #define POWERBUTTONDELAY 1000 #define BATTERYMEASUREDELAY 60000 +#define POWERBUTTONOTADELAY 10000 typedef enum { @@ -22,7 +25,9 @@ typedef enum poweringOff, poweringOff2, timeOut, - lowBatt + lowBatt, + overTheAir, + overTheAir2 } POWERSTATES; POWERSTATES getPowerState( void );