fix(wifi_scan): Fix some edge cases where WiFi Scan may fail (#11188)
This commit is contained in:
parent
e37435c442
commit
17258930e6
1 changed files with 14 additions and 19 deletions
|
|
@ -92,9 +92,6 @@ int16_t
|
|||
}
|
||||
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);
|
||||
|
|
@ -118,21 +115,20 @@ int16_t
|
|||
void WiFiScanClass::_scanDone() {
|
||||
esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount));
|
||||
if (WiFiScanClass::_scanResult) {
|
||||
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = nullptr;
|
||||
free(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = NULL;
|
||||
}
|
||||
|
||||
if (WiFiScanClass::_scanCount) {
|
||||
WiFiScanClass::_scanResult = new (std::nothrow) wifi_ap_record_t[WiFiScanClass::_scanCount];
|
||||
WiFiScanClass::_scanResult = calloc(WiFiScanClass::_scanCount, sizeof(wifi_ap_record_t));
|
||||
if (!WiFiScanClass::_scanResult) {
|
||||
WiFiScanClass::_scanCount = 0;
|
||||
} else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) {
|
||||
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = nullptr;
|
||||
free(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = NULL;
|
||||
WiFiScanClass::_scanCount = 0;
|
||||
}
|
||||
}
|
||||
WiFiScanClass::_scanStarted = 0; //Reset after a scan is completed for normal behavior
|
||||
WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT);
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
|
||||
}
|
||||
|
|
@ -161,15 +157,13 @@ int16_t WiFiScanClass::scanComplete() {
|
|||
}
|
||||
|
||||
if (WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) {
|
||||
// Check if the delay expired, return WIFI_SCAN_FAILED in this case
|
||||
if ((millis() - WiFiScanClass::_scanStarted) > WiFiScanClass::_scanTimeout) {
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
|
||||
return WIFI_SCAN_FAILED;
|
||||
}
|
||||
return WIFI_SCAN_RUNNING;
|
||||
}
|
||||
// last one to avoid time affecting Async mode
|
||||
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;
|
||||
}
|
||||
|
|
@ -179,11 +173,12 @@ int16_t WiFiScanClass::scanComplete() {
|
|||
*/
|
||||
void WiFiScanClass::scanDelete() {
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
|
||||
if (WiFiScanClass::_scanResult) {
|
||||
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = nullptr;
|
||||
WiFiScanClass::_scanCount = 0;
|
||||
free(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = NULL;
|
||||
}
|
||||
WiFiScanClass::_scanCount = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue