From 05be118dd1f4009cd94ab7cf8b62e3c1792ed965 Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 5 Jan 2026 21:01:26 +0100 Subject: [PATCH 01/22] Port to ESP32 --- .gitignore | 295 ++++++++++++++++ ARCHITECTURE.md | 390 ++++++++++++++++++++++ CMakeLists.txt | 5 + README.md | 194 +++++++++-- main/CMakeLists.txt | 14 + main/animation.c | 471 ++++++++++++++++++++++++++ main/animation.h | 63 ++++ main/control.c | 686 ++++++++++++++++++++++++++++++++++++++ main/control.h | 87 +++++ main/led.c | 476 ++++++++++++++++++++++++++ main/led.h | 136 ++++++++ main/main.c | 94 ++++++ main/rcsignal.c | 202 +++++++++++ main/rcsignal.h | 60 ++++ partitions.csv | 6 + tools/dev_https_server.py | 120 +++++++ tools/requirements.txt | 5 + webapp/app/app.js | 322 ++++++++++++++++++ webapp/css/style.css | 313 +++++++++++++++++ webapp/data/favicon.ico | 0 webapp/index.html | 115 +++++++ 21 files changed, 4025 insertions(+), 29 deletions(-) create mode 100644 .gitignore create mode 100644 ARCHITECTURE.md create mode 100644 CMakeLists.txt create mode 100644 main/CMakeLists.txt create mode 100644 main/animation.c create mode 100644 main/animation.h create mode 100644 main/control.c create mode 100644 main/control.h create mode 100644 main/led.c create mode 100644 main/led.h create mode 100644 main/main.c create mode 100644 main/rcsignal.c create mode 100644 main/rcsignal.h create mode 100644 partitions.csv create mode 100644 tools/dev_https_server.py create mode 100644 tools/requirements.txt create mode 100644 webapp/app/app.js create mode 100644 webapp/css/style.css create mode 100644 webapp/data/favicon.ico create mode 100644 webapp/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01aae50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,295 @@ +# ---> esp-idf +# gitignore template for esp-idf, the official development framework for ESP32 +# https://github.com/espressif/esp-idf + +build/ +sdkconfig +sdkconfig.old + +# ---> VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# ---> esp-idf +# gitignore template for esp-idf, the official development framework for ESP32 +# https://github.com/espressif/esp-idf + +build/ +sdkconfig +sdkconfig.old + +# ---> CMake +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + +# ---> C +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# ---> C++ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +.vscode/settings.json +sdkconfig.defaults diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..8a4bce1 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,390 @@ +# Architecture Documentation + +## System Overview + +The ESP32 LED Controller is a real-time embedded system designed for model aircraft LED control with the following key components: + +``` +┌─────────────────────────────────────────────────────────┐ +│ Application Layer │ +│ ┌──────────┐ ┌───────────┐ ┌──────────────────────┐ │ +│ │ main.c │ │ Web-BLE │ │ Animation Patterns │ │ +│ └────┬─────┘ └─────┬─────┘ └──────────┬───────────┘ │ +└───────┼──────────────┼────────────────────┼─────────────┘ + │ │ │ +┌───────┴──────────────┴────────────────────┴─────────────┐ +│ Control Layer │ +│ ┌──────────────────────────────────────────────────┐ │ +│ │ control.c - System Orchestration │ │ +│ │ - BLE GATT Server │ │ +│ │ - NVS Configuration Storage │ │ +│ │ - OTA Firmware Update │ │ +│ │ - Subsystem Initialization │ │ +│ └──────────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────────┘ + │ │ │ +┌───────┼──────────────┼────────────────────┼─────────────┐ +│ │ │ │ │ +│ ┌────▼────┐ ┌────▼─────┐ ┌────▼─────────┐ │ +│ │ LED │ │ RC Signal│ │ Animation │ │ +│ │ Driver │ │ Reader │ │ Engine │ │ +│ └─────────┘ └──────────┘ └──────────────┘ │ +│ │ +│ Hardware Layer │ +└──────────────────────────────────────────────────────────┘ + │ │ │ +┌───────┼──────────────┼────────────────────┼─────────────┐ +│ ┌────▼────┐ ┌────▼─────┐ │ +│ │ RMT │ │ GPIO │ │ +│ │ (WS2812)│ │ (PWM) │ │ +│ └─────────┘ └──────────┘ │ +│ │ +│ ESP-IDF HAL & Drivers │ +└──────────────────────────────────────────────────────────┘ +``` + +## Module Details + +### 1. main.c - Application Entry Point +**Responsibilities:** +- System initialization orchestration +- Animation task creation and management +- System health monitoring +- Error handling and recovery + +**Key Functions:** +- `app_main()`: Entry point, initializes control system +- `animation_task()`: FreeRTOS task for 60 FPS animation updates + +**Task Priority:** Animation task runs at priority 5 (above default) + +--- + +### 2. control.c/h - System Control & Orchestration +**Responsibilities:** +- BLE GATT server implementation +- Configuration management (NVS) +- OTA firmware update handling +- Subsystem initialization and coordination + +**BLE Service Structure:** +``` +Service UUID: 0x00FF +├── Config Characteristic (0xFF01) +│ ├── Read: Get current configuration +│ └── Write: Update and persist configuration +├── Mode Characteristic (0xFF02) +│ ├── Read: Get current animation mode +│ └── Write: Set animation mode +├── PWM Emulation (0xFF03) +│ └── Write: Trigger mode change +└── OTA Characteristic (0xFF04) + └── Write: Stream firmware binary +``` + +**Configuration Storage:** +```c +typedef struct { + int8_t led_pin_strip_a; // -1 = disabled + int8_t led_pin_strip_b; // -1 = disabled + int8_t pwm_pin; // -1 = disabled + ble_timeout_t ble_timeout; // 0, 60, 300 seconds + uint32_t magic; // 0xDEADBEEF validation +} controller_config_t; +``` + +**NVS Namespace:** `led_ctrl` +**NVS Key:** `config` + +**BLE Timeout Logic:** +- Timer starts at boot +- Pauses when device connects +- Resumes when device disconnects +- Disables BLE advertising on timeout + +**OTA Update Flow:** +1. Client writes firmware data in 512-byte chunks +2. ESP32 writes to inactive OTA partition +3. Last chunk (< 512 bytes) triggers completion +4. Validates partition, sets boot partition +5. Resets configuration and restarts + +--- + +### 3. led.c/h - WS2812B LED Driver +**Technology:** ESP32 RMT (Remote Control) peripheral + +**Why RMT?** +- Hardware timing generation (no CPU overhead) +- Precise WS2812B timing requirements: + - T0H: 350ns ±150ns + - T0L: 900ns ±150ns + - T1H: 900ns ±150ns + - T1L: 350ns ±150ns + - Reset: >280µs + +**Implementation:** +``` +RMT Channel → Custom Encoder → WS2812B Strip + ↓ ↓ ↓ + 80 MHz GRB Encoding Serial Data +``` + +**Color Management:** +- Internal RGB buffer for each strip +- Thread-safe access via mutex +- Hardware converts RGB → GRB for WS2812B +- Support for HSV → RGB conversion + +**Key Functions:** +- `led_init()`: Configure RMT channels +- `led_set_pixel_a/b()`: Set individual LED +- `led_fill_a/b()`: Set all LEDs same color +- `led_show()`: Update physical LEDs +- `led_fade_to_black()`: Fade effect for trails + +**Memory Usage:** +- Strip A buffer: num_leds * 3 bytes (RGB) +- Strip B buffer: num_leds * 3 bytes (RGB) +- Default: 44 LEDs * 2 strips * 3 = 264 bytes + +--- + +### 4. rcsignal.c/h - PWM Signal Reader +**Technology:** GPIO interrupt + software edge detection + +**PWM Signal Specification:** +- Standard RC PWM: 1000-2000µs pulse width +- Detection threshold: 1500µs +- Timeout: 100ms (signal loss detection) + +**Mode Change Logic:** +``` +PWM < 1500µs → Set "pull_detected" flag + ↓ +PWM > 1500µs AND pull_detected → Mode++ + ↓ +pull_detected = false +``` + +**Implementation:** +- ISR captures rising/falling edges +- Calculates pulse width in microseconds +- Monitor task (10ms interval) detects mode changes +- Callback notifies animation system + +**Thread Safety:** +- Volatile variables for ISR communication +- Monitor task runs at priority 5 + +--- + +### 5. animation.c/h - Animation Engine +**Update Rate:** 60 FPS (16.67ms per frame) + +**Global State:** +- `global_hue`: Slow color cycling (updates every 3 frames) +- `frame_counter`: Frame synchronization +- `current_mode`: Active animation pattern + +**Animation Techniques:** + +#### Fade Effects +```c +// Smooth trails for chase animations +led_fade_to_black(amount); +// Each LED: color = (color * (255 - amount)) / 255 +``` + +#### Beat Synchronization +```c +// Sine wave based on BPM and time +beatsin16(bpm, min_val, max_val); +// Returns position oscillating between min and max +``` + +#### HSV Color Space +- Hue: 0-255 (color wheel) +- Saturation: 0-255 (color intensity) +- Value: 0-255 (brightness) +- Automatic RGB conversion + +**Animation Modes Breakdown:** + +1. **Static Colors** (Black, Red, Blue, Green, White) + - Single `led_fill()` call + - No per-frame updates needed + +2. **Rainbow** + - HSV hue gradient across strip + - Hue offset per LED: `global_hue + (i * 7)` + - Global hue increments for animation + +3. **Rainbow Glitter** + - Base rainbow + random white sparkles + - 80/255 chance per frame + - Random LED position + +4. **Confetti** + - Fade to black (10/255 per frame) + - Random position + random hue + - Creates "fireworks" effect + +5. **Sinelon** + - Sweeping dot using sine wave + - Position: `beatsin16(13 BPM)` + - 20/255 fade creates trails + +6. **BPM** + - Color palette based on party colors + - Beat: `beatsin8(33 BPM)` + - Brightness modulation per LED + +7. **Navigation** + - Fixed positions for aviation lights + - Red: LEDs 0-2 (left) + - Green: Last 3 LEDs (right) + - White blink: 30 Hz (half frame rate) + +8. **Chase (Red)** + - Red dot with ±2 LED trail + - Position: `beatsin16(40 BPM)` + - No fade (instant clear) + +9. **Chase RGB** + - Same as Chase but HSV color cycling + - Hue: `global_hue` + +10. **Random** + - Random LED, random color each frame + - Rare full clear event + +--- + +## Data Flow + +### Configuration Update Flow +``` +Web Browser → BLE Write → control.c → NVS Save → Restart (if pins changed) +``` + +### Animation Update Flow +``` +animation_task (60Hz) → animation_update() → LED buffer → led_show() → RMT → LEDs +``` + +### PWM Mode Change Flow +``` +RC Signal → GPIO ISR → rcsignal.c → Callback → control.c → animation.c +``` + +### OTA Update Flow +``` +Web Browser → BLE Write (chunks) → control.c → esp_ota → Flash → Restart +``` + +## Thread Safety + +### Mutexes Used +1. **led_mutex**: Protects LED buffer access + - Used by: animation_update(), led_show() + - Type: FreeRTOS mutex + +### ISR Safety +- **rcsignal.c**: Volatile variables for ISR communication +- **Minimal ISR work**: Only timestamp and edge detection +- **Deferred processing**: Monitor task handles logic + +### Task Priorities +``` +Priority 5: animation_task, rcsignal_monitor_task +Priority 1: BLE stack tasks (default) +Priority 0: Idle task +``` + +## Memory Management + +### Static Allocation +- Configuration structure: 11 bytes (NVS) +- Animation state: ~100 bytes (global variables) + +### Dynamic Allocation +- LED buffers: `num_leds * 3 * 2` bytes (both strips) +- RMT encoder: ~200 bytes per strip +- BLE stack: ~30KB (ESP-IDF managed) + +### Flash Usage +- Code: ~500KB (with BLE stack) +- OTA partitions: 2x 1MB (dual-boot) +- NVS: 24KB +- Factory: 1MB + +### Heap Usage Estimate +- Total: ~50KB during operation +- Available: ~250KB on ESP32 + +## Power Optimization + +### Active Mode +- CPU: 240 MHz (animation processing) +- BLE: Active (advertising/connected) +- Power: ~180mA (ESP32 only) + +### BLE Disabled Mode +- CPU: 240 MHz (animation only) +- BLE: Disabled after timeout +- Power: ~100mA (ESP32 only) + +### LED Power +- Per LED: ~60mA at full white +- 44 LEDs full white: ~2.6A +- Typical animation: ~500mA average + +## ESP32 vs ESP32-C3 Differences + +### ESP32 (Xtensa) +- Dual-core: FreeRTOS symmetric multiprocessing +- BLE + Classic Bluetooth controller +- More GPIO pins available +- Recommended for complex projects + +### ESP32-C3 (RISC-V) +- Single-core: Simpler task management +- BLE only (no Classic Bluetooth) +- Fewer GPIO pins +- Lower cost option + +### Compatibility +- Same codebase works on both +- Pin numbers differ (check datasheet) +- RMT peripheral identical +- BLE functionality identical + +## Performance Characteristics + +### Latency +- **PWM detection**: <10ms +- **BLE command**: <100ms +- **Mode change**: <20ms (next frame) +- **LED update**: 16.67ms (60 FPS locked) + +### Throughput +- **LED data**: ~13.44 Mbps theoretical (RMT) +- **BLE**: ~1 Mbps (limited by MTU) +- **OTA**: ~40 KB/s (BLE transfer) + +### Timing Precision +- **Animation frame**: ±0.5ms jitter +- **WS2812B timing**: ±50ns (RMT hardware) +- **PWM measurement**: ±1µs (ISR timing) + +--- + + +## Future Enhancement Ideas TODO + +1. **Dynamic LED Count**: Auto-detect number of LEDs +2. **Multi-Strip Sync**: Synchronized patterns +3. **Pattern Editor**: Visual animation designer +4. **Scheduler**: Time-based mode changes + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0c80f0e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +# ESP32 LED Controller Firmware +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_controller) diff --git a/README.md b/README.md index 910652c..fa6b7dd 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,174 @@ -# WS2812B-LED-RC-Controller -WS2812B Controller for RC plane night flying with spotlight +# ESP32 LED Controller for Model Aircraft -#### Fast overview: Video will come soon. +Professional LED controller firmware for ESP32 with Web-BLE configuration interface. Designed for model aircraft with WS2812B LED strips. -[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi//0.jpg)] -(https://www.youtube.com/watch?v=) +## Features -## 1.Hardware: -- Atmel Atmega328p -- WS2812B stirp (got mine from https://www.banggood.com/5M-45W-150SMD-WS2812B-LED-RGB-Colorful-Strip-Light-Waterproof-IP65-WhiteBlack-PCB-DC5V-p-1035640.html) -- 3W 12V LED -- Transistor 2N3904 -- Capacitors - 10uF/25V -- Socket for Atmega -- Some servo wires -- Crystal 16MHz -- Capacitor Ceramic 22pF -- PCB of your choice +### Hardware Support +- **ESP32 DevKitC** and **ESP32-C3 MINI** Development Board +- Dual WS2812B LED strip support (configurable GPIOs) +- PWM signal input for RC control +- Real-time LED animation at 60 FPS -## 2.Software: -- get your isp-programmer (ex. USBasp) working, linux is your friend -- install latest Arduino IDE and drivers -- install FastLED https://github.com/FastLED/FastLED +### Animation Modes +1. **Black** - All LEDs off +2. **Red** - Solid red +3. **Blue** - Solid blue +4. **Green** - Solid green +5. **White** - Solid white +6. **Rainbow** - Smooth rainbow gradient +7. **Rainbow with Glitter** - Rainbow with sparkles +8. **Confetti** - Random colored speckles +9. **Sinelon** - Sweeping colored dot with trails +10. **BPM** - Pulsing stripes at 33 BPM +11. **Navigation** - Aviation lights (red left, green right) +12. **Chase (Red)** - Red dot chase effect +13. **Chase (RGB)** - RGB cycling chase effect +14. **Random** - Random LED colors -## 3.Libraries used in this project: -- FastLED from https://github.com/FastLED/FastLED +### Web-BLE Configuration +- **Pin Configuration**: Set GPIO pins for LED strips and PWM input +- **BLE Auto-Off**: Configure timeout (Never/1min/5min) +- **Manual Control**: Select animation modes from web interface +- **PWM Emulation**: Test mode switching without RC signal +- **OTA Firmware Update**: Upload new firmware via Bluetooth -### Installation: -1. prepare Hardware. Ground to Ground and the rest like the schematics (comming soon). -2. Upload the sketch to the Arduino with the ISP-Programmer. -3. Set the switches on your RC control for the two channels. -7. Power everything up. -8. Enjoy your WS2812B-LED-RC-Controller +## Project Structure -Bug and Features: Please report bugs and wishes to me. Thanks! +``` +led-controller-firmware/ +├── main/ +│ ├── main.c # Application entry point +│ ├── control.c/h # BLE, NVS, initialization +│ ├── led.c/h # WS2812B control (RMT driver) +│ ├── rcsignal.c/h # PWM signal reading +│ └── animation.c/h # LED animation patterns +├── webapp/ +│ ├── index.html # Web-BLE interface +│ ├── app/app.js # BLE communication logic +│ ├── css/style.css # UI styling +│ └── data/favicon.ico +├── CMakeLists.txt +├── sdkconfig.defaults +└── partitions.csv # OTA-enabled partition table +``` +## Build Instructions + +### Prerequisites +1. Install ESP-IDF v5.0 or later + +2. For ESP32-C3, ensure RISC-V toolchain is installed + +### Building + +```bash +cd led-controller-firmware + +# For ESP32 DevKitC +idf.py set-target esp32 +idf.py build + +# For ESP32-C3 MINI +idf.py set-target esp32c3 +idf.py build +``` + +### Flashing + +```bash +idf.py -p /dev/ttyUSB0 flash monitor +``` + +Replace `/dev/ttyUSB0` with your serial port (COM3 on Windows). + +## Hardware Setup + +### Wiring +``` +ESP32 Pin -> Component +----------- ---------- +GPIO XX -> WS2812B Strip A Data +GPIO XX -> WS2812B Strip B Data +GPIO XX -> RC PWM Signal +GND -> Common Ground +5V -> LED Strip Power (if current < 500mA) +``` + +### LED Strips +- **WS2812B** strips require 5V power +- Each LED draws ~60mA at full white +- Use external power supply for >10 LEDs +- Add 100-500µF capacitor near strips +- Add 330Ω resistor on data line + +### PWM Signal +- Standard RC PWM: 1000-2000µs pulse width +- 1500µs threshold for mode switching +- Rising edge >1500µs after <1500µs triggers next mode + +## Web-BLE Configuration + +### Access the Interface + +1. Open `webapp/index.html` in Chrome, Edge, or Opera (Web Bluetooth required) +2. Click "Connect via BLE" +3. Select "LED-Controller" from device list +4. Configure settings and control LEDs + +### Configuration Options + +#### Pin Setup +- **LED Strip A GPIO**: -1 to disable, 0-48 for GPIO pin +- **LED Strip B GPIO**: -1 to disable, 0-48 for GPIO pin +- **PWM Input GPIO**: -1 to disable, 0-48 for GPIO pin + +#### BLE Timeout +- **Never**: BLE stays on until manually disabled +- **1 Minute**: Auto-disable after 1 min of boot (unless connected) +- **5 Minutes**: Auto-disable after 5 min of boot (unless connected) + +#### Firmware Update +1. Build firmware: `idf.py build` +2. Find binary: `build/led_controller.bin` +3. Upload via Web-BLE interface +4. Device restarts with new firmware (settings reset) + +## Default Configuration + +On first boot or after reset: +- All pins: **Not configured** (-1) +- BLE timeout: **Never** +- Animation mode: **Black** (off) + +Configure via Web-BLE before use. + +## Development + +### Adding New Animations + +1. Add mode to `animation_mode_t` enum in `animation.h` +2. Implement animation function in `animation.c` +3. Add case to `animation_update()` switch statement +4. Update `MODE_NAMES` array in `webapp/app/app.js` + +### Modifying LED Count + +Edit `DEFAULT_NUM_LEDS_A` and `DEFAULT_NUM_LEDS_B` in `control.c`. TODO + +### Testing + +```bash +# Build and flash +idf.py build flash + +# Monitor output +idf.py monitor + +# Exit monitor: Ctrl+] +``` + +## License + +See [LICENSE](LICENSE) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt new file mode 100644 index 0000000..a68f73b --- /dev/null +++ b/main/CMakeLists.txt @@ -0,0 +1,14 @@ +idf_component_register( + SRCS + "main.c" + "control.c" + "led.c" + "rcsignal.c" + "animation.c" + INCLUDE_DIRS "." + EMBED_FILES + "../webapp/index.html" + "../webapp/app/app.js" + "../webapp/css/style.css" + "../webapp/data/favicon.ico" +) diff --git a/main/animation.c b/main/animation.c new file mode 100644 index 0000000..6200539 --- /dev/null +++ b/main/animation.c @@ -0,0 +1,471 @@ +/** + * @file animation.c + * @brief LED animation patterns implementation + */ + +#include "animation.h" +#include "led.h" +#include "esp_log.h" +#include "esp_timer.h" +#include "esp_random.h" +#include +#include + +static const char *TAG = "ANIMATION"; + +#define FRAMES_PER_SECOND 60 +#define NUM_LEDS_DEFAULT 44 //TODO: Default from proof-of-concept + +static animation_mode_t current_mode = ANIM_BLACK; +static uint8_t global_hue = 0; +static uint32_t frame_counter = 0; + +// Beat calculation helper (similar to FastLED beatsin16) +static int16_t beatsin16(uint8_t bpm, int16_t min_val, int16_t max_val) +{ + uint32_t ms = esp_timer_get_time() / 1000; + uint32_t beat = (ms * bpm * 256) / 60000; + uint8_t beat8 = (beat >> 8) & 0xFF; + + // Sin approximation + float angle = (beat8 / 255.0f) * 2.0f * M_PI; + float sin_val = sinf(angle); + + int16_t range = max_val - min_val; + int16_t result = min_val + (int16_t)((sin_val + 1.0f) * range / 2.0f); + + return result; +} + +// Beat calculation helper (beatsin8 variant) +static uint8_t beatsin8(uint8_t bpm, uint8_t min_val, uint8_t max_val) +{ + return (uint8_t)beatsin16(bpm, min_val, max_val); +} + +// Random helper +static uint8_t random8(void) +{ + return esp_random() & 0xFF; +} + +static uint16_t random16(uint16_t max) +{ + if (max == 0) + return 0; + return esp_random() % max; +} + +// Animation implementations +static void anim_black(void) +{ + rgb_t black = {0, 0, 0}; + led_fill_a(black); + led_fill_b(black); +} + +static void anim_red(void) +{ + rgb_t red = {255, 0, 0}; + led_fill_a(red); + led_fill_b(red); +} + +static void anim_blue(void) +{ + rgb_t blue = {0, 0, 255}; + led_fill_a(blue); + led_fill_b(blue); +} + +static void anim_green(void) +{ + rgb_t green = {0, 255, 0}; + led_fill_a(green); + led_fill_b(green); +} + +static void anim_white(void) +{ + rgb_t white = {255, 255, 255}; + led_fill_a(white); + led_fill_b(white); +} + +static void anim_rainbow(void) +{ + // FastLED's built-in rainbow generator + uint16_t num_leds_a = led_get_num_leds_a(); + uint16_t num_leds_b = led_get_num_leds_b(); + + for (uint16_t i = 0; i < num_leds_a; i++) + { + hsv_t hsv = {(uint8_t)(global_hue + (i * 7)), 255, 255}; + led_set_pixel_a(i, led_hsv_to_rgb(hsv)); + } + + for (uint16_t i = 0; i < num_leds_b; i++) + { + hsv_t hsv = {(uint8_t)(global_hue + (i * 7)), 255, 255}; + led_set_pixel_b(i, led_hsv_to_rgb(hsv)); + } +} + +static void add_glitter(uint8_t chance_of_glitter) +{ + if (random8() < chance_of_glitter) + { + uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); + uint16_t pos = random16(num_leds); + rgb_t white = {255, 255, 255}; + + if (pos < led_get_num_leds_a()) + { + led_add_pixel_a(pos, white); + } + else + { + led_add_pixel_b(pos - led_get_num_leds_a(), white); + } + } +} + +static void anim_rainbow_glitter(void) +{ + anim_rainbow(); + add_glitter(80); +} + +static void anim_confetti(void) +{ + // Random colored speckles that blink in and fade smoothly + led_fade_to_black(10); + + uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); + uint16_t pos = random16(num_leds); + + hsv_t hsv = {(uint8_t)(global_hue + random8()), 200, 255}; + rgb_t color = led_hsv_to_rgb(hsv); + + if (pos < led_get_num_leds_a()) + { + led_add_pixel_a(pos, color); + } + else + { + led_add_pixel_b(pos - led_get_num_leds_a(), color); + } +} + +static void anim_sinelon(void) +{ + // A colored dot sweeping back and forth, with fading trails + led_fade_to_black(20); + + uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); + int16_t pos = beatsin16(13, 0, num_leds - 1); + + hsv_t hsv = {global_hue, 255, 192}; + rgb_t color = led_hsv_to_rgb(hsv); + + if (pos < led_get_num_leds_a()) + { + led_add_pixel_a(pos, color); + } + else + { + led_add_pixel_b(pos - led_get_num_leds_a(), color); + } +} + +static void anim_bpm(void) +{ + // Colored stripes pulsing at 33 BPM + uint8_t bpm = 33; + uint8_t beat = beatsin8(bpm, 64, 255); + + uint16_t num_leds_a = led_get_num_leds_a(); + uint16_t num_leds_b = led_get_num_leds_b(); + + // PartyColors palette simulation + const uint8_t palette_colors[] = { + 170, 240, 90, 150, 210, 30, 180, 0, + 210, 270, 150, 240, 330, 60, 300, 120}; + + for (uint16_t i = 0; i < num_leds_a; i++) + { + uint8_t color_index = (global_hue + (i * 2)) & 0x0F; + uint8_t brightness = beat - global_hue + (i * 10); + hsv_t hsv = {palette_colors[color_index], 255, brightness}; + led_set_pixel_a(i, led_hsv_to_rgb(hsv)); + } + + for (uint16_t i = 0; i < num_leds_b; i++) + { + uint8_t color_index = (global_hue + ((i + num_leds_a) * 2)) & 0x0F; + uint8_t brightness = beat - global_hue + ((i + num_leds_a) * 10); + hsv_t hsv = {palette_colors[color_index], 255, brightness}; + led_set_pixel_b(i, led_hsv_to_rgb(hsv)); + } +} + +static void anim_navigation(void) +{ + // Navigation lights: left red, right green, with blinking white + static uint8_t blink_state = 0; + + led_clear_all(); + + uint16_t num_leds_a = led_get_num_leds_a(); + uint16_t num_leds_b = led_get_num_leds_b(); + + rgb_t red = {255, 0, 0}; + rgb_t green = {0, 255, 0}; + rgb_t white = {255, 255, 255}; + + // Left side red (first 3 LEDs of strip A) + if (num_leds_a >= 3) + { + led_set_pixel_a(0, red); + led_set_pixel_a(1, red); + led_set_pixel_a(2, red); + } + + // Right side green (last 3 LEDs) + if (num_leds_b >= 3) + { + led_set_pixel_b(num_leds_b - 1, green); + led_set_pixel_b(num_leds_b - 2, green); + led_set_pixel_b(num_leds_b - 3, green); + } + else if (num_leds_a >= 6) + { + led_set_pixel_a(num_leds_a - 1, green); + led_set_pixel_a(num_leds_a - 2, green); + led_set_pixel_a(num_leds_a - 3, green); + } + + // Blinking white lights (positions 5-6 and 37-38 from original) + if (blink_state < FRAMES_PER_SECOND / 2) + { + if (num_leds_a > 6) + { + led_set_pixel_a(5, white); + led_set_pixel_a(6, white); + } + if (num_leds_b > 2) + { + led_set_pixel_b(1, white); + led_set_pixel_b(2, white); + } + else if (num_leds_a > 38) + { + led_set_pixel_a(37, white); + led_set_pixel_a(38, white); + } + } + + blink_state = (blink_state + 1) % FRAMES_PER_SECOND; +} + +static void anim_chase(void) +{ + // Red dot sweeping with trailing dots + led_clear_all(); + + uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); + int16_t pos = beatsin16(40, 0, num_leds - 1); + + rgb_t red = {255, 0, 0}; + + // Set main dot and trailing dots + for (int offset = -2; offset <= 2; offset++) + { + int16_t led_pos = pos + offset; + if (led_pos >= 0 && led_pos < num_leds) + { + if (led_pos < led_get_num_leds_a()) + { + led_set_pixel_a(led_pos, red); + } + else + { + led_set_pixel_b(led_pos - led_get_num_leds_a(), red); + } + } + } +} + +static void anim_chase_rgb(void) +{ + // RGB cycling dot sweeping with trailing dots + led_clear_all(); + + uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); + int16_t pos = beatsin16(40, 0, num_leds - 1); + + hsv_t hsv = {global_hue, 255, 192}; + rgb_t color = led_hsv_to_rgb(hsv); + + // Set main dot and trailing dots + for (int offset = -2; offset <= 2; offset++) + { + int16_t led_pos = pos + offset; + if (led_pos >= 0 && led_pos < num_leds) + { + if (led_pos < led_get_num_leds_a()) + { + led_add_pixel_a(led_pos, color); + } + else + { + led_add_pixel_b(led_pos - led_get_num_leds_a(), color); + } + } + } +} + +static void anim_random(void) +{ + // Random LEDs get random colors + uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); + uint16_t random_pos = random16(num_leds); + + // Randomly clear all (rare event) + if (random_pos == num_leds - 1 && random8() > 200) + { + led_clear_all(); + return; + } + + // Set random LED to random color + rgb_t random_color = { + random8(), + random8(), + random8()}; + + if (random_pos < led_get_num_leds_a()) + { + led_set_pixel_a(random_pos, random_color); + } + else + { + led_set_pixel_b(random_pos - led_get_num_leds_a(), random_color); + } +} + +esp_err_t animation_init(void) +{ + current_mode = ANIM_BLACK; + global_hue = 0; + frame_counter = 0; + + ESP_LOGI(TAG, "Animation system initialized"); + return ESP_OK; +} + +void animation_set_mode(animation_mode_t mode) +{ + if (mode >= ANIM_MODE_COUNT) + { + mode = ANIM_BLACK; + } + + current_mode = mode; + frame_counter = 0; + + ESP_LOGI(TAG, "Animation mode set to: %s", animation_get_mode_name(mode)); +} + +animation_mode_t animation_get_mode(void) +{ + return current_mode; +} + +void animation_update(void) +{ + // Update global hue every frame (slowly cycles colors) + frame_counter++; + if (frame_counter % 3 == 0) + { + global_hue++; + } + + // Execute current animation + switch (current_mode) + { + case ANIM_BLACK: + anim_black(); + break; + case ANIM_RED: + anim_red(); + break; + case ANIM_BLUE: + anim_blue(); + break; + case ANIM_GREEN: + anim_green(); + break; + case ANIM_WHITE: + anim_white(); + break; + case ANIM_RAINBOW: + anim_rainbow(); + break; + case ANIM_RAINBOW_GLITTER: + anim_rainbow_glitter(); + break; + case ANIM_CONFETTI: + anim_confetti(); + break; + case ANIM_SINELON: + anim_sinelon(); + break; + case ANIM_BPM: + anim_bpm(); + break; + case ANIM_NAVIGATION: + anim_navigation(); + break; + case ANIM_CHASE: + anim_chase(); + break; + case ANIM_CHASE_RGB: + anim_chase_rgb(); + break; + case ANIM_RANDOM: + anim_random(); + break; + default: + anim_black(); + break; + } + + led_show(); +} + +const char *animation_get_mode_name(animation_mode_t mode) +{ + static const char *mode_names[] = { + "Black", + "Red", + "Blue", + "Green", + "White", + "Rainbow", + "Rainbow with Glitter", + "Confetti", + "Sinelon", + "BPM", + "Navigation", + "Chase", + "Chase RGB", + "Random"}; + + if (mode >= ANIM_MODE_COUNT) + { + return "Unknown"; + } + + return mode_names[mode]; +} diff --git a/main/animation.h b/main/animation.h new file mode 100644 index 0000000..0430f0f --- /dev/null +++ b/main/animation.h @@ -0,0 +1,63 @@ +/** + * @file animation.h + * @brief LED animation patterns + */ + +#ifndef ANIMATION_H +#define ANIMATION_H + +#include +#include "esp_err.h" + +/** + * @brief Animation modes + */ +typedef enum { + ANIM_BLACK = 0, // All off + ANIM_RED = 1, // All red + ANIM_BLUE = 2, // All blue + ANIM_GREEN = 3, // All green + ANIM_WHITE = 4, // All white + ANIM_RAINBOW = 5, // FastLED rainbow + ANIM_RAINBOW_GLITTER = 6, // Rainbow with glitter + ANIM_CONFETTI = 7, // Random colored speckles + ANIM_SINELON = 8, // Colored dot sweeping (RGB cycling) + ANIM_BPM = 9, // Colored stripes @ 33 BPM + ANIM_NAVIGATION = 10, // Navigation lights (red left, green right) + ANIM_CHASE = 11, // Red dot sweeping + ANIM_CHASE_RGB = 12, // RGB cycling dot sweeping + ANIM_RANDOM = 13, // Random mode + ANIM_MODE_COUNT +} animation_mode_t; + +/** + * @brief Initialize animation system + * @return ESP_OK on success + */ +esp_err_t animation_init(void); + +/** + * @brief Set current animation mode + * @param mode Animation mode + */ +void animation_set_mode(animation_mode_t mode); + +/** + * @brief Get current animation mode + * @return Current mode + */ +animation_mode_t animation_get_mode(void); + +/** + * @brief Update animation (call periodically, e.g., 30-60 FPS) + */ +void animation_update(void); + +/** + * @brief Get animation mode name + * @param mode Animation mode + * @return Mode name string + */ +const char* animation_get_mode_name(animation_mode_t mode); + +#endif // ANIMATION_H diff --git a/main/control.c b/main/control.c new file mode 100644 index 0000000..824c39e --- /dev/null +++ b/main/control.c @@ -0,0 +1,686 @@ +/** + * @file control.c + * @brief Control module implementation with BLE, NVS, and OTA + */ + +#include "control.h" +#include "led.h" +#include "rcsignal.h" +#include "animation.h" + +#include "esp_log.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "nvs.h" +#include "esp_timer.h" +#include "esp_ota_ops.h" +#include "esp_http_server.h" + +#include "esp_bt.h" +#include "esp_gap_ble_api.h" +#include "esp_gatts_api.h" +#include "esp_bt_main.h" +#include "esp_gatt_common_api.h" + +#include + +static const char *TAG = "CONTROL"; + +#define NVS_NAMESPACE "led_ctrl" +#define CONFIG_MAGIC 0xDEADBEEF +#define DEFAULT_NUM_LEDS_A 44 +#define DEFAULT_NUM_LEDS_B 44 + +// BLE Configuration +#define GATTS_SERVICE_UUID 0x00FF +#define GATTS_CHAR_UUID_CONFIG 0xFF01 +#define GATTS_CHAR_UUID_MODE 0xFF02 +#define GATTS_CHAR_UUID_PWM 0xFF03 +#define GATTS_CHAR_UUID_OTA 0xFF04 +#define GATTS_NUM_HANDLE_TEST 8 + +#define DEVICE_NAME "LED-Controller" +#define ADV_CONFIG_FLAG (1 << 0) +#define SCAN_RSP_CONFIG_FLAG (1 << 1) + +// Global state +static controller_config_t current_config = { + .led_pin_strip_a = -1, + .led_pin_strip_b = -1, + .pwm_pin = -1, + .ble_timeout = BLE_TIMEOUT_NEVER, + .magic = CONFIG_MAGIC}; + +static bool ble_enabled = true; +static uint8_t current_animation_mode = 0; +static esp_timer_handle_t ble_timeout_timer = NULL; +static bool ble_connected = false; + +// OTA state +static const esp_partition_t *update_partition = NULL; +static esp_ota_handle_t update_handle = 0; +static size_t ota_bytes_written = 0; + +// BLE variables +static uint8_t adv_config_done = 0; +static uint16_t gatts_if_global = ESP_GATT_IF_NONE; +static uint16_t conn_id_global = 0; +static uint16_t service_handle = 0; + +// BLE advertising parameters +static esp_ble_adv_params_t adv_params = { + .adv_int_min = 0x20, + .adv_int_max = 0x40, + .adv_type = ADV_TYPE_IND, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .channel_map = ADV_CHNL_ALL, + .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, +}; + +// Characteristic handles +static struct +{ + uint16_t config_handle; + uint16_t mode_handle; + uint16_t pwm_handle; + uint16_t ota_handle; +} char_handles = {0}; + +// Forward declarations +static void ble_timeout_callback(void *arg); +static void on_mode_change(uint8_t new_mode); + +// NVS Functions +static esp_err_t load_config_from_nvs(void) +{ + nvs_handle_t nvs_handle; + esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle); + if (err != ESP_OK) + { + ESP_LOGW(TAG, "NVS not found, using defaults"); + return ESP_ERR_NOT_FOUND; + } + + size_t required_size = sizeof(controller_config_t); + err = nvs_get_blob(nvs_handle, "config", ¤t_config, &required_size); + nvs_close(nvs_handle); + + if (err != ESP_OK || current_config.magic != CONFIG_MAGIC) + { + ESP_LOGW(TAG, "Invalid config in NVS, using defaults"); + return ESP_ERR_INVALID_STATE; + } + + ESP_LOGI(TAG, "Loaded config from NVS"); + ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a); + ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b); + ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin); + ESP_LOGI(TAG, " BLE Timeout: %d", current_config.ble_timeout); + + return ESP_OK; +} + +static esp_err_t save_config_to_nvs(void) +{ + nvs_handle_t nvs_handle; + esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs_handle); + if (err != ESP_OK) + { + return err; + } + + current_config.magic = CONFIG_MAGIC; + err = nvs_set_blob(nvs_handle, "config", ¤t_config, sizeof(controller_config_t)); + if (err == ESP_OK) + { + err = nvs_commit(nvs_handle); + } + + nvs_close(nvs_handle); + + if (err == ESP_OK) + { + ESP_LOGI(TAG, "Config saved to NVS"); + } + else + { + ESP_LOGE(TAG, "Failed to save config: %s", esp_err_to_name(err)); + } + + return err; +} + +esp_err_t control_reset_config(void) +{ + current_config.led_pin_strip_a = -1; + current_config.led_pin_strip_b = -1; + current_config.pwm_pin = -1; + current_config.ble_timeout = BLE_TIMEOUT_NEVER; + current_config.magic = CONFIG_MAGIC; + + return save_config_to_nvs(); +} + +const controller_config_t *control_get_config(void) +{ + return ¤t_config; +} + +esp_err_t control_update_config(const controller_config_t *config) +{ + if (!config) + { + return ESP_ERR_INVALID_ARG; + } + + // Reinitialize if pins changed + bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) || + (current_config.led_pin_strip_b != config->led_pin_strip_b) || + (current_config.pwm_pin != config->pwm_pin); + + memcpy(¤t_config, config, sizeof(controller_config_t)); + esp_err_t err = save_config_to_nvs(); + + if (err == ESP_OK && pins_changed) + { + ESP_LOGI(TAG, "Restarting to apply new pin configuration..."); + vTaskDelay(pdMS_TO_TICKS(1000)); + esp_restart(); + } + + return err; +} + +// BLE timeout handling +static void ble_timeout_callback(void *arg) +{ + if (!ble_connected) + { + ESP_LOGI(TAG, "BLE timeout reached, disabling BLE"); + control_disable_ble(); + } +} + +static void start_ble_timeout(void) +{ + if (current_config.ble_timeout == BLE_TIMEOUT_NEVER) + { + return; + } + + if (ble_timeout_timer == NULL) + { + esp_timer_create_args_t timer_args = { + .callback = ble_timeout_callback, + .name = "ble_timeout"}; + esp_timer_create(&timer_args, &ble_timeout_timer); + } + + esp_timer_stop(ble_timeout_timer); + esp_timer_start_once(ble_timeout_timer, (uint64_t)current_config.ble_timeout * 1000000ULL); + ESP_LOGI(TAG, "BLE timeout started: %d seconds", current_config.ble_timeout); +} + +void control_disable_ble(void) +{ + if (!ble_enabled) + return; + + ble_enabled = false; + + if (ble_timeout_timer) + { + esp_timer_stop(ble_timeout_timer); + } + + // Stop BLE advertising + esp_ble_gap_stop_advertising(); + + ESP_LOGI(TAG, "BLE disabled"); +} + +bool control_is_ble_enabled(void) +{ + return ble_enabled; +} + +// Animation mode change callback +static void on_mode_change(uint8_t new_mode) +{ + current_animation_mode = new_mode; + animation_set_mode((animation_mode_t)new_mode); +} + +void control_set_animation_mode(uint8_t mode) +{ + if (mode >= ANIM_MODE_COUNT) + { + mode = 0; + } + on_mode_change(mode); +} + +uint8_t control_get_animation_mode(void) +{ + return current_animation_mode; +} + +void control_emulate_pwm_pulse(void) +{ + rcsignal_trigger_mode_change(); +} + +// Embedded web files (will be linked) +extern const uint8_t index_html_start[] asm("_binary_index_html_start"); +extern const uint8_t index_html_end[] asm("_binary_index_html_end"); +extern const uint8_t app_js_start[] asm("_binary_app_js_start"); +extern const uint8_t app_js_end[] asm("_binary_app_js_end"); +extern const uint8_t style_css_start[] asm("_binary_style_css_start"); +extern const uint8_t style_css_end[] asm("_binary_style_css_end"); +extern const uint8_t favicon_ico_start[] asm("_binary_favicon_ico_start"); +extern const uint8_t favicon_ico_end[] asm("_binary_favicon_ico_end"); + +// BLE GAP event handler +static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) +{ + ESP_LOGI(TAG, "gap_event_handler() event: %i\n", event); + switch (event) + { + case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: + adv_config_done &= (~ADV_CONFIG_FLAG); + if (adv_config_done == 0) + { + esp_ble_gap_start_advertising(&adv_params); + } + break; + + case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: + adv_config_done &= (~SCAN_RSP_CONFIG_FLAG); + if (adv_config_done == 0) + { + esp_ble_gap_start_advertising(&adv_params); + } + break; + + case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: + if (param->adv_start_cmpl.status == ESP_BT_STATUS_SUCCESS) + { + ESP_LOGI(TAG, "BLE advertising started"); + } + break; + + default: + break; + } +} + +// BLE GATTS event handler +static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) +{ + switch (event) + { + case ESP_GATTS_REG_EVT: + ESP_LOGI(TAG, "GATTS register, status %d, app_id %d", param->reg.status, param->reg.app_id); + gatts_if_global = gatts_if; + + // Set device name + esp_ble_gap_set_device_name(DEVICE_NAME); + + // Config advertising data + esp_ble_adv_data_t adv_data = { + .set_scan_rsp = false, + .include_name = true, + .include_txpower = true, + .min_interval = 0x0006, + .max_interval = 0x0010, + .appearance = 0x00, + .manufacturer_len = 0, + .p_manufacturer_data = NULL, + .service_data_len = 0, + .p_service_data = NULL, + .service_uuid_len = sizeof(uint16_t), + .p_service_uuid = (uint8_t[]){GATTS_SERVICE_UUID & 0xFF, (GATTS_SERVICE_UUID >> 8) & 0xFF}, + .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), + }; + esp_ble_gap_config_adv_data(&adv_data); + adv_config_done |= ADV_CONFIG_FLAG; + + // Create service + esp_gatt_srvc_id_t service_id = { + .is_primary = true, + .id.inst_id = 0, + .id.uuid.len = ESP_UUID_LEN_16, + .id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID, + }; + esp_ble_gatts_create_service(gatts_if, &service_id, GATTS_NUM_HANDLE_TEST); + break; + + case ESP_GATTS_CREATE_EVT: + ESP_LOGI(TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d", param->create.status, param->create.service_handle); + service_handle = param->create.service_handle; + + esp_ble_gatts_start_service(service_handle); + + // Add characteristics + esp_bt_uuid_t char_uuid; + char_uuid.len = ESP_UUID_LEN_16; + + // Config characteristic + char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_CONFIG; + esp_ble_gatts_add_char(service_handle, &char_uuid, + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE, + NULL, NULL); + + // Mode characteristic + char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_MODE; + esp_ble_gatts_add_char(service_handle, &char_uuid, + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY, + NULL, NULL); + + // PWM emulation characteristic + char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_PWM; + esp_ble_gatts_add_char(service_handle, &char_uuid, + ESP_GATT_PERM_WRITE, + ESP_GATT_CHAR_PROP_BIT_WRITE, + NULL, NULL); + + // OTA characteristic + char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_OTA; + esp_ble_gatts_add_char(service_handle, &char_uuid, + ESP_GATT_PERM_WRITE, + ESP_GATT_CHAR_PROP_BIT_WRITE, + NULL, NULL); + break; + + case ESP_GATTS_ADD_CHAR_EVT: + ESP_LOGI(TAG, "ADD_CHAR_EVT, status %d, char_handle %d", param->add_char.status, param->add_char.attr_handle); + + // Store handles + if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_CONFIG) + { + char_handles.config_handle = param->add_char.attr_handle; + } + else if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_MODE) + { + char_handles.mode_handle = param->add_char.attr_handle; + } + else if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_PWM) + { + char_handles.pwm_handle = param->add_char.attr_handle; + } + else if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_OTA) + { + char_handles.ota_handle = param->add_char.attr_handle; + } + break; + + case ESP_GATTS_CONNECT_EVT: + ESP_LOGI(TAG, "BLE device connected"); + conn_id_global = param->connect.conn_id; + ble_connected = true; + + // Stop timeout timer when connected + if (ble_timeout_timer) + { + esp_timer_stop(ble_timeout_timer); + } + break; + + case ESP_GATTS_DISCONNECT_EVT: + ESP_LOGI(TAG, "BLE device disconnected"); + ble_connected = false; + + // Restart advertising and timeout + if (ble_enabled) + { + esp_ble_gap_start_advertising(&adv_params); + start_ble_timeout(); + } + break; + + case ESP_GATTS_READ_EVT: + ESP_LOGI(TAG, "GATTS_READ_EVT, handle %d", param->read.handle); + + esp_gatt_rsp_t rsp; + memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); + rsp.attr_value.handle = param->read.handle; + + if (param->read.handle == char_handles.config_handle) + { + rsp.attr_value.len = sizeof(controller_config_t); + memcpy(rsp.attr_value.value, ¤t_config, sizeof(controller_config_t)); + } + else if (param->read.handle == char_handles.mode_handle) + { + rsp.attr_value.len = 1; + rsp.attr_value.value[0] = current_animation_mode; + } + + esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, + ESP_GATT_OK, &rsp); + break; + + case ESP_GATTS_WRITE_EVT: + ESP_LOGI(TAG, "GATTS_WRITE_EVT, handle %d, len %d", param->write.handle, param->write.len); + + if (param->write.handle == char_handles.config_handle) + { + // Update configuration + if (param->write.len == sizeof(controller_config_t)) + { + controller_config_t new_config; + memcpy(&new_config, param->write.value, sizeof(controller_config_t)); + control_update_config(&new_config); + } + } + else if (param->write.handle == char_handles.mode_handle) + { + // Set animation mode + if (param->write.len == 1) + { + control_set_animation_mode(param->write.value[0]); + } + } + else if (param->write.handle == char_handles.pwm_handle) + { + // Emulate PWM pulse + control_emulate_pwm_pulse(); + } + else if (param->write.handle == char_handles.ota_handle) + { + // Handle OTA data + if (ota_bytes_written == 0) + { + // First packet - start OTA + ESP_LOGI(TAG, "Starting OTA update..."); + update_partition = esp_ota_get_next_update_partition(NULL); + if (update_partition == NULL) + { + ESP_LOGE(TAG, "No OTA partition found"); + break; + } + + esp_err_t err = esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN, &update_handle); + if (err != ESP_OK) + { + ESP_LOGE(TAG, "OTA begin failed: %s", esp_err_to_name(err)); + break; + } + } + + // Write OTA data + esp_err_t err = esp_ota_write(update_handle, param->write.value, param->write.len); + if (err != ESP_OK) + { + ESP_LOGE(TAG, "OTA write failed: %s", esp_err_to_name(err)); + esp_ota_abort(update_handle); + ota_bytes_written = 0; + break; + } + + ota_bytes_written += param->write.len; + ESP_LOGI(TAG, "OTA progress: %d bytes", ota_bytes_written); + + // Check if this is the last packet (indicated by packet size < MTU) + if (param->write.len < 512) + { + ESP_LOGI(TAG, "OTA complete, total bytes: %d", ota_bytes_written); + + err = esp_ota_end(update_handle); + if (err != ESP_OK) + { + ESP_LOGE(TAG, "OTA end failed: %s", esp_err_to_name(err)); + break; + } + + err = esp_ota_set_boot_partition(update_partition); + if (err != ESP_OK) + { + ESP_LOGE(TAG, "OTA set boot partition failed: %s", esp_err_to_name(err)); + break; + } + + // Reset configuration + control_reset_config(); + + ESP_LOGI(TAG, "OTA successful, restarting..."); + vTaskDelay(pdMS_TO_TICKS(1000)); + esp_restart(); + } + } + + if (!param->write.is_prep) + { + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, + ESP_GATT_OK, NULL); + } + break; + + default: + break; + } +} + +// Initialize BLE +static esp_err_t init_ble(void) +{ + if (!ble_enabled) + { + ESP_LOGI(TAG, "BLE disabled by configuration"); + return ESP_OK; + } + + esp_err_t ret; + + // Initialize BT controller + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + ret = esp_bt_controller_init(&bt_cfg); + if (ret) + { + ESP_LOGE(TAG, "BT controller init failed: %s", esp_err_to_name(ret)); + return ret; + } + + ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); + if (ret) + { + ESP_LOGE(TAG, "BT controller enable failed: %s", esp_err_to_name(ret)); + return ret; + } + + ret = esp_bluedroid_init(); + if (ret) + { + ESP_LOGE(TAG, "Bluedroid init failed: %s", esp_err_to_name(ret)); + return ret; + } + + ret = esp_bluedroid_enable(); + if (ret) + { + ESP_LOGE(TAG, "Bluedroid enable failed: %s", esp_err_to_name(ret)); + return ret; + } + + // Register callbacks + esp_ble_gatts_register_callback(gatts_event_handler); + esp_ble_gap_register_callback(gap_event_handler); + esp_ble_gatts_app_register(0); + + // Set MTU + esp_ble_gatt_set_local_mtu(517); + + // Start timeout timer + start_ble_timeout(); + + esp_ble_gatts_app_register(0); + + vTaskDelay(pdMS_TO_TICKS(100)); + esp_ble_gap_start_advertising(&adv_params); + + ESP_LOGI(TAG, "BLE initialized"); + + return ESP_OK; +} + +// Main initialization +esp_err_t control_init(void) +{ + esp_err_t ret; + + ESP_LOGI(TAG, "Initializing LED Controller..."); + + // Initialize NVS + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // Load configuration + load_config_from_nvs(); + + // Initialize LED strips + ret = led_init(current_config.led_pin_strip_a, current_config.led_pin_strip_b, + DEFAULT_NUM_LEDS_A, DEFAULT_NUM_LEDS_B); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "LED init failed: %s", esp_err_to_name(ret)); + return ret; + } + + // Initialize animation system + ret = animation_init(); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Animation init failed: %s", esp_err_to_name(ret)); + return ret; + } + + // Initialize RC signal + ret = rcsignal_init(current_config.pwm_pin); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "RC signal init failed: %s", esp_err_to_name(ret)); + return ret; + } + + // Register mode change callback + rcsignal_register_callback(on_mode_change); + + // Initialize BLE + ret = init_ble(); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "BLE init failed: %s", esp_err_to_name(ret)); + return ret; + } + + ESP_LOGI(TAG, "Control system initialized successfully"); + + return ESP_OK; +} diff --git a/main/control.h b/main/control.h new file mode 100644 index 0000000..cc15cdf --- /dev/null +++ b/main/control.h @@ -0,0 +1,87 @@ +/** + * @file control.h + * @brief Control module for LED controller - handles initialization of LEDs, PWM, and Bluetooth + */ + +#ifndef CONTROL_H +#define CONTROL_H + +#include "esp_err.h" +#include +#include + +/** + * @brief BLE auto-off timeout options + */ +typedef enum { + BLE_TIMEOUT_NEVER = 0, + BLE_TIMEOUT_1MIN = 60, + BLE_TIMEOUT_5MIN = 300 +} ble_timeout_t; + +/** + * @brief Configuration structure stored in NVS + */ +typedef struct { + int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) + int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) + int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) + ble_timeout_t ble_timeout; // BLE auto-off timeout + uint32_t magic; // Magic number to validate config (0xDEADBEEF) +} controller_config_t; + +/** + * @brief Initialize the control system + * Loads configuration from NVS and initializes subsystems + * @return ESP_OK on success + */ +esp_err_t control_init(void); + +/** + * @brief Get current configuration + * @return Pointer to current configuration (read-only) + */ +const controller_config_t* control_get_config(void); + +/** + * @brief Update configuration and save to NVS + * @param config New configuration + * @return ESP_OK on success + */ +esp_err_t control_update_config(const controller_config_t* config); + +/** + * @brief Reset configuration to defaults + * @return ESP_OK on success + */ +esp_err_t control_reset_config(void); + +/** + * @brief Get BLE enabled status + * @return true if BLE is enabled + */ +bool control_is_ble_enabled(void); + +/** + * @brief Manually disable BLE + */ +void control_disable_ble(void); + +/** + * @brief Emulate PWM pulse (for web button) + */ +void control_emulate_pwm_pulse(void); + +/** + * @brief Set animation mode manually + * @param mode Animation mode (0-13) + */ +void control_set_animation_mode(uint8_t mode); + +/** + * @brief Get current animation mode + * @return Current mode (0-13) + */ +uint8_t control_get_animation_mode(void); + +#endif // CONTROL_H diff --git a/main/led.c b/main/led.c new file mode 100644 index 0000000..d3bd2e4 --- /dev/null +++ b/main/led.c @@ -0,0 +1,476 @@ +/** + * @file led.c + * @brief WS2812B LED strip control implementation using RMT + */ + +#include "led.h" +#include "driver/rmt_tx.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include +#include + +static const char *TAG = "LED"; + +// WS2812B timing (in nanoseconds) +#define WS2812_T0H_NS 350 +#define WS2812_T0L_NS 900 +#define WS2812_T1H_NS 900 +#define WS2812_T1L_NS 350 +#define WS2812_RESET_US 280 + +// LED strip data structures +typedef struct +{ + rmt_channel_handle_t rmt_channel; + rmt_encoder_handle_t encoder; + rgb_t *buffer; + uint16_t num_leds; + int8_t gpio_pin; + bool initialized; +} led_strip_t; + +static led_strip_t strip_a = {0}; +static led_strip_t strip_b = {0}; +static SemaphoreHandle_t led_mutex = NULL; + +// RMT encoder for WS2812B +typedef struct +{ + rmt_encoder_t base; + rmt_encoder_t *bytes_encoder; + rmt_encoder_t *copy_encoder; + int state; + rmt_symbol_word_t reset_code; +} rmt_led_strip_encoder_t; + +static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, + const void *primary_data, size_t data_size, + rmt_encode_state_t *ret_state) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encode_state_t session_state = RMT_ENCODING_RESET; + rmt_encode_state_t state = RMT_ENCODING_RESET; + size_t encoded_symbols = 0; + + switch (led_encoder->state) + { + case 0: // send RGB data + encoded_symbols += led_encoder->bytes_encoder->encode(led_encoder->bytes_encoder, channel, + primary_data, data_size, &session_state); + if (session_state & RMT_ENCODING_COMPLETE) + { + led_encoder->state = 1; // switch to next state when current encoding session finished + } + if (session_state & RMT_ENCODING_MEM_FULL) + { + state |= RMT_ENCODING_MEM_FULL; + goto out; + } + // fall-through + case 1: // send reset code + encoded_symbols += led_encoder->copy_encoder->encode(led_encoder->copy_encoder, channel, + &led_encoder->reset_code, + sizeof(led_encoder->reset_code), &session_state); + if (session_state & RMT_ENCODING_COMPLETE) + { + led_encoder->state = RMT_ENCODING_RESET; + state |= RMT_ENCODING_COMPLETE; + } + if (session_state & RMT_ENCODING_MEM_FULL) + { + state |= RMT_ENCODING_MEM_FULL; + goto out; + } + } +out: + *ret_state = state; + return encoded_symbols; +} + +static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_del_encoder(led_encoder->bytes_encoder); + rmt_del_encoder(led_encoder->copy_encoder); + free(led_encoder); + return ESP_OK; +} + +static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_reset(led_encoder->bytes_encoder); + rmt_encoder_reset(led_encoder->copy_encoder); + led_encoder->state = RMT_ENCODING_RESET; + return ESP_OK; +} + +static esp_err_t rmt_new_led_strip_encoder(rmt_encoder_handle_t *ret_encoder) +{ + esp_err_t ret = ESP_OK; + rmt_led_strip_encoder_t *led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t)); + if (!led_encoder) + { + return ESP_ERR_NO_MEM; + } + + led_encoder->base.encode = rmt_encode_led_strip; + led_encoder->base.del = rmt_del_led_strip_encoder; + led_encoder->base.reset = rmt_led_strip_encoder_reset; + + // WS2812 timing + rmt_bytes_encoder_config_t bytes_encoder_config = { + .bit0 = { + .level0 = 1, + .duration0 = WS2812_T0H_NS * 80 / 1000, // 80MHz clock + .level1 = 0, + .duration1 = WS2812_T0L_NS * 80 / 1000, + }, + .bit1 = { + .level0 = 1, + .duration0 = WS2812_T1H_NS * 80 / 1000, + .level1 = 0, + .duration1 = WS2812_T1L_NS * 80 / 1000, + }, + .flags.msb_first = 1, + }; + ret = rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder); + if (ret != ESP_OK) + { + goto err; + } + + rmt_copy_encoder_config_t copy_encoder_config = {}; + ret = rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder); + if (ret != ESP_OK) + { + goto err; + } + + uint32_t reset_ticks = WS2812_RESET_US * 80; // 80MHz + led_encoder->reset_code = (rmt_symbol_word_t){ + .level0 = 0, + .duration0 = reset_ticks & 0x7FFF, + .level1 = 0, + .duration1 = reset_ticks & 0x7FFF, + }; + + *ret_encoder = &led_encoder->base; + return ESP_OK; + +err: + if (led_encoder->bytes_encoder) + { + rmt_del_encoder(led_encoder->bytes_encoder); + } + if (led_encoder->copy_encoder) + { + rmt_del_encoder(led_encoder->copy_encoder); + } + free(led_encoder); + return ret; +} + +static esp_err_t init_strip(led_strip_t *strip, int8_t pin, uint16_t num_leds) +{ + if (pin < 0 || num_leds == 0) + { + return ESP_OK; // Skip if not configured + } + + strip->buffer = calloc(num_leds, sizeof(rgb_t)); + if (!strip->buffer) + { + return ESP_ERR_NO_MEM; + } + + strip->num_leds = num_leds; + strip->gpio_pin = pin; + + rmt_tx_channel_config_t tx_chan_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, + .gpio_num = pin, + .mem_block_symbols = 64, + .resolution_hz = 80000000, // 80MHz + .trans_queue_depth = 4, + }; + + ESP_ERROR_CHECK(rmt_new_tx_channel(&tx_chan_config, &strip->rmt_channel)); + ESP_ERROR_CHECK(rmt_new_led_strip_encoder(&strip->encoder)); + ESP_ERROR_CHECK(rmt_enable(strip->rmt_channel)); + + strip->initialized = true; + ESP_LOGI(TAG, "Initialized strip on GPIO%d with %d LEDs", pin, num_leds); + + return ESP_OK; +} + +esp_err_t led_init(int8_t pin_a, int8_t pin_b, uint16_t num_leds_a, uint16_t num_leds_b) +{ + if (led_mutex == NULL) + { + led_mutex = xSemaphoreCreateMutex(); + if (!led_mutex) + { + return ESP_ERR_NO_MEM; + } + } + + esp_err_t ret = ESP_OK; + + if (pin_a >= 0) + { + ret = init_strip(&strip_a, pin_a, num_leds_a); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to init strip A: %s", esp_err_to_name(ret)); + return ret; + } + } + + if (pin_b >= 0) + { + ret = init_strip(&strip_b, pin_b, num_leds_b); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to init strip B: %s", esp_err_to_name(ret)); + return ret; + } + } + + return ESP_OK; +} + +void led_deinit(void) +{ + if (strip_a.initialized) + { + rmt_disable(strip_a.rmt_channel); + rmt_del_channel(strip_a.rmt_channel); + free(strip_a.buffer); + strip_a.initialized = false; + } + + if (strip_b.initialized) + { + rmt_disable(strip_b.rmt_channel); + rmt_del_channel(strip_b.rmt_channel); + free(strip_b.buffer); + strip_b.initialized = false; + } +} + +void led_set_pixel_a(uint16_t index, rgb_t color) +{ + if (!strip_a.initialized || index >= strip_a.num_leds) + return; + xSemaphoreTake(led_mutex, portMAX_DELAY); + strip_a.buffer[index] = color; + xSemaphoreGive(led_mutex); +} + +void led_set_pixel_b(uint16_t index, rgb_t color) +{ + if (!strip_b.initialized || index >= strip_b.num_leds) + return; + xSemaphoreTake(led_mutex, portMAX_DELAY); + strip_b.buffer[index] = color; + xSemaphoreGive(led_mutex); +} + +void led_fill_a(rgb_t color) +{ + if (!strip_a.initialized) + return; + xSemaphoreTake(led_mutex, portMAX_DELAY); + for (uint16_t i = 0; i < strip_a.num_leds; i++) + { + strip_a.buffer[i] = color; + } + xSemaphoreGive(led_mutex); +} + +void led_fill_b(rgb_t color) +{ + if (!strip_b.initialized) + return; + xSemaphoreTake(led_mutex, portMAX_DELAY); + for (uint16_t i = 0; i < strip_b.num_leds; i++) + { + strip_b.buffer[i] = color; + } + xSemaphoreGive(led_mutex); +} + +void led_clear_all(void) +{ + rgb_t black = {0, 0, 0}; + led_fill_a(black); + led_fill_b(black); +} + +static void show_strip(led_strip_t *strip) +{ + if (!strip->initialized) + return; + + // Convert RGB to GRB for WS2812B + uint8_t *grb_data = malloc(strip->num_leds * 3); + if (!grb_data) + return; + + for (uint16_t i = 0; i < strip->num_leds; i++) + { + grb_data[i * 3 + 0] = strip->buffer[i].g; + grb_data[i * 3 + 1] = strip->buffer[i].r; + grb_data[i * 3 + 2] = strip->buffer[i].b; + } + + rmt_transmit_config_t tx_config = { + .loop_count = 0, + }; + + rmt_transmit(strip->rmt_channel, strip->encoder, grb_data, strip->num_leds * 3, &tx_config); + free(grb_data); +} + +void led_show(void) +{ + xSemaphoreTake(led_mutex, portMAX_DELAY); + show_strip(&strip_a); + show_strip(&strip_b); + xSemaphoreGive(led_mutex); +} + +void led_fade_to_black(uint8_t amount) +{ + xSemaphoreTake(led_mutex, portMAX_DELAY); + + if (strip_a.initialized) + { + for (uint16_t i = 0; i < strip_a.num_leds; i++) + { + strip_a.buffer[i].r = (strip_a.buffer[i].r * (255 - amount)) / 255; + strip_a.buffer[i].g = (strip_a.buffer[i].g * (255 - amount)) / 255; + strip_a.buffer[i].b = (strip_a.buffer[i].b * (255 - amount)) / 255; + } + } + + if (strip_b.initialized) + { + for (uint16_t i = 0; i < strip_b.num_leds; i++) + { + strip_b.buffer[i].r = (strip_b.buffer[i].r * (255 - amount)) / 255; + strip_b.buffer[i].g = (strip_b.buffer[i].g * (255 - amount)) / 255; + strip_b.buffer[i].b = (strip_b.buffer[i].b * (255 - amount)) / 255; + } + } + + xSemaphoreGive(led_mutex); +} + +rgb_t led_hsv_to_rgb(hsv_t hsv) +{ + rgb_t rgb = {0}; + uint8_t region, remainder, p, q, t; + + if (hsv.s == 0) + { + rgb.r = hsv.v; + rgb.g = hsv.v; + rgb.b = hsv.v; + return rgb; + } + + region = hsv.h / 43; + remainder = (hsv.h - (region * 43)) * 6; + + p = (hsv.v * (255 - hsv.s)) >> 8; + q = (hsv.v * (255 - ((hsv.s * remainder) >> 8))) >> 8; + t = (hsv.v * (255 - ((hsv.s * (255 - remainder)) >> 8))) >> 8; + + switch (region) + { + case 0: + rgb.r = hsv.v; + rgb.g = t; + rgb.b = p; + break; + case 1: + rgb.r = q; + rgb.g = hsv.v; + rgb.b = p; + break; + case 2: + rgb.r = p; + rgb.g = hsv.v; + rgb.b = t; + break; + case 3: + rgb.r = p; + rgb.g = q; + rgb.b = hsv.v; + break; + case 4: + rgb.r = t; + rgb.g = p; + rgb.b = hsv.v; + break; + default: + rgb.r = hsv.v; + rgb.g = p; + rgb.b = q; + break; + } + + return rgb; +} + +uint16_t led_get_num_leds_a(void) { return strip_a.num_leds; } +uint16_t led_get_num_leds_b(void) { return strip_b.num_leds; } + +rgb_t led_get_pixel_a(uint16_t index) +{ + rgb_t color = {0}; + if (!strip_a.initialized || index >= strip_a.num_leds) + return color; + xSemaphoreTake(led_mutex, portMAX_DELAY); + color = strip_a.buffer[index]; + xSemaphoreGive(led_mutex); + return color; +} + +rgb_t led_get_pixel_b(uint16_t index) +{ + rgb_t color = {0}; + if (!strip_b.initialized || index >= strip_b.num_leds) + return color; + xSemaphoreTake(led_mutex, portMAX_DELAY); + color = strip_b.buffer[index]; + xSemaphoreGive(led_mutex); + return color; +} + +void led_add_pixel_a(uint16_t index, rgb_t color) +{ + if (!strip_a.initialized || index >= strip_a.num_leds) + return; + xSemaphoreTake(led_mutex, portMAX_DELAY); + strip_a.buffer[index].r = (strip_a.buffer[index].r + color.r > 255) ? 255 : strip_a.buffer[index].r + color.r; + strip_a.buffer[index].g = (strip_a.buffer[index].g + color.g > 255) ? 255 : strip_a.buffer[index].g + color.g; + strip_a.buffer[index].b = (strip_a.buffer[index].b + color.b > 255) ? 255 : strip_a.buffer[index].b + color.b; + xSemaphoreGive(led_mutex); +} + +void led_add_pixel_b(uint16_t index, rgb_t color) +{ + if (!strip_b.initialized || index >= strip_b.num_leds) + return; + xSemaphoreTake(led_mutex, portMAX_DELAY); + strip_b.buffer[index].r = (strip_b.buffer[index].r + color.r > 255) ? 255 : strip_b.buffer[index].r + color.r; + strip_b.buffer[index].g = (strip_b.buffer[index].g + color.g > 255) ? 255 : strip_b.buffer[index].g + color.g; + strip_b.buffer[index].b = (strip_b.buffer[index].b + color.b > 255) ? 255 : strip_b.buffer[index].b + color.b; + xSemaphoreGive(led_mutex); +} diff --git a/main/led.h b/main/led.h new file mode 100644 index 0000000..edec26a --- /dev/null +++ b/main/led.h @@ -0,0 +1,136 @@ +/** + * @file led.h + * @brief LED strip control module for WS2812B + */ + +#ifndef LED_H +#define LED_H + +#include +#include "esp_err.h" + +#define LED_STRIP_MAX_LEDS 100 // Maximum LEDs per strip + +/** + * @brief RGB color structure + */ +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; +} rgb_t; + +/** + * @brief HSV color structure + */ +typedef struct { + uint8_t h; // Hue: 0-255 + uint8_t s; // Saturation: 0-255 + uint8_t v; // Value/Brightness: 0-255 +} hsv_t; + +/** + * @brief Initialize LED strips + * @param pin_a GPIO pin for strip A (-1 to disable) + * @param pin_b GPIO pin for strip B (-1 to disable) + * @param num_leds_a Number of LEDs in strip A + * @param num_leds_b Number of LEDs in strip B + * @return ESP_OK on success + */ +esp_err_t led_init(int8_t pin_a, int8_t pin_b, uint16_t num_leds_a, uint16_t num_leds_b); + +/** + * @brief Deinitialize LED strips + */ +void led_deinit(void); + +/** + * @brief Set pixel color on strip A + * @param index LED index + * @param color RGB color + */ +void led_set_pixel_a(uint16_t index, rgb_t color); + +/** + * @brief Set pixel color on strip B + * @param index LED index + * @param color RGB color + */ +void led_set_pixel_b(uint16_t index, rgb_t color); + +/** + * @brief Set all pixels on strip A to same color + * @param color RGB color + */ +void led_fill_a(rgb_t color); + +/** + * @brief Set all pixels on strip B to same color + * @param color RGB color + */ +void led_fill_b(rgb_t color); + +/** + * @brief Clear all pixels on both strips (set to black) + */ +void led_clear_all(void); + +/** + * @brief Refresh/update LED strips to show changes + */ +void led_show(void); + +/** + * @brief Fade all pixels towards black + * @param amount Fade amount (0-255) + */ +void led_fade_to_black(uint8_t amount); + +/** + * @brief Convert HSV to RGB + * @param hsv HSV color + * @return RGB color + */ +rgb_t led_hsv_to_rgb(hsv_t hsv); + +/** + * @brief Get number of LEDs in strip A + * @return Number of LEDs + */ +uint16_t led_get_num_leds_a(void); + +/** + * @brief Get number of LEDs in strip B + * @return Number of LEDs + */ +uint16_t led_get_num_leds_b(void); + +/** + * @brief Get current color of pixel on strip A + * @param index LED index + * @return RGB color + */ +rgb_t led_get_pixel_a(uint16_t index); + +/** + * @brief Get current color of pixel on strip B + * @param index LED index + * @return RGB color + */ +rgb_t led_get_pixel_b(uint16_t index); + +/** + * @brief Add color to existing pixel (blending) + * @param index LED index on strip A + * @param color RGB color to add + */ +void led_add_pixel_a(uint16_t index, rgb_t color); + +/** + * @brief Add color to existing pixel (blending) + * @param index LED index on strip B + * @param color RGB color to add + */ +void led_add_pixel_b(uint16_t index, rgb_t color); + +#endif // LED_H diff --git a/main/main.c b/main/main.c new file mode 100644 index 0000000..0229b06 --- /dev/null +++ b/main/main.c @@ -0,0 +1,94 @@ +/** + * @file main.c + * @brief Main application entry point for LED Controller + */ + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_system.h" + +#include "control.h" +#include "animation.h" +#include "led.h" + +static const char *TAG = "MAIN"; + +#define ANIMATION_UPDATE_RATE_MS 16 // ~60 FPS + +/** + * @brief Animation update task + * Runs continuously to update LED animations + */ +static void animation_task(void *pvParameters) +{ + ESP_LOGI(TAG, "Animation task started"); + + TickType_t last_wake_time = xTaskGetTickCount(); + const TickType_t update_interval = pdMS_TO_TICKS(ANIMATION_UPDATE_RATE_MS); + + while (1) + { + animation_update(); + vTaskDelayUntil(&last_wake_time, update_interval); + } +} + +/** + * @brief Main application entry point + */ +void app_main(void) +{ + ESP_LOGI(TAG, "=============================================="); + ESP_LOGI(TAG, " ESP32 LED Controller for Model Aircraft"); + ESP_LOGI(TAG, "=============================================="); + + // Initialize control system (LEDs, PWM, BLE) + esp_err_t ret = control_init(); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to initialize control system: %s", esp_err_to_name(ret)); + ESP_LOGE(TAG, "System halted. Please reset the device."); + while (1) + { + vTaskDelay(pdMS_TO_TICKS(1000)); + } + } + + // Create animation update task + BaseType_t task_ret = xTaskCreate( + animation_task, + "animation", + 4096, + NULL, + 5, + NULL); + + if (task_ret != pdPASS) + { + ESP_LOGE(TAG, "Failed to create animation task"); + ESP_LOGE(TAG, "System halted. Please reset the device."); + while (1) + { + vTaskDelay(pdMS_TO_TICKS(1000)); + } + } + + ESP_LOGI(TAG, "System initialized successfully"); + ESP_LOGI(TAG, "BLE Device Name: LED-Controller"); + ESP_LOGI(TAG, "Connect via Web-BLE to configure"); + + // Main loop - just monitor system status + while (1) + { + vTaskDelay(pdMS_TO_TICKS(5000)); + + // Periodic status logging + //const controller_config_t *config = control_get_config(); + ESP_LOGI(TAG, "Status - Mode: %d, BLE: %s, PWM Active: %s", + control_get_animation_mode(), + control_is_ble_enabled() ? "ON" : "OFF", + "N/A"); // Could add rcsignal_is_active() here + } +} diff --git a/main/rcsignal.c b/main/rcsignal.c new file mode 100644 index 0000000..13ad38f --- /dev/null +++ b/main/rcsignal.c @@ -0,0 +1,202 @@ +/** + * @file rcsignal.c + * @brief RC PWM signal reading implementation using edge capture + */ + +#include "rcsignal.h" +#include "driver/gpio.h" +#include "esp_timer.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include + +static const char *TAG = "RCSIGNAL"; + +#define MAX_MODES 14 +#define PULSE_THRESHOLD_US 1500 +#define SIGNAL_TIMEOUT_MS 100 + +static struct +{ + int8_t gpio_pin; + volatile uint32_t pulse_width_us; + volatile int64_t last_edge_time; + volatile int64_t pulse_start_time; + volatile bool last_level; + volatile bool signal_active; + volatile bool pull_detected; + uint8_t current_mode; + rcsignal_mode_change_callback_t callback; + bool initialized; + TaskHandle_t monitor_task; +} rcsignal = { + .gpio_pin = -1, + .pulse_width_us = 0, + .last_edge_time = 0, + .pulse_start_time = 0, + .last_level = false, + .signal_active = false, + .pull_detected = false, + .current_mode = 0, + .callback = NULL, + .initialized = false, + .monitor_task = NULL, +}; + +static void IRAM_ATTR gpio_isr_handler(void *arg) +{ + int64_t now = esp_timer_get_time(); + bool level = gpio_get_level(rcsignal.gpio_pin); + + if (level && !rcsignal.last_level) + { + // Rising edge - start of pulse + rcsignal.pulse_start_time = now; + } + else if (!level && rcsignal.last_level) + { + // Falling edge - end of pulse + if (rcsignal.pulse_start_time > 0) + { + rcsignal.pulse_width_us = (uint32_t)(now - rcsignal.pulse_start_time); + rcsignal.last_edge_time = now; + rcsignal.signal_active = true; + } + } + + rcsignal.last_level = level; +} + +static void monitor_task(void *arg) +{ + uint32_t last_pulse_width = 0; + + while (1) + { + vTaskDelay(pdMS_TO_TICKS(10)); + + // Check for signal timeout + int64_t now = esp_timer_get_time(); + if (rcsignal.signal_active && (now - rcsignal.last_edge_time) > (SIGNAL_TIMEOUT_MS * 1000)) + { + rcsignal.signal_active = false; + rcsignal.pulse_width_us = 0; + } + + // Detect mode change (rising edge on PWM signal > 1500us) + if (rcsignal.pulse_width_us != last_pulse_width) + { + last_pulse_width = rcsignal.pulse_width_us; + + if (rcsignal.pulse_width_us < PULSE_THRESHOLD_US) + { + rcsignal.pull_detected = true; + } + + if (rcsignal.pulse_width_us > PULSE_THRESHOLD_US && rcsignal.pull_detected) + { + // Mode change detected + rcsignal.pull_detected = false; + rcsignal.current_mode = (rcsignal.current_mode + 1) % MAX_MODES; + + ESP_LOGI(TAG, "Mode changed to: %d (pulse: %lu us)", + rcsignal.current_mode, rcsignal.pulse_width_us); + + if (rcsignal.callback) + { + rcsignal.callback(rcsignal.current_mode); + } + } + } + } +} + +esp_err_t rcsignal_init(int8_t pin) +{ + if (pin < 0) + { + ESP_LOGI(TAG, "RC signal disabled (no pin configured)"); + return ESP_OK; + } + + rcsignal.gpio_pin = pin; + + // Configure GPIO + gpio_config_t io_conf = { + .pin_bit_mask = (1ULL << pin), + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_ENABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_ANYEDGE, + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + // Install ISR service + ESP_ERROR_CHECK(gpio_install_isr_service(0)); + ESP_ERROR_CHECK(gpio_isr_handler_add(pin, gpio_isr_handler, NULL)); + + // Create monitor task + BaseType_t ret = xTaskCreate(monitor_task, "rcsignal_monitor", 2048, NULL, 5, &rcsignal.monitor_task); + if (ret != pdPASS) + { + gpio_isr_handler_remove(pin); + gpio_uninstall_isr_service(); + return ESP_FAIL; + } + + rcsignal.initialized = true; + ESP_LOGI(TAG, "RC signal initialized on GPIO%d", pin); + + return ESP_OK; +} + +void rcsignal_deinit(void) +{ + if (!rcsignal.initialized) + return; + + if (rcsignal.monitor_task) + { + vTaskDelete(rcsignal.monitor_task); + rcsignal.monitor_task = NULL; + } + + if (rcsignal.gpio_pin >= 0) + { + gpio_isr_handler_remove(rcsignal.gpio_pin); + } + + rcsignal.initialized = false; +} + +void rcsignal_register_callback(rcsignal_mode_change_callback_t callback) +{ + rcsignal.callback = callback; +} + +uint32_t rcsignal_get_pulse_width(void) +{ + return rcsignal.pulse_width_us; +} + +bool rcsignal_is_active(void) +{ + return rcsignal.signal_active; +} + +void rcsignal_trigger_mode_change(void) +{ + rcsignal.current_mode = (rcsignal.current_mode + 1) % MAX_MODES; + ESP_LOGI(TAG, "Manual mode change to: %d", rcsignal.current_mode); + + if (rcsignal.callback) + { + rcsignal.callback(rcsignal.current_mode); + } +} + +uint8_t rcsignal_get_current_mode(void) +{ + return rcsignal.current_mode; +} diff --git a/main/rcsignal.h b/main/rcsignal.h new file mode 100644 index 0000000..05d34ac --- /dev/null +++ b/main/rcsignal.h @@ -0,0 +1,60 @@ +/** + * @file rcsignal.h + * @brief RC PWM signal reading and parsing module + */ + +#ifndef RCSIGNAL_H +#define RCSIGNAL_H + +#include +#include +#include "esp_err.h" + +/** + * @brief Callback function type for mode changes + * @param new_mode New animation mode (0-13) + */ +typedef void (*rcsignal_mode_change_callback_t)(uint8_t new_mode); + +/** + * @brief Initialize RC signal reading + * @param pin GPIO pin for PWM input (-1 to disable) + * @return ESP_OK on success + */ +esp_err_t rcsignal_init(int8_t pin); + +/** + * @brief Deinitialize RC signal reading + */ +void rcsignal_deinit(void); + +/** + * @brief Register callback for mode changes + * @param callback Callback function + */ +void rcsignal_register_callback(rcsignal_mode_change_callback_t callback); + +/** + * @brief Get current PWM pulse width in microseconds + * @return Pulse width in µs (0 if no signal) + */ +uint32_t rcsignal_get_pulse_width(void); + +/** + * @brief Check if PWM signal is active + * @return true if signal detected in last 100ms + */ +bool rcsignal_is_active(void); + +/** + * @brief Manually trigger mode change (for emulation) + */ +void rcsignal_trigger_mode_change(void); + +/** + * @brief Get current mode + * @return Current animation mode (0-13) + */ +uint8_t rcsignal_get_current_mode(void); + +#endif // RCSIGNAL_H diff --git a/partitions.csv b/partitions.csv new file mode 100644 index 0000000..794474a --- /dev/null +++ b/partitions.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +# Optimized for 2MB flash - 2 large OTA slots (no factory partition) +nvs, data, nvs, 0x9000, 0x4000, +phy_init, data, phy, 0xd000, 0x1000, +ota_0, app, ota_0, 0x10000, 0xF0000, +ota_1, app, ota_1, 0x100000, 0xF0000, \ No newline at end of file diff --git a/tools/dev_https_server.py b/tools/dev_https_server.py new file mode 100644 index 0000000..2ac67bc --- /dev/null +++ b/tools/dev_https_server.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +""" +Ad-hoc Flask HTTPS Server for LED Controller Webapp +Serves the webapp over HTTPS (required for Web Bluetooth API) +""" + +import os +import sys +from flask import Flask, send_from_directory, send_file +from pathlib import Path + +# Configuration +HOST = '0.0.0.0' # Listen on all interfaces +PORT = 5000 # HTTPS port +DEBUG = True + +# Get webapp directory (one level up from tools/) +SCRIPT_DIR = Path(__file__).parent +WEBAPP_DIR = SCRIPT_DIR.parent / 'webapp' + +# Verify webapp directory exists +if not WEBAPP_DIR.exists(): + print(f"❌ ERROR: Webapp directory not found at {WEBAPP_DIR}") + print(f" Please run this script from the base repository directory") + sys.exit(1) + +# Create Flask app +app = Flask(__name__) + +@app.route('/') +def index(): + """Serve index.html""" + return send_file(WEBAPP_DIR / 'index.html') + +@app.route('/app/') +def serve_app(filename): + """Serve files from app/ directory""" + return send_from_directory(WEBAPP_DIR / 'app', filename) + +@app.route('/css/') +def serve_css(filename): + """Serve files from css/ directory""" + return send_from_directory(WEBAPP_DIR / 'css', filename) + +@app.route('/data/') +def serve_data(filename): + """Serve files from data/ directory""" + return send_from_directory(WEBAPP_DIR / 'data', filename) + +@app.route('/favicon.ico') +def favicon(): + """Serve favicon""" + return send_file(WEBAPP_DIR / 'data' / 'favicon.ico') + +def print_banner(): + """Print startup banner with instructions""" + print("=" * 70) + print(" 🚀 LED Controller HTTPS Development Server") + print("=" * 70) + print() + print("📱 Web Bluetooth requires HTTPS!") + print(" This server provides a self-signed certificate for development.") + print() + print("🌐 Access the webapp at:") + print(f" https://localhost:{PORT}") + print(f" https://127.0.0.1:{PORT}") + print(f" https://:{PORT}") + print() + print("⚠️ Browser Security Warning:") + print(" You'll see a 'Not Secure' warning - this is normal!") + print(" Click 'Advanced' → 'Proceed to localhost' (or similar)") + print() + print("🔧 To stop the server: Press Ctrl+C") + print("=" * 70) + print() + +def get_local_ip(): + """Get local IP address for convenience""" + import socket + try: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("8.8.8.8", 80)) + ip = s.getsockname()[0] + s.close() + return ip + except: + return "unknown" + +if __name__ == '__main__': + print_banner() + + # Print local IP for convenience + local_ip = get_local_ip() + if local_ip != "unknown": + print(f"💡 Your local IP: {local_ip}") + print(f" Access from phone: https://{local_ip}:{PORT}") + print() + + print("🔄 Starting HTTPS server...") + print() + + try: + # Run with ad-hoc SSL context (self-signed certificate) + # Flask will automatically generate a certificate + app.run( + host=HOST, + port=PORT, + debug=DEBUG, + ssl_context='adhoc' # Auto-generate self-signed cert + ) + except OSError as e: + if "Address already in use" in str(e): + print(f"❌ ERROR: Port {PORT} is already in use!") + print(f" Try a different port or stop the other service.") + sys.exit(1) + else: + raise + except KeyboardInterrupt: + print("\n\n👋 Server stopped by user") + sys.exit(0) diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 0000000..8779ea6 --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,5 @@ +# Flask HTTPS Development Server Requirements +# Install with: pip install -r requirements.txt + +Flask>=2.3.0 +pyOpenSSL>=23.0.0 # Required for adhoc SSL certificate generation diff --git a/webapp/app/app.js b/webapp/app/app.js new file mode 100644 index 0000000..e2fb368 --- /dev/null +++ b/webapp/app/app.js @@ -0,0 +1,322 @@ +/** + * LED Controller Web-BLE Application + * Communicates with ESP32 LED Controller via Bluetooth Low Energy + */ + +// BLE Service and Characteristic UUIDs +const SERVICE_UUID = 0x00FF; +const CHAR_CONFIG_UUID = 0xFF01; +const CHAR_MODE_UUID = 0xFF02; +const CHAR_PWM_UUID = 0xFF03; +const CHAR_OTA_UUID = 0xFF04; + +// Animation mode names +const MODE_NAMES = [ + 'Black', 'Red', 'Blue', 'Green', 'White', + 'Rainbow', 'Rainbow Glitter', 'Confetti', 'Sinelon', + 'BPM Pulse', 'Navigation', 'Chase (Red)', 'Chase (RGB)', 'Random' +]; + +class LEDController { + constructor() { + this.device = null; + this.server = null; + this.service = null; + this.characteristics = { + config: null, + mode: null, + pwm: null, + ota: null + }; + this.connected = false; + + this.initUI(); + } + + initUI() { + // Connect button + document.getElementById('connect-btn').addEventListener('click', () => this.connect()); + + // Save configuration button + document.getElementById('save-config-btn').addEventListener('click', () => this.saveConfig()); + + // PWM emulation button + document.getElementById('pwm-emulate-btn').addEventListener('click', () => this.emulatePWM()); + + // Mode selection buttons + document.querySelectorAll('.btn-mode').forEach(btn => { + btn.addEventListener('click', (e) => { + const mode = parseInt(e.target.dataset.mode); + this.setMode(mode); + }); + }); + + // Firmware file selection + document.getElementById('firmware-file').addEventListener('change', (e) => { + const uploadBtn = document.getElementById('ota-upload-btn'); + uploadBtn.disabled = !e.target.files.length; + }); + + // OTA upload button + document.getElementById('ota-upload-btn').addEventListener('click', () => this.uploadFirmware()); + } + + async connect() { + try { + console.log('Requesting Bluetooth Device...'); + + this.device = await navigator.bluetooth.requestDevice({ + filters: [{ name: 'LED-Controller' }], + optionalServices: [SERVICE_UUID] + }); + + console.log('Connecting to GATT Server...'); + this.server = await this.device.gatt.connect(); + + console.log('Getting Service...'); + this.service = await this.server.getPrimaryService(SERVICE_UUID); + + console.log('Getting Characteristics...'); + this.characteristics.config = await this.service.getCharacteristic(CHAR_CONFIG_UUID); + this.characteristics.mode = await this.service.getCharacteristic(CHAR_MODE_UUID); + this.characteristics.pwm = await this.service.getCharacteristic(CHAR_PWM_UUID); + this.characteristics.ota = await this.service.getCharacteristic(CHAR_OTA_UUID); + + this.connected = true; + this.updateConnectionStatus(true); + + // Load current configuration + await this.loadConfig(); + await this.loadCurrentMode(); + + // Show control sections + document.getElementById('config-section').classList.remove('hidden'); + document.getElementById('control-section').classList.remove('hidden'); + document.getElementById('ota-section').classList.remove('hidden'); + + console.log('Connected successfully!'); + + // Handle disconnection + this.device.addEventListener('gattserverdisconnected', () => { + this.onDisconnected(); + }); + + } catch (error) { + console.error('Connection failed:', error); + alert('Failed to connect: ' + error.message); + } + } + + async loadConfig() { + try { + const value = await this.characteristics.config.readValue(); + const config = this.parseConfig(value); + + document.getElementById('led-pin-a').value = config.ledPinA; + document.getElementById('led-pin-b').value = config.ledPinB; + document.getElementById('pwm-pin').value = config.pwmPin; + document.getElementById('ble-timeout').value = config.bleTimeout; + + console.log('Configuration loaded:', config); + } catch (error) { + console.error('Failed to load config:', error); + } + } + + async loadCurrentMode() { + try { + const value = await this.characteristics.mode.readValue(); + const mode = value.getUint8(0); + this.updateCurrentMode(mode); + } catch (error) { + console.error('Failed to load current mode:', error); + } + } + + parseConfig(dataView) { + return { + ledPinA: dataView.getInt8(0), + ledPinB: dataView.getInt8(1), + pwmPin: dataView.getInt8(2), + bleTimeout: dataView.getUint32(3, true), + magic: dataView.getUint32(7, true) + }; + } + + createConfigBuffer(config) { + const buffer = new ArrayBuffer(11); + const view = new DataView(buffer); + + view.setInt8(0, config.ledPinA); + view.setInt8(1, config.ledPinB); + view.setInt8(2, config.pwmPin); + view.setUint32(3, config.bleTimeout, true); + view.setUint32(7, 0xDEADBEEF, true); // Magic number + + return buffer; + } + + async saveConfig() { + try { + const config = { + ledPinA: parseInt(document.getElementById('led-pin-a').value), + ledPinB: parseInt(document.getElementById('led-pin-b').value), + pwmPin: parseInt(document.getElementById('pwm-pin').value), + bleTimeout: parseInt(document.getElementById('ble-timeout').value) + }; + + const buffer = this.createConfigBuffer(config); + await this.characteristics.config.writeValue(buffer); + + alert('Configuration saved! Device will restart if pins changed.'); + console.log('Configuration saved:', config); + } catch (error) { + console.error('Failed to save config:', error); + alert('Failed to save configuration: ' + error.message); + } + } + + async setMode(mode) { + try { + const buffer = new Uint8Array([mode]); + await this.characteristics.mode.writeValue(buffer); + this.updateCurrentMode(mode); + console.log('Mode set to:', MODE_NAMES[mode]); + } catch (error) { + console.error('Failed to set mode:', error); + } + } + + async emulatePWM() { + try { + const buffer = new Uint8Array([1]); + await this.characteristics.pwm.writeValue(buffer); + console.log('PWM pulse emulated'); + + // Read back the new mode + setTimeout(() => this.loadCurrentMode(), 100); + } catch (error) { + console.error('Failed to emulate PWM:', error); + } + } + + async uploadFirmware() { + const fileInput = document.getElementById('firmware-file'); + const file = fileInput.files[0]; + + if (!file) { + alert('Please select a firmware file'); + return; + } + + if (!confirm('This will update the firmware and reset all settings. Continue?')) { + return; + } + + try { + const arrayBuffer = await file.arrayBuffer(); + const data = new Uint8Array(arrayBuffer); + + const progressBar = document.getElementById('ota-progress-bar'); + const progressText = document.getElementById('ota-progress-text'); + const progressContainer = document.getElementById('ota-progress'); + + progressContainer.classList.remove('hidden'); + + const chunkSize = 512; + const totalChunks = Math.ceil(data.length / chunkSize); + + console.log(`Starting OTA upload: ${data.length} bytes, ${totalChunks} chunks`); + + for (let i = 0; i < totalChunks; i++) { + const start = i * chunkSize; + const end = Math.min(start + chunkSize, data.length); + const chunk = data.slice(start, end); + + await this.characteristics.ota.writeValue(chunk); + + const progress = Math.round((i + 1) / totalChunks * 100); + progressBar.style.width = progress + '%'; + progressText.textContent = progress + '%'; + + console.log(`Upload progress: ${progress}%`); + + // Small delay to prevent overwhelming the device + await new Promise(resolve => setTimeout(resolve, 20)); + } + + alert('Firmware uploaded successfully! Device will restart.'); + console.log('OTA upload complete'); + + } catch (error) { + console.error('OTA upload failed:', error); + alert('Firmware upload failed: ' + error.message); + } + } + + updateCurrentMode(mode) { + const modeName = MODE_NAMES[mode] || 'Unknown'; + document.getElementById('current-mode').textContent = modeName; + } + + updateConnectionStatus(connected) { + const indicator = document.getElementById('status-indicator'); + const statusText = document.getElementById('connection-status'); + const connectBtn = document.getElementById('connect-btn'); + + if (connected) { + indicator.classList.remove('disconnected'); + indicator.classList.add('connected'); + statusText.textContent = 'Connected'; + connectBtn.textContent = 'Disconnect'; + connectBtn.onclick = () => this.disconnect(); + } else { + indicator.classList.remove('connected'); + indicator.classList.add('disconnected'); + statusText.textContent = 'Disconnected'; + connectBtn.textContent = 'Connect via BLE'; + connectBtn.onclick = () => this.connect(); + } + } + + disconnect() { + if (this.device && this.device.gatt.connected) { + this.device.gatt.disconnect(); + } + this.onDisconnected(); + } + + onDisconnected() { + console.log('Disconnected from device'); + this.connected = false; + this.device = null; + this.server = null; + this.service = null; + this.characteristics = { + config: null, + mode: null, + pwm: null, + ota: null + }; + + this.updateConnectionStatus(false); + + // Hide control sections + document.getElementById('config-section').classList.add('hidden'); + document.getElementById('control-section').classList.add('hidden'); + document.getElementById('ota-section').classList.add('hidden'); + } +} + +// Initialize app when DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + // Check if Web Bluetooth is supported + if (!navigator.bluetooth) { + alert('Web Bluetooth is not supported in this browser. Please use Chrome, Edge, or Opera.'); + document.getElementById('connect-btn').disabled = true; + return; + } + + console.log('LED Controller Web-BLE Interface loaded'); + new LEDController(); +}); diff --git a/webapp/css/style.css b/webapp/css/style.css new file mode 100644 index 0000000..e3142e7 --- /dev/null +++ b/webapp/css/style.css @@ -0,0 +1,313 @@ +/* LED Controller Web-BLE Interface Styles */ + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --primary-color: #2196F3; + --success-color: #4CAF50; + --warning-color: #FF9800; + --danger-color: #F44336; + --dark-bg: #1a1a2e; + --card-bg: #16213e; + --text-primary: #ffffff; + --text-secondary: #b0b0b0; + --border-color: #0f4c75; + --hover-bg: #1e3a5f; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, var(--dark-bg) 0%, #0f3460 100%); + color: var(--text-primary); + min-height: 100vh; + padding: 20px; +} + +.container { + max-width: 800px; + margin: 0 auto; +} + +header { + text-align: center; + margin-bottom: 30px; +} + +header h1 { + font-size: 2.5em; + margin-bottom: 10px; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); +} + +.subtitle { + color: var(--text-secondary); + font-size: 1.1em; +} + +.card { + background: var(--card-bg); + border-radius: 12px; + padding: 25px; + margin-bottom: 20px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); + border: 1px solid var(--border-color); +} + +.card h2 { + margin-bottom: 20px; + color: var(--primary-color); + font-size: 1.5em; +} + +.hidden { + display: none !important; +} + +/* Connection Status */ +.connection-status { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 15px; + font-size: 1.1em; +} + +.status-indicator { + width: 16px; + height: 16px; + border-radius: 50%; + animation: pulse 2s infinite; +} + +.status-indicator.disconnected { + background: var(--danger-color); +} + +.status-indicator.connected { + background: var(--success-color); +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +/* Form Elements */ +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; + color: var(--text-primary); +} + +.form-group input[type="number"], +.form-group select { + width: 100%; + padding: 12px; + background: var(--dark-bg); + border: 1px solid var(--border-color); + border-radius: 6px; + color: var(--text-primary); + font-size: 1em; +} + +.form-group input[type="number"]:focus, +.form-group select:focus { + outline: none; + border-color: var(--primary-color); +} + +.form-group small { + display: block; + margin-top: 5px; + color: var(--text-secondary); + font-size: 0.9em; +} + +.form-group input[type="file"] { + width: 100%; + padding: 10px; + background: var(--dark-bg); + border: 2px dashed var(--border-color); + border-radius: 6px; + color: var(--text-primary); + cursor: pointer; +} + +/* Buttons */ +.btn { + padding: 12px 24px; + border: none; + border-radius: 6px; + font-size: 1em; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + width: 100%; +} + +.btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); +} + +.btn:active { + transform: translateY(0); +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn-primary { + background: var(--primary-color); + color: white; +} + +.btn-success { + background: var(--success-color); + color: white; +} + +.btn-warning { + background: var(--warning-color); + color: white; +} + +.btn-secondary { + background: var(--border-color); + color: white; +} + +.btn-mode { + background: var(--hover-bg); + color: var(--text-primary); + border: 1px solid var(--border-color); +} + +.btn-mode:hover { + background: var(--primary-color); +} + +/* Button Grid */ +.button-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + gap: 10px; + margin-bottom: 20px; +} + +/* Current Mode Display */ +.current-mode { + background: var(--dark-bg); + padding: 15px; + border-radius: 6px; + margin-bottom: 20px; + text-align: center; + font-size: 1.1em; + border: 1px solid var(--border-color); +} + +.current-mode span { + color: var(--primary-color); + font-weight: bold; +} + +/* Progress Bar */ +.progress-container { + width: 100%; + height: 40px; + background: var(--dark-bg); + border-radius: 20px; + overflow: hidden; + margin: 20px 0; + position: relative; + border: 1px solid var(--border-color); +} + +.progress-bar { + height: 100%; + background: linear-gradient(90deg, var(--primary-color), var(--success-color)); + transition: width 0.3s ease; + width: 0%; +} + +.progress-text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-weight: bold; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); +} + +/* Warning Box */ +.warning { + background: rgba(255, 152, 0, 0.1); + border: 1px solid var(--warning-color); + border-radius: 6px; + padding: 15px; + margin-bottom: 20px; + color: var(--warning-color); + font-weight: 500; +} + +/* Divider */ +.divider { + height: 1px; + background: var(--border-color); + margin: 20px 0; +} + +/* Footer */ +footer { + text-align: center; + margin-top: 40px; + padding: 20px; + color: var(--text-secondary); +} + +footer small { + font-size: 0.9em; +} + +/* Responsive Design */ +@media (max-width: 600px) { + header h1 { + font-size: 2em; + } + + .button-grid { + grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); + } + + .btn { + font-size: 0.9em; + padding: 10px 16px; + } +} + +/* Animations */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.card { + animation: fadeIn 0.5s ease; +} diff --git a/webapp/data/favicon.ico b/webapp/data/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/webapp/index.html b/webapp/index.html new file mode 100644 index 0000000..1edec70 --- /dev/null +++ b/webapp/index.html @@ -0,0 +1,115 @@ + + + + + + LED Controller Config + + + + +
+
+

✈️ LED Controller

+

Model Aircraft LED Configuration via Web-BLE

+
+ +
+

🔗 Connection

+
+ + Disconnected +
+ +
+ + + + + + + +
+

ESP32 LED Controller © 2026

+

Supports ESP32 DevKitC & ESP32-C3 MINI

+
+
+ + + + -- 2.50.1 From fa6a19d1aae8f69456e11b593d9c2162b18a954f Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 5 Jan 2026 22:18:58 +0100 Subject: [PATCH 02/22] basic led control with local btn --- ARCHITECTURE.md | 390 ------------------------------ README.md | 55 +---- functions.ino | 212 ---------------- main/CMakeLists.txt | 6 +- main/animation.c | 2 +- main/control.c | 493 ++------------------------------------ main/control.h | 43 +--- main/localbtn.c | 85 +++++++ main/localbtn.h | 36 +++ main/main.c | 12 +- nfc01.ino | 85 ------- tools/dev_https_server.py | 120 ---------- tools/requirements.txt | 5 - webapp/app/app.js | 322 ------------------------- webapp/css/style.css | 313 ------------------------ webapp/data/favicon.ico | 0 webapp/index.html | 115 --------- 17 files changed, 156 insertions(+), 2138 deletions(-) delete mode 100644 ARCHITECTURE.md delete mode 100644 functions.ino create mode 100644 main/localbtn.c create mode 100644 main/localbtn.h delete mode 100644 nfc01.ino delete mode 100644 tools/dev_https_server.py delete mode 100644 tools/requirements.txt delete mode 100644 webapp/app/app.js delete mode 100644 webapp/css/style.css delete mode 100644 webapp/data/favicon.ico delete mode 100644 webapp/index.html diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md deleted file mode 100644 index 8a4bce1..0000000 --- a/ARCHITECTURE.md +++ /dev/null @@ -1,390 +0,0 @@ -# Architecture Documentation - -## System Overview - -The ESP32 LED Controller is a real-time embedded system designed for model aircraft LED control with the following key components: - -``` -┌─────────────────────────────────────────────────────────┐ -│ Application Layer │ -│ ┌──────────┐ ┌───────────┐ ┌──────────────────────┐ │ -│ │ main.c │ │ Web-BLE │ │ Animation Patterns │ │ -│ └────┬─────┘ └─────┬─────┘ └──────────┬───────────┘ │ -└───────┼──────────────┼────────────────────┼─────────────┘ - │ │ │ -┌───────┴──────────────┴────────────────────┴─────────────┐ -│ Control Layer │ -│ ┌──────────────────────────────────────────────────┐ │ -│ │ control.c - System Orchestration │ │ -│ │ - BLE GATT Server │ │ -│ │ - NVS Configuration Storage │ │ -│ │ - OTA Firmware Update │ │ -│ │ - Subsystem Initialization │ │ -│ └──────────────────────────────────────────────────┘ │ -└──────────────────────────────────────────────────────────┘ - │ │ │ -┌───────┼──────────────┼────────────────────┼─────────────┐ -│ │ │ │ │ -│ ┌────▼────┐ ┌────▼─────┐ ┌────▼─────────┐ │ -│ │ LED │ │ RC Signal│ │ Animation │ │ -│ │ Driver │ │ Reader │ │ Engine │ │ -│ └─────────┘ └──────────┘ └──────────────┘ │ -│ │ -│ Hardware Layer │ -└──────────────────────────────────────────────────────────┘ - │ │ │ -┌───────┼──────────────┼────────────────────┼─────────────┐ -│ ┌────▼────┐ ┌────▼─────┐ │ -│ │ RMT │ │ GPIO │ │ -│ │ (WS2812)│ │ (PWM) │ │ -│ └─────────┘ └──────────┘ │ -│ │ -│ ESP-IDF HAL & Drivers │ -└──────────────────────────────────────────────────────────┘ -``` - -## Module Details - -### 1. main.c - Application Entry Point -**Responsibilities:** -- System initialization orchestration -- Animation task creation and management -- System health monitoring -- Error handling and recovery - -**Key Functions:** -- `app_main()`: Entry point, initializes control system -- `animation_task()`: FreeRTOS task for 60 FPS animation updates - -**Task Priority:** Animation task runs at priority 5 (above default) - ---- - -### 2. control.c/h - System Control & Orchestration -**Responsibilities:** -- BLE GATT server implementation -- Configuration management (NVS) -- OTA firmware update handling -- Subsystem initialization and coordination - -**BLE Service Structure:** -``` -Service UUID: 0x00FF -├── Config Characteristic (0xFF01) -│ ├── Read: Get current configuration -│ └── Write: Update and persist configuration -├── Mode Characteristic (0xFF02) -│ ├── Read: Get current animation mode -│ └── Write: Set animation mode -├── PWM Emulation (0xFF03) -│ └── Write: Trigger mode change -└── OTA Characteristic (0xFF04) - └── Write: Stream firmware binary -``` - -**Configuration Storage:** -```c -typedef struct { - int8_t led_pin_strip_a; // -1 = disabled - int8_t led_pin_strip_b; // -1 = disabled - int8_t pwm_pin; // -1 = disabled - ble_timeout_t ble_timeout; // 0, 60, 300 seconds - uint32_t magic; // 0xDEADBEEF validation -} controller_config_t; -``` - -**NVS Namespace:** `led_ctrl` -**NVS Key:** `config` - -**BLE Timeout Logic:** -- Timer starts at boot -- Pauses when device connects -- Resumes when device disconnects -- Disables BLE advertising on timeout - -**OTA Update Flow:** -1. Client writes firmware data in 512-byte chunks -2. ESP32 writes to inactive OTA partition -3. Last chunk (< 512 bytes) triggers completion -4. Validates partition, sets boot partition -5. Resets configuration and restarts - ---- - -### 3. led.c/h - WS2812B LED Driver -**Technology:** ESP32 RMT (Remote Control) peripheral - -**Why RMT?** -- Hardware timing generation (no CPU overhead) -- Precise WS2812B timing requirements: - - T0H: 350ns ±150ns - - T0L: 900ns ±150ns - - T1H: 900ns ±150ns - - T1L: 350ns ±150ns - - Reset: >280µs - -**Implementation:** -``` -RMT Channel → Custom Encoder → WS2812B Strip - ↓ ↓ ↓ - 80 MHz GRB Encoding Serial Data -``` - -**Color Management:** -- Internal RGB buffer for each strip -- Thread-safe access via mutex -- Hardware converts RGB → GRB for WS2812B -- Support for HSV → RGB conversion - -**Key Functions:** -- `led_init()`: Configure RMT channels -- `led_set_pixel_a/b()`: Set individual LED -- `led_fill_a/b()`: Set all LEDs same color -- `led_show()`: Update physical LEDs -- `led_fade_to_black()`: Fade effect for trails - -**Memory Usage:** -- Strip A buffer: num_leds * 3 bytes (RGB) -- Strip B buffer: num_leds * 3 bytes (RGB) -- Default: 44 LEDs * 2 strips * 3 = 264 bytes - ---- - -### 4. rcsignal.c/h - PWM Signal Reader -**Technology:** GPIO interrupt + software edge detection - -**PWM Signal Specification:** -- Standard RC PWM: 1000-2000µs pulse width -- Detection threshold: 1500µs -- Timeout: 100ms (signal loss detection) - -**Mode Change Logic:** -``` -PWM < 1500µs → Set "pull_detected" flag - ↓ -PWM > 1500µs AND pull_detected → Mode++ - ↓ -pull_detected = false -``` - -**Implementation:** -- ISR captures rising/falling edges -- Calculates pulse width in microseconds -- Monitor task (10ms interval) detects mode changes -- Callback notifies animation system - -**Thread Safety:** -- Volatile variables for ISR communication -- Monitor task runs at priority 5 - ---- - -### 5. animation.c/h - Animation Engine -**Update Rate:** 60 FPS (16.67ms per frame) - -**Global State:** -- `global_hue`: Slow color cycling (updates every 3 frames) -- `frame_counter`: Frame synchronization -- `current_mode`: Active animation pattern - -**Animation Techniques:** - -#### Fade Effects -```c -// Smooth trails for chase animations -led_fade_to_black(amount); -// Each LED: color = (color * (255 - amount)) / 255 -``` - -#### Beat Synchronization -```c -// Sine wave based on BPM and time -beatsin16(bpm, min_val, max_val); -// Returns position oscillating between min and max -``` - -#### HSV Color Space -- Hue: 0-255 (color wheel) -- Saturation: 0-255 (color intensity) -- Value: 0-255 (brightness) -- Automatic RGB conversion - -**Animation Modes Breakdown:** - -1. **Static Colors** (Black, Red, Blue, Green, White) - - Single `led_fill()` call - - No per-frame updates needed - -2. **Rainbow** - - HSV hue gradient across strip - - Hue offset per LED: `global_hue + (i * 7)` - - Global hue increments for animation - -3. **Rainbow Glitter** - - Base rainbow + random white sparkles - - 80/255 chance per frame - - Random LED position - -4. **Confetti** - - Fade to black (10/255 per frame) - - Random position + random hue - - Creates "fireworks" effect - -5. **Sinelon** - - Sweeping dot using sine wave - - Position: `beatsin16(13 BPM)` - - 20/255 fade creates trails - -6. **BPM** - - Color palette based on party colors - - Beat: `beatsin8(33 BPM)` - - Brightness modulation per LED - -7. **Navigation** - - Fixed positions for aviation lights - - Red: LEDs 0-2 (left) - - Green: Last 3 LEDs (right) - - White blink: 30 Hz (half frame rate) - -8. **Chase (Red)** - - Red dot with ±2 LED trail - - Position: `beatsin16(40 BPM)` - - No fade (instant clear) - -9. **Chase RGB** - - Same as Chase but HSV color cycling - - Hue: `global_hue` - -10. **Random** - - Random LED, random color each frame - - Rare full clear event - ---- - -## Data Flow - -### Configuration Update Flow -``` -Web Browser → BLE Write → control.c → NVS Save → Restart (if pins changed) -``` - -### Animation Update Flow -``` -animation_task (60Hz) → animation_update() → LED buffer → led_show() → RMT → LEDs -``` - -### PWM Mode Change Flow -``` -RC Signal → GPIO ISR → rcsignal.c → Callback → control.c → animation.c -``` - -### OTA Update Flow -``` -Web Browser → BLE Write (chunks) → control.c → esp_ota → Flash → Restart -``` - -## Thread Safety - -### Mutexes Used -1. **led_mutex**: Protects LED buffer access - - Used by: animation_update(), led_show() - - Type: FreeRTOS mutex - -### ISR Safety -- **rcsignal.c**: Volatile variables for ISR communication -- **Minimal ISR work**: Only timestamp and edge detection -- **Deferred processing**: Monitor task handles logic - -### Task Priorities -``` -Priority 5: animation_task, rcsignal_monitor_task -Priority 1: BLE stack tasks (default) -Priority 0: Idle task -``` - -## Memory Management - -### Static Allocation -- Configuration structure: 11 bytes (NVS) -- Animation state: ~100 bytes (global variables) - -### Dynamic Allocation -- LED buffers: `num_leds * 3 * 2` bytes (both strips) -- RMT encoder: ~200 bytes per strip -- BLE stack: ~30KB (ESP-IDF managed) - -### Flash Usage -- Code: ~500KB (with BLE stack) -- OTA partitions: 2x 1MB (dual-boot) -- NVS: 24KB -- Factory: 1MB - -### Heap Usage Estimate -- Total: ~50KB during operation -- Available: ~250KB on ESP32 - -## Power Optimization - -### Active Mode -- CPU: 240 MHz (animation processing) -- BLE: Active (advertising/connected) -- Power: ~180mA (ESP32 only) - -### BLE Disabled Mode -- CPU: 240 MHz (animation only) -- BLE: Disabled after timeout -- Power: ~100mA (ESP32 only) - -### LED Power -- Per LED: ~60mA at full white -- 44 LEDs full white: ~2.6A -- Typical animation: ~500mA average - -## ESP32 vs ESP32-C3 Differences - -### ESP32 (Xtensa) -- Dual-core: FreeRTOS symmetric multiprocessing -- BLE + Classic Bluetooth controller -- More GPIO pins available -- Recommended for complex projects - -### ESP32-C3 (RISC-V) -- Single-core: Simpler task management -- BLE only (no Classic Bluetooth) -- Fewer GPIO pins -- Lower cost option - -### Compatibility -- Same codebase works on both -- Pin numbers differ (check datasheet) -- RMT peripheral identical -- BLE functionality identical - -## Performance Characteristics - -### Latency -- **PWM detection**: <10ms -- **BLE command**: <100ms -- **Mode change**: <20ms (next frame) -- **LED update**: 16.67ms (60 FPS locked) - -### Throughput -- **LED data**: ~13.44 Mbps theoretical (RMT) -- **BLE**: ~1 Mbps (limited by MTU) -- **OTA**: ~40 KB/s (BLE transfer) - -### Timing Precision -- **Animation frame**: ±0.5ms jitter -- **WS2812B timing**: ±50ns (RMT hardware) -- **PWM measurement**: ±1µs (ISR timing) - ---- - - -## Future Enhancement Ideas TODO - -1. **Dynamic LED Count**: Auto-detect number of LEDs -2. **Multi-Strip Sync**: Synchronized patterns -3. **Pattern Editor**: Visual animation designer -4. **Scheduler**: Time-based mode changes - diff --git a/README.md b/README.md index fa6b7dd..40f94e9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ESP32 LED Controller for Model Aircraft -Professional LED controller firmware for ESP32 with Web-BLE configuration interface. Designed for model aircraft with WS2812B LED strips. +Professional LED controller firmware for ESP32. Designed for model aircraft with WS2812B LED strips. ## Features @@ -26,28 +26,17 @@ Professional LED controller firmware for ESP32 with Web-BLE configuration interf 13. **Chase (RGB)** - RGB cycling chase effect 14. **Random** - Random LED colors -### Web-BLE Configuration -- **Pin Configuration**: Set GPIO pins for LED strips and PWM input -- **BLE Auto-Off**: Configure timeout (Never/1min/5min) -- **Manual Control**: Select animation modes from web interface -- **PWM Emulation**: Test mode switching without RC signal -- **OTA Firmware Update**: Upload new firmware via Bluetooth - ## Project Structure ``` led-controller-firmware/ ├── main/ │ ├── main.c # Application entry point -│ ├── control.c/h # BLE, NVS, initialization +│ ├── control.c/h # NVS, initialization │ ├── led.c/h # WS2812B control (RMT driver) │ ├── rcsignal.c/h # PWM signal reading +│ ├── localbtn.c/h # Local btn reading │ └── animation.c/h # LED animation patterns -├── webapp/ -│ ├── index.html # Web-BLE interface -│ ├── app/app.js # BLE communication logic -│ ├── css/style.css # UI styling -│ └── data/favicon.ico ├── CMakeLists.txt ├── sdkconfig.defaults └── partitions.csv # OTA-enabled partition table @@ -107,42 +96,6 @@ GND -> Common Ground - 1500µs threshold for mode switching - Rising edge >1500µs after <1500µs triggers next mode -## Web-BLE Configuration - -### Access the Interface - -1. Open `webapp/index.html` in Chrome, Edge, or Opera (Web Bluetooth required) -2. Click "Connect via BLE" -3. Select "LED-Controller" from device list -4. Configure settings and control LEDs - -### Configuration Options - -#### Pin Setup -- **LED Strip A GPIO**: -1 to disable, 0-48 for GPIO pin -- **LED Strip B GPIO**: -1 to disable, 0-48 for GPIO pin -- **PWM Input GPIO**: -1 to disable, 0-48 for GPIO pin - -#### BLE Timeout -- **Never**: BLE stays on until manually disabled -- **1 Minute**: Auto-disable after 1 min of boot (unless connected) -- **5 Minutes**: Auto-disable after 5 min of boot (unless connected) - -#### Firmware Update -1. Build firmware: `idf.py build` -2. Find binary: `build/led_controller.bin` -3. Upload via Web-BLE interface -4. Device restarts with new firmware (settings reset) - -## Default Configuration - -On first boot or after reset: -- All pins: **Not configured** (-1) -- BLE timeout: **Never** -- Animation mode: **Black** (off) - -Configure via Web-BLE before use. - ## Development ### Adding New Animations @@ -154,7 +107,7 @@ Configure via Web-BLE before use. ### Modifying LED Count -Edit `DEFAULT_NUM_LEDS_A` and `DEFAULT_NUM_LEDS_B` in `control.c`. TODO +Edit `DEFAULT_NUM_LEDS_A` and `DEFAULT_NUM_LEDS_B` in `control.c`. TODO: ### Testing diff --git a/functions.ino b/functions.ino deleted file mode 100644 index f74f1eb..0000000 --- a/functions.ino +++ /dev/null @@ -1,212 +0,0 @@ -boolean getRC01() { - rc01Val = pulseIn(rc01, HIGH); - //Serial.println(rc01Val); - if (rc01Val > 1500) { - //Serial.println("RC1 ON"); - return true; - } else { - //Serial.println("RC1 OFF"); - return false; - } -} - -boolean getRC02() { - rc02Val = pulseIn(rc02, HIGH); - // Serial.println(rc02Val); - if (rc02Val < 1500) { - pullRC = true; - } - if (rc02Val > 1500 && pullRC) { - //Serial.println("RC2 ON"); - pullRC = false; - return true; - } else { - //Serial.println("RC2 OFF"); - return false; - } -} - -void serialPrintModus(int modus) { - switch (modus) { - case 0: - Serial.println("Black"); - break; - case 1: - Serial.println("Red"); - break; - case 2: - Serial.println("Blue"); - break; - case 3: - Serial.println("Green"); - break; - case 4: - Serial.println("White"); - break; - case 5: - Serial.println("Rainbow"); - break; - case 6: - Serial.println("RainbowWithGlitter"); - break; - case 7: - Serial.println("Confetti"); - break; - case 8: - Serial.println("Sinelon"); - break; - case 9: - Serial.println("BPM"); - break; - case 10: - Serial.println("Navigation"); - break; - case 11: - Serial.println("Chase"); - break; - case 12: - Serial.println("ChaseRGB"); - break; - case 13: - Serial.println("Random"); - break; - } -} - -void rainbow() -{ - Serial.println("Rainbow"); - // FastLED's built-in rainbow generator - fill_rainbow( leds, NUM_LEDS, gHue, 7); -} - -void rainbowWithGlitter() -{ - // built-in FastLED rainbow, plus some random sparkly glitter - rainbow(); - addGlitter(255); -} - -void addGlitter( fract8 chanceOfGlitter) -{ - if ( random8() < chanceOfGlitter) { - leds[ random16(NUM_LEDS) ] += CRGB::White; - } -} - -void confetti() -{ - // random colored speckles that blink in and fade smoothly - fadeToBlackBy( leds, NUM_LEDS, 10); - int pos = random16(NUM_LEDS); - leds[pos] += CHSV( gHue + random8(64), 200, 255); -} - -void sinelon() -{ - // a colored dot sweeping back and forth, with fading trails - fadeToBlackBy( leds, NUM_LEDS, 20); - int pos = beatsin16(13, 0, NUM_LEDS); - leds[pos] += CHSV( gHue, 255, 192); -} - -void bpm() -{ - // colored stripes pulsing at a defined Beats-Per-Minute (BPM) - uint8_t BeatsPerMinute = 33; - CRGBPalette16 palette = PartyColors_p; - uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); - for ( int i = 0; i < NUM_LEDS; i++) { //9948 - leds[i] = ColorFromPalette(palette, gHue + (i * 2), beat - gHue + (i * 10)); - } -} - -void blackMode() { - fill_solid(leds, NUM_LEDS, CRGB::Black); // Just to be sure, let's really make it BLACK. -} - -void redMode() { - fill_solid(leds, NUM_LEDS, CRGB::Red); -} - -void blueMode() { - fill_solid(leds, NUM_LEDS, CRGB::Blue); -} - -void greenMode() { - fill_solid(leds, NUM_LEDS, CRGB::Green); -} - -void whiteMode() { - fill_solid(leds, NUM_LEDS, CRGB::White); -} - -void navigation() { - FastLED.clear(); - leds[0] = CRGB::Red; - leds[1] = CRGB::Red; - leds[2] = CRGB::Red; - leds[41] = CRGB::Green; - leds[42] = CRGB::Green; - leds[43] = CRGB::Green; - - leds[5] = CRGB::White; - leds[6] = CRGB::White; - leds[37] = CRGB::White; - leds[38] = CRGB::White; - - FastLED.delay(100); - - leds[5] = CRGB::Black; - leds[6] = CRGB::Black; - leds[37] = CRGB::Black; - leds[38] = CRGB::Black; -} - -void chase() { - FastLED.clear(); - // a colored dot sweeping back and forth, with fading trails - //fadeToBlackBy( leds, NUM_LEDS, 20); - int pos = beatsin16(40, 0, NUM_LEDS); - leds[pos] = CRGB::Red; - if (pos < 41) { - leds[pos + 1] = CRGB::Red; - leds[pos + 2] = CRGB::Red; - } - if (pos > 1) { - leds[pos - 1] = CRGB::Red; - leds[pos - 2] = CRGB::Red; - } - -} - -void chaseRGB() { - FastLED.clear(); - // a colored dot sweeping back and forth, with fading trails - //fadeToBlackBy( leds, NUM_LEDS, 20); - int pos = beatsin16(40, 0, NUM_LEDS); - leds[pos] += CHSV( gHue, 255, 192); - if (pos < 41) { - leds[pos + 1] += CHSV( gHue, 255, 192); - leds[pos + 2] += CHSV( gHue, 255, 192); - } - if (pos > 1) { - leds[pos - 1] += CHSV( gHue, 255, 192); - leds[pos - 2] += CHSV( gHue, 255, 192); - } - -} - -void randomMode(){ - randomVal = random(0,45); - - if(randomVal == 44){ - if(random(5,11) == 9){ - FastLED.clear(); - } - }else{ - leds[randomVal] = random(0, 16777216); - } - -} - diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index a68f73b..e428543 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -5,10 +5,6 @@ idf_component_register( "led.c" "rcsignal.c" "animation.c" + "localbtn.c" INCLUDE_DIRS "." - EMBED_FILES - "../webapp/index.html" - "../webapp/app/app.js" - "../webapp/css/style.css" - "../webapp/data/favicon.ico" ) diff --git a/main/animation.c b/main/animation.c index 6200539..f637113 100644 --- a/main/animation.c +++ b/main/animation.c @@ -190,7 +190,7 @@ static void anim_bpm(void) // PartyColors palette simulation const uint8_t palette_colors[] = { 170, 240, 90, 150, 210, 30, 180, 0, - 210, 270, 150, 240, 330, 60, 300, 120}; + 210, 255, 150, 240, 255, 60, 255, 120}; for (uint16_t i = 0; i < num_leds_a; i++) { diff --git a/main/control.c b/main/control.c index 824c39e..f1450b3 100644 --- a/main/control.c +++ b/main/control.c @@ -1,26 +1,21 @@ /** * @file control.c - * @brief Control module implementation with BLE, NVS, and OTA + * @brief Control module implementation */ #include "control.h" #include "led.h" #include "rcsignal.h" +#include "localbtn.h" #include "animation.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" #include "esp_log.h" #include "esp_system.h" #include "nvs_flash.h" #include "nvs.h" #include "esp_timer.h" -#include "esp_ota_ops.h" -#include "esp_http_server.h" - -#include "esp_bt.h" -#include "esp_gap_ble_api.h" -#include "esp_gatts_api.h" -#include "esp_bt_main.h" -#include "esp_gatt_common_api.h" #include @@ -28,66 +23,19 @@ static const char *TAG = "CONTROL"; #define NVS_NAMESPACE "led_ctrl" #define CONFIG_MAGIC 0xDEADBEEF -#define DEFAULT_NUM_LEDS_A 44 -#define DEFAULT_NUM_LEDS_B 44 - -// BLE Configuration -#define GATTS_SERVICE_UUID 0x00FF -#define GATTS_CHAR_UUID_CONFIG 0xFF01 -#define GATTS_CHAR_UUID_MODE 0xFF02 -#define GATTS_CHAR_UUID_PWM 0xFF03 -#define GATTS_CHAR_UUID_OTA 0xFF04 -#define GATTS_NUM_HANDLE_TEST 8 - -#define DEVICE_NAME "LED-Controller" -#define ADV_CONFIG_FLAG (1 << 0) -#define SCAN_RSP_CONFIG_FLAG (1 << 1) +#define DEFAULT_NUM_LEDS_A 7 +#define DEFAULT_NUM_LEDS_B 7 // Global state static controller_config_t current_config = { .led_pin_strip_a = -1, .led_pin_strip_b = -1, .pwm_pin = -1, - .ble_timeout = BLE_TIMEOUT_NEVER, .magic = CONFIG_MAGIC}; -static bool ble_enabled = true; static uint8_t current_animation_mode = 0; -static esp_timer_handle_t ble_timeout_timer = NULL; -static bool ble_connected = false; - -// OTA state -static const esp_partition_t *update_partition = NULL; -static esp_ota_handle_t update_handle = 0; -static size_t ota_bytes_written = 0; - -// BLE variables -static uint8_t adv_config_done = 0; -static uint16_t gatts_if_global = ESP_GATT_IF_NONE; -static uint16_t conn_id_global = 0; -static uint16_t service_handle = 0; - -// BLE advertising parameters -static esp_ble_adv_params_t adv_params = { - .adv_int_min = 0x20, - .adv_int_max = 0x40, - .adv_type = ADV_TYPE_IND, - .own_addr_type = BLE_ADDR_TYPE_PUBLIC, - .channel_map = ADV_CHNL_ALL, - .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, -}; - -// Characteristic handles -static struct -{ - uint16_t config_handle; - uint16_t mode_handle; - uint16_t pwm_handle; - uint16_t ota_handle; -} char_handles = {0}; // Forward declarations -static void ble_timeout_callback(void *arg); static void on_mode_change(uint8_t new_mode); // NVS Functions @@ -115,7 +63,6 @@ static esp_err_t load_config_from_nvs(void) ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a); ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b); ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin); - ESP_LOGI(TAG, " BLE Timeout: %d", current_config.ble_timeout); return ESP_OK; } @@ -152,10 +99,9 @@ static esp_err_t save_config_to_nvs(void) esp_err_t control_reset_config(void) { - current_config.led_pin_strip_a = -1; - current_config.led_pin_strip_b = -1; - current_config.pwm_pin = -1; - current_config.ble_timeout = BLE_TIMEOUT_NEVER; + current_config.led_pin_strip_a = 12; + current_config.led_pin_strip_b = 14; + current_config.pwm_pin = 13; current_config.magic = CONFIG_MAGIC; return save_config_to_nvs(); @@ -191,59 +137,6 @@ esp_err_t control_update_config(const controller_config_t *config) return err; } -// BLE timeout handling -static void ble_timeout_callback(void *arg) -{ - if (!ble_connected) - { - ESP_LOGI(TAG, "BLE timeout reached, disabling BLE"); - control_disable_ble(); - } -} - -static void start_ble_timeout(void) -{ - if (current_config.ble_timeout == BLE_TIMEOUT_NEVER) - { - return; - } - - if (ble_timeout_timer == NULL) - { - esp_timer_create_args_t timer_args = { - .callback = ble_timeout_callback, - .name = "ble_timeout"}; - esp_timer_create(&timer_args, &ble_timeout_timer); - } - - esp_timer_stop(ble_timeout_timer); - esp_timer_start_once(ble_timeout_timer, (uint64_t)current_config.ble_timeout * 1000000ULL); - ESP_LOGI(TAG, "BLE timeout started: %d seconds", current_config.ble_timeout); -} - -void control_disable_ble(void) -{ - if (!ble_enabled) - return; - - ble_enabled = false; - - if (ble_timeout_timer) - { - esp_timer_stop(ble_timeout_timer); - } - - // Stop BLE advertising - esp_ble_gap_stop_advertising(); - - ESP_LOGI(TAG, "BLE disabled"); -} - -bool control_is_ble_enabled(void) -{ - return ble_enabled; -} - // Animation mode change callback static void on_mode_change(uint8_t new_mode) { @@ -270,361 +163,6 @@ void control_emulate_pwm_pulse(void) rcsignal_trigger_mode_change(); } -// Embedded web files (will be linked) -extern const uint8_t index_html_start[] asm("_binary_index_html_start"); -extern const uint8_t index_html_end[] asm("_binary_index_html_end"); -extern const uint8_t app_js_start[] asm("_binary_app_js_start"); -extern const uint8_t app_js_end[] asm("_binary_app_js_end"); -extern const uint8_t style_css_start[] asm("_binary_style_css_start"); -extern const uint8_t style_css_end[] asm("_binary_style_css_end"); -extern const uint8_t favicon_ico_start[] asm("_binary_favicon_ico_start"); -extern const uint8_t favicon_ico_end[] asm("_binary_favicon_ico_end"); - -// BLE GAP event handler -static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) -{ - ESP_LOGI(TAG, "gap_event_handler() event: %i\n", event); - switch (event) - { - case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: - adv_config_done &= (~ADV_CONFIG_FLAG); - if (adv_config_done == 0) - { - esp_ble_gap_start_advertising(&adv_params); - } - break; - - case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: - adv_config_done &= (~SCAN_RSP_CONFIG_FLAG); - if (adv_config_done == 0) - { - esp_ble_gap_start_advertising(&adv_params); - } - break; - - case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: - if (param->adv_start_cmpl.status == ESP_BT_STATUS_SUCCESS) - { - ESP_LOGI(TAG, "BLE advertising started"); - } - break; - - default: - break; - } -} - -// BLE GATTS event handler -static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) -{ - switch (event) - { - case ESP_GATTS_REG_EVT: - ESP_LOGI(TAG, "GATTS register, status %d, app_id %d", param->reg.status, param->reg.app_id); - gatts_if_global = gatts_if; - - // Set device name - esp_ble_gap_set_device_name(DEVICE_NAME); - - // Config advertising data - esp_ble_adv_data_t adv_data = { - .set_scan_rsp = false, - .include_name = true, - .include_txpower = true, - .min_interval = 0x0006, - .max_interval = 0x0010, - .appearance = 0x00, - .manufacturer_len = 0, - .p_manufacturer_data = NULL, - .service_data_len = 0, - .p_service_data = NULL, - .service_uuid_len = sizeof(uint16_t), - .p_service_uuid = (uint8_t[]){GATTS_SERVICE_UUID & 0xFF, (GATTS_SERVICE_UUID >> 8) & 0xFF}, - .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), - }; - esp_ble_gap_config_adv_data(&adv_data); - adv_config_done |= ADV_CONFIG_FLAG; - - // Create service - esp_gatt_srvc_id_t service_id = { - .is_primary = true, - .id.inst_id = 0, - .id.uuid.len = ESP_UUID_LEN_16, - .id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID, - }; - esp_ble_gatts_create_service(gatts_if, &service_id, GATTS_NUM_HANDLE_TEST); - break; - - case ESP_GATTS_CREATE_EVT: - ESP_LOGI(TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d", param->create.status, param->create.service_handle); - service_handle = param->create.service_handle; - - esp_ble_gatts_start_service(service_handle); - - // Add characteristics - esp_bt_uuid_t char_uuid; - char_uuid.len = ESP_UUID_LEN_16; - - // Config characteristic - char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_CONFIG; - esp_ble_gatts_add_char(service_handle, &char_uuid, - ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, - ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE, - NULL, NULL); - - // Mode characteristic - char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_MODE; - esp_ble_gatts_add_char(service_handle, &char_uuid, - ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, - ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY, - NULL, NULL); - - // PWM emulation characteristic - char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_PWM; - esp_ble_gatts_add_char(service_handle, &char_uuid, - ESP_GATT_PERM_WRITE, - ESP_GATT_CHAR_PROP_BIT_WRITE, - NULL, NULL); - - // OTA characteristic - char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_OTA; - esp_ble_gatts_add_char(service_handle, &char_uuid, - ESP_GATT_PERM_WRITE, - ESP_GATT_CHAR_PROP_BIT_WRITE, - NULL, NULL); - break; - - case ESP_GATTS_ADD_CHAR_EVT: - ESP_LOGI(TAG, "ADD_CHAR_EVT, status %d, char_handle %d", param->add_char.status, param->add_char.attr_handle); - - // Store handles - if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_CONFIG) - { - char_handles.config_handle = param->add_char.attr_handle; - } - else if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_MODE) - { - char_handles.mode_handle = param->add_char.attr_handle; - } - else if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_PWM) - { - char_handles.pwm_handle = param->add_char.attr_handle; - } - else if (param->add_char.char_uuid.uuid.uuid16 == GATTS_CHAR_UUID_OTA) - { - char_handles.ota_handle = param->add_char.attr_handle; - } - break; - - case ESP_GATTS_CONNECT_EVT: - ESP_LOGI(TAG, "BLE device connected"); - conn_id_global = param->connect.conn_id; - ble_connected = true; - - // Stop timeout timer when connected - if (ble_timeout_timer) - { - esp_timer_stop(ble_timeout_timer); - } - break; - - case ESP_GATTS_DISCONNECT_EVT: - ESP_LOGI(TAG, "BLE device disconnected"); - ble_connected = false; - - // Restart advertising and timeout - if (ble_enabled) - { - esp_ble_gap_start_advertising(&adv_params); - start_ble_timeout(); - } - break; - - case ESP_GATTS_READ_EVT: - ESP_LOGI(TAG, "GATTS_READ_EVT, handle %d", param->read.handle); - - esp_gatt_rsp_t rsp; - memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); - rsp.attr_value.handle = param->read.handle; - - if (param->read.handle == char_handles.config_handle) - { - rsp.attr_value.len = sizeof(controller_config_t); - memcpy(rsp.attr_value.value, ¤t_config, sizeof(controller_config_t)); - } - else if (param->read.handle == char_handles.mode_handle) - { - rsp.attr_value.len = 1; - rsp.attr_value.value[0] = current_animation_mode; - } - - esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, - ESP_GATT_OK, &rsp); - break; - - case ESP_GATTS_WRITE_EVT: - ESP_LOGI(TAG, "GATTS_WRITE_EVT, handle %d, len %d", param->write.handle, param->write.len); - - if (param->write.handle == char_handles.config_handle) - { - // Update configuration - if (param->write.len == sizeof(controller_config_t)) - { - controller_config_t new_config; - memcpy(&new_config, param->write.value, sizeof(controller_config_t)); - control_update_config(&new_config); - } - } - else if (param->write.handle == char_handles.mode_handle) - { - // Set animation mode - if (param->write.len == 1) - { - control_set_animation_mode(param->write.value[0]); - } - } - else if (param->write.handle == char_handles.pwm_handle) - { - // Emulate PWM pulse - control_emulate_pwm_pulse(); - } - else if (param->write.handle == char_handles.ota_handle) - { - // Handle OTA data - if (ota_bytes_written == 0) - { - // First packet - start OTA - ESP_LOGI(TAG, "Starting OTA update..."); - update_partition = esp_ota_get_next_update_partition(NULL); - if (update_partition == NULL) - { - ESP_LOGE(TAG, "No OTA partition found"); - break; - } - - esp_err_t err = esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN, &update_handle); - if (err != ESP_OK) - { - ESP_LOGE(TAG, "OTA begin failed: %s", esp_err_to_name(err)); - break; - } - } - - // Write OTA data - esp_err_t err = esp_ota_write(update_handle, param->write.value, param->write.len); - if (err != ESP_OK) - { - ESP_LOGE(TAG, "OTA write failed: %s", esp_err_to_name(err)); - esp_ota_abort(update_handle); - ota_bytes_written = 0; - break; - } - - ota_bytes_written += param->write.len; - ESP_LOGI(TAG, "OTA progress: %d bytes", ota_bytes_written); - - // Check if this is the last packet (indicated by packet size < MTU) - if (param->write.len < 512) - { - ESP_LOGI(TAG, "OTA complete, total bytes: %d", ota_bytes_written); - - err = esp_ota_end(update_handle); - if (err != ESP_OK) - { - ESP_LOGE(TAG, "OTA end failed: %s", esp_err_to_name(err)); - break; - } - - err = esp_ota_set_boot_partition(update_partition); - if (err != ESP_OK) - { - ESP_LOGE(TAG, "OTA set boot partition failed: %s", esp_err_to_name(err)); - break; - } - - // Reset configuration - control_reset_config(); - - ESP_LOGI(TAG, "OTA successful, restarting..."); - vTaskDelay(pdMS_TO_TICKS(1000)); - esp_restart(); - } - } - - if (!param->write.is_prep) - { - esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, - ESP_GATT_OK, NULL); - } - break; - - default: - break; - } -} - -// Initialize BLE -static esp_err_t init_ble(void) -{ - if (!ble_enabled) - { - ESP_LOGI(TAG, "BLE disabled by configuration"); - return ESP_OK; - } - - esp_err_t ret; - - // Initialize BT controller - esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); - ret = esp_bt_controller_init(&bt_cfg); - if (ret) - { - ESP_LOGE(TAG, "BT controller init failed: %s", esp_err_to_name(ret)); - return ret; - } - - ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); - if (ret) - { - ESP_LOGE(TAG, "BT controller enable failed: %s", esp_err_to_name(ret)); - return ret; - } - - ret = esp_bluedroid_init(); - if (ret) - { - ESP_LOGE(TAG, "Bluedroid init failed: %s", esp_err_to_name(ret)); - return ret; - } - - ret = esp_bluedroid_enable(); - if (ret) - { - ESP_LOGE(TAG, "Bluedroid enable failed: %s", esp_err_to_name(ret)); - return ret; - } - - // Register callbacks - esp_ble_gatts_register_callback(gatts_event_handler); - esp_ble_gap_register_callback(gap_event_handler); - esp_ble_gatts_app_register(0); - - // Set MTU - esp_ble_gatt_set_local_mtu(517); - - // Start timeout timer - start_ble_timeout(); - - esp_ble_gatts_app_register(0); - - vTaskDelay(pdMS_TO_TICKS(100)); - esp_ble_gap_start_advertising(&adv_params); - - ESP_LOGI(TAG, "BLE initialized"); - - return ESP_OK; -} - // Main initialization esp_err_t control_init(void) { @@ -669,17 +207,18 @@ esp_err_t control_init(void) return ret; } - // Register mode change callback - rcsignal_register_callback(on_mode_change); - - // Initialize BLE - ret = init_ble(); + // Initialize local BTN + ret = localbtn_init(); if (ret != ESP_OK) { - ESP_LOGE(TAG, "BLE init failed: %s", esp_err_to_name(ret)); + ESP_LOGE(TAG, "Local BTN init failed: %s", esp_err_to_name(ret)); return ret; } + // Register mode change callback + rcsignal_register_callback(on_mode_change); + localbtn_register_callback(on_mode_change); + ESP_LOGI(TAG, "Control system initialized successfully"); return ESP_OK; diff --git a/main/control.h b/main/control.h index cc15cdf..bb4da93 100644 --- a/main/control.h +++ b/main/control.h @@ -1,6 +1,6 @@ /** * @file control.h - * @brief Control module for LED controller - handles initialization of LEDs, PWM, and Bluetooth + * @brief Control module for LED controller - handles initialization of LEDs, PWM */ #ifndef CONTROL_H @@ -10,24 +10,15 @@ #include #include -/** - * @brief BLE auto-off timeout options - */ -typedef enum { - BLE_TIMEOUT_NEVER = 0, - BLE_TIMEOUT_1MIN = 60, - BLE_TIMEOUT_5MIN = 300 -} ble_timeout_t; - /** * @brief Configuration structure stored in NVS */ -typedef struct { - int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) - int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) - int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) - ble_timeout_t ble_timeout; // BLE auto-off timeout - uint32_t magic; // Magic number to validate config (0xDEADBEEF) +typedef struct +{ + int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) + int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) + int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) + uint32_t magic; // Magic number to validate config (0xDEADBEEF) } controller_config_t; /** @@ -41,14 +32,14 @@ esp_err_t control_init(void); * @brief Get current configuration * @return Pointer to current configuration (read-only) */ -const controller_config_t* control_get_config(void); +const controller_config_t *control_get_config(void); /** * @brief Update configuration and save to NVS * @param config New configuration * @return ESP_OK on success */ -esp_err_t control_update_config(const controller_config_t* config); +esp_err_t control_update_config(const controller_config_t *config); /** * @brief Reset configuration to defaults @@ -56,22 +47,6 @@ esp_err_t control_update_config(const controller_config_t* config); */ esp_err_t control_reset_config(void); -/** - * @brief Get BLE enabled status - * @return true if BLE is enabled - */ -bool control_is_ble_enabled(void); - -/** - * @brief Manually disable BLE - */ -void control_disable_ble(void); - -/** - * @brief Emulate PWM pulse (for web button) - */ -void control_emulate_pwm_pulse(void); - /** * @brief Set animation mode manually * @param mode Animation mode (0-13) diff --git a/main/localbtn.c b/main/localbtn.c new file mode 100644 index 0000000..d0e0335 --- /dev/null +++ b/main/localbtn.c @@ -0,0 +1,85 @@ +/** + * @file localbtn.c + * @brief Local GPIO0 BTN reading implementation using edge capture + */ + +#include "localbtn.h" +#include "driver/gpio.h" +#include "esp_timer.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "soc/gpio_num.h" +#include + +static const char *TAG = "LOCALBTN"; +uint8_t current_mode; +localbtn_mode_change_callback_t callback; + +#define BOOT_BTN GPIO_NUM_0 +#define MAX_MODES 14 // TODO: get from control + +bool boot_button_pressed(void) +{ + return gpio_get_level(BOOT_BTN) == 0; // active LOW +} + +static void monitor_task(void *arg) +{ + bool lastState = false; + while (1) + { + vTaskDelay(pdMS_TO_TICKS(10)); + + bool currentState = boot_button_pressed(); + if ((currentState) && (lastState != currentState)) + { + printf("BOOT button pressed\n"); + + current_mode = (current_mode + 1) % MAX_MODES; + + ESP_LOGI(TAG, "Mode changed to: %d ", current_mode); + + if (callback) + { + callback(current_mode); + } + } + + lastState = currentState; + } +} + +esp_err_t localbtn_init() +{ + + gpio_config_t io_conf = { + .pin_bit_mask = 1ULL << BOOT_BTN, + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_ENABLE, // safe even if external pull-up exists + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE}; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + // Create monitor task + BaseType_t ret = xTaskCreate(monitor_task, "localbtn_monitor", 2048, NULL, 5, NULL); + if (ret != pdPASS) + { + return ESP_FAIL; + } + + // TODO: rcsignal.initialized = true; + ESP_LOGI(TAG, "local btn initialized on GPIO%d", BOOT_BTN); + + return ESP_OK; +} + +void localbtn_deinit(void) +{ + // TODO: +} + +void localbtn_register_callback(localbtn_mode_change_callback_t cb) +{ + callback = cb; +} diff --git a/main/localbtn.h b/main/localbtn.h new file mode 100644 index 0000000..c5227da --- /dev/null +++ b/main/localbtn.h @@ -0,0 +1,36 @@ +/** + * @file localbtn.h + * @brief Local GPIO0 BTN reading implementation using edge capture + */ + +#ifndef LOCALBTN_H +#define LOCALBTN_H + +#include +#include +#include "esp_err.h" + +/** + * @brief Callback function type for mode changes + * @param new_mode New animation mode (0-13) + */ +typedef void (*localbtn_mode_change_callback_t)(uint8_t new_mode); + +/** + * @brief Initialize local btn reading + * @return ESP_OK on success + */ +esp_err_t localbtn_init(); + +/** + * @brief Deinitialize local btn reading + */ +void localbtn_deinit(void); + +/** + * @brief Register callback for mode changes + * @param callback Callback function + */ +void localbtn_register_callback(localbtn_mode_change_callback_t cb); + +#endif // LOCALBTN_H diff --git a/main/main.c b/main/main.c index 0229b06..a546c85 100644 --- a/main/main.c +++ b/main/main.c @@ -44,7 +44,7 @@ void app_main(void) ESP_LOGI(TAG, " ESP32 LED Controller for Model Aircraft"); ESP_LOGI(TAG, "=============================================="); - // Initialize control system (LEDs, PWM, BLE) + // Initialize control system (LEDs, PWM) esp_err_t ret = control_init(); if (ret != ESP_OK) { @@ -56,6 +56,8 @@ void app_main(void) } } + control_reset_config(); + // Create animation update task BaseType_t task_ret = xTaskCreate( animation_task, @@ -76,8 +78,6 @@ void app_main(void) } ESP_LOGI(TAG, "System initialized successfully"); - ESP_LOGI(TAG, "BLE Device Name: LED-Controller"); - ESP_LOGI(TAG, "Connect via Web-BLE to configure"); // Main loop - just monitor system status while (1) @@ -85,10 +85,6 @@ void app_main(void) vTaskDelay(pdMS_TO_TICKS(5000)); // Periodic status logging - //const controller_config_t *config = control_get_config(); - ESP_LOGI(TAG, "Status - Mode: %d, BLE: %s, PWM Active: %s", - control_get_animation_mode(), - control_is_ble_enabled() ? "ON" : "OFF", - "N/A"); // Could add rcsignal_is_active() here + ESP_LOGI(TAG, "Status - Mode: %d", control_get_animation_mode()); } } diff --git a/nfc01.ino b/nfc01.ino deleted file mode 100644 index baf10c9..0000000 --- a/nfc01.ino +++ /dev/null @@ -1,85 +0,0 @@ -#include "FastLED.h" - -int rc01 = 9; -int rc02 = 10; -int led_spotlight = 2; -int rc01Val = 0; -int rc02Val = 0; -int modus = 0; -int modusMax = 13; -int red = 0; -int green = 0; -int blue = 0; -int randomVal = 0; - -#define DATA_PIN 3 -#define LED_TYPE WS2812B -#define COLOR_ORDER GRB -#define NUM_LEDS 44 -CRGB leds[NUM_LEDS]; -#define BRIGHTNESS 255 -#define FRAMES_PER_SECOND 60 -#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) - -boolean pullRC = true; - -void setup() { - //Serial.begin(9600); - Serial.println("_-_-_- Night Fly Controller V01 _-_-_-"); - pinMode(rc01, INPUT); - pinMode(rc02, INPUT); - pinMode(led_spotlight, OUTPUT); - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, HIGH); - - delay(3000); // 3 second delay for recovery - - // tell FastLED about the LED strip configuration - FastLED.addLeds(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); - // set master brightness control - FastLED.setBrightness(BRIGHTNESS); -} - - -// List of patterns to cycle through. Each is defined as a separate function below. -typedef void (*SimplePatternList[])(); -SimplePatternList gPatterns = { blackMode, redMode, blueMode, greenMode, whiteMode, rainbow, rainbowWithGlitter, confetti, sinelon, bpm, navigation, chase, chaseRGB, randomMode }; -uint8_t gHue = 0; // rotating "base color" used by many of the patterns - -void loop() { - - if (getRC01()) { - digitalWrite(led_spotlight, HIGH); - - } else { - digitalWrite(led_spotlight, LOW); - } - -setModus(); - -} - -void setModus(){ - if (getRC02()) { - modus = modus + 1; - if (modus > modusMax) { - modus = 1; - } - } - Serial.println(modus); - serialPrintModus(modus); - - gPatterns[modus](); - - // send the 'leds' array out to the actual LED strip - FastLED.show(); - // insert a delay to keep the framerate modest - FastLED.delay(1000 / FRAMES_PER_SECOND); - - // do some periodic updates - EVERY_N_MILLISECONDS( 20 ) { - gHue++; // slowly cycle the "base color" through the rainbow - } - -} - diff --git a/tools/dev_https_server.py b/tools/dev_https_server.py deleted file mode 100644 index 2ac67bc..0000000 --- a/tools/dev_https_server.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python3 -""" -Ad-hoc Flask HTTPS Server for LED Controller Webapp -Serves the webapp over HTTPS (required for Web Bluetooth API) -""" - -import os -import sys -from flask import Flask, send_from_directory, send_file -from pathlib import Path - -# Configuration -HOST = '0.0.0.0' # Listen on all interfaces -PORT = 5000 # HTTPS port -DEBUG = True - -# Get webapp directory (one level up from tools/) -SCRIPT_DIR = Path(__file__).parent -WEBAPP_DIR = SCRIPT_DIR.parent / 'webapp' - -# Verify webapp directory exists -if not WEBAPP_DIR.exists(): - print(f"❌ ERROR: Webapp directory not found at {WEBAPP_DIR}") - print(f" Please run this script from the base repository directory") - sys.exit(1) - -# Create Flask app -app = Flask(__name__) - -@app.route('/') -def index(): - """Serve index.html""" - return send_file(WEBAPP_DIR / 'index.html') - -@app.route('/app/') -def serve_app(filename): - """Serve files from app/ directory""" - return send_from_directory(WEBAPP_DIR / 'app', filename) - -@app.route('/css/') -def serve_css(filename): - """Serve files from css/ directory""" - return send_from_directory(WEBAPP_DIR / 'css', filename) - -@app.route('/data/') -def serve_data(filename): - """Serve files from data/ directory""" - return send_from_directory(WEBAPP_DIR / 'data', filename) - -@app.route('/favicon.ico') -def favicon(): - """Serve favicon""" - return send_file(WEBAPP_DIR / 'data' / 'favicon.ico') - -def print_banner(): - """Print startup banner with instructions""" - print("=" * 70) - print(" 🚀 LED Controller HTTPS Development Server") - print("=" * 70) - print() - print("📱 Web Bluetooth requires HTTPS!") - print(" This server provides a self-signed certificate for development.") - print() - print("🌐 Access the webapp at:") - print(f" https://localhost:{PORT}") - print(f" https://127.0.0.1:{PORT}") - print(f" https://:{PORT}") - print() - print("⚠️ Browser Security Warning:") - print(" You'll see a 'Not Secure' warning - this is normal!") - print(" Click 'Advanced' → 'Proceed to localhost' (or similar)") - print() - print("🔧 To stop the server: Press Ctrl+C") - print("=" * 70) - print() - -def get_local_ip(): - """Get local IP address for convenience""" - import socket - try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(("8.8.8.8", 80)) - ip = s.getsockname()[0] - s.close() - return ip - except: - return "unknown" - -if __name__ == '__main__': - print_banner() - - # Print local IP for convenience - local_ip = get_local_ip() - if local_ip != "unknown": - print(f"💡 Your local IP: {local_ip}") - print(f" Access from phone: https://{local_ip}:{PORT}") - print() - - print("🔄 Starting HTTPS server...") - print() - - try: - # Run with ad-hoc SSL context (self-signed certificate) - # Flask will automatically generate a certificate - app.run( - host=HOST, - port=PORT, - debug=DEBUG, - ssl_context='adhoc' # Auto-generate self-signed cert - ) - except OSError as e: - if "Address already in use" in str(e): - print(f"❌ ERROR: Port {PORT} is already in use!") - print(f" Try a different port or stop the other service.") - sys.exit(1) - else: - raise - except KeyboardInterrupt: - print("\n\n👋 Server stopped by user") - sys.exit(0) diff --git a/tools/requirements.txt b/tools/requirements.txt deleted file mode 100644 index 8779ea6..0000000 --- a/tools/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# Flask HTTPS Development Server Requirements -# Install with: pip install -r requirements.txt - -Flask>=2.3.0 -pyOpenSSL>=23.0.0 # Required for adhoc SSL certificate generation diff --git a/webapp/app/app.js b/webapp/app/app.js deleted file mode 100644 index e2fb368..0000000 --- a/webapp/app/app.js +++ /dev/null @@ -1,322 +0,0 @@ -/** - * LED Controller Web-BLE Application - * Communicates with ESP32 LED Controller via Bluetooth Low Energy - */ - -// BLE Service and Characteristic UUIDs -const SERVICE_UUID = 0x00FF; -const CHAR_CONFIG_UUID = 0xFF01; -const CHAR_MODE_UUID = 0xFF02; -const CHAR_PWM_UUID = 0xFF03; -const CHAR_OTA_UUID = 0xFF04; - -// Animation mode names -const MODE_NAMES = [ - 'Black', 'Red', 'Blue', 'Green', 'White', - 'Rainbow', 'Rainbow Glitter', 'Confetti', 'Sinelon', - 'BPM Pulse', 'Navigation', 'Chase (Red)', 'Chase (RGB)', 'Random' -]; - -class LEDController { - constructor() { - this.device = null; - this.server = null; - this.service = null; - this.characteristics = { - config: null, - mode: null, - pwm: null, - ota: null - }; - this.connected = false; - - this.initUI(); - } - - initUI() { - // Connect button - document.getElementById('connect-btn').addEventListener('click', () => this.connect()); - - // Save configuration button - document.getElementById('save-config-btn').addEventListener('click', () => this.saveConfig()); - - // PWM emulation button - document.getElementById('pwm-emulate-btn').addEventListener('click', () => this.emulatePWM()); - - // Mode selection buttons - document.querySelectorAll('.btn-mode').forEach(btn => { - btn.addEventListener('click', (e) => { - const mode = parseInt(e.target.dataset.mode); - this.setMode(mode); - }); - }); - - // Firmware file selection - document.getElementById('firmware-file').addEventListener('change', (e) => { - const uploadBtn = document.getElementById('ota-upload-btn'); - uploadBtn.disabled = !e.target.files.length; - }); - - // OTA upload button - document.getElementById('ota-upload-btn').addEventListener('click', () => this.uploadFirmware()); - } - - async connect() { - try { - console.log('Requesting Bluetooth Device...'); - - this.device = await navigator.bluetooth.requestDevice({ - filters: [{ name: 'LED-Controller' }], - optionalServices: [SERVICE_UUID] - }); - - console.log('Connecting to GATT Server...'); - this.server = await this.device.gatt.connect(); - - console.log('Getting Service...'); - this.service = await this.server.getPrimaryService(SERVICE_UUID); - - console.log('Getting Characteristics...'); - this.characteristics.config = await this.service.getCharacteristic(CHAR_CONFIG_UUID); - this.characteristics.mode = await this.service.getCharacteristic(CHAR_MODE_UUID); - this.characteristics.pwm = await this.service.getCharacteristic(CHAR_PWM_UUID); - this.characteristics.ota = await this.service.getCharacteristic(CHAR_OTA_UUID); - - this.connected = true; - this.updateConnectionStatus(true); - - // Load current configuration - await this.loadConfig(); - await this.loadCurrentMode(); - - // Show control sections - document.getElementById('config-section').classList.remove('hidden'); - document.getElementById('control-section').classList.remove('hidden'); - document.getElementById('ota-section').classList.remove('hidden'); - - console.log('Connected successfully!'); - - // Handle disconnection - this.device.addEventListener('gattserverdisconnected', () => { - this.onDisconnected(); - }); - - } catch (error) { - console.error('Connection failed:', error); - alert('Failed to connect: ' + error.message); - } - } - - async loadConfig() { - try { - const value = await this.characteristics.config.readValue(); - const config = this.parseConfig(value); - - document.getElementById('led-pin-a').value = config.ledPinA; - document.getElementById('led-pin-b').value = config.ledPinB; - document.getElementById('pwm-pin').value = config.pwmPin; - document.getElementById('ble-timeout').value = config.bleTimeout; - - console.log('Configuration loaded:', config); - } catch (error) { - console.error('Failed to load config:', error); - } - } - - async loadCurrentMode() { - try { - const value = await this.characteristics.mode.readValue(); - const mode = value.getUint8(0); - this.updateCurrentMode(mode); - } catch (error) { - console.error('Failed to load current mode:', error); - } - } - - parseConfig(dataView) { - return { - ledPinA: dataView.getInt8(0), - ledPinB: dataView.getInt8(1), - pwmPin: dataView.getInt8(2), - bleTimeout: dataView.getUint32(3, true), - magic: dataView.getUint32(7, true) - }; - } - - createConfigBuffer(config) { - const buffer = new ArrayBuffer(11); - const view = new DataView(buffer); - - view.setInt8(0, config.ledPinA); - view.setInt8(1, config.ledPinB); - view.setInt8(2, config.pwmPin); - view.setUint32(3, config.bleTimeout, true); - view.setUint32(7, 0xDEADBEEF, true); // Magic number - - return buffer; - } - - async saveConfig() { - try { - const config = { - ledPinA: parseInt(document.getElementById('led-pin-a').value), - ledPinB: parseInt(document.getElementById('led-pin-b').value), - pwmPin: parseInt(document.getElementById('pwm-pin').value), - bleTimeout: parseInt(document.getElementById('ble-timeout').value) - }; - - const buffer = this.createConfigBuffer(config); - await this.characteristics.config.writeValue(buffer); - - alert('Configuration saved! Device will restart if pins changed.'); - console.log('Configuration saved:', config); - } catch (error) { - console.error('Failed to save config:', error); - alert('Failed to save configuration: ' + error.message); - } - } - - async setMode(mode) { - try { - const buffer = new Uint8Array([mode]); - await this.characteristics.mode.writeValue(buffer); - this.updateCurrentMode(mode); - console.log('Mode set to:', MODE_NAMES[mode]); - } catch (error) { - console.error('Failed to set mode:', error); - } - } - - async emulatePWM() { - try { - const buffer = new Uint8Array([1]); - await this.characteristics.pwm.writeValue(buffer); - console.log('PWM pulse emulated'); - - // Read back the new mode - setTimeout(() => this.loadCurrentMode(), 100); - } catch (error) { - console.error('Failed to emulate PWM:', error); - } - } - - async uploadFirmware() { - const fileInput = document.getElementById('firmware-file'); - const file = fileInput.files[0]; - - if (!file) { - alert('Please select a firmware file'); - return; - } - - if (!confirm('This will update the firmware and reset all settings. Continue?')) { - return; - } - - try { - const arrayBuffer = await file.arrayBuffer(); - const data = new Uint8Array(arrayBuffer); - - const progressBar = document.getElementById('ota-progress-bar'); - const progressText = document.getElementById('ota-progress-text'); - const progressContainer = document.getElementById('ota-progress'); - - progressContainer.classList.remove('hidden'); - - const chunkSize = 512; - const totalChunks = Math.ceil(data.length / chunkSize); - - console.log(`Starting OTA upload: ${data.length} bytes, ${totalChunks} chunks`); - - for (let i = 0; i < totalChunks; i++) { - const start = i * chunkSize; - const end = Math.min(start + chunkSize, data.length); - const chunk = data.slice(start, end); - - await this.characteristics.ota.writeValue(chunk); - - const progress = Math.round((i + 1) / totalChunks * 100); - progressBar.style.width = progress + '%'; - progressText.textContent = progress + '%'; - - console.log(`Upload progress: ${progress}%`); - - // Small delay to prevent overwhelming the device - await new Promise(resolve => setTimeout(resolve, 20)); - } - - alert('Firmware uploaded successfully! Device will restart.'); - console.log('OTA upload complete'); - - } catch (error) { - console.error('OTA upload failed:', error); - alert('Firmware upload failed: ' + error.message); - } - } - - updateCurrentMode(mode) { - const modeName = MODE_NAMES[mode] || 'Unknown'; - document.getElementById('current-mode').textContent = modeName; - } - - updateConnectionStatus(connected) { - const indicator = document.getElementById('status-indicator'); - const statusText = document.getElementById('connection-status'); - const connectBtn = document.getElementById('connect-btn'); - - if (connected) { - indicator.classList.remove('disconnected'); - indicator.classList.add('connected'); - statusText.textContent = 'Connected'; - connectBtn.textContent = 'Disconnect'; - connectBtn.onclick = () => this.disconnect(); - } else { - indicator.classList.remove('connected'); - indicator.classList.add('disconnected'); - statusText.textContent = 'Disconnected'; - connectBtn.textContent = 'Connect via BLE'; - connectBtn.onclick = () => this.connect(); - } - } - - disconnect() { - if (this.device && this.device.gatt.connected) { - this.device.gatt.disconnect(); - } - this.onDisconnected(); - } - - onDisconnected() { - console.log('Disconnected from device'); - this.connected = false; - this.device = null; - this.server = null; - this.service = null; - this.characteristics = { - config: null, - mode: null, - pwm: null, - ota: null - }; - - this.updateConnectionStatus(false); - - // Hide control sections - document.getElementById('config-section').classList.add('hidden'); - document.getElementById('control-section').classList.add('hidden'); - document.getElementById('ota-section').classList.add('hidden'); - } -} - -// Initialize app when DOM is loaded -document.addEventListener('DOMContentLoaded', () => { - // Check if Web Bluetooth is supported - if (!navigator.bluetooth) { - alert('Web Bluetooth is not supported in this browser. Please use Chrome, Edge, or Opera.'); - document.getElementById('connect-btn').disabled = true; - return; - } - - console.log('LED Controller Web-BLE Interface loaded'); - new LEDController(); -}); diff --git a/webapp/css/style.css b/webapp/css/style.css deleted file mode 100644 index e3142e7..0000000 --- a/webapp/css/style.css +++ /dev/null @@ -1,313 +0,0 @@ -/* LED Controller Web-BLE Interface Styles */ - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -:root { - --primary-color: #2196F3; - --success-color: #4CAF50; - --warning-color: #FF9800; - --danger-color: #F44336; - --dark-bg: #1a1a2e; - --card-bg: #16213e; - --text-primary: #ffffff; - --text-secondary: #b0b0b0; - --border-color: #0f4c75; - --hover-bg: #1e3a5f; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, var(--dark-bg) 0%, #0f3460 100%); - color: var(--text-primary); - min-height: 100vh; - padding: 20px; -} - -.container { - max-width: 800px; - margin: 0 auto; -} - -header { - text-align: center; - margin-bottom: 30px; -} - -header h1 { - font-size: 2.5em; - margin-bottom: 10px; - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); -} - -.subtitle { - color: var(--text-secondary); - font-size: 1.1em; -} - -.card { - background: var(--card-bg); - border-radius: 12px; - padding: 25px; - margin-bottom: 20px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); - border: 1px solid var(--border-color); -} - -.card h2 { - margin-bottom: 20px; - color: var(--primary-color); - font-size: 1.5em; -} - -.hidden { - display: none !important; -} - -/* Connection Status */ -.connection-status { - display: flex; - align-items: center; - gap: 10px; - margin-bottom: 15px; - font-size: 1.1em; -} - -.status-indicator { - width: 16px; - height: 16px; - border-radius: 50%; - animation: pulse 2s infinite; -} - -.status-indicator.disconnected { - background: var(--danger-color); -} - -.status-indicator.connected { - background: var(--success-color); -} - -@keyframes pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.5; } -} - -/* Form Elements */ -.form-group { - margin-bottom: 20px; -} - -.form-group label { - display: block; - margin-bottom: 8px; - font-weight: 500; - color: var(--text-primary); -} - -.form-group input[type="number"], -.form-group select { - width: 100%; - padding: 12px; - background: var(--dark-bg); - border: 1px solid var(--border-color); - border-radius: 6px; - color: var(--text-primary); - font-size: 1em; -} - -.form-group input[type="number"]:focus, -.form-group select:focus { - outline: none; - border-color: var(--primary-color); -} - -.form-group small { - display: block; - margin-top: 5px; - color: var(--text-secondary); - font-size: 0.9em; -} - -.form-group input[type="file"] { - width: 100%; - padding: 10px; - background: var(--dark-bg); - border: 2px dashed var(--border-color); - border-radius: 6px; - color: var(--text-primary); - cursor: pointer; -} - -/* Buttons */ -.btn { - padding: 12px 24px; - border: none; - border-radius: 6px; - font-size: 1em; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - width: 100%; -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); -} - -.btn:active { - transform: translateY(0); -} - -.btn:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.btn-primary { - background: var(--primary-color); - color: white; -} - -.btn-success { - background: var(--success-color); - color: white; -} - -.btn-warning { - background: var(--warning-color); - color: white; -} - -.btn-secondary { - background: var(--border-color); - color: white; -} - -.btn-mode { - background: var(--hover-bg); - color: var(--text-primary); - border: 1px solid var(--border-color); -} - -.btn-mode:hover { - background: var(--primary-color); -} - -/* Button Grid */ -.button-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); - gap: 10px; - margin-bottom: 20px; -} - -/* Current Mode Display */ -.current-mode { - background: var(--dark-bg); - padding: 15px; - border-radius: 6px; - margin-bottom: 20px; - text-align: center; - font-size: 1.1em; - border: 1px solid var(--border-color); -} - -.current-mode span { - color: var(--primary-color); - font-weight: bold; -} - -/* Progress Bar */ -.progress-container { - width: 100%; - height: 40px; - background: var(--dark-bg); - border-radius: 20px; - overflow: hidden; - margin: 20px 0; - position: relative; - border: 1px solid var(--border-color); -} - -.progress-bar { - height: 100%; - background: linear-gradient(90deg, var(--primary-color), var(--success-color)); - transition: width 0.3s ease; - width: 0%; -} - -.progress-text { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-weight: bold; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); -} - -/* Warning Box */ -.warning { - background: rgba(255, 152, 0, 0.1); - border: 1px solid var(--warning-color); - border-radius: 6px; - padding: 15px; - margin-bottom: 20px; - color: var(--warning-color); - font-weight: 500; -} - -/* Divider */ -.divider { - height: 1px; - background: var(--border-color); - margin: 20px 0; -} - -/* Footer */ -footer { - text-align: center; - margin-top: 40px; - padding: 20px; - color: var(--text-secondary); -} - -footer small { - font-size: 0.9em; -} - -/* Responsive Design */ -@media (max-width: 600px) { - header h1 { - font-size: 2em; - } - - .button-grid { - grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); - } - - .btn { - font-size: 0.9em; - padding: 10px 16px; - } -} - -/* Animations */ -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.card { - animation: fadeIn 0.5s ease; -} diff --git a/webapp/data/favicon.ico b/webapp/data/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/webapp/index.html b/webapp/index.html deleted file mode 100644 index 1edec70..0000000 --- a/webapp/index.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - LED Controller Config - - - - -
-
-

