From 9f848dcc3f7bfda4c9048c6d4c4f67ba640c5860 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 10 Oct 2025 22:30:32 +0200 Subject: [PATCH 01/42] Add Dockerfile and build script for ESP32 firmware --- firmware/esp32/Dockerfile | 37 +++++++++++++++++++++++++++++++++++ firmware/esp32/build-esp32.sh | 18 +++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 firmware/esp32/Dockerfile create mode 100644 firmware/esp32/build-esp32.sh diff --git a/firmware/esp32/Dockerfile b/firmware/esp32/Dockerfile new file mode 100644 index 0000000..3c490da --- /dev/null +++ b/firmware/esp32/Dockerfile @@ -0,0 +1,37 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + wget \ + flex \ + bison \ + gperf \ + python3 \ + python3-pip \ + python3-venv \ + cmake \ + ninja-build \ + ccache \ + libffi-dev \ + libssl-dev \ + dfu-util \ + libusb-1.0-0 \ + && apt-get autoremove + +WORKDIR /usr/src/ + +RUN mkdir -p ~/esp/firmware +RUN git clone --recursive https://github.com/espressif/esp-idf.git ~/esp/esp-idf +RUN cd ~/esp/esp-idf && ./install.sh esp32 +ENV IDF_PATH=~/esp/esp-idf +RUN . $IDF_PATH/export.sh + +COPY . ~/esp/firmware/ + +RUN cd ~/esp/firmware/ +RUN idf.py set-target esp32 +RUN idf.py menuconfig +RUN idf.py build diff --git a/firmware/esp32/build-esp32.sh b/firmware/esp32/build-esp32.sh new file mode 100644 index 0000000..95f84e1 --- /dev/null +++ b/firmware/esp32/build-esp32.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -e + +IMAGE_NAME="esp32-builder" +SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +DOCKERFILE="$SCRIPT_DIR/Dockerfile" +BUILD_CTX="$SCRIPT_DIR" +DEST_BIN="$SCRIPT_DIR/build/esp32.bin" + +docker build -t "$IMAGE_NAME" -f "$DOCKERFILE" "$BUILD_CTX" + +mkdir -p "$(dirname "$DEST_BIN")" + +docker run --rm "$IMAGE_NAME" \ + cat /usr/src/build/esp32.bin > "$DEST_BIN" + +esptool.py --chip esp32c3 --port /dev/ttyUSB0 --baud 115200 write_flash 0x1000 firmware.bin \ +|| { echo "To find the correct port run: ls /dev/cu.*. Then modify build-esp32.sh"; exit 1; } From 3d8962b188cd99f6fb82c806fc0aa1a4e92d3998 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 10 Oct 2025 23:59:14 +0200 Subject: [PATCH 02/42] Initialize basic watchdog --- firmware/esp32/source/main.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index a1fe59f..51856d1 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -1,3 +1,27 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_log.h" +#include "esp_pm.h" + +volatile bool critical_error_flag = false; + +static void watchdogTask(void pvParameters*) { + const TickType_t keepAlivePeriod = pdMS_TO_TICKS(30000); + + for(;;) { + if (critical_error_flag) { + ESPLOGE("Critical error flag raised. Rebooting."); + esp_restart(); + } + esp_task_wdt_reset(); + + vTaskDelay(keepAlivePeriod); + } +} + extern "C" void app_main(void) { + xTaskCreate(watchdogTask, "wdt", 256, NULL, configMAX_PRIORITIES-1, NULL); } From 3dc234eecb141dbc92037eb73cd97fac720498f6 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 10 Oct 2025 23:59:39 +0200 Subject: [PATCH 03/42] Configure power management --- firmware/esp32/source/main.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index 51856d1..495b0b5 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -23,5 +23,17 @@ static void watchdogTask(void pvParameters*) { extern "C" void app_main(void) { + ESP_LOGI("BOOT", "Hello from user land – bootloader worked yay!"); + + static const esp_pm_configure_t pm_cfg = { + .max_freq_mhz = 80, + .min_freq_mhz = 10, + .light_sleep_enable = true, + .deep_sleep_enable = true + }; + esp_pm_configure(&pm_cfg); + + + xTaskCreate(watchdogTask, "wdt", 256, NULL, configMAX_PRIORITIES-1, NULL); } From d1cf04ffdb968d8c09e2752649758131ca5cd899 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 10 Oct 2025 23:59:50 +0200 Subject: [PATCH 04/42] Allocate heap caps --- firmware/esp32/source/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index 495b0b5..ec19101 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -33,7 +33,7 @@ extern "C" void app_main(void) }; esp_pm_configure(&pm_cfg); - + heap_caps_init(); xTaskCreate(watchdogTask, "wdt", 256, NULL, configMAX_PRIORITIES-1, NULL); } From ba590b982ccc99df40fd9d8503551f623f3625f1 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 00:05:15 +0200 Subject: [PATCH 05/42] Fix build error in Dockerfile --- firmware/esp32/Dockerfile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/firmware/esp32/Dockerfile b/firmware/esp32/Dockerfile index 3c490da..852915e 100644 --- a/firmware/esp32/Dockerfile +++ b/firmware/esp32/Dockerfile @@ -23,15 +23,15 @@ RUN apt-get update && \ WORKDIR /usr/src/ -RUN mkdir -p ~/esp/firmware -RUN git clone --recursive https://github.com/espressif/esp-idf.git ~/esp/esp-idf -RUN cd ~/esp/esp-idf && ./install.sh esp32 -ENV IDF_PATH=~/esp/esp-idf -RUN . $IDF_PATH/export.sh +ENV IDF_PATH=/usr/src/esp/esp-idf +ENV IDF_PATH_FORCE=1 -COPY . ~/esp/firmware/ +RUN mkdir -p /usr/src/esp/firmware +RUN git clone --recursive https://github.com/espressif/esp-idf.git $IDF_PATH -RUN cd ~/esp/firmware/ -RUN idf.py set-target esp32 -RUN idf.py menuconfig -RUN idf.py build +RUN cd $IDF_PATH && ./install.sh esp32 + +COPY . /usr/src/esp/firmware/ + +WORKDIR /usr/src/esp/firmware/ +RUN /bin/bash -c "source $IDF_PATH/export.sh && idf.py set-target esp32 && idf.py menuconfig && idf.py build" From 55c11f2471c958aab9b44a1eb388906f4b3ced52 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 00:05:25 +0200 Subject: [PATCH 06/42] Add CMakeLists.txt for ESP32 firmware build --- firmware/esp32/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 firmware/esp32/CMakeLists.txt diff --git a/firmware/esp32/CMakeLists.txt b/firmware/esp32/CMakeLists.txt new file mode 100644 index 0000000..7fb2309 --- /dev/null +++ b/firmware/esp32/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(plant-manager) From eb980d286da9122b245dff7bb26d3bb53ecd28c2 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 13:57:01 +0200 Subject: [PATCH 07/42] Fix watchdog initialization and parameters --- .gitignore | 9 +++++++++ firmware/esp32/source/main.cpp | 19 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 1e65d57..24b0a50 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,9 @@ $RECYCLE.BIN/ # VS Code .vscode/ +# Zed +.zed + # Backup files *~ *.orig @@ -63,3 +66,9 @@ $RECYCLE.BIN/ # Logs *.log + +# EDA +eda/atmega/atmega-backups + +# Personal +*-debug.sh diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index ec19101..4374edc 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -4,17 +4,28 @@ #include "esp_system.h" #include "esp_log.h" #include "esp_pm.h" +#include "esp_task_wdt.h" +#include "freertos/semphr.h" volatile bool critical_error_flag = false; -static void watchdogTask(void pvParameters*) { - const TickType_t keepAlivePeriod = pdMS_TO_TICKS(30000); +static void watchdogTask(void *pvParameters) { + esp_task_wdt_config_t twdt_config = { + .timeout_ms = 12000, + .idle_core_mask = 0, + .trigger_panic = true, + }; + ESP_ERROR_CHECK(esp_task_wdt_init(&config)); + ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); + + const TickType_t keepAlivePeriod = pdMS_TO_TICKS(8000); for(;;) { if (critical_error_flag) { - ESPLOGE("Critical error flag raised. Rebooting."); + ESP_LOGE("Critical error flag raised. Rebooting."); esp_restart(); } + esp_task_wdt_reset(); vTaskDelay(keepAlivePeriod); @@ -35,5 +46,5 @@ extern "C" void app_main(void) heap_caps_init(); - xTaskCreate(watchdogTask, "wdt", 256, NULL, configMAX_PRIORITIES-1, NULL); + xTaskCreate(watchdogTask, "wdt", 2048, NULL, configMAX_PRIORITIES-1, NULL); } From 94d2a61cadbdb4e80eba431534bb8105fbd5379a Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 15:29:14 +0200 Subject: [PATCH 08/42] Implement Wi-Fi task --- firmware/esp32/include/wifi.hpp | 6 ++++++ firmware/esp32/source/main.cpp | 4 +++- firmware/esp32/source/wifi.cpp | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 firmware/esp32/include/wifi.hpp create mode 100644 firmware/esp32/source/wifi.cpp diff --git a/firmware/esp32/include/wifi.hpp b/firmware/esp32/include/wifi.hpp new file mode 100644 index 0000000..782fac0 --- /dev/null +++ b/firmware/esp32/include/wifi.hpp @@ -0,0 +1,6 @@ +#ifndef WIFI_HPP +#define WIFI_HPP + +void wifiTask(void *pvParameters); + +#endif diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index 4374edc..666bab7 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -1,6 +1,7 @@ #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "freertos/semphr.h" #include "esp_system.h" #include "esp_log.h" #include "esp_pm.h" @@ -46,5 +47,6 @@ extern "C" void app_main(void) heap_caps_init(); - xTaskCreate(watchdogTask, "wdt", 2048, NULL, configMAX_PRIORITIES-1, NULL); + xTaskCreate(watchdogTask, "watchdogs", 2048, NULL, configMAX_PRIORITIES-1, NULL); + xTaskCreate(wifiTask, "wifi", 4096, NULL, configMAX_PRIORITIES-4, NULL); } diff --git a/firmware/esp32/source/wifi.cpp b/firmware/esp32/source/wifi.cpp new file mode 100644 index 0000000..64e6de0 --- /dev/null +++ b/firmware/esp32/source/wifi.cpp @@ -0,0 +1,19 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_system.h" +#include "esp_log.h" +#include "esp_pm.h" +#include "esp_task_wdt.h" +#include "esp_wifi.h" + +void wifiTask(void *pvParameters) { + ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); + + // wifi here + wifiConnection(); + + esp_task_wdt_reset(); + vTaskDelay(pdMS_TO_TICKS(2500)); +} From 558413df4137bbd558459fdb57632c71c2160c19 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 20:03:42 +0200 Subject: [PATCH 09/42] Add WiFi connectivity initialization and configuration functions --- firmware/esp32/source/main.cpp | 4 ++-- firmware/esp32/source/wifi.cpp | 35 +++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index 666bab7..6ca5f65 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -6,9 +6,9 @@ #include "esp_log.h" #include "esp_pm.h" #include "esp_task_wdt.h" -#include "freertos/semphr.h" +#include "wifi.hpp" -volatile bool critical_error_flag = false; +volatile bool criticalErrorFlag = false; static void watchdogTask(void *pvParameters) { esp_task_wdt_config_t twdt_config = { diff --git a/firmware/esp32/source/wifi.cpp b/firmware/esp32/source/wifi.cpp index 64e6de0..4306e15 100644 --- a/firmware/esp32/source/wifi.cpp +++ b/firmware/esp32/source/wifi.cpp @@ -4,15 +4,44 @@ #include "freertos/semphr.h" #include "esp_system.h" #include "esp_log.h" -#include "esp_pm.h" +//#include "esp_pm.h" #include "esp_task_wdt.h" #include "esp_wifi.h" +#include "main.hpp" +#include "wifi-credentials.h" + +//check this +wifi_mode_t wifi_mode = WIFI_MODE_STA; +wifi_init_config_ wifi_cfg = { + .sta = { + .ssid = WIFI_SSID, + .password = WIFI_PASSWORD, + .threshold.authmode = WIFI_AUTH, + }, +}; + +static void wifiInit() { + ESP_ERROR_CHECK(esp_wifi_init(*wifi_cfg)); + ESP_ERROR_CHECK(esp_wifi_set_mode(wifi_mode)); + + esp_wifi_start(); +} + +static inline void wifiTryConnect() { + wifiInit(); + + if(esp_wifi_get_mode(wifi_mode)) ESP_ERROR_CHECK(esp_wifi_connect()); + else criticalErrorFlag = true; +} + +static void wifiManager() { + if(!esp_wifi_get_mode(wifi_mode)) wifiTryConnect(); +} void wifiTask(void *pvParameters) { ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); - // wifi here - wifiConnection(); + wifiManager(); esp_task_wdt_reset(); vTaskDelay(pdMS_TO_TICKS(2500)); From ed7fb9fda644be4096e22ede14e5bd0ff897fdaf Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 23:46:12 +0200 Subject: [PATCH 10/42] Fix ESP32-C3 target configuration in Dockerfile --- firmware/esp32/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/firmware/esp32/Dockerfile b/firmware/esp32/Dockerfile index 852915e..e253725 100644 --- a/firmware/esp32/Dockerfile +++ b/firmware/esp32/Dockerfile @@ -29,9 +29,12 @@ ENV IDF_PATH_FORCE=1 RUN mkdir -p /usr/src/esp/firmware RUN git clone --recursive https://github.com/espressif/esp-idf.git $IDF_PATH -RUN cd $IDF_PATH && ./install.sh esp32 +RUN cd $IDF_PATH && ./install.sh esp32c3 COPY . /usr/src/esp/firmware/ WORKDIR /usr/src/esp/firmware/ -RUN /bin/bash -c "source $IDF_PATH/export.sh && idf.py set-target esp32 && idf.py menuconfig && idf.py build" +RUN rm -rf build && /bin/bash -c "source $IDF_PATH/export.sh && idf.py set-target esp32c3 && idf.py build" + +# Copy binary to standard location for extraction +RUN mkdir -p /usr/src/build && cp build/plant-manager.bin /usr/src/build/esp32.bin From 4a9a3ef805e567939c6564f136f8de2b19b39f4f Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 23:46:23 +0200 Subject: [PATCH 11/42] Add ESP-IDF component configuration for main directory --- firmware/esp32/main/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 firmware/esp32/main/CMakeLists.txt diff --git a/firmware/esp32/main/CMakeLists.txt b/firmware/esp32/main/CMakeLists.txt new file mode 100644 index 0000000..ed3b2e7 --- /dev/null +++ b/firmware/esp32/main/CMakeLists.txt @@ -0,0 +1,10 @@ +idf_component_register(SRCS "../source/main.cpp" + "../source/wifi.cpp" + INCLUDE_DIRS "../include" + REQUIRES esp_wifi + nvs_flash + esp_pm + esp_hw_support + esp_system + freertos + log) From c0758b071eff98f5a5df4d4ea86a7984c27e55da Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 23:46:33 +0200 Subject: [PATCH 12/42] Fix power management API and variable naming for ESP32-C3 compatibility --- firmware/esp32/source/main.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/source/main.cpp index 6ca5f65..36f9339 100644 --- a/firmware/esp32/source/main.cpp +++ b/firmware/esp32/source/main.cpp @@ -1,4 +1,3 @@ -#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" @@ -8,6 +7,8 @@ #include "esp_task_wdt.h" #include "wifi.hpp" +static const char* TAG = "MAIN"; + volatile bool criticalErrorFlag = false; static void watchdogTask(void *pvParameters) { @@ -16,14 +17,14 @@ static void watchdogTask(void *pvParameters) { .idle_core_mask = 0, .trigger_panic = true, }; - ESP_ERROR_CHECK(esp_task_wdt_init(&config)); + ESP_ERROR_CHECK(esp_task_wdt_init(&twdt_config)); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); const TickType_t keepAlivePeriod = pdMS_TO_TICKS(8000); for(;;) { - if (critical_error_flag) { - ESP_LOGE("Critical error flag raised. Rebooting."); + if (criticalErrorFlag) { + ESP_LOGE(TAG, "Critical error flag raised. Rebooting."); esp_restart(); } @@ -35,18 +36,15 @@ static void watchdogTask(void *pvParameters) { extern "C" void app_main(void) { - ESP_LOGI("BOOT", "Hello from user land – bootloader worked yay!"); + ESP_LOGI(TAG, "Hello from user land – bootloader worked yay!"); - static const esp_pm_configure_t pm_cfg = { + static const esp_pm_config_t pm_cfg = { .max_freq_mhz = 80, .min_freq_mhz = 10, - .light_sleep_enable = true, - .deep_sleep_enable = true + .light_sleep_enable = true }; esp_pm_configure(&pm_cfg); - heap_caps_init(); - xTaskCreate(watchdogTask, "watchdogs", 2048, NULL, configMAX_PRIORITIES-1, NULL); xTaskCreate(wifiTask, "wifi", 4096, NULL, configMAX_PRIORITIES-4, NULL); } From 95ee47386d89e9743e5a3d18f4025cf8336b64a0 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 23:46:47 +0200 Subject: [PATCH 13/42] Fix WiFi configuration initialization and add proper logging --- firmware/esp32/source/wifi.cpp | 60 ++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/firmware/esp32/source/wifi.cpp b/firmware/esp32/source/wifi.cpp index 4306e15..0bc8d35 100644 --- a/firmware/esp32/source/wifi.cpp +++ b/firmware/esp32/source/wifi.cpp @@ -1,48 +1,72 @@ #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "esp_system.h" #include "esp_log.h" -//#include "esp_pm.h" #include "esp_task_wdt.h" #include "esp_wifi.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "nvs_flash.h" #include "main.hpp" #include "wifi-credentials.h" -//check this -wifi_mode_t wifi_mode = WIFI_MODE_STA; -wifi_init_config_ wifi_cfg = { - .sta = { - .ssid = WIFI_SSID, - .password = WIFI_PASSWORD, - .threshold.authmode = WIFI_AUTH, - }, -}; +static const char* TAG = "WIFI"; + +static wifi_config_t wifi_cfg; static void wifiInit() { - ESP_ERROR_CHECK(esp_wifi_init(*wifi_cfg)); - ESP_ERROR_CHECK(esp_wifi_set_mode(wifi_mode)); + ESP_LOGI(TAG, "Initializing WiFi..."); + // Initialize WiFi configuration + memset(&wifi_cfg, 0, sizeof(wifi_cfg)); + strcpy((char*)wifi_cfg.sta.ssid, WIFI_SSID); + strcpy((char*)wifi_cfg.sta.password, WIFI_PASSWORD); + wifi_cfg.sta.threshold.authmode = WIFI_AUTH; + + ESP_ERROR_CHECK(nvs_flash_init()); + 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_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg)); - esp_wifi_start(); + ESP_ERROR_CHECK(esp_wifi_start()); } static inline void wifiTryConnect() { wifiInit(); - if(esp_wifi_get_mode(wifi_mode)) ESP_ERROR_CHECK(esp_wifi_connect()); - else criticalErrorFlag = true; + wifi_mode_t mode; + if(esp_wifi_get_mode(&mode) == ESP_OK && mode == WIFI_MODE_STA) { + ESP_LOGI(TAG, "Attempting to connect to WiFi..."); + ESP_ERROR_CHECK(esp_wifi_connect()); + } else { + ESP_LOGE(TAG, "WiFi mode check failed, setting critical error flag"); + criticalErrorFlag = true; + } } static void wifiManager() { - if(!esp_wifi_get_mode(wifi_mode)) wifiTryConnect(); + wifi_mode_t mode; + if(esp_wifi_get_mode(&mode) != ESP_OK || mode != WIFI_MODE_STA) { + wifiTryConnect(); + } } void wifiTask(void *pvParameters) { + ESP_LOGI(TAG, "WiFi task started"); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); wifiManager(); - esp_task_wdt_reset(); - vTaskDelay(pdMS_TO_TICKS(2500)); + for(;;) { + esp_task_wdt_reset(); + vTaskDelay(pdMS_TO_TICKS(2500)); + } } From 4be663e688126923962f3209ab22ed1bc362fded Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 11 Oct 2025 23:46:57 +0200 Subject: [PATCH 14/42] Update build script to use modern esptool and correct firmware paths --- firmware/esp32/build-esp32.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 firmware/esp32/build-esp32.sh diff --git a/firmware/esp32/build-esp32.sh b/firmware/esp32/build-esp32.sh old mode 100644 new mode 100755 index 95f84e1..5d047ad --- a/firmware/esp32/build-esp32.sh +++ b/firmware/esp32/build-esp32.sh @@ -12,7 +12,7 @@ docker build -t "$IMAGE_NAME" -f "$DOCKERFILE" "$BUILD_CTX" mkdir -p "$(dirname "$DEST_BIN")" docker run --rm "$IMAGE_NAME" \ - cat /usr/src/build/esp32.bin > "$DEST_BIN" + cat /usr/src/esp/firmware/build/plant-manager.bin > "$DEST_BIN" -esptool.py --chip esp32c3 --port /dev/ttyUSB0 --baud 115200 write_flash 0x1000 firmware.bin \ +esptool --chip esp32c3 --port /dev/ttyUSB0 --baud 115200 write-flash 0x1000 "$DEST_BIN" \ || { echo "To find the correct port run: ls /dev/cu.*. Then modify build-esp32.sh"; exit 1; } From 6f37e0d4209db9ca52cd18bd840d9aeea5d510d0 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 12 Oct 2025 00:54:08 +0200 Subject: [PATCH 15/42] Add volatile to include --- firmware/esp32/include/main.hpp | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 firmware/esp32/include/main.hpp diff --git a/firmware/esp32/include/main.hpp b/firmware/esp32/include/main.hpp new file mode 100644 index 0000000..1433a50 --- /dev/null +++ b/firmware/esp32/include/main.hpp @@ -0,0 +1,9 @@ + #ifdef __cplusplus + extern "C" { + #endif + + extern volatile bool criticalErrorFlag; + + #ifdef __cplusplus + } + #endif From a1f687e64488bd6bbc7342065dada5b19127fbeb Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 12 Oct 2025 00:54:16 +0200 Subject: [PATCH 16/42] Add wifi-credentials.h with SSID, password and auth defines --- firmware/esp32/include/wifi-credentials.h | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 firmware/esp32/include/wifi-credentials.h diff --git a/firmware/esp32/include/wifi-credentials.h b/firmware/esp32/include/wifi-credentials.h new file mode 100644 index 0000000..d48bb0a --- /dev/null +++ b/firmware/esp32/include/wifi-credentials.h @@ -0,0 +1,8 @@ +#ifndef WIFI_CREDENTIALS_H +#define WIFI_CREDENTIALS_H + +#define WIFI_SSID "your_wifi_ssid" +#define WIFI_PASSWORD "your_wifi_password" +#define WIFI_AUTH WIFI_AUTH_WPA2_PSK + +#endif From 2b86ff133c9fe4814ff35a41473929382b29e1b8 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 12 Oct 2025 01:01:50 +0200 Subject: [PATCH 17/42] Remove trailing whitespace --- firmware/esp32/Dockerfile | 2 +- firmware/esp32/source/wifi.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/firmware/esp32/Dockerfile b/firmware/esp32/Dockerfile index e253725..364ba7f 100644 --- a/firmware/esp32/Dockerfile +++ b/firmware/esp32/Dockerfile @@ -36,5 +36,5 @@ COPY . /usr/src/esp/firmware/ WORKDIR /usr/src/esp/firmware/ RUN rm -rf build && /bin/bash -c "source $IDF_PATH/export.sh && idf.py set-target esp32c3 && idf.py build" -# Copy binary to standard location for extraction + RUN mkdir -p /usr/src/build && cp build/plant-manager.bin /usr/src/build/esp32.bin diff --git a/firmware/esp32/source/wifi.cpp b/firmware/esp32/source/wifi.cpp index 0bc8d35..c7421b3 100644 --- a/firmware/esp32/source/wifi.cpp +++ b/firmware/esp32/source/wifi.cpp @@ -19,18 +19,18 @@ static wifi_config_t wifi_cfg; static void wifiInit() { ESP_LOGI(TAG, "Initializing WiFi..."); - // Initialize WiFi configuration + memset(&wifi_cfg, 0, sizeof(wifi_cfg)); strcpy((char*)wifi_cfg.sta.ssid, WIFI_SSID); strcpy((char*)wifi_cfg.sta.password, WIFI_PASSWORD); wifi_cfg.sta.threshold.authmode = WIFI_AUTH; - + ESP_ERROR_CHECK(nvs_flash_init()); 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_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); @@ -43,6 +43,7 @@ static inline void wifiTryConnect() { wifiInit(); wifi_mode_t mode; + if(esp_wifi_get_mode(&mode) == ESP_OK && mode == WIFI_MODE_STA) { ESP_LOGI(TAG, "Attempting to connect to WiFi..."); ESP_ERROR_CHECK(esp_wifi_connect()); From fafd6a9a7a5e6bff53d6ffb342de2bb5369d501e Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 12 Oct 2025 20:39:51 +0200 Subject: [PATCH 18/42] Directory restructure --- firmware/esp32/main/CMakeLists.txt | 4 ++-- firmware/esp32/{source => main}/main.cpp | 0 firmware/esp32/{source => main}/wifi.cpp | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename firmware/esp32/{source => main}/main.cpp (100%) rename firmware/esp32/{source => main}/wifi.cpp (100%) diff --git a/firmware/esp32/main/CMakeLists.txt b/firmware/esp32/main/CMakeLists.txt index ed3b2e7..6ea9e3e 100644 --- a/firmware/esp32/main/CMakeLists.txt +++ b/firmware/esp32/main/CMakeLists.txt @@ -1,5 +1,5 @@ -idf_component_register(SRCS "../source/main.cpp" - "../source/wifi.cpp" +idf_component_register(SRCS "./main.cpp" + "./wifi.cpp" INCLUDE_DIRS "../include" REQUIRES esp_wifi nvs_flash diff --git a/firmware/esp32/source/main.cpp b/firmware/esp32/main/main.cpp similarity index 100% rename from firmware/esp32/source/main.cpp rename to firmware/esp32/main/main.cpp diff --git a/firmware/esp32/source/wifi.cpp b/firmware/esp32/main/wifi.cpp similarity index 100% rename from firmware/esp32/source/wifi.cpp rename to firmware/esp32/main/wifi.cpp From 60c6a19f1306b179033c2744b616aec934ee0fbe Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 14 Oct 2025 21:58:48 +0200 Subject: [PATCH 19/42] FIx build script with correct implementation for flashing firmware --- firmware/esp32/Dockerfile | 12 ++++++++++-- firmware/esp32/build-esp32.sh | 21 +++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/firmware/esp32/Dockerfile b/firmware/esp32/Dockerfile index 364ba7f..afaa728 100644 --- a/firmware/esp32/Dockerfile +++ b/firmware/esp32/Dockerfile @@ -34,7 +34,15 @@ RUN cd $IDF_PATH && ./install.sh esp32c3 COPY . /usr/src/esp/firmware/ WORKDIR /usr/src/esp/firmware/ + +# Create sdkconfig.defaults with correct flash settings +RUN echo "CONFIG_ESPTOOLPY_FLASHMODE=dio" > sdkconfig.defaults && \ + echo "CONFIG_ESPTOOLPY_FLASHFREQ=40m" >> sdkconfig.defaults && \ + echo "CONFIG_ESPTOOLPY_FLASHSIZE=4MB" >> sdkconfig.defaults + RUN rm -rf build && /bin/bash -c "source $IDF_PATH/export.sh && idf.py set-target esp32c3 && idf.py build" - -RUN mkdir -p /usr/src/build && cp build/plant-manager.bin /usr/src/build/esp32.bin +RUN mkdir -p /usr/src/build && \ + cp build/bootloader/bootloader.bin /usr/src/build/ && \ + cp build/partition_table/partition-table.bin /usr/src/build/ && \ + cp build/plant-manager.bin /usr/src/build/ diff --git a/firmware/esp32/build-esp32.sh b/firmware/esp32/build-esp32.sh index 5d047ad..86f46a0 100755 --- a/firmware/esp32/build-esp32.sh +++ b/firmware/esp32/build-esp32.sh @@ -5,14 +5,23 @@ IMAGE_NAME="esp32-builder" SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) DOCKERFILE="$SCRIPT_DIR/Dockerfile" BUILD_CTX="$SCRIPT_DIR" -DEST_BIN="$SCRIPT_DIR/build/esp32.bin" +DEST_DIR="$SCRIPT_DIR/build" docker build -t "$IMAGE_NAME" -f "$DOCKERFILE" "$BUILD_CTX" -mkdir -p "$(dirname "$DEST_BIN")" +mkdir -p "$DEST_DIR" -docker run --rm "$IMAGE_NAME" \ - cat /usr/src/esp/firmware/build/plant-manager.bin > "$DEST_BIN" +docker run --rm -v "$DEST_DIR":/output "$IMAGE_NAME" cp -r /usr/src/build/. /output/ -esptool --chip esp32c3 --port /dev/ttyUSB0 --baud 115200 write-flash 0x1000 "$DEST_BIN" \ -|| { echo "To find the correct port run: ls /dev/cu.*. Then modify build-esp32.sh"; exit 1; } +#echo "Erasing flash..." +#esptool --chip esp32c3 --port /dev/tty.usbmodem101 erase-flash + +esptool --chip esp32c3 --port /dev/tty.usbmodem101 --baud 115200 write-flash \ + --flash-mode dio \ + --flash-freq 40m \ + --flash-size 4MB \ + 0x0000 "$DEST_DIR/bootloader.bin" \ + 0x8000 "$DEST_DIR/partition-table.bin" \ + 0x10000 "$DEST_DIR/plant-manager.bin" + +screen -fn /dev/tty.usbmodem101 115200 From ebee1553ae4395166b14b02dc3954c46b12f7c50 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 14 Oct 2025 23:31:13 +0200 Subject: [PATCH 20/42] Increase max frequency to match ESP32-C3 processor --- firmware/esp32/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index 36f9339..f2d5299 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -39,7 +39,7 @@ extern "C" void app_main(void) ESP_LOGI(TAG, "Hello from user land – bootloader worked yay!"); static const esp_pm_config_t pm_cfg = { - .max_freq_mhz = 80, + .max_freq_mhz = 160, .min_freq_mhz = 10, .light_sleep_enable = true }; From d49c69f647f569916f93fe09eaeba2c514a79d36 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 14 Oct 2025 23:32:27 +0200 Subject: [PATCH 21/42] Add error check --- firmware/esp32/main/main.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index f2d5299..e1a650e 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -17,7 +17,7 @@ static void watchdogTask(void *pvParameters) { .idle_core_mask = 0, .trigger_panic = true, }; - ESP_ERROR_CHECK(esp_task_wdt_init(&twdt_config)); + esp_task_wdt_init(&twdt_config); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); const TickType_t keepAlivePeriod = pdMS_TO_TICKS(8000); @@ -27,8 +27,7 @@ static void watchdogTask(void *pvParameters) { ESP_LOGE(TAG, "Critical error flag raised. Rebooting."); esp_restart(); } - - esp_task_wdt_reset(); + ESP_ERROR_CHECK(esp_task_wdt_reset()); vTaskDelay(keepAlivePeriod); } @@ -46,5 +45,5 @@ extern "C" void app_main(void) esp_pm_configure(&pm_cfg); xTaskCreate(watchdogTask, "watchdogs", 2048, NULL, configMAX_PRIORITIES-1, NULL); - xTaskCreate(wifiTask, "wifi", 4096, NULL, configMAX_PRIORITIES-4, NULL); + //xTaskCreate(wifiTask, "wifi", 4096, NULL, configMAX_PRIORITIES-4, NULL); } From eb897dca9ed33b283ee7b8417698b94209b5ddc8 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 15 Oct 2025 13:38:05 +0200 Subject: [PATCH 22/42] Reinitialize WDT at runtime - This is needed because of some issues when compiling without using menuconfig. Maybe there is a way to do this modifying sdkconfig.defaults when still inside Docker --- firmware/esp32/main/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index e1a650e..3c77b74 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -17,7 +17,9 @@ static void watchdogTask(void *pvParameters) { .idle_core_mask = 0, .trigger_panic = true, }; - esp_task_wdt_init(&twdt_config); + ESP_ERROR_CHECK(esp_task_wdt_deinit()); + ESP_ERROR_CHECK(esp_task_wdt_init(&twdt_config)); + ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); const TickType_t keepAlivePeriod = pdMS_TO_TICKS(8000); From be7234f62107d4a481fe907cf610838e8f18b58b Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 15 Oct 2025 13:38:41 +0200 Subject: [PATCH 23/42] Add logs --- firmware/esp32/main/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index 3c77b74..d2d5b15 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -29,7 +29,9 @@ static void watchdogTask(void *pvParameters) { ESP_LOGE(TAG, "Critical error flag raised. Rebooting."); esp_restart(); } + ESP_ERROR_CHECK(esp_task_wdt_reset()); + ESP_LOGE(TAG, "WDT reset"); vTaskDelay(keepAlivePeriod); } @@ -37,7 +39,7 @@ static void watchdogTask(void *pvParameters) { extern "C" void app_main(void) { - ESP_LOGI(TAG, "Hello from user land – bootloader worked yay!"); + ESP_LOGI(TAG, "Bootloader loaded the boot :)"); static const esp_pm_config_t pm_cfg = { .max_freq_mhz = 160, From 1aa2ebbadc8971818d91bc6ed573207c31011906 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 20:38:03 +0200 Subject: [PATCH 24/42] Define event group --- firmware/esp32/main/wifi.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index c7421b3..23f8d50 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -15,7 +15,8 @@ static const char* TAG = "WIFI"; -static wifi_config_t wifi_cfg; +EventGroupHandle_t wifi_event_group; +const int WIFI_CONNECTED_BIT = BIT0; static void wifiInit() { ESP_LOGI(TAG, "Initializing WiFi..."); From 969fda6ad4f1ff5602af431f9b010134a31a4b64 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 21:04:32 +0200 Subject: [PATCH 25/42] Refactor wifi initialization with event groups --- firmware/esp32/main/wifi.cpp | 51 ++++++++---------------------------- 1 file changed, 11 insertions(+), 40 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 23f8d50..7297fef 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -18,46 +18,17 @@ static const char* TAG = "WIFI"; EventGroupHandle_t wifi_event_group; const int WIFI_CONNECTED_BIT = BIT0; -static void wifiInit() { - ESP_LOGI(TAG, "Initializing WiFi..."); - - memset(&wifi_cfg, 0, sizeof(wifi_cfg)); - strcpy((char*)wifi_cfg.sta.ssid, WIFI_SSID); - strcpy((char*)wifi_cfg.sta.password, WIFI_PASSWORD); - wifi_cfg.sta.threshold.authmode = WIFI_AUTH; - - ESP_ERROR_CHECK(nvs_flash_init()); - 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_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg)); - - ESP_ERROR_CHECK(esp_wifi_start()); -} - -static inline void wifiTryConnect() { - wifiInit(); - - wifi_mode_t mode; - - if(esp_wifi_get_mode(&mode) == ESP_OK && mode == WIFI_MODE_STA) { - ESP_LOGI(TAG, "Attempting to connect to WiFi..."); - ESP_ERROR_CHECK(esp_wifi_connect()); - } else { - ESP_LOGE(TAG, "WiFi mode check failed, setting critical error flag"); - criticalErrorFlag = true; - } -} - -static void wifiManager() { - wifi_mode_t mode; - if(esp_wifi_get_mode(&mode) != ESP_OK || mode != WIFI_MODE_STA) { - wifiTryConnect(); +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) { + switch(event_id) { + case WIFI_EVENT_STA_START: + esp_wifi_connect(); + break; + case WIFI_EVENT_STA_DISCONNECTED: + esp_wifi_connect(); + xEventGroupClearBits(wifi_event_group, WIFI_CONNECTED_BIT); + break; + } } } From 6582872ed00337723fbef0529f90b0b72df1738f Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 21:55:47 +0200 Subject: [PATCH 26/42] Refactor Wi-Fi initialization and connection with event groups --- firmware/esp32/main/wifi.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 7297fef..4716808 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -30,6 +30,40 @@ static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t e break; } } + else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT); +} + +void wifi_init_sta(void) { + esp_err_t nvs_err = nvs_flash_init(); + + if (nvs_err == ESP_ERR_NVS_NO_FREE_PAGES || nvs_err == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ESP_ERROR_CHECK(nvs_flash_init()); + } + + wifi_event_group = xEventGroupCreate(); + + ESP_ERROR_CHECK(esp_netif_init()); + esp_netif_create_default_wifi_sta(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL, NULL)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = "SSID", + .password = "PASSWORD", + .threshold.authmode = "AUTHMODE", + .pmf_cfg = { .capable = true, .required = false }, + }, + }; + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); } void wifiTask(void *pvParameters) { From b54d3c744c40e0a29cf16c46aec3c7c09545b2f2 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:04:04 +0200 Subject: [PATCH 27/42] Update libraries --- firmware/esp32/main/wifi.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 4716808..18a161e 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -1,14 +1,8 @@ -#include -#include #include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/semphr.h" -#include "esp_system.h" -#include "esp_log.h" -#include "esp_task_wdt.h" +#include "freertos/event_groups.h" #include "esp_wifi.h" #include "esp_event.h" -#include "esp_netif.h" +#include "esp_log.h" #include "nvs_flash.h" #include "main.hpp" #include "wifi-credentials.h" From a7385654f40f44428b2ddf186d3503d6f6f194b6 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:04:28 +0200 Subject: [PATCH 28/42] Refactor Wi-Fi task to use event groups --- firmware/esp32/main/wifi.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 18a161e..5f57679 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -64,10 +64,16 @@ void wifiTask(void *pvParameters) { ESP_LOGI(TAG, "WiFi task started"); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); - wifiManager(); + wifi_init_sta(); + + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); + if (bits & WIFI_CONNECTED_BIT) ESP_LOGI("WIFI_TASK", "Wi-Fi connected, ready for network"); for(;;) { + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(5000)); + if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW("WIFI_TASK", "Wi-Fi disconnected, waiting to reconnect..."); + esp_task_wdt_reset(); - vTaskDelay(pdMS_TO_TICKS(2500)); + vTaskDelay(pdMS_TO_TICKS(5000)); } } From 1c7cf84ece8c61c88c2a385e42f0387baf5928bb Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:23:34 +0200 Subject: [PATCH 29/42] Fix designated initializer issue --- firmware/esp32/main/wifi.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 5f57679..93484f3 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -50,9 +50,14 @@ void wifi_init_sta(void) { .sta = { .ssid = "SSID", .password = "PASSWORD", - .threshold.authmode = "AUTHMODE", - .pmf_cfg = { .capable = true, .required = false }, - }, + .threshold = { + .authmode = "AUTH_MODE" + }, + .pmf_cfg = { + .capable = true, + .required = false + } + } }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); From 12be9a6141c17761759e88ef688b6d08dc1d655e Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:47:06 +0200 Subject: [PATCH 30/42] Add watchdog library --- firmware/esp32/main/wifi.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 93484f3..c8c5177 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -1,5 +1,6 @@ #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" +#include "esp_task_wdt.h" #include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" From e986120e6679a45c6ccdb9f0f6d385a949e3b994 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:48:57 +0200 Subject: [PATCH 31/42] Fix Wi-Fi config assignment error --- firmware/esp32/main/wifi.cpp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index c8c5177..e15f8b8 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -47,19 +47,12 @@ void wifi_init_sta(void) { ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL, NULL)); - wifi_config_t wifi_config = { - .sta = { - .ssid = "SSID", - .password = "PASSWORD", - .threshold = { - .authmode = "AUTH_MODE" - }, - .pmf_cfg = { - .capable = true, - .required = false - } - } - }; + wifi_config_t wifi_config{}; + strncpy((char*)wifi_config.sta.ssid, SSID, sizeof(wifi_config.sta.ssid)); + strncpy((char*)wifi_config.sta.password, PASSWORD, sizeof(wifi_config.sta.password)); + wifi_config.sta.threshold.authmode = AUTH_MODE; + wifi_config.sta.pmf_cfg.capable = true; + wifi_config.sta.pmf_cfg.required = false; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); From cb708d72f7178f8eacd59ba87159d89b0d6f2fb9 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:54:13 +0200 Subject: [PATCH 32/42] Create Wi-Fi task --- firmware/esp32/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index d2d5b15..64e1188 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -49,5 +49,5 @@ extern "C" void app_main(void) esp_pm_configure(&pm_cfg); xTaskCreate(watchdogTask, "watchdogs", 2048, NULL, configMAX_PRIORITIES-1, NULL); - //xTaskCreate(wifiTask, "wifi", 4096, NULL, configMAX_PRIORITIES-4, NULL); + xTaskCreate(wifiTask, "wifi", 4096, NULL, configMAX_PRIORITIES-4, NULL); } From e20c90a021dc3d817421efe5e5a00e16d75e0eb6 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 22:54:46 +0200 Subject: [PATCH 33/42] Change define names --- firmware/esp32/include/wifi-credentials.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware/esp32/include/wifi-credentials.h b/firmware/esp32/include/wifi-credentials.h index d48bb0a..271369b 100644 --- a/firmware/esp32/include/wifi-credentials.h +++ b/firmware/esp32/include/wifi-credentials.h @@ -1,8 +1,8 @@ #ifndef WIFI_CREDENTIALS_H #define WIFI_CREDENTIALS_H -#define WIFI_SSID "your_wifi_ssid" -#define WIFI_PASSWORD "your_wifi_password" -#define WIFI_AUTH WIFI_AUTH_WPA2_PSK +#define SSID "your_wifi_ssid" +#define PASSWORD "your_wifi_password" +#define AUTH_MODE WIFI_AUTH_WPA2_PSK #endif From c3766d4e1401dea3f2014a7b12f0cb4f52100b59 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 23:36:15 +0200 Subject: [PATCH 34/42] Fix STA initialization order --- firmware/esp32/main/wifi.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index e15f8b8..2f4695b 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -39,10 +39,12 @@ void wifi_init_sta(void) { wifi_event_group = xEventGroupCreate(); ESP_ERROR_CHECK(esp_netif_init()); - esp_netif_create_default_wifi_sta(); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + esp_netif_create_default_wifi_sta(); ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL, NULL)); @@ -61,18 +63,18 @@ void wifi_init_sta(void) { void wifiTask(void *pvParameters) { ESP_LOGI(TAG, "WiFi task started"); - ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); wifi_init_sta(); + ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); if (bits & WIFI_CONNECTED_BIT) ESP_LOGI("WIFI_TASK", "Wi-Fi connected, ready for network"); for(;;) { - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(5000)); + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(2000)); if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW("WIFI_TASK", "Wi-Fi disconnected, waiting to reconnect..."); esp_task_wdt_reset(); - vTaskDelay(pdMS_TO_TICKS(5000)); + vTaskDelay(pdMS_TO_TICKS(4000)); } } From b0a765d0ccddcb0ed241b5dacd99759f7a253425 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Fri, 24 Oct 2025 23:36:22 +0200 Subject: [PATCH 35/42] Remove old log --- firmware/esp32/main/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index 64e1188..8d9b4e9 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -39,8 +39,6 @@ static void watchdogTask(void *pvParameters) { extern "C" void app_main(void) { - ESP_LOGI(TAG, "Bootloader loaded the boot :)"); - static const esp_pm_config_t pm_cfg = { .max_freq_mhz = 160, .min_freq_mhz = 10, From 91cc34a33edd0069ba8f82e4dda355bbfea6b2dc Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 25 Oct 2025 09:31:20 +0200 Subject: [PATCH 36/42] Change log types --- firmware/esp32/main/main.cpp | 2 +- firmware/esp32/main/wifi.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/firmware/esp32/main/main.cpp b/firmware/esp32/main/main.cpp index 8d9b4e9..deaad6f 100644 --- a/firmware/esp32/main/main.cpp +++ b/firmware/esp32/main/main.cpp @@ -31,7 +31,7 @@ static void watchdogTask(void *pvParameters) { } ESP_ERROR_CHECK(esp_task_wdt_reset()); - ESP_LOGE(TAG, "WDT reset"); + ESP_LOGI(TAG, "WDT reset"); vTaskDelay(keepAlivePeriod); } diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 2f4695b..0bf10a1 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -75,6 +75,8 @@ void wifiTask(void *pvParameters) { if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW("WIFI_TASK", "Wi-Fi disconnected, waiting to reconnect..."); esp_task_wdt_reset(); + ESP_LOGI(TAG, "Wi-Fi reset"); vTaskDelay(pdMS_TO_TICKS(4000)); + } } From 1053515ced60e05bedc34ae5f334624efd24d562 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 30 Oct 2025 10:19:53 +0100 Subject: [PATCH 37/42] Remove hardcoded tag from logs --- firmware/esp32/main/wifi.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 0bf10a1..33c5df5 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -68,11 +68,11 @@ void wifiTask(void *pvParameters) { ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); - if (bits & WIFI_CONNECTED_BIT) ESP_LOGI("WIFI_TASK", "Wi-Fi connected, ready for network"); + if (bits & WIFI_CONNECTED_BIT) ESP_LOGI(TAG, "Wi-Fi connected, ready for network"); for(;;) { - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(2000)); - if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW("WIFI_TASK", "Wi-Fi disconnected, waiting to reconnect..."); + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); + if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW(TAG, "Wi-Fi disconnected, waiting to reconnect..."); esp_task_wdt_reset(); ESP_LOGI(TAG, "Wi-Fi reset"); From 8e96b0ef376b41c8ef245cf581c859a63f11bdf3 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 30 Oct 2025 14:51:40 +0100 Subject: [PATCH 38/42] Restructure loop and remove if branch: it would either always trigger it or reboot - --- firmware/esp32/main/wifi.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 33c5df5..0e3ba79 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -67,16 +67,16 @@ void wifiTask(void *pvParameters) { wifi_init_sta(); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); - if (bits & WIFI_CONNECTED_BIT) ESP_LOGI(TAG, "Wi-Fi connected, ready for network"); - - for(;;) { + do { + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); + ESP_LOGI(TAG, "Wi-Fi connected, ready for network"); + } + while (true) { EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW(TAG, "Wi-Fi disconnected, waiting to reconnect..."); esp_task_wdt_reset(); ESP_LOGI(TAG, "Wi-Fi reset"); vTaskDelay(pdMS_TO_TICKS(4000)); - } } From e9c22810a4f26b1580eedbb1d662da63abf4063d Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 30 Oct 2025 15:06:05 +0100 Subject: [PATCH 39/42] Implement Wi-Fi connection max retry limit after connection is lost --- firmware/esp32/main/wifi.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 0e3ba79..3c4d36b 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -8,6 +8,8 @@ #include "main.hpp" #include "wifi-credentials.h" +#define WIFI_MAX_RETRIES 8 + static const char* TAG = "WIFI"; EventGroupHandle_t wifi_event_group; @@ -72,8 +74,19 @@ void wifiTask(void *pvParameters) { ESP_LOGI(TAG, "Wi-Fi connected, ready for network"); } while (true) { - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); - if (!(bits & WIFI_CONNECTED_BIT)) ESP_LOGW(TAG, "Wi-Fi disconnected, waiting to reconnect..."); + for(uint8_t retriesCounter = 0; retriesCounter < WIFI_MAX_RETRIES; retriesCounter++) { + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); + + if (bits & WIFI_CONNECTED_BIT) break; + + ESP_LOGW(TAG, "Wi-Fi disconnected..."); + vTaskDelay(pdMS_TO_TICKS(250)); + } + + if (!(xEventGroupGetBits(wifi_event_group) & WIFI_CONNECTED_BIT)) { + ESP_LOGE(TAG, "Critical error: Wi-Fi connection lost"); + criticalErrorFlag = true; + } esp_task_wdt_reset(); ESP_LOGI(TAG, "Wi-Fi reset"); From 8e82e21a3d6db570e4e3d6c615154e64d1775265 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 5 Nov 2025 15:39:36 +0100 Subject: [PATCH 40/42] Re-implement Wi-Fi retry limiter by using a maximum timeout tick --- .gitignore | 7 ++---- firmware/esp32/main/wifi.cpp | 41 +++++++++++++++++------------------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 24b0a50..18e2def 100644 --- a/.gitignore +++ b/.gitignore @@ -22,13 +22,9 @@ build/ *.arduino/ *.ino.cpp -# Arduino libraries you might not want tracked +# Arduino libraries libraries/ -# PlatformIO (if you ever use it) -.pio/ -.vscode/ - # === OS and Editor specific === # macOS .DS_Store @@ -72,3 +68,4 @@ eda/atmega/atmega-backups # Personal *-debug.sh +wifi-credentials-erick.h diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index 3c4d36b..f30f31f 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -8,12 +8,12 @@ #include "main.hpp" #include "wifi-credentials.h" -#define WIFI_MAX_RETRIES 8 +#define WIFI_TIMEOUT_TICKS pdMS_TO_TICKS(30000) static const char* TAG = "WIFI"; +const int WIFI_CONNECTED_BIT = BIT0; EventGroupHandle_t wifi_event_group; -const int WIFI_CONNECTED_BIT = BIT0; 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) { @@ -69,27 +69,24 @@ void wifiTask(void *pvParameters) { wifi_init_sta(); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); + TickType_t startTick = xTaskGetTickCount(); do { - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); - ESP_LOGI(TAG, "Wi-Fi connected, ready for network"); + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); + ESP_LOGI(TAG, "Connecting to Wi-Fi..."); + + if (bits & WIFI_CONNECTED_BIT) break; + + ESP_LOGI(TAG, "Connection attempt was unsuccessful"); + vTaskDelay(pdMS_TO_TICKS(250)); + } while ((xTaskGetTickCount() - startTick) < WIFI_TIMEOUT_TICKS); + + if (xEventGroupGetBits(wifi_event_group) & WIFI_CONNECTED_BIT) ESP_LOGI(TAG, "Connection attempt was successful"); + else { + ESP_LOGE(TAG, "Critical error: Wi-Fi network refused connection or not found"); + criticalErrorFlag = true; } - while (true) { - for(uint8_t retriesCounter = 0; retriesCounter < WIFI_MAX_RETRIES; retriesCounter++) { - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); - if (bits & WIFI_CONNECTED_BIT) break; - - ESP_LOGW(TAG, "Wi-Fi disconnected..."); - vTaskDelay(pdMS_TO_TICKS(250)); - } - - if (!(xEventGroupGetBits(wifi_event_group) & WIFI_CONNECTED_BIT)) { - ESP_LOGE(TAG, "Critical error: Wi-Fi connection lost"); - criticalErrorFlag = true; - } - - esp_task_wdt_reset(); - ESP_LOGI(TAG, "Wi-Fi reset"); - vTaskDelay(pdMS_TO_TICKS(4000)); - } + esp_task_wdt_reset(); + ESP_LOGI(TAG, "Wi-Fi reset"); + vTaskDelay(pdMS_TO_TICKS(4000)); } From c74a0501c1730e3014fbf9d8e86410885f294953 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 6 Nov 2025 13:22:46 +0100 Subject: [PATCH 41/42] Move esp_netif_create_default_wifi_sta() before initializing Wi-Fi to align with the ESP-IDF recommended order --- firmware/esp32/main/wifi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index f30f31f..cb258d0 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -44,9 +44,9 @@ void wifi_init_sta(void) { 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_netif_create_default_wifi_sta(); ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL, NULL)); From 4653fe05cbcb4b10bb883d9d88f16f73d458101e Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 6 Nov 2025 16:16:38 +0100 Subject: [PATCH 42/42] Refactor Wi-Fi connection logic to improve stability, simplify event handling, and enhance logging and watchdog reliability. --- firmware/esp32/main/wifi.cpp | 48 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/firmware/esp32/main/wifi.cpp b/firmware/esp32/main/wifi.cpp index cb258d0..0dc72c8 100644 --- a/firmware/esp32/main/wifi.cpp +++ b/firmware/esp32/main/wifi.cpp @@ -8,7 +8,7 @@ #include "main.hpp" #include "wifi-credentials.h" -#define WIFI_TIMEOUT_TICKS pdMS_TO_TICKS(30000) +#define WIFI_TIMEOUT_TICKS pdMS_TO_TICKS(8000) static const char* TAG = "WIFI"; const int WIFI_CONNECTED_BIT = BIT0; @@ -17,20 +17,33 @@ EventGroupHandle_t wifi_event_group; 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) { - switch(event_id) { + switch (event_id) { case WIFI_EVENT_STA_START: + ESP_LOGI(TAG, "Wi-Fi process started, connecting..."); + esp_wifi_connect(); break; - case WIFI_EVENT_STA_DISCONNECTED: - esp_wifi_connect(); + case WIFI_EVENT_STA_DISCONNECTED: { + wifi_event_sta_disconnected_t* disconn = (wifi_event_sta_disconnected_t*) event_data; + ESP_LOGW(TAG, "Disconnected, reason: %d", disconn->reason); + xEventGroupClearBits(wifi_event_group, WIFI_CONNECTED_BIT); + esp_wifi_connect(); + break; + } + default: break; } } - else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT); + 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(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip)); + xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT); + } } -void wifi_init_sta(void) { + +static void wifi_init_sta(void) { esp_err_t nvs_err = nvs_flash_init(); if (nvs_err == ESP_ERR_NVS_NO_FREE_PAGES || nvs_err == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -69,24 +82,11 @@ void wifiTask(void *pvParameters) { wifi_init_sta(); ESP_ERROR_CHECK(esp_task_wdt_add(NULL)); - TickType_t startTick = xTaskGetTickCount(); - do { - EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, pdMS_TO_TICKS(1000)); - ESP_LOGI(TAG, "Connecting to Wi-Fi..."); + for(;;) { + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, WIFI_TIMEOUT_TICKS); - if (bits & WIFI_CONNECTED_BIT) break; - - ESP_LOGI(TAG, "Connection attempt was unsuccessful"); - vTaskDelay(pdMS_TO_TICKS(250)); - } while ((xTaskGetTickCount() - startTick) < WIFI_TIMEOUT_TICKS); - - if (xEventGroupGetBits(wifi_event_group) & WIFI_CONNECTED_BIT) ESP_LOGI(TAG, "Connection attempt was successful"); - else { - ESP_LOGE(TAG, "Critical error: Wi-Fi network refused connection or not found"); - criticalErrorFlag = true; + ESP_ERROR_CHECK(esp_task_wdt_reset()); + ESP_LOGI(TAG, "Wi-Fi task reset"); + vTaskDelay(pdMS_TO_TICKS(4000)); } - - esp_task_wdt_reset(); - ESP_LOGI(TAG, "Wi-Fi reset"); - vTaskDelay(pdMS_TO_TICKS(4000)); }