Fix: WebApp was not reloaded after firmware update

With the upgrade from ESPAsyncWebServer to 3.3.1 it seems that something has changed. Have to trigger the reboot from the main context.
This commit is contained in:
Thomas Basler 2024-09-21 00:04:27 +02:00
parent 34e1c43ca7
commit 3b3e6995c2
2 changed files with 18 additions and 1 deletions

View File

@ -6,9 +6,13 @@
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();
};

View File

@ -10,6 +10,11 @@
#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;
@ -22,6 +27,8 @@ 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)
@ -37,7 +44,8 @@ void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
response->addHeader("Connection", "close");
response->addHeader("Access-Control-Allow-Origin", "*");
request->send(response);
Utils::restartDtu();
_rebootTask.enable();
_rebootTask.restart();
}
void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final)
@ -78,3 +86,8 @@ void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request,
return;
}
}
void WebApiFirmwareClass::rebootTaskCb()
{
Utils::restartDtu();
}