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:
parent
5c460e26c9
commit
e785904fca
18
include/RestartHelper.h
Normal file
18
include/RestartHelper.h
Normal 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;
|
||||
@ -9,7 +9,6 @@ public:
|
||||
static uint32_t getChipId();
|
||||
static uint64_t generateDtuSerial();
|
||||
static int getTimezoneOffset();
|
||||
static void restartDtu();
|
||||
static bool checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line);
|
||||
static void removeAllFiles();
|
||||
};
|
||||
|
||||
@ -6,13 +6,9 @@
|
||||
|
||||
class WebApiFirmwareClass {
|
||||
public:
|
||||
WebApiFirmwareClass();
|
||||
void init(AsyncWebServer& server, Scheduler& scheduler);
|
||||
|
||||
private:
|
||||
void onFirmwareUpdateFinish(AsyncWebServerRequest* request);
|
||||
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
36
src/RestartHelper.cpp
Normal 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();
|
||||
}
|
||||
}
|
||||
@ -4,10 +4,8 @@
|
||||
*/
|
||||
|
||||
#include "Utils.h"
|
||||
#include "Display_Graphic.h"
|
||||
#include "Led_Single.h"
|
||||
#include "MessageOutput.h"
|
||||
#include <Esp.h>
|
||||
#include "PinMapping.h"
|
||||
#include <LittleFS.h>
|
||||
|
||||
uint32_t Utils::getChipId()
|
||||
@ -59,16 +57,6 @@ int Utils::getTimezoneOffset()
|
||||
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)
|
||||
{
|
||||
if (doc.overflowed()) {
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
*/
|
||||
#include "WebApi_config.h"
|
||||
#include "Configuration.h"
|
||||
#include "RestartHelper.h"
|
||||
#include "Utils.h"
|
||||
#include "WebApi.h"
|
||||
#include "WebApi_errors.h"
|
||||
@ -82,7 +83,7 @@ void WebApiConfigClass::onConfigDelete(AsyncWebServerRequest* request)
|
||||
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
|
||||
|
||||
Utils::removeAllFiles();
|
||||
Utils::restartDtu();
|
||||
RestartHelper.triggerRestart();
|
||||
}
|
||||
|
||||
void WebApiConfigClass::onConfigListGet(AsyncWebServerRequest* request)
|
||||
@ -124,7 +125,7 @@ void WebApiConfigClass::onConfigUploadFinish(AsyncWebServerRequest* request)
|
||||
response->addHeader("Connection", "close");
|
||||
response->addHeader("Access-Control-Allow-Origin", "*");
|
||||
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)
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
#include "Configuration.h"
|
||||
#include "Display_Graphic.h"
|
||||
#include "PinMapping.h"
|
||||
#include "Utils.h"
|
||||
#include "RestartHelper.h"
|
||||
#include "WebApi.h"
|
||||
#include "WebApi_errors.h"
|
||||
#include "helper.h"
|
||||
@ -149,6 +149,6 @@ void WebApiDeviceClass::onDeviceAdminPost(AsyncWebServerRequest* request)
|
||||
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
|
||||
|
||||
if (performRestart) {
|
||||
Utils::restartDtu();
|
||||
RestartHelper.triggerRestart();
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,17 +4,13 @@
|
||||
*/
|
||||
#include "WebApi_firmware.h"
|
||||
#include "Configuration.h"
|
||||
#include "RestartHelper.h"
|
||||
#include "Update.h"
|
||||
#include "Utils.h"
|
||||
#include "WebApi.h"
|
||||
#include "helper.h"
|
||||
#include <AsyncJson.h>
|
||||
|
||||
WebApiFirmwareClass::WebApiFirmwareClass()
|
||||
: _rebootTask(TASK_IMMEDIATE, TASK_ONCE, std::bind(&WebApiFirmwareClass::rebootTaskCb, this))
|
||||
{
|
||||
}
|
||||
|
||||
void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler)
|
||||
{
|
||||
using std::placeholders::_1;
|
||||
@ -27,8 +23,6 @@ void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler)
|
||||
server.on("/api/firmware/update", HTTP_POST,
|
||||
std::bind(&WebApiFirmwareClass::onFirmwareUpdateFinish, this, _1),
|
||||
std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6));
|
||||
|
||||
scheduler.addTask(_rebootTask);
|
||||
}
|
||||
|
||||
void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
|
||||
@ -44,8 +38,7 @@ void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
|
||||
response->addHeader("Connection", "close");
|
||||
response->addHeader("Access-Control-Allow-Origin", "*");
|
||||
request->send(response);
|
||||
_rebootTask.enable();
|
||||
_rebootTask.restart();
|
||||
RestartHelper.triggerRestart();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void WebApiFirmwareClass::rebootTaskCb()
|
||||
{
|
||||
Utils::restartDtu();
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
#include "WebApi_maintenance.h"
|
||||
#include "Utils.h"
|
||||
#include "RestartHelper.h"
|
||||
#include "WebApi.h"
|
||||
#include "WebApi_errors.h"
|
||||
#include <AsyncJson.h>
|
||||
@ -43,7 +43,7 @@ void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request)
|
||||
retMsg["code"] = WebApiError::MaintenanceRebootTriggered;
|
||||
|
||||
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
|
||||
Utils::restartDtu();
|
||||
RestartHelper.triggerRestart();
|
||||
} else {
|
||||
retMsg["message"] = "Reboot cancled!";
|
||||
retMsg["code"] = WebApiError::MaintenanceRebootCancled;
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
#include "NetworkSettings.h"
|
||||
#include "NtpSettings.h"
|
||||
#include "PinMapping.h"
|
||||
#include "RestartHelper.h"
|
||||
#include "Scheduler.h"
|
||||
#include "SunPosition.h"
|
||||
#include "Utils.h"
|
||||
@ -154,6 +155,7 @@ void setup()
|
||||
InverterSettings.init(scheduler);
|
||||
|
||||
Datastore.init(scheduler);
|
||||
RestartHelper.init(scheduler);
|
||||
}
|
||||
|
||||
void loop()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user