From e09e111151a63b097af22234b8651a9a6f315e5b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Mon, 20 Dec 2021 12:47:03 +0100 Subject: [PATCH] Improved logging and fixed bugs when double initialized --- src/espwifistack.cpp | 76 ++++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 20 deletions(-) diff --git a/src/espwifistack.cpp b/src/espwifistack.cpp index 21de61e..9012c82 100644 --- a/src/espwifistack.cpp +++ b/src/espwifistack.cpp @@ -12,6 +12,7 @@ // esp-idf includes #include +#include #include #include #if LWIP_IPV6 && LWIP_IPV6_DHCP6_STATELESS @@ -94,6 +95,18 @@ constexpr auto WIFI_DNS_DONE_BIT = BIT14; // generic cpputils::DelayedConstruction wifi_event_queue; cpputils::DelayedConstruction wifi_event_group; +bool defaultEventLoopCreated{}; +bool wifiEventRegistered{}; +bool ipEventRegistered{}; +#ifdef SMARTCONFIG +bool scEventRegistered{}; +#endif +#ifdef CONFIG_ETH_ENABLED +bool ethEventRegistered{}; +#endif +#ifdef PROVISIONING +bool wifiProvEventRegistered{}; +#endif } // namespace esp_netif_t* esp_netifs[ESP_IF_MAX] = {NULL, NULL, NULL}; @@ -1474,8 +1487,6 @@ esp_err_t wifi_post_event(std::unique_ptr event) void wifi_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { - ESP_LOGI(TAG, "event_base=%s event_id=%i", event_base, event_id); - auto wifi_event = std::make_unique(); wifi_event->event_id = WifiEventId::MAX; @@ -1796,6 +1807,8 @@ void wifi_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, voi wifi_event->event_id = WifiEventId::PROV_CRED_SUCCESS; } #endif + else + ESP_LOGW(TAG, "event_base=%s event_id=%i", event_base, event_id); if (wifi_event->event_id < WifiEventId::MAX) wifi_post_event(std::move(wifi_event)); @@ -1827,46 +1840,69 @@ esp_err_t wifi_start_network_event_task(const config &config) } } - if (const auto result = esp_event_loop_create_default(); result != ESP_OK) + if (!defaultEventLoopCreated) { - ESP_LOGE(TAG, "esp_event_loop_create_default() failed with %s", esp_err_to_name(result)); - if (result != ESP_ERR_INVALID_STATE) + if (const auto result = esp_event_loop_create_default(); result != ESP_OK) + { + ESP_LOGE(TAG, "esp_event_loop_create_default() failed with %s", esp_err_to_name(result)); return result; + } + defaultEventLoopCreated = true; } - if (const auto result = esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + if (!wifiEventRegistered) { - ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "WIFI_EVENT", esp_err_to_name(result)); - return result; + if (const auto result = esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + { + ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "WIFI_EVENT", esp_err_to_name(result)); + return result; + } + wifiEventRegistered = true; } - if (const auto result = esp_event_handler_instance_register(IP_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + if (!ipEventRegistered) { - ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "IP_EVENT", esp_err_to_name(result)); - return result; + if (const auto result = esp_event_handler_instance_register(IP_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + { + ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "IP_EVENT", esp_err_to_name(result)); + return result; + } + ipEventRegistered = true; } #ifdef SMARTCONFIG - if (const auto result = esp_event_handler_instance_register(SC_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + if (!scEventRegistered) { - ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "SC_EVENT", esp_err_to_name(result)); - return result; + if (const auto result = esp_event_handler_instance_register(SC_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + { + ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "SC_EVENT", esp_err_to_name(result)); + return result; + } + scEventRegistered = true; } #endif #ifdef CONFIG_ETH_ENABLED - if (const auto result = esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + if (!ethEventRegistered) { - ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "ETH_EVENT", esp_err_to_name(result)); - return result; + if (const auto result = esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + { + ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "ETH_EVENT", esp_err_to_name(result)); + return result; + } + ethEventRegistered = true; } #endif #ifdef PROVISIONING - if (const auto result = esp_event_handler_instance_register(WIFI_PROV_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + if (!wifiProvEventRegistered) { - ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "WIFI_PROV_EVENT", esp_err_to_name(result)); - return result; + if (const auto result = esp_event_handler_instance_register(WIFI_PROV_EVENT, ESP_EVENT_ANY_ID, &wifi_event_cb, NULL, NULL); result != ESP_OK) + { + ESP_LOGE(TAG, "event_handler_instance_register() for %s failed with %s", "WIFI_PROV_EVENT", esp_err_to_name(result)); + return result; + } + wifiProvEventRegistered = true; } #endif