From a97872239e042fc213688d06c58fab8c1513342e Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Sat, 15 Nov 2025 22:15:54 +0100 Subject: [PATCH 01/44] init esp-idf project --- .gitignore | 61 +- .gitmodules | 6 - .vscode/extensions.json | 10 - CMakeLists.txt | 6 + lib/ArtNet | 1 - lib/AsyncWebServer_ESP32_W5500 | 1 - main/CMakeLists.txt | 2 + main/dmx-interface.c | 6 + partitions.csv | 5 + platformio.ini | 29 - pre_extra_script.py | 8 - sdkconfig | 2286 ++++++++++++++++++++++++++++++++ src/main.cpp | 515 ------- src/routes/config.cpp | 177 --- src/routes/config.h | 59 - src/routes/networks.cpp | 29 - src/routes/networks.h | 9 - src/routes/status.cpp | 43 - src/routes/status.h | 5 - src/websocket.cpp | 52 - src/websocket.h | 11 - 21 files changed, 2362 insertions(+), 959 deletions(-) mode change 100644 => 100755 .gitignore delete mode 100644 .gitmodules delete mode 100644 .vscode/extensions.json create mode 100644 CMakeLists.txt delete mode 160000 lib/ArtNet delete mode 160000 lib/AsyncWebServer_ESP32_W5500 create mode 100644 main/CMakeLists.txt create mode 100644 main/dmx-interface.c create mode 100755 partitions.csv delete mode 100644 platformio.ini delete mode 100644 pre_extra_script.py create mode 100644 sdkconfig delete mode 100644 src/main.cpp delete mode 100644 src/routes/config.cpp delete mode 100644 src/routes/config.h delete mode 100644 src/routes/networks.cpp delete mode 100644 src/routes/networks.h delete mode 100644 src/routes/status.cpp delete mode 100644 src/routes/status.h delete mode 100644 src/websocket.cpp delete mode 100644 src/websocket.h diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 516c50a..1df1fb2 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,58 @@ -# Development +# .gitignore für ESP-IDF / CMake-Projekt -.pio -.vscode -!.vscode\extensions.json +# --- Build artefacts ----------------------------------------------------- +/build/ +*.elf +*.bin +*.hex +*.map +*.img + +# CMake / build system +CMakeCache.txt +CMakeFiles/ +cmake_install.cmake +compile_commands.json + +# ESP-IDF specific +sdkconfig.old +flasher_args.json +flash_args* +flash_app_args +flash_bootloader_args +flash_project_args +bootloader-prefix/ +project_description.json +managed_components/ + +# Component build directories +components/**/build/ +partition_table/build/ + +# IDEs / editors / OS +.vscode/ +.idea/ +*.swp +*~ +.DS_Store + +# direnv (local environment/profile cache) +.direnv/ + +# Python / virtualenvs +__pycache__/ +*.pyc +venv/ +venv*/ +.env + +# Logs / temp +*.log +*.tmp +*.bak + +# Misc +*.local + +# Keep Snyk instructions file tracked (project policy) +# .github/instructions/snyk_rules.instructions.md diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 48580f7..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "lib/ArtNet"] - path = lib/ArtNet - url = https://github.com/psxde/ArtNet.git -[submodule "lib/AsyncWebServer_ESP32_W5500"] - path = lib/AsyncWebServer_ESP32_W5500 - url = https://github.com/psxde/AsyncWebServer_ESP32_W5500.git diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 080e70d..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "platformio.platformio-ide" - ], - "unwantedRecommendations": [ - "ms-vscode.cpptools-extension-pack" - ] -} diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d622b7e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(dmx-interface) diff --git a/lib/ArtNet b/lib/ArtNet deleted file mode 160000 index 5d9c42b..0000000 --- a/lib/ArtNet +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5d9c42b531404ccfbcb14106d6312b03a166868a diff --git a/lib/AsyncWebServer_ESP32_W5500 b/lib/AsyncWebServer_ESP32_W5500 deleted file mode 160000 index 38de6ac..0000000 --- a/lib/AsyncWebServer_ESP32_W5500 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 38de6ac248c7f270ca3b77ba38512ba39919aed8 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt new file mode 100644 index 0000000..2adde77 --- /dev/null +++ b/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "dmx-interface.c" + INCLUDE_DIRS ".") diff --git a/main/dmx-interface.c b/main/dmx-interface.c new file mode 100644 index 0000000..7b66f33 --- /dev/null +++ b/main/dmx-interface.c @@ -0,0 +1,6 @@ +#include + +void app_main(void) +{ + +} diff --git a/partitions.csv b/partitions.csv new file mode 100755 index 0000000..9c2c9d7 --- /dev/null +++ b/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, +storage, data, littlefs, , 0xF0000, diff --git a/platformio.ini b/platformio.ini deleted file mode 100644 index 7233133..0000000 --- a/platformio.ini +++ /dev/null @@ -1,29 +0,0 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html - -[platformio] -default_envs = lolin_s2_mini - -[env] -framework = arduino -board_build.filesystem = littlefs - -[env:lolin_s2_mini] -platform = espressif32 -board = lolin_s2_mini -lib_deps = - bblanchon/ArduinoJson @ ^7.2.0 - someweisguy/esp_dmx -extra_scripts = pre:pre_extra_script.py - -[env:esp32_wroom_32] -platform = espressif32 -board = nodemcu-32s -lib_deps = bblanchon/ArduinoJson @ ^7.2.0 diff --git a/pre_extra_script.py b/pre_extra_script.py deleted file mode 100644 index 282b492..0000000 --- a/pre_extra_script.py +++ /dev/null @@ -1,8 +0,0 @@ -Import("env") - -if env.IsIntegrationDump(): - # stop the current script execution - Return() - -env.Execute("git submodule update --init --recursive") -print("✅ SUBMODULES UPDATED") diff --git a/sdkconfig b/sdkconfig new file mode 100644 index 0000000..c50e62e --- /dev/null +++ b/sdkconfig @@ -0,0 +1,2286 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration +# +CONFIG_SOC_CAPS_ECO_VER_MAX=301 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_EMAC_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 +CONFIG_SOC_XTAL_SUPPORT_26M=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=16 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_IDCACHE_PER_CORE=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_DAC_CHAN_NUM=2 +CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=40 +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=39 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_STOP_INDEPENDENT=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_1=y +CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y +CONFIG_SOC_I2S_SUPPORTS_ADC=y +CONFIG_SOC_I2S_SUPPORTS_DAC=y +CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y +CONFIG_SOC_I2S_MAX_DATA_WIDTH=24 +CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y +CONFIG_SOC_I2S_LCD_I80_VARIANT=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=2 +CONFIG_SOC_LCD_I80_BUS_WIDTH=24 +CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y +CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 +CONFIG_SOC_RMT_SUPPORT_REF_TICK=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y +CONFIG_SOC_RTCIO_PIN_COUNT=18 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y +CONFIG_SOC_SPI_AS_CS_SUPPORTED=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_DMA_CHAN_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=1 +CONFIG_SOC_TOUCH_SENSOR_NUM=10 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=0 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=9 +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_REF_TICK=y +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_ENDIANNESS_BE=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=1 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_192=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_SECURE_BOOT_V1=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=1 +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D4=y +CONFIG_SOC_SDMMC_USE_IOMUX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +CONFIG_APP_REPRODUCIBLE_BUILD=y +# CONFIG_APP_NO_BLOBS is not set +# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_2=y +CONFIG_BOOTLOADER_LOG_VERSION=2 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +# CONFIG_BOOTLOADER_LOG_COLORS_SUPPORT is not set +# CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_NONE is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SUPPORT=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# CONFIG_BOOTLOADER_LOG_MODE_BINARY is not set +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V1_SUPPORTED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Application manager +# +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="40m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" +CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE=y +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +CONFIG_COMPILER_CXX_RTTI=y +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set + +# +# Common Options +# + +# +# BLE Log +# +# CONFIG_BLE_LOG_ENABLED is not set +# end of BLE Log + +# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set +# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set +# end of Common Options +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y +CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y +CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y +CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +CONFIG_ADC_DISABLE_DAC=y +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy DAC Driver Configurations +# +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy DAC Driver Configurations + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set +CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set +CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set + +# +# ADC Calibration Configurations +# +CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y +CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CALI_LUT_ENABLE=y +# end of ADC Calibration Configurations + +CONFIG_ADC_DISABLE_DAC_OUTPUT=y +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +# CONFIG_ESP_COEX_GPIO_DEBUG is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:DAC Configurations +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of ESP-Driver:DAC Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Touch Sensor Configurations +# +# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set +# CONFIG_TOUCH_ISR_IRAM_SAFE is not set +# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set +# CONFIG_TOUCH_SKIP_FSM_CHECK is not set +# end of ESP-Driver:Touch Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_ESP32_EMAC=y +CONFIG_ETH_PHY_INTERFACE_RMII=y +CONFIG_ETH_RMII_CLK_INPUT=y +# CONFIG_ETH_RMII_CLK_OUTPUT is not set +CONFIG_ETH_RMII_CLK_IN_GPIO=0 +CONFIG_ETH_DMA_BUFFER_SIZE=512 +CONFIG_ETH_DMA_RX_BUFFER_NUM=10 +CONFIG_ETH_DMA_TX_BUFFER_NUM=10 +# CONFIG_ETH_IRAM_OPTIMIZATION is not set +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HID +# +CONFIG_ESPHID_TASK_SIZE_BT=2048 +CONFIG_ESPHID_TASK_SIZE_BLE=4096 +# end of ESP HID + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +CONFIG_HTTPD_WS_SUPPORT=y +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_HTTPD_WS_PRE_HANDSHAKE_CB_SUPPORT is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# Main XTAL Config +# +# CONFIG_XTAL_FREQ_26 is not set +# CONFIG_XTAL_FREQ_32 is not set +CONFIG_XTAL_FREQ_40=y +# CONFIG_XTAL_FREQ_AUTO is not set +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=0 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-Driver:LCD Controller Configurations +# +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:LCD Controller Configurations + +# +# ESP-MM: Memory Management Configurations +# +# end of ESP-MM: Memory Management Configurations + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +CONFIG_ESP_PHY_IRAM_OPT=y +# CONFIG_ESP_PHY_DEBUG is not set +# end of PHY + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +# end of Power Management + +# +# ESP PSRAM +# +# CONFIG_SPIRAM is not set +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Memory +# +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 + +# +# Memory protection +# +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5=y +# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4 is not set +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_TG0_LAC=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +# CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y +# CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set +# CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y +# CONFIG_ESP_COREDUMP_CHECKSUM_SHA256 is not set +# CONFIG_ESP_COREDUMP_CAPTURE_DRAM is not set +CONFIG_ESP_COREDUMP_ENABLE=y +CONFIG_ESP_COREDUMP_LOGS=y +CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 +CONFIG_ESP_COREDUMP_UART_DELAY=0 +CONFIG_ESP_COREDUMP_STACK_SIZE=0 +CONFIG_ESP_COREDUMP_DECODE_INFO=y +# CONFIG_ESP_COREDUMP_DECODE_DISABLE is not set +CONFIG_ESP_COREDUMP_DECODE="info" +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_USE_STRFUNC_NONE=y +# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set +# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# CONFIG_FATFS_USE_DYN_BUFFERS is not set + +# +# File system free space calculation behavior +# +CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 +CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 +# end of File system free space calculation behavior +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=2096 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +# CONFIG_LOG_VERSION_1 is not set +CONFIG_LOG_VERSION_2=y +CONFIG_LOG_VERSION=2 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +CONFIG_LOG_COLORS=y +CONFIG_LOG_COLORS_SUPPORT=y +# CONFIG_LOG_TIMESTAMP_SOURCE_NONE is not set +# CONFIG_LOG_TIMESTAMP_SOURCE_RTOS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM_FULL is not set +# CONFIG_LOG_TIMESTAMP_SOURCE_UNIX is not set +CONFIG_LOG_TIMESTAMP_SUPPORT=y +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# CONFIG_LOG_MODE_BINARY is not set +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set +# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +CONFIG_LWIP_DHCPS_ADD_DNS=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 +CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 +CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 +# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set +# CONFIG_LWIP_PPP_SUPPORT is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_HOST_IP=1 +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set +# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set +CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +CONFIG_MBEDTLS_FS_IO=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set +# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set +CONFIG_LIBC_STDIN_LINE_ENDING_CR=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +# +# NVS +# +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# OpenThread Spinel +# +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# end of OpenThread Spinel + +# CONFIG_OPENTHREAD_DEBUG is not set +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) + +CONFIG_VFS_INITIALIZE_DEV_NULL=y +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +CONFIG_CXX_EXCEPTIONS=y +CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_ADC2_DISABLE_DAC=y +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +# CONFIG_SPIRAM_SUPPORT is not set +# CONFIG_ESP32_SPIRAM_SUPPORT is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32_PANIC_GDBSTUB is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32_DEBUG_OCDAWARE=y +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_UART=y +# CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set +# CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set +CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32=y +# CONFIG_ESP32_COREDUMP_CHECKSUM_SHA256 is not set +CONFIG_ESP32_ENABLE_COREDUMP=y +CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64 +CONFIG_ESP32_CORE_DUMP_UART_DELAY=0 +CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0 +CONFIG_ESP32_CORE_DUMP_DECODE_INFO=y +# CONFIG_ESP32_CORE_DUMP_DECODE_DISABLE is not set +CONFIG_ESP32_CORE_DUMP_DECODE="info" +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5760 +CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# CONFIG_ESP32_ULP_COPROC_ENABLED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 5c18ba1..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,515 +0,0 @@ -#ifdef ESP32 -#include -#include -// #include -// #include "USBCDC.h" -#include "driver/temp_sensor.h" -#elif defined(ESP8266) -#include -#include -#endif - -#include -// #include "w5500/esp32_w5500.h" -// #include - -#include -#include - -// #include "ESPDMX.h" -#include -#include - -#include -#include "websocket.h" -#include "routes/config.h" -#include "routes/networks.h" -#include "routes/status.h" - -dmx_port_t dmx1 = DMX_NUM_0; // for esp32s2 -dmx_port_t dmx2 = DMX_NUM_1; -byte dmx1_data[DMX_PACKET_SIZE]; -byte dmx2_data[DMX_PACKET_SIZE]; - -// Button -#define PIN_LED 7 -#define PIN_BUTTON 5 - -uint8_t brightness_led = 20; -bool led_on = true; -double lastMills = 0; - -// Ethernet stuff -#define ETH_SCK 36 -#define ETH_SS 34 -#define ETH_MOSI 35 -#define ETH_MISO 37 -#define ETH_INT 38 -#define ETH_SPI_CLOCK_MHZ 25 -byte mac[6]; - -AsyncWebServer server(80); - -ArtnetWiFi artnet; - -String broadcastIp; -uint8_t universe1; -uint8_t universe2; -Direction direction1; -Direction direction2; - -enum class Status -{ - Starting, - Resetting, - Normal, - Warning, - Critical -}; - -Status status; -struct BlinkingConfig -{ - int interval_ms; - bool is_blinking; - int brightness; -}; - -BlinkingConfig getBlinkingConfig(Status status) -{ - switch (status) - { - case Status::Starting: - return {500, true, brightness_led}; - case Status::Resetting: - return {100, true, brightness_led}; - case Status::Normal: - return {1000, false, brightness_led}; - case Status::Warning: - return {500, true, 255}; - case Status::Critical: - return {100, true, 255}; - default: - return {1000, false, 0}; - } -} - -BlinkingConfig led_config = getBlinkingConfig(status); - -void updateTimer(int interval_ms) -{ - // TODO: update the tickspeed of the timer -} - -void updateLed() // TODO: callback for timer -{ - if (millis() - lastMills >= led_config.interval_ms) - { - lastMills = millis(); - led_config = getBlinkingConfig(status); - if (led_config.is_blinking) - { - led_on = !led_on; - analogWrite(PIN_LED, led_on ? led_config.brightness : 0); - } - else - { - analogWrite(PIN_LED, led_config.brightness); - return; - } - } -} - -void setStatus(Status newStatus) -{ - status = newStatus; - led_config = getBlinkingConfig(status); - updateTimer(led_config.interval_ms); - updateLed(); -} - -void onButtonPress() -{ - config.begin("dmx", true); - ButtonAction action = static_cast(config.getUInt("button-action", DEFAULT_BUTTON_ACTION)); - config.end(); - - switch (action) - { - case ResetConfig: - config.begin("dmx", false); - config.clear(); - config.end(); - - ESP.restart(); - break; - - case Restart: - config.begin("dmx", false); - config.putBool("restart-via-btn", true); - config.end(); - - ESP.restart(); - break; - case None: - // do nothing - break; - } -} - -void setup() -{ - setStatus(Status::Starting); - pinMode(PIN_LED, OUTPUT); - updateLed(); - - Serial.begin(9600); - - // Get ETH mac - delay(1000); - - esp_efuse_mac_get_default(mac); - - esp_read_mac(mac, ESP_MAC_ETH); - Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); - - esp_read_mac(mac, ESP_MAC_WIFI_SOFTAP); - Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); - - esp_read_mac(mac, ESP_MAC_WIFI_STA); // ESP_MAC_BASE - Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); - - // LED - config.begin("dmx", true); - brightness_led = config.getUInt("led-brightness", DEFAULT_LED_BRIGHTNESS); - bool restartViaButton = config.getBool("restart-via-btn", false); - config.end(); - updateLed(); - - // Button - pinMode(PIN_BUTTON, INPUT_PULLUP); - if (digitalRead(PIN_BUTTON) == LOW && !restartViaButton) - { - setStatus(Status::Resetting); - unsigned long startTime = millis(); - while (digitalRead(PIN_BUTTON) == LOW && (millis() - startTime <= 3000)) - { - updateLed(); - } - if (digitalRead(PIN_BUTTON) == LOW) - { - Serial.println("Reset config"); - config.begin("dmx", false); - config.clear(); - config.end(); - setStatus(Status::Normal); - unsigned long startTime = millis(); - while (millis() - startTime <= 2000) - { - updateLed(); - } - } - } - - config.begin("dmx", false); - config.putBool("restart-via-btn", false); - config.end(); - - setStatus(Status::Starting); - - attachInterrupt(PIN_BUTTON, onButtonPress, FALLING); - - // wait for serial monitor - unsigned long startTime = millis(); - while (millis() - startTime <= 5000) - { - updateLed(); - } - Serial.println("Starting DMX-Interface..."); - - config.begin("dmx", true); - - universe1 = config.getUInt("universe-1", DEFAULT_UNIVERSE1); - universe2 = config.getUInt("universe-2", DEFAULT_UNIVERSE2); - - direction1 = static_cast(config.getUInt("direction-1", DEFAULT_DIRECTION1)); - direction2 = static_cast(config.getUInt("direction-2", DEFAULT_DIRECTION2)); - - Serial.printf("Port A: Universe %d %s\n", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - Serial.printf("Port B: Universe %d %s\n", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - - Connection connection = static_cast(config.getUInt("connection", DEFAULT_CONNECTION)); - IpMethod ipMethod = static_cast(config.getUInt("ip-method"), DEFAULT_IP_METHOD); - - char hostname[30]; - snprintf(hostname, sizeof(hostname), "ChaosDMX-%02X%02X", mac[4], mac[5]); - DEFAULT_SSID = hostname; - Serial.print("Hostname: "); - Serial.println(hostname); - - String ssid = config.getString("ssid", DEFAULT_SSID); - String pwd = config.getString("password", DEFAULT_PASSWORD); - - // Default IP as defined in standard https://art-net.org.uk/downloads/art-net.pdf, page 13 - IPAddress ip = config.getUInt("ip", DEFAULT_IP); - IPAddress subnet = config.getUInt("subnet", DEFAULT_SUBNET); - IPAddress gateway = config.getUInt("gateway", 0); - - config.end(); - - switch (connection) - { - case WiFiSta: - Serial.println("Initialize as WiFi Station"); - WiFi.setHostname(hostname); - WiFi.begin(ssid, pwd); - Serial.println("SSID: " + ssid + ", pwd: " + pwd); - if (ipMethod == Static) - { - WiFi.config(ip, gateway, subnet); - Serial.println("IP: " + ip.toString() + ", gateway: " + gateway + ", subnet: " + subnet); - } - while (WiFi.status() != WL_CONNECTED) - { - Serial.print("."); - delay(500); - } - broadcastIp = String(WiFi.broadcastIP().toString().c_str()); - Serial.println(""); - Serial.print("WiFi connected, IP = "); - Serial.println(WiFi.localIP()); - Serial.print("MAC address: "); - Serial.println(WiFi.macAddress()); - Serial.print("Broadcast IP: "); - Serial.println(broadcastIp); - break; - - case Ethernet: - { - Serial.println("Initialize as ETH"); - ESP32_W5500_onEvent(); - - if (ETH.begin(ETH_MISO, ETH_MOSI, ETH_SCK, ETH_SS, ETH_INT, ETH_SPI_CLOCK_MHZ, SPI2_HOST, mac)) - { // Dynamic IP setup - } - else - { - Serial.println("Failed to configure Ethernet"); - } - ETH.setHostname(hostname); - - // ESP32_W5500_waitForConnect(); - uint8_t timeout = 5; // in s - Serial.print("Wait for connect"); - while (!ESP32_W5500_eth_connected && timeout > 0) - { - delay(1000); - timeout--; - Serial.print("."); - } - Serial.println(); - if (ESP32_W5500_eth_connected) - { - Serial.println("DHCP OK!"); - } - else - { - Serial.println("Set static IP"); - ETH.config(ip, gateway, subnet); - } - broadcastIp = ETH.broadcastIP().toString(); - - Serial.print("Local IP : "); - Serial.println(ETH.localIP()); - Serial.print("Subnet Mask : "); - Serial.println(ETH.subnetMask()); - Serial.print("Gateway IP : "); - Serial.println(ETH.gatewayIP()); - Serial.print("DNS Server : "); - Serial.println(ETH.dnsIP()); - Serial.print("MAC address : "); - Serial.println(ETH.macAddress()); - Serial.print("Broadcast IP: "); - Serial.println(broadcastIp); - Serial.println("Ethernet Successfully Initialized"); - break; - } - default: - Serial.println("Initialize as WiFi AccessPoint"); - WiFi.softAPsetHostname(hostname); - WiFi.softAP(ssid, pwd); - // AP always with DHCP - // WiFi.softAPConfig(ip, gateway, subnet); - broadcastIp = WiFi.softAPBroadcastIP().toString(); - Serial.print("WiFi AP enabled, IP = "); - Serial.println(WiFi.softAPIP()); - Serial.print("MAC address: "); - Serial.println(WiFi.softAPmacAddress()); - Serial.print("Broadcast IP: "); - Serial.println(broadcastIp); - break; - } - - // Initialize DMX ports - Serial.println("Initialize DMX..."); - -#ifdef CONFIG_IDF_TARGET_ESP32S2 - - dmx_config_t dmx_config = DMX_CONFIG_DEFAULT; - dmx_personality_t personalities[] = {}; - int personality_count = 0; - - dmx_driver_install(dmx1, &dmx_config, personalities, personality_count); - dmx_set_pin(dmx1, 21, 33, -1); - dmx_driver_install(dmx2, &dmx_config, personalities, personality_count); - dmx_set_pin(dmx2, 17, 18, -1); - - Serial.printf("DMX driver 1 installed: %d\n", dmx_driver_is_installed(dmx1)); - Serial.printf("DMX driver 2 installed: %d\n", dmx_driver_is_installed(dmx2)); - - Serial.printf("DMX driver 1 enabled: %d\n", dmx_driver_is_enabled(dmx1)); - Serial.printf("DMX driver 2 enabled: %d\n", dmx_driver_is_enabled(dmx2)); - -#else - dmx1.init(21, 33, Serial1); - dmx2.init(17, 18, Serial2); -#endif - - // Initialize Art-Net - Serial.println("Initialize Art-Net..."); - artnet.begin(); - - // if Artnet packet comes to this universe, this function is called - if (direction1 == Output) - { - artnet.subscribeArtDmxUniverse(universe1, [&](const uint8_t *data, uint16_t size, const ArtDmxMetadata &metadata, const ArtNetRemoteInfo &remote) - { - dmx_write_offset(dmx1, 1, data, size); - dmx_send(dmx1); - dmx_wait_sent(dmx1, DMX_TIMEOUT_TICK); }); - } - - if (direction2 == Output) - { - artnet.subscribeArtDmxUniverse(universe2, [&](const uint8_t *data, uint16_t size, const ArtDmxMetadata &metadata, const ArtNetRemoteInfo &remote) - { - dmx_write_offset(dmx2, 1, data, size); - dmx_send(dmx2); - dmx_wait_sent(dmx2, DMX_TIMEOUT_TICK); }); - } - - if (!LittleFS.begin(true)) - { - Serial.println("An Error has occurred while mounting LittleFS"); - return; - } - - server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html"); - - server.on("/config", HTTP_GET, [](AsyncWebServerRequest *request) - { onGetConfig(request); }); - - server.on("/config", HTTP_DELETE, [](AsyncWebServerRequest *request) - { - config.begin("dmx", false); - config.clear(); - config.end(); - // respond with default config - onGetConfig(request); - - ESP.restart(); }); - - server.on("/networks", HTTP_GET, [](AsyncWebServerRequest *request) - { onGetNetworks(request); }); - - server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) - { - if (request->url() == "/config" && request->method() == HTTP_PUT) { - onPutConfig(request, data, len, index, total); - Serial.println("restarting ESP..."); - ESP.restart(); - } }); - - initWebSocket(&server); - - server.begin(); - Serial.println("Server started!"); - - // scan networks and cache them - WiFi.scanNetworks(true); - - setStatus(Status::Normal); - - // Internal temperature RP2040 - /*float tempC = analogReadTemp(); // Get internal temperature - Serial.print("Temperature Celsius (ºC): "); - Serial.println(tempC);*/ - // Internal temperature ESP32 https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ - Serial.print("Temperature: "); - float result = 0; - temp_sensor_read_celsius(&result); - Serial.print(result); - Serial.println(" °C"); - - Serial.printf("Internal Total heap %d, internal Free Heap %d\n", ESP.getHeapSize(), ESP.getFreeHeap()); - Serial.printf("SPIRam Total heap %d, SPIRam Free Heap %d\n", ESP.getPsramSize(), ESP.getFreePsram()); - Serial.printf("ChipRevision %d, Cpu Freq %d, SDK Version %s\n", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); - Serial.printf("Flash Size %d, Flash Speed %d\n", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); -} - -void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUniverse) -{ - /* We need a place to store information about the DMX packets we receive. We - will use a dmx_packet_t to store that packet information. */ - dmx_packet_t dmx_packet; - - // check if there's a new DMX packet - if (dmx_receive(dmxPort, &dmx_packet, 0)) - { - /* We should check to make sure that there weren't any DMX errors. */ - if (!dmx_packet.err) - { - /* Don't forget we need to actually read the DMX data into our buffer so - that we can print it out. */ - dmx_read_offset(dmxPort, 1, dmx_data, dmx_packet.size); - artnet.sendArtDmx(broadcastIp, artnetUniverse, dmx_data, dmx_packet.size); - } - else - { - /* Oops! A DMX error occurred! Don't worry, this can happen when you first - connect or disconnect your DMX devices. If you are consistently getting - DMX errors, then something may have gone wrong with your code or - something is seriously wrong with your DMX transmitter. */ - Serial.printf("A DMX error occurred on port %d.\n", dmxPort); - } - } -} - -void loop() -{ - // only check for artnet packets if we expect to receive data - if (direction1 == Output || direction2 == Output) - { - // check if artnet packet has come and execute callback - artnet.parse(); - } - - if (direction1 == Input) - { - transmitDmxToArtnet(dmx1, dmx1_data, universe1); - } - - if (direction2 == Input) - { - transmitDmxToArtnet(dmx2, dmx2_data, universe2); - } - - webSocketLoop(); - updateLed(); -} diff --git a/src/routes/config.cpp b/src/routes/config.cpp deleted file mode 100644 index 25b3fec..0000000 --- a/src/routes/config.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include "config.h" -#include -#include -#include "WiFi.h" - -Preferences config; -String DEFAULT_SSID = ""; - -#pragma region Utility - -uint32_t parseIp(String str) -{ - const int size = 4; - - String ipStrings[size]; - uint8_t ipIndex = 0; - - for (int i = 0; i < str.length(); i++) - { - if (str[i] == '.') - { - ipIndex++; - continue; - } - ipStrings[ipIndex] += str[i]; - } - - String ip = ""; - for (int i = 0; i < size; i++) - { - String paddedString = ipStrings[i]; - while (paddedString.length() < 3) - { - paddedString = "0" + paddedString; - } - ip.concat(paddedString); - } - - Serial.println("ip string: " + ip); - return atoi(ip.c_str()); -} - -IpMethod parseIpMethod(uint8_t ipMethod) -{ - if (ipMethod > 0 || ipMethod < IP_METHOD_SIZE) - { - return static_cast(ipMethod); - } - - throw ::std::invalid_argument("Invalid IP method value" + ipMethod); -} - -Connection parseConnection(uint8_t connection) -{ - if (connection > 0 || connection < CONNECTION_SIZE) - { - return static_cast(connection); - } - - throw ::std::invalid_argument("Invalid connection value: " + connection); -} - -Direction parseDirection(uint8_t direction) -{ - if (direction > 0 || direction < DIRECTION_SIZE) - { - return static_cast(direction); - } - - throw ::std::invalid_argument("Invalid direction value: " + direction); -} - -ButtonAction parseButtonAction(uint8_t buttonAction) -{ - if (buttonAction > 0 || buttonAction < BUTTON_ACTION_SIZE) - { - return static_cast(buttonAction); - } - - throw ::std::invalid_argument("Invalid value for button action: " + buttonAction); -} - -#pragma endregion - -void onGetConfig(AsyncWebServerRequest *request) -{ - config.begin("dmx", true); - - IPAddress ip = config.getUInt("ip", DEFAULT_IP); - IPAddress subnet = config.getUInt("subnet", DEFAULT_SUBNET); - IPAddress gateway = config.getUInt("gateway", 0); - - JsonDocument doc; - doc["connection"] = config.getUInt("connection", DEFAULT_CONNECTION); - doc["ssid"] = config.getString("ssid", DEFAULT_SSID); - doc["password"] = config.getString("password", DEFAULT_PASSWORD); - doc["ip-method"] = config.getUInt("ip-method", DEFAULT_IP_METHOD); - doc["ip"] = ip.toString(); - doc["subnet"] = subnet.toString(); - doc["gateway"] = gateway != 0 ? gateway.toString() : ""; - doc["universe-1"] = config.getUInt("universe-1", DEFAULT_UNIVERSE1); - doc["direction-1"] = config.getUInt("direction-1", DEFAULT_DIRECTION1); - doc["universe-2"] = config.getUInt("universe-2", DEFAULT_UNIVERSE2); - doc["direction-2"] = config.getUInt("direction-2", DEFAULT_DIRECTION2); - doc["led-brightness"] = config.getUInt("led-brightness", DEFAULT_LED_BRIGHTNESS); - doc["button-action"] = config.getUInt("button-action", DEFAULT_BUTTON_ACTION); - - config.end(); - - String jsonString; - serializeJson(doc, jsonString); - - request->send(200, "application/json", jsonString); -} - -void onPutConfig(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) -{ - Serial.printf("[REQUEST]\t%s\r\n", (const char *)data); - - JsonDocument doc; - deserializeJson(doc, data); - - try - { - config.begin("dmx", false); - - IpMethod ipMethod = parseIpMethod(doc["ip-method"].as()); - config.putUInt("ip-method", ipMethod); - - if (ipMethod == Static) - { - IPAddress ipAddress; - ipAddress.fromString(doc["ip"].as()); - config.putUInt("ip", ipAddress); - - IPAddress subnet; - subnet.fromString(doc["subnet"].as()); - config.putUInt("subnet", subnet); - - IPAddress gateway; - gateway.fromString(doc["gateway"].as()); - config.putUInt("gateway", gateway); - } - - Connection connection = parseConnection(doc["connection"].as()); - config.putUInt("connection", connection); - - if (connection == WiFiSta || connection == WiFiAP) - { - config.putString("ssid", doc["ssid"].as()); - config.putString("password", doc["password"].as()); - } - - Direction direction1 = parseDirection(doc["direction-1"].as()); - config.putUInt("direction-1", direction1); - - Direction direction2 = parseDirection(doc["direction-2"].as()); - config.putUInt("direction-2", direction2); - - config.putUInt("universe-1", doc["universe-1"]); - config.putUInt("universe-2", doc["universe-2"]); - - config.putUInt("led-brightness", doc["led-brightness"]); - - ButtonAction buttonAction = parseButtonAction(doc["button-action"].as()); - config.putUInt("button-action", buttonAction); - - config.end(); - - request->send(200); - } - catch (::std::invalid_argument &e) - { - config.end(); - request->send(400, "text/plain", e.what()); - } -} diff --git a/src/routes/config.h b/src/routes/config.h deleted file mode 100644 index 957ba25..0000000 --- a/src/routes/config.h +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -#ifndef CONFIG_h -#define CONFIG_h - -extern Preferences config; - -enum IpMethod -{ - Static, - DHCP -}; -const uint8_t IP_METHOD_SIZE = 2; - -enum Connection -{ - WiFiSta, - WiFiAP, - Ethernet -}; -const uint8_t CONNECTION_SIZE = 3; - -enum Direction -{ - Output, - Input -}; -const uint8_t DIRECTION_SIZE = 2; - -enum ButtonAction -{ - None, - ResetConfig, - Restart -}; -const uint8_t BUTTON_ACTION_SIZE = 3; - -const Connection DEFAULT_CONNECTION = WiFiAP; -const IpMethod DEFAULT_IP_METHOD = DHCP; -extern String DEFAULT_SSID; // initialized in setup because it depends on the mac address -const String DEFAULT_PASSWORD = "mbgmbgmbg"; -const IPAddress DEFAULT_IP(192, 168, 4, 1); -const IPAddress DEFAULT_SUBNET(255, 255, 255, 0); -const IPAddress DEFAULT_GATEWAY(2, 0, 0, 1); - -const Direction DEFAULT_DIRECTION1 = Output; -const Direction DEFAULT_DIRECTION2 = Input; -const uint8_t DEFAULT_UNIVERSE1 = 1; -const uint8_t DEFAULT_UNIVERSE2 = 2; - -const uint8_t DEFAULT_LED_BRIGHTNESS = 25; -const ButtonAction DEFAULT_BUTTON_ACTION = Restart; - -void onGetConfig(AsyncWebServerRequest *request); - -void onPutConfig(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total); - -#endif \ No newline at end of file diff --git a/src/routes/networks.cpp b/src/routes/networks.cpp deleted file mode 100644 index 9cda700..0000000 --- a/src/routes/networks.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "networks.h" - -void onGetNetworks(AsyncWebServerRequest *request) -{ - JsonDocument doc; - JsonArray array = doc.to(); - - int numberOfNetworks = WiFi.scanComplete(); - if (numberOfNetworks == WIFI_SCAN_FAILED) - { - WiFi.scanNetworks(true); - } - else if (numberOfNetworks) - { - for (int i = 0; i < numberOfNetworks; ++i) - { - array.add(WiFi.SSID(i)); - } - WiFi.scanDelete(); - if (WiFi.scanComplete() == WIFI_SCAN_FAILED) - { - WiFi.scanNetworks(true); - } - } - - String jsonString; - serializeJson(doc, jsonString); - request->send(200, "application/json", jsonString); -} diff --git a/src/routes/networks.h b/src/routes/networks.h deleted file mode 100644 index 33a742c..0000000 --- a/src/routes/networks.h +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -#ifndef NETWORKS_H -#define NETWORKS_H - -void onGetNetworks(AsyncWebServerRequest *request); - -#endif \ No newline at end of file diff --git a/src/routes/status.cpp b/src/routes/status.cpp deleted file mode 100644 index 44af29b..0000000 --- a/src/routes/status.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "status.h" - -int getTemperature() -{ - float tempC = -1.0f; - temp_sensor_read_celsius(&tempC); - return static_cast(round(tempC)); -} - -int8_t getWiFiStrength() -{ - try - { - return WiFi.RSSI(); - } - catch (...) - { - return 0; - } -} - -JsonDocument buildStatusJson() -{ - JsonDocument doc; - - doc["uptime"] = millis(); - doc["chip"]["model"] = ESP.getChipModel(); - doc["chip"]["mac"] = ESP.getEfuseMac(); - doc["chip"]["revision"] = ESP.getChipRevision(); - doc["chip"]["cpuFreqMHz"] = ESP.getCpuFreqMHz(); - doc["chip"]["cycleCount"] = ESP.getCycleCount(); - doc["chip"]["tempC"] = getTemperature(); - doc["sdkVersion"] = ESP.getSdkVersion(); - doc["sketch"]["size"] = ESP.getSketchSize(); - doc["sketch"]["md5"] = ESP.getSketchMD5(); - doc["heap"]["free"] = ESP.getFreeHeap(); - doc["heap"]["total"] = ESP.getHeapSize(); - doc["psram"]["free"] = ESP.getFreePsram(); - doc["psram"]["total"] = ESP.getPsramSize(); - doc["connection"]["signalStrength"] = getWiFiStrength(); - - return doc; -} \ No newline at end of file diff --git a/src/routes/status.h b/src/routes/status.h deleted file mode 100644 index 9df7ac2..0000000 --- a/src/routes/status.h +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -#include - -JsonDocument buildStatusJson(); diff --git a/src/websocket.cpp b/src/websocket.cpp deleted file mode 100644 index 0bb8d1a..0000000 --- a/src/websocket.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "websocket.h" - -AsyncWebSocket ws("/ws"); - -long webSocketLastUpdate = 0; -const int WS_UPDATE_INTERVAL = 10 * 1000; // 10 seconds - -String buildStatusString() -{ - JsonDocument doc; - doc["type"] = "status"; - doc["data"] = buildStatusJson(); - - String jsonString = ""; - serializeJson(doc, jsonString); - return jsonString; -} - -void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) -{ - switch (type) - { - case WS_EVT_CONNECT: - Serial.printf("[WS] Client %u connected from %s\n", client->id(), client->remoteIP().toString().c_str()); - // directly send status to client - ws.text(client->id(), buildStatusString()); - break; - case WS_EVT_DISCONNECT: - Serial.printf("[WS] Client %u disconnected\n", client->id()); - break; - case WS_EVT_DATA: - Serial.printf("[WS] Data received from client %u: %s\n", client->id(), (char *)data); - break; - default: - break; - } -} - -void webSocketLoop() -{ - if (millis() - webSocketLastUpdate > WS_UPDATE_INTERVAL) - { - ws.textAll(buildStatusString()); - webSocketLastUpdate = millis(); - } -} - -void initWebSocket(AsyncWebServer *server) -{ - ws.onEvent(onEvent); - server->addHandler(&ws); -} diff --git a/src/websocket.h b/src/websocket.h deleted file mode 100644 index 05d1144..0000000 --- a/src/websocket.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "routes/status.h" - -#ifndef WEBSOCKET_H -#define WEBSOCKET_H - -void initWebSocket(AsyncWebServer *server); - -void webSocketLoop(); - -#endif From 3a5cf2ff22b8cc4299728d28b803c63b12bbcce3 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:50:51 +0100 Subject: [PATCH 02/44] add initial flake configuration and environment setup --- .envrc | 7 ++++ flake.lock | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 28 ++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..c046f76 --- /dev/null +++ b/.envrc @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +if command -v nix &> /dev/null; then + use flake +else + echo "Nix not found, skipping flake support" +fi + diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..9f23426 --- /dev/null +++ b/flake.lock @@ -0,0 +1,96 @@ +{ + "nodes": { + "esp-dev": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1767865407, + "narHash": "sha256-QWF1rZYd+HvNzLIeRS+OEBX7HF0EhWCGeLbMkgtbsIo=", + "owner": "mirrexagon", + "repo": "nixpkgs-esp-dev", + "rev": "5287d6e1ca9e15ebd5113c41b9590c468e1e001b", + "type": "github" + }, + "original": { + "owner": "mirrexagon", + "repo": "nixpkgs-esp-dev", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1767799921, + "narHash": "sha256-r4GVX+FToWVE2My8VVZH4V0pTIpnu2ZE8/Z4uxGEMBE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d351d0653aeb7877273920cd3e823994e7579b0b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1772624091, + "narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "80bdc1e5ce51f56b19791b52b2901187931f5353", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "esp-dev": "esp-dev", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..7dafbc9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,28 @@ +{ + description = "dmx-interface development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + esp-dev.url = "github:mirrexagon/nixpkgs-esp-dev"; + }; + + outputs = + { + self, + nixpkgs, + esp-dev, + }: + let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + # Use the same esp-idf-full as previously in .envrc + esp-idf = esp-dev.packages.${system}.esp-idf-full; + in + { + devShells.${system}.default = pkgs.mkShell { + buildInputs = [ + esp-idf + ]; + }; + }; +} From 4d8be45e481b0d956f4263b4b5480f0bb4704bad Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:29:29 +0100 Subject: [PATCH 03/44] Add sdkconfig.defaults and tasks.py for project configuration and build automation - Created sdkconfig.defaults to store default configuration settings for the project. - Added tasks.py to define various build and management tasks using Invoke --- .gitignore | 1 + flake.nix | 2 + sdkconfig | 2286 -------------------------------------------- sdkconfig.defaults | 4 + tasks.py | 50 + 5 files changed, 57 insertions(+), 2286 deletions(-) delete mode 100644 sdkconfig create mode 100644 sdkconfig.defaults create mode 100644 tasks.py diff --git a/.gitignore b/.gitignore index 1df1fb2..5bd8a41 100755 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ cmake_install.cmake compile_commands.json # ESP-IDF specific +sdkconfig sdkconfig.old flasher_args.json flash_args* diff --git a/flake.nix b/flake.nix index 7dafbc9..a9c1a83 100644 --- a/flake.nix +++ b/flake.nix @@ -22,6 +22,8 @@ devShells.${system}.default = pkgs.mkShell { buildInputs = [ esp-idf + pkgs.python3 + pkgs.python3Packages.invoke ]; }; }; diff --git a/sdkconfig b/sdkconfig deleted file mode 100644 index c50e62e..0000000 --- a/sdkconfig +++ /dev/null @@ -1,2286 +0,0 @@ -# -# Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration -# -CONFIG_SOC_CAPS_ECO_VER_MAX=301 -CONFIG_SOC_ADC_SUPPORTED=y -CONFIG_SOC_DAC_SUPPORTED=y -CONFIG_SOC_UART_SUPPORTED=y -CONFIG_SOC_MCPWM_SUPPORTED=y -CONFIG_SOC_GPTIMER_SUPPORTED=y -CONFIG_SOC_SDMMC_HOST_SUPPORTED=y -CONFIG_SOC_BT_SUPPORTED=y -CONFIG_SOC_PCNT_SUPPORTED=y -CONFIG_SOC_PHY_SUPPORTED=y -CONFIG_SOC_WIFI_SUPPORTED=y -CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y -CONFIG_SOC_TWAI_SUPPORTED=y -CONFIG_SOC_EFUSE_SUPPORTED=y -CONFIG_SOC_EMAC_SUPPORTED=y -CONFIG_SOC_ULP_SUPPORTED=y -CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y -CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y -CONFIG_SOC_RTC_MEM_SUPPORTED=y -CONFIG_SOC_I2S_SUPPORTED=y -CONFIG_SOC_RMT_SUPPORTED=y -CONFIG_SOC_SDM_SUPPORTED=y -CONFIG_SOC_GPSPI_SUPPORTED=y -CONFIG_SOC_LEDC_SUPPORTED=y -CONFIG_SOC_I2C_SUPPORTED=y -CONFIG_SOC_SUPPORT_COEXISTENCE=y -CONFIG_SOC_AES_SUPPORTED=y -CONFIG_SOC_MPI_SUPPORTED=y -CONFIG_SOC_SHA_SUPPORTED=y -CONFIG_SOC_FLASH_ENC_SUPPORTED=y -CONFIG_SOC_SECURE_BOOT_SUPPORTED=y -CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y -CONFIG_SOC_BOD_SUPPORTED=y -CONFIG_SOC_ULP_FSM_SUPPORTED=y -CONFIG_SOC_CLK_TREE_SUPPORTED=y -CONFIG_SOC_MPU_SUPPORTED=y -CONFIG_SOC_WDT_SUPPORTED=y -CONFIG_SOC_SPI_FLASH_SUPPORTED=y -CONFIG_SOC_RNG_SUPPORTED=y -CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y -CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y -CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y -CONFIG_SOC_PM_SUPPORTED=y -CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 -CONFIG_SOC_XTAL_SUPPORT_26M=y -CONFIG_SOC_XTAL_SUPPORT_40M=y -CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y -CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_DMA_SUPPORTED=y -CONFIG_SOC_ADC_PERIPH_NUM=2 -CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 -CONFIG_SOC_ADC_ATTEN_NUM=4 -CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 -CONFIG_SOC_ADC_PATT_LEN_MAX=16 -CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 -CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 -CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 -CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 -CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 -CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_SHARED_POWER=y -CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y -CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y -CONFIG_SOC_IDCACHE_PER_CORE=y -CONFIG_SOC_CPU_CORES_NUM=2 -CONFIG_SOC_CPU_INTR_NUM=32 -CONFIG_SOC_CPU_HAS_FPU=y -CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y -CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 -CONFIG_SOC_DAC_CHAN_NUM=2 -CONFIG_SOC_DAC_RESOLUTION=8 -CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y -CONFIG_SOC_GPIO_PORT=1 -CONFIG_SOC_GPIO_PIN_COUNT=40 -CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF -CONFIG_SOC_GPIO_IN_RANGE_MAX=39 -CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 -CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA -CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y -CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 -CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y -CONFIG_SOC_I2C_NUM=2 -CONFIG_SOC_HP_I2C_NUM=2 -CONFIG_SOC_I2C_FIFO_LEN=32 -CONFIG_SOC_I2C_CMD_REG_NUM=16 -CONFIG_SOC_I2C_SUPPORT_SLAVE=y -CONFIG_SOC_I2C_SUPPORT_APB=y -CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y -CONFIG_SOC_I2C_STOP_INDEPENDENT=y -CONFIG_SOC_I2S_NUM=2 -CONFIG_SOC_I2S_HW_VERSION_1=y -CONFIG_SOC_I2S_SUPPORTS_APLL=y -CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y -CONFIG_SOC_I2S_SUPPORTS_PDM=y -CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y -CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y -CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y -CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y -CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 -CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 -CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y -CONFIG_SOC_I2S_SUPPORTS_ADC=y -CONFIG_SOC_I2S_SUPPORTS_DAC=y -CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y -CONFIG_SOC_I2S_MAX_DATA_WIDTH=24 -CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y -CONFIG_SOC_I2S_LCD_I80_VARIANT=y -CONFIG_SOC_LCD_I80_SUPPORTED=y -CONFIG_SOC_LCD_I80_BUSES=2 -CONFIG_SOC_LCD_I80_BUS_WIDTH=24 -CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y -CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y -CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y -CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y -CONFIG_SOC_LEDC_TIMER_NUM=4 -CONFIG_SOC_LEDC_CHANNEL_NUM=8 -CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 -CONFIG_SOC_MCPWM_GROUPS=2 -CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 -CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 -CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 -CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y -CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 -CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 -CONFIG_SOC_MMU_PERIPH_NUM=2 -CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 -CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 -CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 -CONFIG_SOC_PCNT_GROUPS=1 -CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 -CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 -CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 -CONFIG_SOC_RMT_GROUPS=1 -CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 -CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 -CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 -CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 -CONFIG_SOC_RMT_SUPPORT_REF_TICK=y -CONFIG_SOC_RMT_SUPPORT_APB=y -CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y -CONFIG_SOC_RTCIO_PIN_COUNT=18 -CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y -CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y -CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y -CONFIG_SOC_SDM_GROUPS=1 -CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 -CONFIG_SOC_SDM_CLK_SUPPORT_APB=y -CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y -CONFIG_SOC_SPI_AS_CS_SUPPORTED=y -CONFIG_SOC_SPI_PERIPH_NUM=3 -CONFIG_SOC_SPI_DMA_CHAN_NUM=2 -CONFIG_SOC_SPI_MAX_CS_NUM=3 -CONFIG_SOC_SPI_SUPPORT_CLK_APB=y -CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 -CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 -CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y -CONFIG_SOC_TIMER_GROUPS=2 -CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 -CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 -CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 -CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y -CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 -CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 -CONFIG_SOC_TOUCH_SENSOR_VERSION=1 -CONFIG_SOC_TOUCH_SENSOR_NUM=10 -CONFIG_SOC_TOUCH_MIN_CHAN_ID=0 -CONFIG_SOC_TOUCH_MAX_CHAN_ID=9 -CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y -CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 -CONFIG_SOC_TWAI_CONTROLLER_NUM=1 -CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 -CONFIG_SOC_TWAI_BRP_MIN=2 -CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y -CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y -CONFIG_SOC_UART_NUM=3 -CONFIG_SOC_UART_HP_NUM=3 -CONFIG_SOC_UART_SUPPORT_APB_CLK=y -CONFIG_SOC_UART_SUPPORT_REF_TICK=y -CONFIG_SOC_UART_FIFO_LEN=128 -CONFIG_SOC_UART_BITRATE_MAX=5000000 -CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y -CONFIG_SOC_SPIRAM_SUPPORTED=y -CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y -CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y -CONFIG_SOC_SHA_ENDIANNESS_BE=y -CONFIG_SOC_SHA_SUPPORT_SHA1=y -CONFIG_SOC_SHA_SUPPORT_SHA256=y -CONFIG_SOC_SHA_SUPPORT_SHA384=y -CONFIG_SOC_SHA_SUPPORT_SHA512=y -CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 -CONFIG_SOC_MPI_OPERATIONS_NUM=1 -CONFIG_SOC_RSA_MAX_BIT_LEN=4096 -CONFIG_SOC_AES_SUPPORT_AES_128=y -CONFIG_SOC_AES_SUPPORT_AES_192=y -CONFIG_SOC_AES_SUPPORT_AES_256=y -CONFIG_SOC_SECURE_BOOT_V1=y -CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=1 -CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 -CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 -CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y -CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y -CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y -CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y -CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y -CONFIG_SOC_PM_SUPPORT_MODEM_PD=y -CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y -CONFIG_SOC_PM_MODEM_PD_BY_SW=y -CONFIG_SOC_CLK_APLL_SUPPORTED=y -CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y -CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y -CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y -CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D4=y -CONFIG_SOC_SDMMC_USE_IOMUX=y -CONFIG_SOC_SDMMC_NUM_SLOTS=2 -CONFIG_SOC_WIFI_WAPI_SUPPORT=y -CONFIG_SOC_WIFI_CSI_SUPPORT=y -CONFIG_SOC_WIFI_MESH_SUPPORT=y -CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y -CONFIG_SOC_WIFI_NAN_SUPPORT=y -CONFIG_SOC_BLE_SUPPORTED=y -CONFIG_SOC_BLE_MESH_SUPPORTED=y -CONFIG_SOC_BT_CLASSIC_SUPPORTED=y -CONFIG_SOC_BLUFI_SUPPORTED=y -CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y -CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y -CONFIG_SOC_ULP_HAS_ADC=y -CONFIG_SOC_PHY_COMBO_MODULE=y -CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y -CONFIG_IDF_CMAKE=y -CONFIG_IDF_TOOLCHAIN="gcc" -CONFIG_IDF_TOOLCHAIN_GCC=y -CONFIG_IDF_TARGET_ARCH_XTENSA=y -CONFIG_IDF_TARGET_ARCH="xtensa" -CONFIG_IDF_TARGET="esp32" -CONFIG_IDF_INIT_VERSION="5.5.1" -CONFIG_IDF_TARGET_ESP32=y -CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 - -# -# Build type -# -CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_RAM is not set -CONFIG_APP_BUILD_GENERATE_BINARIES=y -CONFIG_APP_BUILD_BOOTLOADER=y -CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y -CONFIG_APP_REPRODUCIBLE_BUILD=y -# CONFIG_APP_NO_BLOBS is not set -# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set -# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set -# end of Build type - -# -# Bootloader config -# - -# -# Bootloader manager -# -CONFIG_BOOTLOADER_PROJECT_VER=1 -# end of Bootloader manager - -# -# Application Rollback -# -# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set -# end of Application Rollback - -# -# Recovery Bootloader and Rollback -# -# end of Recovery Bootloader and Rollback - -CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 -CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set - -# -# Log -# -CONFIG_BOOTLOADER_LOG_VERSION_2=y -CONFIG_BOOTLOADER_LOG_VERSION=2 -# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set -CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y -# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set -CONFIG_BOOTLOADER_LOG_LEVEL=3 - -# -# Format -# -# CONFIG_BOOTLOADER_LOG_COLORS is not set -# CONFIG_BOOTLOADER_LOG_COLORS_SUPPORT is not set -# CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_NONE is not set -CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y -CONFIG_BOOTLOADER_LOG_TIMESTAMP_SUPPORT=y -# end of Format - -# -# Settings -# -CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y -CONFIG_BOOTLOADER_LOG_MODE_TEXT=y -# CONFIG_BOOTLOADER_LOG_MODE_BINARY is not set -# end of Settings -# end of Log - -# -# Serial Flash Configurations -# -# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y -# end of Serial Flash Configurations - -# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set -CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y -# CONFIG_BOOTLOADER_FACTORY_RESET is not set -# CONFIG_BOOTLOADER_APP_TEST is not set -CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y -CONFIG_BOOTLOADER_WDT_ENABLE=y -# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set -CONFIG_BOOTLOADER_WDT_TIME_MS=9000 -# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set -# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set -# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set -CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 -# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -# end of Bootloader config - -# -# Security features -# -CONFIG_SECURE_BOOT_V1_SUPPORTED=y -# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set -# CONFIG_SECURE_BOOT is not set -# CONFIG_SECURE_FLASH_ENC_ENABLED is not set -# end of Security features - -# -# Application manager -# -# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set -# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set -CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 -# end of Application manager - -CONFIG_ESP_ROM_HAS_CRC_LE=y -CONFIG_ESP_ROM_HAS_CRC_BE=y -CONFIG_ESP_ROM_HAS_MZ_CRC32=y -CONFIG_ESP_ROM_HAS_JPEG_DECODE=y -CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y -CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y -CONFIG_ESP_ROM_HAS_NEWLIB=y -CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y -CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y -CONFIG_ESP_ROM_HAS_SW_FLOAT=y -CONFIG_ESP_ROM_USB_OTG_NUM=-1 -CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 -CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y -CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y - -# -# Serial flasher config -# -# CONFIG_ESPTOOLPY_NO_STUB is not set -# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set -# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set -CONFIG_ESPTOOLPY_FLASHMODE_DIO=y -# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set -CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y -CONFIG_ESPTOOLPY_FLASHMODE="dio" -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_40M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -CONFIG_ESPTOOLPY_FLASHFREQ="40m" -# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y -# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE="4MB" -CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE=y -CONFIG_ESPTOOLPY_BEFORE_RESET=y -# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set -CONFIG_ESPTOOLPY_BEFORE="default_reset" -CONFIG_ESPTOOLPY_AFTER_RESET=y -# CONFIG_ESPTOOLPY_AFTER_NORESET is not set -CONFIG_ESPTOOLPY_AFTER="hard_reset" -CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 -# end of Serial flasher config - -# -# Partition Table -# -# CONFIG_PARTITION_TABLE_SINGLE_APP is not set -# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set -# CONFIG_PARTITION_TABLE_TWO_OTA is not set -# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set -CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_OFFSET=0x8000 -CONFIG_PARTITION_TABLE_MD5=y -# end of Partition Table - -# -# Compiler options -# -CONFIG_COMPILER_OPTIMIZATION_DEBUG=y -# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set -# CONFIG_COMPILER_OPTIMIZATION_PERF is not set -# CONFIG_COMPILER_OPTIMIZATION_NONE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set -CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y -CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 -# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set -CONFIG_COMPILER_HIDE_PATHS_MACROS=y -CONFIG_COMPILER_CXX_EXCEPTIONS=y -CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 -CONFIG_COMPILER_CXX_RTTI=y -CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y -# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set -# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set -# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set -# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set -# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set -CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y -# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set -# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set -# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set -# CONFIG_COMPILER_DUMP_RTL_FILES is not set -CONFIG_COMPILER_RT_LIB_GCCLIB=y -CONFIG_COMPILER_RT_LIB_NAME="gcc" -CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y -# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set -# CONFIG_COMPILER_STATIC_ANALYZER is not set -# end of Compiler options - -# -# Component config -# - -# -# Application Level Tracing -# -# CONFIG_APPTRACE_DEST_JTAG is not set -CONFIG_APPTRACE_DEST_NONE=y -# CONFIG_APPTRACE_DEST_UART1 is not set -# CONFIG_APPTRACE_DEST_UART2 is not set -CONFIG_APPTRACE_DEST_UART_NONE=y -CONFIG_APPTRACE_UART_TASK_PRIO=1 -CONFIG_APPTRACE_LOCK_ENABLE=y -# end of Application Level Tracing - -# -# Bluetooth -# -# CONFIG_BT_ENABLED is not set - -# -# Common Options -# - -# -# BLE Log -# -# CONFIG_BLE_LOG_ENABLED is not set -# end of BLE Log - -# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set -# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set -# end of Common Options -# end of Bluetooth - -# -# Console Library -# -# CONFIG_CONSOLE_SORTED_HELP is not set -# end of Console Library - -# -# Driver Configurations -# - -# -# Legacy TWAI Driver Configurations -# -# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set -CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y -CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y -CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y -CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y -CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y -# end of Legacy TWAI Driver Configurations - -# -# Legacy ADC Driver Configuration -# -CONFIG_ADC_DISABLE_DAC=y -# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set - -# -# Legacy ADC Calibration Configuration -# -CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y -CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y -CONFIG_ADC_CAL_LUT_ENABLE=y -# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy ADC Calibration Configuration -# end of Legacy ADC Driver Configuration - -# -# Legacy DAC Driver Configurations -# -# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy DAC Driver Configurations - -# -# Legacy MCPWM Driver Configurations -# -# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy MCPWM Driver Configurations - -# -# Legacy Timer Group Driver Configurations -# -# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy Timer Group Driver Configurations - -# -# Legacy RMT Driver Configurations -# -# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy RMT Driver Configurations - -# -# Legacy I2S Driver Configurations -# -# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy I2S Driver Configurations - -# -# Legacy I2C Driver Configurations -# -# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy I2C Driver Configurations - -# -# Legacy PCNT Driver Configurations -# -# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy PCNT Driver Configurations - -# -# Legacy SDM Driver Configurations -# -# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy SDM Driver Configurations - -# -# Legacy Touch Sensor Driver Configurations -# -# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set -# end of Legacy Touch Sensor Driver Configurations -# end of Driver Configurations - -# -# eFuse Bit Manager -# -# CONFIG_EFUSE_CUSTOM_TABLE is not set -# CONFIG_EFUSE_VIRTUAL is not set -# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set -CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y -# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set -CONFIG_EFUSE_MAX_BLK_LEN=192 -# end of eFuse Bit Manager - -# -# ESP-TLS -# -CONFIG_ESP_TLS_USING_MBEDTLS=y -# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set -# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set -# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set -# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set -# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set -# CONFIG_ESP_TLS_PSK_VERIFICATION is not set -# CONFIG_ESP_TLS_INSECURE is not set -CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y -# end of ESP-TLS - -# -# ADC and ADC Calibration -# -# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set - -# -# ADC Calibration Configurations -# -CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y -CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y -CONFIG_ADC_CALI_LUT_ENABLE=y -# end of ADC Calibration Configurations - -CONFIG_ADC_DISABLE_DAC_OUTPUT=y -# CONFIG_ADC_ENABLE_DEBUG_LOG is not set -# end of ADC and ADC Calibration - -# -# Wireless Coexistence -# -CONFIG_ESP_COEX_ENABLED=y -# CONFIG_ESP_COEX_GPIO_DEBUG is not set -# end of Wireless Coexistence - -# -# Common ESP-related -# -CONFIG_ESP_ERR_TO_NAME_LOOKUP=y -# end of Common ESP-related - -# -# ESP-Driver:DAC Configurations -# -# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set -# CONFIG_DAC_ISR_IRAM_SAFE is not set -# CONFIG_DAC_ENABLE_DEBUG_LOG is not set -CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y -# end of ESP-Driver:DAC Configurations - -# -# ESP-Driver:GPIO Configurations -# -# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set -# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set -# end of ESP-Driver:GPIO Configurations - -# -# ESP-Driver:GPTimer Configurations -# -CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y -# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set -CONFIG_GPTIMER_OBJ_CACHE_SAFE=y -# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:GPTimer Configurations - -# -# ESP-Driver:I2C Configurations -# -# CONFIG_I2C_ISR_IRAM_SAFE is not set -# CONFIG_I2C_ENABLE_DEBUG_LOG is not set -# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set -CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y -# end of ESP-Driver:I2C Configurations - -# -# ESP-Driver:I2S Configurations -# -# CONFIG_I2S_ISR_IRAM_SAFE is not set -# CONFIG_I2S_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:I2S Configurations - -# -# ESP-Driver:LEDC Configurations -# -# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set -# end of ESP-Driver:LEDC Configurations - -# -# ESP-Driver:MCPWM Configurations -# -CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y -# CONFIG_MCPWM_ISR_CACHE_SAFE is not set -# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set -CONFIG_MCPWM_OBJ_CACHE_SAFE=y -# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:MCPWM Configurations - -# -# ESP-Driver:PCNT Configurations -# -# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_PCNT_ISR_IRAM_SAFE is not set -# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:PCNT Configurations - -# -# ESP-Driver:RMT Configurations -# -CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y -CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y -CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y -# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set -# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set -# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set -CONFIG_RMT_OBJ_CACHE_SAFE=y -# CONFIG_RMT_ENABLE_DEBUG_LOG is not set -# CONFIG_RMT_ISR_IRAM_SAFE is not set -# end of ESP-Driver:RMT Configurations - -# -# ESP-Driver:Sigma Delta Modulator Configurations -# -# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_SDM_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:Sigma Delta Modulator Configurations - -# -# ESP-Driver:SPI Configurations -# -# CONFIG_SPI_MASTER_IN_IRAM is not set -CONFIG_SPI_MASTER_ISR_IN_IRAM=y -# CONFIG_SPI_SLAVE_IN_IRAM is not set -CONFIG_SPI_SLAVE_ISR_IN_IRAM=y -# end of ESP-Driver:SPI Configurations - -# -# ESP-Driver:Touch Sensor Configurations -# -# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set -# CONFIG_TOUCH_ISR_IRAM_SAFE is not set -# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set -# CONFIG_TOUCH_SKIP_FSM_CHECK is not set -# end of ESP-Driver:Touch Sensor Configurations - -# -# ESP-Driver:TWAI Configurations -# -# CONFIG_TWAI_ISR_IN_IRAM is not set -# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set -# CONFIG_TWAI_ISR_CACHE_SAFE is not set -# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:TWAI Configurations - -# -# ESP-Driver:UART Configurations -# -# CONFIG_UART_ISR_IN_IRAM is not set -# end of ESP-Driver:UART Configurations - -# -# ESP-Driver:UHCI Configurations -# -# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set -# CONFIG_UHCI_ISR_CACHE_SAFE is not set -# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:UHCI Configurations - -# -# Ethernet -# -CONFIG_ETH_ENABLED=y -CONFIG_ETH_USE_ESP32_EMAC=y -CONFIG_ETH_PHY_INTERFACE_RMII=y -CONFIG_ETH_RMII_CLK_INPUT=y -# CONFIG_ETH_RMII_CLK_OUTPUT is not set -CONFIG_ETH_RMII_CLK_IN_GPIO=0 -CONFIG_ETH_DMA_BUFFER_SIZE=512 -CONFIG_ETH_DMA_RX_BUFFER_NUM=10 -CONFIG_ETH_DMA_TX_BUFFER_NUM=10 -# CONFIG_ETH_IRAM_OPTIMIZATION is not set -CONFIG_ETH_USE_SPI_ETHERNET=y -# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set -# CONFIG_ETH_SPI_ETHERNET_W5500 is not set -# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set -# CONFIG_ETH_USE_OPENETH is not set -# CONFIG_ETH_TRANSMIT_MUTEX is not set -# end of Ethernet - -# -# Event Loop Library -# -# CONFIG_ESP_EVENT_LOOP_PROFILING is not set -CONFIG_ESP_EVENT_POST_FROM_ISR=y -CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y -# end of Event Loop Library - -# -# GDB Stub -# -CONFIG_ESP_GDBSTUB_ENABLED=y -# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set -CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y -CONFIG_ESP_GDBSTUB_MAX_TASKS=32 -# end of GDB Stub - -# -# ESP HID -# -CONFIG_ESPHID_TASK_SIZE_BT=2048 -CONFIG_ESPHID_TASK_SIZE_BLE=4096 -# end of ESP HID - -# -# ESP HTTP client -# -CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y -# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set -# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set -CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 -# end of ESP HTTP client - -# -# HTTP Server -# -CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 -CONFIG_HTTPD_MAX_URI_LEN=512 -CONFIG_HTTPD_ERR_RESP_NO_DELAY=y -CONFIG_HTTPD_PURGE_BUF_LEN=32 -# CONFIG_HTTPD_LOG_PURGE_DATA is not set -CONFIG_HTTPD_WS_SUPPORT=y -# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set -CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 -# CONFIG_HTTPD_WS_PRE_HANDSHAKE_CB_SUPPORT is not set -# end of HTTP Server - -# -# ESP HTTPS OTA -# -# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set -# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set -CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 -# end of ESP HTTPS OTA - -# -# ESP HTTPS server -# -# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set -CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 -# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set -# end of ESP HTTPS server - -# -# Hardware Settings -# - -# -# Chip revision -# -CONFIG_ESP32_REV_MIN_0=y -# CONFIG_ESP32_REV_MIN_1 is not set -# CONFIG_ESP32_REV_MIN_1_1 is not set -# CONFIG_ESP32_REV_MIN_2 is not set -# CONFIG_ESP32_REV_MIN_3 is not set -# CONFIG_ESP32_REV_MIN_3_1 is not set -CONFIG_ESP32_REV_MIN=0 -CONFIG_ESP32_REV_MIN_FULL=0 -CONFIG_ESP_REV_MIN_FULL=0 - -# -# Maximum Supported ESP32 Revision (Rev v3.99) -# -CONFIG_ESP32_REV_MAX_FULL=399 -CONFIG_ESP_REV_MAX_FULL=399 -CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 -CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 - -# -# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) -# -# end of Chip revision - -# -# MAC Config -# -CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y -CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y -CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 -# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set -CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y -CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 -# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set -# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set -# end of MAC Config - -# -# Sleep Config -# -# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set -CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y -# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set -CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y -# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set -CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 -# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set -# CONFIG_ESP_SLEEP_DEBUG is not set -CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y -# end of Sleep Config - -# -# RTC Clock Config -# -CONFIG_RTC_CLK_SRC_INT_RC=y -# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set -CONFIG_RTC_CLK_CAL_CYCLES=1024 -# end of RTC Clock Config - -# -# Peripheral Control -# -CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y -CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y -# end of Peripheral Control - -# -# Main XTAL Config -# -# CONFIG_XTAL_FREQ_26 is not set -# CONFIG_XTAL_FREQ_32 is not set -CONFIG_XTAL_FREQ_40=y -# CONFIG_XTAL_FREQ_AUTO is not set -CONFIG_XTAL_FREQ=40 -# end of Main XTAL Config - -# -# Power Supplier -# - -# -# Brownout Detector -# -CONFIG_ESP_BROWNOUT_DET=y -CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_ESP_BROWNOUT_DET_LVL=0 -CONFIG_ESP_BROWNOUT_USE_INTR=y -# end of Brownout Detector -# end of Power Supplier - -CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y -CONFIG_ESP_INTR_IN_IRAM=y -# end of Hardware Settings - -# -# ESP-Driver:LCD Controller Configurations -# -# CONFIG_LCD_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:LCD Controller Configurations - -# -# ESP-MM: Memory Management Configurations -# -# end of ESP-MM: Memory Management Configurations - -# -# ESP NETIF Adapter -# -CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 -# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set -CONFIG_ESP_NETIF_TCPIP_LWIP=y -# CONFIG_ESP_NETIF_LOOPBACK is not set -CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y -CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y -# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set -# CONFIG_ESP_NETIF_L2_TAP is not set -# CONFIG_ESP_NETIF_BRIDGE_EN is not set -# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set -# end of ESP NETIF Adapter - -# -# Partition API Configuration -# -# end of Partition API Configuration - -# -# PHY -# -CONFIG_ESP_PHY_ENABLED=y -CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y -# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set -CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP_PHY_MAX_TX_POWER=20 -# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set -# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set -CONFIG_ESP_PHY_RF_CAL_PARTIAL=y -# CONFIG_ESP_PHY_RF_CAL_NONE is not set -# CONFIG_ESP_PHY_RF_CAL_FULL is not set -CONFIG_ESP_PHY_CALIBRATION_MODE=0 -CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 -# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set -# CONFIG_ESP_PHY_RECORD_USED_TIME is not set -CONFIG_ESP_PHY_IRAM_OPT=y -# CONFIG_ESP_PHY_DEBUG is not set -# end of PHY - -# -# Power Management -# -CONFIG_PM_SLEEP_FUNC_IN_IRAM=y -# CONFIG_PM_ENABLE is not set -CONFIG_PM_SLP_IRAM_OPT=y -# end of Power Management - -# -# ESP PSRAM -# -# CONFIG_SPIRAM is not set -# end of ESP PSRAM - -# -# ESP Ringbuf -# -# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# end of ESP Ringbuf - -# -# ESP-ROM -# -CONFIG_ESP_ROM_PRINT_IN_IRAM=y -# end of ESP-ROM - -# -# ESP Security Specific -# -# end of ESP Security Specific - -# -# ESP System Settings -# -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 - -# -# Memory -# -# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set - -# -# Non-backward compatible options -# -# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set -# end of Non-backward compatible options -# end of Memory - -# -# Trace memory -# -# CONFIG_ESP32_TRAX is not set -CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 -# end of Trace memory - -CONFIG_ESP_SYSTEM_IN_IRAM=y -# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set -CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y -# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set -CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 - -# -# Memory protection -# -# end of Memory protection - -CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 -CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 -CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y -# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set -# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 -CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 -CONFIG_ESP_CONSOLE_UART_DEFAULT=y -# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set -# CONFIG_ESP_CONSOLE_NONE is not set -CONFIG_ESP_CONSOLE_UART=y -CONFIG_ESP_CONSOLE_UART_NUM=0 -CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 -CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 -CONFIG_ESP_INT_WDT=y -CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 -CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT_EN=y -CONFIG_ESP_TASK_WDT_INIT=y -# CONFIG_ESP_TASK_WDT_PANIC is not set -CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y -# CONFIG_ESP_PANIC_HANDLER_IRAM is not set -# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP_DEBUG_OCDAWARE=y -CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5=y -# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4 is not set -# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set -# end of ESP System Settings - -# -# IPC (Inter-Processor Call) -# -CONFIG_ESP_IPC_ENABLE=y -CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 -CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y -CONFIG_ESP_IPC_ISR_ENABLE=y -# end of IPC (Inter-Processor Call) - -# -# ESP Timer (High Resolution Timer) -# -CONFIG_ESP_TIMER_IN_IRAM=y -# CONFIG_ESP_TIMER_PROFILING is not set -CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y -CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y -CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 -CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 -# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set -CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 -CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y -CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y -# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set -CONFIG_ESP_TIMER_IMPL_TG0_LAC=y -# end of ESP Timer (High Resolution Timer) - -# -# Wi-Fi -# -CONFIG_ESP_WIFI_ENABLED=y -CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set -CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y -# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set -CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 -CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 -# CONFIG_ESP_WIFI_CSI_ENABLED is not set -CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP_WIFI_TX_BA_WIN=6 -CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP_WIFI_RX_BA_WIN=6 -CONFIG_ESP_WIFI_NVS_ENABLED=y -CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP_WIFI_IRAM_OPT=y -# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set -CONFIG_ESP_WIFI_RX_IRAM_OPT=y -CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP_WIFI_ENABLE_SAE_PK=y -CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y -CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y -CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y -# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set -CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 -# CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT is not set -CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 -CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 -CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y -CONFIG_ESP_WIFI_GMAC_SUPPORT=y -CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y -# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set -CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 -# CONFIG_ESP_WIFI_NAN_ENABLE is not set -CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y -CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y -# CONFIG_ESP_WIFI_WAPI_PSK is not set -# CONFIG_ESP_WIFI_11KV_SUPPORT is not set -# CONFIG_ESP_WIFI_MBO_SUPPORT is not set -# CONFIG_ESP_WIFI_DPP_SUPPORT is not set -# CONFIG_ESP_WIFI_11R_SUPPORT is not set -# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set - -# -# WPS Configuration Options -# -# CONFIG_ESP_WIFI_WPS_STRICT is not set -# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set -# end of WPS Configuration Options - -# CONFIG_ESP_WIFI_DEBUG_PRINT is not set -# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set -CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y -# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set -# end of Wi-Fi - -# -# Core dump -# -# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set -CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y -# CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set -# CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set -CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y -CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y -# CONFIG_ESP_COREDUMP_CHECKSUM_SHA256 is not set -# CONFIG_ESP_COREDUMP_CAPTURE_DRAM is not set -CONFIG_ESP_COREDUMP_ENABLE=y -CONFIG_ESP_COREDUMP_LOGS=y -CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 -CONFIG_ESP_COREDUMP_UART_DELAY=0 -CONFIG_ESP_COREDUMP_STACK_SIZE=0 -CONFIG_ESP_COREDUMP_DECODE_INFO=y -# CONFIG_ESP_COREDUMP_DECODE_DISABLE is not set -CONFIG_ESP_COREDUMP_DECODE="info" -# end of Core dump - -# -# FAT Filesystem support -# -CONFIG_FATFS_VOLUME_COUNT=2 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set -# CONFIG_FATFS_SECTOR_512 is not set -CONFIG_FATFS_SECTOR_4096=y -# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set -CONFIG_FATFS_CODEPAGE_437=y -# CONFIG_FATFS_CODEPAGE_720 is not set -# CONFIG_FATFS_CODEPAGE_737 is not set -# CONFIG_FATFS_CODEPAGE_771 is not set -# CONFIG_FATFS_CODEPAGE_775 is not set -# CONFIG_FATFS_CODEPAGE_850 is not set -# CONFIG_FATFS_CODEPAGE_852 is not set -# CONFIG_FATFS_CODEPAGE_855 is not set -# CONFIG_FATFS_CODEPAGE_857 is not set -# CONFIG_FATFS_CODEPAGE_860 is not set -# CONFIG_FATFS_CODEPAGE_861 is not set -# CONFIG_FATFS_CODEPAGE_862 is not set -# CONFIG_FATFS_CODEPAGE_863 is not set -# CONFIG_FATFS_CODEPAGE_864 is not set -# CONFIG_FATFS_CODEPAGE_865 is not set -# CONFIG_FATFS_CODEPAGE_866 is not set -# CONFIG_FATFS_CODEPAGE_869 is not set -# CONFIG_FATFS_CODEPAGE_932 is not set -# CONFIG_FATFS_CODEPAGE_936 is not set -# CONFIG_FATFS_CODEPAGE_949 is not set -# CONFIG_FATFS_CODEPAGE_950 is not set -CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_FS_LOCK=0 -CONFIG_FATFS_TIMEOUT_MS=10000 -CONFIG_FATFS_PER_FILE_CACHE=y -# CONFIG_FATFS_USE_FASTSEEK is not set -CONFIG_FATFS_USE_STRFUNC_NONE=y -# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set -# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set -CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 -# CONFIG_FATFS_IMMEDIATE_FSYNC is not set -# CONFIG_FATFS_USE_LABEL is not set -CONFIG_FATFS_LINK_LOCK=y -# CONFIG_FATFS_USE_DYN_BUFFERS is not set - -# -# File system free space calculation behavior -# -CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 -CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 -# end of File system free space calculation behavior -# end of FAT Filesystem support - -# -# FreeRTOS -# - -# -# Kernel -# -# CONFIG_FREERTOS_SMP is not set -# CONFIG_FREERTOS_UNICORE is not set -CONFIG_FREERTOS_HZ=100 -# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set -# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set -CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y -CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 -CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 -# CONFIG_FREERTOS_USE_IDLE_HOOK is not set -# CONFIG_FREERTOS_USE_TICK_HOOK is not set -CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set -CONFIG_FREERTOS_USE_TIMERS=y -CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" -# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set -# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set -CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y -CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 -CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 -CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 -CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 -# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set -# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set -# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set -# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set -# end of Kernel - -# -# Port -# -CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y -# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set -CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y -# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set -# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set -CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y -CONFIG_FREERTOS_ISR_STACKSIZE=2096 -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y -# CONFIG_FREERTOS_FPU_IN_ISR is not set -CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y -CONFIG_FREERTOS_CORETIMER_0=y -# CONFIG_FREERTOS_CORETIMER_1 is not set -CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y -# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -# end of Port - -# -# Extra -# -# end of Extra - -CONFIG_FREERTOS_PORT=y -CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y -CONFIG_FREERTOS_DEBUG_OCDAWARE=y -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y -CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y -CONFIG_FREERTOS_NUMBER_OF_CORES=2 -CONFIG_FREERTOS_IN_IRAM=y -# end of FreeRTOS - -# -# Hardware Abstraction Layer (HAL) and Low Level (LL) -# -CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y -# CONFIG_HAL_ASSERTION_DISABLE is not set -# CONFIG_HAL_ASSERTION_SILENT is not set -# CONFIG_HAL_ASSERTION_ENABLE is not set -CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 -# end of Hardware Abstraction Layer (HAL) and Low Level (LL) - -# -# Heap memory debugging -# -CONFIG_HEAP_POISONING_DISABLED=y -# CONFIG_HEAP_POISONING_LIGHT is not set -# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set -CONFIG_HEAP_TRACING_OFF=y -# CONFIG_HEAP_TRACING_STANDALONE is not set -# CONFIG_HEAP_TRACING_TOHOST is not set -# CONFIG_HEAP_USE_HOOKS is not set -# CONFIG_HEAP_TASK_TRACKING is not set -# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set -# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set -# end of Heap memory debugging - -# -# Log -# -# CONFIG_LOG_VERSION_1 is not set -CONFIG_LOG_VERSION_2=y -CONFIG_LOG_VERSION=2 - -# -# Log Level -# -# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set -# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set -# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -CONFIG_LOG_DEFAULT_LEVEL_INFO=y -# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set -# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=3 -CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y -# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set -# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set -CONFIG_LOG_MAXIMUM_LEVEL=3 - -# -# Level Settings -# -# CONFIG_LOG_MASTER_LEVEL is not set -CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y -# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set -# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set -CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y -# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set -CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y -CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 -# end of Level Settings -# end of Log Level - -# -# Format -# -CONFIG_LOG_COLORS=y -CONFIG_LOG_COLORS_SUPPORT=y -# CONFIG_LOG_TIMESTAMP_SOURCE_NONE is not set -# CONFIG_LOG_TIMESTAMP_SOURCE_RTOS is not set -CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM=y -# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM_FULL is not set -# CONFIG_LOG_TIMESTAMP_SOURCE_UNIX is not set -CONFIG_LOG_TIMESTAMP_SUPPORT=y -# end of Format - -# -# Settings -# -CONFIG_LOG_MODE_TEXT_EN=y -CONFIG_LOG_MODE_TEXT=y -# CONFIG_LOG_MODE_BINARY is not set -# end of Settings - -CONFIG_LOG_IN_IRAM=y -# end of Log - -# -# LWIP -# -CONFIG_LWIP_ENABLE=y -CONFIG_LWIP_LOCAL_HOSTNAME="espressif" -CONFIG_LWIP_TCPIP_TASK_PRIO=18 -# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set -# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set -CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y -# CONFIG_LWIP_L2_TO_L3_COPY is not set -# CONFIG_LWIP_IRAM_OPTIMIZATION is not set -# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set -CONFIG_LWIP_TIMERS_ONDEMAND=y -CONFIG_LWIP_ND6=y -# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set -CONFIG_LWIP_MAX_SOCKETS=10 -# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set -# CONFIG_LWIP_SO_LINGER is not set -CONFIG_LWIP_SO_REUSE=y -CONFIG_LWIP_SO_REUSE_RXTOALL=y -# CONFIG_LWIP_SO_RCVBUF is not set -# CONFIG_LWIP_NETBUF_RECVINFO is not set -CONFIG_LWIP_IP_DEFAULT_TTL=64 -CONFIG_LWIP_IP4_FRAG=y -CONFIG_LWIP_IP6_FRAG=y -# CONFIG_LWIP_IP4_REASSEMBLY is not set -# CONFIG_LWIP_IP6_REASSEMBLY is not set -CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 -# CONFIG_LWIP_IP_FORWARD is not set -# CONFIG_LWIP_STATS is not set -CONFIG_LWIP_ESP_GRATUITOUS_ARP=y -CONFIG_LWIP_GARP_TMR_INTERVAL=60 -CONFIG_LWIP_ESP_MLDV6_REPORT=y -CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 -CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y -# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set -# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set -# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set -CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y -# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set -CONFIG_LWIP_DHCP_OPTIONS_LEN=69 -CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 -CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 - -# -# DHCP server -# -CONFIG_LWIP_DHCPS=y -CONFIG_LWIP_DHCPS_LEASE_UNIT=60 -CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 -CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y -CONFIG_LWIP_DHCPS_ADD_DNS=y -# end of DHCP server - -# CONFIG_LWIP_AUTOIP is not set -CONFIG_LWIP_IPV4=y -CONFIG_LWIP_IPV6=y -# CONFIG_LWIP_IPV6_AUTOCONFIG is not set -CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 -# CONFIG_LWIP_IPV6_FORWARD is not set -# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set -CONFIG_LWIP_NETIF_LOOPBACK=y -CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 - -# -# TCP -# -CONFIG_LWIP_MAX_ACTIVE_TCP=16 -CONFIG_LWIP_MAX_LISTENING_TCP=16 -CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y -CONFIG_LWIP_TCP_MAXRTX=12 -CONFIG_LWIP_TCP_SYNMAXRTX=12 -CONFIG_LWIP_TCP_MSS=1440 -CONFIG_LWIP_TCP_TMR_INTERVAL=250 -CONFIG_LWIP_TCP_MSL=60000 -CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 -CONFIG_LWIP_TCP_WND_DEFAULT=5760 -CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 -CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 -CONFIG_LWIP_TCP_QUEUE_OOSEQ=y -CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 -CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 -# CONFIG_LWIP_TCP_SACK_OUT is not set -CONFIG_LWIP_TCP_OVERSIZE_MSS=y -# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set -# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set -CONFIG_LWIP_TCP_RTO_TIME=1500 -# end of TCP - -# -# UDP -# -CONFIG_LWIP_MAX_UDP_PCBS=16 -CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 -# end of UDP - -# -# Checksums -# -# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set -# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set -CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y -# end of Checksums - -CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 -CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF -CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 -CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 -CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 -CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 -CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 -# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set -# CONFIG_LWIP_PPP_SUPPORT is not set -# CONFIG_LWIP_SLIP_SUPPORT is not set - -# -# ICMP -# -CONFIG_LWIP_ICMP=y -# CONFIG_LWIP_MULTICAST_PING is not set -# CONFIG_LWIP_BROADCAST_PING is not set -# end of ICMP - -# -# LWIP RAW API -# -CONFIG_LWIP_MAX_RAW_PCBS=16 -# end of LWIP RAW API - -# -# SNTP -# -CONFIG_LWIP_SNTP_MAX_SERVERS=1 -# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set -CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 -CONFIG_LWIP_SNTP_STARTUP_DELAY=y -CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 -# end of SNTP - -# -# DNS -# -CONFIG_LWIP_DNS_MAX_HOST_IP=1 -CONFIG_LWIP_DNS_MAX_SERVERS=3 -# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set -# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set -# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set -# end of DNS - -CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 -CONFIG_LWIP_ESP_LWIP_ASSERT=y - -# -# Hooks -# -# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set -CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y -# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y -# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set -CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y -# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set -# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y -# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set -CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y -# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set -# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set -CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y -# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set -# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set -CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y -# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set -# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set -CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y -# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set -# end of Hooks - -# CONFIG_LWIP_DEBUG is not set -# end of LWIP - -# -# mbedTLS -# -CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y -# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set -# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set -CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y -CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 -CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 -# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set -# CONFIG_MBEDTLS_DEBUG is not set - -# -# mbedTLS v3.x related -# -# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set -# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set -# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set -# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set -CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y -# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set -CONFIG_MBEDTLS_PKCS7_C=y -# end of mbedTLS v3.x related - -# -# Certificate Bundle -# -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set -# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 -# end of Certificate Bundle - -# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set -CONFIG_MBEDTLS_CMAC_C=y -CONFIG_MBEDTLS_HARDWARE_AES=y -CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y -CONFIG_MBEDTLS_HARDWARE_MPI=y -# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set -CONFIG_MBEDTLS_HARDWARE_SHA=y -CONFIG_MBEDTLS_ROM_MD5=y -# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set -# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set -CONFIG_MBEDTLS_HAVE_TIME=y -# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set -# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set -CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y -CONFIG_MBEDTLS_SHA1_C=y -CONFIG_MBEDTLS_SHA512_C=y -# CONFIG_MBEDTLS_SHA3_C is not set -CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y -# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set -# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set -# CONFIG_MBEDTLS_TLS_DISABLED is not set -CONFIG_MBEDTLS_TLS_SERVER=y -CONFIG_MBEDTLS_TLS_CLIENT=y -CONFIG_MBEDTLS_TLS_ENABLED=y - -# -# TLS Key Exchange Methods -# -# CONFIG_MBEDTLS_PSK_MODES is not set -CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y -# end of TLS Key Exchange Methods - -CONFIG_MBEDTLS_SSL_RENEGOTIATION=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y -# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set -# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set -CONFIG_MBEDTLS_SSL_ALPN=y -CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y -CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y - -# -# Symmetric Ciphers -# -CONFIG_MBEDTLS_AES_C=y -# CONFIG_MBEDTLS_CAMELLIA_C is not set -# CONFIG_MBEDTLS_DES_C is not set -# CONFIG_MBEDTLS_BLOWFISH_C is not set -# CONFIG_MBEDTLS_XTEA_C is not set -CONFIG_MBEDTLS_CCM_C=y -CONFIG_MBEDTLS_GCM_C=y -# CONFIG_MBEDTLS_NIST_KW_C is not set -# end of Symmetric Ciphers - -# CONFIG_MBEDTLS_RIPEMD160_C is not set - -# -# Certificates -# -CONFIG_MBEDTLS_PEM_PARSE_C=y -CONFIG_MBEDTLS_PEM_WRITE_C=y -CONFIG_MBEDTLS_X509_CRL_PARSE_C=y -CONFIG_MBEDTLS_X509_CSR_PARSE_C=y -# end of Certificates - -CONFIG_MBEDTLS_ECP_C=y -CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y -CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y -# CONFIG_MBEDTLS_DHM_C is not set -CONFIG_MBEDTLS_ECDH_C=y -CONFIG_MBEDTLS_ECDSA_C=y -# CONFIG_MBEDTLS_ECJPAKE_C is not set -CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y -CONFIG_MBEDTLS_ECP_NIST_OPTIM=y -# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set -# CONFIG_MBEDTLS_POLY1305_C is not set -# CONFIG_MBEDTLS_CHACHA20_C is not set -# CONFIG_MBEDTLS_HKDF_C is not set -# CONFIG_MBEDTLS_THREADING_C is not set -CONFIG_MBEDTLS_ERROR_STRINGS=y -CONFIG_MBEDTLS_FS_IO=y -# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set -# end of mbedTLS - -# -# ESP-MQTT Configurations -# -CONFIG_MQTT_PROTOCOL_311=y -# CONFIG_MQTT_PROTOCOL_5 is not set -CONFIG_MQTT_TRANSPORT_SSL=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y -# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set -# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set -# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set -# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set -# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set -# CONFIG_MQTT_CUSTOM_OUTBOX is not set -# end of ESP-MQTT Configurations - -# -# LibC -# -CONFIG_LIBC_NEWLIB=y -CONFIG_LIBC_MISC_IN_IRAM=y -CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y -CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y -# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set -# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set -# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set -# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set -CONFIG_LIBC_STDIN_LINE_ENDING_CR=y -# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set -CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y -# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set -# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set -# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set -# end of LibC - -# -# NVS -# -# CONFIG_NVS_ASSERT_ERROR_CHECK is not set -# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set -# end of NVS - -# -# OpenThread -# -# CONFIG_OPENTHREAD_ENABLED is not set - -# -# OpenThread Spinel -# -# CONFIG_OPENTHREAD_SPINEL_ONLY is not set -# end of OpenThread Spinel - -# CONFIG_OPENTHREAD_DEBUG is not set -# end of OpenThread - -# -# Protocomm -# -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y -# end of Protocomm - -# -# PThreads -# -CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 -CONFIG_PTHREAD_STACK_MIN=768 -CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y -# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set -# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set -CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 -CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" -# end of PThreads - -# -# MMU Config -# -CONFIG_MMU_PAGE_SIZE_64KB=y -CONFIG_MMU_PAGE_MODE="64KB" -CONFIG_MMU_PAGE_SIZE=0x10000 -# end of MMU Config - -# -# Main Flash configuration -# - -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - -# -# Optional and Experimental Features (READ DOCS FIRST) -# - -# -# Features here require specific hardware (READ DOCS FIRST!) -# -CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 -# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set -# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set -CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y -# end of Optional and Experimental Features (READ DOCS FIRST) -# end of Main Flash configuration - -# -# SPI Flash driver -# -# CONFIG_SPI_FLASH_VERIFY_WRITE is not set -# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set -CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y -CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y -# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set -# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set -# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set -# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set -CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y -CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 -CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 -CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 -# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set -# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set -# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set - -# -# Auto-detect flash chips -# -CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y -CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y -CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y -CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y -CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y -CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y -# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set -# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set -# end of Auto-detect flash chips - -CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y -# end of SPI Flash driver - -# -# SPIFFS Configuration -# -CONFIG_SPIFFS_MAX_PARTITIONS=3 - -# -# SPIFFS Cache Configuration -# -CONFIG_SPIFFS_CACHE=y -CONFIG_SPIFFS_CACHE_WR=y -# CONFIG_SPIFFS_CACHE_STATS is not set -# end of SPIFFS Cache Configuration - -CONFIG_SPIFFS_PAGE_CHECK=y -CONFIG_SPIFFS_GC_MAX_RUNS=10 -# CONFIG_SPIFFS_GC_STATS is not set -CONFIG_SPIFFS_PAGE_SIZE=256 -CONFIG_SPIFFS_OBJ_NAME_LEN=32 -# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set -CONFIG_SPIFFS_USE_MAGIC=y -CONFIG_SPIFFS_USE_MAGIC_LENGTH=y -CONFIG_SPIFFS_META_LENGTH=4 -CONFIG_SPIFFS_USE_MTIME=y - -# -# Debug Configuration -# -# CONFIG_SPIFFS_DBG is not set -# CONFIG_SPIFFS_API_DBG is not set -# CONFIG_SPIFFS_GC_DBG is not set -# CONFIG_SPIFFS_CACHE_DBG is not set -# CONFIG_SPIFFS_CHECK_DBG is not set -# CONFIG_SPIFFS_TEST_VISUALISATION is not set -# end of Debug Configuration -# end of SPIFFS Configuration - -# -# TCP Transport -# - -# -# Websocket -# -CONFIG_WS_TRANSPORT=y -CONFIG_WS_BUFFER_SIZE=1024 -# CONFIG_WS_DYNAMIC_BUFFER is not set -# end of Websocket -# end of TCP Transport - -# -# Ultra Low Power (ULP) Co-processor -# -# CONFIG_ULP_COPROC_ENABLED is not set - -# -# ULP Debugging Options -# -# end of ULP Debugging Options -# end of Ultra Low Power (ULP) Co-processor - -# -# Unity unit testing library -# -CONFIG_UNITY_ENABLE_FLOAT=y -CONFIG_UNITY_ENABLE_DOUBLE=y -# CONFIG_UNITY_ENABLE_64BIT is not set -# CONFIG_UNITY_ENABLE_COLOR is not set -CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y -# CONFIG_UNITY_ENABLE_FIXTURE is not set -# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set -# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set -# end of Unity unit testing library - -# -# Virtual file system -# -CONFIG_VFS_SUPPORT_IO=y -CONFIG_VFS_SUPPORT_DIR=y -CONFIG_VFS_SUPPORT_SELECT=y -CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y -# CONFIG_VFS_SELECT_IN_RAM is not set -CONFIG_VFS_SUPPORT_TERMIOS=y -CONFIG_VFS_MAX_COUNT=8 - -# -# Host File System I/O (Semihosting) -# -CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# end of Host File System I/O (Semihosting) - -CONFIG_VFS_INITIALIZE_DEV_NULL=y -# end of Virtual file system - -# -# Wear Levelling -# -# CONFIG_WL_SECTOR_SIZE_512 is not set -CONFIG_WL_SECTOR_SIZE_4096=y -CONFIG_WL_SECTOR_SIZE=4096 -# end of Wear Levelling - -# -# Wi-Fi Provisioning Manager -# -CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 -CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 -CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y -# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set -# end of Wi-Fi Provisioning Manager -# end of Component config - -# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set - -# Deprecated options for backward compatibility -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set -# CONFIG_NO_BLOBS is not set -# CONFIG_ESP32_NO_BLOBS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set -# CONFIG_APP_ROLLBACK_ENABLE is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set -CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y -# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set -CONFIG_LOG_BOOTLOADER_LEVEL=3 -# CONFIG_FLASH_ENCRYPTION_ENABLED is not set -# CONFIG_FLASHMODE_QIO is not set -# CONFIG_FLASHMODE_QOUT is not set -CONFIG_FLASHMODE_DIO=y -# CONFIG_FLASHMODE_DOUT is not set -CONFIG_MONITOR_BAUD=115200 -CONFIG_OPTIMIZATION_LEVEL_DEBUG=y -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y -# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set -CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y -# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set -# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set -CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 -CONFIG_CXX_EXCEPTIONS=y -CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE=0 -CONFIG_STACK_CHECK_NONE=y -# CONFIG_STACK_CHECK_NORM is not set -# CONFIG_STACK_CHECK_STRONG is not set -# CONFIG_STACK_CHECK_ALL is not set -# CONFIG_WARN_WRITE_STRINGS is not set -# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set -CONFIG_ESP32_APPTRACE_DEST_NONE=y -CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y -CONFIG_ADC2_DISABLE_DAC=y -# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set -# CONFIG_MCPWM_ISR_IRAM_SAFE is not set -# CONFIG_EVENT_LOOP_PROFILING is not set -CONFIG_POST_EVENTS_FROM_ISR=y -CONFIG_POST_EVENTS_FROM_IRAM_ISR=y -CONFIG_GDBSTUB_SUPPORT_TASKS=y -CONFIG_GDBSTUB_MAX_TASKS=32 -# CONFIG_OTA_ALLOW_HTTP is not set -# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set -CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y -CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 -# CONFIG_ESP_SYSTEM_PD_FLASH is not set -CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y -CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y -# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set -# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set -# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set -CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 -CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y -# CONFIG_ESP32_XTAL_FREQ_26 is not set -CONFIG_ESP32_XTAL_FREQ_40=y -# CONFIG_ESP32_XTAL_FREQ_AUTO is not set -CONFIG_ESP32_XTAL_FREQ=40 -CONFIG_BROWNOUT_DET=y -CONFIG_ESP32_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_0=y -CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_BROWNOUT_DET_LVL=0 -CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y -CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y -# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set -CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP32_PHY_MAX_TX_POWER=20 -# CONFIG_REDUCE_PHY_TX_POWER is not set -# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set -# CONFIG_SPIRAM_SUPPORT is not set -# CONFIG_ESP32_SPIRAM_SUPPORT is not set -# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set -CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y -# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set -CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 -CONFIG_TRACEMEM_RESERVE_DRAM=0x0 -# CONFIG_ESP32_PANIC_PRINT_HALT is not set -CONFIG_ESP32_PANIC_PRINT_REBOOT=y -# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP32_PANIC_GDBSTUB is not set -CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 -CONFIG_MAIN_TASK_STACK_SIZE=3584 -CONFIG_CONSOLE_UART_DEFAULT=y -# CONFIG_CONSOLE_UART_CUSTOM is not set -# CONFIG_CONSOLE_UART_NONE is not set -# CONFIG_ESP_CONSOLE_UART_NONE is not set -CONFIG_CONSOLE_UART=y -CONFIG_CONSOLE_UART_NUM=0 -CONFIG_CONSOLE_UART_BAUDRATE=115200 -CONFIG_INT_WDT=y -CONFIG_INT_WDT_TIMEOUT_MS=300 -CONFIG_INT_WDT_CHECK_CPU1=y -CONFIG_TASK_WDT=y -CONFIG_ESP_TASK_WDT=y -# CONFIG_TASK_WDT_PANIC is not set -CONFIG_TASK_WDT_TIMEOUT_S=5 -CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y -# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP32_DEBUG_OCDAWARE=y -# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set -CONFIG_IPC_TASK_STACK_SIZE=1024 -CONFIG_TIMER_TASK_STACK_SIZE=3584 -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -CONFIG_ESP32_WIFI_NVS_ENABLED=y -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP32_WIFI_IRAM_OPT=y -CONFIG_ESP32_WIFI_RX_IRAM_OPT=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y -CONFIG_WPA_MBEDTLS_CRYPTO=y -CONFIG_WPA_MBEDTLS_TLS_CLIENT=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# CONFIG_WPA_11R_SUPPORT is not set -# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set -CONFIG_ESP32_ENABLE_COREDUMP_TO_UART=y -# CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set -# CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set -CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y -CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32=y -# CONFIG_ESP32_COREDUMP_CHECKSUM_SHA256 is not set -CONFIG_ESP32_ENABLE_COREDUMP=y -CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64 -CONFIG_ESP32_CORE_DUMP_UART_DELAY=0 -CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0 -CONFIG_ESP32_CORE_DUMP_DECODE_INFO=y -# CONFIG_ESP32_CORE_DUMP_DECODE_DISABLE is not set -CONFIG_ESP32_CORE_DUMP_DECODE="info" -CONFIG_TIMER_TASK_PRIORITY=1 -CONFIG_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_TIMER_QUEUE_LENGTH=10 -# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set -# CONFIG_HAL_ASSERTION_SILIENT is not set -# CONFIG_L2_TO_L3_COPY is not set -CONFIG_ESP_GRATUITOUS_ARP=y -CONFIG_GARP_TMR_INTERVAL=60 -CONFIG_TCPIP_RECVMBOX_SIZE=32 -CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=12 -CONFIG_TCP_MSS=1440 -CONFIG_TCP_MSL=60000 -CONFIG_TCP_SND_BUF_DEFAULT=5760 -CONFIG_TCP_WND_DEFAULT=5760 -CONFIG_TCP_RECVMBOX_SIZE=6 -CONFIG_TCP_QUEUE_OOSEQ=y -CONFIG_TCP_OVERSIZE_MSS=y -# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set -# CONFIG_TCP_OVERSIZE_DISABLE is not set -CONFIG_UDP_RECVMBOX_SIZE=6 -CONFIG_TCPIP_TASK_STACK_SIZE=3072 -CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set -# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF -# CONFIG_PPP_SUPPORT is not set -CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y -# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set -# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set -# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set -# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set -CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y -# CONFIG_NEWLIB_NANO_FORMAT is not set -CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y -# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set -CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 -CONFIG_ESP32_PTHREAD_STACK_MIN=768 -CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y -# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set -# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set -CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 -CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" -CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y -# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set -# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set -# CONFIG_ESP32_ULP_COPROC_ENABLED is not set -CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_SUPPORT_TERMIOS=y -CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# End of deprecated options diff --git a/sdkconfig.defaults b/sdkconfig.defaults new file mode 100644 index 0000000..148ef29 --- /dev/null +++ b/sdkconfig.defaults @@ -0,0 +1,4 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Minimal Configuration +# +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..4533f54 --- /dev/null +++ b/tasks.py @@ -0,0 +1,50 @@ +from invoke import task + +@task +def cleanbuild(c): + """Clean build: fullclean and build the project""" + c.run("idf.py fullclean") + c.run("idf.py build") + + +@task +def build(c): + """Build the project""" + c.run("idf.py build") + + +@task +def flash(c): + """Flash the project to device""" + c.run("idf.py flash") + + +@task +def monitor(c, port="/dev/ttyUSB0"): + """Monitor serial output from device""" + c.run(f"idf.py monitor -p {port}") + + +@task +def run(c, port="/dev/ttyUSB0"): + """Build, flash, and monitor in sequence""" + build(c) + flash(c) + monitor(c, port) + + +@task +def clean(c): + """Clean build artifacts""" + c.run("idf.py fullclean") + +@task +def config(c): + """Open menuconfig to edit project settings""" + c.run("idf.py menuconfig --color-scheme=monochrome", pty=True) + + +@task +def saveconfig(c): + """Save current config as sdkconfig.defaults""" + c.run("idf.py save-defconfig") From 7ea7944e9178d44658927b7b945a38784ed6a837 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 17:51:30 +0100 Subject: [PATCH 04/44] add(web_server): init basic webserver --- CMakeLists.txt | 14 ++ components/web_server/CMakeLists.txt | 8 + components/web_server/include/web_server.h | 58 ++++++ components/web_server/include/wifi.h | 15 ++ components/web_server/src/web_server.c | 201 +++++++++++++++++++++ components/web_server/src/wifi.c | 89 +++++++++ dependencies.lock | 21 +++ main/CMakeLists.txt | 4 +- main/dmx-interface.c | 33 ++++ main/idf_component.yml | 5 + 10 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 components/web_server/CMakeLists.txt create mode 100644 components/web_server/include/web_server.h create mode 100644 components/web_server/include/wifi.h create mode 100644 components/web_server/src/web_server.c create mode 100644 components/web_server/src/wifi.c create mode 100644 dependencies.lock create mode 100644 main/idf_component.yml diff --git a/CMakeLists.txt b/CMakeLists.txt index d622b7e..0a5481f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,20 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html # The following five lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.16) +# Clear any stale EXTRA_COMPONENT_DIRS entries (e.g. leftover from previous runs or PlatformIO) +set(EXTRA_COMPONENT_DIRS "") + include($ENV{IDF_PATH}/tools/cmake/project.cmake) + project(dmx-interface) + +# Disable filesystem image creation for now +# Can be enabled later when data/ folder is properly configured +if(FALSE) + if(COMMAND littlefs_create_partition_image) + littlefs_create_partition_image(storage ${CMAKE_SOURCE_DIR}/data FLASH_IN_PROJECT) + endif() +endif() diff --git a/components/web_server/CMakeLists.txt b/components/web_server/CMakeLists.txt new file mode 100644 index 0000000..38c5583 --- /dev/null +++ b/components/web_server/CMakeLists.txt @@ -0,0 +1,8 @@ +idf_component_register( + SRCS "src/web_server.c" + "src/wifi.c" + INCLUDE_DIRS "include" + REQUIRES esp_http_server + PRIV_REQUIRES freertos esp_wifi esp_event esp_netif nvs_flash +) + diff --git a/components/web_server/include/web_server.h b/components/web_server/include/web_server.h new file mode 100644 index 0000000..3ce5ccc --- /dev/null +++ b/components/web_server/include/web_server.h @@ -0,0 +1,58 @@ +/** + * @file web_server.h + * @brief Simple HTTP web server component for ESP32 with async FreeRTOS support. + */ + +#pragma once + +#include "esp_http_server.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief Web server configuration structure. + */ + typedef struct + { + uint16_t port; ///< HTTP server port (default: 80) + size_t max_uri_handlers; ///< Maximum number of URI handlers + size_t stack_size; ///< FreeRTOS task stack size + UBaseType_t task_priority; ///< FreeRTOS task priority + } webserver_config_t; + + /** + * @brief Initialize and start the HTTP web server. + * + * This function creates a FreeRTOS task that manages the HTTP server. + * It serves static files from the data/ folder and supports dynamic handler registration. + * + * @param config Configuration structure. If NULL, default values are used. + * @return HTTP server handle on success, NULL on failure. + */ + httpd_handle_t webserver_start(const webserver_config_t *config); + + /** + * @brief Stop the web server and cleanup resources. + * + * @param server HTTP server handle returned by webserver_start(). + * Safe to pass NULL. + */ + void webserver_stop(httpd_handle_t server); + + /** + * @brief Register a custom URI handler. + * + * This allows dynamic registration of API endpoints and other custom handlers. + * + * @param server HTTP server handle. + * @param uri_handler Pointer to httpd_uri_t structure. + * @return ESP_OK on success, error code otherwise. + */ + esp_err_t webserver_register_handler(httpd_handle_t server, const httpd_uri_t *uri_handler); + +#ifdef __cplusplus +} +#endif diff --git a/components/web_server/include/wifi.h b/components/web_server/include/wifi.h new file mode 100644 index 0000000..c023355 --- /dev/null +++ b/components/web_server/include/wifi.h @@ -0,0 +1,15 @@ +#pragma once + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, uint8_t max_connections); + void wifi_stop_ap(void); + +#ifdef __cplusplus +} +#endif diff --git a/components/web_server/src/web_server.c b/components/web_server/src/web_server.c new file mode 100644 index 0000000..5fc09c4 --- /dev/null +++ b/components/web_server/src/web_server.c @@ -0,0 +1,201 @@ +#include "web_server.h" + +#include +#include +#include +#include + +#include "esp_err.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "WEBSERVER"; + +// Default configuration values +#define WEBSERVER_DEFAULT_PORT 80 +#define WEBSERVER_DEFAULT_MAX_HANDLERS 32 +#define WEBSERVER_DEFAULT_STACK_SIZE (8 * 1024) +#define WEBSERVER_DEFAULT_TASK_PRIORITY 5 + +static httpd_handle_t s_server_handle = NULL; +static TaskHandle_t s_server_task_handle = NULL; + +/** + * @brief HTTP handler for root (GET /) + */ +static esp_err_t root_handler(httpd_req_t *req) +{ + const char *html = "" + "" + "DMX Interface" + "" + "

DMX Interface

" + "

Web server is running!

" + "

Check Health

" + "" + ""; + + httpd_resp_set_type(req, "text/html"); + httpd_resp_sendstr(req, html); + return ESP_OK; +} + +/** + * @brief HTTP handler for API health check (GET /api/health) + */ +static esp_err_t health_check_handler(httpd_req_t *req) +{ + httpd_resp_set_type(req, "application/json"); + httpd_resp_sendstr(req, "{\"status\":\"ok\"}"); + return ESP_OK; +} + +/** + * @brief FreeRTOS task function for the HTTP server. + * Allows non-blocking server operation and future extensibility. + */ +static void webserver_task(void *arg) +{ + httpd_handle_t server = (httpd_handle_t)arg; + ESP_LOGI(TAG, "Web server task started"); + + // Keep task alive - the server runs in the background + while (s_server_handle != NULL) + { + vTaskDelay(pdMS_TO_TICKS(10000)); // 10 second check interval + } + + ESP_LOGI(TAG, "Web server task ending"); + vTaskDelete(NULL); +} + +httpd_handle_t webserver_start(const webserver_config_t *config) +{ + if (s_server_handle != NULL) + { + ESP_LOGW(TAG, "Web server already running"); + return s_server_handle; + } + + // Use provided config or defaults + uint16_t port = WEBSERVER_DEFAULT_PORT; + size_t max_handlers = WEBSERVER_DEFAULT_MAX_HANDLERS; + size_t stack_size = WEBSERVER_DEFAULT_STACK_SIZE; + UBaseType_t task_priority = WEBSERVER_DEFAULT_TASK_PRIORITY; + + if (config) + { + port = config->port; + max_handlers = config->max_uri_handlers; + stack_size = config->stack_size; + task_priority = config->task_priority; + } + + // Create HTTP server configuration + httpd_config_t http_config = HTTPD_DEFAULT_CONFIG(); + http_config.server_port = port; + http_config.max_uri_handlers = max_handlers; + http_config.stack_size = stack_size; + http_config.uri_match_fn = httpd_uri_match_wildcard; + + // Start HTTP server + esp_err_t ret = httpd_start(&s_server_handle, &http_config); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to start HTTP server: %s", esp_err_to_name(ret)); + s_server_handle = NULL; + return NULL; + } + + ESP_LOGI(TAG, "HTTP server started on port %d", port); + + // Register default handlers + // Health check endpoint + httpd_uri_t health_uri = { + .uri = "/api/health", + .method = HTTP_GET, + .handler = health_check_handler, + .user_ctx = NULL, + }; + httpd_register_uri_handler(s_server_handle, &health_uri); + + // Root / index.html handler + httpd_uri_t root_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = root_handler, + .user_ctx = NULL, + }; + httpd_register_uri_handler(s_server_handle, &root_uri); + + // Wildcard handler for 404 (must be last) + httpd_uri_t wildcard_uri = { + .uri = "/*", + .method = HTTP_GET, + .handler = NULL, // Let httpd handle as 404 + .user_ctx = NULL, + }; + // Don't register wildcard - just let httpd default to 404 + + // Create FreeRTOS task for the server + // This allows other tasks to continue running and makes the server async-ready + BaseType_t task_ret = xTaskCreate( + webserver_task, + "webserver", + stack_size, + (void *)s_server_handle, + task_priority, + &s_server_task_handle); + + if (task_ret != pdPASS) + { + ESP_LOGE(TAG, "Failed to create web server task"); + httpd_stop(s_server_handle); + s_server_handle = NULL; + return NULL; + } + + ESP_LOGI(TAG, "Web server initialized successfully"); + return s_server_handle; +} + +void webserver_stop(httpd_handle_t server) +{ + if (server == NULL) + { + return; + } + + httpd_stop(server); + s_server_handle = NULL; + + // Wait for task to finish + if (s_server_task_handle != NULL) + { + vTaskDelay(pdMS_TO_TICKS(100)); + s_server_task_handle = NULL; + } + + ESP_LOGI(TAG, "Web server stopped"); +} + +esp_err_t webserver_register_handler(httpd_handle_t server, const httpd_uri_t *uri_handler) +{ + if (server == NULL || uri_handler == NULL) + { + return ESP_ERR_INVALID_ARG; + } + + esp_err_t ret = httpd_register_uri_handler(server, uri_handler); + if (ret == ESP_OK) + { + ESP_LOGI(TAG, "Registered handler: %s [%d]", uri_handler->uri, uri_handler->method); + } + else + { + ESP_LOGE(TAG, "Failed to register handler %s: %s", uri_handler->uri, esp_err_to_name(ret)); + } + + return ret; +} diff --git a/components/web_server/src/wifi.c b/components/web_server/src/wifi.c new file mode 100644 index 0000000..bff0e31 --- /dev/null +++ b/components/web_server/src/wifi.c @@ -0,0 +1,89 @@ +#include "wifi.h" + +#include + +#include "esp_event.h" +#include "esp_log.h" +#include "esp_netif.h" +#include "esp_wifi.h" +#include "nvs_flash.h" + +static const char *TAG = "WIFI"; +static bool s_wifi_started = false; + +esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, uint8_t max_connections) +{ + if (s_wifi_started) + { + return ESP_OK; + } + + if (!ssid || strlen(ssid) == 0 || strlen(ssid) > 32) + { + return ESP_ERR_INVALID_ARG; + } + + const bool has_password = password && strlen(password) > 0; + if (has_password && strlen(password) < 8) + { + return ESP_ERR_INVALID_ARG; + } + + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + err = nvs_flash_init(); + } + if (err != ESP_OK) + { + return err; + } + + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_ap(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + wifi_config_t wifi_config = { + .ap = { + .channel = channel, + .max_connection = max_connections, + .authmode = has_password ? WIFI_AUTH_WPA2_PSK : WIFI_AUTH_OPEN, + .pmf_cfg = { + .required = false, + }, + }, + }; + + strlcpy((char *)wifi_config.ap.ssid, ssid, sizeof(wifi_config.ap.ssid)); + wifi_config.ap.ssid_len = strlen(ssid); + + if (has_password) + { + strlcpy((char *)wifi_config.ap.password, password, sizeof(wifi_config.ap.password)); + } + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + + s_wifi_started = true; + ESP_LOGI(TAG, "WiFi AP started: SSID=%s channel=%u", ssid, channel); + return ESP_OK; +} + +void wifi_stop_ap(void) +{ + if (!s_wifi_started) + { + return; + } + + esp_wifi_stop(); + esp_wifi_deinit(); + s_wifi_started = false; + ESP_LOGI(TAG, "WiFi AP stopped"); +} diff --git a/dependencies.lock b/dependencies.lock new file mode 100644 index 0000000..cf76260 --- /dev/null +++ b/dependencies.lock @@ -0,0 +1,21 @@ +dependencies: + idf: + source: + type: idf + version: 5.5.2 + joltwallet/littlefs: + component_hash: 150ca47225f7c9917f7f610a5f85e5e93fe3c15402234c23496ff045ad558b0b + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.20.2 +direct_dependencies: +- idf +- joltwallet/littlefs +manifest_hash: ff4b0b01cddb86fe710ecb8fe90983fdab6a922a91a7dcfade112bc73ef373e8 +target: esp32c6 +version: 2.0.0 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 2adde77..27cbf72 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,2 +1,4 @@ idf_component_register(SRCS "dmx-interface.c" - INCLUDE_DIRS ".") + INCLUDE_DIRS "." + REQUIRES web_server) + diff --git a/main/dmx-interface.c b/main/dmx-interface.c index 7b66f33..45969d1 100644 --- a/main/dmx-interface.c +++ b/main/dmx-interface.c @@ -1,6 +1,39 @@ #include +#include "esp_err.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "web_server.h" +#include "wifi.h" + +static const char *TAG = "MAIN"; + void app_main(void) { + ESP_LOGI(TAG, "DMX Interface starting..."); + esp_err_t wifi_err = wifi_start_ap("DMX", "mbgmbgmbg", 1, 4); + if (wifi_err != ESP_OK) + { + ESP_LOGE(TAG, "Failed to start WiFi AP: %s", esp_err_to_name(wifi_err)); + return; + } + + // Start HTTP web server + httpd_handle_t server = webserver_start(NULL); + if (server == NULL) + { + ESP_LOGE(TAG, "Failed to start web server!"); + return; + } + + ESP_LOGI(TAG, "Web server started successfully"); + ESP_LOGI(TAG, "Open http://192.168.4.1 in your browser"); + + // Keep the app running + while (1) + { + vTaskDelay(pdMS_TO_TICKS(1000)); + } } diff --git a/main/idf_component.yml b/main/idf_component.yml new file mode 100644 index 0000000..9201729 --- /dev/null +++ b/main/idf_component.yml @@ -0,0 +1,5 @@ +## IDF Component Manager Manifest File +dependencies: + idf: + version: ">=4.1.0" + joltwallet/littlefs: ==1.20.2 From 99cb820b0c0af6c390ce0f831dccf1b7bb08fcd5 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Thu, 5 Mar 2026 18:11:46 +0100 Subject: [PATCH 05/44] change(sdkconfig): ensure CONFIG_IDF_TARGET is set for esp32s2 --- sdkconfig.defaults | 1 + 1 file changed, 1 insertion(+) diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 148ef29..db9b557 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -1,4 +1,5 @@ # This file was generated using idf.py save-defconfig. It can be edited manually. # Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Minimal Configuration # +CONFIG_IDF_TARGET="esp32s2" CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y From cac63b10d76ac1ddc38d1e6009fb9608705c3c85 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 19:50:59 +0100 Subject: [PATCH 06/44] add(storage): implement LittleFS initialization and static file handling --- CMakeLists.txt | 9 +- components/storage/CMakeLists.txt | 6 ++ components/storage/include/storage.h | 29 ++++++ components/storage/src/storage.c | 56 ++++++++++++ components/web_server/CMakeLists.txt | 3 +- components/web_server/src/web_server.c | 119 +++++++++++++++++++------ dependencies.lock | 2 +- sdkconfig.defaults | 3 +- 8 files changed, 189 insertions(+), 38 deletions(-) create mode 100644 components/storage/CMakeLists.txt create mode 100644 components/storage/include/storage.h create mode 100644 components/storage/src/storage.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a5481f..0ec000b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,10 +11,7 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(dmx-interface) -# Disable filesystem image creation for now -# Can be enabled later when data/ folder is properly configured -if(FALSE) - if(COMMAND littlefs_create_partition_image) - littlefs_create_partition_image(storage ${CMAKE_SOURCE_DIR}/data FLASH_IN_PROJECT) - endif() +# Enable LittleFS filesystem image creation for web assets +if(COMMAND littlefs_create_partition_image) + littlefs_create_partition_image(storage ${CMAKE_SOURCE_DIR}/data FLASH_IN_PROJECT) endif() diff --git a/components/storage/CMakeLists.txt b/components/storage/CMakeLists.txt new file mode 100644 index 0000000..9863d29 --- /dev/null +++ b/components/storage/CMakeLists.txt @@ -0,0 +1,6 @@ +idf_component_register( + SRCS "src/storage.c" + INCLUDE_DIRS "include" + REQUIRES joltwallet__littlefs + PRIV_REQUIRES vfs +) diff --git a/components/storage/include/storage.h b/components/storage/include/storage.h new file mode 100644 index 0000000..6412acb --- /dev/null +++ b/components/storage/include/storage.h @@ -0,0 +1,29 @@ +#ifndef STORAGE_H +#define STORAGE_H + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief Initialize and mount LittleFS filesystem + * + * @return ESP_OK on success, error code otherwise + */ + esp_err_t storage_init(void); + + /** + * @brief Get the mount point for the LittleFS filesystem + * + * @return Pointer to the mount point string (e.g., "/data") + */ + const char *storage_get_mount_point(void); + +#ifdef __cplusplus +} +#endif + +#endif /* STORAGE_H */ diff --git a/components/storage/src/storage.c b/components/storage/src/storage.c new file mode 100644 index 0000000..0602a1f --- /dev/null +++ b/components/storage/src/storage.c @@ -0,0 +1,56 @@ +#include "storage.h" + +#include "esp_littlefs.h" +#include "esp_log.h" +#include "esp_vfs.h" + +static const char *TAG = "STORAGE"; +static const char *LITTLEFS_MOUNT_POINT = "/data"; + +esp_err_t storage_init(void) +{ + esp_vfs_littlefs_conf_t conf = { + .base_path = LITTLEFS_MOUNT_POINT, + .partition_label = "storage", + .format_if_mount_failed = false, + .read_only = false, + }; + + esp_err_t ret = esp_vfs_littlefs_register(&conf); + + if (ret != ESP_OK) + { + if (ret == ESP_FAIL) + { + ESP_LOGE(TAG, "Failed to mount LittleFS or format filesystem"); + } + else if (ret == ESP_ERR_INVALID_STATE) + { + ESP_LOGE(TAG, "ESP_ERR_INVALID_STATE"); + } + else + { + ESP_LOGE(TAG, "Failed to initialize LittleFS: %s", esp_err_to_name(ret)); + } + return ret; + } + + size_t total = 0, used = 0; + ret = esp_littlefs_info(conf.partition_label, &total, &used); + if (ret == ESP_OK) + { + ESP_LOGI(TAG, "LittleFS mounted at %s. Total: %d bytes, Used: %d bytes", + LITTLEFS_MOUNT_POINT, total, used); + } + else + { + ESP_LOGE(TAG, "Failed to get LittleFS information"); + } + + return ESP_OK; +} + +const char *storage_get_mount_point(void) +{ + return LITTLEFS_MOUNT_POINT; +} diff --git a/components/web_server/CMakeLists.txt b/components/web_server/CMakeLists.txt index 38c5583..88bb425 100644 --- a/components/web_server/CMakeLists.txt +++ b/components/web_server/CMakeLists.txt @@ -2,7 +2,6 @@ idf_component_register( SRCS "src/web_server.c" "src/wifi.c" INCLUDE_DIRS "include" - REQUIRES esp_http_server + REQUIRES esp_http_server storage PRIV_REQUIRES freertos esp_wifi esp_event esp_netif nvs_flash ) - diff --git a/components/web_server/src/web_server.c b/components/web_server/src/web_server.c index 5fc09c4..19c77fd 100644 --- a/components/web_server/src/web_server.c +++ b/components/web_server/src/web_server.c @@ -9,6 +9,7 @@ #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "storage.h" static const char *TAG = "WEBSERVER"; @@ -22,22 +23,85 @@ static httpd_handle_t s_server_handle = NULL; static TaskHandle_t s_server_task_handle = NULL; /** - * @brief HTTP handler for root (GET /) + * @brief Get MIME type based on file extension */ -static esp_err_t root_handler(httpd_req_t *req) +static const char *get_mime_type(const char *filename) { - const char *html = "" - "" - "DMX Interface" - "" - "

DMX Interface

" - "

Web server is running!

" - "

Check Health

" - "" - ""; + const char *dot = strrchr(filename, '.'); + if (!dot) + return "application/octet-stream"; - httpd_resp_set_type(req, "text/html"); - httpd_resp_sendstr(req, html); + if (strcmp(dot, ".html") == 0) + return "text/html"; + if (strcmp(dot, ".css") == 0) + return "text/css"; + if (strcmp(dot, ".js") == 0) + return "application/javascript"; + if (strcmp(dot, ".json") == 0) + return "application/json"; + if (strcmp(dot, ".png") == 0) + return "image/png"; + if (strcmp(dot, ".jpg") == 0 || strcmp(dot, ".jpeg") == 0) + return "image/jpeg"; + if (strcmp(dot, ".gif") == 0) + return "image/gif"; + if (strcmp(dot, ".svg") == 0) + return "image/svg+xml"; + if (strcmp(dot, ".ico") == 0) + return "image/x-icon"; + if (strcmp(dot, ".txt") == 0) + return "text/plain"; + if (strcmp(dot, ".xml") == 0) + return "application/xml"; + if (strcmp(dot, ".wav") == 0) + return "audio/wav"; + if (strcmp(dot, ".mp3") == 0) + return "audio/mpeg"; + + return "application/octet-stream"; +} + +/** + * @brief HTTP handler for static files from LittleFS + */ +static esp_err_t static_file_handler(httpd_req_t *req) +{ + // Build the file path + char filepath[1024]; + snprintf(filepath, sizeof(filepath), "%s%s", storage_get_mount_point(), req->uri); + + // Handle root path + if (strcmp(req->uri, "/") == 0) + { + snprintf(filepath, sizeof(filepath), "%s/index.html", storage_get_mount_point()); + } + + FILE *f = fopen(filepath, "r"); + if (!f) + { + ESP_LOGW(TAG, "File not found: %s", filepath); + httpd_resp_send_404(req); + return ESP_OK; + } + + // Get MIME type and set content type + const char *mime_type = get_mime_type(filepath); + httpd_resp_set_type(req, mime_type); + + // Send file in chunks + char buf[1024]; + size_t read_len; + while ((read_len = fread(buf, 1, sizeof(buf), f)) > 0) + { + if (httpd_resp_send_chunk(req, buf, read_len) != ESP_OK) + { + ESP_LOGW(TAG, "Failed to send data chunk for %s", filepath); + break; + } + } + + fclose(f); + httpd_resp_send_chunk(req, NULL, 0); // Send end marker return ESP_OK; } @@ -57,7 +121,7 @@ static esp_err_t health_check_handler(httpd_req_t *req) */ static void webserver_task(void *arg) { - httpd_handle_t server = (httpd_handle_t)arg; + (void)arg; // Unused parameter ESP_LOGI(TAG, "Web server task started"); // Keep task alive - the server runs in the background @@ -78,6 +142,14 @@ httpd_handle_t webserver_start(const webserver_config_t *config) return s_server_handle; } + // Initialize LittleFS + esp_err_t ret = storage_init(); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to initialize storage"); + return NULL; + } + // Use provided config or defaults uint16_t port = WEBSERVER_DEFAULT_PORT; size_t max_handlers = WEBSERVER_DEFAULT_MAX_HANDLERS; @@ -100,7 +172,7 @@ httpd_handle_t webserver_start(const webserver_config_t *config) http_config.uri_match_fn = httpd_uri_match_wildcard; // Start HTTP server - esp_err_t ret = httpd_start(&s_server_handle, &http_config); + ret = httpd_start(&s_server_handle, &http_config); if (ret != ESP_OK) { ESP_LOGE(TAG, "Failed to start HTTP server: %s", esp_err_to_name(ret)); @@ -120,23 +192,14 @@ httpd_handle_t webserver_start(const webserver_config_t *config) }; httpd_register_uri_handler(s_server_handle, &health_uri); - // Root / index.html handler - httpd_uri_t root_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = root_handler, - .user_ctx = NULL, - }; - httpd_register_uri_handler(s_server_handle, &root_uri); - - // Wildcard handler for 404 (must be last) - httpd_uri_t wildcard_uri = { + // Wildcard handler for static files from LittleFS (must be last) + httpd_uri_t file_uri = { .uri = "/*", .method = HTTP_GET, - .handler = NULL, // Let httpd handle as 404 + .handler = static_file_handler, .user_ctx = NULL, }; - // Don't register wildcard - just let httpd default to 404 + httpd_register_uri_handler(s_server_handle, &file_uri); // Create FreeRTOS task for the server // This allows other tasks to continue running and makes the server async-ready diff --git a/dependencies.lock b/dependencies.lock index cf76260..0181ae1 100644 --- a/dependencies.lock +++ b/dependencies.lock @@ -17,5 +17,5 @@ direct_dependencies: - idf - joltwallet/littlefs manifest_hash: ff4b0b01cddb86fe710ecb8fe90983fdab6a922a91a7dcfade112bc73ef373e8 -target: esp32c6 +target: esp32s2 version: 2.0.0 diff --git a/sdkconfig.defaults b/sdkconfig.defaults index db9b557..c7b8c5d 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -1,5 +1,6 @@ # This file was generated using idf.py save-defconfig. It can be edited manually. # Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Minimal Configuration # -CONFIG_IDF_TARGET="esp32s2" CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_IDF_TARGET="esp32s2" From 39d314ccfae9a6e01978e28565b9727ac975c1df Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:36:40 +0100 Subject: [PATCH 07/44] add(tasks): implement reset task to clean project state --- tasks.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tasks.py b/tasks.py index 4533f54..d3f3906 100644 --- a/tasks.py +++ b/tasks.py @@ -1,4 +1,6 @@ from invoke import task +import os +import shutil @task def cleanbuild(c): @@ -38,6 +40,7 @@ def clean(c): """Clean build artifacts""" c.run("idf.py fullclean") + @task def config(c): """Open menuconfig to edit project settings""" @@ -48,3 +51,17 @@ def config(c): def saveconfig(c): """Save current config as sdkconfig.defaults""" c.run("idf.py save-defconfig") + + +@task +def reset(c): + """Reset project to clean state: remove build, config, and managed components""" + if os.path.exists("sdkconfig"): + os.remove("sdkconfig") + if os.path.exists("sdkconfig.old"): + os.remove("sdkconfig.old") + if os.path.exists("build"): + shutil.rmtree("build") + if os.path.exists("managed_components"): + shutil.rmtree("managed_components") + From 3ced494e76ef52122d66acf55769858e8f99a6ce Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:00:22 +0100 Subject: [PATCH 08/44] add(dmx): initialize DMX component add(dependencies): include esp_dmx as a dependency in the project update(idf_component): specify esp_dmx in the IDF component manifest --- components/dmx/CMakeLists.txt | 1 + components/dmx/include/dmx.h | 10 ++++++++++ components/dmx/src/dmx.c | 0 dependencies.lock | 11 ++++++++++- main/idf_component.yml | 5 ++++- 5 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 components/dmx/CMakeLists.txt create mode 100644 components/dmx/include/dmx.h create mode 100644 components/dmx/src/dmx.c diff --git a/components/dmx/CMakeLists.txt b/components/dmx/CMakeLists.txt new file mode 100644 index 0000000..8d0e35a --- /dev/null +++ b/components/dmx/CMakeLists.txt @@ -0,0 +1 @@ +idf_component_register(SRCS "src/dmx.c" INCLUDE_DIRS "include") \ No newline at end of file diff --git a/components/dmx/include/dmx.h b/components/dmx/include/dmx.h new file mode 100644 index 0000000..98d095c --- /dev/null +++ b/components/dmx/include/dmx.h @@ -0,0 +1,10 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/components/dmx/src/dmx.c b/components/dmx/src/dmx.c new file mode 100644 index 0000000..e69de29 diff --git a/dependencies.lock b/dependencies.lock index 0181ae1..dca625b 100644 --- a/dependencies.lock +++ b/dependencies.lock @@ -13,9 +13,18 @@ dependencies: registry_url: https://components.espressif.com/ type: service version: 1.20.2 + someweisguy/esp_dmx: + component_hash: 9a7cdcf093ef6f44337f2a254bbadbe4c8089c12aec4991cf43a83831a8389f4 + dependencies: [] + source: + git: https://github.com/davispolito/esp_dmx.git + path: . + type: git + version: 93cd565bb07d6bf9a56b5c62c96f2552a8fc6194 direct_dependencies: - idf - joltwallet/littlefs -manifest_hash: ff4b0b01cddb86fe710ecb8fe90983fdab6a922a91a7dcfade112bc73ef373e8 +- someweisguy/esp_dmx +manifest_hash: 452ccdb963e60a5d4bb28f619a5058b387491bb886d6685d4d8ba97c5884abe2 target: esp32s2 version: 2.0.0 diff --git a/main/idf_component.yml b/main/idf_component.yml index 9201729..199419b 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,5 +1,8 @@ ## IDF Component Manager Manifest File dependencies: idf: - version: ">=4.1.0" + version: '>=4.1.0' joltwallet/littlefs: ==1.20.2 + someweisguy/esp_dmx: + git: https://github.com/davispolito/esp_dmx.git + # version: v4.1.0 From ddba4d906c10617877e1b92732f7f2856ba08852 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:00:30 +0100 Subject: [PATCH 09/44] add(tasks): implement update task for project dependencies --- tasks.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasks.py b/tasks.py index 4533f54..196c8a8 100644 --- a/tasks.py +++ b/tasks.py @@ -48,3 +48,8 @@ def config(c): def saveconfig(c): """Save current config as sdkconfig.defaults""" c.run("idf.py save-defconfig") + +@task +def update(c): + """Update project dependencies""" + c.run("idf.py update-dependencies") \ No newline at end of file From fa08fcfe65b5db6e9f940fb780d1f5001dc756c4 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:46:53 +0100 Subject: [PATCH 10/44] add(format): implement formatting and format check tasks for source files --- .clang-format | 2 + .editorconfig | 29 +++++++++++++ .prettierignore | 14 +++++++ .prettierrc.json | 12 ++++++ flake.nix | 6 +++ tasks.py | 103 ++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 .clang-format create mode 100644 .editorconfig create mode 100644 .prettierignore create mode 100644 .prettierrc.json diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..f6b8fdf --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +--- +BasedOnStyle: LLVM diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..adeabc7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,29 @@ +# EditorConfig is awesome: https://EditorConfig.org +# Ensures consistent coding styles for multiple developers working on the same project across various editors and IDEs. + +root = true + +# All files +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +# Python files - 4 space indent +[*.py] +indent_size = 4 + +# Markdown files - preserve whitespace for formatting +[*.md] +trim_trailing_whitespace = false + +# Makefile - requires tabs +[Makefile] +indent_style = tab + +# Make files - requires tabs +[*.make] +indent_style = tab diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ad65d50 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,14 @@ +# Ignore build artifacts and generated files +build/ +managed_components/ +.direnv/ +*.lock + +# Ignore sdkconfig (generated) +sdkconfig +sdkconfig.old + +# SVGs are formatted with svgo instead +*.svg +# Ignore dependencies +dependencies.lock diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..a68aa02 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,12 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "avoid", + "endOfLine": "lf", + "proseWrap": "preserve" +} diff --git a/flake.nix b/flake.nix index a9c1a83..b4e20cd 100644 --- a/flake.nix +++ b/flake.nix @@ -24,6 +24,12 @@ esp-idf pkgs.python3 pkgs.python3Packages.invoke + # Formatting tools + pkgs.clang-tools + pkgs.nodePackages.prettier + # pkgs.nodePackages.svgo + pkgs.black + pkgs.nixfmt ]; }; }; diff --git a/tasks.py b/tasks.py index 8e745c4..a6096f2 100644 --- a/tasks.py +++ b/tasks.py @@ -1,6 +1,8 @@ from invoke import task import os import shutil +import sys + @task def cleanbuild(c): @@ -41,7 +43,7 @@ def clean(c): c.run("idf.py fullclean") -@task +@task def config(c): """Open menuconfig to edit project settings""" c.run("idf.py menuconfig --color-scheme=monochrome", pty=True) @@ -52,11 +54,13 @@ def saveconfig(c): """Save current config as sdkconfig.defaults""" c.run("idf.py save-defconfig") + @task def update(c): """Update project dependencies""" c.run("idf.py update-dependencies") + @task def reset(c): """Reset project to clean state: remove build, config, and managed components""" @@ -68,4 +72,99 @@ def reset(c): shutil.rmtree("build") if os.path.exists("managed_components"): shutil.rmtree("managed_components") - + + +@task +def format(c): + """Format all source files with clang-format, black, prettier, nixfmt, and svgo""" + missing_tools = [] + + print("Formatting C files...") + result = c.run( + "find main components -name '*.c' -o -name '*.h' | xargs clang-format -i", + warn=True, + ) + if result and not result.ok: + missing_tools.append("clang-format") + + print("Formatting Python files...") + result = c.run("black tasks.py", warn=True) + if result and not result.ok: + missing_tools.append("black") + + print("Formatting Nix files...") + result = c.run("nixfmt flake.nix", warn=True) + if result and not result.ok: + missing_tools.append("nixfmt") + + print("Formatting SVG files...") + result = c.run( + "find . -name '*.svg' -not -path './build/*' -not -path './managed_components/*' | xargs svgo", + warn=True, + ) + if result and not result.ok: + missing_tools.append("svgo") + + print("Formatting other files...") + result = c.run("prettier --write '**/*.{js,json,yaml,yml,md,html,css}'", warn=True) + if result and not result.ok: + missing_tools.append("prettier") + + if missing_tools: + print(f"\n❌ ERROR: Missing formatting tools: {', '.join(missing_tools)}") + print("Please install them or reload the nix-shell.") + sys.exit(1) + + +@task +def format_check(c): + """Check if all files are formatted correctly""" + missing_tools = [] + format_errors = [] + + print("Checking C file formatting...") + result = c.run( + "find main components -name '*.c' -o -name '*.h' | xargs clang-format --dry-run --Werror", + warn=True, + ) + if result: + if result.return_code == 127: # Command not found + missing_tools.append("clang-format") + elif not result.ok: + format_errors.append("C files") + + print("Checking Python file formatting...") + result = c.run("black --check tasks.py", warn=True) + if result: + if result.return_code == 127: + missing_tools.append("black") + elif not result.ok: + format_errors.append("Python files") + + print("Checking Nix file formatting...") + result = c.run("nixfmt --check flake.nix", warn=True) + if result: + if result.return_code == 127: + missing_tools.append("nixfmt") + elif not result.ok: + format_errors.append("Nix files") + + print("Checking other file formatting...") + result = c.run("prettier --check '**/*.{js,json,yaml,yml,md,html,css}'", warn=True) + if result: + if result.return_code == 127: + missing_tools.append("prettier") + elif not result.ok: + format_errors.append("JS/JSON/YAML/HTML/CSS files") + + if missing_tools: + print(f"\n❌ ERROR: Missing formatting tools: {', '.join(missing_tools)}") + print("Please install them or reload the nix-shell.") + sys.exit(1) + + if format_errors: + print(f"\n❌ ERROR: Formatting issues in: {', '.join(format_errors)}") + print("Run 'invoke format' to fix them.") + sys.exit(1) + + print("\n✅ All files are correctly formatted!") From 008c79852b130debf8ff9637779475b5ac286120 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:05:35 +0100 Subject: [PATCH 11/44] chore(format): initial formatting --- README.md | 6 +- components/dmx/include/dmx.h | 3 +- components/storage/include/storage.h | 27 +- components/storage/src/storage.c | 29 +- components/web_server/include/web_server.h | 81 +-- components/web_server/include/wifi.h | 8 +- components/web_server/src/web_server.c | 383 ++++++------- components/web_server/src/wifi.c | 48 +- data/index.html | 607 ++++++++++----------- data/input-visibility.js | 28 +- data/load-data.js | 68 +-- data/loading-screen.js | 40 +- data/networks.js | 90 +-- data/range-input.js | 16 +- data/reset.js | 20 +- data/status.js | 135 +++-- data/style.css | 352 ++++++------ data/submit.js | 104 ++-- data/websocket.js | 44 +- main/dmx-interface.c | 12 +- main/idf_component.yml | 2 +- 21 files changed, 1021 insertions(+), 1082 deletions(-) diff --git a/README.md b/README.md index 187faab..a4a913d 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ ## 📱 Implemented microcontrollers -- [x] Lolin S2 mini -- [ ] ESP 32 WROOM -- [ ] ESP 32 C3 +- [x] Lolin S2 mini +- [ ] ESP 32 WROOM +- [ ] ESP 32 C3 > For other microcontrollers you may need to adjust the `platformio.ini` diff --git a/components/dmx/include/dmx.h b/components/dmx/include/dmx.h index 98d095c..af80ff8 100644 --- a/components/dmx/include/dmx.h +++ b/components/dmx/include/dmx.h @@ -1,8 +1,7 @@ #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #ifdef __cplusplus diff --git a/components/storage/include/storage.h b/components/storage/include/storage.h index 6412acb..3910ada 100644 --- a/components/storage/include/storage.h +++ b/components/storage/include/storage.h @@ -4,23 +4,22 @@ #include "esp_err.h" #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - /** - * @brief Initialize and mount LittleFS filesystem - * - * @return ESP_OK on success, error code otherwise - */ - esp_err_t storage_init(void); +/** + * @brief Initialize and mount LittleFS filesystem + * + * @return ESP_OK on success, error code otherwise + */ +esp_err_t storage_init(void); - /** - * @brief Get the mount point for the LittleFS filesystem - * - * @return Pointer to the mount point string (e.g., "/data") - */ - const char *storage_get_mount_point(void); +/** + * @brief Get the mount point for the LittleFS filesystem + * + * @return Pointer to the mount point string (e.g., "/data") + */ +const char *storage_get_mount_point(void); #ifdef __cplusplus } diff --git a/components/storage/src/storage.c b/components/storage/src/storage.c index 0602a1f..478539a 100644 --- a/components/storage/src/storage.c +++ b/components/storage/src/storage.c @@ -7,8 +7,7 @@ static const char *TAG = "STORAGE"; static const char *LITTLEFS_MOUNT_POINT = "/data"; -esp_err_t storage_init(void) -{ +esp_err_t storage_init(void) { esp_vfs_littlefs_conf_t conf = { .base_path = LITTLEFS_MOUNT_POINT, .partition_label = "storage", @@ -18,18 +17,12 @@ esp_err_t storage_init(void) esp_err_t ret = esp_vfs_littlefs_register(&conf); - if (ret != ESP_OK) - { - if (ret == ESP_FAIL) - { + if (ret != ESP_OK) { + if (ret == ESP_FAIL) { ESP_LOGE(TAG, "Failed to mount LittleFS or format filesystem"); - } - else if (ret == ESP_ERR_INVALID_STATE) - { + } else if (ret == ESP_ERR_INVALID_STATE) { ESP_LOGE(TAG, "ESP_ERR_INVALID_STATE"); - } - else - { + } else { ESP_LOGE(TAG, "Failed to initialize LittleFS: %s", esp_err_to_name(ret)); } return ret; @@ -37,20 +30,14 @@ esp_err_t storage_init(void) size_t total = 0, used = 0; ret = esp_littlefs_info(conf.partition_label, &total, &used); - if (ret == ESP_OK) - { + if (ret == ESP_OK) { ESP_LOGI(TAG, "LittleFS mounted at %s. Total: %d bytes, Used: %d bytes", LITTLEFS_MOUNT_POINT, total, used); - } - else - { + } else { ESP_LOGE(TAG, "Failed to get LittleFS information"); } return ESP_OK; } -const char *storage_get_mount_point(void) -{ - return LITTLEFS_MOUNT_POINT; -} +const char *storage_get_mount_point(void) { return LITTLEFS_MOUNT_POINT; } diff --git a/components/web_server/include/web_server.h b/components/web_server/include/web_server.h index 3ce5ccc..58a0923 100644 --- a/components/web_server/include/web_server.h +++ b/components/web_server/include/web_server.h @@ -1,6 +1,7 @@ /** * @file web_server.h - * @brief Simple HTTP web server component for ESP32 with async FreeRTOS support. + * @brief Simple HTTP web server component for ESP32 with async FreeRTOS + * support. */ #pragma once @@ -8,50 +9,50 @@ #include "esp_http_server.h" #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - /** - * @brief Web server configuration structure. - */ - typedef struct - { - uint16_t port; ///< HTTP server port (default: 80) - size_t max_uri_handlers; ///< Maximum number of URI handlers - size_t stack_size; ///< FreeRTOS task stack size - UBaseType_t task_priority; ///< FreeRTOS task priority - } webserver_config_t; +/** + * @brief Web server configuration structure. + */ +typedef struct { + uint16_t port; ///< HTTP server port (default: 80) + size_t max_uri_handlers; ///< Maximum number of URI handlers + size_t stack_size; ///< FreeRTOS task stack size + UBaseType_t task_priority; ///< FreeRTOS task priority +} webserver_config_t; - /** - * @brief Initialize and start the HTTP web server. - * - * This function creates a FreeRTOS task that manages the HTTP server. - * It serves static files from the data/ folder and supports dynamic handler registration. - * - * @param config Configuration structure. If NULL, default values are used. - * @return HTTP server handle on success, NULL on failure. - */ - httpd_handle_t webserver_start(const webserver_config_t *config); +/** + * @brief Initialize and start the HTTP web server. + * + * This function creates a FreeRTOS task that manages the HTTP server. + * It serves static files from the data/ folder and supports dynamic handler + * registration. + * + * @param config Configuration structure. If NULL, default values are used. + * @return HTTP server handle on success, NULL on failure. + */ +httpd_handle_t webserver_start(const webserver_config_t *config); - /** - * @brief Stop the web server and cleanup resources. - * - * @param server HTTP server handle returned by webserver_start(). - * Safe to pass NULL. - */ - void webserver_stop(httpd_handle_t server); +/** + * @brief Stop the web server and cleanup resources. + * + * @param server HTTP server handle returned by webserver_start(). + * Safe to pass NULL. + */ +void webserver_stop(httpd_handle_t server); - /** - * @brief Register a custom URI handler. - * - * This allows dynamic registration of API endpoints and other custom handlers. - * - * @param server HTTP server handle. - * @param uri_handler Pointer to httpd_uri_t structure. - * @return ESP_OK on success, error code otherwise. - */ - esp_err_t webserver_register_handler(httpd_handle_t server, const httpd_uri_t *uri_handler); +/** + * @brief Register a custom URI handler. + * + * This allows dynamic registration of API endpoints and other custom handlers. + * + * @param server HTTP server handle. + * @param uri_handler Pointer to httpd_uri_t structure. + * @return ESP_OK on success, error code otherwise. + */ +esp_err_t webserver_register_handler(httpd_handle_t server, + const httpd_uri_t *uri_handler); #ifdef __cplusplus } diff --git a/components/web_server/include/wifi.h b/components/web_server/include/wifi.h index c023355..4876de7 100644 --- a/components/web_server/include/wifi.h +++ b/components/web_server/include/wifi.h @@ -3,12 +3,12 @@ #include "esp_err.h" #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, uint8_t max_connections); - void wifi_stop_ap(void); +esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, + uint8_t max_connections); +void wifi_stop_ap(void); #ifdef __cplusplus } diff --git a/components/web_server/src/web_server.c b/components/web_server/src/web_server.c index 19c77fd..38b050c 100644 --- a/components/web_server/src/web_server.c +++ b/components/web_server/src/web_server.c @@ -25,240 +25,219 @@ static TaskHandle_t s_server_task_handle = NULL; /** * @brief Get MIME type based on file extension */ -static const char *get_mime_type(const char *filename) -{ - const char *dot = strrchr(filename, '.'); - if (!dot) - return "application/octet-stream"; - - if (strcmp(dot, ".html") == 0) - return "text/html"; - if (strcmp(dot, ".css") == 0) - return "text/css"; - if (strcmp(dot, ".js") == 0) - return "application/javascript"; - if (strcmp(dot, ".json") == 0) - return "application/json"; - if (strcmp(dot, ".png") == 0) - return "image/png"; - if (strcmp(dot, ".jpg") == 0 || strcmp(dot, ".jpeg") == 0) - return "image/jpeg"; - if (strcmp(dot, ".gif") == 0) - return "image/gif"; - if (strcmp(dot, ".svg") == 0) - return "image/svg+xml"; - if (strcmp(dot, ".ico") == 0) - return "image/x-icon"; - if (strcmp(dot, ".txt") == 0) - return "text/plain"; - if (strcmp(dot, ".xml") == 0) - return "application/xml"; - if (strcmp(dot, ".wav") == 0) - return "audio/wav"; - if (strcmp(dot, ".mp3") == 0) - return "audio/mpeg"; - +static const char *get_mime_type(const char *filename) { + const char *dot = strrchr(filename, '.'); + if (!dot) return "application/octet-stream"; + + if (strcmp(dot, ".html") == 0) + return "text/html"; + if (strcmp(dot, ".css") == 0) + return "text/css"; + if (strcmp(dot, ".js") == 0) + return "application/javascript"; + if (strcmp(dot, ".json") == 0) + return "application/json"; + if (strcmp(dot, ".png") == 0) + return "image/png"; + if (strcmp(dot, ".jpg") == 0 || strcmp(dot, ".jpeg") == 0) + return "image/jpeg"; + if (strcmp(dot, ".gif") == 0) + return "image/gif"; + if (strcmp(dot, ".svg") == 0) + return "image/svg+xml"; + if (strcmp(dot, ".ico") == 0) + return "image/x-icon"; + if (strcmp(dot, ".txt") == 0) + return "text/plain"; + if (strcmp(dot, ".xml") == 0) + return "application/xml"; + if (strcmp(dot, ".wav") == 0) + return "audio/wav"; + if (strcmp(dot, ".mp3") == 0) + return "audio/mpeg"; + + return "application/octet-stream"; } /** * @brief HTTP handler for static files from LittleFS */ -static esp_err_t static_file_handler(httpd_req_t *req) -{ - // Build the file path - char filepath[1024]; - snprintf(filepath, sizeof(filepath), "%s%s", storage_get_mount_point(), req->uri); +static esp_err_t static_file_handler(httpd_req_t *req) { + // Build the file path + char filepath[1024]; + snprintf(filepath, sizeof(filepath), "%s%s", storage_get_mount_point(), + req->uri); - // Handle root path - if (strcmp(req->uri, "/") == 0) - { - snprintf(filepath, sizeof(filepath), "%s/index.html", storage_get_mount_point()); - } + // Handle root path + if (strcmp(req->uri, "/") == 0) { + snprintf(filepath, sizeof(filepath), "%s/index.html", + storage_get_mount_point()); + } - FILE *f = fopen(filepath, "r"); - if (!f) - { - ESP_LOGW(TAG, "File not found: %s", filepath); - httpd_resp_send_404(req); - return ESP_OK; - } - - // Get MIME type and set content type - const char *mime_type = get_mime_type(filepath); - httpd_resp_set_type(req, mime_type); - - // Send file in chunks - char buf[1024]; - size_t read_len; - while ((read_len = fread(buf, 1, sizeof(buf), f)) > 0) - { - if (httpd_resp_send_chunk(req, buf, read_len) != ESP_OK) - { - ESP_LOGW(TAG, "Failed to send data chunk for %s", filepath); - break; - } - } - - fclose(f); - httpd_resp_send_chunk(req, NULL, 0); // Send end marker + FILE *f = fopen(filepath, "r"); + if (!f) { + ESP_LOGW(TAG, "File not found: %s", filepath); + httpd_resp_send_404(req); return ESP_OK; + } + + // Get MIME type and set content type + const char *mime_type = get_mime_type(filepath); + httpd_resp_set_type(req, mime_type); + + // Send file in chunks + char buf[1024]; + size_t read_len; + while ((read_len = fread(buf, 1, sizeof(buf), f)) > 0) { + if (httpd_resp_send_chunk(req, buf, read_len) != ESP_OK) { + ESP_LOGW(TAG, "Failed to send data chunk for %s", filepath); + break; + } + } + + fclose(f); + httpd_resp_send_chunk(req, NULL, 0); // Send end marker + return ESP_OK; } /** * @brief HTTP handler for API health check (GET /api/health) */ -static esp_err_t health_check_handler(httpd_req_t *req) -{ - httpd_resp_set_type(req, "application/json"); - httpd_resp_sendstr(req, "{\"status\":\"ok\"}"); - return ESP_OK; +static esp_err_t health_check_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "application/json"); + httpd_resp_sendstr(req, "{\"status\":\"ok\"}"); + return ESP_OK; } /** * @brief FreeRTOS task function for the HTTP server. * Allows non-blocking server operation and future extensibility. */ -static void webserver_task(void *arg) -{ - (void)arg; // Unused parameter - ESP_LOGI(TAG, "Web server task started"); +static void webserver_task(void *arg) { + (void)arg; // Unused parameter + ESP_LOGI(TAG, "Web server task started"); - // Keep task alive - the server runs in the background - while (s_server_handle != NULL) - { - vTaskDelay(pdMS_TO_TICKS(10000)); // 10 second check interval - } + // Keep task alive - the server runs in the background + while (s_server_handle != NULL) { + vTaskDelay(pdMS_TO_TICKS(10000)); // 10 second check interval + } - ESP_LOGI(TAG, "Web server task ending"); - vTaskDelete(NULL); + ESP_LOGI(TAG, "Web server task ending"); + vTaskDelete(NULL); } -httpd_handle_t webserver_start(const webserver_config_t *config) -{ - if (s_server_handle != NULL) - { - ESP_LOGW(TAG, "Web server already running"); - return s_server_handle; - } - - // Initialize LittleFS - esp_err_t ret = storage_init(); - if (ret != ESP_OK) - { - ESP_LOGE(TAG, "Failed to initialize storage"); - return NULL; - } - - // Use provided config or defaults - uint16_t port = WEBSERVER_DEFAULT_PORT; - size_t max_handlers = WEBSERVER_DEFAULT_MAX_HANDLERS; - size_t stack_size = WEBSERVER_DEFAULT_STACK_SIZE; - UBaseType_t task_priority = WEBSERVER_DEFAULT_TASK_PRIORITY; - - if (config) - { - port = config->port; - max_handlers = config->max_uri_handlers; - stack_size = config->stack_size; - task_priority = config->task_priority; - } - - // Create HTTP server configuration - httpd_config_t http_config = HTTPD_DEFAULT_CONFIG(); - http_config.server_port = port; - http_config.max_uri_handlers = max_handlers; - http_config.stack_size = stack_size; - http_config.uri_match_fn = httpd_uri_match_wildcard; - - // Start HTTP server - ret = httpd_start(&s_server_handle, &http_config); - if (ret != ESP_OK) - { - ESP_LOGE(TAG, "Failed to start HTTP server: %s", esp_err_to_name(ret)); - s_server_handle = NULL; - return NULL; - } - - ESP_LOGI(TAG, "HTTP server started on port %d", port); - - // Register default handlers - // Health check endpoint - httpd_uri_t health_uri = { - .uri = "/api/health", - .method = HTTP_GET, - .handler = health_check_handler, - .user_ctx = NULL, - }; - httpd_register_uri_handler(s_server_handle, &health_uri); - - // Wildcard handler for static files from LittleFS (must be last) - httpd_uri_t file_uri = { - .uri = "/*", - .method = HTTP_GET, - .handler = static_file_handler, - .user_ctx = NULL, - }; - httpd_register_uri_handler(s_server_handle, &file_uri); - - // Create FreeRTOS task for the server - // This allows other tasks to continue running and makes the server async-ready - BaseType_t task_ret = xTaskCreate( - webserver_task, - "webserver", - stack_size, - (void *)s_server_handle, - task_priority, - &s_server_task_handle); - - if (task_ret != pdPASS) - { - ESP_LOGE(TAG, "Failed to create web server task"); - httpd_stop(s_server_handle); - s_server_handle = NULL; - return NULL; - } - - ESP_LOGI(TAG, "Web server initialized successfully"); +httpd_handle_t webserver_start(const webserver_config_t *config) { + if (s_server_handle != NULL) { + ESP_LOGW(TAG, "Web server already running"); return s_server_handle; -} + } -void webserver_stop(httpd_handle_t server) -{ - if (server == NULL) - { - return; - } + // Initialize LittleFS + esp_err_t ret = storage_init(); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to initialize storage"); + return NULL; + } - httpd_stop(server); + // Use provided config or defaults + uint16_t port = WEBSERVER_DEFAULT_PORT; + size_t max_handlers = WEBSERVER_DEFAULT_MAX_HANDLERS; + size_t stack_size = WEBSERVER_DEFAULT_STACK_SIZE; + UBaseType_t task_priority = WEBSERVER_DEFAULT_TASK_PRIORITY; + + if (config) { + port = config->port; + max_handlers = config->max_uri_handlers; + stack_size = config->stack_size; + task_priority = config->task_priority; + } + + // Create HTTP server configuration + httpd_config_t http_config = HTTPD_DEFAULT_CONFIG(); + http_config.server_port = port; + http_config.max_uri_handlers = max_handlers; + http_config.stack_size = stack_size; + http_config.uri_match_fn = httpd_uri_match_wildcard; + + // Start HTTP server + ret = httpd_start(&s_server_handle, &http_config); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to start HTTP server: %s", esp_err_to_name(ret)); s_server_handle = NULL; + return NULL; + } - // Wait for task to finish - if (s_server_task_handle != NULL) - { - vTaskDelay(pdMS_TO_TICKS(100)); - s_server_task_handle = NULL; - } + ESP_LOGI(TAG, "HTTP server started on port %d", port); - ESP_LOGI(TAG, "Web server stopped"); + // Register default handlers + // Health check endpoint + httpd_uri_t health_uri = { + .uri = "/api/health", + .method = HTTP_GET, + .handler = health_check_handler, + .user_ctx = NULL, + }; + httpd_register_uri_handler(s_server_handle, &health_uri); + + // Wildcard handler for static files from LittleFS (must be last) + httpd_uri_t file_uri = { + .uri = "/*", + .method = HTTP_GET, + .handler = static_file_handler, + .user_ctx = NULL, + }; + httpd_register_uri_handler(s_server_handle, &file_uri); + + // Create FreeRTOS task for the server + // This allows other tasks to continue running and makes the server + // async-ready + BaseType_t task_ret = xTaskCreate(webserver_task, "webserver", stack_size, + (void *)s_server_handle, task_priority, + &s_server_task_handle); + + if (task_ret != pdPASS) { + ESP_LOGE(TAG, "Failed to create web server task"); + httpd_stop(s_server_handle); + s_server_handle = NULL; + return NULL; + } + + ESP_LOGI(TAG, "Web server initialized successfully"); + return s_server_handle; } -esp_err_t webserver_register_handler(httpd_handle_t server, const httpd_uri_t *uri_handler) -{ - if (server == NULL || uri_handler == NULL) - { - return ESP_ERR_INVALID_ARG; - } +void webserver_stop(httpd_handle_t server) { + if (server == NULL) { + return; + } - esp_err_t ret = httpd_register_uri_handler(server, uri_handler); - if (ret == ESP_OK) - { - ESP_LOGI(TAG, "Registered handler: %s [%d]", uri_handler->uri, uri_handler->method); - } - else - { - ESP_LOGE(TAG, "Failed to register handler %s: %s", uri_handler->uri, esp_err_to_name(ret)); - } + httpd_stop(server); + s_server_handle = NULL; - return ret; + // Wait for task to finish + if (s_server_task_handle != NULL) { + vTaskDelay(pdMS_TO_TICKS(100)); + s_server_task_handle = NULL; + } + + ESP_LOGI(TAG, "Web server stopped"); +} + +esp_err_t webserver_register_handler(httpd_handle_t server, + const httpd_uri_t *uri_handler) { + if (server == NULL || uri_handler == NULL) { + return ESP_ERR_INVALID_ARG; + } + + esp_err_t ret = httpd_register_uri_handler(server, uri_handler); + if (ret == ESP_OK) { + ESP_LOGI(TAG, "Registered handler: %s [%d]", uri_handler->uri, + uri_handler->method); + } else { + ESP_LOGE(TAG, "Failed to register handler %s: %s", uri_handler->uri, + esp_err_to_name(ret)); + } + + return ret; } diff --git a/components/web_server/src/wifi.c b/components/web_server/src/wifi.c index bff0e31..3ca0516 100644 --- a/components/web_server/src/wifi.c +++ b/components/web_server/src/wifi.c @@ -11,32 +11,28 @@ static const char *TAG = "WIFI"; static bool s_wifi_started = false; -esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, uint8_t max_connections) -{ - if (s_wifi_started) - { +esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, + uint8_t max_connections) { + if (s_wifi_started) { return ESP_OK; } - if (!ssid || strlen(ssid) == 0 || strlen(ssid) > 32) - { + if (!ssid || strlen(ssid) == 0 || strlen(ssid) > 32) { return ESP_ERR_INVALID_ARG; } const bool has_password = password && strlen(password) > 0; - if (has_password && strlen(password) < 8) - { + if (has_password && strlen(password) < 8) { return ESP_ERR_INVALID_ARG; } esp_err_t err = nvs_flash_init(); - if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) - { + if (err == ESP_ERR_NVS_NO_FREE_PAGES || + err == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } - if (err != ESP_OK) - { + if (err != ESP_OK) { return err; } @@ -48,22 +44,24 @@ esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, ESP_ERROR_CHECK(esp_wifi_init(&cfg)); wifi_config_t wifi_config = { - .ap = { - .channel = channel, - .max_connection = max_connections, - .authmode = has_password ? WIFI_AUTH_WPA2_PSK : WIFI_AUTH_OPEN, - .pmf_cfg = { - .required = false, + .ap = + { + .channel = channel, + .max_connection = max_connections, + .authmode = has_password ? WIFI_AUTH_WPA2_PSK : WIFI_AUTH_OPEN, + .pmf_cfg = + { + .required = false, + }, }, - }, }; strlcpy((char *)wifi_config.ap.ssid, ssid, sizeof(wifi_config.ap.ssid)); wifi_config.ap.ssid_len = strlen(ssid); - if (has_password) - { - strlcpy((char *)wifi_config.ap.password, password, sizeof(wifi_config.ap.password)); + if (has_password) { + strlcpy((char *)wifi_config.ap.password, password, + sizeof(wifi_config.ap.password)); } ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); @@ -75,10 +73,8 @@ esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, return ESP_OK; } -void wifi_stop_ap(void) -{ - if (!s_wifi_started) - { +void wifi_stop_ap(void) { + if (!s_wifi_started) { return; } diff --git a/data/index.html b/data/index.html index 9859fb4..41908bb 100644 --- a/data/index.html +++ b/data/index.html @@ -1,328 +1,313 @@ - + - - - - Konfiguration - - - - - - - - - - - - -
-
-
- -

