From 4cafdcaf37efe150993845db39053c1b573cbaca Mon Sep 17 00:00:00 2001 From: Karl Osterseher Date: Fri, 21 Feb 2025 23:58:23 +0100 Subject: [PATCH] improvWifi bug fixes resulting adding network interface component Signed-off-by: Karl Osterseher --- components/improv_wifi/improvWifi.cpp | 6 +++- components/improv_wifi/wifi_provisioning.c | 35 +++++++++++++------ components/network_interface/eth_interface.c | 30 ++++++++++++---- components/network_interface/wifi_interface.c | 31 +++++++++++++--- main/main.c | 3 +- 5 files changed, 80 insertions(+), 25 deletions(-) diff --git a/components/improv_wifi/improvWifi.cpp b/components/improv_wifi/improvWifi.cpp index 0fa4de2..76a2b7b 100644 --- a/components/improv_wifi/improvWifi.cpp +++ b/components/improv_wifi/improvWifi.cpp @@ -6,6 +6,8 @@ */ #include "improvWifi.h" +#include + #include void ImprovWiFi::handleSerial(const uint8_t *data, size_t length) { @@ -274,7 +276,9 @@ bool ImprovWiFi::parseImprovSerial(size_t position, uint8_t byte, if (position == 8 + data_len + 1) { uint8_t checksum = 0x00; - for (size_t i = 0; i < position; i++) checksum += buffer[i]; + for (size_t i = 0; i < position; i++) { + checksum += buffer[i]; + } if (checksum != byte) { _position = 0; diff --git a/components/improv_wifi/wifi_provisioning.c b/components/improv_wifi/wifi_provisioning.c index c0d6eea..1dab87a 100644 --- a/components/improv_wifi/wifi_provisioning.c +++ b/components/improv_wifi/wifi_provisioning.c @@ -5,6 +5,7 @@ * Author: karl */ +#include #include #include "driver/uart.h" @@ -31,13 +32,25 @@ static QueueHandle_t uart0_queue; void uart_event_handler(void) { uart_event_t event; - uint8_t dtmp[RD_BUF_SIZE]; - size_t buffered_size; + uint8_t *dtmp; // Waiting for UART event. if (xQueueReceive(uart0_queue, (void *)&event, (TickType_t)portMAX_DELAY)) { - bzero(dtmp, RD_BUF_SIZE); - // ESP_LOGI(TAG, "uart[%d] event:", UART_NUM_0); + dtmp = (uint8_t *)calloc(1, event.size); + if (!dtmp) { + ESP_LOGE(TAG, "no free memory for uart receive. Dropping data..."); + + uint8_t drop; + while (event.size--) { + uart_read_bytes(UART_NUM_0, &drop, event.size, portMAX_DELAY); + } + + return; + } + + // ESP_LOGI(TAG, "uart[%d] event: %d, size %d", UART_NUM_0, event.type, + // event.size); + switch (event.type) { // Event of UART receving data /*We'd better handler data event fast, there would be much more data @@ -53,7 +66,7 @@ void uart_event_handler(void) { break; // Event of HW FIFO overflow detected case UART_FIFO_OVF: - // ESP_LOGI(TAG, "hw fifo overflow"); + // ESP_LOGI(TAG, "hw fifo overflow"); // If fifo overflow happened, you should consider adding flow control // for your application. The ISR has already reset the rx FIFO, As an @@ -76,6 +89,8 @@ void uart_event_handler(void) { // ESP_LOGI(TAG, "uart event type: %d", event.type); break; } + + free(dtmp); } } @@ -151,17 +166,17 @@ bool improv_wifi_connect(const char *ssid, const char *password) { uint8_t count = 0; esp_netif_ip_info_t ip; - esp_wifi_disconnect(); - while (wifi_get_ip(&ip) == true) { - vTaskDelay(pdMS_TO_TICKS(100)); - } - wifi_config_t wifi_config; ESP_ERROR_CHECK(esp_wifi_get_config(WIFI_IF_STA, &wifi_config)); strcpy((char *)wifi_config.sta.ssid, ssid); strcpy((char *)wifi_config.sta.password, password); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + esp_wifi_disconnect(); + while (wifi_get_ip(&ip) == true) { + vTaskDelay(pdMS_TO_TICKS(100)); + } + esp_wifi_connect(); while (wifi_get_ip(&ip) == false) { vTaskDelay(pdMS_TO_TICKS(500)); diff --git a/components/network_interface/eth_interface.c b/components/network_interface/eth_interface.c index c99a2ee..eefe727 100644 --- a/components/network_interface/eth_interface.c +++ b/components/network_interface/eth_interface.c @@ -29,6 +29,7 @@ static uint8_t eth_port_cnt = 0; static esp_netif_ip_info_t ip_info = {{0}, {0}, {0}}; static bool connected = false; +static SemaphoreHandle_t connIpSemaphoreHandle = NULL; #if CONFIG_SNAPCLIENT_SPI_ETHERNETS_NUM #define SPI_ETHERNETS_NUM CONFIG_SNAPCLIENT_SPI_ETHERNETS_NUM @@ -364,6 +365,10 @@ static void eth_event_handler(void *arg, esp_event_base_t event_base, break; case ETHERNET_EVENT_DISCONNECTED: + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); + connected = false; + xSemaphoreGive(connIpSemaphoreHandle); + ESP_LOGI(TAG, "Ethernet Link Down"); break; case ETHERNET_EVENT_START: @@ -392,12 +397,13 @@ static void lost_ip_event_handler(void *arg, esp_event_base_t event_base, if (network_is_our_netif(if_desc_str, event->esp_netif)) { // const esp_netif_ip_info_t *ip_info = &event->ip_info; - memcpy((void *)&ip_info, (const void *)&event->ip_info, - sizeof(esp_netif_ip_info_t)); - ESP_LOGI(TAG, "Ethernet Lost IP Address"); + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); + memcpy((void *)&ip_info, (const void *)&event->ip_info, + sizeof(esp_netif_ip_info_t)); connected = false; + xSemaphoreGive(connIpSemaphoreHandle); break; } @@ -417,10 +423,13 @@ static void got_ip_event_handler(void *arg, esp_event_base_t event_base, strcat(strcpy(if_desc_str, NETWORK_INTERFACE_DESC_ETH), num_str); if (network_is_our_netif(if_desc_str, event->esp_netif)) { - // const esp_netif_ip_info_t *ip_info = &event->ip_info; + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); memcpy((void *)&ip_info, (const void *)&event->ip_info, sizeof(esp_netif_ip_info_t)); + connected = true; + + xSemaphoreGive(connIpSemaphoreHandle); ESP_LOGI(TAG, "Ethernet Got IP Address"); ESP_LOGI(TAG, "~~~~~~~~~~~"); @@ -429,8 +438,6 @@ static void got_ip_event_handler(void *arg, esp_event_base_t event_base, ESP_LOGI(TAG, "ETHGW:" IPSTR, IP2STR(&ip_info.gw)); ESP_LOGI(TAG, "~~~~~~~~~~~"); - connected = true; - break; } } @@ -439,11 +446,16 @@ static void got_ip_event_handler(void *arg, esp_event_base_t event_base, /** */ bool eth_get_ip(esp_netif_ip_info_t *ip) { + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); + if (ip) { memcpy((void *)ip, (const void *)&ip_info, sizeof(esp_netif_ip_info_t)); } + bool _connected = connected; - return connected; + xSemaphoreGive(connIpSemaphoreHandle); + + return _connected; } static void eth_on_got_ipv6(void *arg, esp_event_base_t event_base, @@ -466,6 +478,10 @@ void eth_start(void) { esp_eth_handle_t *eth_handles; esp_netif_t *eth_netif; + if (!connIpSemaphoreHandle) { + connIpSemaphoreHandle = xSemaphoreCreateMutex(); + } + ESP_ERROR_CHECK(eth_init(ð_handles, ð_port_cnt)); #if CONFIG_SNAPCLIENT_USE_INTERNAL_ETHERNET || \ diff --git a/components/network_interface/wifi_interface.c b/components/network_interface/wifi_interface.c index a3f5207..96f3826 100644 --- a/components/network_interface/wifi_interface.c +++ b/components/network_interface/wifi_interface.c @@ -13,6 +13,9 @@ #include "esp_netif_types.h" #include "esp_timer.h" #include "esp_wifi.h" +#include "freertos/FreeRTOS.h" +#include "freertos/portmacro.h" +#include "freertos/semphr.h" #include "network_interface.h" #include "nvs_flash.h" @@ -34,6 +37,7 @@ static esp_netif_t *esp_wifi_netif = NULL; static esp_netif_ip_info_t ip_info = {{0}, {0}, {0}}; static bool connected = false; +static SemaphoreHandle_t connIpSemaphoreHandle = NULL; #if ENABLE_WIFI_PROVISIONING static esp_timer_handle_t resetReasonTimerHandle = NULL; @@ -79,6 +83,10 @@ static void event_handler(void *arg, esp_event_base_t event_base, int event_id, } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { if ((s_retry_num < WIFI_MAXIMUM_RETRY) || (WIFI_MAXIMUM_RETRY == 0)) { + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); + connected = false; + xSemaphoreGive(connIpSemaphoreHandle); + esp_wifi_connect(); s_retry_num++; ESP_LOGI(TAG, "retry to connect to the AP"); @@ -96,10 +104,13 @@ static void got_ip_event_handler(void *arg, esp_event_base_t event_base, return; } - // const esp_netif_ip_info_t *ip_info = &event->ip_info; + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); memcpy((void *)&ip_info, (const void *)&event->ip_info, sizeof(esp_netif_ip_info_t)); + connected = true; + + xSemaphoreGive(connIpSemaphoreHandle); ESP_LOGI(TAG, "Wifi Got IP Address"); ESP_LOGI(TAG, "~~~~~~~~~~~"); @@ -108,8 +119,6 @@ static void got_ip_event_handler(void *arg, esp_event_base_t event_base, ESP_LOGI(TAG, "WIFIGW:" IPSTR, IP2STR(&ip_info.gw)); ESP_LOGI(TAG, "~~~~~~~~~~~"); - connected = true; - s_retry_num = 0; } @@ -122,27 +131,39 @@ static void lost_ip_event_handler(void *arg, esp_event_base_t event_base, // const esp_netif_ip_info_t *ip_info = &event->ip_info; + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); + memcpy((void *)&ip_info, (const void *)&event->ip_info, sizeof(esp_netif_ip_info_t)); - connected = false; + xSemaphoreGive(connIpSemaphoreHandle); + ESP_LOGI(TAG, "Wifi Lost IP Address"); } /** */ bool wifi_get_ip(esp_netif_ip_info_t *ip) { + xSemaphoreTake(connIpSemaphoreHandle, portMAX_DELAY); + if (ip) { memcpy((void *)ip, (const void *)&ip_info, sizeof(esp_netif_ip_info_t)); } + bool _connected = connected; - return connected; + xSemaphoreGive(connIpSemaphoreHandle); + + return _connected; } /** */ void wifi_start(void) { + if (!connIpSemaphoreHandle) { + connIpSemaphoreHandle = xSemaphoreCreateMutex(); + } + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); diff --git a/main/main.c b/main/main.c index 424b983..cc0b590 100644 --- a/main/main.c +++ b/main/main.c @@ -30,8 +30,6 @@ #include "eth_interface.h" #endif -#include "nvs_flash.h" -// #include "wifi_interface.h" #include "board.h" #include "es8388.h" #include "esp_netif.h" @@ -44,6 +42,7 @@ #include "mdns.h" #include "net_functions.h" #include "network_interface.h" +#include "nvs_flash.h" // Web socket server // #include "websocket_if.h"