From ec38d04092bdf43de1b60df25f93bdc3dcfcb211 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 17 Jun 2022 02:50:24 +0300 Subject: [PATCH] Without autoreconnect, forcibly stop station connection manager Sketches will most likely use `WiFi.status()`, which uses its status Since the SDK itself does not track the event when autoreconnect is disabled, force it into some other state --- libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp | 2 +- libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp index 2b7575d2f7..06709287b0 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -277,7 +277,7 @@ bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA /** * Disconnect from the network (close AP) * @param wifioff disable mode? - * @return one value of wl_status_t enum + * @return operation success */ bool ESP8266WiFiAPClass::softAPdisconnect(bool wifioff) { bool ret; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 4d3d5fae82..3d81aebcaa 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -222,8 +222,16 @@ void ESP8266WiFiGenericClass::_eventCallback(void* arg) System_Event_t* event = reinterpret_cast(arg); DEBUG_WIFI("wifi evt: %d\n", event->event); - if(event->event == EVENT_STAMODE_DISCONNECTED) { + if (event->event == EVENT_STAMODE_DISCONNECTED) { DEBUG_WIFI("STA disconnect: %d\n", event->event_info.disconnected.reason); + + // workaround for https://github.com/esp8266/Arduino/issues/7432 + // still delivers the event, just handle this specific case + if ((wifi_station_get_connect_status() == STATION_GOT_IP) && !wifi_station_get_reconnect_policy()) { + DEBUG_WIFI("forcibly stopping the station connection manager\n"); + wifi_station_disconnect(); + } + WiFiClient::stopAll(); }