-
- -
-
+ + + + Konfiguration + + + + + + + + + + + + +
+
+
+ +

+
+ +
+
- -
- +
+ + +
+ + +
+ diff --git a/data/input-visibility.js b/data/input-visibility.js index 32445a0..6ba7466 100644 --- a/data/input-visibility.js +++ b/data/input-visibility.js @@ -4,20 +4,20 @@ const dynamicInputs = form.querySelectorAll("[data-field][data-values]"); document.addEventListener("change", updateVisibility); function updateVisibility() { - dynamicInputs.forEach((element) => { - const input = form.querySelector(`#${element.dataset.field}`); - if (element.dataset.values.split("|").includes(input.value)) { - element.classList.remove("hidden"); - element - .querySelectorAll("input, select, button, textarea") - .forEach((childInput) => (childInput.disabled = false)); - } else { - element.classList.add("hidden"); - element - .querySelectorAll("input, select, button, textarea") - .forEach((childInput) => (childInput.disabled = true)); - } - }); + dynamicInputs.forEach(element => { + const input = form.querySelector(`#${element.dataset.field}`); + if (element.dataset.values.split("|").includes(input.value)) { + element.classList.remove("hidden"); + element + .querySelectorAll("input, select, button, textarea") + .forEach(childInput => (childInput.disabled = false)); + } else { + element.classList.add("hidden"); + element + .querySelectorAll("input, select, button, textarea") + .forEach(childInput => (childInput.disabled = true)); + } + }); } updateVisibility(); diff --git a/data/load-data.js b/data/load-data.js index bf4c1e0..54c114a 100644 --- a/data/load-data.js +++ b/data/load-data.js @@ -1,7 +1,7 @@ import { - showLoadingScreen, - showError, - hideLoadingScreen, + showLoadingScreen, + showError, + hideLoadingScreen, } from "./loading-screen.js"; const form = document.querySelector("form.config"); @@ -9,46 +9,46 @@ const form = document.querySelector("form.config"); export let data = {}; export async function loadData(timeout = null) { - const req = await fetch("/config", { - method: "GET", - signal: timeout !== null ? AbortSignal.timeout(timeout) : undefined, - }); - if (!req.ok) { - throw new Error(`Response status: ${req.status}`); - } + const req = await fetch("/config", { + method: "GET", + signal: timeout !== null ? AbortSignal.timeout(timeout) : undefined, + }); + if (!req.ok) { + throw new Error(`Response status: ${req.status}`); + } - const json = await req.json(); - console.log(json); - return json; + const json = await req.json(); + console.log(json); + return json; } export function writeDataToInput(data) { - console.log("write data"); - for (const [key, value] of Object.entries(data)) { - const element = document.querySelector(`[name=${key}]`); - console.log(key, element); + console.log("write data"); + for (const [key, value] of Object.entries(data)) { + const element = document.querySelector(`[name=${key}]`); + console.log(key, element); - if (element.type === "checkbox") { - element.checked = value; - } else { - element.value = value; - } - - if (element.type === "range") { - // update text next to the slider by sending an event - element.dispatchEvent(new Event("input", { bubbles: true })); - } + if (element.type === "checkbox") { + element.checked = value; + } else { + element.value = value; } - // send "change" event - form.dispatchEvent(new Event("change", { bubbles: true })); + + if (element.type === "range") { + // update text next to the slider by sending an event + element.dispatchEvent(new Event("input", { bubbles: true })); + } + } + // send "change" event + form.dispatchEvent(new Event("change", { bubbles: true })); } showLoadingScreen("Konfiguration wird geladen..."); try { - data = await loadData(); - hideLoadingScreen(); - writeDataToInput(data); + data = await loadData(); + hideLoadingScreen(); + writeDataToInput(data); } catch (error) { - console.log(error.message); - showError("Die Konfiguration konnte nicht geladen werden."); + console.log(error.message); + showError("Die Konfiguration konnte nicht geladen werden."); } diff --git a/data/loading-screen.js b/data/loading-screen.js index 322c479..00749bf 100644 --- a/data/loading-screen.js +++ b/data/loading-screen.js @@ -5,36 +5,36 @@ const spinner = loadingScreen.querySelector(".spinner"); const reloadBtn = loadingScreen.querySelector(".reload"); export function showLoadingScreen(msg) { - hide(content, reloadBtn); - show(loadingScreen, spinner); - loadingMsg.classList.remove("error"); - loadingMsg.textContent = msg; + hide(content, reloadBtn); + show(loadingScreen, spinner); + loadingMsg.classList.remove("error"); + loadingMsg.textContent = msg; } export function showError(msg) { - showLoadingScreen(msg); - loadingMsg.innerHTML += - "
Stelle sicher, dass du mit dem DMX-Interface verbunden bist und die IP-Adresse stimmt."; - show(reloadBtn); - hide(spinner); - loadingMsg.classList.add("error"); + showLoadingScreen(msg); + loadingMsg.innerHTML += + "
Stelle sicher, dass du mit dem DMX-Interface verbunden bist und die IP-Adresse stimmt."; + show(reloadBtn); + hide(spinner); + loadingMsg.classList.add("error"); } export function hideLoadingScreen() { - hide(loadingScreen, reloadBtn); - show(content); - loadingMsg.classList.remove("error"); - loadingMsg.textContent = ""; + hide(loadingScreen, reloadBtn); + show(content); + loadingMsg.classList.remove("error"); + loadingMsg.textContent = ""; } function show(...elements) { - for (const element of elements) { - element.classList.remove("hidden"); - } + for (const element of elements) { + element.classList.remove("hidden"); + } } function hide(...elements) { - for (const element of elements) { - element.classList.add("hidden"); - } + for (const element of elements) { + element.classList.add("hidden"); + } } diff --git a/data/networks.js b/data/networks.js index 9bc4b17..8cb056e 100644 --- a/data/networks.js +++ b/data/networks.js @@ -7,67 +7,67 @@ const refreshIcon = refreshButton.querySelector("img"); let isLoading = false; refreshButton.addEventListener("click", async () => { - // check if interface is in WiFi-AccessPoint mode - if (data.connection == 1) { - alert( - "Beim WLAN-Scan wird die Verbindung hardwarebedingt kurzzeitig" + - "unterbrochen.\n" + - "Möglicherweise muss das Interface neu verbunden werden." - ); - } - updateNetworks(); + // check if interface is in WiFi-AccessPoint mode + if (data.connection == 1) { + alert( + "Beim WLAN-Scan wird die Verbindung hardwarebedingt kurzzeitig" + + "unterbrochen.\n" + + "Möglicherweise muss das Interface neu verbunden werden." + ); + } + updateNetworks(); }); // check if connected via WiFi-Station if (data.connection === 0) { - // show currently connected WiFi - insertNetworks([data.ssid]); + // show currently connected WiFi + insertNetworks([data.ssid]); } function insertNetworks(networks) { - networkDropdown.textContent = ""; // clear dropdown + networkDropdown.textContent = ""; // clear dropdown - for (const ssid of networks) { - const option = document.createElement("option"); - option.value = ssid; - option.innerText = ssid; - networkDropdown.appendChild(option); - } + for (const ssid of networks) { + const option = document.createElement("option"); + option.value = ssid; + option.innerText = ssid; + networkDropdown.appendChild(option); + } } async function loadNetworks() { - if (isLoading) return; + if (isLoading) return; - isLoading = true; - refreshButton.classList.remove("error-bg"); - refreshIcon.classList.add("spinning"); + isLoading = true; + refreshButton.classList.remove("error-bg"); + refreshIcon.classList.add("spinning"); - try { - const res = await fetch("/networks", { - method: "GET", - }); + try { + const res = await fetch("/networks", { + method: "GET", + }); - if (!res.ok) { - throw Error(`response status: ${res.status}`); - } - - const networks = await res.json(); - - refreshIcon.classList.remove("spinning"); - isLoading = false; - // remove duplicate values - return Array.from(new Set(networks)); - } catch (e) { - refreshIcon.classList.remove("spinning"); - refreshButton.classList.add("error-bg"); - isLoading = false; - return []; + if (!res.ok) { + throw Error(`response status: ${res.status}`); } + + const networks = await res.json(); + + refreshIcon.classList.remove("spinning"); + isLoading = false; + // remove duplicate values + return Array.from(new Set(networks)); + } catch (e) { + refreshIcon.classList.remove("spinning"); + refreshButton.classList.add("error-bg"); + isLoading = false; + return []; + } } async function updateNetworks() { - const networks = await loadNetworks(); - if (networks) { - insertNetworks(["", ...networks]); - } + const networks = await loadNetworks(); + if (networks) { + insertNetworks(["", ...networks]); + } } diff --git a/data/range-input.js b/data/range-input.js index 7e42f1b..cc8db68 100644 --- a/data/range-input.js +++ b/data/range-input.js @@ -1,14 +1,14 @@ -document.querySelector("form.config").addEventListener("input", (event) => { - if (event.target.classList.contains("range")) { - updateValue(event.target); - } +document.querySelector("form.config").addEventListener("input", event => { + if (event.target.classList.contains("range")) { + updateValue(event.target); + } }); function updateValue(slider) { - const percentage = Math.round((slider.value / slider.max) * 100); - slider.nextElementSibling.innerText = `${percentage}%`; + const percentage = Math.round((slider.value / slider.max) * 100); + slider.nextElementSibling.innerText = `${percentage}%`; } -document.querySelectorAll("input[type='range'].range").forEach((element) => { - updateValue(element); +document.querySelectorAll("input[type='range'].range").forEach(element => { + updateValue(element); }); diff --git a/data/reset.js b/data/reset.js index ecf29ec..8bb6354 100644 --- a/data/reset.js +++ b/data/reset.js @@ -2,15 +2,15 @@ import { updateConfig } from "/submit.js"; const form = document.querySelector("form.config"); -form.addEventListener("reset", async (event) => { - event.preventDefault(); +form.addEventListener("reset", async event => { + event.preventDefault(); - const ok = confirm( - "Sicher, dass du alle Einstellungen zurücksetzen möchtest?" - ); - if (ok) { - updateConfig({ - method: "DELETE", - }); - } + const ok = confirm( + "Sicher, dass du alle Einstellungen zurücksetzen möchtest?" + ); + if (ok) { + updateConfig({ + method: "DELETE", + }); + } }); diff --git a/data/status.js b/data/status.js index ca42350..b44c30f 100644 --- a/data/status.js +++ b/data/status.js @@ -5,108 +5,105 @@ const statusDialog = document.querySelector(".dialog-status"); const expandButton = document.querySelector(".expand-status"); expandButton.addEventListener("click", () => { - statusDialog.showModal(); + statusDialog.showModal(); }); registerCallback("status", setStatus); initWebSocket(); function setStatus(status) { - setValue("model", status.chip.model); - setValue("mac", formatMac(status.chip.mac)); - setValue("sdk-version", status.sdkVersion); + setValue("model", status.chip.model); + setValue("mac", formatMac(status.chip.mac)); + setValue("sdk-version", status.sdkVersion); - setValue("rssi", status.connection.signalStrength); - const icon = selectConnectionIcon(status.connection.signalStrength); - document.querySelectorAll(".connection-icon").forEach((img) => { - img.src = `/icons/${icon}`; - }); + setValue("rssi", status.connection.signalStrength); + const icon = selectConnectionIcon(status.connection.signalStrength); + document.querySelectorAll(".connection-icon").forEach(img => { + img.src = `/icons/${icon}`; + }); - setValue("cpu-freq", status.chip.cpuFreqMHz); - setValue("cpu-cycle-count", status.chip.cycleCount); - setValue("cpu-temp", status.chip.tempC); + setValue("cpu-freq", status.chip.cpuFreqMHz); + setValue("cpu-cycle-count", status.chip.cycleCount); + setValue("cpu-temp", status.chip.tempC); - const usedHeap = status.heap.total - status.heap.free; - setValue("heap-used", formatBytes(usedHeap)); - setValue("heap-total", formatBytes(status.heap.total)); - setValue( - "heap-percentage", - Math.round((usedHeap / status.heap.total) * 100) - ); + const usedHeap = status.heap.total - status.heap.free; + setValue("heap-used", formatBytes(usedHeap)); + setValue("heap-total", formatBytes(status.heap.total)); + setValue("heap-percentage", Math.round((usedHeap / status.heap.total) * 100)); - const usedPsram = status.psram.total - status.psram.free; - setValue("psram-used", formatBytes(usedPsram)); - setValue("psram-total", formatBytes(status.psram.total)); - setValue( - "psram-percentage", - Math.round((usedPsram / status.psram.total) * 100) - ); + const usedPsram = status.psram.total - status.psram.free; + setValue("psram-used", formatBytes(usedPsram)); + setValue("psram-total", formatBytes(status.psram.total)); + setValue( + "psram-percentage", + Math.round((usedPsram / status.psram.total) * 100) + ); - setValue("uptime", parseDuration(status.uptime)); + setValue("uptime", parseDuration(status.uptime)); - setValue("hash", parseHash(status.sketch.md5)); + setValue("hash", parseHash(status.sketch.md5)); } function setValue(className, value) { - document.querySelectorAll("." + className).forEach((element) => { - element.innerText = value; - }); + document.querySelectorAll("." + className).forEach(element => { + element.innerText = value; + }); } function parseDuration(ms) { - const date = new Date(ms); - const time = - date.getUTCHours().toString().padStart(2, "0") + - ":" + - date.getUTCMinutes().toString().padStart(2, "0") + - " h"; - const days = Math.floor(date.getTime() / (1000 * 60 * 60 * 24)); + const date = new Date(ms); + const time = + date.getUTCHours().toString().padStart(2, "0") + + ":" + + date.getUTCMinutes().toString().padStart(2, "0") + + " h"; + const days = Math.floor(date.getTime() / (1000 * 60 * 60 * 24)); - return days !== 0 ? `${days} Tage, ${time}` : time; + return days !== 0 ? `${days} Tage, ${time}` : time; } function parseHash(hash) { - return hash.toUpperCase().substring(0, 16); + return hash.toUpperCase().substring(0, 16); } function formatBytes(bytes) { - const units = ["Bytes", "KB", "MB", "GB"]; + const units = ["Bytes", "KB", "MB", "GB"]; - let value = bytes; - let index = 0; - while (value >= 1000) { - value /= 1000; - index++; - } + let value = bytes; + let index = 0; + while (value >= 1000) { + value /= 1000; + index++; + } - return `${Math.round(value * 10) / 10} ${units[index]}`; + return `${Math.round(value * 10) / 10} ${units[index]}`; } function formatMac(decimalMac) { - const octets = decimalMac.toString(16).toUpperCase().match(/../g) || []; - return octets.reverse().join(":"); + const octets = decimalMac.toString(16).toUpperCase().match(/../g) || []; + return octets.reverse().join(":"); } function selectConnectionIcon(signalStrength) { - // access point - if (data.connection == 1) { - return "hotspot.svg"; - } + // access point + if (data.connection == 1) { + return "hotspot.svg"; + } - // ethernet - if (data.connection == 2) { - return "lan.svg"; - } + // ethernet + if (data.connection == 2) { + return "lan.svg"; + } - // station - if (signalStrength >= -50) { - return "signal4.svg"; - } - if (signalStrength >= -60) { - return "signal3.svg"; - } - if (signalStrength >= -70) { - return "signal2.svg"; - } - return "signal1.svg"; + // station + if (signalStrength >= -50) { + return "signal4.svg"; + } + if (signalStrength >= -60) { + return "signal3.svg"; + } + if (signalStrength >= -70) { + return "signal2.svg"; + } + return "signal1.svg"; } diff --git a/data/style.css b/data/style.css index 06bc06e..fabefb5 100644 --- a/data/style.css +++ b/data/style.css @@ -1,330 +1,330 @@ :root { - --color-primary: #087e8b; - --color-on-primary: white; - --color-background: #222; - --color-surface: #333; - --color-danger: #fa2b58; - --appended-item-size: 2.5rem; + --color-primary: #087e8b; + --color-on-primary: white; + --color-background: #222; + --color-surface: #333; + --color-danger: #fa2b58; + --appended-item-size: 2.5rem; - color-scheme: dark; + color-scheme: dark; } body { - margin: 0; - padding: 0; - background: linear-gradient(to left, #065760, black, black, #065760); - color: white; - font-family: Arial, Helvetica, sans-serif; - overflow: hidden; + margin: 0; + padding: 0; + background: linear-gradient(to left, #065760, black, black, #065760); + color: white; + font-family: Arial, Helvetica, sans-serif; + overflow: hidden; } main { - background-color: var(--color-background); - max-width: 700px; - padding: 8px max(5%, 8px); - margin: 0 auto; - height: 100vh; - overflow: auto; + background-color: var(--color-background); + max-width: 700px; + padding: 8px max(5%, 8px); + margin: 0 auto; + height: 100vh; + overflow: auto; } h1 { - text-align: center; + text-align: center; } form > * { - margin-bottom: 16px; + margin-bottom: 16px; } fieldset { - border-radius: 8px; - border-color: white; + border-radius: 8px; + border-color: white; } label { - display: block; - display: flex; - gap: 8px; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; + display: block; + display: flex; + gap: 8px; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; } label span { - flex-grow: 1; + flex-grow: 1; } input, select, label div { - width: clamp(200px, 100%, 400px); + width: clamp(200px, 100%, 400px); } input, select { - background-color: var(--color-background); - color: white; - border: 1px solid white; - border-radius: 8px; - padding: 8px; - box-sizing: border-box; + background-color: var(--color-background); + color: white; + border: 1px solid white; + border-radius: 8px; + padding: 8px; + box-sizing: border-box; } input:focus, select:focus { - outline: none; - border-color: var(--color-primary); + outline: none; + border-color: var(--color-primary); } select:has(+ .icon-button), label div input[type="range"] { - width: calc(clamp(200px, 100%, 400px) - var(--appended-item-size) - 8px); + width: calc(clamp(200px, 100%, 400px) - var(--appended-item-size) - 8px); } input[type="range"] { - accent-color: var(--color-primary); + accent-color: var(--color-primary); } button { - border: none; - inset: none; - border-radius: 8px; - background-color: var(--color-primary); - color: var(--color-on-primary); - padding: 8px 16px; + border: none; + inset: none; + border-radius: 8px; + background-color: var(--color-primary); + color: var(--color-on-primary); + padding: 8px 16px; } button[type="reset"] { - background-color: var(--color-danger); + background-color: var(--color-danger); } :is(div:has(:is(input, select)), input, select, label) - + :is(div:has(:is(input, select)), input, select, label) { - margin-top: 8px; + + :is(div:has(:is(input, select)), input, select, label) { + margin-top: 8px; } .hidden { - display: none !important; + display: none !important; } label.switch { - display: inline-flex; - flex-direction: row; - align-items: center; - gap: 8px; - -webkit-user-select: none; - user-select: none; + display: inline-flex; + flex-direction: row; + align-items: center; + gap: 8px; + -webkit-user-select: none; + user-select: none; } label.switch input { - display: none; + display: none; } label.switch .slider { - display: inline-block; - position: relative; - height: 1em; - width: 2em; - background-color: #444; - border-radius: 1em; - border: 4px solid #444; + display: inline-block; + position: relative; + height: 1em; + width: 2em; + background-color: #444; + border-radius: 1em; + border: 4px solid #444; } label.switch .slider::before { - content: ""; - position: absolute; - height: 100%; - aspect-ratio: 1 / 1; - border-radius: 50%; - top: 50%; - background-color: white; - transition: all 0.1s linear; + content: ""; + position: absolute; + height: 100%; + aspect-ratio: 1 / 1; + border-radius: 50%; + top: 50%; + background-color: white; + transition: all 0.1s linear; } label.switch:active .slider::before { - transform: scale(1.3); - transform-origin: 50% 50%; + transform: scale(1.3); + transform-origin: 50% 50%; } label.switch input:not(:checked) + .slider::before { - left: 0%; - translate: 0 -50%; + left: 0%; + translate: 0 -50%; } label.switch input:checked + .slider::before { - left: 100%; - translate: -100% -50%; + left: 100%; + translate: -100% -50%; } dialog { - width: 80%; - max-width: 500px; - max-height: 80%; - overflow: auto; - background-color: var(--color-background); - color: white; - border: none; - border-radius: 8px; - padding: 16px; + width: 80%; + max-width: 500px; + max-height: 80%; + overflow: auto; + background-color: var(--color-background); + color: white; + border: none; + border-radius: 8px; + padding: 16px; } dialog::backdrop { - background-color: #000a; + background-color: #000a; } .dialog-header { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; - & button { - margin: 0; - } + & button { + margin: 0; + } } .card { - background-color: var(--color-surface); - padding: 8px; - border-radius: 8px; + background-color: var(--color-surface); + padding: 8px; + border-radius: 8px; } .card > * { - display: block; + display: block; } .card > :first-child { - color: var(--color-primary); - margin-bottom: 8px; + color: var(--color-primary); + margin-bottom: 8px; } .buttons { - display: flex; - flex-direction: row; - justify-content: center; - gap: 8px; + display: flex; + flex-direction: row; + justify-content: center; + gap: 8px; } .loading-screen { - display: grid; - justify-content: center; + display: grid; + justify-content: center; } .error { - color: var(--color-danger); + color: var(--color-danger); } .error-bg { - background-color: var(--color-danger) !important; + background-color: var(--color-danger) !important; } button.reload { - display: block; - margin: 0 auto; + display: block; + margin: 0 auto; } .spinner-container { - width: min(max-content, 100%); + width: min(max-content, 100%); } .spinner { - position: relative; - margin: 10px auto; - background: conic-gradient(transparent 150deg, var(--color-primary)); - --outer-diameter: 50px; - width: var(--outer-diameter); - height: var(--outer-diameter); - border-radius: 50%; + position: relative; + margin: 10px auto; + background: conic-gradient(transparent 150deg, var(--color-primary)); + --outer-diameter: 50px; + width: var(--outer-diameter); + height: var(--outer-diameter); + border-radius: 50%; - animation-name: spin; - animation-duration: 1s; - animation-iteration-count: infinite; - animation-timing-function: linear; + animation-name: spin; + animation-duration: 1s; + animation-iteration-count: infinite; + animation-timing-function: linear; } .spinner::after { - position: absolute; - content: ""; - display: block; - --spinner-border: 5px; - top: var(--spinner-border); - left: var(--spinner-border); + position: absolute; + content: ""; + display: block; + --spinner-border: 5px; + top: var(--spinner-border); + left: var(--spinner-border); - --inner-diameter: calc(var(--outer-diameter) - 2 * var(--spinner-border)); - width: var(--inner-diameter); - height: var(--inner-diameter); + --inner-diameter: calc(var(--outer-diameter) - 2 * var(--spinner-border)); + width: var(--inner-diameter); + height: var(--inner-diameter); - background-color: var(--color-background); - border-radius: 50%; + background-color: var(--color-background); + border-radius: 50%; } @keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } } .icon-button { - padding: 8px; - font-size: 0; - width: var(--appended-item-size); - height: var(--appended-item-size); + padding: 8px; + font-size: 0; + width: var(--appended-item-size); + height: var(--appended-item-size); } .spinning { - animation-name: spin; - animation-duration: 0.5s; - animation-iteration-count: infinite; - animation-timing-function: linear; + animation-name: spin; + animation-duration: 0.5s; + animation-iteration-count: infinite; + animation-timing-function: linear; } div:has(.range-value) { - display: flex; - flex-direction: row; - gap: 8px; + display: flex; + flex-direction: row; + gap: 8px; } .range-value { - width: var(--appended-item-size); - height: var(--appended-item-size); - text-align: center; - line-height: var(--appended-item-size); + width: var(--appended-item-size); + height: var(--appended-item-size); + text-align: center; + line-height: var(--appended-item-size); } .status { - background-color: var(--color-surface); - padding: 8px; - border-radius: 8px; + background-color: var(--color-surface); + padding: 8px; + border-radius: 8px; - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; - gap: 16px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 16px; } .dialog-status-content { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 8px; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; } .connection-icon { - width: 24px; - height: 24px; - padding: 8px; + width: 24px; + height: 24px; + padding: 8px; } .connection-icon.small { - padding: 0; - height: 1em; + padding: 0; + height: 1em; } .centered-vertical { - display: flex; - flex-direction: row; - align-items: center; - gap: 8px; + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; } diff --git a/data/submit.js b/data/submit.js index ee599e5..06a5fa1 100644 --- a/data/submit.js +++ b/data/submit.js @@ -1,74 +1,74 @@ import { loadData, writeDataToInput } from "./load-data.js"; import { - showLoadingScreen, - hideLoadingScreen, - showError, + showLoadingScreen, + hideLoadingScreen, + showError, } from "./loading-screen.js"; const form = document.querySelector("form.config"); function parseValue(input) { - if (input.type === "checkbox") { - return input.checked - ? input.dataset.valueChecked - : input.dataset.valueNotChecked; - } + if (input.type === "checkbox") { + return input.checked + ? input.dataset.valueChecked + : input.dataset.valueNotChecked; + } - if (input.value === "") { - return null; - } + if (input.value === "") { + return null; + } - if (input.type === "number" || input.type === "range") { - const number = Number(input.value); - return Number.isNaN(number) ? null : number; - } + if (input.type === "number" || input.type === "range") { + const number = Number(input.value); + return Number.isNaN(number) ? null : number; + } - return input.value; + return input.value; } -form.addEventListener("submit", (event) => { - event.preventDefault(); - const inputFields = document.querySelectorAll( - "form :is(input, select, textarea):not(:disabled)" - ); +form.addEventListener("submit", event => { + event.preventDefault(); + const inputFields = document.querySelectorAll( + "form :is(input, select, textarea):not(:disabled)" + ); - const data = Array.from(inputFields).reduce((data, input) => { - data[input.name] = parseValue(input); - return data; - }, {}); - console.log(data); + const data = Array.from(inputFields).reduce((data, input) => { + data[input.name] = parseValue(input); + return data; + }, {}); + console.log(data); - updateConfig({ - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }); + updateConfig({ + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); }); export async function updateConfig(fetchOptions) { - showLoadingScreen("Konfiguration anwenden und ESP neustarten..."); + showLoadingScreen("Konfiguration anwenden und ESP neustarten..."); + try { + const res = await fetch("/config", fetchOptions); + if (!res.ok) { + throw new Error(`Response status: ${res.status}`); + } + } catch (error) { + console.error(error.message); + showError(error.message); + } + + for (let i = 0; i < 10; i++) { try { - const res = await fetch("/config", fetchOptions); - if (!res.ok) { - throw new Error(`Response status: ${res.status}`); - } + const data = await loadData(5000); + writeDataToInput(data); + hideLoadingScreen(); + + break; } catch (error) { - console.error(error.message); - showError(error.message); - } - - for (let i = 0; i < 10; i++) { - try { - const data = await loadData(5000); - writeDataToInput(data); - hideLoadingScreen(); - - break; - } catch (error) { - // retry loading config until successful - } + // retry loading config until successful } + } } diff --git a/data/websocket.js b/data/websocket.js index 268d69e..5fc3cea 100644 --- a/data/websocket.js +++ b/data/websocket.js @@ -4,34 +4,34 @@ let ws; let callbacks = {}; export function initWebSocket() { - if (ws) return; + if (ws) return; - ws = new WebSocket(gateway); + ws = new WebSocket(gateway); - ws.onopen = () => { - console.info("WebSocket connection opened"); - }; + ws.onopen = () => { + console.info("WebSocket connection opened"); + }; - ws.onclose = (event) => { - console.info("WebSocket connection closed, reason:", event.reason); - ws = null; - }; + ws.onclose = event => { + console.info("WebSocket connection closed, reason:", event.reason); + ws = null; + }; - ws.onerror = (event) => { - console.warn("WebSocket encountered error, closing socket.", event); - ws.close(); - ws = null; - }; + ws.onerror = event => { + console.warn("WebSocket encountered error, closing socket.", event); + ws.close(); + ws = null; + }; - ws.onmessage = (event) => { - const message = JSON.parse(event.data); - console.log("received websocket data", message); - if (message.type in callbacks) { - callbacks[message.type](message.data); - } - }; + ws.onmessage = event => { + const message = JSON.parse(event.data); + console.log("received websocket data", message); + if (message.type in callbacks) { + callbacks[message.type](message.data); + } + }; } export function registerCallback(type, callback) { - callbacks[type] = callback; + callbacks[type] = callback; } diff --git a/main/dmx-interface.c b/main/dmx-interface.c index 45969d1..4ed7ccd 100644 --- a/main/dmx-interface.c +++ b/main/dmx-interface.c @@ -9,21 +9,18 @@ static const char *TAG = "MAIN"; -void app_main(void) -{ +void app_main(void) { ESP_LOGI(TAG, "DMX Interface starting..."); esp_err_t wifi_err = wifi_start_ap("DMX", "mbgmbgmbg", 1, 4); - if (wifi_err != ESP_OK) - { + if (wifi_err != ESP_OK) { ESP_LOGE(TAG, "Failed to start WiFi AP: %s", esp_err_to_name(wifi_err)); return; } // Start HTTP web server httpd_handle_t server = webserver_start(NULL); - if (server == NULL) - { + if (server == NULL) { ESP_LOGE(TAG, "Failed to start web server!"); return; } @@ -32,8 +29,7 @@ void app_main(void) ESP_LOGI(TAG, "Open http://192.168.4.1 in your browser"); // Keep the app running - while (1) - { + while (1) { vTaskDelay(pdMS_TO_TICKS(1000)); } } diff --git a/main/idf_component.yml b/main/idf_component.yml index 199419b..f58a105 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,7 +1,7 @@ ## IDF Component Manager Manifest File dependencies: idf: - version: '>=4.1.0' + version: ">=4.1.0" joltwallet/littlefs: ==1.20.2 someweisguy/esp_dmx: git: https://github.com/davispolito/esp_dmx.git From 6e695bd48c9736a019057c53639993cbf9282671 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:29:02 +0100 Subject: [PATCH 12/44] refactor(format): enhance formatting tasks with tool existence checks and improved output --- flake.nix | 4 ++-- tasks.py | 52 +++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/flake.nix b/flake.nix index b4e20cd..0791d12 100644 --- a/flake.nix +++ b/flake.nix @@ -15,7 +15,6 @@ let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; - # Use the same esp-idf-full as previously in .envrc esp-idf = esp-dev.packages.${system}.esp-idf-full; in { @@ -24,10 +23,11 @@ esp-idf pkgs.python3 pkgs.python3Packages.invoke + # Formatting tools pkgs.clang-tools pkgs.nodePackages.prettier - # pkgs.nodePackages.svgo + pkgs.nodePackages.svgo pkgs.black pkgs.nixfmt ]; diff --git a/tasks.py b/tasks.py index a6096f2..d782c10 100644 --- a/tasks.py +++ b/tasks.py @@ -83,37 +83,59 @@ def format(c): result = c.run( "find main components -name '*.c' -o -name '*.h' | xargs clang-format -i", warn=True, + hide=False, ) - if result and not result.ok: - missing_tools.append("clang-format") + if result.exited == 127 or (not result.ok and result.exited != 0): + # Check if tool exists + check = c.run("command -v clang-format", warn=True, hide=True) + if not check.ok: + missing_tools.append("clang-format") print("Formatting Python files...") - result = c.run("black tasks.py", warn=True) - if result and not result.ok: - missing_tools.append("black") + result = c.run("black tasks.py", warn=True, hide=False) + if result.exited == 127 or (not result.ok and result.exited != 0): + check = c.run("command -v black", warn=True, hide=True) + if not check.ok: + missing_tools.append("black") print("Formatting Nix files...") - result = c.run("nixfmt flake.nix", warn=True) - if result and not result.ok: - missing_tools.append("nixfmt") + result = c.run("nixfmt flake.nix", warn=True, hide=False) + if result.exited == 127 or (not result.ok and result.exited != 0): + check = c.run("command -v nixfmt", warn=True, hide=True) + if not check.ok: + missing_tools.append("nixfmt") print("Formatting SVG files...") result = c.run( - "find . -name '*.svg' -not -path './build/*' -not -path './managed_components/*' | xargs svgo", + "find . -name '*.svg' -not -path './build/*' -not -path './managed_components/*' | xargs -r svgo", warn=True, + hide=False, ) - if result and not result.ok: - missing_tools.append("svgo") + if result.exited == 127 or (not result.ok and result.exited != 0): + check = c.run("command -v svgo", warn=True, hide=True) + if not check.ok: + missing_tools.append("svgo") print("Formatting other files...") - result = c.run("prettier --write '**/*.{js,json,yaml,yml,md,html,css}'", warn=True) - if result and not result.ok: - missing_tools.append("prettier") + result = c.run( + "prettier --write '**/*.{js,json,yaml,yml,md,html,css}'", warn=True, hide=False + ) + if result.exited == 127 or (not result.ok and result.exited != 0): + check = c.run("command -v prettier", warn=True, hide=True) + if not check.ok: + missing_tools.append("prettier") if missing_tools: - print(f"\n❌ ERROR: Missing formatting tools: {', '.join(missing_tools)}") + print("\n" + "=" * 60) + print(f"❌ ERROR: Missing formatting tools: {', '.join(missing_tools)}") + print("=" * 60) print("Please install them or reload the nix-shell.") + print("=" * 60 + "\n") sys.exit(1) + else: + print("\n" + "=" * 60) + print("✅ All files formatted successfully!") + print("=" * 60 + "\n") @task From 302ea1a71eca560a177157207227f1dbcfd76afb Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:29:34 +0100 Subject: [PATCH 13/44] chore(format): optimize svg --- assets/circuit/diagram.svg | 114 +------------------------------------ assets/design/favicon.svg | 6 +- assets/design/social.svg | 26 +-------- data/icons/close.svg | 6 +- data/icons/hotspot.svg | 12 +--- data/icons/lan.svg | 6 +- data/icons/open.svg | 6 +- data/icons/refresh.svg | 6 +- data/icons/signal0.svg | 6 +- data/icons/signal1.svg | 6 +- data/icons/signal2.svg | 6 +- data/icons/signal3.svg | 6 +- data/icons/signal4.svg | 6 +- 13 files changed, 13 insertions(+), 199 deletions(-) diff --git a/assets/circuit/diagram.svg b/assets/circuit/diagram.svg index 3ac7a7e..9097416 100644 --- a/assets/circuit/diagram.svg +++ b/assets/circuit/diagram.svg @@ -1,113 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/design/favicon.svg b/assets/design/favicon.svg index 530ea35..71ea926 100644 --- a/assets/design/favicon.svg +++ b/assets/design/favicon.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/assets/design/social.svg b/assets/design/social.svg index a773d34..eb5ed4a 100644 --- a/assets/design/social.svg +++ b/assets/design/social.svg @@ -1,25 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/data/icons/close.svg b/data/icons/close.svg index c0e3e69..9e5a566 100644 --- a/data/icons/close.svg +++ b/data/icons/close.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/hotspot.svg b/data/icons/hotspot.svg index 258ad6a..2308bb3 100644 --- a/data/icons/hotspot.svg +++ b/data/icons/hotspot.svg @@ -1,11 +1 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/lan.svg b/data/icons/lan.svg index afb4cd5..de824d9 100644 --- a/data/icons/lan.svg +++ b/data/icons/lan.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/open.svg b/data/icons/open.svg index b7e47a3..069e038 100644 --- a/data/icons/open.svg +++ b/data/icons/open.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/refresh.svg b/data/icons/refresh.svg index bdeefb4..5d95ec4 100644 --- a/data/icons/refresh.svg +++ b/data/icons/refresh.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/signal0.svg b/data/icons/signal0.svg index ecbd6bc..95f57e1 100644 --- a/data/icons/signal0.svg +++ b/data/icons/signal0.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/signal1.svg b/data/icons/signal1.svg index 527cc6a..98f34a2 100644 --- a/data/icons/signal1.svg +++ b/data/icons/signal1.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/signal2.svg b/data/icons/signal2.svg index 30e3176..3926a7b 100644 --- a/data/icons/signal2.svg +++ b/data/icons/signal2.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/signal3.svg b/data/icons/signal3.svg index 554b638..cc270f9 100644 --- a/data/icons/signal3.svg +++ b/data/icons/signal3.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/data/icons/signal4.svg b/data/icons/signal4.svg index 7cd931e..5342b69 100644 --- a/data/icons/signal4.svg +++ b/data/icons/signal4.svg @@ -1,5 +1 @@ - - - \ No newline at end of file + \ No newline at end of file From 26f56e8ca66ff579ffd4687c5556cb4cd05d3934 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:37:49 +0100 Subject: [PATCH 14/44] add(documentation): development notes added --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/README.md b/README.md index a4a913d..cfe1b81 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,44 @@ You have to short-circuit `R0` on the RS485 boards to enable the termination res --- +## 🧑‍💻 Development + +### Required tools + +- `ESP-IDF` (includes `idf.py`) +- `Python 3` +- `invoke` (for project tasks) +- Optional but recommended formatters: + - `clang-format` + - `black` + - `prettier` + - `svgo` + - `nixfmt` + +### Environment setup + +This repository includes a `flake.nix` with a ready-to-use development shell. + +```bash +nix develop +``` + +Alternatively, you can use `direnv` to automatically enter the development shell when you `cd` into the project directory. + +Without Nix, install ESP-IDF and Python dependencies manually (especially `invoke`) and ensure `idf.py` is available in your shell. + +Run `invoke --list` to see all available tasks. + +Examples: + +```bash +invoke flash +invoke reset +invoke config +``` + +--- + ## 📦 Case All print files (STL, STEP, X_T) can be found in [assets/case](/assets/case/). Alternatively you can view the project on [OnShape](https://cad.onshape.com/documents/7363818fd18bf0cbf094790e/w/52455282b39e47fbde5d0e53/e/9bec98aa83a813dc9a4d6ab2) where you can export the files in a format you like. From 732046b15e7b49fd51d736770ebc4a664a946333 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 6 Mar 2026 11:26:47 +0100 Subject: [PATCH 15/44] add(pre-commit): add configuration files for pre-commit, markdownlint, and codespell; update README with setup instructions --- .clang-format | 7 +++ .codespellignore | 9 ++++ .markdownlint.json | 32 +++++++++++++ .pre-commit-config.yaml | 101 ++++++++++++++++++++++++++++++++++++++++ README.md | 28 ++++++++--- flake.nix | 8 ++-- tasks.py | 75 +++++++---------------------- 7 files changed, 191 insertions(+), 69 deletions(-) create mode 100644 .codespellignore create mode 100644 .markdownlint.json create mode 100644 .pre-commit-config.yaml diff --git a/.clang-format b/.clang-format index f6b8fdf..b4d7ff9 100644 --- a/.clang-format +++ b/.clang-format @@ -1,2 +1,9 @@ --- BasedOnStyle: LLVM + +# Include sorting +SortIncludes: true + +# Spacing +MaxEmptyLinesToKeep: 2 +SeparateDefinitionBlocks: Always diff --git a/.codespellignore b/.codespellignore new file mode 100644 index 0000000..c714049 --- /dev/null +++ b/.codespellignore @@ -0,0 +1,9 @@ +# Words that codespell should ignore +# Add common false positives here +inout +uart +dout +din +Tage +alle +Aktion diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..c64c8c2 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,32 @@ +{ + "default": true, + "MD013": { + "line_length": 300, + "tables": true, + "code_blocks": true + }, + "MD033": false, + "MD012": { + "maximum": 2 + }, + "MD026": { + "punctuation": ".,;:!" + }, + "MD024": { + "siblings_only": false + }, + "MD029": { + "style": "ordered" + }, + "MD046": { + "style": "fenced" + }, + "MD049": { + "style": "underscore" + }, + "MD050": { + "style": "asterisk" + }, + "MD052": false, + "MD053": false +} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..b413fa2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,101 @@ +# yaml-language-server: $schema=https://json.schemastore.org/pre-commit-config.json + +# Global exclude pattern for build artifacts and dependencies +exclude: | + (?x)^( + build/| + managed_components/| + .*\.bin| + .*\.elf| + .*\.hex| + .*\.o| + flake.lock| + dependencies.lock| + assets/case/ + ) + +repos: + # General file checks + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + # Line ending checks + - id: end-of-file-fixer + - id: fix-byte-order-marker + - id: mixed-line-ending + args: [--fix=lf] + + # Whitespace & formatting + - id: trailing-whitespace + + # File format checks + - id: check-added-large-files + args: [--maxkb=1000] + - id: check-ast + - id: check-case-conflict + - id: check-docstring-first + - id: check-json + - id: check-merge-conflict + - id: detect-private-key + - id: debug-statements + + - repo: https://github.com/asottile/pyupgrade + rev: v3.21.2 + hooks: + - id: pyupgrade + args: [--py38-plus] + + # Spell checking + - repo: https://github.com/codespell-project/codespell + rev: v2.4.2 + hooks: + - id: codespell + args: [--ignore-words=.codespellignore] + + # YAML linting + - repo: https://github.com/adrienverge/yamllint + rev: v1.37.1 + hooks: + - id: yamllint + args: + [ + --strict, + -d, + "{extends: default, rules: {line-length: {max: 120}, document-start: disable}}", + ] + + # Markdown linting + - repo: https://github.com/DavidAnson/markdownlint-cli2 + rev: v0.17.1 + hooks: + - id: markdownlint-cli2 + + # Python formatting + - repo: https://github.com/psf/black + rev: 26.1.0 + hooks: + - id: black + language_version: python3 + args: [--quiet] + + # JavaScript/JSON/CSS/HTML/YAML formatting and C/C++ formatting + - repo: local + hooks: + - id: prettier + name: prettier + entry: prettier + language: system + types_or: [javascript, jsx, json, css, scss, html, yaml] + exclude: \.md$ + args: [--write, --ignore-unknown] + - id: clang-format + name: clang-format + entry: clang-format + language: system + types_or: [c, c++] + args: [-i] + - id: nixfmt + name: nixfmt + entry: nixfmt + language: system + types: [nix] diff --git a/README.md b/README.md index cfe1b81..00955ed 100644 --- a/README.md +++ b/README.md @@ -70,14 +70,14 @@ You have to short-circuit `R0` on the RS485 boards to enable the termination res ### Required tools - `ESP-IDF` (includes `idf.py`) -- `Python 3` - `invoke` (for project tasks) -- Optional but recommended formatters: - - `clang-format` - - `black` - - `prettier` - - `svgo` - - `nixfmt` + +- Optional but recommended for development: + - `pre-commit` (for code quality hooks) + - `clang-format` (C/C++) + - `prettier` (JavaScript/CSS/HTML/YAML) + - `svgo` (SVG optimization) + - `nixfmt` (Nix formatting) ### Environment setup @@ -101,6 +101,20 @@ invoke reset invoke config ``` +### Pre-commit hooks + +This project uses [pre-commit](https://pre-commit.com/) to automatically check code quality, formatting, and common mistakes before committing. + +**Setup:** + +```bash +# Install pre-commit hooks +pre-commit install + +# Optionally, run all hooks on all files +pre-commit run --all-files +``` + --- ## 📦 Case diff --git a/flake.nix b/flake.nix index 0791d12..4b7ff81 100644 --- a/flake.nix +++ b/flake.nix @@ -24,11 +24,11 @@ pkgs.python3 pkgs.python3Packages.invoke - # Formatting tools + pkgs.pre-commit pkgs.clang-tools - pkgs.nodePackages.prettier - pkgs.nodePackages.svgo - pkgs.black + pkgs.svgo + pkgs.prettier + pkgs.nixfmt ]; }; diff --git a/tasks.py b/tasks.py index d782c10..536824a 100644 --- a/tasks.py +++ b/tasks.py @@ -46,7 +46,14 @@ def clean(c): @task def config(c): """Open menuconfig to edit project settings""" - c.run("idf.py menuconfig --color-scheme=monochrome", pty=True) + is_windows = os.name == "nt" + if is_windows: + # Windows doesn't provide a POSIX pty, not sure how to open menuconfig interactive + print( + "Please run 'idf.py menuconfig' directly in the terminal to edit project settings. This option is not supported in the invoke task on Windows." + ) + else: + c.run("idf.py menuconfig --color-scheme=monochrome", pty=True) @task @@ -76,66 +83,18 @@ def reset(c): @task def format(c): - """Format all source files with clang-format, black, prettier, nixfmt, and svgo""" - missing_tools = [] - - print("Formatting C files...") - result = c.run( - "find main components -name '*.c' -o -name '*.h' | xargs clang-format -i", + """Format all source files using pre-commit hooks and optimize SVGs""" + print("\nOptimizing SVG files...") + c.run( + "find . -name '*.svg' -not -path './build/*' -not -path './managed_components/*' | xargs -r svgo --quiet --final-newline", warn=True, - hide=False, ) - if result.exited == 127 or (not result.ok and result.exited != 0): - # Check if tool exists - check = c.run("command -v clang-format", warn=True, hide=True) - if not check.ok: - missing_tools.append("clang-format") - - print("Formatting Python files...") - result = c.run("black tasks.py", warn=True, hide=False) - if result.exited == 127 or (not result.ok and result.exited != 0): - check = c.run("command -v black", warn=True, hide=True) - if not check.ok: - missing_tools.append("black") - - print("Formatting Nix files...") - result = c.run("nixfmt flake.nix", warn=True, hide=False) - if result.exited == 127 or (not result.ok and result.exited != 0): - check = c.run("command -v nixfmt", warn=True, hide=True) - if not check.ok: - missing_tools.append("nixfmt") - - print("Formatting SVG files...") - result = c.run( - "find . -name '*.svg' -not -path './build/*' -not -path './managed_components/*' | xargs -r svgo", - warn=True, - hide=False, - ) - if result.exited == 127 or (not result.ok and result.exited != 0): - check = c.run("command -v svgo", warn=True, hide=True) - if not check.ok: - missing_tools.append("svgo") - - print("Formatting other files...") - result = c.run( - "prettier --write '**/*.{js,json,yaml,yml,md,html,css}'", warn=True, hide=False - ) - if result.exited == 127 or (not result.ok and result.exited != 0): - check = c.run("command -v prettier", warn=True, hide=True) - if not check.ok: - missing_tools.append("prettier") - - if missing_tools: - print("\n" + "=" * 60) - print(f"❌ ERROR: Missing formatting tools: {', '.join(missing_tools)}") - print("=" * 60) - print("Please install them or reload the nix-shell.") - print("=" * 60 + "\n") - sys.exit(1) + is_windows = os.name == "nt" + if is_windows: + # Windows doesn't provide a POSIX pty + c.run("pre-commit run --all-files") else: - print("\n" + "=" * 60) - print("✅ All files formatted successfully!") - print("=" * 60 + "\n") + c.run("pre-commit run --all-files", pty=True) @task From 8cee7b95facca4eaaaf66bc3dfad66ffb12db949 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 6 Mar 2026 11:29:53 +0100 Subject: [PATCH 16/44] chore(format): reformat files with new setup --- .envrc | 1 - assets/circuit/diagram.svg | 2 +- assets/design/favicon.svg | 2 +- assets/design/social.svg | 2 +- components/dmx/CMakeLists.txt | 2 +- components/dmx/include/dmx.h | 2 +- data/icons/close.svg | 2 +- data/icons/hotspot.svg | 2 +- data/icons/lan.svg | 2 +- data/icons/open.svg | 2 +- data/icons/refresh.svg | 2 +- data/icons/signal0.svg | 2 +- data/icons/signal1.svg | 2 +- data/icons/signal2.svg | 2 +- data/icons/signal3.svg | 2 +- data/icons/signal4.svg | 2 +- main/CMakeLists.txt | 1 - 17 files changed, 15 insertions(+), 17 deletions(-) diff --git a/.envrc b/.envrc index c046f76..9bc110d 100644 --- a/.envrc +++ b/.envrc @@ -4,4 +4,3 @@ if command -v nix &> /dev/null; then else echo "Nix not found, skipping flake support" fi - diff --git a/assets/circuit/diagram.svg b/assets/circuit/diagram.svg index 9097416..73df9af 100644 --- a/assets/circuit/diagram.svg +++ b/assets/circuit/diagram.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/design/favicon.svg b/assets/design/favicon.svg index 71ea926..cfab809 100644 --- a/assets/design/favicon.svg +++ b/assets/design/favicon.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/design/social.svg b/assets/design/social.svg index eb5ed4a..9666bf1 100644 --- a/assets/design/social.svg +++ b/assets/design/social.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/components/dmx/CMakeLists.txt b/components/dmx/CMakeLists.txt index 8d0e35a..7b3abdc 100644 --- a/components/dmx/CMakeLists.txt +++ b/components/dmx/CMakeLists.txt @@ -1 +1 @@ -idf_component_register(SRCS "src/dmx.c" INCLUDE_DIRS "include") \ No newline at end of file +idf_component_register(SRCS "src/dmx.c" INCLUDE_DIRS "include") diff --git a/components/dmx/include/dmx.h b/components/dmx/include/dmx.h index af80ff8..cd74574 100644 --- a/components/dmx/include/dmx.h +++ b/components/dmx/include/dmx.h @@ -6,4 +6,4 @@ extern "C" { #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/data/icons/close.svg b/data/icons/close.svg index 9e5a566..9c4645b 100644 --- a/data/icons/close.svg +++ b/data/icons/close.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/hotspot.svg b/data/icons/hotspot.svg index 2308bb3..cac14cc 100644 --- a/data/icons/hotspot.svg +++ b/data/icons/hotspot.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/lan.svg b/data/icons/lan.svg index de824d9..69c6a5c 100644 --- a/data/icons/lan.svg +++ b/data/icons/lan.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/open.svg b/data/icons/open.svg index 069e038..e00a27b 100644 --- a/data/icons/open.svg +++ b/data/icons/open.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/refresh.svg b/data/icons/refresh.svg index 5d95ec4..979887c 100644 --- a/data/icons/refresh.svg +++ b/data/icons/refresh.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/signal0.svg b/data/icons/signal0.svg index 95f57e1..09d082a 100644 --- a/data/icons/signal0.svg +++ b/data/icons/signal0.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/signal1.svg b/data/icons/signal1.svg index 98f34a2..8d12a61 100644 --- a/data/icons/signal1.svg +++ b/data/icons/signal1.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/signal2.svg b/data/icons/signal2.svg index 3926a7b..c846528 100644 --- a/data/icons/signal2.svg +++ b/data/icons/signal2.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/signal3.svg b/data/icons/signal3.svg index cc270f9..d973c98 100644 --- a/data/icons/signal3.svg +++ b/data/icons/signal3.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/data/icons/signal4.svg b/data/icons/signal4.svg index 5342b69..8a1100a 100644 --- a/data/icons/signal4.svg +++ b/data/icons/signal4.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 27cbf72..836026c 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,4 +1,3 @@ idf_component_register(SRCS "dmx-interface.c" INCLUDE_DIRS "." REQUIRES web_server) - From 7a621d4731c1b9b2eb7ced8ec92490887be4c2f8 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:26:09 +0100 Subject: [PATCH 17/44] add(workflow): create check workflow for linting and building --- .github/workflows/check.yml | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/check.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..6f316af --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,45 @@ +name: check + +"on": + workflow_dispatch: {} + push: + branches: ["main"] + pull_request: + branches: ["**"] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Run pre-commit from flake devShell + run: | + # use the flake devShell defined in ./flake.nix (x86_64 runner) + nix develop --command pre-commit run --all-files + shell: bash + + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Run build from flake devShell + run: | + # use the flake devShell defined in ./flake.nix (x86_64 runner) + nix develop --command invoke build + shell: bash From c362172cdbff463c01dc0f7e0feb7c15b3762f56 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 6 Mar 2026 14:45:06 +0100 Subject: [PATCH 18/44] add(action): create composite action to install Nix with flakes enabled --- .github/actions/install-nix/action.yml | 19 +++++++++++++++++++ .github/workflows/check.yml | 20 ++++---------------- 2 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 .github/actions/install-nix/action.yml diff --git a/.github/actions/install-nix/action.yml b/.github/actions/install-nix/action.yml new file mode 100644 index 0000000..60d3444 --- /dev/null +++ b/.github/actions/install-nix/action.yml @@ -0,0 +1,19 @@ +name: install-nix +description: Composite action to checkout the repo and install Nix with flakes enabled +runs: + using: composite + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Prewarm flake devShell + run: | + # use the flake devShell defined in ./flake.nix to fetch deps + nix develop --command true + shell: bash diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 6f316af..4f3f22e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,14 +11,8 @@ jobs: lint: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes + - name: Setup checkout + Nix + uses: ./.github/actions/install-nix - name: Run pre-commit from flake devShell run: | @@ -29,14 +23,8 @@ jobs: build: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes + - name: Setup checkout + Nix + uses: ./.github/actions/install-nix - name: Run build from flake devShell run: | From 198c835c5030a3fd80084712542cfc191a556c77 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 6 Mar 2026 14:49:23 +0100 Subject: [PATCH 19/44] fix(workflow): checkout before local action and remove nested checkout Add top-level `actions/checkout` to jobs so local action files are available, and remove redundant checkout from `install-nix` composite action. Prewarm flake devShell remains in the action. --- .github/actions/install-nix/action.yml | 12 ++++++++++-- .github/workflows/check.yml | 6 ++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/actions/install-nix/action.yml b/.github/actions/install-nix/action.yml index 60d3444..f023cc4 100644 --- a/.github/actions/install-nix/action.yml +++ b/.github/actions/install-nix/action.yml @@ -3,8 +3,16 @@ description: Composite action to checkout the repo and install Nix with flakes e runs: using: composite steps: - - name: Checkout - uses: actions/checkout@v5 + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + - name: Prewarm flake devShell + run: | + # use the flake devShell defined in ./flake.nix to fetch deps + nix develop --command true + shell: bash - name: Install Nix uses: cachix/install-nix-action@v31 diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4f3f22e..2cfcd9a 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,6 +11,9 @@ jobs: lint: runs-on: ubuntu-latest steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Setup checkout + Nix uses: ./.github/actions/install-nix @@ -23,6 +26,9 @@ jobs: build: runs-on: ubuntu-latest steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Setup checkout + Nix uses: ./.github/actions/install-nix From e576348974fce274381baec75f8556dbfb292f3d Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:07:46 +0100 Subject: [PATCH 20/44] refactor(action): update description and improve step names in install-nix action --- .github/actions/install-nix/action.yml | 21 +++++---------------- .github/workflows/check.yml | 12 ++++++------ 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/.github/actions/install-nix/action.yml b/.github/actions/install-nix/action.yml index f023cc4..778cf99 100644 --- a/.github/actions/install-nix/action.yml +++ b/.github/actions/install-nix/action.yml @@ -1,27 +1,16 @@ name: install-nix -description: Composite action to checkout the repo and install Nix with flakes enabled +description: Install Nix with flakes enabled and pre-warm the repository's flake devShell runs: using: composite steps: - - name: Install Nix + - name: Install Nix (with flakes) uses: cachix/install-nix-action@v31 with: extra_nix_config: | experimental-features = nix-command flakes - - name: Prewarm flake devShell + - name: Pre-warm flake devShell run: | - # use the flake devShell defined in ./flake.nix to fetch deps - nix develop --command true - shell: bash - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Prewarm flake devShell - run: | - # use the flake devShell defined in ./flake.nix to fetch deps + # Use the repository's `flake.nix` devShell to fetch dependencies. + # This speeds up later `nix develop` invocations in workflow steps. nix develop --command true shell: bash diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 2cfcd9a..5a86bd7 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,29 +11,29 @@ jobs: lint: runs-on: ubuntu-latest steps: - - name: Checkout + - name: Checkout repository uses: actions/checkout@v5 - - name: Setup checkout + Nix + - name: Install Nix and pre-warm flake devShell uses: ./.github/actions/install-nix - name: Run pre-commit from flake devShell run: | - # use the flake devShell defined in ./flake.nix (x86_64 runner) + # Use the flake devShell defined in ./flake.nix (x86_64 runner) nix develop --command pre-commit run --all-files shell: bash build: runs-on: ubuntu-latest steps: - - name: Checkout + - name: Checkout repository uses: actions/checkout@v5 - - name: Setup checkout + Nix + - name: Install Nix and pre-warm flake devShell uses: ./.github/actions/install-nix - name: Run build from flake devShell run: | - # use the flake devShell defined in ./flake.nix (x86_64 runner) + # Use the flake devShell defined in ./flake.nix (x86_64 runner) nix develop --command invoke build shell: bash From 9a11453fbc47077256d24b4996e25da137ab6851 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Sat, 7 Mar 2026 16:52:23 +0100 Subject: [PATCH 21/44] fix(config): enable USB CDC in sdkconfig.defaults --- sdkconfig.defaults | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdkconfig.defaults b/sdkconfig.defaults index c7b8c5d..8f61fa8 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -1,6 +1,7 @@ # This file was generated using idf.py save-defconfig. It can be edited manually. # Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Minimal Configuration # +CONFIG_IDF_TARGET="esp32s2" CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_IDF_TARGET="esp32s2" +CONFIG_ESP_CONSOLE_USB_CDC=y From a2d51540b7930573b7782723a1ac6782d18db639 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Sat, 7 Mar 2026 21:02:31 +0100 Subject: [PATCH 22/44] feat(logger): add logging macros for consistent logging across components --- components/logger/CMakeLists.txt | 1 + components/logger/include/logger.h | 43 ++++++++++++++++++++++++++ components/storage/CMakeLists.txt | 2 +- components/storage/src/storage.c | 18 +++++------ components/web_server/CMakeLists.txt | 2 +- components/web_server/src/web_server.c | 35 ++++++++++----------- components/web_server/src/wifi.c | 9 +++--- 7 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 components/logger/CMakeLists.txt create mode 100644 components/logger/include/logger.h diff --git a/components/logger/CMakeLists.txt b/components/logger/CMakeLists.txt new file mode 100644 index 0000000..eafb7ac --- /dev/null +++ b/components/logger/CMakeLists.txt @@ -0,0 +1 @@ +idf_component_register(INCLUDE_DIRS include) diff --git a/components/logger/include/logger.h b/components/logger/include/logger.h new file mode 100644 index 0000000..8090718 --- /dev/null +++ b/components/logger/include/logger.h @@ -0,0 +1,43 @@ + +/** + * @file logger.h + * @brief Project-wide logging macros based on ESP-IDF's logging library. + * + * This header provides a set of simple logging macros (LOGE, LOGW, LOGI, etc.) + * that wrap the underlying ESP-IDF logging functions (esp_log_e, esp_log_w, + * etc.). + * + * @section usage Usage + * To use these macros, a `LOG_TAG` should be defined before including this + * header. The `LOG_TAG` is a string that identifies the source of the log + * messages, typically the component or file name. If `LOG_TAG` is not defined, + * a default tag "CHAOS" will be used. + * + * @example + * #define LOG_TAG "MY_COMPONENT" + * #include "logger.h" + * + * void my_function() { + * LOGI("This is an informational message."); + * LOGE("This is an error message with a value: %d", 42); + * } + */ + +#pragma once + +#include "esp_log.h" + +#ifndef LOG_TAG +#define LOG_TAG "CHAOS" +#endif + +/** @brief Log a message at Error level. */ +#define LOGE(...) ESP_LOGE(LOG_TAG, __VA_ARGS__) +/** @brief Log a message at Warning level. */ +#define LOGW(...) ESP_LOGW(LOG_TAG, __VA_ARGS__) +/** @brief Log a message at Info level. */ +#define LOGI(...) ESP_LOGI(LOG_TAG, __VA_ARGS__) +/** @brief Log a message at Debug level. */ +#define LOGD(...) ESP_LOGD(LOG_TAG, __VA_ARGS__) +/** @brief Log a message at Verbose level. */ +#define LOGV(...) ESP_LOGV(LOG_TAG, __VA_ARGS__) diff --git a/components/storage/CMakeLists.txt b/components/storage/CMakeLists.txt index 9863d29..2cb9d94 100644 --- a/components/storage/CMakeLists.txt +++ b/components/storage/CMakeLists.txt @@ -2,5 +2,5 @@ idf_component_register( SRCS "src/storage.c" INCLUDE_DIRS "include" REQUIRES joltwallet__littlefs - PRIV_REQUIRES vfs + PRIV_REQUIRES vfs logger ) diff --git a/components/storage/src/storage.c b/components/storage/src/storage.c index 478539a..5e40fc3 100644 --- a/components/storage/src/storage.c +++ b/components/storage/src/storage.c @@ -1,10 +1,10 @@ +#define LOG_TAG "STORE" + #include "storage.h" - #include "esp_littlefs.h" -#include "esp_log.h" #include "esp_vfs.h" +#include "logger.h" -static const char *TAG = "STORAGE"; static const char *LITTLEFS_MOUNT_POINT = "/data"; esp_err_t storage_init(void) { @@ -19,11 +19,11 @@ esp_err_t storage_init(void) { if (ret != ESP_OK) { if (ret == ESP_FAIL) { - ESP_LOGE(TAG, "Failed to mount LittleFS or format filesystem"); + LOGE("Failed to mount LittleFS or format filesystem"); } else if (ret == ESP_ERR_INVALID_STATE) { - ESP_LOGE(TAG, "ESP_ERR_INVALID_STATE"); + LOGE("ESP_ERR_INVALID_STATE"); } else { - ESP_LOGE(TAG, "Failed to initialize LittleFS: %s", esp_err_to_name(ret)); + LOGE("Failed to initialize LittleFS: %s", esp_err_to_name(ret)); } return ret; } @@ -31,10 +31,10 @@ esp_err_t storage_init(void) { size_t total = 0, used = 0; ret = esp_littlefs_info(conf.partition_label, &total, &used); if (ret == ESP_OK) { - ESP_LOGI(TAG, "LittleFS mounted at %s. Total: %d bytes, Used: %d bytes", - LITTLEFS_MOUNT_POINT, total, used); + LOGI("LittleFS mounted at %s. Total: %d bytes, Used: %d bytes", + LITTLEFS_MOUNT_POINT, total, used); } else { - ESP_LOGE(TAG, "Failed to get LittleFS information"); + LOGE("Failed to get LittleFS information"); } return ESP_OK; diff --git a/components/web_server/CMakeLists.txt b/components/web_server/CMakeLists.txt index 88bb425..080d042 100644 --- a/components/web_server/CMakeLists.txt +++ b/components/web_server/CMakeLists.txt @@ -3,5 +3,5 @@ idf_component_register( "src/wifi.c" INCLUDE_DIRS "include" REQUIRES esp_http_server storage - PRIV_REQUIRES freertos esp_wifi esp_event esp_netif nvs_flash + PRIV_REQUIRES freertos esp_wifi esp_event esp_netif nvs_flash logger ) diff --git a/components/web_server/src/web_server.c b/components/web_server/src/web_server.c index 38b050c..9d25638 100644 --- a/components/web_server/src/web_server.c +++ b/components/web_server/src/web_server.c @@ -1,3 +1,5 @@ +#define LOG_TAG "WEBSRV" + #include "web_server.h" #include @@ -6,13 +8,11 @@ #include #include "esp_err.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "logger.h" #include "storage.h" -static const char *TAG = "WEBSERVER"; - // Default configuration values #define WEBSERVER_DEFAULT_PORT 80 #define WEBSERVER_DEFAULT_MAX_HANDLERS 32 @@ -77,7 +77,7 @@ static esp_err_t static_file_handler(httpd_req_t *req) { FILE *f = fopen(filepath, "r"); if (!f) { - ESP_LOGW(TAG, "File not found: %s", filepath); + LOGW("File not found: %s", filepath); httpd_resp_send_404(req); return ESP_OK; } @@ -91,7 +91,7 @@ static esp_err_t static_file_handler(httpd_req_t *req) { size_t read_len; while ((read_len = fread(buf, 1, sizeof(buf), f)) > 0) { if (httpd_resp_send_chunk(req, buf, read_len) != ESP_OK) { - ESP_LOGW(TAG, "Failed to send data chunk for %s", filepath); + LOGW("Failed to send data chunk for %s", filepath); break; } } @@ -116,27 +116,27 @@ static esp_err_t health_check_handler(httpd_req_t *req) { */ static void webserver_task(void *arg) { (void)arg; // Unused parameter - ESP_LOGI(TAG, "Web server task started"); + LOGI("Web server task started"); // Keep task alive - the server runs in the background while (s_server_handle != NULL) { vTaskDelay(pdMS_TO_TICKS(10000)); // 10 second check interval } - ESP_LOGI(TAG, "Web server task ending"); + LOGI("Web server task ending"); vTaskDelete(NULL); } httpd_handle_t webserver_start(const webserver_config_t *config) { if (s_server_handle != NULL) { - ESP_LOGW(TAG, "Web server already running"); + LOGW("Web server already running"); return s_server_handle; } // Initialize LittleFS esp_err_t ret = storage_init(); if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to initialize storage"); + LOGE("Failed to initialize storage"); return NULL; } @@ -163,12 +163,12 @@ httpd_handle_t webserver_start(const webserver_config_t *config) { // Start HTTP server ret = httpd_start(&s_server_handle, &http_config); if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to start HTTP server: %s", esp_err_to_name(ret)); + LOGE("Failed to start HTTP server: %s", esp_err_to_name(ret)); s_server_handle = NULL; return NULL; } - ESP_LOGI(TAG, "HTTP server started on port %d", port); + LOGI("HTTP server started on port %d", port); // Register default handlers // Health check endpoint @@ -197,13 +197,13 @@ httpd_handle_t webserver_start(const webserver_config_t *config) { &s_server_task_handle); if (task_ret != pdPASS) { - ESP_LOGE(TAG, "Failed to create web server task"); + LOGE("Failed to create web server task"); httpd_stop(s_server_handle); s_server_handle = NULL; return NULL; } - ESP_LOGI(TAG, "Web server initialized successfully"); + LOGI("Web server initialized successfully"); return s_server_handle; } @@ -221,7 +221,7 @@ void webserver_stop(httpd_handle_t server) { s_server_task_handle = NULL; } - ESP_LOGI(TAG, "Web server stopped"); + LOGI("Web server stopped"); } esp_err_t webserver_register_handler(httpd_handle_t server, @@ -232,11 +232,10 @@ esp_err_t webserver_register_handler(httpd_handle_t server, esp_err_t ret = httpd_register_uri_handler(server, uri_handler); if (ret == ESP_OK) { - ESP_LOGI(TAG, "Registered handler: %s [%d]", uri_handler->uri, - uri_handler->method); + LOGI("Registered handler: %s [%d]", uri_handler->uri, uri_handler->method); } else { - ESP_LOGE(TAG, "Failed to register handler %s: %s", uri_handler->uri, - esp_err_to_name(ret)); + LOGE("Failed to register handler %s: %s", uri_handler->uri, + esp_err_to_name(ret)); } return ret; diff --git a/components/web_server/src/wifi.c b/components/web_server/src/wifi.c index 3ca0516..222592f 100644 --- a/components/web_server/src/wifi.c +++ b/components/web_server/src/wifi.c @@ -1,14 +1,15 @@ +#define LOG_TAG "WIFI" + #include "wifi.h" #include #include "esp_event.h" -#include "esp_log.h" #include "esp_netif.h" #include "esp_wifi.h" +#include "logger.h" #include "nvs_flash.h" -static const char *TAG = "WIFI"; static bool s_wifi_started = false; esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, @@ -69,7 +70,7 @@ esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, ESP_ERROR_CHECK(esp_wifi_start()); s_wifi_started = true; - ESP_LOGI(TAG, "WiFi AP started: SSID=%s channel=%u", ssid, channel); + LOGI("WiFi AP started: SSID=%s channel=%u", ssid, channel); return ESP_OK; } @@ -81,5 +82,5 @@ void wifi_stop_ap(void) { esp_wifi_stop(); esp_wifi_deinit(); s_wifi_started = false; - ESP_LOGI(TAG, "WiFi AP stopped"); + LOGI("WiFi AP stopped"); } From fe6a1ab79b2a7c1b3b3775a1e1a002609ba5a86a Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Sun, 15 Mar 2026 19:39:48 +0100 Subject: [PATCH 23/44] feat(docs): add Doxygen configuration and update .gitignore for documentation files --- .gitignore | 3 +++ Doxyfile | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 2 ++ tasks.py | 19 +++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 Doxyfile diff --git a/.gitignore b/.gitignore index 5bd8a41..9c096f7 100755 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,9 @@ venv*/ *.tmp *.bak +# Documentation +docs/doxygen/* + # Misc *.local diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..d6d5211 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,61 @@ +PROJECT_NAME = "DMX-Interface" +PROJECT_BRIEF = "ChaosDMX" +OUTPUT_DIRECTORY = docs/doxygen + +# Input settings + +INPUT = main \ + components \ + data \ + README.md +FILE_PATTERNS = *.c *.h *.cpp *.hpp *.md *.py *.js *.css *.html +RECURSIVE = YES +EXCLUDE_PATTERNS = */build/* \ + */managed_components/* +USE_MDFILE_AS_MAINPAGE = README.md + +# Documentation settings +GENERATE_LATEX = NO +GENERATE_HTML = YES + +# doxygen-awesome-css settings +HTML_EXTRA_STYLESHEET = docs/external/doxygen-awesome-css/doxygen-awesome.css \ + docs/external/doxygen-awesome-css/doxygen-awesome-sidebar-only.css + +HTML_EXTRA_FILES = docs/external/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js \ + docs/external/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js \ + docs/external/doxygen-awesome-css/doxygen-awesome-paragraph-link.js \ + docs/external/doxygen-awesome-css/doxygen-awesome-interactive-toc.js \ + docs/external/doxygen-awesome-css/doxygen-awesome-tabs.js + +# Custom header for JS integration + +# Better HTML output +HTML_COLORSTYLE = LIGHT +GENERATE_TREEVIEW = YES +DISABLE_INDEX = NO +FULL_SIDEBAR = NO + +# Extraction settings +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES + +# Graphviz / Dot settings +HAVE_DOT = YES +DOT_IMAGE_FORMAT = svg +INTERACTIVE_SVG = YES +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 10 + +# Graphs to generate +CALL_GRAPH = YES +CALLER_GRAPH = YES +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES diff --git a/flake.nix b/flake.nix index 4b7ff81..5740a76 100644 --- a/flake.nix +++ b/flake.nix @@ -30,6 +30,8 @@ pkgs.prettier pkgs.nixfmt + pkgs.doxygen + pkgs.graphviz ]; }; }; diff --git a/tasks.py b/tasks.py index 536824a..4a97f11 100644 --- a/tasks.py +++ b/tasks.py @@ -149,3 +149,22 @@ def format_check(c): sys.exit(1) print("\n✅ All files are correctly formatted!") + + +@task(help={"o": "Open documentation in the default browser after generation."}) +def docs(c, o=False): + """Generate Doxygen documentation.""" + task_begin("docs", "Docs") + proc = subprocess.run("doxygen Doxyfile", shell=True) + if proc.returncode == 0: + task_end("docs", "done", "Docs generated") + path = "docs/doxygen/html/index.html" + console.print( + f"\n[bold green]✓ Documentation generated in {path}[/bold green]" + ) + if o: + import webbrowser + webbrowser.open(f"file://{os.path.abspath(path)}") + return + task_end("docs", "failed", "Doxygen failed") + raise Exit(code=1) From 7d2647b65615c513851fc1dad60d08ceb236d35d Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Sun, 15 Mar 2026 20:02:14 +0100 Subject: [PATCH 24/44] fix(docs): fix tasks.py --- tasks.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tasks.py b/tasks.py index 4a97f11..e97fe48 100644 --- a/tasks.py +++ b/tasks.py @@ -1,7 +1,9 @@ from invoke import task import os import shutil +import subprocess import sys +import webbrowser @task @@ -154,17 +156,11 @@ def format_check(c): @task(help={"o": "Open documentation in the default browser after generation."}) def docs(c, o=False): """Generate Doxygen documentation.""" - task_begin("docs", "Docs") proc = subprocess.run("doxygen Doxyfile", shell=True) if proc.returncode == 0: - task_end("docs", "done", "Docs generated") path = "docs/doxygen/html/index.html" - console.print( - f"\n[bold green]✓ Documentation generated in {path}[/bold green]" - ) + print(f"\n✓ Documentation generated in {path}") if o: - import webbrowser webbrowser.open(f"file://{os.path.abspath(path)}") return - task_end("docs", "failed", "Doxygen failed") raise Exit(code=1) From daa5e2e2b3edcdf0b6629fee7d6ca68c8375cc3f Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Sun, 15 Mar 2026 20:13:25 +0100 Subject: [PATCH 25/44] fix(docs): add doxygen-awesome-css submodule for documentation styling --- .gitmodules | 3 +++ docs/external/doxygen-awesome-css | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 docs/external/doxygen-awesome-css diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3362621 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "docs/external/doxygen-awesome-css"] + path = docs/external/doxygen-awesome-css + url = https://github.com/jothepro/doxygen-awesome-css diff --git a/docs/external/doxygen-awesome-css b/docs/external/doxygen-awesome-css new file mode 160000 index 0000000..1f36200 --- /dev/null +++ b/docs/external/doxygen-awesome-css @@ -0,0 +1 @@ +Subproject commit 1f3620084ff75734ed192101acf40e9dff01d848 From 1502c0b38ff524db2e5447b7b73373cf18c44d8c Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Sun, 15 Mar 2026 21:04:02 +0100 Subject: [PATCH 26/44] fix(tasks): remove SVG optimization from format task documentation --- lib/ArtNet | 1 + lib/AsyncWebServer_ESP32_W5500 | 1 + tasks.py | 8 ++------ 3 files changed, 4 insertions(+), 6 deletions(-) create mode 160000 lib/ArtNet create mode 160000 lib/AsyncWebServer_ESP32_W5500 diff --git a/lib/ArtNet b/lib/ArtNet new file mode 160000 index 0000000..5d9c42b --- /dev/null +++ b/lib/ArtNet @@ -0,0 +1 @@ +Subproject commit 5d9c42b531404ccfbcb14106d6312b03a166868a diff --git a/lib/AsyncWebServer_ESP32_W5500 b/lib/AsyncWebServer_ESP32_W5500 new file mode 160000 index 0000000..38de6ac --- /dev/null +++ b/lib/AsyncWebServer_ESP32_W5500 @@ -0,0 +1 @@ +Subproject commit 38de6ac248c7f270ca3b77ba38512ba39919aed8 diff --git a/tasks.py b/tasks.py index e97fe48..bc5e81f 100644 --- a/tasks.py +++ b/tasks.py @@ -85,12 +85,8 @@ def reset(c): @task def format(c): - """Format all source files using pre-commit hooks and optimize SVGs""" - print("\nOptimizing SVG files...") - c.run( - "find . -name '*.svg' -not -path './build/*' -not -path './managed_components/*' | xargs -r svgo --quiet --final-newline", - warn=True, - ) + """Format all source files using pre-commit hooks""" + is_windows = os.name == "nt" if is_windows: # Windows doesn't provide a POSIX pty From 523b285905d59e3aeeabc31714d4f1087afe1e1a Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Sun, 15 Mar 2026 21:07:21 +0100 Subject: [PATCH 27/44] fix(tasks): import Exit exception for error handling in tasks --- tasks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks.py b/tasks.py index bc5e81f..c5106d0 100644 --- a/tasks.py +++ b/tasks.py @@ -1,4 +1,5 @@ from invoke import task +from invoke.exceptions import Exit import os import shutil import subprocess From 2f8948954c6144fe6bdabb7c5c37b9f19d7df209 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Sun, 15 Mar 2026 21:53:48 +0100 Subject: [PATCH 28/44] remove outdated git submodules in lib --- lib/ArtNet | 1 - lib/AsyncWebServer_ESP32_W5500 | 1 - 2 files changed, 2 deletions(-) delete mode 160000 lib/ArtNet delete mode 160000 lib/AsyncWebServer_ESP32_W5500 diff --git a/lib/ArtNet b/lib/ArtNet deleted file mode 160000 index 5d9c42b..0000000 --- a/lib/ArtNet +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5d9c42b531404ccfbcb14106d6312b03a166868a diff --git a/lib/AsyncWebServer_ESP32_W5500 b/lib/AsyncWebServer_ESP32_W5500 deleted file mode 160000 index 38de6ac..0000000 --- a/lib/AsyncWebServer_ESP32_W5500 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 38de6ac248c7f270ca3b77ba38512ba39919aed8 From a42a0cafc6f070241d694ee2563bbc7014c0e233 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:48:31 +0100 Subject: [PATCH 29/44] refactor(tasks): remove format_check task --- tasks.py | 54 ------------------------------------------------------ 1 file changed, 54 deletions(-) diff --git a/tasks.py b/tasks.py index c5106d0..0c5fe52 100644 --- a/tasks.py +++ b/tasks.py @@ -96,60 +96,6 @@ def format(c): c.run("pre-commit run --all-files", pty=True) -@task -def format_check(c): - """Check if all files are formatted correctly""" - missing_tools = [] - format_errors = [] - - print("Checking C file formatting...") - result = c.run( - "find main components -name '*.c' -o -name '*.h' | xargs clang-format --dry-run --Werror", - warn=True, - ) - if result: - if result.return_code == 127: # Command not found - missing_tools.append("clang-format") - elif not result.ok: - format_errors.append("C files") - - print("Checking Python file formatting...") - result = c.run("black --check tasks.py", warn=True) - if result: - if result.return_code == 127: - missing_tools.append("black") - elif not result.ok: - format_errors.append("Python files") - - print("Checking Nix file formatting...") - result = c.run("nixfmt --check flake.nix", warn=True) - if result: - if result.return_code == 127: - missing_tools.append("nixfmt") - elif not result.ok: - format_errors.append("Nix files") - - print("Checking other file formatting...") - result = c.run("prettier --check '**/*.{js,json,yaml,yml,md,html,css}'", warn=True) - if result: - if result.return_code == 127: - missing_tools.append("prettier") - elif not result.ok: - format_errors.append("JS/JSON/YAML/HTML/CSS files") - - if missing_tools: - print(f"\n❌ ERROR: Missing formatting tools: {', '.join(missing_tools)}") - print("Please install them or reload the nix-shell.") - sys.exit(1) - - if format_errors: - print(f"\n❌ ERROR: Formatting issues in: {', '.join(format_errors)}") - print("Run 'invoke format' to fix them.") - sys.exit(1) - - print("\n✅ All files are correctly formatted!") - - @task(help={"o": "Open documentation in the default browser after generation."}) def docs(c, o=False): """Generate Doxygen documentation.""" From b13c7e6eb7d06e0faabc4e9e56ed19f61e3febd3 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:49:18 +0100 Subject: [PATCH 30/44] fix(prettier): add directories to ignore for generated code and git submodule --- .prettierignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.prettierignore b/.prettierignore index ad65d50..84199a1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,8 @@ # Ignore build artifacts and generated files build/ managed_components/ +docs/doxygen/ +docs/external/ .direnv/ *.lock From fb12c8c3876faa5e06a74cd96d533f4fce84c7ea Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:58:11 +0100 Subject: [PATCH 31/44] fix(pre-commit): remove deprecated check-docstring-first hook --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b413fa2..3048387 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,6 @@ repos: args: [--maxkb=1000] - id: check-ast - id: check-case-conflict - - id: check-docstring-first - id: check-json - id: check-merge-conflict - id: detect-private-key From 5517a49e14659d2be3abc6459e8ed04cc578b86a Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Mon, 16 Mar 2026 19:15:18 +0100 Subject: [PATCH 32/44] fix(tasks): remove unused sys import from tasks.py --- tasks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tasks.py b/tasks.py index 0c5fe52..1d8d4e9 100644 --- a/tasks.py +++ b/tasks.py @@ -3,7 +3,6 @@ from invoke.exceptions import Exit import os import shutil import subprocess -import sys import webbrowser From cebe56541a62c913b0d75d124addc31fffe31393 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:59:46 +0100 Subject: [PATCH 33/44] feat(pre-commit): add cmake-format and cmake-lint hooks --- .pre-commit-config.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3048387..24c3359 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -98,3 +98,8 @@ repos: entry: nixfmt language: system types: [nix] + - repo: https://github.com/cheshirekow/cmake-format-precommit + rev: v0.6.10 + hooks: + - id: cmake-format + - id: cmake-lint From bab5725e921ec25dbfec5e48fdace7339aa9eb68 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:59:55 +0100 Subject: [PATCH 34/44] style(CMake): reformat CMakeLists.txt for improved readability --- CMakeLists.txt | 10 ++++------ components/storage/CMakeLists.txt | 14 +++++++++----- components/web_server/CMakeLists.txt | 21 +++++++++++++++------ main/CMakeLists.txt | 5 ++--- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ec000b..d632be3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,7 @@ -# For more information about build system see -# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html -# The following five lines of boilerplate have to be in your project's -# CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.16) -# Clear any stale EXTRA_COMPONENT_DIRS entries (e.g. leftover from previous runs or PlatformIO) +# Clear any stale EXTRA_COMPONENT_DIRS entries (e.g. leftover from previous runs +# or PlatformIO) set(EXTRA_COMPONENT_DIRS "") include($ENV{IDF_PATH}/tools/cmake/project.cmake) @@ -13,5 +10,6 @@ project(dmx-interface) # Enable LittleFS filesystem image creation for web assets if(COMMAND littlefs_create_partition_image) - littlefs_create_partition_image(storage ${CMAKE_SOURCE_DIR}/data FLASH_IN_PROJECT) + littlefs_create_partition_image(storage ${CMAKE_SOURCE_DIR}/data + FLASH_IN_PROJECT) endif() diff --git a/components/storage/CMakeLists.txt b/components/storage/CMakeLists.txt index 2cb9d94..03f4b47 100644 --- a/components/storage/CMakeLists.txt +++ b/components/storage/CMakeLists.txt @@ -1,6 +1,10 @@ idf_component_register( - SRCS "src/storage.c" - INCLUDE_DIRS "include" - REQUIRES joltwallet__littlefs - PRIV_REQUIRES vfs logger -) + SRCS + "src/storage.c" + INCLUDE_DIRS + "include" + REQUIRES + joltwallet__littlefs + PRIV_REQUIRES + vfs + logger) diff --git a/components/web_server/CMakeLists.txt b/components/web_server/CMakeLists.txt index 080d042..e390e13 100644 --- a/components/web_server/CMakeLists.txt +++ b/components/web_server/CMakeLists.txt @@ -1,7 +1,16 @@ idf_component_register( - SRCS "src/web_server.c" - "src/wifi.c" - INCLUDE_DIRS "include" - REQUIRES esp_http_server storage - PRIV_REQUIRES freertos esp_wifi esp_event esp_netif nvs_flash logger -) + SRCS + "src/web_server.c" + "src/wifi.c" + INCLUDE_DIRS + "include" + REQUIRES + esp_http_server + storage + PRIV_REQUIRES + freertos + esp_wifi + esp_event + esp_netif + nvs_flash + logger) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 836026c..12392cc 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,3 +1,2 @@ -idf_component_register(SRCS "dmx-interface.c" - INCLUDE_DIRS "." - REQUIRES web_server) +idf_component_register(SRCS "dmx-interface.c" INCLUDE_DIRS "." REQUIRES + web_server) From 6c3dba7b5540a22e2aac26ade5f2c221815397ca Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:31:38 +0100 Subject: [PATCH 35/44] fix(.gitignore): add *.uf2 to ignore list for build artifacts --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9c096f7..af425ae 100755 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /build/ *.elf *.bin +*.uf2 *.hex *.map *.img From 8f5b6327bc3efdadb8542ecc7c4439da381f184c Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Mon, 16 Mar 2026 23:26:26 +0100 Subject: [PATCH 36/44] feat(doxygen): add Doxygen code coverage script and pre-commit hook --- .pre-commit-config.yaml | 11 ++ Doxyfile | 1 + tools/doxy-coverage.py | 221 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100755 tools/doxy-coverage.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3048387..3e87ebf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -98,3 +98,14 @@ repos: entry: nixfmt language: system types: [nix] + + # Doxygen code coverage + - repo: local + hooks: + - id: doxygen-coverage + name: Doxygen code coverage + language: system + entry: tools/doxy-coverage.py + args: [docs/doxygen/xml, --no-error, --summary-only] + types_or: [c, c++, header] + verbose: true diff --git a/Doxyfile b/Doxyfile index d6d5211..b875352 100644 --- a/Doxyfile +++ b/Doxyfile @@ -17,6 +17,7 @@ USE_MDFILE_AS_MAINPAGE = README.md # Documentation settings GENERATE_LATEX = NO GENERATE_HTML = YES +GENERATE_XML=YES # doxygen-awesome-css settings HTML_EXTRA_STYLESHEET = docs/external/doxygen-awesome-css/doxygen-awesome.css \ diff --git a/tools/doxy-coverage.py b/tools/doxy-coverage.py new file mode 100755 index 0000000..92cae26 --- /dev/null +++ b/tools/doxy-coverage.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python + +# -*- mode: python; coding: utf-8 -*- + +# Based on https://github.com/davatorium/doxy-coverage +# which was forked from https://github.com/alobbs/doxy-coverage +# and modified for use in this project. + +# All files in doxy-coverage are Copyright 2014 Alvaro Lopez Ortega. +# +# Authors: +# * Alvaro Lopez Ortega +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +__author__ = "Alvaro Lopez Ortega" +__email__ = "alvaro@alobbs.com" +__copyright__ = "Copyright (C) 2014 Alvaro Lopez Ortega" + +from filecmp import cmp +import os +import sys +import argparse +import xml.etree.ElementTree as ET + +# Defaults +ACCEPTABLE_COVERAGE = 80 + +# Global +ns = None + + +def ERROR(*objs): + print("ERROR: ", *objs, end="\n", file=sys.stderr) + + +def FATAL(*objs): + ERROR(*objs) + sys.exit(0 if ns.no_error else 1) + + +def parse_file(fullpath): + tree = ET.parse(fullpath) + + sourcefile = None + definitions = {} + + for definition in tree.findall("./compounddef//memberdef"): + # Should it be documented + if definition.get("kind") == "function" and definition.get("static") == "yes": + continue + + # Is the definition documented? + documented = False + for k in ("briefdescription", "detaileddescription", "inbodydescription"): + if definition.findall(f"./{k}/"): + documented = True + break + + # Name + d_def = definition.find("./definition") + d_nam = definition.find("./name") + + if not sourcefile: + l = definition.find("./location") + if l is not None: + sourcefile = l.get("file") + + if d_def is not None: + name = d_def.text + elif d_nam is not None: + name = d_nam.text + else: + name = definition.get("id") + + # Aggregate + definitions[name] = documented + + if not sourcefile: + sourcefile = fullpath + + return (sourcefile, definitions) + + +def parse(path): + index_fp = os.path.join(path, "index.xml") + if not os.path.exists(index_fp): + FATAL("Documentation not present. Exiting.", index_fp) + + tree = ET.parse(index_fp) + + files = {} + for entry in tree.findall("compound"): + if entry.get("kind") == "dir": + continue + + file_fp = os.path.join(path, f"{entry.get('refid')}.xml") + sourcefile, definitions = parse_file(file_fp) + + if definitions != {}: + files[sourcefile] = definitions + + return files + + +def report(files, include_files, summary_only): + files_sorted = sorted(files.keys()) + + if len(include_files) != 0: + files_sorted = list(filter(lambda f: f in include_files, files_sorted)) + + if len(files_sorted) == 0: + FATAL("No files to report on. Exiting.") + + files_sorted.reverse() + + total_yes = 0 + total_no = 0 + + for f in files_sorted: + defs = files[f] + + doc_yes = len([d for d in defs.values() if d]) + doc_no = len([d for d in defs.values() if not d]) + doc_per = doc_yes * 100.0 / (doc_yes + doc_no) + + total_yes += doc_yes + total_no += doc_no + + if not summary_only: + print(f"{int(doc_per):3d}% - {f} - ({doc_yes} of {doc_yes + doc_no})") + + if None in defs: + del defs[None] + if not summary_only: + defs_sorted = sorted(defs.keys()) + for d in defs_sorted: + if not defs[d]: + print("\t", d) + + total_all = total_yes + total_no + total_percentage = total_yes * 100 / total_all + print( + f"{"" if summary_only else "\n"}{int(total_percentage)}% API documentation coverage" + ) + return (ns.threshold - total_percentage, 0)[total_percentage > ns.threshold] + + +def main(): + # Arguments + parser = argparse.ArgumentParser() + parser.add_argument( + "dir", action="store", help="Path to Doxygen's XML doc directory" + ) + parser.add_argument( + "include_files", + action="extend", + nargs="*", + help="List of files to check coverage for (Default: all files)", + type=str, + default=[], + ) + parser.add_argument( + "--no-error", + action="store_true", + help="Do not return error code after execution", + ) + parser.add_argument( + "--summary-only", + action="store_true", + help="Only print the summary of the coverage report, without listing the coverage of each file", + ) + parser.add_argument( + "--threshold", + action="store", + help=f"Min acceptable coverage percentage (Default: {ACCEPTABLE_COVERAGE})", + default=ACCEPTABLE_COVERAGE, + type=int, + ) + + global ns + ns = parser.parse_args() + if not ns: + FATAL("ERROR: Couldn't parse parameters") + + # Parse + files = parse(ns.dir) + + # Print report + err = report(files, ns.include_files, ns.summary_only) + if ns.no_error: + return + + sys.exit(round(err)) + + +if __name__ == "__main__": + main() From b8e76f4a9f565638a4b959de3242f5e346bcecb3 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Tue, 17 Mar 2026 23:37:41 +0100 Subject: [PATCH 37/44] feat(docs): add task to list Doxygen coverage of documentation --- tasks.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tasks.py b/tasks.py index 1d8d4e9..df0e41b 100644 --- a/tasks.py +++ b/tasks.py @@ -106,3 +106,11 @@ def docs(c, o=False): webbrowser.open(f"file://{os.path.abspath(path)}") return raise Exit(code=1) + + +@task +def docs_coverage(c): + """List doxygen coverage of documentation.""" + subprocess.run( + "python tools/doxy-coverage.py docs/doxygen/xml --no-error", shell=True + ) From b512f9d3db30eb3dcaa74021ded635ef2a82c944 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Fri, 20 Mar 2026 20:57:25 +0100 Subject: [PATCH 38/44] fix(pre-commit): require serial execution for Doxygen coverage hook --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7fa8d84..4bb3308 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -116,3 +116,4 @@ repos: args: [docs/doxygen/xml, --no-error, --summary-only] types_or: [c, c++, header] verbose: true + require_serial: true From ec045f861018b99210718b32ae067cedf9235cd8 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Fri, 20 Mar 2026 21:25:07 +0100 Subject: [PATCH 39/44] feat(doxygen): set threshold for doxygen coverage and fail if coverage is below threshold --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4bb3308..c7b7034 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -110,10 +110,10 @@ repos: - repo: local hooks: - id: doxygen-coverage - name: Doxygen code coverage + name: doxygen code coverage language: system entry: tools/doxy-coverage.py - args: [docs/doxygen/xml, --no-error, --summary-only] + args: [docs/doxygen/xml, --threshold=40, --summary-only] types_or: [c, c++, header] - verbose: true + verbose: false require_serial: true From 94628b85233993bb084ba85bd6520f7310f368e0 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Fri, 20 Mar 2026 21:37:12 +0100 Subject: [PATCH 40/44] feat(doxygen): add option to generate Doxygen documentation before coverage check --- .pre-commit-config.yaml | 6 ++++-- bootloader | 1 + tools/doxy-coverage.py | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 160000 bootloader diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c7b7034..bd66da0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,8 @@ exclude: | .*\.o| flake.lock| dependencies.lock| - assets/case/ + assets/case/| + docs/doxygen/ ) repos: @@ -113,7 +114,8 @@ repos: name: doxygen code coverage language: system entry: tools/doxy-coverage.py - args: [docs/doxygen/xml, --threshold=40, --summary-only] + args: + [docs/doxygen/xml, --threshold=40, --summary-only, --generate-docs] types_or: [c, c++, header] verbose: false require_serial: true diff --git a/bootloader b/bootloader new file mode 160000 index 0000000..0bf633b --- /dev/null +++ b/bootloader @@ -0,0 +1 @@ +Subproject commit 0bf633be000a2b62796e071a18b93c1018d3e369 diff --git a/tools/doxy-coverage.py b/tools/doxy-coverage.py index 92cae26..ea42100 100755 --- a/tools/doxy-coverage.py +++ b/tools/doxy-coverage.py @@ -42,6 +42,7 @@ __copyright__ = "Copyright (C) 2014 Alvaro Lopez Ortega" from filecmp import cmp import os +import subprocess import sys import argparse import xml.etree.ElementTree as ET @@ -62,6 +63,20 @@ def FATAL(*objs): sys.exit(0 if ns.no_error else 1) +def generate_docs(): + print("Generating Doxygen documentation...") + proc = subprocess.run( + "doxygen Doxyfile", + shell=True, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + if proc.returncode == 0: + print("Documentation generated") + else: + FATAL("Failed to generate documentation. Exiting.") + + def parse_file(fullpath): tree = ET.parse(fullpath) @@ -200,12 +215,20 @@ def main(): default=ACCEPTABLE_COVERAGE, type=int, ) + parser.add_argument( + "--generate-docs", + action="store_true", + help="Generate Doxygen documentation before checking coverage", + ) global ns ns = parser.parse_args() if not ns: FATAL("ERROR: Couldn't parse parameters") + if ns.generate_docs: + generate_docs() + # Parse files = parse(ns.dir) From 0f72a8a2cab2393f18ba81084296b02867451886 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:05:46 +0100 Subject: [PATCH 41/44] fix(doxygen): show files with missing documentation if pre-commit hook fails --- .pre-commit-config.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bd66da0..9ad2571 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -114,8 +114,7 @@ repos: name: doxygen code coverage language: system entry: tools/doxy-coverage.py - args: - [docs/doxygen/xml, --threshold=40, --summary-only, --generate-docs] + args: [docs/doxygen/xml, --threshold=40, --generate-docs] types_or: [c, c++, header] verbose: false require_serial: true From f30fa4f13045407bdc596f82287c0e4079a95d63 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:37:36 +0100 Subject: [PATCH 42/44] remove bootloader submodule --- bootloader | 1 - 1 file changed, 1 deletion(-) delete mode 160000 bootloader diff --git a/bootloader b/bootloader deleted file mode 160000 index 0bf633b..0000000 --- a/bootloader +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0bf633be000a2b62796e071a18b93c1018d3e369 From 472b478afe74bef13273e31d3cd2933c75c03b2a Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:44:33 +0100 Subject: [PATCH 43/44] add doxygen and header guards --- components/logger/include/logger.h | 11 +++++- components/storage/include/storage.h | 5 +-- components/storage/src/storage.c | 5 ++- components/web_server/include/wifi.h | 18 +++++++++ components/web_server/src/web_server.c | 51 ++++++++++++++++++++++++++ components/web_server/src/wifi.c | 25 +++++++++++-- main/CMakeLists.txt | 10 ++++- main/dmx-interface.c | 22 +++++++---- 8 files changed, 126 insertions(+), 21 deletions(-) diff --git a/components/logger/include/logger.h b/components/logger/include/logger.h index 8090718..ecb88ea 100644 --- a/components/logger/include/logger.h +++ b/components/logger/include/logger.h @@ -1,4 +1,3 @@ - /** * @file logger.h * @brief Project-wide logging macros based on ESP-IDF's logging library. @@ -27,8 +26,12 @@ #include "esp_log.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifndef LOG_TAG -#define LOG_TAG "CHAOS" +#define LOG_TAG "CHAOS" ///< Default log tag #endif /** @brief Log a message at Error level. */ @@ -41,3 +44,7 @@ #define LOGD(...) ESP_LOGD(LOG_TAG, __VA_ARGS__) /** @brief Log a message at Verbose level. */ #define LOGV(...) ESP_LOGV(LOG_TAG, __VA_ARGS__) + +#ifdef __cplusplus +} +#endif diff --git a/components/storage/include/storage.h b/components/storage/include/storage.h index 3910ada..84b826e 100644 --- a/components/storage/include/storage.h +++ b/components/storage/include/storage.h @@ -1,5 +1,4 @@ -#ifndef STORAGE_H -#define STORAGE_H +#pragma once #include "esp_err.h" @@ -24,5 +23,3 @@ const char *storage_get_mount_point(void); #ifdef __cplusplus } #endif - -#endif /* STORAGE_H */ diff --git a/components/storage/src/storage.c b/components/storage/src/storage.c index 5e40fc3..c7fae3c 100644 --- a/components/storage/src/storage.c +++ b/components/storage/src/storage.c @@ -1,11 +1,12 @@ -#define LOG_TAG "STORE" +#define LOG_TAG "STORE" ///< "STORE" log tag for this file #include "storage.h" #include "esp_littlefs.h" #include "esp_vfs.h" #include "logger.h" -static const char *LITTLEFS_MOUNT_POINT = "/data"; +static const char *LITTLEFS_MOUNT_POINT = + "/data"; ///< Mount point for LittleFS filesystem esp_err_t storage_init(void) { esp_vfs_littlefs_conf_t conf = { diff --git a/components/web_server/include/wifi.h b/components/web_server/include/wifi.h index 4876de7..6c348f5 100644 --- a/components/web_server/include/wifi.h +++ b/components/web_server/include/wifi.h @@ -6,8 +6,26 @@ extern "C" { #endif +/** + * @brief Start WiFi Access Point (AP) mode. + * + * Initializes and starts the WiFi AP with the given SSID and password. + * + * @param ssid SSID for the AP (1-32 characters) + * @param password Password for the AP (min. 8 characters, optional) + * @param channel WiFi channel to use + * @param max_connections Maximum number of client connections + * @return ESP_OK on success, ESP_ERR_INVALID_ARG or other error codes on + * failure + */ esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, uint8_t max_connections); + +/** + * @brief Stop WiFi Access Point (AP) mode. + * + * Deinitializes and stops the WiFi AP. + */ void wifi_stop_ap(void); #ifdef __cplusplus diff --git a/components/web_server/src/web_server.c b/components/web_server/src/web_server.c index 9d25638..6e2f3dc 100644 --- a/components/web_server/src/web_server.c +++ b/components/web_server/src/web_server.c @@ -1,5 +1,10 @@ #define LOG_TAG "WEBSRV" +/** + * @def LOG_TAG + * @brief Tag used for web server logging. + */ + #include "web_server.h" #include @@ -14,12 +19,34 @@ #include "storage.h" // Default configuration values +/** + * @brief Default port for the web server. + */ #define WEBSERVER_DEFAULT_PORT 80 +/** + * @brief Default port for the web server. + */ #define WEBSERVER_DEFAULT_MAX_HANDLERS 32 +/** + * @brief Default maximum number of URI handlers. + */ #define WEBSERVER_DEFAULT_STACK_SIZE (8 * 1024) +/** + * @brief Default stack size for the web server task. + */ #define WEBSERVER_DEFAULT_TASK_PRIORITY 5 +/** + * @brief Default task priority for the web server task. + */ +/** + * @brief Handle for the HTTP server instance. + */ static httpd_handle_t s_server_handle = NULL; + +/** + * @brief Handle for the FreeRTOS web server task. + */ static TaskHandle_t s_server_task_handle = NULL; /** @@ -127,6 +154,15 @@ static void webserver_task(void *arg) { vTaskDelete(NULL); } +/** + * @brief Start the web server with the given configuration. + * + * Initializes storage, configures the HTTP server, registers default handlers, + * and starts the FreeRTOS task for async operation. + * + * @param config Pointer to webserver configuration struct (optional) + * @return Handle to the running HTTP server, or NULL on failure + */ httpd_handle_t webserver_start(const webserver_config_t *config) { if (s_server_handle != NULL) { LOGW("Web server already running"); @@ -207,6 +243,13 @@ httpd_handle_t webserver_start(const webserver_config_t *config) { return s_server_handle; } +/** + * @brief Stop the web server and clean up resources. + * + * Stops the HTTP server and deletes the FreeRTOS task. + * + * @param server Handle to the HTTP server instance + */ void webserver_stop(httpd_handle_t server) { if (server == NULL) { return; @@ -224,6 +267,14 @@ void webserver_stop(httpd_handle_t server) { LOGI("Web server stopped"); } +/** + * @brief Register a URI handler with the web server. + * + * @param server Handle to the HTTP server instance + * @param uri_handler Pointer to the URI handler struct + * @return ESP_OK on success, ESP_ERR_INVALID_ARG or other error codes on + * failure + */ esp_err_t webserver_register_handler(httpd_handle_t server, const httpd_uri_t *uri_handler) { if (server == NULL || uri_handler == NULL) { diff --git a/components/web_server/src/wifi.c b/components/web_server/src/wifi.c index 222592f..d6ea2f5 100644 --- a/components/web_server/src/wifi.c +++ b/components/web_server/src/wifi.c @@ -1,6 +1,4 @@ -#define LOG_TAG "WIFI" - -#include "wifi.h" +#define LOG_TAG "WIFI" ///< "WIFI" log tag for this file #include @@ -9,9 +7,25 @@ #include "esp_wifi.h" #include "logger.h" #include "nvs_flash.h" +#include "wifi.h" +/** + * @brief Indicates whether the WiFi AP is started. + */ static bool s_wifi_started = false; +/** + * @brief Start WiFi Access Point (AP) mode. + * + * Initializes and starts the WiFi AP with the given SSID and password. + * + * @param ssid SSID for the AP (1-32 characters) + * @param password Password for the AP (min. 8 characters, optional) + * @param channel WiFi channel to use + * @param max_connections Maximum number of client connections + * @return ESP_OK on success, ESP_ERR_INVALID_ARG or other error codes on + * failure + */ esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, uint8_t max_connections) { if (s_wifi_started) { @@ -74,6 +88,11 @@ esp_err_t wifi_start_ap(const char *ssid, const char *password, uint8_t channel, return ESP_OK; } +/** + * @brief Stop WiFi Access Point (AP) mode. + * + * Deinitializes and stops the WiFi AP. + */ void wifi_stop_ap(void) { if (!s_wifi_started) { return; diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 12392cc..07d74e6 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,2 +1,8 @@ -idf_component_register(SRCS "dmx-interface.c" INCLUDE_DIRS "." REQUIRES - web_server) +idf_component_register( + SRCS + "dmx-interface.c" + INCLUDE_DIRS + "." + REQUIRES + web_server + logger) diff --git a/main/dmx-interface.c b/main/dmx-interface.c index 4ed7ccd..fb94c1b 100644 --- a/main/dmx-interface.c +++ b/main/dmx-interface.c @@ -1,32 +1,38 @@ +#define LOG_TAG "MAIN" ///< "MAIN" log tag for this file + #include #include "esp_err.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "logger.h" #include "web_server.h" #include "wifi.h" -static const char *TAG = "MAIN"; - +/** + * @brief Main entry point for the DMX Interface application. + * + * Initializes WiFi Access Point and starts the web server. + * Keeps the application running indefinitely. + */ void app_main(void) { - ESP_LOGI(TAG, "DMX Interface starting..."); + LOGI("DMX Interface starting..."); esp_err_t wifi_err = wifi_start_ap("DMX", "mbgmbgmbg", 1, 4); if (wifi_err != ESP_OK) { - ESP_LOGE(TAG, "Failed to start WiFi AP: %s", esp_err_to_name(wifi_err)); + LOGE("Failed to start WiFi AP: %s", esp_err_to_name(wifi_err)); return; } // Start HTTP web server httpd_handle_t server = webserver_start(NULL); if (server == NULL) { - ESP_LOGE(TAG, "Failed to start web server!"); + LOGE("Failed to start web server!"); return; } - ESP_LOGI(TAG, "Web server started successfully"); - ESP_LOGI(TAG, "Open http://192.168.4.1 in your browser"); + LOGI("Web server started successfully"); + LOGI("Open http://192.168.4.1 in your browser"); // Keep the app running while (1) { From 47a0b1bf56cf213df73e3400b04ba0f18ce954b3 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:57:27 +0100 Subject: [PATCH 44/44] fix(doxygen): update coverage threshold to 100 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9ad2571..94013f0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -114,7 +114,7 @@ repos: name: doxygen code coverage language: system entry: tools/doxy-coverage.py - args: [docs/doxygen/xml, --threshold=40, --generate-docs] + args: [docs/doxygen/xml, --threshold=100, --generate-docs] types_or: [c, c++, header] verbose: false require_serial: true