mirror of
https://github.com/esphome/esphome.git
synced 2026-02-18 15:35:59 -07:00
[wifi] Fix watchdog timeout on P4 WiFi scan (#13520)
This commit is contained in:
committed by
Jonathan Swoboda
parent
723f67d5e2
commit
cc2f3d85dc
@@ -12,6 +12,7 @@ from esphome.const import (
|
|||||||
KEY_FRAMEWORK_VERSION,
|
KEY_FRAMEWORK_VERSION,
|
||||||
)
|
)
|
||||||
from esphome.core import CORE
|
from esphome.core import CORE
|
||||||
|
from esphome.cpp_generator import add_define
|
||||||
|
|
||||||
CODEOWNERS = ["@swoboda1337"]
|
CODEOWNERS = ["@swoboda1337"]
|
||||||
|
|
||||||
@@ -42,6 +43,7 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
|
add_define("USE_ESP32_HOSTED")
|
||||||
if config[CONF_ACTIVE_HIGH]:
|
if config[CONF_ACTIVE_HIGH]:
|
||||||
esp32.add_idf_sdkconfig_option(
|
esp32.add_idf_sdkconfig_option(
|
||||||
"CONFIG_ESP_HOSTED_SDIO_RESET_ACTIVE_HIGH",
|
"CONFIG_ESP_HOSTED_SDIO_RESET_ACTIVE_HIGH",
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#ifdef USE_WIFI_WPA2_EAP
|
#ifdef USE_WIFI_WPA2_EAP
|
||||||
#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1)
|
#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1)
|
||||||
@@ -828,16 +829,29 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
|
|||||||
|
|
||||||
uint16_t number = it.number;
|
uint16_t number = it.number;
|
||||||
scan_result_.init(number);
|
scan_result_.init(number);
|
||||||
|
#ifdef USE_ESP32_HOSTED
|
||||||
// Process one record at a time to avoid large buffer allocation
|
// getting records one at a time fails on P4 with hosted esp32 WiFi coprocessor
|
||||||
wifi_ap_record_t record;
|
// Presumably an upstream bug, work-around by getting all records at once
|
||||||
|
auto records = std::make_unique<wifi_ap_record_t[]>(number);
|
||||||
|
err = esp_wifi_scan_get_ap_records(&number, records.get());
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
esp_wifi_clear_ap_list();
|
||||||
|
ESP_LOGW(TAG, "esp_wifi_scan_get_ap_records failed: %s", esp_err_to_name(err));
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (uint16_t i = 0; i < number; i++) {
|
for (uint16_t i = 0; i < number; i++) {
|
||||||
|
wifi_ap_record_t &record = records[i];
|
||||||
|
#else
|
||||||
|
// Process one record at a time to avoid large buffer allocation
|
||||||
|
for (uint16_t i = 0; i < number; i++) {
|
||||||
|
wifi_ap_record_t record;
|
||||||
err = esp_wifi_scan_get_ap_record(&record);
|
err = esp_wifi_scan_get_ap_record(&record);
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
ESP_LOGW(TAG, "esp_wifi_scan_get_ap_record failed: %s", esp_err_to_name(err));
|
ESP_LOGW(TAG, "esp_wifi_scan_get_ap_record failed: %s", esp_err_to_name(err));
|
||||||
esp_wifi_clear_ap_list(); // Free remaining records not yet retrieved
|
esp_wifi_clear_ap_list(); // Free remaining records not yet retrieved
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif // USE_ESP32_HOSTED
|
||||||
bssid_t bssid;
|
bssid_t bssid;
|
||||||
std::copy(record.bssid, record.bssid + 6, bssid.begin());
|
std::copy(record.bssid, record.bssid + 6, bssid.begin());
|
||||||
std::string ssid(reinterpret_cast<const char *>(record.ssid));
|
std::string ssid(reinterpret_cast<const char *>(record.ssid));
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#define USE_DEVICES
|
#define USE_DEVICES
|
||||||
#define USE_DISPLAY
|
#define USE_DISPLAY
|
||||||
#define USE_ENTITY_ICON
|
#define USE_ENTITY_ICON
|
||||||
|
#define USE_ESP32_HOSTED
|
||||||
#define USE_ESP32_IMPROV_STATE_CALLBACK
|
#define USE_ESP32_IMPROV_STATE_CALLBACK
|
||||||
#define USE_EVENT
|
#define USE_EVENT
|
||||||
#define USE_FAN
|
#define USE_FAN
|
||||||
|
|||||||
Reference in New Issue
Block a user