fix(wifi_scan): Fix some edge cases where WiFi Scan may fail (#11188)

This commit is contained in:
Me No Dev 2025-03-27 13:38:04 +02:00 committed by GitHub
parent e37435c442
commit 17258930e6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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;
}
/**