void ets_timer_setfn(ETSTimer *ptimer, ETSTimerFunc *pfunction, void *parg) { if (!timer_initialized(ptimer)) { memset(ptimer, 0, sizeof(*ptimer)); TIMER_INITIALIZED_FIELD(ptimer) = TIMER_INITIALIZED_VAL; } if (ESP_TIMER(ptimer) == NULL) { const esp_timer_create_args_t create_args = { .callback = pfunction, .arg = parg, .name = "ETSTimer", .dispatch_method = ESP_TIMER_TASK }; ESP_ERROR_CHECK( esp_timer_create(&create_args, (esp_timer_handle_t*)&(ptimer->timer_arg)) ); } } void IRAM_ATTR ets_timer_arm_us(ETSTimer *ptimer, uint32_t time_us, bool repeat_flag) { assert(timer_initialized(ptimer)); esp_timer_stop(ESP_TIMER(ptimer)); // no error check if (!repeat_flag) { ESP_ERROR_CHECK( esp_timer_start_once(ESP_TIMER(ptimer), time_us) ); } else { ESP_ERROR_CHECK( esp_timer_start_periodic(ESP_TIMER(ptimer), time_us) ); } }
void IRAM_ATTR ets_timer_arm(ETSTimer *ptimer, uint32_t time_ms, bool repeat_flag) { uint64_t time_us = 1000LL * (uint64_t) time_ms; assert(timer_initialized(ptimer)); esp_timer_stop(ESP_TIMER(ptimer)); // no error check if (!repeat_flag) { ESP_ERROR_CHECK( esp_timer_start_once(ESP_TIMER(ptimer), time_us) ); } else { ESP_ERROR_CHECK( esp_timer_start_periodic(ESP_TIMER(ptimer), time_us) ); } }
/* Event handler for starting/stopping provisioning. * To be called from within the context of the main * event handler. */ esp_err_t app_prov_event_handler(void *ctx, system_event_t *event) { /* For accessing reason codes in case of disconnection */ system_event_info_t *info = &event->event_info; /* If pointer to provisioning application data is NULL * then provisioning is not running, therefore return without * error */ if (!g_prov) { return ESP_OK; } switch(event->event_id) { case SYSTEM_EVENT_STA_START: ESP_LOGI(TAG, "STA Start"); /* Once configuration is received through protocomm, * device is started as station. Once station starts, * wait for connection to establish with configured * host SSID and password */ g_prov->wifi_state = WIFI_PROV_STA_CONNECTING; break; case SYSTEM_EVENT_STA_GOT_IP: ESP_LOGI(TAG, "STA Got IP"); /* Station got IP. That means configuration is successful. * Schedule timer to stop provisioning app after 30 seconds. */ g_prov->wifi_state = WIFI_PROV_STA_CONNECTED; if (g_prov && g_prov->timer) { esp_timer_start_once(g_prov->timer, 30000*1000U); } break; case SYSTEM_EVENT_STA_DISCONNECTED: ESP_LOGE(TAG, "STA Disconnected"); /* Station couldn't connect to configured host SSID */ g_prov->wifi_state = WIFI_PROV_STA_DISCONNECTED; ESP_LOGE(TAG, "Disconnect reason : %d", info->disconnected.reason); /* Set code corresponding to the reason for disconnection */ switch (info->disconnected.reason) { case WIFI_REASON_AUTH_EXPIRE: case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: case WIFI_REASON_BEACON_TIMEOUT: case WIFI_REASON_AUTH_FAIL: case WIFI_REASON_ASSOC_FAIL: case WIFI_REASON_HANDSHAKE_TIMEOUT: ESP_LOGI(TAG, "STA Auth Error"); g_prov->wifi_disconnect_reason = WIFI_PROV_STA_AUTH_ERROR; break; case WIFI_REASON_NO_AP_FOUND: ESP_LOGI(TAG, "STA AP Not found"); g_prov->wifi_disconnect_reason = WIFI_PROV_STA_AP_NOT_FOUND; break; default: /* If none of the expected reasons, * retry connecting to host SSID */ g_prov->wifi_state = WIFI_PROV_STA_CONNECTING; esp_wifi_connect(); } break; default: break; } return ESP_OK; }