fix bug where changing provision mode inflight would crash

This commit is contained in:
proddy
2026-08-09 20:21:32 +02:00
parent d47915d815
commit 34cd93b7be
2 changed files with 13 additions and 6 deletions
+12 -5
View File
@@ -31,7 +31,8 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) {
APSettings newSettings{}; APSettings newSettings{};
newSettings.provisionMode = static_cast<uint8_t>(root["provision_mode"] | FACTORY_AP_PROVISION_MODE); newSettings.provisionMode = static_cast<uint8_t>(root["provision_mode"] | FACTORY_AP_PROVISION_MODE);
switch (settings.provisionMode) { // coerce removed/invalid modes (e.g. legacy AP_MODE_ALWAYS = 0) to the current default
switch (newSettings.provisionMode) {
case AP_MODE_DISCONNECTED: case AP_MODE_DISCONNECTED:
case AP_MODE_NEVER: case AP_MODE_NEVER:
break; break;
@@ -53,11 +54,17 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) {
return StateUpdateResult::UNCHANGED; return StateUpdateResult::UNCHANGED;
} }
settings = newSettings; const uint8_t previousProvisionMode = settings.provisionMode;
settings = newSettings;
// if the AP mode has changed, force a disconnect and reconnect // FS load at boot uses this updater before Network::begin(); skip reconnect on that first apply.
if (settings.provisionMode != newSettings.provisionMode) { // Subsequent provision-mode changes (UI/API) must reload Network's cached AP settings.
emsesp::EMSESP::network_.reconnect(); static bool appliedOnce = false;
const bool modeChanged = previousProvisionMode != settings.provisionMode;
if (appliedOnce && modeChanged) {
emsesp::EMSESP::network_.schedule_reconnect();
} }
appliedOnce = true;
return StateUpdateResult::CHANGED; return StateUpdateResult::CHANGED;
} }
+1 -1
View File
@@ -51,7 +51,7 @@ enum APNetworkStatus { ACTIVE = 0, INACTIVE };
class APSettings { class APSettings {
public: public:
uint8_t provisionMode = FACTORY_AP_PROVISION_MODE; // 0 = on, 2 = off uint8_t provisionMode = FACTORY_AP_PROVISION_MODE; // 1 = on disconnect, 2 = off
String ssid = FACTORY_AP_SSID; String ssid = FACTORY_AP_SSID;
String password = FACTORY_AP_PASSWORD; String password = FACTORY_AP_PASSWORD;
uint8_t channel = FACTORY_AP_CHANNEL; uint8_t channel = FACTORY_AP_CHANNEL;