diff --git a/arduino/beken-72xx/libraries/WiFi/WiFiScan.cpp b/arduino/beken-72xx/libraries/WiFi/WiFiScan.cpp index 944bbfa..1ac5619 100644 --- a/arduino/beken-72xx/libraries/WiFi/WiFiScan.cpp +++ b/arduino/beken-72xx/libraries/WiFi/WiFiScan.cpp @@ -41,15 +41,25 @@ static void scanHandler(void *ctx, uint8_t param) { wifiEventSendArduino(ARDUINO_EVENT_WIFI_SCAN_DONE); end: - scan->running = false; - xSemaphoreGive(cls->data.scanSem); + scan->timeout = 0; + if (scan->running) { + // running == false means it was discarded (timeout) + scan->running = false; + xSemaphoreGive(cls->data.scanSem); + } LT_HEAP_I(); return; } int16_t WiFiClass::scanNetworks(bool async, bool showHidden, bool passive, uint32_t maxMsPerChannel, uint8_t channel) { - if (scan && scan->running) - return WIFI_SCAN_RUNNING; + if (scan && scan->running) { + if (scan->timeout && millis() > scan->timeout) { + LT_WM(WIFI, "Scan timeout, discarding"); + scan->running = false; + } else { + return WIFI_SCAN_RUNNING; + } + } enableSTA(true); scanDelete(); scanInit(); @@ -63,6 +73,7 @@ int16_t WiFiClass::scanNetworks(bool async, bool showHidden, bool passive, uint3 LT_HEAP_I(); scan->running = true; + scan->timeout = millis() + maxMsPerChannel * 20 + 1000; int16_t ret = WIFI_SCAN_RUNNING; if (!async) { diff --git a/arduino/libretuya/api/WiFi/WiFiType.h b/arduino/libretuya/api/WiFi/WiFiType.h index 123af55..e5ce074 100644 --- a/arduino/libretuya/api/WiFi/WiFiType.h +++ b/arduino/libretuya/api/WiFi/WiFiType.h @@ -137,9 +137,10 @@ typedef struct { } WiFiScanAP; typedef struct { - bool running = false; - uint8_t count = 0; - WiFiScanAP *ap = NULL; + bool running = false; + unsigned long timeout = 0; + uint8_t count = 0; + WiFiScanAP *ap = NULL; } WiFiScanData; typedef enum {