✈️ LED Controller

-

Model Aircraft LED Configuration via Web-BLE

-
- -
-

🔗 Connection

-
- - Disconnected -
- -
- - - - - - - -
-

ESP32 LED Controller © 2026

-

Supports ESP32 DevKitC & ESP32-C3 MINI

-
-
- - - - -- 2.50.1 From 25b2c028b66b115ed7c731fcbc760dc7187bf9f2 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 10:45:42 +0100 Subject: [PATCH 03/22] own config module --- main/CMakeLists.txt | 1 + main/config.c | 177 ++++++++++++++++++++++++++++++++++++++++++++ main/config.h | 52 +++++++++++++ main/control.c | 131 +++----------------------------- main/control.h | 30 -------- main/main.c | 2 - 6 files changed, 239 insertions(+), 154 deletions(-) create mode 100644 main/config.c create mode 100644 main/config.h diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index e428543..39d1cfc 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -6,5 +6,6 @@ idf_component_register( "rcsignal.c" "animation.c" "localbtn.c" + "config.c" INCLUDE_DIRS "." ) diff --git a/main/config.c b/main/config.c new file mode 100644 index 0000000..3632401 --- /dev/null +++ b/main/config.c @@ -0,0 +1,177 @@ +/** + * @file config.c + * @brief Config module implementation + */ + +#include "config.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "nvs.h" +#include "esp_timer.h" + +#include + +static const char *TAG = "CONFIG"; + +#define NVS_NAMESPACE "led_ctrl" +#define CONFIG_MAGIC 0xDEADBEEF + +#define HARDCODED_CONFIG +#define HARDCODED_CONFIG_LED_STRIP_A_PIN 12U +#define HARDCODED_CONFIG_LED_STRIP_B_PIN 14U +#define HARDCODED_CONFIG_LED_STRIP_A_COUNT 7U +#define HARDCODED_CONFIG_LED_STRIP_B_COUNT 7U +#define HARDCODED_CONFIG_PWM_PIN 13U + +// Global state +static config_t current_config = { + .led_pin_strip_a = -1, + .led_pin_strip_b = -1, + .led_count_strip_a = -1, + .led_count_strip_b = -1, + .pwm_pin = -1, + .magic = CONFIG_MAGIC}; + +// NVS Functions +static esp_err_t load_config_from_nvs(void) +{ + nvs_handle_t nvs_handle; + esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle); + if (err != ESP_OK) + { + ESP_LOGW(TAG, "NVS not found, using defaults"); + return ESP_ERR_NOT_FOUND; + } + + size_t required_size = sizeof(config_t); + err = nvs_get_blob(nvs_handle, "config", ¤t_config, &required_size); + nvs_close(nvs_handle); + + if (err != ESP_OK || current_config.magic != CONFIG_MAGIC) + { + ESP_LOGW(TAG, "Invalid config in NVS, using defaults"); + return ESP_ERR_INVALID_STATE; + } + + ESP_LOGI(TAG, "Loaded config from NVS"); + ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a); + ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b); + ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin); + + return ESP_OK; +} + +static esp_err_t save_config_to_nvs(void) +{ + nvs_handle_t nvs_handle; + esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs_handle); + if (err != ESP_OK) + { + return err; + } + + current_config.magic = CONFIG_MAGIC; + err = nvs_set_blob(nvs_handle, "config", ¤t_config, sizeof(config_t)); + if (err == ESP_OK) + { + err = nvs_commit(nvs_handle); + } + + nvs_close(nvs_handle); + + if (err == ESP_OK) + { + ESP_LOGI(TAG, "Config saved to NVS"); + } + else + { + ESP_LOGE(TAG, "Failed to save config: %s", esp_err_to_name(err)); + } + + return err; +} + +esp_err_t config_reset_config(void) +{ + current_config.led_pin_strip_a = -1; + current_config.led_pin_strip_b = -1; + current_config.led_count_strip_a = -1; + current_config.led_count_strip_b = -1; + current_config.pwm_pin = -1; + current_config.magic = CONFIG_MAGIC; + + return save_config_to_nvs(); +} + +void config_get_config(config_t *const cnf) +{ + cnf->led_pin_strip_a = current_config.led_pin_strip_a; + cnf->led_pin_strip_b = current_config.led_pin_strip_b; + cnf->led_count_strip_a = current_config.led_count_strip_a; + cnf->led_count_strip_b = current_config.led_count_strip_b; + cnf->pwm_pin = current_config.pwm_pin; +} + +esp_err_t config_update_config(const config_t *config) +{ + if (!config) + { + return ESP_ERR_INVALID_ARG; + } + + // Reinitialize if pins changed + bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) || + (current_config.led_pin_strip_b != config->led_pin_strip_b) || + (current_config.pwm_pin != config->pwm_pin); + + memcpy(¤t_config, config, sizeof(config_t)); + esp_err_t err = save_config_to_nvs(); + + if (err == ESP_OK && pins_changed) + { + ESP_LOGI(TAG, "Restarting to apply new pin configuration..."); + vTaskDelay(pdMS_TO_TICKS(1000)); + esp_restart(); + } + + return err; +} + +// Main initialization +esp_err_t config_init(void) +{ + esp_err_t ret; + + ESP_LOGI(TAG, "Initializing Config Controller..."); + + // Initialize NVS + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + +#ifdef HARDCODED_CONFIG + current_config.led_pin_strip_a = HARDCODED_CONFIG_LED_STRIP_A_PIN; + current_config.led_pin_strip_b = HARDCODED_CONFIG_LED_STRIP_B_PIN; + current_config.led_count_strip_a = HARDCODED_CONFIG_LED_STRIP_A_COUNT; + current_config.led_count_strip_b = HARDCODED_CONFIG_LED_STRIP_B_COUNT; + current_config.pwm_pin = HARDCODED_CONFIG_PWM_PIN; + current_config.magic = CONFIG_MAGIC; + + save_config_to_nvs(); +#endif + + // Load configuration + load_config_from_nvs(); + + ESP_LOGI(TAG, "Config system initialized successfully"); + + return ESP_OK; +} diff --git a/main/config.h b/main/config.h new file mode 100644 index 0000000..410e02a --- /dev/null +++ b/main/config.h @@ -0,0 +1,52 @@ +/** + * @file config.h + * @brief Config module for LED controller - handles read and store of persistent data + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "esp_err.h" +#include +#include + +/** + * @brief Configuration structure stored in NVS + */ +typedef struct +{ + int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) + int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) + int8_t led_count_strip_a; // LED count for LED strip A (-1 = not configured) + int8_t led_count_strip_b; // LED count for LED strip B (-1 = not configured) + int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) + uint32_t magic; // Magic number to validate config (0xDEADBEEF) //TODO: use sha256 +} config_t; + +/** + * @brief Initialize the config system + * Loads configuration from NVS and initializes subsystems + * @return ESP_OK on success + */ +esp_err_t config_init(void); + +/** + * @brief Get current configuration + * @param Pointer to current configuration (read-only) + */ +void config_get_config(config_t *const cnf); + +/** + * @brief Update configuration and save to NVS + * @param config New configuration + * @return ESP_OK on success + */ +esp_err_t config_update_config(const config_t *config); + +/** + * @brief Reset configuration to defaults + * @return ESP_OK on success + */ +esp_err_t config_reset_config(void); + +#endif // CONFIG_H diff --git a/main/control.c b/main/control.c index f1450b3..7cbb7f9 100644 --- a/main/control.c +++ b/main/control.c @@ -4,6 +4,7 @@ */ #include "control.h" +#include "config.h" #include "led.h" #include "rcsignal.h" #include "localbtn.h" @@ -13,130 +14,17 @@ #include "freertos/task.h" #include "esp_log.h" #include "esp_system.h" -#include "nvs_flash.h" -#include "nvs.h" #include "esp_timer.h" #include static const char *TAG = "CONTROL"; -#define NVS_NAMESPACE "led_ctrl" -#define CONFIG_MAGIC 0xDEADBEEF -#define DEFAULT_NUM_LEDS_A 7 -#define DEFAULT_NUM_LEDS_B 7 - -// Global state -static controller_config_t current_config = { - .led_pin_strip_a = -1, - .led_pin_strip_b = -1, - .pwm_pin = -1, - .magic = CONFIG_MAGIC}; - static uint8_t current_animation_mode = 0; // Forward declarations static void on_mode_change(uint8_t new_mode); -// NVS Functions -static esp_err_t load_config_from_nvs(void) -{ - nvs_handle_t nvs_handle; - esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle); - if (err != ESP_OK) - { - ESP_LOGW(TAG, "NVS not found, using defaults"); - return ESP_ERR_NOT_FOUND; - } - - size_t required_size = sizeof(controller_config_t); - err = nvs_get_blob(nvs_handle, "config", ¤t_config, &required_size); - nvs_close(nvs_handle); - - if (err != ESP_OK || current_config.magic != CONFIG_MAGIC) - { - ESP_LOGW(TAG, "Invalid config in NVS, using defaults"); - return ESP_ERR_INVALID_STATE; - } - - ESP_LOGI(TAG, "Loaded config from NVS"); - ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a); - ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b); - ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin); - - return ESP_OK; -} - -static esp_err_t save_config_to_nvs(void) -{ - nvs_handle_t nvs_handle; - esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs_handle); - if (err != ESP_OK) - { - return err; - } - - current_config.magic = CONFIG_MAGIC; - err = nvs_set_blob(nvs_handle, "config", ¤t_config, sizeof(controller_config_t)); - if (err == ESP_OK) - { - err = nvs_commit(nvs_handle); - } - - nvs_close(nvs_handle); - - if (err == ESP_OK) - { - ESP_LOGI(TAG, "Config saved to NVS"); - } - else - { - ESP_LOGE(TAG, "Failed to save config: %s", esp_err_to_name(err)); - } - - return err; -} - -esp_err_t control_reset_config(void) -{ - current_config.led_pin_strip_a = 12; - current_config.led_pin_strip_b = 14; - current_config.pwm_pin = 13; - current_config.magic = CONFIG_MAGIC; - - return save_config_to_nvs(); -} - -const controller_config_t *control_get_config(void) -{ - return ¤t_config; -} - -esp_err_t control_update_config(const controller_config_t *config) -{ - if (!config) - { - return ESP_ERR_INVALID_ARG; - } - - // Reinitialize if pins changed - bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) || - (current_config.led_pin_strip_b != config->led_pin_strip_b) || - (current_config.pwm_pin != config->pwm_pin); - - memcpy(¤t_config, config, sizeof(controller_config_t)); - esp_err_t err = save_config_to_nvs(); - - if (err == ESP_OK && pins_changed) - { - ESP_LOGI(TAG, "Restarting to apply new pin configuration..."); - vTaskDelay(pdMS_TO_TICKS(1000)); - esp_restart(); - } - - return err; -} - // Animation mode change callback static void on_mode_change(uint8_t new_mode) { @@ -170,21 +58,20 @@ esp_err_t control_init(void) ESP_LOGI(TAG, "Initializing LED Controller..."); - // Initialize NVS - ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + // Initialize config + ret = config_init(); + if (ret != ESP_OK) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); + ESP_LOGE(TAG, "Config init failed: %s", esp_err_to_name(ret)); + return ret; } - ESP_ERROR_CHECK(ret); - // Load configuration - load_config_from_nvs(); + config_t current_config; + config_get_config(¤t_config); // Initialize LED strips ret = led_init(current_config.led_pin_strip_a, current_config.led_pin_strip_b, - DEFAULT_NUM_LEDS_A, DEFAULT_NUM_LEDS_B); + current_config.led_count_strip_a, current_config.led_count_strip_a); if (ret != ESP_OK) { ESP_LOGE(TAG, "LED init failed: %s", esp_err_to_name(ret)); diff --git a/main/control.h b/main/control.h index bb4da93..b4fc404 100644 --- a/main/control.h +++ b/main/control.h @@ -10,17 +10,6 @@ #include #include -/** - * @brief Configuration structure stored in NVS - */ -typedef struct -{ - int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) - int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) - int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) - uint32_t magic; // Magic number to validate config (0xDEADBEEF) -} controller_config_t; - /** * @brief Initialize the control system * Loads configuration from NVS and initializes subsystems @@ -28,25 +17,6 @@ typedef struct */ esp_err_t control_init(void); -/** - * @brief Get current configuration - * @return Pointer to current configuration (read-only) - */ -const controller_config_t *control_get_config(void); - -/** - * @brief Update configuration and save to NVS - * @param config New configuration - * @return ESP_OK on success - */ -esp_err_t control_update_config(const controller_config_t *config); - -/** - * @brief Reset configuration to defaults - * @return ESP_OK on success - */ -esp_err_t control_reset_config(void); - /** * @brief Set animation mode manually * @param mode Animation mode (0-13) diff --git a/main/main.c b/main/main.c index a546c85..dda5a4f 100644 --- a/main/main.c +++ b/main/main.c @@ -56,8 +56,6 @@ void app_main(void) } } - control_reset_config(); - // Create animation update task BaseType_t task_ret = xTaskCreate( animation_task, -- 2.50.1 From 1012d3bb2f779c97d5807612f57526ecb6d245ac Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 11:09:59 +0100 Subject: [PATCH 04/22] cleanup --- .gitignore | 2 - main/animation.c | 5 +- main/animation.h | 3 +- main/config.c | 3 +- main/config.h | 1 + main/control.c | 4 - main/control.h | 1 + main/led.c | 2 + main/led.h | 3 +- main/localbtn.c | 2 + main/localbtn.h | 3 +- main/main.c | 9 +- main/rcsignal.c | 5 +- main/rcsignal.h | 3 +- sdkconfig | 2100 ++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 2127 insertions(+), 19 deletions(-) create mode 100644 sdkconfig diff --git a/.gitignore b/.gitignore index 01aae50..e961c15 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ # https://github.com/espressif/esp-idf build/ -sdkconfig sdkconfig.old # ---> VisualStudioCode @@ -187,7 +186,6 @@ cython_debug/ # https://github.com/espressif/esp-idf build/ -sdkconfig sdkconfig.old # ---> CMake diff --git a/main/animation.c b/main/animation.c index f637113..0d25c80 100644 --- a/main/animation.c +++ b/main/animation.c @@ -5,16 +5,17 @@ #include "animation.h" #include "led.h" + #include "esp_log.h" #include "esp_timer.h" #include "esp_random.h" + #include -#include static const char *TAG = "ANIMATION"; #define FRAMES_PER_SECOND 60 -#define NUM_LEDS_DEFAULT 44 //TODO: Default from proof-of-concept +#define NUM_LEDS_DEFAULT 44 // TODO: Default from proof-of-concept static animation_mode_t current_mode = ANIM_BLACK; static uint8_t global_hue = 0; diff --git a/main/animation.h b/main/animation.h index 0430f0f..e797b6d 100644 --- a/main/animation.h +++ b/main/animation.h @@ -6,9 +6,10 @@ #ifndef ANIMATION_H #define ANIMATION_H -#include #include "esp_err.h" +#include + /** * @brief Animation modes */ diff --git a/main/config.c b/main/config.c index 3632401..3f17611 100644 --- a/main/config.c +++ b/main/config.c @@ -11,7 +11,6 @@ #include "esp_system.h" #include "nvs_flash.h" #include "nvs.h" -#include "esp_timer.h" #include @@ -21,11 +20,13 @@ static const char *TAG = "CONFIG"; #define CONFIG_MAGIC 0xDEADBEEF #define HARDCODED_CONFIG +#ifdef HARDCODED_CONFIG #define HARDCODED_CONFIG_LED_STRIP_A_PIN 12U #define HARDCODED_CONFIG_LED_STRIP_B_PIN 14U #define HARDCODED_CONFIG_LED_STRIP_A_COUNT 7U #define HARDCODED_CONFIG_LED_STRIP_B_COUNT 7U #define HARDCODED_CONFIG_PWM_PIN 13U +#endif // Global state static config_t current_config = { diff --git a/main/config.h b/main/config.h index 410e02a..1788ff7 100644 --- a/main/config.h +++ b/main/config.h @@ -7,6 +7,7 @@ #define CONFIG_H #include "esp_err.h" + #include #include diff --git a/main/control.c b/main/control.c index 7cbb7f9..136b46b 100644 --- a/main/control.c +++ b/main/control.c @@ -13,10 +13,6 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" -#include "esp_system.h" -#include "esp_timer.h" - -#include static const char *TAG = "CONTROL"; diff --git a/main/control.h b/main/control.h index b4fc404..be07140 100644 --- a/main/control.h +++ b/main/control.h @@ -7,6 +7,7 @@ #define CONTROL_H #include "esp_err.h" + #include #include diff --git a/main/led.c b/main/led.c index d3bd2e4..53ce7e4 100644 --- a/main/led.c +++ b/main/led.c @@ -4,10 +4,12 @@ */ #include "led.h" + #include "driver/rmt_tx.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" + #include #include diff --git a/main/led.h b/main/led.h index edec26a..ccb9575 100644 --- a/main/led.h +++ b/main/led.h @@ -6,9 +6,10 @@ #ifndef LED_H #define LED_H -#include #include "esp_err.h" +#include + #define LED_STRIP_MAX_LEDS 100 // Maximum LEDs per strip /** diff --git a/main/localbtn.c b/main/localbtn.c index d0e0335..ede3cb8 100644 --- a/main/localbtn.c +++ b/main/localbtn.c @@ -4,12 +4,14 @@ */ #include "localbtn.h" + #include "driver/gpio.h" #include "esp_timer.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "soc/gpio_num.h" + #include static const char *TAG = "LOCALBTN"; diff --git a/main/localbtn.h b/main/localbtn.h index c5227da..e5a21a1 100644 --- a/main/localbtn.h +++ b/main/localbtn.h @@ -6,9 +6,10 @@ #ifndef LOCALBTN_H #define LOCALBTN_H +#include "esp_err.h" + #include #include -#include "esp_err.h" /** * @brief Callback function type for mode changes diff --git a/main/main.c b/main/main.c index dda5a4f..49387db 100644 --- a/main/main.c +++ b/main/main.c @@ -3,15 +3,16 @@ * @brief Main application entry point for LED Controller */ -#include +#include "control.h" +#include "animation.h" +#include "led.h" + #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "esp_system.h" -#include "control.h" -#include "animation.h" -#include "led.h" +#include static const char *TAG = "MAIN"; diff --git a/main/rcsignal.c b/main/rcsignal.c index 13ad38f..ee7fc30 100644 --- a/main/rcsignal.c +++ b/main/rcsignal.c @@ -4,19 +4,20 @@ */ #include "rcsignal.h" + #include "driver/gpio.h" #include "esp_timer.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" + #include static const char *TAG = "RCSIGNAL"; -#define MAX_MODES 14 +#define MAX_MODES 14 //TODO: Get from config #define PULSE_THRESHOLD_US 1500 #define SIGNAL_TIMEOUT_MS 100 - static struct { int8_t gpio_pin; diff --git a/main/rcsignal.h b/main/rcsignal.h index 05d34ac..a0ed1cd 100644 --- a/main/rcsignal.h +++ b/main/rcsignal.h @@ -6,9 +6,10 @@ #ifndef RCSIGNAL_H #define RCSIGNAL_H +#include "esp_err.h" + #include #include -#include "esp_err.h" /** * @brief Callback function type for mode changes diff --git a/sdkconfig b/sdkconfig new file mode 100644 index 0000000..df5adb4 --- /dev/null +++ b/sdkconfig @@ -0,0 +1,2100 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.4.1 Project Configuration +# +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" +CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" +CONFIG_SOC_DPORT_WORKAROUND="Not determined" +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_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=64 +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_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +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_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_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_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=y +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=y +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_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_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.4.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 is not set +# 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_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +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_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_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format +# 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_APP_ROLLBACK_ENABLE is not set +# 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_COMPILE_TIME_DATE=y +# 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=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# 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="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +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 is not set +# CONFIG_COMPILER_CXX_RTTI is not set +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 is not set +CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y +# 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 +CONFIG_BT_ALARM_MAX_NUM=50 +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# TWAI Configuration +# +# CONFIG_TWAI_ISR_IN_IRAM 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 TWAI Configuration + +# +# 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 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 +# 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 +# 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_IRAM_SAFE is not set +# 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 +# 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_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# 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_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG 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 +# end of ESP-Driver:Touch Sensor Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART 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=512 +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 is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# 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 +# 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_PERIPH_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 + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_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_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +# CONFIG_PM_SLP_IRAM_OPT is not set +# 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 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_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 is not set +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y + +# +# 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 +# end of Brownout Detector + +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +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_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_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_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 is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# 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 +# 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=1536 +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 +# 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 +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y +# 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 +# + +# +# 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_TIMESTAMP_SOURCE_RTOS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM=y +# end of Format +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +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=68 +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_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 +# 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_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=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# 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_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_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=y +# 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 +# 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 + +# +# Newlib +# +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_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# end of Newlib + +# +# 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 +# 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 +# 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_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=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 +# 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_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_APP_ROLLBACK_ENABLE is not set +# 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 is not set +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_MCPWM_ISR_IN_IRAM 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_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_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_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_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 is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +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_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 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 -- 2.50.1 From 0dd26fdcde98cb34a1bb151957cafa6c72b20630 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 11:57:24 +0100 Subject: [PATCH 05/22] localbtn deinit & cleanup --- main/control.c | 15 ++++++--------- main/localbtn.c | 27 +++++++++++++++++---------- main/localbtn.h | 3 +-- main/rcsignal.c | 19 ++----------------- main/rcsignal.h | 8 +------- 5 files changed, 27 insertions(+), 45 deletions(-) diff --git a/main/control.c b/main/control.c index 136b46b..bac154c 100644 --- a/main/control.c +++ b/main/control.c @@ -14,18 +14,20 @@ #include "freertos/task.h" #include "esp_log.h" +#define MAX_MODES 14 // TODO + static const char *TAG = "CONTROL"; static uint8_t current_animation_mode = 0; // Forward declarations -static void on_mode_change(uint8_t new_mode); +static void on_mode_change(); // Animation mode change callback -static void on_mode_change(uint8_t new_mode) +static void on_mode_change() { - current_animation_mode = new_mode; - animation_set_mode((animation_mode_t)new_mode); + current_animation_mode = (current_animation_mode + 1) % MAX_MODES; + animation_set_mode((animation_mode_t)current_animation_mode); } void control_set_animation_mode(uint8_t mode) @@ -42,11 +44,6 @@ uint8_t control_get_animation_mode(void) return current_animation_mode; } -void control_emulate_pwm_pulse(void) -{ - rcsignal_trigger_mode_change(); -} - // Main initialization esp_err_t control_init(void) { diff --git a/main/localbtn.c b/main/localbtn.c index ede3cb8..b3bda9b 100644 --- a/main/localbtn.c +++ b/main/localbtn.c @@ -16,17 +16,18 @@ static const char *TAG = "LOCALBTN"; uint8_t current_mode; +bool initialized; +TaskHandle_t localbtnTaskhandle; localbtn_mode_change_callback_t callback; -#define BOOT_BTN GPIO_NUM_0 -#define MAX_MODES 14 // TODO: get from control +#define BOOT_BTN GPIO_NUM_0 // TODO: move to config bool boot_button_pressed(void) { return gpio_get_level(BOOT_BTN) == 0; // active LOW } -static void monitor_task(void *arg) +static void localbtn_task(void *arg) { bool lastState = false; while (1) @@ -38,10 +39,6 @@ static void monitor_task(void *arg) { printf("BOOT button pressed\n"); - current_mode = (current_mode + 1) % MAX_MODES; - - ESP_LOGI(TAG, "Mode changed to: %d ", current_mode); - if (callback) { callback(current_mode); @@ -64,13 +61,13 @@ esp_err_t localbtn_init() ESP_ERROR_CHECK(gpio_config(&io_conf)); // Create monitor task - BaseType_t ret = xTaskCreate(monitor_task, "localbtn_monitor", 2048, NULL, 5, NULL); + BaseType_t ret = xTaskCreate(localbtn_task, "localbtn_monitor", 2048, NULL, 5, &localbtnTaskhandle); if (ret != pdPASS) { return ESP_FAIL; } - // TODO: rcsignal.initialized = true; + initialized = true; ESP_LOGI(TAG, "local btn initialized on GPIO%d", BOOT_BTN); return ESP_OK; @@ -78,7 +75,17 @@ esp_err_t localbtn_init() void localbtn_deinit(void) { - // TODO: + if (!initialized) + { + return; + } + + if (localbtnTaskhandle) + { + vTaskDelete(localbtnTaskhandle); + localbtnTaskhandle = NULL; + } + initialized = false; } void localbtn_register_callback(localbtn_mode_change_callback_t cb) diff --git a/main/localbtn.h b/main/localbtn.h index e5a21a1..89f4619 100644 --- a/main/localbtn.h +++ b/main/localbtn.h @@ -13,9 +13,8 @@ /** * @brief Callback function type for mode changes - * @param new_mode New animation mode (0-13) */ -typedef void (*localbtn_mode_change_callback_t)(uint8_t new_mode); +typedef void (*localbtn_mode_change_callback_t)(); /** * @brief Initialize local btn reading diff --git a/main/rcsignal.c b/main/rcsignal.c index ee7fc30..9b9433c 100644 --- a/main/rcsignal.c +++ b/main/rcsignal.c @@ -15,7 +15,7 @@ static const char *TAG = "RCSIGNAL"; -#define MAX_MODES 14 //TODO: Get from config +#define MAX_MODES 14 // TODO: Get from config #define PULSE_THRESHOLD_US 1500 #define SIGNAL_TIMEOUT_MS 100 static struct @@ -99,14 +99,10 @@ static void monitor_task(void *arg) { // Mode change detected rcsignal.pull_detected = false; - rcsignal.current_mode = (rcsignal.current_mode + 1) % MAX_MODES; - - ESP_LOGI(TAG, "Mode changed to: %d (pulse: %lu us)", - rcsignal.current_mode, rcsignal.pulse_width_us); if (rcsignal.callback) { - rcsignal.callback(rcsignal.current_mode); + rcsignal.callback(); } } } @@ -186,17 +182,6 @@ bool rcsignal_is_active(void) return rcsignal.signal_active; } -void rcsignal_trigger_mode_change(void) -{ - rcsignal.current_mode = (rcsignal.current_mode + 1) % MAX_MODES; - ESP_LOGI(TAG, "Manual mode change to: %d", rcsignal.current_mode); - - if (rcsignal.callback) - { - rcsignal.callback(rcsignal.current_mode); - } -} - uint8_t rcsignal_get_current_mode(void) { return rcsignal.current_mode; diff --git a/main/rcsignal.h b/main/rcsignal.h index a0ed1cd..8941112 100644 --- a/main/rcsignal.h +++ b/main/rcsignal.h @@ -13,9 +13,8 @@ /** * @brief Callback function type for mode changes - * @param new_mode New animation mode (0-13) */ -typedef void (*rcsignal_mode_change_callback_t)(uint8_t new_mode); +typedef void (*rcsignal_mode_change_callback_t)(); /** * @brief Initialize RC signal reading @@ -47,11 +46,6 @@ uint32_t rcsignal_get_pulse_width(void); */ bool rcsignal_is_active(void); -/** - * @brief Manually trigger mode change (for emulation) - */ -void rcsignal_trigger_mode_change(void); - /** * @brief Get current mode * @return Current animation mode (0-13) -- 2.50.1 From d33bda52d0eb5dd3b99626edd8dd6af6e8a06117 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 12:13:55 +0100 Subject: [PATCH 06/22] cleanup --- main/config.c | 11 ++++++++++- main/config.h | 1 + main/control.c | 2 +- main/localbtn.c | 25 +++++++++---------------- main/localbtn.h | 2 +- main/rcsignal.c | 1 - 6 files changed, 22 insertions(+), 20 deletions(-) diff --git a/main/config.c b/main/config.c index 3f17611..244b4d6 100644 --- a/main/config.c +++ b/main/config.c @@ -11,6 +11,7 @@ #include "esp_system.h" #include "nvs_flash.h" #include "nvs.h" +#include "soc/gpio_num.h" #include @@ -26,6 +27,7 @@ static const char *TAG = "CONFIG"; #define HARDCODED_CONFIG_LED_STRIP_A_COUNT 7U #define HARDCODED_CONFIG_LED_STRIP_B_COUNT 7U #define HARDCODED_CONFIG_PWM_PIN 13U +#define HARDCODED_CONFIG_LOCALBTN_PIN GPIO_NUM_0 #endif // Global state @@ -35,6 +37,7 @@ static config_t current_config = { .led_count_strip_a = -1, .led_count_strip_b = -1, .pwm_pin = -1, + .localBtn_pin = -1, .magic = CONFIG_MAGIC}; // NVS Functions @@ -61,7 +64,10 @@ static esp_err_t load_config_from_nvs(void) ESP_LOGI(TAG, "Loaded config from NVS"); ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a); ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b); + ESP_LOGI(TAG, " Strip A LED count: %d", current_config.led_count_strip_a); + ESP_LOGI(TAG, " Strip B LED count: %d", current_config.led_count_strip_b); ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin); + ESP_LOGI(TAG, " Local btn Pin: GPIO%d", current_config.localBtn_pin); return ESP_OK; } @@ -103,6 +109,7 @@ esp_err_t config_reset_config(void) current_config.led_count_strip_a = -1; current_config.led_count_strip_b = -1; current_config.pwm_pin = -1; + current_config.localBtn_pin = -1; current_config.magic = CONFIG_MAGIC; return save_config_to_nvs(); @@ -115,6 +122,7 @@ void config_get_config(config_t *const cnf) cnf->led_count_strip_a = current_config.led_count_strip_a; cnf->led_count_strip_b = current_config.led_count_strip_b; cnf->pwm_pin = current_config.pwm_pin; + cnf->localBtn_pin = current_config.localBtn_pin; } esp_err_t config_update_config(const config_t *config) @@ -127,7 +135,7 @@ esp_err_t config_update_config(const config_t *config) // Reinitialize if pins changed bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) || (current_config.led_pin_strip_b != config->led_pin_strip_b) || - (current_config.pwm_pin != config->pwm_pin); + (current_config.pwm_pin != config->pwm_pin); // TODO: Count? LocalBtn? Needed? memcpy(¤t_config, config, sizeof(config_t)); esp_err_t err = save_config_to_nvs(); @@ -164,6 +172,7 @@ esp_err_t config_init(void) current_config.led_count_strip_a = HARDCODED_CONFIG_LED_STRIP_A_COUNT; current_config.led_count_strip_b = HARDCODED_CONFIG_LED_STRIP_B_COUNT; current_config.pwm_pin = HARDCODED_CONFIG_PWM_PIN; + current_config.localBtn_pin = HARDCODED_CONFIG_LOCALBTN_PIN; current_config.magic = CONFIG_MAGIC; save_config_to_nvs(); diff --git a/main/config.h b/main/config.h index 1788ff7..d5627b0 100644 --- a/main/config.h +++ b/main/config.h @@ -21,6 +21,7 @@ typedef struct int8_t led_count_strip_a; // LED count for LED strip A (-1 = not configured) int8_t led_count_strip_b; // LED count for LED strip B (-1 = not configured) int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) + int8_t localBtn_pin; // GPIO pin for local btn input (-1 = not configured) uint32_t magic; // Magic number to validate config (0xDEADBEEF) //TODO: use sha256 } config_t; diff --git a/main/control.c b/main/control.c index bac154c..e10e02c 100644 --- a/main/control.c +++ b/main/control.c @@ -88,7 +88,7 @@ esp_err_t control_init(void) } // Initialize local BTN - ret = localbtn_init(); + ret = localbtn_init(current_config.localBtn_pin); if (ret != ESP_OK) { ESP_LOGE(TAG, "Local BTN init failed: %s", esp_err_to_name(ret)); diff --git a/main/localbtn.c b/main/localbtn.c index b3bda9b..429c284 100644 --- a/main/localbtn.c +++ b/main/localbtn.c @@ -10,34 +10,27 @@ #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "soc/gpio_num.h" #include static const char *TAG = "LOCALBTN"; uint8_t current_mode; +int8_t current_localBtnPin; bool initialized; TaskHandle_t localbtnTaskhandle; localbtn_mode_change_callback_t callback; -#define BOOT_BTN GPIO_NUM_0 // TODO: move to config - -bool boot_button_pressed(void) -{ - return gpio_get_level(BOOT_BTN) == 0; // active LOW -} - static void localbtn_task(void *arg) { bool lastState = false; while (1) { - vTaskDelay(pdMS_TO_TICKS(10)); + vTaskDelay(pdMS_TO_TICKS(100)); // TODO:Get btn state via interrupt instead of polling - bool currentState = boot_button_pressed(); + bool currentState = (gpio_get_level(current_localBtnPin) == 0); if ((currentState) && (lastState != currentState)) { - printf("BOOT button pressed\n"); + ESP_LOGI(TAG, "Local button pressed"); if (callback) { @@ -49,11 +42,11 @@ static void localbtn_task(void *arg) } } -esp_err_t localbtn_init() +esp_err_t localbtn_init(int8_t pin_localbtn) { - + current_localBtnPin = pin_localbtn; gpio_config_t io_conf = { - .pin_bit_mask = 1ULL << BOOT_BTN, + .pin_bit_mask = 1ULL << current_localBtnPin, .mode = GPIO_MODE_INPUT, .pull_up_en = GPIO_PULLUP_ENABLE, // safe even if external pull-up exists .pull_down_en = GPIO_PULLDOWN_DISABLE, @@ -61,14 +54,14 @@ esp_err_t localbtn_init() ESP_ERROR_CHECK(gpio_config(&io_conf)); // Create monitor task - BaseType_t ret = xTaskCreate(localbtn_task, "localbtn_monitor", 2048, NULL, 5, &localbtnTaskhandle); + BaseType_t ret = xTaskCreate(localbtn_task, "localbtn_task", 2048, NULL, 5, &localbtnTaskhandle); if (ret != pdPASS) { return ESP_FAIL; } initialized = true; - ESP_LOGI(TAG, "local btn initialized on GPIO%d", BOOT_BTN); + ESP_LOGI(TAG, "local btn initialized on GPIO%d", current_localBtnPin); return ESP_OK; } diff --git a/main/localbtn.h b/main/localbtn.h index 89f4619..0b87671 100644 --- a/main/localbtn.h +++ b/main/localbtn.h @@ -20,7 +20,7 @@ typedef void (*localbtn_mode_change_callback_t)(); * @brief Initialize local btn reading * @return ESP_OK on success */ -esp_err_t localbtn_init(); +esp_err_t localbtn_init(int8_t pin_localbtn); /** * @brief Deinitialize local btn reading diff --git a/main/rcsignal.c b/main/rcsignal.c index 9b9433c..724d23d 100644 --- a/main/rcsignal.c +++ b/main/rcsignal.c @@ -15,7 +15,6 @@ static const char *TAG = "RCSIGNAL"; -#define MAX_MODES 14 // TODO: Get from config #define PULSE_THRESHOLD_US 1500 #define SIGNAL_TIMEOUT_MS 100 static struct -- 2.50.1 From 3ada494d15bb5429d9b11cea5a9e30aec3b26830 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 12:20:27 +0100 Subject: [PATCH 07/22] remove MAX_MODES --- README.md | 11 ++++------- main/animation.c | 1 - main/control.c | 5 +---- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 40f94e9..7083504 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ Professional LED controller firmware for ESP32. Designed for model aircraft with led-controller-firmware/ ├── main/ │ ├── main.c # Application entry point -│ ├── control.c/h # NVS, initialization +│ ├── control.c/h # initialization +│ ├── config.c/h # NVS │ ├── led.c/h # WS2812B control (RMT driver) │ ├── rcsignal.c/h # PWM signal reading │ ├── localbtn.c/h # Local btn reading @@ -69,7 +70,7 @@ idf.py build idf.py -p /dev/ttyUSB0 flash monitor ``` -Replace `/dev/ttyUSB0` with your serial port (COM3 on Windows). +Replace `/dev/ttyUSB0` with your serial port. ## Hardware Setup @@ -80,6 +81,7 @@ ESP32 Pin -> Component GPIO XX -> WS2812B Strip A Data GPIO XX -> WS2812B Strip B Data GPIO XX -> RC PWM Signal +GPIO XX -> Local button Signal GND -> Common Ground 5V -> LED Strip Power (if current < 500mA) ``` @@ -103,11 +105,6 @@ GND -> Common Ground 1. Add mode to `animation_mode_t` enum in `animation.h` 2. Implement animation function in `animation.c` 3. Add case to `animation_update()` switch statement -4. Update `MODE_NAMES` array in `webapp/app/app.js` - -### Modifying LED Count - -Edit `DEFAULT_NUM_LEDS_A` and `DEFAULT_NUM_LEDS_B` in `control.c`. TODO: ### Testing diff --git a/main/animation.c b/main/animation.c index 0d25c80..d93c1cd 100644 --- a/main/animation.c +++ b/main/animation.c @@ -15,7 +15,6 @@ static const char *TAG = "ANIMATION"; #define FRAMES_PER_SECOND 60 -#define NUM_LEDS_DEFAULT 44 // TODO: Default from proof-of-concept static animation_mode_t current_mode = ANIM_BLACK; static uint8_t global_hue = 0; diff --git a/main/control.c b/main/control.c index e10e02c..ec40635 100644 --- a/main/control.c +++ b/main/control.c @@ -14,10 +14,7 @@ #include "freertos/task.h" #include "esp_log.h" -#define MAX_MODES 14 // TODO - static const char *TAG = "CONTROL"; - static uint8_t current_animation_mode = 0; // Forward declarations @@ -26,7 +23,7 @@ static void on_mode_change(); // Animation mode change callback static void on_mode_change() { - current_animation_mode = (current_animation_mode + 1) % MAX_MODES; + current_animation_mode = (current_animation_mode + 1) % ANIM_MODE_COUNT; animation_set_mode((animation_mode_t)current_animation_mode); } -- 2.50.1 From b1b179b5fff1a583e0b8c3d8faec98bacf25bb59 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 12:24:19 +0100 Subject: [PATCH 08/22] remove update function --- main/config.c | 31 +++---------------------------- main/config.h | 9 +-------- 2 files changed, 4 insertions(+), 36 deletions(-) diff --git a/main/config.c b/main/config.c index 244b4d6..f09facc 100644 --- a/main/config.c +++ b/main/config.c @@ -125,37 +125,11 @@ void config_get_config(config_t *const cnf) cnf->localBtn_pin = current_config.localBtn_pin; } -esp_err_t config_update_config(const config_t *config) -{ - if (!config) - { - return ESP_ERR_INVALID_ARG; - } - - // Reinitialize if pins changed - bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) || - (current_config.led_pin_strip_b != config->led_pin_strip_b) || - (current_config.pwm_pin != config->pwm_pin); // TODO: Count? LocalBtn? Needed? - - memcpy(¤t_config, config, sizeof(config_t)); - esp_err_t err = save_config_to_nvs(); - - if (err == ESP_OK && pins_changed) - { - ESP_LOGI(TAG, "Restarting to apply new pin configuration..."); - vTaskDelay(pdMS_TO_TICKS(1000)); - esp_restart(); - } - - return err; -} - -// Main initialization esp_err_t config_init(void) { esp_err_t ret; - ESP_LOGI(TAG, "Initializing Config Controller..."); + ESP_LOGI(TAG, "Initializing Config..."); // Initialize NVS ret = nvs_flash_init(); @@ -163,6 +137,7 @@ esp_err_t config_init(void) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); + ESP_ERROR_CHECK(config_reset_config()); } ESP_ERROR_CHECK(ret); @@ -181,7 +156,7 @@ esp_err_t config_init(void) // Load configuration load_config_from_nvs(); - ESP_LOGI(TAG, "Config system initialized successfully"); + ESP_LOGI(TAG, "Config initialized successfully"); return ESP_OK; } diff --git a/main/config.h b/main/config.h index d5627b0..815b000 100644 --- a/main/config.h +++ b/main/config.h @@ -27,7 +27,7 @@ typedef struct /** * @brief Initialize the config system - * Loads configuration from NVS and initializes subsystems + * Loads configuration from NVS * @return ESP_OK on success */ esp_err_t config_init(void); @@ -38,13 +38,6 @@ esp_err_t config_init(void); */ void config_get_config(config_t *const cnf); -/** - * @brief Update configuration and save to NVS - * @param config New configuration - * @return ESP_OK on success - */ -esp_err_t config_update_config(const config_t *config); - /** * @brief Reset configuration to defaults * @return ESP_OK on success -- 2.50.1 From 9ef50436a42b0ec9a85ae215eae53a473696c17e Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 12:38:40 +0100 Subject: [PATCH 09/22] use sha256 instead of magic pattern --- main/config.c | 71 ++++++++++++++++++++++++++++++++++++--------------- main/config.h | 15 ++++++----- 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/main/config.c b/main/config.c index f09facc..b0aae3d 100644 --- a/main/config.c +++ b/main/config.c @@ -12,13 +12,13 @@ #include "nvs_flash.h" #include "nvs.h" #include "soc/gpio_num.h" +#include "mbedtls/sha256.h" #include static const char *TAG = "CONFIG"; #define NVS_NAMESPACE "led_ctrl" -#define CONFIG_MAGIC 0xDEADBEEF #define HARDCODED_CONFIG #ifdef HARDCODED_CONFIG @@ -37,30 +37,44 @@ static config_t current_config = { .led_count_strip_a = -1, .led_count_strip_b = -1, .pwm_pin = -1, - .localBtn_pin = -1, - .magic = CONFIG_MAGIC}; + .localBtn_pin = -1}; + +static void calculate_config_hash(const config_t *cfg, uint8_t *out_hash); // NVS Functions static esp_err_t load_config_from_nvs(void) { nvs_handle_t nvs_handle; - esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle); - if (err != ESP_OK) + size_t size = sizeof(config_t); + config_t tmp; + + for (uint8_t i = 0; i < 2U; i++) { - ESP_LOGW(TAG, "NVS not found, using defaults"); - return ESP_ERR_NOT_FOUND; + esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle); + if (err != ESP_OK) + { + ESP_LOGW(TAG, "NVS not found, using defaults"); + config_reset_config(); + continue; + } + + err = nvs_get_blob(nvs_handle, "config", &tmp, &size); + nvs_close(nvs_handle); + + uint8_t calc_hash[CONFIG_HASH_LEN]; + calculate_config_hash(&tmp, calc_hash); + + if (memcmp(calc_hash, tmp.hash, CONFIG_HASH_LEN) != 0) + { + ESP_LOGW(TAG, "Invalid config in NVS, using defaults"); + config_reset_config(); + continue; + } + + // We found a valid config + break; } - - size_t required_size = sizeof(config_t); - err = nvs_get_blob(nvs_handle, "config", ¤t_config, &required_size); - nvs_close(nvs_handle); - - if (err != ESP_OK || current_config.magic != CONFIG_MAGIC) - { - ESP_LOGW(TAG, "Invalid config in NVS, using defaults"); - return ESP_ERR_INVALID_STATE; - } - + ESP_LOGI(TAG, "Loaded config from NVS"); ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a); ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b); @@ -74,6 +88,8 @@ static esp_err_t load_config_from_nvs(void) static esp_err_t save_config_to_nvs(void) { + calculate_config_hash(¤t_config, current_config.hash); + nvs_handle_t nvs_handle; esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs_handle); if (err != ESP_OK) @@ -81,7 +97,6 @@ static esp_err_t save_config_to_nvs(void) return err; } - current_config.magic = CONFIG_MAGIC; err = nvs_set_blob(nvs_handle, "config", ¤t_config, sizeof(config_t)); if (err == ESP_OK) { @@ -110,7 +125,6 @@ esp_err_t config_reset_config(void) current_config.led_count_strip_b = -1; current_config.pwm_pin = -1; current_config.localBtn_pin = -1; - current_config.magic = CONFIG_MAGIC; return save_config_to_nvs(); } @@ -148,7 +162,6 @@ esp_err_t config_init(void) current_config.led_count_strip_b = HARDCODED_CONFIG_LED_STRIP_B_COUNT; current_config.pwm_pin = HARDCODED_CONFIG_PWM_PIN; current_config.localBtn_pin = HARDCODED_CONFIG_LOCALBTN_PIN; - current_config.magic = CONFIG_MAGIC; save_config_to_nvs(); #endif @@ -160,3 +173,19 @@ esp_err_t config_init(void) return ESP_OK; } + +static void calculate_config_hash(const config_t *cfg, uint8_t *out_hash) +{ + mbedtls_sha256_context ctx; + + mbedtls_sha256_init(&ctx); + mbedtls_sha256_starts(&ctx, 0); // 0 = SHA-256, 1 = SHA-224 + + mbedtls_sha256_update( + &ctx, + (const unsigned char *)cfg, + offsetof(config_t, hash)); + + mbedtls_sha256_finish(&ctx, out_hash); + mbedtls_sha256_free(&ctx); +} \ No newline at end of file diff --git a/main/config.h b/main/config.h index 815b000..f5298e2 100644 --- a/main/config.h +++ b/main/config.h @@ -11,18 +11,19 @@ #include #include +#define CONFIG_HASH_LEN 32 // SHA256 /** * @brief Configuration structure stored in NVS */ typedef struct { - int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) - int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) - int8_t led_count_strip_a; // LED count for LED strip A (-1 = not configured) - int8_t led_count_strip_b; // LED count for LED strip B (-1 = not configured) - int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) - int8_t localBtn_pin; // GPIO pin for local btn input (-1 = not configured) - uint32_t magic; // Magic number to validate config (0xDEADBEEF) //TODO: use sha256 + int8_t led_pin_strip_a; // GPIO pin for LED strip A (-1 = not configured) + int8_t led_pin_strip_b; // GPIO pin for LED strip B (-1 = not configured) + int8_t led_count_strip_a; // LED count for LED strip A (-1 = not configured) + int8_t led_count_strip_b; // LED count for LED strip B (-1 = not configured) + int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured) + int8_t localBtn_pin; // GPIO pin for local btn input (-1 = not configured) + uint8_t hash[CONFIG_HASH_LEN]; // SHA256 Hash of config } config_t; /** -- 2.50.1 From d576b4d42d7c560c60fb9652b56954b387abb0df Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 18:15:53 +0100 Subject: [PATCH 10/22] handle BTN with interrupt --- main/localbtn.c | 195 +++++++++++++++++++++++++++++++++++++++--------- main/localbtn.h | 9 ++- 2 files changed, 163 insertions(+), 41 deletions(-) diff --git a/main/localbtn.c b/main/localbtn.c index 429c284..491cb2f 100644 --- a/main/localbtn.c +++ b/main/localbtn.c @@ -1,6 +1,6 @@ /** * @file localbtn.c - * @brief Local GPIO0 BTN reading implementation using edge capture + * @brief Local GPIO button reading using interrupt-based edge detection */ #include "localbtn.h" @@ -10,78 +10,199 @@ #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "freertos/queue.h" #include static const char *TAG = "LOCALBTN"; -uint8_t current_mode; -int8_t current_localBtnPin; -bool initialized; -TaskHandle_t localbtnTaskhandle; -localbtn_mode_change_callback_t callback; +#define DEBOUNCE_TIME_MS 50 // Debounce time in milliseconds + +// Button state +static struct +{ + int8_t gpio_pin; + bool initialized; + TaskHandle_t task_handle; + QueueHandle_t event_queue; + localbtn_mode_change_callback_t callback; + int64_t last_press_time; // For debouncing +} button_state = { + .gpio_pin = -1, + .initialized = false, + .task_handle = NULL, + .event_queue = NULL, + .callback = NULL, + .last_press_time = 0}; + +/** + * @brief GPIO interrupt handler (ISR) + * Minimal work in ISR - just send event to task + */ +static void IRAM_ATTR gpio_isr_handler(void *arg) +{ + int64_t now = esp_timer_get_time(); + + // Send timestamp to queue for debouncing in task + BaseType_t high_priority_task_woken = pdFALSE; + xQueueSendFromISR(button_state.event_queue, &now, &high_priority_task_woken); + + if (high_priority_task_woken) + { + portYIELD_FROM_ISR(); + } +} + +/** + * @brief Button handling task + * Handles debouncing and callback execution + */ static void localbtn_task(void *arg) { - bool lastState = false; + int64_t event_time; + + ESP_LOGI(TAG, "Button task started, monitoring GPIO%d", button_state.gpio_pin); + while (1) { - vTaskDelay(pdMS_TO_TICKS(100)); // TODO:Get btn state via interrupt instead of polling - - bool currentState = (gpio_get_level(current_localBtnPin) == 0); - if ((currentState) && (lastState != currentState)) + // Wait for button press event from ISR + if (xQueueReceive(button_state.event_queue, &event_time, portMAX_DELAY)) { - ESP_LOGI(TAG, "Local button pressed"); + // Debouncing: Check if enough time has passed since last press + int64_t time_since_last_press = (event_time - button_state.last_press_time) / 1000; // Convert to ms - if (callback) + if (time_since_last_press >= DEBOUNCE_TIME_MS) { - callback(current_mode); + // Valid button press - verify button is still pressed + vTaskDelay(pdMS_TO_TICKS(10)); // Small delay to ensure stable state + + if (gpio_get_level(button_state.gpio_pin) == 0) + { + ESP_LOGI(TAG, "Button press detected on GPIO%d", button_state.gpio_pin); + + button_state.last_press_time = event_time; + + // Execute callback + if (button_state.callback) + { + button_state.callback(); + } + } } } - - lastState = currentState; } } esp_err_t localbtn_init(int8_t pin_localbtn) { - current_localBtnPin = pin_localbtn; - gpio_config_t io_conf = { - .pin_bit_mask = 1ULL << current_localBtnPin, - .mode = GPIO_MODE_INPUT, - .pull_up_en = GPIO_PULLUP_ENABLE, // safe even if external pull-up exists - .pull_down_en = GPIO_PULLDOWN_DISABLE, - .intr_type = GPIO_INTR_DISABLE}; - ESP_ERROR_CHECK(gpio_config(&io_conf)); - - // Create monitor task - BaseType_t ret = xTaskCreate(localbtn_task, "localbtn_task", 2048, NULL, 5, &localbtnTaskhandle); - if (ret != pdPASS) + if (pin_localbtn < 0) { + ESP_LOGW(TAG, "Button disabled (invalid pin: %d)", pin_localbtn); + return ESP_ERR_NOT_SUPPORTED; + } + + if (button_state.initialized) + { + ESP_LOGW(TAG, "Button already initialized"); + return ESP_ERR_INVALID_STATE; + } + + button_state.gpio_pin = pin_localbtn; + button_state.last_press_time = 0U; + + // Create event queue for ISR->Task communication + button_state.event_queue = xQueueCreate(10, sizeof(int64_t)); + if (button_state.event_queue == NULL) + { + ESP_LOGE(TAG, "Failed to create event queue"); + return ESP_ERR_NO_MEM; + } + + // Configure GPIO + gpio_config_t io_conf = { + .pin_bit_mask = (1ULL << pin_localbtn), + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_ENABLE, // Enable internal pull-up (safe even with external) + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_NEGEDGE // Interrupt on falling edge (button press) + }; + + esp_err_t ret = gpio_config(&io_conf); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "GPIO config failed: %s", esp_err_to_name(ret)); + vQueueDelete(button_state.event_queue); + return ret; + } + + // Add ISR handler for this GPIO + ret = gpio_isr_handler_add(pin_localbtn, gpio_isr_handler, NULL); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "ISR handler add failed: %s", esp_err_to_name(ret)); + vQueueDelete(button_state.event_queue); + return ret; + } + + // Create button handling task + BaseType_t task_ret = xTaskCreate( + localbtn_task, + "localbtn_task", + 2048, + NULL, + 5, // Priority 5 (same as other tasks) + &button_state.task_handle); + + if (task_ret != pdPASS) + { + ESP_LOGE(TAG, "Failed to create button task"); + gpio_isr_handler_remove(pin_localbtn); + vQueueDelete(button_state.event_queue); return ESP_FAIL; } - initialized = true; - ESP_LOGI(TAG, "local btn initialized on GPIO%d", current_localBtnPin); + button_state.initialized = true; + ESP_LOGI(TAG, "Button initialized on GPIO%d with interrupt-based detection", pin_localbtn); + ESP_LOGI(TAG, "Debounce time: %d ms", DEBOUNCE_TIME_MS); return ESP_OK; } void localbtn_deinit(void) { - if (!initialized) + if (!button_state.initialized) { return; } - if (localbtnTaskhandle) + // Remove ISR handler + if (button_state.gpio_pin >= 0) { - vTaskDelete(localbtnTaskhandle); - localbtnTaskhandle = NULL; + gpio_isr_handler_remove(button_state.gpio_pin); } - initialized = false; + + // Delete task + if (button_state.task_handle) + { + vTaskDelete(button_state.task_handle); + button_state.task_handle = NULL; + } + + // Delete queue + if (button_state.event_queue) + { + vQueueDelete(button_state.event_queue); + button_state.event_queue = NULL; + } + + button_state.initialized = false; + button_state.callback = NULL; + + ESP_LOGI(TAG, "Button deinitialized"); } void localbtn_register_callback(localbtn_mode_change_callback_t cb) { - callback = cb; -} + button_state.callback = cb; + ESP_LOGI(TAG, "Callback registered"); +} \ No newline at end of file diff --git a/main/localbtn.h b/main/localbtn.h index 0b87671..4a9c81e 100644 --- a/main/localbtn.h +++ b/main/localbtn.h @@ -1,6 +1,6 @@ /** * @file localbtn.h - * @brief Local GPIO0 BTN reading implementation using edge capture + * @brief Local GPIO button reading using interrupt-based edge detection */ #ifndef LOCALBTN_H @@ -17,19 +17,20 @@ typedef void (*localbtn_mode_change_callback_t)(); /** - * @brief Initialize local btn reading + * @brief Initialize local button with interrupt-based detection + * @param pin_localbtn GPIO pin number for button (active low) * @return ESP_OK on success */ esp_err_t localbtn_init(int8_t pin_localbtn); /** - * @brief Deinitialize local btn reading + * @brief Deinitialize local button reading */ void localbtn_deinit(void); /** * @brief Register callback for mode changes - * @param callback Callback function + * @param cb Callback function */ void localbtn_register_callback(localbtn_mode_change_callback_t cb); -- 2.50.1 From a08dba780ab8047e47a0bff3f74234ca38bed7c6 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 20:16:11 +0100 Subject: [PATCH 11/22] cleanup --- main/control.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/main/control.c b/main/control.c index ec40635..f0c95fa 100644 --- a/main/control.c +++ b/main/control.c @@ -17,9 +17,6 @@ static const char *TAG = "CONTROL"; static uint8_t current_animation_mode = 0; -// Forward declarations -static void on_mode_change(); - // Animation mode change callback static void on_mode_change() { -- 2.50.1 From 12b8acf81cf6a6876a14a484b95f7ea9d13939ad Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 21:16:05 +0100 Subject: [PATCH 12/22] fix navigation animation --- main/animation.c | 76 +++++++++++++----------------------------------- main/animation.h | 8 +---- main/control.c | 11 +------ main/control.h | 6 ---- main/led.c | 19 +++++++++++- main/main.c | 4 ++- 6 files changed, 43 insertions(+), 81 deletions(-) diff --git a/main/animation.c b/main/animation.c index d93c1cd..229bd4e 100644 --- a/main/animation.c +++ b/main/animation.c @@ -211,9 +211,7 @@ static void anim_bpm(void) static void anim_navigation(void) { - // Navigation lights: left red, right green, with blinking white - static uint8_t blink_state = 0; - + // Navigation lights: left red, right green led_clear_all(); uint16_t num_leds_a = led_get_num_leds_a(); @@ -221,51 +219,22 @@ static void anim_navigation(void) rgb_t red = {255, 0, 0}; rgb_t green = {0, 255, 0}; - rgb_t white = {255, 255, 255}; - // Left side red (first 3 LEDs of strip A) + // Side red (last 3 LEDs of strip A) if (num_leds_a >= 3) { - led_set_pixel_a(0, red); - led_set_pixel_a(1, red); - led_set_pixel_a(2, red); + led_set_pixel_a(num_leds_a - 1, red); + led_set_pixel_a(num_leds_a - 2, red); + led_set_pixel_a(num_leds_a - 3, red); } - // Right side green (last 3 LEDs) + // Side green (last 3 LEDs of strip B) if (num_leds_b >= 3) { led_set_pixel_b(num_leds_b - 1, green); led_set_pixel_b(num_leds_b - 2, green); led_set_pixel_b(num_leds_b - 3, green); } - else if (num_leds_a >= 6) - { - led_set_pixel_a(num_leds_a - 1, green); - led_set_pixel_a(num_leds_a - 2, green); - led_set_pixel_a(num_leds_a - 3, green); - } - - // Blinking white lights (positions 5-6 and 37-38 from original) - if (blink_state < FRAMES_PER_SECOND / 2) - { - if (num_leds_a > 6) - { - led_set_pixel_a(5, white); - led_set_pixel_a(6, white); - } - if (num_leds_b > 2) - { - led_set_pixel_b(1, white); - led_set_pixel_b(2, white); - } - else if (num_leds_a > 38) - { - led_set_pixel_a(37, white); - led_set_pixel_a(38, white); - } - } - - blink_state = (blink_state + 1) % FRAMES_PER_SECOND; } static void anim_chase(void) @@ -357,31 +326,26 @@ static void anim_random(void) esp_err_t animation_init(void) { current_mode = ANIM_BLACK; - global_hue = 0; - frame_counter = 0; + global_hue = 0U; + frame_counter = 0U; - ESP_LOGI(TAG, "Animation system initialized"); + ESP_LOGI(TAG, "Animation initialized"); return ESP_OK; } void animation_set_mode(animation_mode_t mode) { - if (mode >= ANIM_MODE_COUNT) + if ((mode >= ANIM_MODE_COUNT) || (mode < 0U)) { mode = ANIM_BLACK; } current_mode = mode; - frame_counter = 0; + frame_counter = 0U; ESP_LOGI(TAG, "Animation mode set to: %s", animation_get_mode_name(mode)); } -animation_mode_t animation_get_mode(void) -{ - return current_mode; -} - void animation_update(void) { // Update global hue every frame (slowly cycles colors) @@ -410,31 +374,31 @@ void animation_update(void) anim_white(); break; case ANIM_RAINBOW: - anim_rainbow(); + //anim_rainbow(); break; case ANIM_RAINBOW_GLITTER: - anim_rainbow_glitter(); + //anim_rainbow_glitter(); break; case ANIM_CONFETTI: - anim_confetti(); + //anim_confetti(); break; case ANIM_SINELON: - anim_sinelon(); + //anim_sinelon(); break; case ANIM_BPM: - anim_bpm(); + //anim_bpm(); break; case ANIM_NAVIGATION: anim_navigation(); break; case ANIM_CHASE: - anim_chase(); + //anim_chase(); break; case ANIM_CHASE_RGB: - anim_chase_rgb(); + //anim_chase_rgb(); break; case ANIM_RANDOM: - anim_random(); + //anim_random(); break; default: anim_black(); @@ -456,7 +420,7 @@ const char *animation_get_mode_name(animation_mode_t mode) "Rainbow with Glitter", "Confetti", "Sinelon", - "BPM", + "33BPM", "Navigation", "Chase", "Chase RGB", diff --git a/main/animation.h b/main/animation.h index e797b6d..1fce6fc 100644 --- a/main/animation.h +++ b/main/animation.h @@ -43,12 +43,6 @@ esp_err_t animation_init(void); */ void animation_set_mode(animation_mode_t mode); -/** - * @brief Get current animation mode - * @return Current mode - */ -animation_mode_t animation_get_mode(void); - /** * @brief Update animation (call periodically, e.g., 30-60 FPS) */ @@ -59,6 +53,6 @@ void animation_update(void); * @param mode Animation mode * @return Mode name string */ -const char* animation_get_mode_name(animation_mode_t mode); +const char *animation_get_mode_name(animation_mode_t mode); #endif // ANIMATION_H diff --git a/main/control.c b/main/control.c index f0c95fa..b01448a 100644 --- a/main/control.c +++ b/main/control.c @@ -24,15 +24,6 @@ static void on_mode_change() animation_set_mode((animation_mode_t)current_animation_mode); } -void control_set_animation_mode(uint8_t mode) -{ - if (mode >= ANIM_MODE_COUNT) - { - mode = 0; - } - on_mode_change(mode); -} - uint8_t control_get_animation_mode(void) { return current_animation_mode; @@ -58,7 +49,7 @@ esp_err_t control_init(void) // Initialize LED strips ret = led_init(current_config.led_pin_strip_a, current_config.led_pin_strip_b, - current_config.led_count_strip_a, current_config.led_count_strip_a); + current_config.led_count_strip_a, current_config.led_count_strip_b); if (ret != ESP_OK) { ESP_LOGE(TAG, "LED init failed: %s", esp_err_to_name(ret)); diff --git a/main/control.h b/main/control.h index be07140..87c3a2e 100644 --- a/main/control.h +++ b/main/control.h @@ -18,12 +18,6 @@ */ esp_err_t control_init(void); -/** - * @brief Set animation mode manually - * @param mode Animation mode (0-13) - */ -void control_set_animation_mode(uint8_t mode); - /** * @brief Get current animation mode * @return Current mode (0-13) diff --git a/main/led.c b/main/led.c index 53ce7e4..de782b5 100644 --- a/main/led.c +++ b/main/led.c @@ -321,7 +321,10 @@ static void show_strip(led_strip_t *strip) // Convert RGB to GRB for WS2812B uint8_t *grb_data = malloc(strip->num_leds * 3); if (!grb_data) + { + ESP_LOGE(TAG, "Failed to allocate GRB buffer"); return; + } for (uint16_t i = 0; i < strip->num_leds; i++) { @@ -334,7 +337,21 @@ static void show_strip(led_strip_t *strip) .loop_count = 0, }; - rmt_transmit(strip->rmt_channel, strip->encoder, grb_data, strip->num_leds * 3, &tx_config); + esp_err_t ret = rmt_transmit(strip->rmt_channel, strip->encoder, grb_data, strip->num_leds * 3, &tx_config); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "RMT transmit failed: %s", esp_err_to_name(ret)); + free(grb_data); + return; + } + + // Wait for transmission to complete before freeing buffer + ret = rmt_tx_wait_all_done(strip->rmt_channel, pdMS_TO_TICKS(100)); + if (ret != ESP_OK) + { + ESP_LOGW(TAG, "RMT wait timeout"); + } + free(grb_data); } diff --git a/main/main.c b/main/main.c index 49387db..3d0e493 100644 --- a/main/main.c +++ b/main/main.c @@ -76,6 +76,8 @@ void app_main(void) } } + animation_set_mode((animation_mode_t)control_get_animation_mode()); + ESP_LOGI(TAG, "System initialized successfully"); // Main loop - just monitor system status @@ -84,6 +86,6 @@ void app_main(void) vTaskDelay(pdMS_TO_TICKS(5000)); // Periodic status logging - ESP_LOGI(TAG, "Status - Mode: %d", control_get_animation_mode()); + ESP_LOGI(TAG, "Animation Mode set to: %s", animation_get_mode_name(control_get_animation_mode())); } } -- 2.50.1 From 0f62418d93d451289f86a1a48497cd61b2c48764 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 21:35:28 +0100 Subject: [PATCH 13/22] fix sinelon --- main/animation.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/main/animation.c b/main/animation.c index 229bd4e..d544356 100644 --- a/main/animation.c +++ b/main/animation.c @@ -20,17 +20,22 @@ static animation_mode_t current_mode = ANIM_BLACK; static uint8_t global_hue = 0; static uint32_t frame_counter = 0; -// Beat calculation helper (similar to FastLED beatsin16) +// Beat calculation helper static int16_t beatsin16(uint8_t bpm, int16_t min_val, int16_t max_val) { - uint32_t ms = esp_timer_get_time() / 1000; - uint32_t beat = (ms * bpm * 256) / 60000; - uint8_t beat8 = (beat >> 8) & 0xFF; + // Use uint64_t to prevent overflow + uint64_t us = esp_timer_get_time(); // Microseconds - // Sin approximation - float angle = (beat8 / 255.0f) * 2.0f * M_PI; + // Calculate beat phase (0-65535 repeating at BPM rate) + // beats_per_minute → beats_per_microsecond = bpm / 60,000,000 + uint64_t beat_phase = (us * (uint64_t)bpm * 65536ULL) / 60000000ULL; + uint16_t beat16 = (uint16_t)(beat_phase & 0xFFFF); + + // Convert to angle (0 to 2π) + float angle = (beat16 / 65535.0f) * 2.0f * M_PI; float sin_val = sinf(angle); + // Map sin (-1 to +1) to output range (min_val to max_val) int16_t range = max_val - min_val; int16_t result = min_val + (int16_t)((sin_val + 1.0f) * range / 2.0f); @@ -94,7 +99,7 @@ static void anim_white(void) static void anim_rainbow(void) { - // FastLED's built-in rainbow generator + // Rainbow generator uint16_t num_leds_a = led_get_num_leds_a(); uint16_t num_leds_b = led_get_num_leds_b(); @@ -163,14 +168,14 @@ static void anim_sinelon(void) led_fade_to_black(20); uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); - int16_t pos = beatsin16(13, 0, num_leds - 1); + int16_t pos = beatsin16(13, 0, num_leds); hsv_t hsv = {global_hue, 255, 192}; rgb_t color = led_hsv_to_rgb(hsv); if (pos < led_get_num_leds_a()) { - led_add_pixel_a(pos, color); + led_add_pixel_a(led_get_num_leds_a() - pos - 1, color); } else { @@ -223,9 +228,9 @@ static void anim_navigation(void) // Side red (last 3 LEDs of strip A) if (num_leds_a >= 3) { - led_set_pixel_a(num_leds_a - 1, red); - led_set_pixel_a(num_leds_a - 2, red); - led_set_pixel_a(num_leds_a - 3, red); + led_set_pixel_a(num_leds_a - 1, red); + led_set_pixel_a(num_leds_a - 2, red); + led_set_pixel_a(num_leds_a - 3, red); } // Side green (last 3 LEDs of strip B) @@ -374,31 +379,31 @@ void animation_update(void) anim_white(); break; case ANIM_RAINBOW: - //anim_rainbow(); + // anim_rainbow(); break; case ANIM_RAINBOW_GLITTER: - //anim_rainbow_glitter(); + // anim_rainbow_glitter(); break; case ANIM_CONFETTI: - //anim_confetti(); + // anim_confetti(); break; case ANIM_SINELON: - //anim_sinelon(); + anim_sinelon(); break; case ANIM_BPM: - //anim_bpm(); + // anim_bpm(); break; case ANIM_NAVIGATION: anim_navigation(); break; case ANIM_CHASE: - //anim_chase(); + // anim_chase(); break; case ANIM_CHASE_RGB: - //anim_chase_rgb(); + // anim_chase_rgb(); break; case ANIM_RANDOM: - //anim_random(); + // anim_random(); break; default: anim_black(); -- 2.50.1 From 883fff95dd7139686859d24fba9559abc2ceb229 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 21:55:00 +0100 Subject: [PATCH 14/22] fix rainbow animation --- main/animation.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/main/animation.c b/main/animation.c index d544356..fb0ff76 100644 --- a/main/animation.c +++ b/main/animation.c @@ -102,17 +102,21 @@ static void anim_rainbow(void) // Rainbow generator uint16_t num_leds_a = led_get_num_leds_a(); uint16_t num_leds_b = led_get_num_leds_b(); + uint16_t num_leds = num_leds_a + num_leds_b; - for (uint16_t i = 0; i < num_leds_a; i++) + for (uint16_t i = 0; i < num_leds; i++) { hsv_t hsv = {(uint8_t)(global_hue + (i * 7)), 255, 255}; - led_set_pixel_a(i, led_hsv_to_rgb(hsv)); - } + rgb_t color = led_hsv_to_rgb(hsv); - for (uint16_t i = 0; i < num_leds_b; i++) - { - hsv_t hsv = {(uint8_t)(global_hue + (i * 7)), 255, 255}; - led_set_pixel_b(i, led_hsv_to_rgb(hsv)); + if (i < num_leds_a) + { + led_set_pixel_a(num_leds_a - i - 1, color); + } + else + { + led_set_pixel_b(i - num_leds_a, color); + } } } @@ -379,7 +383,7 @@ void animation_update(void) anim_white(); break; case ANIM_RAINBOW: - // anim_rainbow(); + anim_rainbow(); break; case ANIM_RAINBOW_GLITTER: // anim_rainbow_glitter(); -- 2.50.1 From 715d50c25535a2ea7259f88c9bd44aa6bd3455e0 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 21:58:11 +0100 Subject: [PATCH 15/22] enable rainbow with glitter animation --- main/animation.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/animation.c b/main/animation.c index fb0ff76..3a15c24 100644 --- a/main/animation.c +++ b/main/animation.c @@ -142,7 +142,7 @@ static void add_glitter(uint8_t chance_of_glitter) static void anim_rainbow_glitter(void) { anim_rainbow(); - add_glitter(80); + add_glitter(255); } static void anim_confetti(void) @@ -386,7 +386,7 @@ void animation_update(void) anim_rainbow(); break; case ANIM_RAINBOW_GLITTER: - // anim_rainbow_glitter(); + anim_rainbow_glitter(); break; case ANIM_CONFETTI: // anim_confetti(); -- 2.50.1 From 733b05eaebc001443e4e4c6622810a86e8a65070 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 22:06:02 +0100 Subject: [PATCH 16/22] fix confetti animation --- main/animation.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main/animation.c b/main/animation.c index 3a15c24..654ae59 100644 --- a/main/animation.c +++ b/main/animation.c @@ -153,16 +153,16 @@ static void anim_confetti(void) uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); uint16_t pos = random16(num_leds); - hsv_t hsv = {(uint8_t)(global_hue + random8()), 200, 255}; + hsv_t hsv = {(uint8_t)(global_hue + random8()), 255, 255}; rgb_t color = led_hsv_to_rgb(hsv); if (pos < led_get_num_leds_a()) { - led_add_pixel_a(pos, color); + led_set_pixel_a(led_get_num_leds_a() - pos - 1, color); } else { - led_add_pixel_b(pos - led_get_num_leds_a(), color); + led_set_pixel_b(pos - led_get_num_leds_a(), color); } } @@ -389,7 +389,7 @@ void animation_update(void) anim_rainbow_glitter(); break; case ANIM_CONFETTI: - // anim_confetti(); + anim_confetti(); break; case ANIM_SINELON: anim_sinelon(); -- 2.50.1 From f1aac6611d3119b0508ac2bea74aa84e37974f51 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 22:21:33 +0100 Subject: [PATCH 17/22] fix random animation --- main/animation.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/main/animation.c b/main/animation.c index 654ae59..1500ddf 100644 --- a/main/animation.c +++ b/main/animation.c @@ -309,18 +309,26 @@ static void anim_random(void) uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); uint16_t random_pos = random16(num_leds); - // Randomly clear all (rare event) - if (random_pos == num_leds - 1 && random8() > 200) - { - led_clear_all(); - return; - } - - // Set random LED to random color rgb_t random_color = { - random8(), - random8(), - random8()}; + 0, + 0, + 0}; + + // Set random LED to random basis color + switch (random16(3)) + { + case 0: + random_color.r = 255; + break; + case 1: + random_color.g = 255; + break; + case 2: + random_color.b = 255; + break; + default: + break; + } if (random_pos < led_get_num_leds_a()) { @@ -407,7 +415,7 @@ void animation_update(void) // anim_chase_rgb(); break; case ANIM_RANDOM: - // anim_random(); + anim_random(); break; default: anim_black(); -- 2.50.1 From d2d5d7dc4b450dde6c2043a3e3498ca99e29d680 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 22:33:28 +0100 Subject: [PATCH 18/22] fix chase animation --- main/animation.c | 50 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/main/animation.c b/main/animation.c index 1500ddf..be05627 100644 --- a/main/animation.c +++ b/main/animation.c @@ -251,25 +251,45 @@ static void anim_chase(void) // Red dot sweeping with trailing dots led_clear_all(); - uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); - int16_t pos = beatsin16(40, 0, num_leds - 1); + uint16_t num_leds_a = led_get_num_leds_a(); + uint16_t num_leds_b = led_get_num_leds_b(); + uint16_t total_leds = num_leds_a + num_leds_b; + + // Get oscillating position across both strips + int16_t center_pos = beatsin16(40, 0, total_leds - 1); rgb_t red = {255, 0, 0}; - // Set main dot and trailing dots - for (int offset = -2; offset <= 2; offset++) + // Draw center dot with dimmed trailing dots (3 dots total: center ±1) + for (int8_t offset = -1; offset <= 1; offset++) { - int16_t led_pos = pos + offset; - if (led_pos >= 0 && led_pos < num_leds) + int16_t led_pos = center_pos + offset; + + // Skip if position is out of bounds + if (led_pos < 0 || led_pos >= total_leds) + continue; + + // Calculate brightness based on distance from center + uint8_t brightness = (offset == 0) ? 255 : 64; // Center: full, trailing: 25% + + // Create dimmed color + rgb_t dimmed_red = { + (red.r * brightness) / 255, + (red.g * brightness) / 255, + (red.b * brightness) / 255}; + + // Map virtual position to physical LED + if (led_pos < num_leds_a) { - if (led_pos < led_get_num_leds_a()) - { - led_set_pixel_a(led_pos, red); - } - else - { - led_set_pixel_b(led_pos - led_get_num_leds_a(), red); - } + // Strip A (mirrored: position 0 maps to last LED) + uint16_t strip_a_index = num_leds_a - led_pos - 1; + led_set_pixel_a(strip_a_index, dimmed_red); + } + else + { + // Strip B (direct mapping) + uint16_t strip_b_index = led_pos - num_leds_a; + led_set_pixel_b(strip_b_index, dimmed_red); } } } @@ -409,7 +429,7 @@ void animation_update(void) anim_navigation(); break; case ANIM_CHASE: - // anim_chase(); + anim_chase(); break; case ANIM_CHASE_RGB: // anim_chase_rgb(); -- 2.50.1 From 468d2cba74b1cc7e25c6e55231e5da8f07388dca Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 22:39:44 +0100 Subject: [PATCH 19/22] fix chase rgb animation --- main/animation.c | 52 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/main/animation.c b/main/animation.c index be05627..f96fa36 100644 --- a/main/animation.c +++ b/main/animation.c @@ -270,7 +270,7 @@ static void anim_chase(void) continue; // Calculate brightness based on distance from center - uint8_t brightness = (offset == 0) ? 255 : 64; // Center: full, trailing: 25% + uint8_t brightness = (offset == 0) ? 255 : 32; // Center: full, trailing: 12% // Create dimmed color rgb_t dimmed_red = { @@ -299,26 +299,46 @@ static void anim_chase_rgb(void) // RGB cycling dot sweeping with trailing dots led_clear_all(); - uint16_t num_leds = led_get_num_leds_a() + led_get_num_leds_b(); - int16_t pos = beatsin16(40, 0, num_leds - 1); + uint16_t num_leds_a = led_get_num_leds_a(); + uint16_t num_leds_b = led_get_num_leds_b(); + uint16_t total_leds = num_leds_a + num_leds_b; + + // Get oscillating position across both strips + int16_t center_pos = beatsin16(40, 0, total_leds - 1); hsv_t hsv = {global_hue, 255, 192}; rgb_t color = led_hsv_to_rgb(hsv); - // Set main dot and trailing dots - for (int offset = -2; offset <= 2; offset++) + // Draw center dot with dimmed trailing dots (3 dots total: center ±1) + for (int8_t offset = -1; offset <= 1; offset++) { - int16_t led_pos = pos + offset; - if (led_pos >= 0 && led_pos < num_leds) + int16_t led_pos = center_pos + offset; + + // Skip if position is out of bounds + if (led_pos < 0 || led_pos >= total_leds) + continue; + + // Calculate brightness based on distance from center + uint8_t brightness = (offset == 0) ? 255 : 32; // Center: full, trailing: 12% + + // Create dimmed color + rgb_t dimmed_color = { + (color.r * brightness) / 255, + (color.g * brightness) / 255, + (color.b * brightness) / 255}; + + // Map virtual position to physical LED + if (led_pos < num_leds_a) { - if (led_pos < led_get_num_leds_a()) - { - led_add_pixel_a(led_pos, color); - } - else - { - led_add_pixel_b(led_pos - led_get_num_leds_a(), color); - } + // Strip A (mirrored: position 0 maps to last LED) + uint16_t strip_a_index = num_leds_a - led_pos - 1; + led_set_pixel_a(strip_a_index, dimmed_color); + } + else + { + // Strip B (direct mapping) + uint16_t strip_b_index = led_pos - num_leds_a; + led_set_pixel_b(strip_b_index, dimmed_color); } } } @@ -432,7 +452,7 @@ void animation_update(void) anim_chase(); break; case ANIM_CHASE_RGB: - // anim_chase_rgb(); + anim_chase_rgb(); break; case ANIM_RANDOM: anim_random(); -- 2.50.1 From 12a8710a2fd18b3d167f46de70748d7270e6012e Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 22:44:36 +0100 Subject: [PATCH 20/22] cleanup --- main/animation.c | 41 ----------------------------------------- main/animation.h | 9 ++++----- 2 files changed, 4 insertions(+), 46 deletions(-) diff --git a/main/animation.c b/main/animation.c index f96fa36..8b0e0e8 100644 --- a/main/animation.c +++ b/main/animation.c @@ -42,12 +42,6 @@ static int16_t beatsin16(uint8_t bpm, int16_t min_val, int16_t max_val) return result; } -// Beat calculation helper (beatsin8 variant) -static uint8_t beatsin8(uint8_t bpm, uint8_t min_val, uint8_t max_val) -{ - return (uint8_t)beatsin16(bpm, min_val, max_val); -} - // Random helper static uint8_t random8(void) { @@ -187,37 +181,6 @@ static void anim_sinelon(void) } } -static void anim_bpm(void) -{ - // Colored stripes pulsing at 33 BPM - uint8_t bpm = 33; - uint8_t beat = beatsin8(bpm, 64, 255); - - uint16_t num_leds_a = led_get_num_leds_a(); - uint16_t num_leds_b = led_get_num_leds_b(); - - // PartyColors palette simulation - const uint8_t palette_colors[] = { - 170, 240, 90, 150, 210, 30, 180, 0, - 210, 255, 150, 240, 255, 60, 255, 120}; - - for (uint16_t i = 0; i < num_leds_a; i++) - { - uint8_t color_index = (global_hue + (i * 2)) & 0x0F; - uint8_t brightness = beat - global_hue + (i * 10); - hsv_t hsv = {palette_colors[color_index], 255, brightness}; - led_set_pixel_a(i, led_hsv_to_rgb(hsv)); - } - - for (uint16_t i = 0; i < num_leds_b; i++) - { - uint8_t color_index = (global_hue + ((i + num_leds_a) * 2)) & 0x0F; - uint8_t brightness = beat - global_hue + ((i + num_leds_a) * 10); - hsv_t hsv = {palette_colors[color_index], 255, brightness}; - led_set_pixel_b(i, led_hsv_to_rgb(hsv)); - } -} - static void anim_navigation(void) { // Navigation lights: left red, right green @@ -442,9 +405,6 @@ void animation_update(void) case ANIM_SINELON: anim_sinelon(); break; - case ANIM_BPM: - // anim_bpm(); - break; case ANIM_NAVIGATION: anim_navigation(); break; @@ -477,7 +437,6 @@ const char *animation_get_mode_name(animation_mode_t mode) "Rainbow with Glitter", "Confetti", "Sinelon", - "33BPM", "Navigation", "Chase", "Chase RGB", diff --git a/main/animation.h b/main/animation.h index 1fce6fc..0ef176d 100644 --- a/main/animation.h +++ b/main/animation.h @@ -23,11 +23,10 @@ typedef enum { ANIM_RAINBOW_GLITTER = 6, // Rainbow with glitter ANIM_CONFETTI = 7, // Random colored speckles ANIM_SINELON = 8, // Colored dot sweeping (RGB cycling) - ANIM_BPM = 9, // Colored stripes @ 33 BPM - ANIM_NAVIGATION = 10, // Navigation lights (red left, green right) - ANIM_CHASE = 11, // Red dot sweeping - ANIM_CHASE_RGB = 12, // RGB cycling dot sweeping - ANIM_RANDOM = 13, // Random mode + ANIM_NAVIGATION = 9, // Navigation lights (red left, green right) + ANIM_CHASE = 10, // Red dot sweeping + ANIM_CHASE_RGB = 11, // RGB cycling dot sweeping + ANIM_RANDOM = 12, // Random mode ANIM_MODE_COUNT } animation_mode_t; -- 2.50.1 From 5796b28e1a32afb8c9b4816d13b28b1e118b41d5 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 6 Jan 2026 23:02:54 +0100 Subject: [PATCH 21/22] improve navigation animation --- main/animation.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/main/animation.c b/main/animation.c index 8b0e0e8..9e2e8bf 100644 --- a/main/animation.c +++ b/main/animation.c @@ -183,7 +183,12 @@ static void anim_sinelon(void) static void anim_navigation(void) { - // Navigation lights: left red, right green + // Aviation navigation lights with strobe overlay: + // - Red: Port (left) wingtip - steady + // - Green: Starboard (right) wingtip - steady + // - White strobe: Overlays outer nav lights with bright flashes + + static uint8_t strobe_counter = 0; led_clear_all(); uint16_t num_leds_a = led_get_num_leds_a(); @@ -191,22 +196,34 @@ static void anim_navigation(void) rgb_t red = {255, 0, 0}; rgb_t green = {0, 255, 0}; + rgb_t white = {255, 255, 255}; - // Side red (last 3 LEDs of strip A) + // Anti-collision strobe pattern: Double flash at ~1 Hz + // Flash duration: 3 frames (~50ms) for high-intensity effect + bool first_flash = (strobe_counter < 3); + bool second_flash = (strobe_counter >= 7 && strobe_counter < 10); + bool strobe_active = (first_flash || second_flash); + + // Port (left) - Red navigation light OR white strobe (outer 3 LEDs of strip A) if (num_leds_a >= 3) { - led_set_pixel_a(num_leds_a - 1, red); + rgb_t color_a = strobe_active ? white : red; + led_set_pixel_a(num_leds_a - 1, color_a); led_set_pixel_a(num_leds_a - 2, red); led_set_pixel_a(num_leds_a - 3, red); } - // Side green (last 3 LEDs of strip B) + // Starboard (right) - Green navigation light OR white strobe (outer 3 LEDs of strip B) if (num_leds_b >= 3) { - led_set_pixel_b(num_leds_b - 1, green); + rgb_t color_b = strobe_active ? white : green; + led_set_pixel_b(num_leds_b - 1, color_b); led_set_pixel_b(num_leds_b - 2, green); led_set_pixel_b(num_leds_b - 3, green); } + + // Strobe cycle: 90 frames = 1.5 second at 60 FPS + strobe_counter = (strobe_counter + 1) % 90; } static void anim_chase(void) -- 2.50.1 From e25971af894372da325ed0419de111cb735f486f Mon Sep 17 00:00:00 2001 From: localhorst Date: Fri, 9 Jan 2026 13:24:19 +0100 Subject: [PATCH 22/22] port to ESP32C3 --- .gitignore | 1 + main/config.c | 20 +- main/led.c | 2 +- sdkconfig | 1011 ++++++++++++++++++++++++++----------------------- 4 files changed, 560 insertions(+), 474 deletions(-) diff --git a/.gitignore b/.gitignore index e961c15..c15c445 100644 --- a/.gitignore +++ b/.gitignore @@ -291,3 +291,4 @@ dkms.conf .vscode/settings.json sdkconfig.defaults +.clangd diff --git a/main/config.c b/main/config.c index b0aae3d..b3e47e2 100644 --- a/main/config.c +++ b/main/config.c @@ -22,12 +22,20 @@ static const char *TAG = "CONFIG"; #define HARDCODED_CONFIG #ifdef HARDCODED_CONFIG -#define HARDCODED_CONFIG_LED_STRIP_A_PIN 12U -#define HARDCODED_CONFIG_LED_STRIP_B_PIN 14U -#define HARDCODED_CONFIG_LED_STRIP_A_COUNT 7U -#define HARDCODED_CONFIG_LED_STRIP_B_COUNT 7U -#define HARDCODED_CONFIG_PWM_PIN 13U -#define HARDCODED_CONFIG_LOCALBTN_PIN GPIO_NUM_0 +#define HARDCODED_CONFIG_LED_STRIP_A_PIN 3U +#define HARDCODED_CONFIG_LED_STRIP_B_PIN 2U +#define HARDCODED_CONFIG_LED_STRIP_A_COUNT 10U +#define HARDCODED_CONFIG_LED_STRIP_B_COUNT 10U +#define HARDCODED_CONFIG_PWM_PIN 1U + +#if defined(CONFIG_IDF_TARGET_ESP32C3) + #define HARDCODED_CONFIG_LOCALBTN_PIN 9 +#elif defined(CONFIG_IDF_TARGET_ESP32) + #define HARDCODED_CONFIG_LOCALBTN_PIN 0 +#else + #error "Unsupported target: BOOT button GPIO not defined" +#endif + #endif // Global state diff --git a/main/led.c b/main/led.c index de782b5..4390080 100644 --- a/main/led.c +++ b/main/led.c @@ -194,7 +194,7 @@ static esp_err_t init_strip(led_strip_t *strip, int8_t pin, uint16_t num_leds) rmt_tx_channel_config_t tx_chan_config = { .clk_src = RMT_CLK_SRC_DEFAULT, .gpio_num = pin, - .mem_block_symbols = 64, + .mem_block_symbols = 48, .resolution_hz = 80000000, // 80MHz .trans_queue_depth = 4, }; diff --git a/sdkconfig b/sdkconfig index df5adb4..11ff890 100644 --- a/sdkconfig +++ b/sdkconfig @@ -1,29 +1,27 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.4.1 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration # -CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" -CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" -CONFIG_SOC_DPORT_WORKAROUND="Not determined" -CONFIG_SOC_CAPS_ECO_VER_MAX=301 CONFIG_SOC_ADC_SUPPORTED=y -CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y CONFIG_SOC_UART_SUPPORTED=y -CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y CONFIG_SOC_GPTIMER_SUPPORTED=y -CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y CONFIG_SOC_BT_SUPPORTED=y -CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_XT_WDT_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_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_HAS_EFUSE_RST_BUG=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 @@ -31,17 +29,19 @@ CONFIG_SOC_SDM_SUPPORTED=y CONFIG_SOC_GPSPI_SUPPORTED=y CONFIG_SOC_LEDC_SUPPORTED=y CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y CONFIG_SOC_SUPPORT_COEXISTENCE=y CONFIG_SOC_AES_SUPPORTED=y CONFIG_SOC_MPI_SUPPORTED=y CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y CONFIG_SOC_FLASH_ENC_SUPPORTED=y CONFIG_SOC_SECURE_BOOT_SUPPORTED=y -CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_MEMPROT_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_ASSIST_DEBUG_SUPPORTED=y CONFIG_SOC_WDT_SUPPORTED=y CONFIG_SOC_SPI_FLASH_SUPPORTED=y CONFIG_SOC_RNG_SUPPORTED=y @@ -49,207 +49,258 @@ 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_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y CONFIG_SOC_ADC_DMA_SUPPORTED=y CONFIG_SOC_ADC_PERIPH_NUM=2 -CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=5 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_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 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_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=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_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CACHE_MEMORY_IBANK_SIZE=0x4000 +CONFIG_SOC_CPU_CORES_NUM=1 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=64 -CONFIG_SOC_DAC_CHAN_NUM=2 -CONFIG_SOC_DAC_RESOLUTION=8 -CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_CPU_HAS_CSR_PC=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=8 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=8 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x80000000 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 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_PIN_COUNT=22 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=21 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=21 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT=6 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x00000000003FFFC0 +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=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_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_I2C_NUM=1 +CONFIG_SOC_HP_I2C_NUM=1 CONFIG_SOC_I2C_FIFO_LEN=32 -CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_CMD_REG_NUM=8 CONFIG_SOC_I2C_SUPPORT_SLAVE=y -CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=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_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y CONFIG_SOC_I2S_SUPPORTS_PDM=y CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y -CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 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_I2S_SUPPORTS_TDM=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_SUPPORT_XTAL_CLOCK=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_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 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_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=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_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=108 +CONFIG_SOC_SLEEP_SYSTIMER_STALL_WORKAROUND=y +CONFIG_SOC_SLEEP_TGWDT_STOP_WORKAROUND=y +CONFIG_SOC_RTCIO_PIN_COUNT=0 +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y CONFIG_SOC_SDM_GROUPS=1 -CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 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_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 -CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y 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_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=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_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 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_SAMPLE_CFG_NUM=1 +CONFIG_SOC_MWDT_SUPPORT_XTAL=y CONFIG_SOC_TWAI_CONTROLLER_NUM=1 -CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 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_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=512 +CONFIG_SOC_UART_NUM=2 +CONFIG_SOC_UART_HP_NUM=2 CONFIG_SOC_UART_FIFO_LEN=128 CONFIG_SOC_UART_BITRATE_MAX=5000000 -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=y -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=y -CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_COEX_HW_PTI=y 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_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_WIFI_PD=y +CONFIG_SOC_PM_SUPPORT_BT_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_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=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_SDMMC_USE_IOMUX=y -CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y 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_WIFI_PHY_NEEDS_USB_WORKAROUND=y CONFIG_SOC_BLE_SUPPORTED=y CONFIG_SOC_BLE_MESH_SUPPORTED=y -CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y CONFIG_SOC_BLUFI_SUPPORTED=y -CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=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.4.1" -CONFIG_IDF_TARGET_ESP32=y -CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c3" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32C3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0005 # # Build type @@ -261,8 +312,6 @@ CONFIG_APP_BUILD_BOOTLOADER=y CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y # CONFIG_APP_REPRODUCIBLE_BUILD is not set # 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 # @@ -276,7 +325,18 @@ CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y CONFIG_BOOTLOADER_PROJECT_VER=1 # end of Bootloader manager -CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 +# +# 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=0x0 CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set @@ -285,6 +345,8 @@ CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # # Log # +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 # CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set # CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set # CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set @@ -299,6 +361,13 @@ CONFIG_BOOTLOADER_LOG_LEVEL=3 # CONFIG_BOOTLOADER_LOG_COLORS is not set CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y # end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings # end of Log # @@ -308,15 +377,12 @@ CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y 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_APP_ROLLBACK_ENABLE is not set # 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 @@ -327,10 +393,12 @@ CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # # Security features # -CONFIG_SECURE_BOOT_V1_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=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 +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y # end of Security features # @@ -347,16 +415,37 @@ 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_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=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_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=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_HAS_VERSION=y CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y -CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CONSOLE_OUTPUT_SECONDARY=y +CONFIG_ESP_ROM_HAS_SUBOPTIMAL_NEWLIB_ON_MISALIGNED_MEMORY=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior # # Serial flasher config @@ -368,11 +457,11 @@ 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_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set # CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set # CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -CONFIG_ESPTOOLPY_FLASHFREQ="40m" +CONFIG_ESPTOOLPY_FLASHFREQ="80m" # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y # CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set @@ -395,13 +484,13 @@ CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 # # Partition Table # -# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +CONFIG_PARTITION_TABLE_SINGLE_APP=y # 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 is not set CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table @@ -429,6 +518,7 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # 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_SAVE_RESTORE_LIBCALLS 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 @@ -436,8 +526,8 @@ CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y # 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 is not set -CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y +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 @@ -451,7 +541,7 @@ CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y # 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_USB_CDC is not set CONFIG_APPTRACE_DEST_UART_NONE=y CONFIG_APPTRACE_UART_TASK_PRIO=1 CONFIG_APPTRACE_LOCK_ENABLE=y @@ -461,7 +551,13 @@ CONFIG_APPTRACE_LOCK_ENABLE=y # Bluetooth # # CONFIG_BT_ENABLED is not set -CONFIG_BT_ALARM_MAX_NUM=50 + +# +# Common Options +# +# 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 # @@ -475,47 +571,25 @@ CONFIG_BT_ALARM_MAX_NUM=50 # # -# TWAI Configuration +# Legacy TWAI Driver Configurations # -# CONFIG_TWAI_ISR_IN_IRAM 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_SKIP_LEGACY_CONFLICT_CHECK is not set CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y -# end of TWAI Configuration +# 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 # @@ -538,11 +612,10 @@ CONFIG_ADC_CAL_LUT_ENABLE=y # end of Legacy I2S Driver Configurations # -# Legacy PCNT Driver Configurations +# Legacy I2C 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 +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations # # Legacy SDM Driver Configurations @@ -550,6 +623,13 @@ CONFIG_ADC_CAL_LUT_ENABLE=y # CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set # CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set # end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations # end of Driver Configurations # @@ -557,10 +637,7 @@ CONFIG_ADC_CAL_LUT_ENABLE=y # # 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 +CONFIG_EFUSE_MAX_BLK_LEN=256 # end of eFuse Bit Manager # @@ -568,12 +645,14 @@ CONFIG_EFUSE_MAX_BLK_LEN=192 # CONFIG_ESP_TLS_USING_MBEDTLS=y # CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y # 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 # @@ -581,16 +660,8 @@ CONFIG_ESP_TLS_USING_MBEDTLS=y # # 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_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ONESHOT_FORCE_USE_ADC2_ON_C3 is not set # CONFIG_ADC_ENABLE_DEBUG_LOG is not set # end of ADC and ADC Calibration @@ -598,6 +669,7 @@ CONFIG_ADC_DISABLE_DAC_OUTPUT=y # Wireless Coexistence # CONFIG_ESP_COEX_ENABLED=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set # CONFIG_ESP_COEX_GPIO_DEBUG is not set # end of Wireless Coexistence @@ -607,19 +679,9 @@ CONFIG_ESP_COEX_ENABLED=y 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 @@ -628,7 +690,8 @@ CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y # CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y # CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GPTIMER_ISR_IRAM_SAFE 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 @@ -638,6 +701,7 @@ CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y # 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 # @@ -653,28 +717,18 @@ CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y # CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set # end of ESP-Driver:LEDC Configurations -# -# ESP-Driver:MCPWM Configurations -# -# CONFIG_MCPWM_ISR_IRAM_SAFE is not set -# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set -# 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_ISR_IRAM_SAFE is not set +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 # @@ -694,12 +748,18 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # end of ESP-Driver:SPI Configurations # -# ESP-Driver:Touch Sensor Configurations +# ESP-Driver:Temperature 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 -# end of ESP-Driver:Touch Sensor Configurations +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_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 @@ -707,19 +767,24 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # 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 + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + # # 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 @@ -765,7 +830,7 @@ CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 # # HTTP Server # -CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +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 @@ -788,6 +853,7 @@ CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 # # 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 # @@ -797,26 +863,25 @@ CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 # # 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 +# CONFIG_ESP32C3_REV_MIN_0 is not set +# CONFIG_ESP32C3_REV_MIN_1 is not set +# CONFIG_ESP32C3_REV_MIN_2 is not set +CONFIG_ESP32C3_REV_MIN_3=y +# CONFIG_ESP32C3_REV_MIN_4 is not set +# CONFIG_ESP32C3_REV_MIN_101 is not set +CONFIG_ESP32C3_REV_MIN_FULL=3 +CONFIG_ESP_REV_MIN_FULL=3 # -# Maximum Supported ESP32 Revision (Rev v3.99) +# Maximum Supported ESP32-C3 Revision (Rev v1.99) # -CONFIG_ESP32_REV_MAX_FULL=399 -CONFIG_ESP_REV_MAX_FULL=399 +CONFIG_ESP32C3_REV_MAX_FULL=199 +CONFIG_ESP_REV_MAX_FULL=199 CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 -CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=199 # -# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) +# Maximum Supported ESP32-C3 eFuse Block Revision (eFuse Block Rev v1.99) # # end of Chip revision @@ -829,10 +894,9 @@ 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_ESP32C3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C3_UNIVERSAL_MAC_ADDRESSES=4 # CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set # end of MAC Config @@ -842,9 +906,8 @@ CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 # 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_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 # CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set # CONFIG_ESP_SLEEP_DEBUG is not set CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y @@ -863,20 +926,48 @@ CONFIG_RTC_CLK_CAL_CYCLES=1024 # # Peripheral Control # -CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y # end of Peripheral Control +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + # # 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_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +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 # @@ -919,27 +1010,31 @@ CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y 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_USB=y # 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 is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y # end of Power Management # # ESP PSRAM # -# CONFIG_SPIRAM is not set -# end of ESP PSRAM # # ESP Ringbuf @@ -947,6 +1042,12 @@ CONFIG_ESP_PHY_CALIBRATION_MODE=0 # 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 # @@ -957,99 +1058,70 @@ CONFIG_ESP_PHY_CALIBRATION_MODE=0 # # 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 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +CONFIG_ESP_SYSTEM_NO_BACKTRACE=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set +# CONFIG_ESP_SYSTEM_USE_FRAME_POINTER is not set # # Memory protection # +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y # 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_USB_SERIAL_JTAG is not set # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set # CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y 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 is not set CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y - -# -# 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 -# end of Brownout Detector - -# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set -CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +CONFIG_ESP_SYSTEM_HW_PC_RECORD=y # end of ESP System Settings # # IPC (Inter-Processor Call) # 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 @@ -1060,7 +1132,7 @@ 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 +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y # end of ESP Timer (High Resolution Timer) # @@ -1083,8 +1155,6 @@ 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 @@ -1092,21 +1162,25 @@ CONFIG_ESP_WIFI_IRAM_OPT=y 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_FTM_ENABLE is not set CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set 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_SUITE_B_192 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 @@ -1177,6 +1251,14 @@ 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 # @@ -1187,8 +1269,9 @@ CONFIG_FATFS_LINK_LOCK=y # Kernel # # CONFIG_FREERTOS_SMP is not set -# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_UNICORE=y CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y @@ -1201,7 +1284,6 @@ CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 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 @@ -1226,11 +1308,10 @@ CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y CONFIG_FREERTOS_ISR_STACKSIZE=1536 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_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set # end of Port @@ -1246,7 +1327,8 @@ 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_NUMBER_OF_CORES=1 +CONFIG_FREERTOS_IN_IRAM=y # end of FreeRTOS # @@ -1257,8 +1339,6 @@ CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y # CONFIG_HAL_ASSERTION_SILENT is not set # CONFIG_HAL_ASSERTION_ENABLE is not set CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 -CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y -CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y # end of Hardware Abstraction Layer (HAL) and Low Level (LL) # @@ -1279,6 +1359,9 @@ CONFIG_HEAP_TRACING_OFF=y # # Log # +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 # # Log Level @@ -1312,10 +1395,19 @@ CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 # # Format # -CONFIG_LOG_COLORS=y -# CONFIG_LOG_TIMESTAMP_SOURCE_RTOS is not set -CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM=y +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set # end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y # end of Log # @@ -1323,7 +1415,6 @@ CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM=y # CONFIG_LWIP_ENABLE=y CONFIG_LWIP_LOCAL_HOSTNAME="espressif" -# CONFIG_LWIP_NETIF_API is not set CONFIG_LWIP_TCPIP_TASK_PRIO=18 # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set # CONFIG_LWIP_CHECK_THREAD_SAFETY is not set @@ -1360,7 +1451,7 @@ CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y # 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=68 +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 @@ -1428,7 +1519,6 @@ CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y 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 @@ -1469,6 +1559,7 @@ 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 @@ -1489,13 +1580,16 @@ CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y 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=y -# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT 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 @@ -1522,6 +1616,7 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 # 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 @@ -1540,9 +1635,13 @@ CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y CONFIG_MBEDTLS_HARDWARE_MPI=y -# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 CONFIG_MBEDTLS_HARDWARE_SHA=y CONFIG_MBEDTLS_ROM_MD5=y # CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set @@ -1551,6 +1650,7 @@ 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 @@ -1625,13 +1725,14 @@ 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=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 # @@ -1651,24 +1752,29 @@ CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y # end of ESP-MQTT Configurations # -# Newlib +# LibC # -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_NEWLIB_TIME_SYSCALL_USE_RTC is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set -# end of Newlib +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 +# CONFIG_LIBC_OPTIMIZED_MISALIGNED_ACCESS is not set +# end of LibC # # NVS # +# CONFIG_NVS_ENCRYPTION is not set # CONFIG_NVS_ASSERT_ERROR_CHECK is not set # CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set # end of NVS @@ -1700,9 +1806,6 @@ CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y 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 @@ -1733,8 +1836,11 @@ CONFIG_SPI_FLASH_BROWNOUT_RESET=y # # Features here require specific hardware (READ DOCS FIRST!) # +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set 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 @@ -1744,10 +1850,10 @@ CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 # 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_ROM_IMPL is not set 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 @@ -1760,17 +1866,19 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # # Auto-detect flash chips # -CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y +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_VENDOR_BOYA_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_TH_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 +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y # end of Auto-detect flash chips CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y @@ -1825,17 +1933,6 @@ CONFIG_WS_BUFFER_SIZE=1024 # 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 # @@ -1846,6 +1943,7 @@ CONFIG_UNITY_ENABLE_DOUBLE=y 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 # @@ -1891,9 +1989,7 @@ CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y # 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 @@ -1901,7 +1997,6 @@ 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_APP_ROLLBACK_ENABLE is not set # CONFIG_FLASH_ENCRYPTION_ENABLED is not set # CONFIG_FLASHMODE_QIO is not set # CONFIG_FLASHMODE_QOUT is not set @@ -1926,50 +2021,52 @@ CONFIG_STACK_CHECK_NONE=y # 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_MCPWM_ISR_IN_IRAM is not set +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_GPTIMER_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_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_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP32C3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32C3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32C3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32C3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32C3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32C3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32C3_BROWNOUT_DET_LVL=7 +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_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +# CONFIG_ESP32C3_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32C3_DEFAULT_CPU_FREQ_160=y +CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_ESP32C3_MEMPROT_FEATURE=y +CONFIG_ESP32C3_MEMPROT_FEATURE_LOCK=y CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 CONFIG_MAIN_TASK_STACK_SIZE=3584 @@ -1982,36 +2079,13 @@ 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_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_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_ESP32C3_DEBUG_OCDAWARE=y CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=3584 CONFIG_ESP32_WIFI_ENABLED=y @@ -2027,8 +2101,6 @@ 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 @@ -2038,6 +2110,7 @@ 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_SUITE_B_192 is not set # CONFIG_WPA_11KV_SUPPORT is not set # CONFIG_WPA_MBO_SUPPORT is not set # CONFIG_WPA_DPP_SUPPORT is not set @@ -2073,27 +2146,31 @@ 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_ESP32_TIME_SYSCALL_USE_RTC_HRT=y -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y -# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_NONE 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_ESP32C3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32C3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32C3_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 -- 2.50.1