Fix: Restart was triggered before all website data was sent

This led to the effect that e.g. the confirmation messages where  not shown.

It is somehow related to ESPAsyncWebServer 3.3.0
This commit is contained in:
Thomas Basler 2024-09-23 18:11:52 +02:00
parent 5c460e26c9
commit e785904fca
10 changed files with 66 additions and 38 deletions

18
include/RestartHelper.h Normal file
View File

@ -0,0 +1,18 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <TaskSchedulerDeclarations.h>
class RestartHelperClass {
public:
RestartHelperClass();
void init(Scheduler& scheduler);
void triggerRestart();
private:
void loop();
Task _rebootTask;
};
extern RestartHelperClass RestartHelper;

View File

@ -9,7 +9,6 @@ public:
static uint32_t getChipId(); static uint32_t getChipId();
static uint64_t generateDtuSerial(); static uint64_t generateDtuSerial();
static int getTimezoneOffset(); static int getTimezoneOffset();
static void restartDtu();
static bool checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line); static bool checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line);
static void removeAllFiles(); static void removeAllFiles();
}; };

View File

@ -6,13 +6,9 @@
class WebApiFirmwareClass { class WebApiFirmwareClass {
public: public:
WebApiFirmwareClass();
void init(AsyncWebServer& server, Scheduler& scheduler); void init(AsyncWebServer& server, Scheduler& scheduler);
private: private:
void onFirmwareUpdateFinish(AsyncWebServerRequest* request); void onFirmwareUpdateFinish(AsyncWebServerRequest* request);
void onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); void onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final);
Task _rebootTask;
void rebootTaskCb();
}; };

36
src/RestartHelper.cpp Normal file
View File

@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2024 Thomas Basler and others
*/
#include "RestartHelper.h"
#include "Display_Graphic.h"
#include "Led_Single.h"
#include <Esp.h>
RestartHelperClass RestartHelper;
RestartHelperClass::RestartHelperClass()
: _rebootTask(2 * TASK_SECOND, TASK_FOREVER, std::bind(&RestartHelperClass::loop, this))
{
}
void RestartHelperClass::init(Scheduler& scheduler)
{
scheduler.addTask(_rebootTask);
}
void RestartHelperClass::triggerRestart()
{
_rebootTask.enable();
_rebootTask.restart();
}
void RestartHelperClass::loop()
{
if (_rebootTask.isFirstIteration()) {
LedSingle.turnAllOff();
Display.setStatus(false);
} else {
ESP.restart();
}
}

View File

@ -4,10 +4,8 @@
*/ */
#include "Utils.h" #include "Utils.h"
#include "Display_Graphic.h"
#include "Led_Single.h"
#include "MessageOutput.h" #include "MessageOutput.h"
#include <Esp.h> #include "PinMapping.h"
#include <LittleFS.h> #include <LittleFS.h>
uint32_t Utils::getChipId() uint32_t Utils::getChipId()
@ -59,16 +57,6 @@ int Utils::getTimezoneOffset()
return static_cast<int>(difftime(rawtime, gmt)); return static_cast<int>(difftime(rawtime, gmt));
} }
void Utils::restartDtu()
{
LedSingle.turnAllOff();
Display.setStatus(false);
yield();
delay(1000);
yield();
ESP.restart();
}
bool Utils::checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line) bool Utils::checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line)
{ {
if (doc.overflowed()) { if (doc.overflowed()) {

View File

@ -4,6 +4,7 @@
*/ */
#include "WebApi_config.h" #include "WebApi_config.h"
#include "Configuration.h" #include "Configuration.h"
#include "RestartHelper.h"
#include "Utils.h" #include "Utils.h"
#include "WebApi.h" #include "WebApi.h"
#include "WebApi_errors.h" #include "WebApi_errors.h"
@ -82,7 +83,7 @@ void WebApiConfigClass::onConfigDelete(AsyncWebServerRequest* request)
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
Utils::removeAllFiles(); Utils::removeAllFiles();
Utils::restartDtu(); RestartHelper.triggerRestart();
} }
void WebApiConfigClass::onConfigListGet(AsyncWebServerRequest* request) void WebApiConfigClass::onConfigListGet(AsyncWebServerRequest* request)
@ -124,7 +125,7 @@ void WebApiConfigClass::onConfigUploadFinish(AsyncWebServerRequest* request)
response->addHeader("Connection", "close"); response->addHeader("Connection", "close");
response->addHeader("Access-Control-Allow-Origin", "*"); response->addHeader("Access-Control-Allow-Origin", "*");
request->send(response); request->send(response);
Utils::restartDtu(); RestartHelper.triggerRestart();
} }
void WebApiConfigClass::onConfigUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final) void WebApiConfigClass::onConfigUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final)

