From d6ca2a134ac00db7bdce7d587bd215a7ed16c4ba Mon Sep 17 00:00:00 2001 From: EricMc1289 Date: Wed, 11 Sep 2019 09:44:08 +0200 Subject: [PATCH 1/5] Added timeout to WiFiScan class to prevent haning at stucking at WIFI_SCAN_RUNNING when scan fails internally --- libraries/WiFi/src/WiFiScan.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index 726bb455551..9102bf891af 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -22,6 +22,8 @@ */ +#define SCAN_ERROR_DELAY 10000 //See scan as failed after 10s of scan time + #include "WiFi.h" #include "WiFiGeneric.h" #include "WiFiScan.h" @@ -42,7 +44,7 @@ extern "C" { } bool WiFiScanClass::_scanAsync = false; - +uint32_t _scanStarted = 0; uint16_t WiFiScanClass::_scanCount = 0; void* WiFiScanClass::_scanResult = 0; @@ -78,6 +80,10 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, config.scan_time.active.max = max_ms_per_chan; } if(esp_wifi_scan_start(&config, false) == ESP_OK) { + _scanStarted = millis(); + if (!_scanStarted) { //Prevent 0 from millis overflow + ++_scanStarted; + } WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT); @@ -107,6 +113,7 @@ void WiFiScanClass::_scanDone() WiFiScanClass::_scanCount = 0; } } + _scanStarted=0; //Reset after a scan is completed for normal behavior WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); } @@ -132,6 +139,11 @@ void * WiFiScanClass::_getScanInfoByIndex(int i) */ int16_t WiFiScanClass::scanComplete() { + if (_scanStarted && (millis()-_scanStarted) > SCAN_ERROR_DELAY) { //Check is scan was started and if the delay expired, return WIFI_SCAN_FAILED in this case + WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); + return WIFI_SCAN_FAILED; + } + if(WiFiGenericClass::getStatusBits() & WIFI_SCAN_DONE_BIT) { return WiFiScanClass::_scanCount; } From 1ca0c07dac96daaec50e672b23e0bf66001aca8f Mon Sep 17 00:00:00 2001 From: EricMc1289 Date: Wed, 11 Sep 2019 13:17:25 +0200 Subject: [PATCH 2/5] fixed tabs and returns, connected scanTimeout to max_scan_per_channel timeout --- libraries/WiFi/src/WiFiScan.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index 9102bf891af..43a1638e5f9 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -22,7 +22,6 @@ */ -#define SCAN_ERROR_DELAY 10000 //See scan as failed after 10s of scan time #include "WiFi.h" #include "WiFiGeneric.h" @@ -44,7 +43,8 @@ extern "C" { } bool WiFiScanClass::_scanAsync = false; -uint32_t _scanStarted = 0; +uint32_t WiFiScanClass::_scanStarted = 0; +uint32_t WiFiScanClass::_scanTimeout = 10000; uint16_t WiFiScanClass::_scanCount = 0; void* WiFiScanClass::_scanResult = 0; @@ -60,6 +60,7 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, return WIFI_SCAN_RUNNING; } + WiFiScanClass::_scanTimeout = max_ms_per_chan * 20 WiFiScanClass::_scanAsync = async; WiFi.enableSTA(true); @@ -84,6 +85,7 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, if (!_scanStarted) { //Prevent 0 from millis overflow ++_scanStarted; } + WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT); @@ -113,7 +115,7 @@ void WiFiScanClass::_scanDone() WiFiScanClass::_scanCount = 0; } } - _scanStarted=0; //Reset after a scan is completed for normal behavior + WiFiScanClass::_scanStarted=0; //Reset after a scan is completed for normal behavior WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); } @@ -139,7 +141,7 @@ void * WiFiScanClass::_getScanInfoByIndex(int i) */ int16_t WiFiScanClass::scanComplete() { - if (_scanStarted && (millis()-_scanStarted) > SCAN_ERROR_DELAY) { //Check is scan was started and if the delay expired, return WIFI_SCAN_FAILED in this case + 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 WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); return WIFI_SCAN_FAILED; } From 395f6bfce16aadbc98ecf8f7e3a597d20b21318c Mon Sep 17 00:00:00 2001 From: EricMc1289 Date: Wed, 11 Sep 2019 13:20:04 +0200 Subject: [PATCH 3/5] Corrected tabs two --- libraries/WiFi/src/WiFiScan.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index 43a1638e5f9..fdf074a65e8 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -83,8 +83,8 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, if(esp_wifi_scan_start(&config, false) == ESP_OK) { _scanStarted = millis(); if (!_scanStarted) { //Prevent 0 from millis overflow - ++_scanStarted; - } + ++_scanStarted; + } WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT); @@ -143,8 +143,8 @@ int16_t WiFiScanClass::scanComplete() { 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 WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); - return WIFI_SCAN_FAILED; - } + return WIFI_SCAN_FAILED; + } if(WiFiGenericClass::getStatusBits() & WIFI_SCAN_DONE_BIT) { return WiFiScanClass::_scanCount; From 918e04451db8df60b65e499064e3508a49c47ae0 Mon Sep 17 00:00:00 2001 From: EricMc1289 Date: Wed, 11 Sep 2019 13:38:31 +0200 Subject: [PATCH 4/5] Added static vars scanTimeout und scanStarted to WiFiScan.h protected section --- libraries/WiFi/src/WiFiScan.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiScan.h b/libraries/WiFi/src/WiFiScan.h index 8ec9bb083f8..41ab00802e3 100644 --- a/libraries/WiFi/src/WiFiScan.h +++ b/libraries/WiFi/src/WiFiScan.h @@ -50,8 +50,11 @@ class WiFiScanClass protected: static bool _scanAsync; - + + static uint32_t _scanStarted; + static uint32_t _scanTimeout; static uint16_t _scanCount; + static void* _scanResult; static void * _getScanInfoByIndex(int i); From 1eccb7bf1d2b92761478b21255fb4fbe557f4877 Mon Sep 17 00:00:00 2001 From: EricMc1289 Date: Wed, 11 Sep 2019 13:42:02 +0200 Subject: [PATCH 5/5] Fixed missing ; in line 64 --- libraries/WiFi/src/WiFiScan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index fdf074a65e8..cabedbb8661 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -60,7 +60,7 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, return WIFI_SCAN_RUNNING; } - WiFiScanClass::_scanTimeout = max_ms_per_chan * 20 + WiFiScanClass::_scanTimeout = max_ms_per_chan * 20; WiFiScanClass::_scanAsync = async; WiFi.enableSTA(true);