* fix(blufi): GET_WIFI_LIST triggers real-time scan with guaranteed response
Previously, ESP_BLUFI_EVENT_GET_WIFI_LIST waited for any in-progress scan
to finish and then returned the cached result. When the cache was empty
(e.g. after a config-mode transition that stopped the Wi-Fi driver),
_send_wifi_list() returned silently with no response frame, leaving the
App waiting until timeout.
Changes:
- GET_WIFI_LIST now clears the cache and starts a fresh scan immediately.
- _wifi_scan_event_handler calls _send_wifi_list() after every scan
triggered by a GET_WIFI_LIST request.
- start_wifi_scan() calls esp_wifi_start() before esp_wifi_scan_start()
to handle the case where the driver was stopped during a mode
transition (ESP_ERR_WIFI_STATE is treated as already-started).
- _send_wifi_list() sends ESP_BLUFI_WIFI_SCAN_FAIL when no APs are
found, so the App always receives a terminal response.
- Redundant static_cast in _wifi_scan_event_handler replaced with the
existing local `self` pointer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(blufi): preserve cache fast-path, fall back to live scan only when needed
Address review feedback on always-rescan latency regression.
The GET_WIFI_LIST handler now distinguishes three cases:
1. Scan in flight: defer the response via m_send_list_after_scan; the
scan-done handler dispatches when it fires. Removes the previous
blocking `while (m_scan_in_progress) vTaskDelay(500)` which would
stall the BluFi event task indefinitely if the scan never completed.
2. Cache populated: respond from cache immediately (~50 ms, no latency
change vs original behavior). _send_wifi_list() still kicks off an
async refresh scan as before to keep the cache fresh.
3. Cache empty and no scan running: trigger a live scan and dispatch
from the scan-done handler. If start_wifi_scan() fails, send
ESP_BLUFI_WIFI_SCAN_FAIL so the App exits its wait state.
State variables are also disentangled:
- m_scan_should_save_ssid keeps its original meaning (write scan results
into m_ap_records). Cleared during connect-to-AP so the connect-time
scan does not pollute the cache.
- m_send_list_after_scan is new and tracks "the next scan-done event
should respond to a pending GET_WIFI_LIST request". The previous PR
conflated these two responsibilities onto m_scan_should_save_ssid,
which would have caused init-time scans to spuriously emit a wifi list
to the App.
start_wifi_scan() now returns bool so the caller can distinguish
"scan started or already running" from "could not start a scan".
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Yixin Shi <shiyixin@qiniu.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>