From cf5ff99d8a7faea7ee2d0e64cbb69adcb1d2ac25 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Feb 2024 17:48:22 +0700 Subject: [PATCH] add Factory RESET --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 76 +++++++++++++++++++++++++++++- examples/Open_Air/Open_Air.ino | 76 ++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+), 2 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 5215177..550d3fa 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -153,6 +153,19 @@ public: loadConfig(); } + /** + * @brief Reset local config into default value. + * + */ + void defaultReset(void) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + config.useRGBLedBar = UseLedBarOff; + saveConfig(); + } + /** * @brief Get server configuration * @@ -687,6 +700,7 @@ static void showNr(void); static void webServerInit(void); static String getServerSyncData(bool localServer); static void createMqttTask(void); +static void factoryConfigReset(void); /** Init schedule */ bool hasSensorS8 = true; @@ -694,6 +708,7 @@ bool hasSensorPMS = true; bool hasSensorSGP = true; bool hasSensorSHT = true; int pmFailCount = 0; +uint32_t factoryBtnPressTime = 0; AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, updateDispLedBar); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -810,6 +825,9 @@ void loop() { /** Check for handle WiFi reconnect */ updateWiFiConnect(); + + /** factory reset handle */ + factoryConfigReset(); } static void setTestColor(char color) { @@ -1000,6 +1018,58 @@ static void createMqttTask(void) { } } +static void factoryConfigReset(void) { + if (ag.button.getState() == ag.button.BUTTON_PRESSED) { + if (factoryBtnPressTime == 0) { + factoryBtnPressTime = millis(); + } else { + uint32_t ms = (uint32_t)(millis() - factoryBtnPressTime); + if (ms >= 2000) { + // Show display message: For factory keep for x seconds + // Count display. + displayShowText("For factory reset", "keep pressed", "for 8 sec"); + + int count = 7; + while (ag.button.getState() == ag.button.BUTTON_PRESSED) { + delay(1000); + displayShowText("For factory reset", "keep pressed", + "for " + String(count) + " sec"); + count--; + // ms = (uint32_t)(millis() - factoryBtnPressTime); + if (count == 0) { + /** Stop MQTT task first */ + if (mqttTask) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } + + /** Disconnect WIFI */ + WiFi.disconnect(); + wifiManager.resetSettings(); + + /** Reset local config */ + agServer.defaultReset(); + + displayShowText("Factory reset", "successful", ""); + delay(3000); + ESP.restart(); + } + } + + /** Show current content cause reset ignore */ + factoryBtnPressTime = 0; + appDispHandler(); + } + } + } else { + if (factoryBtnPressTime != 0) { + /** Restore last display content */ + appDispHandler(); + } + factoryBtnPressTime = 0; + } +} + static void sendPing() { JSONVar root; root["wifi"] = WiFi.RSSI(); @@ -1950,7 +2020,9 @@ static void updateWiFiConnect(void) { * */ static void updateDispLedBar(void) { - appDispHandler(); + if (factoryBtnPressTime == 0) { + appDispHandler(); + } appLedHandler(); } @@ -2007,7 +2079,7 @@ static void sendDataToServer(void) { if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } - + bootCount++; } diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 1132333..a39392e 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -85,6 +85,8 @@ enum { #define LED_FAST_BLINK_DELAY 250 /** ms */ #define LED_SLOW_BLINK_DELAY 1000 /** ms */ +#define LED_SHORT_BLINK_DELAY 500 /** ms */ +#define LED_LONG_BLINK_DELAY 2000 /** ms */ #define WIFI_CONNECT_COUNTDOWN_MAX 180 /** sec */ #define WIFI_CONNECT_RETRY_MS 10000 /** ms */ #define LED_BAR_COUNT_INIT_VALUE (-1) /** */ @@ -153,6 +155,19 @@ public: loadConfig(); } + /** + * @brief Reset local config into default value. + * + */ + void defaultReset(void) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + config.useRGBLedBar = UseLedBarOff; + saveConfig(); + } + /** * @brief Get server configuration * @@ -704,11 +719,13 @@ static void showNr(void); static void webServerInit(void); static String getServerSyncData(bool localServer); static void createMqttTask(void); +static void factoryConfigReset(void); bool hasSensorS8 = true; bool hasSensorPMS1 = true; bool hasSensorPMS2 = true; bool hasSensorSGP = true; +uint32_t factoryBtnPressTime = 0; AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); AgSchedule co2Schedule(SENSOR_CO2_UPDATE_INTERVAL, co2Poll); @@ -777,6 +794,8 @@ void loop() { } } updateWiFiConnect(); + + factoryConfigReset(); } void sendPing() { @@ -1450,6 +1469,63 @@ static void createMqttTask(void) { } } +static void factoryConfigReset(void) { + if (ag.button.getState() == ag.button.BUTTON_PRESSED) { + if (factoryBtnPressTime == 0) { + factoryBtnPressTime = millis(); + } else { + uint32_t ms = (uint32_t)(millis() - factoryBtnPressTime); + if (ms >= 2000) { + Serial.println("Factory reset keep presssed for 8 sec"); + + uint32_t ledTime = millis(); + bool ledOn = true; + ag.statusLed.setOn(); + while (ag.button.getState() == ag.button.BUTTON_PRESSED) { + ms = (uint32_t)(millis() - ledTime); + if (ms >= LED_SHORT_BLINK_DELAY) { + ledTime = millis(); + ag.statusLed.setToggle(); + } + + ms = (uint32_t)(millis() - factoryBtnPressTime); + if (ms > 10000) { + ag.statusLed.setOff(); + + /** Stop MQTT task first */ + if (mqttTask) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } + + /** Disconnect WIFI */ + WiFi.disconnect(); + wifiManager.resetSettings(); + + /** Reset local config */ + agServer.defaultReset(); + + Serial.println("Factory successful"); + ledBlinkDelay(LED_LONG_BLINK_DELAY); + ledBlinkDelay(LED_LONG_BLINK_DELAY); + ledBlinkDelay(LED_LONG_BLINK_DELAY); + ESP.restart(); + } + } + + /** Show current content cause reset ignore */ + factoryBtnPressTime = 0; + ag.statusLed.setOff(); + } + } + } else { + if (factoryBtnPressTime != 0) { + ag.statusLed.setOff(); + } + factoryBtnPressTime = 0; + } +} + static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {