diff --git a/main/network/wifi_handler.cpp b/main/network/wifi_handler.cpp index 4697985..5a70a2a 100644 --- a/main/network/wifi_handler.cpp +++ b/main/network/wifi_handler.cpp @@ -1,6 +1,7 @@ #include "wifi_handler.h" #include "esp_wifi.h" #include "esp_event.h" +#include "esp_netif.h" #include "freertos/event_groups.h" #include "esp_log.h" #include "freertos/semphr.h" @@ -50,6 +51,8 @@ WifiHandler::~WifiHandler() { } vSemaphoreDelete(this->scan_mutex); vSemaphoreDelete(this->connection_mutex); + esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &WifiHandler::wifi_event_handler); + esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &WifiHandler::wifi_event_handler); } } @@ -58,7 +61,47 @@ void WifiHandler::init() { ESP_LOGW(TAG, "Already initialized, skipping"); return; } + esp_err_t err; + // initialize TCP/IP stack and default event loop + err = esp_netif_init(); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_netif_init failed: %s", esp_err_to_name(err)); + return; + } + + err = esp_event_loop_create_default(); + if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { + ESP_LOGE(TAG, "esp_event_loop_create_default failed: %s", esp_err_to_name(err)); + return; + } + + // create default WiFi station + esp_netif_create_default_wifi_sta(); + + // init WiFi driver + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + err = esp_wifi_init(&cfg); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_wifi_init failed: %s", esp_err_to_name(err)); + return; + } + + // register event handlers for WiFi and IP events + esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &WifiHandler::wifi_event_handler, this); + esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &WifiHandler::wifi_event_handler, this); + + err = esp_wifi_set_mode(WIFI_MODE_STA); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_wifi_set_mode failed: %s", esp_err_to_name(err)); + return; + } + + err = esp_wifi_start(); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_wifi_start failed: %s", esp_err_to_name(err)); + return; + } // get WiFi credentials from KV storage if available char* ssid = nullptr; @@ -67,7 +110,7 @@ void WifiHandler::init() { if (ssid && password) { ESP_LOGI(TAG, "Found stored WiFi credentials, connecting to SSID: %s", ssid); - esp_err_t err = this->connect(ssid, password); + err = this->connect(ssid, password); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to connect to stored WiFi credentials: %s", esp_err_to_name(err)); } @@ -77,9 +120,7 @@ void WifiHandler::init() { delete[] ssid; delete[] password; - // TODO: setup WiFi event handlers - // TODO: add auto-reconnect logic - // + initialized = true; }