mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-09-13 13:44:10 +00:00
fix bug where changing provision mode inflight would crash
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user