diff --git a/src/MainTask.h b/src/MainTask.h index 09795aa..3c53613 100644 --- a/src/MainTask.h +++ b/src/MainTask.h @@ -73,8 +73,20 @@ protected: } if (vars.actions.restart) { - vars.actions.restart = false; this->restartSignalTime = millis(); + vars.actions.restart = false; + vars.states.restarting = true; + + // save settings + fsSettings.updateNow(); + + // save sensors settings + fsSensorsSettings.updateNow(); + + // force save network settings + if (fsNetworkSettings.updateNow() == FD_FILE_ERR && LittleFS.begin()) { + fsNetworkSettings.write(); + } Log.sinfoln(FPSTR(L_MAIN), F("Restart signal received. Restart after 10 sec.")); } @@ -148,20 +160,9 @@ protected: // restart - if (this->restartSignalTime > 0 && millis() - this->restartSignalTime > 10000) { - // save settings - fsSettings.updateNow(); + if (vars.states.restarting && millis() - this->restartSignalTime > 10000) { + vars.states.restarting = false; - // save sensors settings - fsSensorsSettings.updateNow(); - - // force save network settings - if (fsNetworkSettings.updateNow() == FD_FILE_ERR && LittleFS.begin()) { - fsNetworkSettings.write(); - } - - this->restartSignalTime = 0; - this->delay(500); ESP.restart(); } } @@ -170,8 +171,10 @@ protected: unsigned int freeHeap = getFreeHeap(); unsigned int maxFreeBlockHeap = getMaxFreeBlockHeap(); - if (!this->restartSignalTime && (freeHeap < 2048 || maxFreeBlockHeap < 2048)) { + // critical heap + if (!vars.states.restarting && (freeHeap < 2048 || maxFreeBlockHeap < 2048)) { this->restartSignalTime = millis(); + vars.states.restarting = true; } if (settings.system.logLevel < TinyLogger::Level::VERBOSE) { diff --git a/src/MqttTask.h b/src/MqttTask.h index a85c7e5..fe29a9c 100644 --- a/src/MqttTask.h +++ b/src/MqttTask.h @@ -184,6 +184,10 @@ protected: } void loop() { + if (vars.states.restarting || vars.states.upgrading) { + return; + } + if (this->connected && !this->client->connected()) { this->connected = false; this->onDisconnect(); diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index 31db6bb..c019f28 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -106,6 +106,10 @@ protected: } void loop() { + if (vars.states.restarting || vars.states.upgrading) { + return; + } + if (this->instanceInGpio != settings.opentherm.inGpio || this->instanceOutGpio != settings.opentherm.outGpio) { this->setup(); diff --git a/src/PortalTask.h b/src/PortalTask.h index 7e1358a..02491b5 100644 --- a/src/PortalTask.h +++ b/src/PortalTask.h @@ -189,6 +189,11 @@ protected: return true; })->setBeforeUpgradeCallback([](UpgradeHandler::UpgradeType type) -> bool { + if (vars.states.restarting) { + return false; + } + + vars.states.upgrading = true; return true; })->setAfterUpgradeCallback([this](const UpgradeHandler::UpgradeResult& fwResult, const UpgradeHandler::UpgradeResult& fsResult) { unsigned short status = 200; @@ -209,6 +214,8 @@ protected: response.concat(fsResult.error); response.concat(F("\"}}")); this->webServer->send(status, F("application/json"), response); + + vars.states.upgrading = false; }); this->webServer->addHandler(upgradeHandler); @@ -247,6 +254,10 @@ protected: } } + if (vars.states.restarting) { + return this->webServer->send(503); + } + const String& plain = this->webServer->arg(0); Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("Request /api/backup/restore %d bytes: %s"), plain.length(), plain.c_str()); @@ -337,6 +348,10 @@ protected: return this->webServer->send(401); } } + + if (vars.states.restarting) { + return this->webServer->send(503); + } const String& plain = this->webServer->arg(0); Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("Request /api/network/settings %d bytes: %s"), plain.length(), plain.c_str()); @@ -452,6 +467,10 @@ protected: return this->webServer->send(401); } } + + if (vars.states.restarting) { + return this->webServer->send(503); + } const String& plain = this->webServer->arg(0); Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("Request /api/settings %d bytes: %s"), plain.length(), plain.c_str()); @@ -557,6 +576,10 @@ protected: return this->webServer->send(401); } } + + if (vars.states.restarting) { + return this->webServer->send(503); + } #ifdef ARDUINO_ARCH_ESP8266 if (!this->webServer->hasArg(F("id")) || this->webServer->args() != 1) { diff --git a/src/RegulatorTask.h b/src/RegulatorTask.h index 50a5f96..e749adf 100644 --- a/src/RegulatorTask.h +++ b/src/RegulatorTask.h @@ -32,6 +32,10 @@ protected: #endif void loop() { + if (vars.states.restarting || vars.states.upgrading) { + return; + } + this->indoorSensorsConnected = Sensors::existsConnectedSensorsByPurpose(Sensors::Purpose::INDOOR_TEMP); //this->outdoorSensorsConnected = Sensors::existsConnectedSensorsByPurpose(Sensors::Purpose::OUTDOOR_TEMP); diff --git a/src/SensorsTask.h b/src/SensorsTask.h index 675401f..6519a82 100644 --- a/src/SensorsTask.h +++ b/src/SensorsTask.h @@ -59,6 +59,10 @@ protected: #endif void loop() { + if (vars.states.restarting || vars.states.upgrading) { + return; + } + if (isPollingDallasSensors()) { pollingDallasSensors(false); this->yield(); diff --git a/src/Settings.h b/src/Settings.h index ecb3f67..3830942 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -366,4 +366,9 @@ struct Variables { bool resetFault = false; bool resetDiagnostic = false; } actions; + + struct { + bool restarting = false; + bool upgrading = false; + } states; } vars; \ No newline at end of file