From c22c48c63ec024da08295ca3ab804c4f619514e3 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Fri, 4 Feb 2022 18:21:34 +0100 Subject: [PATCH] add wifi connection --- main/CMakeLists.txt | 2 +- main/main.c | 9 +++++ main/wifi.c | 95 +++++++++++++++++++++++++++++++++++++++++++++ main/wifi.h | 7 ++++ 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 main/wifi.c create mode 100644 main/wifi.h diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 36a3887..0f5128e 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,2 +1,2 @@ -idf_component_register(SRCS "main.c" "tic.c" "libteleinfo.cpp" "libteleinfo/src/LibTeleinfo.cpp" +idf_component_register(SRCS "main.c" "tic.c" "wifi.c" "libteleinfo.cpp" "libteleinfo/src/LibTeleinfo.cpp" INCLUDE_DIRS ".") diff --git a/main/main.c b/main/main.c index bf87ae9..fd098ee 100644 --- a/main/main.c +++ b/main/main.c @@ -5,8 +5,17 @@ #include "freertos/queue.h" #include "driver/uart.h" #include "esp_log.h" +#include "nvs_flash.h" +#include "nvs.h" + #include "tic.h" +#include "wifi.h" void app_main(void) { + // NVS is used to store wifi credentials. So, we need to initialize it first. + ESP_ERROR_CHECK(nvs_flash_init()); + + wifi_init_sta(); + wifi_wait_for_online(); tic_uart_init(); } diff --git a/main/wifi.c b/main/wifi.c new file mode 100644 index 0000000..71a2f9f --- /dev/null +++ b/main/wifi.c @@ -0,0 +1,95 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_log.h" +#include "nvs_flash.h" + +#include "lwip/err.h" +#include "lwip/sys.h" + +#include "wifi.h" + +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; + +/* The event group allows multiple bits for each event, but we only care about one event: + * - we are connected to the AP with an IP + */ +#define WIFI_CONNECTED_BIT BIT0 + +static const char *WIFI_LOGGER = "wifi"; + +static void wifi_event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) { + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + ESP_LOGI(WIFI_LOGGER,"Connection to the AP failed!"); + xEventGroupClearBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + + ESP_LOGI(WIFI_LOGGER, "Retrying to connect to the AP..."); + esp_wifi_connect(); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(WIFI_LOGGER, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} + +void wifi_init_sta(void) { + s_wifi_event_group = xEventGroupCreate(); + + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_sta(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + esp_event_handler_instance_t instance_any_id; + esp_event_handler_instance_t instance_got_ip; + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, + ESP_EVENT_ANY_ID, + &wifi_event_handler, + NULL, + &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_STA_GOT_IP, + &wifi_event_handler, + NULL, + &instance_got_ip)); + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); + + ESP_LOGI(WIFI_LOGGER, "wifi_init_sta finished."); +} + +void wifi_wait_for_online(void) { + /* Waiting until the connection is established (WIFI_CONNECTED_BIT). + * The bits are set by wifi_event_handler() (see above) + */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually + * happened. */ + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(WIFI_LOGGER, "Connected to Wifi!"); + } else { + ESP_LOGE(WIFI_LOGGER, "UNEXPECTED EVENT"); + } + + /* The event will not be processed after unregister */ + //ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip)); + //ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id)); + //vEventGroupDelete(s_wifi_event_group); +} diff --git a/main/wifi.h b/main/wifi.h new file mode 100644 index 0000000..875a29e --- /dev/null +++ b/main/wifi.h @@ -0,0 +1,7 @@ +#ifndef __WIFI_H__ +#define __WIFI_H__ + +void wifi_init_sta(void); +void wifi_wait_for_online(void); + +#endif