fix: suspend web panel for OTA

This commit is contained in:
Jared Dohrman
2026-04-21 18:19:33 +10:00
parent 0ad50e5bd0
commit 2ad3b134f2
8 changed files with 35 additions and 5 deletions
+1
View File
@@ -252,6 +252,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, char* command, char* re
strcpy(reply, "ERR: clock cannot go backwards");
}
} else if (memcmp(command, "start ota", 9) == 0) {
_callbacks->prepareForOTAStart();
if (!_board->startOTAUpdate(_prefs->node_name, reply)) {
strcpy(reply, "Error");
}
+3
View File
@@ -92,6 +92,9 @@ public:
virtual void saveIdentity(const mesh::LocalIdentity& new_id) = 0;
virtual void clearStats() = 0;
virtual void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) = 0;
virtual void prepareForOTAStart() {
// no op by default
}
virtual void startRegionsLoad() {
// no op by default
+18 -3
View File
@@ -4,7 +4,7 @@
#include <WiFi.h>
#endif
WebService::WebService() : _fs(nullptr), _prefs{}, _runner(nullptr), _network(nullptr) {
WebService::WebService() : _fs(nullptr), _prefs{}, _runner(nullptr), _network(nullptr), _suspended_for_ota(false) {
WebPrefsStore::setDefaults(_prefs);
}
@@ -19,6 +19,13 @@ void WebService::end() {
#endif
}
void WebService::suspendForOTA() {
#if defined(ESP_PLATFORM) && WITH_WEB_PANEL
_suspended_for_ota = true;
_panel.stop();
#endif
}
void WebService::loop() {
#if defined(ESP_PLATFORM) && WITH_WEB_PANEL
ensureWebServer();
@@ -39,9 +46,12 @@ bool WebService::savePrefs() {
bool WebService::setWebEnabled(bool enabled) {
_prefs.web_enabled = enabled ? 1 : 0;
if (!enabled) {
_suspended_for_ota = false;
}
bool ok = savePrefs();
#if defined(ESP_PLATFORM) && WITH_WEB_PANEL
if (_prefs.web_enabled != 0) {
if (_prefs.web_enabled != 0 && !_suspended_for_ota) {
ensureWebServer();
} else {
_panel.stop();
@@ -62,6 +72,11 @@ void WebService::formatWebStatusReply(char* reply, size_t reply_size) const {
return;
}
if (_suspended_for_ota) {
snprintf(reply, reply_size, "> web:suspended ota");
return;
}
if (!_panel.isRunning() || _network == nullptr || !_network->isWifiConnected()) {
snprintf(reply, reply_size, "> web:down");
return;
@@ -76,7 +91,7 @@ void WebService::formatWebStatusReply(char* reply, size_t reply_size) const {
#if defined(ESP_PLATFORM) && WITH_WEB_PANEL
void WebService::ensureWebServer() {
if (_runner == nullptr || _prefs.web_enabled == 0 || _network == nullptr || !_network->isWifiConnected()) {
if (_suspended_for_ota || _runner == nullptr || _prefs.web_enabled == 0 || _network == nullptr || !_network->isWifiConnected()) {
_panel.stop();
return;
}
+2
View File
@@ -14,6 +14,7 @@ public:
void begin(FILESYSTEM* fs);
void end();
void loop();
void suspendForOTA();
void setCommandRunner(WebPanelCommandRunner* runner);
void setNetworkStateProvider(NetworkStateProvider* network) { _network = network; }
@@ -38,4 +39,5 @@ private:
WebPanelCommandRunner* _runner;
NetworkStateProvider* _network;
WebPanelServer _panel;
bool _suspended_for_ota;
};