feat(runtime): add diagnostic and network recovery controls
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user