diff --git a/src/ESP32React/APSettingsService.cpp b/src/ESP32React/APSettingsService.cpp index 05d02a110..d53017b9c 100644 --- a/src/ESP32React/APSettingsService.cpp +++ b/src/ESP32React/APSettingsService.cpp @@ -31,7 +31,8 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) { APSettings newSettings{}; newSettings.provisionMode = static_cast(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_NEVER: break; @@ -53,11 +54,17 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) { return StateUpdateResult::UNCHANGED; } - settings = newSettings; + const uint8_t previousProvisionMode = settings.provisionMode; + settings = newSettings; - // if the AP mode has changed, force a disconnect and reconnect - if (settings.provisionMode != newSettings.provisionMode) { - emsesp::EMSESP::network_.reconnect(); + // FS load at boot uses this updater before Network::begin(); skip reconnect on that first apply. + // Subsequent provision-mode changes (UI/API) must reload Network's cached AP settings. + static bool appliedOnce = false; + const bool modeChanged = previousProvisionMode != settings.provisionMode; + if (appliedOnce && modeChanged) { + emsesp::EMSESP::network_.schedule_reconnect(); } + appliedOnce = true; + return StateUpdateResult::CHANGED; } diff --git a/src/ESP32React/APSettingsService.h b/src/ESP32React/APSettingsService.h index 6c280875b..3d8e389e9 100644 --- a/src/ESP32React/APSettingsService.h +++ b/src/ESP32React/APSettingsService.h @@ -51,7 +51,7 @@ enum APNetworkStatus { ACTIVE = 0, INACTIVE }; class APSettings { 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 password = FACTORY_AP_PASSWORD; uint8_t channel = FACTORY_AP_CHANNEL;