mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/softap_prov_disconnect' into 'master'
Bugfix/softap prov disconnect See merge request espressif/esp-idf!7205
This commit is contained in:
commit
717674e2c2
@ -7,4 +7,12 @@ menu "Wi-Fi Provisioning Manager"
|
||||
help
|
||||
This sets the maximum number of entries of Wi-Fi scan results that will be kept by the provisioning manager
|
||||
|
||||
config WIFI_PROV_AUTOSTOP_TIMEOUT
|
||||
int "Provisioning auto-stop timeout"
|
||||
default 30
|
||||
range 5 600
|
||||
help
|
||||
Time (in seconds) after which the Wi-Fi provisioning manager will auto-stop after connecting to
|
||||
a Wi-Fi network successfully.
|
||||
|
||||
endmenu
|
||||
|
@ -99,8 +99,11 @@ struct wifi_prov_mgr_ctx {
|
||||
/* Pointer to proof of possession */
|
||||
protocomm_security_pop_t pop;
|
||||
|
||||
/* Handle to timer */
|
||||
esp_timer_handle_t timer;
|
||||
/* Handle for Provisioning Auto Stop timer */
|
||||
esp_timer_handle_t autostop_timer;
|
||||
|
||||
/* Handle for delayed Wi-Fi connection timer */
|
||||
esp_timer_handle_t wifi_connect_timer;
|
||||
|
||||
/* State of Wi-Fi Station */
|
||||
wifi_prov_sta_state_t wifi_state;
|
||||
@ -566,11 +569,17 @@ static bool wifi_prov_mgr_stop_service(bool blocking)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Timer not needed anymore */
|
||||
if (prov_ctx->timer) {
|
||||
esp_timer_stop(prov_ctx->timer);
|
||||
esp_timer_delete(prov_ctx->timer);
|
||||
prov_ctx->timer = NULL;
|
||||
/* Timers not needed anymore */
|
||||
if (prov_ctx->autostop_timer) {
|
||||
esp_timer_stop(prov_ctx->autostop_timer);
|
||||
esp_timer_delete(prov_ctx->autostop_timer);
|
||||
prov_ctx->autostop_timer = NULL;
|
||||
}
|
||||
|
||||
if (prov_ctx->wifi_connect_timer) {
|
||||
esp_timer_stop(prov_ctx->wifi_connect_timer);
|
||||
esp_timer_delete(prov_ctx->wifi_connect_timer);
|
||||
prov_ctx->wifi_connect_timer = NULL;
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "Stopping provisioning");
|
||||
@ -836,10 +845,11 @@ static void wifi_prov_mgr_event_handler_internal(
|
||||
prov_ctx->prov_state = WIFI_PROV_STATE_SUCCESS;
|
||||
|
||||
/* If auto stop is enabled (default), schedule timer to
|
||||
* stop provisioning app after 30 seconds. */
|
||||
* stop provisioning after configured timeout. */
|
||||
if (!prov_ctx->mgr_info.capabilities.no_auto_stop) {
|
||||
ESP_LOGD(TAG, "Starting 30s timer for stop_prov_timer_cb()");
|
||||
esp_timer_start_once(prov_ctx->timer, 30000 * 1000U);
|
||||
ESP_LOGD(TAG, "Starting %d sec timer for stop_prov_timer_cb()",
|
||||
CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT);
|
||||
esp_timer_start_once(prov_ctx->autostop_timer, CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT * 1000000U);
|
||||
}
|
||||
|
||||
/* Execute user registered callback handler */
|
||||
@ -1105,6 +1115,13 @@ esp_err_t wifi_prov_mgr_is_provisioned(bool *provisioned)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static void wifi_connect_timer_cb(void *arg)
|
||||
{
|
||||
if (esp_wifi_connect() != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to connect Wi-Fi");
|
||||
}
|
||||
}
|
||||
|
||||
esp_err_t wifi_prov_mgr_configure_sta(wifi_config_t *wifi_cfg)
|
||||
{
|
||||
if (!prov_ctx_lock) {
|
||||
@ -1151,14 +1168,13 @@ esp_err_t wifi_prov_mgr_configure_sta(wifi_config_t *wifi_cfg)
|
||||
RELEASE_LOCK(prov_ctx_lock);
|
||||
return ESP_FAIL;
|
||||
}
|
||||
/* Connect to AP */
|
||||
if (esp_wifi_connect() != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to connect Wi-Fi");
|
||||
/* Connect to AP after one second so that the response can
|
||||
* be sent to the client successfully, before a channel change happens*/
|
||||
if (esp_timer_start_once(prov_ctx->wifi_connect_timer, 1000 * 1000U) != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to start Wi-Fi connect timer");
|
||||
RELEASE_LOCK(prov_ctx_lock);
|
||||
return ESP_FAIL;
|
||||
}
|
||||
/* This delay allows channel change to complete */
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
|
||||
/* Reset Wi-Fi station state for provisioning app */
|
||||
prov_ctx->wifi_state = WIFI_PROV_STA_CONNECTING;
|
||||
@ -1454,18 +1470,33 @@ esp_err_t wifi_prov_mgr_start_provisioning(wifi_prov_security_t security, const
|
||||
}
|
||||
prov_ctx->security = security;
|
||||
|
||||
|
||||
esp_timer_create_args_t wifi_connect_timer_conf = {
|
||||
.callback = wifi_connect_timer_cb,
|
||||
.arg = NULL,
|
||||
.dispatch_method = ESP_TIMER_TASK,
|
||||
.name = "wifi_prov_connect_tm"
|
||||
};
|
||||
ret = esp_timer_create(&wifi_connect_timer_conf, &prov_ctx->wifi_connect_timer);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to create Wi-Fi connect timer");
|
||||
free((void *)prov_ctx->pop.data);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* If auto stop on completion is enabled (default) create the stopping timer */
|
||||
if (!prov_ctx->mgr_info.capabilities.no_auto_stop) {
|
||||
/* Create timer object as a member of app data */
|
||||
esp_timer_create_args_t timer_conf = {
|
||||
esp_timer_create_args_t autostop_timer_conf = {
|
||||
.callback = stop_prov_timer_cb,
|
||||
.arg = NULL,
|
||||
.dispatch_method = ESP_TIMER_TASK,
|
||||
.name = "wifi_prov_mgr_tm"
|
||||
.name = "wifi_prov_autostop_tm"
|
||||
};
|
||||
ret = esp_timer_create(&timer_conf, &prov_ctx->timer);
|
||||
ret = esp_timer_create(&autostop_timer_conf, &prov_ctx->autostop_timer);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to create timer");
|
||||
ESP_LOGE(TAG, "Failed to create auto-stop timer");
|
||||
esp_timer_delete(prov_ctx->wifi_connect_timer);
|
||||
free((void *)prov_ctx->pop.data);
|
||||
goto err;
|
||||
}
|
||||
@ -1480,7 +1511,8 @@ esp_err_t wifi_prov_mgr_start_provisioning(wifi_prov_security_t security, const
|
||||
/* Start provisioning service */
|
||||
ret = wifi_prov_mgr_start_service(service_name, service_key);
|
||||
if (ret != ESP_OK) {
|
||||
esp_timer_delete(prov_ctx->timer);
|
||||
esp_timer_delete(prov_ctx->autostop_timer);
|
||||
esp_timer_delete(prov_ctx->wifi_connect_timer);
|
||||
free((void *)prov_ctx->pop.data);
|
||||
}
|
||||
ACQUIRE_LOCK(prov_ctx_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user