feat(runtime): add diagnostic and network recovery controls

This commit is contained in:
chenjintao
2026-08-12 16:32:40 +08:00
parent a94df9545d
commit 1c32d9f0e7
11 changed files with 868 additions and 0 deletions
@@ -343,6 +343,65 @@ esp_err_t wifi_portal_connect_sta(int timeout_ms)
return ESP_ERR_TIMEOUT;
}
esp_err_t wifi_portal_reconnect_sta(int timeout_ms)
{
int effective_timeout_ms = normalize_connect_timeout_ms(timeout_ms);
int64_t deadline_us = esp_timer_get_time() + (int64_t)effective_timeout_ms * 1000;
{
ESP_RETURN_ON_ERROR(wifi_portal_lock(), TAG, "Failed to lock Wi-Fi portal");
PortalUnlockGuard guard;
if (!wifi_portal_has_saved_credentials()) {
return ESP_ERR_NOT_FOUND;
}
ESP_RETURN_ON_ERROR(ensure_wifi_manager_initialized(),
TAG,
"Failed to initialize Wi-Fi manager");
ESP_LOGW(TAG,
"Controlled STA reassociation started timeout_ms=%d connected=%d",
effective_timeout_ms,
WifiManager::GetInstance().IsConnected() ? 1 : 0);
esp_err_t disconnect_err = esp_wifi_disconnect();
if (disconnect_err != ESP_OK && disconnect_err != ESP_ERR_WIFI_NOT_CONNECT) {
ESP_LOGW(TAG,
"Controlled STA disconnect returned %s",
esp_err_to_name(disconnect_err));
}
}
int64_t disconnect_deadline_us = esp_timer_get_time() + 2000LL * 1000LL;
if (disconnect_deadline_us > deadline_us) {
disconnect_deadline_us = deadline_us;
}
while (esp_timer_get_time() < disconnect_deadline_us &&
WifiManager::GetInstance().IsConnected()) {
vTaskDelay(pdMS_TO_TICKS(WIFI_PORTAL_CONNECT_POLL_MS));
}
esp_err_t connect_err = esp_wifi_connect();
if (connect_err != ESP_OK) {
ESP_LOGI(TAG,
"Controlled STA reconnect command returned %s; wait for manager auto-reconnect",
esp_err_to_name(connect_err));
}
while (esp_timer_get_time() < deadline_us) {
if (WifiManager::GetInstance().IsConnected()) {
(void)apply_sta_stability_policy();
ESP_LOGI(TAG, "Controlled STA reassociation completed");
return ESP_OK;
}
vTaskDelay(pdMS_TO_TICKS(WIFI_PORTAL_CONNECT_POLL_MS));
}
ESP_LOGW(TAG,
"Controlled STA reassociation timed out after %d ms",
effective_timeout_ms);
return ESP_ERR_TIMEOUT;
}
esp_err_t wifi_portal_save_credentials(const char *ssid, const char *password)
{
install_wifi_storage_hooks();