Skip to content

Commit bab3a70

Browse files
EricMc1289me-no-dev
authored andcommitted
Added timeout to WiFiScan.cpp to prevent getting stuck at WIFI_SCAN_RUNNING (#3197)
* Added timeout to WiFiScan class to prevent haning at stucking at WIFI_SCAN_RUNNING when scan fails internally * fixed tabs and returns, connected scanTimeout to max_scan_per_channel timeout * Corrected tabs two * Added static vars scanTimeout und scanStarted to WiFiScan.h protected section * Fixed missing ; in line 64
1 parent cd4f903 commit bab3a70

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

libraries/WiFi/src/WiFiScan.cpp

+15-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
2323
*/
2424

25+
2526
#include "WiFi.h"
2627
#include "WiFiGeneric.h"
2728
#include "WiFiScan.h"
@@ -42,7 +43,8 @@ extern "C" {
4243
}
4344

4445
bool WiFiScanClass::_scanAsync = false;
45-
46+
uint32_t WiFiScanClass::_scanStarted = 0;
47+
uint32_t WiFiScanClass::_scanTimeout = 10000;
4648
uint16_t WiFiScanClass::_scanCount = 0;
4749
void* WiFiScanClass::_scanResult = 0;
4850

@@ -58,6 +60,7 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive,
5860
return WIFI_SCAN_RUNNING;
5961
}
6062

63+
WiFiScanClass::_scanTimeout = max_ms_per_chan * 20;
6164
WiFiScanClass::_scanAsync = async;
6265

6366
WiFi.enableSTA(true);
@@ -78,6 +81,11 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive,
7881
config.scan_time.active.max = max_ms_per_chan;
7982
}
8083
if(esp_wifi_scan_start(&config, false) == ESP_OK) {
84+
_scanStarted = millis();
85+
if (!_scanStarted) { //Prevent 0 from millis overflow
86+
++_scanStarted;
87+
}
88+
8189
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
8290
WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT);
8391

@@ -107,6 +115,7 @@ void WiFiScanClass::_scanDone()
107115
WiFiScanClass::_scanCount = 0;
108116
}
109117
}
118+
WiFiScanClass::_scanStarted=0; //Reset after a scan is completed for normal behavior
110119
WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT);
111120
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
112121
}
@@ -132,6 +141,11 @@ void * WiFiScanClass::_getScanInfoByIndex(int i)
132141
*/
133142
int16_t WiFiScanClass::scanComplete()
134143
{
144+
if (WiFiScanClass::_scanStarted && (millis()-WiFiScanClass::_scanStarted) > WiFiScanClass::_scanTimeout) { //Check is scan was started and if the delay expired, return WIFI_SCAN_FAILED in this case
145+
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
146+
return WIFI_SCAN_FAILED;
147+
}
148+
135149
if(WiFiGenericClass::getStatusBits() & WIFI_SCAN_DONE_BIT) {
136150
return WiFiScanClass::_scanCount;
137151
}

libraries/WiFi/src/WiFiScan.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,11 @@ class WiFiScanClass
5050
protected:
5151

5252
static bool _scanAsync;
53-
53+
54+
static uint32_t _scanStarted;
55+
static uint32_t _scanTimeout;
5456
static uint16_t _scanCount;
57+
5558
static void* _scanResult;
5659

5760
static void * _getScanInfoByIndex(int i);

0 commit comments

Comments
 (0)