View File

@ -6,7 +6,7 @@
#include "Configuration.h" #include "Configuration.h"
#include "Display_Graphic.h" #include "Display_Graphic.h"
#include "PinMapping.h" #include "PinMapping.h"
#include "Utils.h" #include "RestartHelper.h"
#include "WebApi.h" #include "WebApi.h"
#include "WebApi_errors.h" #include "WebApi_errors.h"
#include "helper.h" #include "helper.h"
@ -149,6 +149,6 @@ void WebApiDeviceClass::onDeviceAdminPost(AsyncWebServerRequest* request)
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
if (performRestart) { if (performRestart) {
Utils::restartDtu(); RestartHelper.triggerRestart();
} }
} }

View File

@ -4,17 +4,13 @@
*/ */
#include "WebApi_firmware.h" #include "WebApi_firmware.h"
#include "Configuration.h" #include "Configuration.h"
#include "RestartHelper.h"
#include "Update.h" #include "Update.h"
#include "Utils.h" #include "Utils.h"
#include "WebApi.h" #include "WebApi.h"
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
WebApiFirmwareClass::WebApiFirmwareClass()
: _rebootTask(TASK_IMMEDIATE, TASK_ONCE, std::bind(&WebApiFirmwareClass::rebootTaskCb, this))
{
}
void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler) void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -27,8 +23,6 @@ void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler)
server.on("/api/firmware/update", HTTP_POST, server.on("/api/firmware/update", HTTP_POST,
std::bind(&WebApiFirmwareClass::onFirmwareUpdateFinish, this, _1), std::bind(&WebApiFirmwareClass::onFirmwareUpdateFinish, this, _1),
std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6)); std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6));
scheduler.addTask(_rebootTask);
} }
void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request) void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
@ -44,8 +38,7 @@ void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
response->addHeader("Connection", "close"); response->addHeader("Connection", "close");
response->addHeader("Access-Control-Allow-Origin", "*"); response->addHeader("Access-Control-Allow-Origin", "*");
request->send(response); request->send(response);
_rebootTask.enable(); RestartHelper.triggerRestart();
_rebootTask.restart();
} }
void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final) void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final)
@ -86,8 +79,3 @@ void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request,
return; return;
} }
} }
void WebApiFirmwareClass::rebootTaskCb()
{
Utils::restartDtu();
}

View File

@ -4,7 +4,7 @@
*/ */
#include "WebApi_maintenance.h" #include "WebApi_maintenance.h"
#include "Utils.h" #include "RestartHelper.h"
#include "WebApi.h" #include "WebApi.h"
#include "WebApi_errors.h" #include "WebApi_errors.h"
#include <AsyncJson.h> #include <AsyncJson.h>
@ -43,7 +43,7 @@ void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request)
retMsg["code"] = WebApiError::MaintenanceRebootTriggered; retMsg["code"] = WebApiError::MaintenanceRebootTriggered;
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
Utils::restartDtu(); RestartHelper.triggerRestart();
} else { } else {
retMsg["message"] = "Reboot cancled!"; retMsg["message"] = "Reboot cancled!";
retMsg["code"] = WebApiError::MaintenanceRebootCancled; retMsg["code"] = WebApiError::MaintenanceRebootCancled;

View File

@ -16,6 +16,7 @@
#include "NetworkSettings.h" #include "NetworkSettings.h"
#include "NtpSettings.h" #include "NtpSettings.h"
#include "PinMapping.h" #include "PinMapping.h"
#include "RestartHelper.h"
#include "Scheduler.h" #include "Scheduler.h"
#include "SunPosition.h" #include "SunPosition.h"
#include "Utils.h" #include "Utils.h"
@ -154,6 +155,7 @@ void setup()
InverterSettings.init(scheduler); InverterSettings.init(scheduler);
Datastore.init(scheduler); Datastore.init(scheduler);
RestartHelper.init(scheduler);
} }
void loop() void loop()