diff --git a/docs/adding-a-feature.md b/docs/adding-a-feature.md index 350c7b7..5fc2609 100644 --- a/docs/adding-a-feature.md +++ b/docs/adding-a-feature.md @@ -26,8 +26,8 @@ sequenceDiagram | Schema UART | `main/proto/uart_messages.proto` | `MessageType`, Request/Response für Host ↔ Master | | Schema ESP-NOW | `main/proto/esp_now_messages.proto` | Master ↔ Slave (ohne UART) | | Transport UART | `main/uart.c`, `goTool/uart/` | Rahmen `0xAA … 0xCC`, Byte 0 = Command-ID | -| Dispatch | `main/cmd_handler.c`, `main/uart_cmd.c` | Queue + `uart_cmd_register()` | -| Master-Logik | `main/cmd_*.c` | Decode, Registry, ESP-NOW senden | +| Dispatch | `main/cmd/cmd_handler.c`, `main/uart_cmd.c` | Queue + `uart_cmd_register()` | +| Master-Logik | `main/cmd/cmd_*.c` | Decode, Registry, ESP-NOW senden | | ESP-NOW | `main/esp_now_comm.c` | Encode/Decode, Send, Slave-`recv_cb` | | Geräte-Funktion | z.B. `main/led_ring.c` | Wiederverwendbare Aktion (Master + Slave) | | Host | `goTool/cmd_*.go`, `api_serve.go`, `webui/` | CLI, HTTP, UI | @@ -46,8 +46,8 @@ sequenceDiagram **Find me:** UART `FIND_ME` mit `client_id`; `0` = Master-Ring, `>0` = Unicast `ESPNOW_FIND_ME` an die Slave-MAC aus der Registry. -Referenz für **nur ESP-NOW-Weiterleitung ohne lokale Wirkung:** `cmd_espnow_unicast_test.c` -Referenz für **Master lokal + Slave + `client_id`:** `cmd_espnow_find_me.c`, `cmd_accel_deadzone.c` +Referenz für **nur ESP-NOW-Weiterleitung ohne lokale Wirkung:** `main/cmd/cmd_espnow_unicast_test.c` +Referenz für **Master lokal + Slave + `client_id`:** `main/cmd/cmd_espnow_find_me.c`, `main/cmd/cmd_accel_deadzone.c` --- @@ -129,13 +129,13 @@ Funktion, die auf **Master und Slave** gleich wirken soll, gehört **nicht** in Find me: - `led_ring_find_me()` in `led_ring.c` — sequenz `LED_CMD_FIND_ME` (3× rot/grün/blau, volle Helligkeit) -- Optional separater UART-Pfad nur für Ring-Steuerung: `LED_RING` mode `4` in `cmd_led_ring.c` (ohne ESP-NOW) +- Optional separater UART-Pfad nur für Ring-Steuerung: `LED_RING` mode `4` in `main/cmd/cmd_led_ring.c` (ohne ESP-NOW) --- ## Schritt 4 — UART-Command-Handler (nur Master) -Neue Dateien: `main/cmd_espnow_find_me.c`, `main/cmd_espnow_find_me.h` +Neue Dateien: `main/cmd/cmd_espnow_find_me.c`, `main/cmd/cmd_espnow_find_me.h` Muster (gekürzt): @@ -191,8 +191,8 @@ Hilfs-APIs (`uart_cmd.h`): cmd_espnow_find_me_register(); ``` -**Build:** `main/CMakeLists.txt` → `"cmd_espnow_find_me.c"` -**Logging-Namen:** `main/cmd_handler.c` → `case alox_MessageType_FIND_ME: return "FIND_ME";` +**Build:** `main/CMakeLists.txt` → `"cmd/cmd_espnow_find_me.c"` +**Logging-Namen:** `main/cmd/cmd_handler.c` → `case alox_MessageType_FIND_ME: return "FIND_ME";` ### Ablauf UART intern @@ -324,7 +324,7 @@ idf.py build - [ ] Geräte-Modul (z.B. `led_ring_*`) - [ ] `cmd_*.c` + `uart_cmd_register` - [ ] `esp_now_comm`: `send_*` + Slave-`recv` case -- [ ] `CMakeLists.txt`, `powerpod.c`, `cmd_handler.c` Name +- [ ] `CMakeLists.txt`, `powerpod.c`, `cmd/cmd_handler.c` Name - [ ] goTool: CLI, `client_api`, optional `api_serve` + WebUI - [ ] README aktualisieren - [ ] Master + Slave flashen bei ESP-NOW-Proto-Änderung @@ -337,7 +337,7 @@ idf.py build |---------|--------| | UART Proto | `main/proto/uart_messages.proto` | | ESP-NOW Proto | `main/proto/esp_now_messages.proto` | -| UART Handler | `main/cmd_espnow_find_me.c` | +| UART Handler | `main/cmd/cmd_espnow_find_me.c` | | ESP-NOW | `main/esp_now_comm.c`, `main/esp_now_comm.h` | | LED | `main/led_ring.c`, `main/led_ring.h` | | Host CLI | `goTool/cmd_find_me.go` | @@ -345,7 +345,7 @@ idf.py build Ähnliche Features zum Abgucken: -- **Nur Master, kein ESP-NOW:** `cmd_version.c`, `cmd_led_ring.c` -- **Nur Slave per ESP-NOW (Master leitet nur durch):** `cmd_espnow_unicast_test.c` -- **Master + alle Slaves / Filter:** `cmd_accel_deadzone.c` -- **Großer ESP-NOW-Fluss mit Status:** `ota_espnow.c`, `cmd_ota.c` +- **Nur Master, kein ESP-NOW:** `main/cmd/cmd_version.c`, `main/cmd/cmd_led_ring.c` +- **Nur Slave per ESP-NOW (Master leitet nur durch):** `main/cmd/cmd_espnow_unicast_test.c` +- **Master + alle Slaves / Filter:** `main/cmd/cmd_accel_deadzone.c` +- **Großer ESP-NOW-Fluss mit Status:** `ota_espnow.c`, `main/cmd/cmd_ota.c` diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 8fa95a6..24c3a90 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -14,17 +14,17 @@ idf_component_register( "uart.c" "uart_proto.c" "uart_cmd.c" - "cmd_handler.c" - "cmd_version.c" - "cmd_client_info.c" - "cmd_accel_deadzone.c" - "cmd_espnow_unicast_test.c" - "cmd_espnow_find_me.c" - "cmd_restart.c" + "cmd/cmd_handler.c" + "cmd/cmd_version.c" + "cmd/cmd_client_info.c" + "cmd/cmd_accel_deadzone.c" + "cmd/cmd_espnow_unicast_test.c" + "cmd/cmd_espnow_find_me.c" + "cmd/cmd_restart.c" "pod_reboot.c" - "cmd_led_ring.c" - "cmd_ota.c" - "cmd_ota_slave_progress.c" + "cmd/cmd_led_ring.c" + "cmd/cmd_ota.c" + "cmd/cmd_ota_slave_progress.c" "ota_uart.c" "ota_espnow.c" "client_registry.c" @@ -40,6 +40,7 @@ idf_component_register( "proto/pb_common.c" INCLUDE_DIRS "." + "cmd" "proto" REQUIRES esp_wifi diff --git a/main/README.md b/main/README.md index 5e53178..5bb72c2 100644 --- a/main/README.md +++ b/main/README.md @@ -203,20 +203,20 @@ Host and master speak nanopb-encoded `UartMessage` inside UART frames (byte 0 = | ID | Name | Status | |----|------|--------| -| 3 | `VERSION` | Implemented (`cmd_version.c`) | -| 4 | `CLIENT_INFO` | Implemented (`cmd_client_info.c`) — slave list from registry | +| 3 | `VERSION` | Implemented (`cmd/cmd_version.c`) | +| 4 | `CLIENT_INFO` | Implemented (`cmd/cmd_client_info.c`) — slave list from registry | | 5 | `CLIENT_INPUT` | Planned | -| 6 | `ACCEL_DEADZONE` | Implemented (`cmd_accel_deadzone.c`) — get/set accel filter LSB | -| 7 | `ESPNOW_UNICAST_TEST` | Implemented (`cmd_espnow_unicast_test.c`) | -| 8 | `LED_RING` | Implemented (`cmd_led_ring.c`) — ring progress bar (0–100 %, RGB, intensity) | -| 16 | `OTA_START` | Implemented (`cmd_ota.c`) — begin UART OTA on inactive slot | +| 6 | `ACCEL_DEADZONE` | Implemented (`cmd/cmd_accel_deadzone.c`) — get/set accel filter LSB | +| 7 | `ESPNOW_UNICAST_TEST` | Implemented (`cmd/cmd_espnow_unicast_test.c`) | +| 8 | `LED_RING` | Implemented (`cmd/cmd_led_ring.c`) — ring progress bar (0–100 %, RGB, intensity) | +| 16 | `OTA_START` | Implemented (`cmd/cmd_ota.c`) — begin UART OTA on inactive slot | | 17 | `OTA_PAYLOAD` | Implemented — up to 200 B per frame; device buffers 4 KiB | | 18 | `OTA_END` | Implemented — flush, `esp_ota_end`, push image to slaves via ESP-NOW, set boot | | 19 | `OTA_STATUS` | Device → host (prepare/ready/block ACK/success/failed) | | 20 | `OTA_START_ESPNOW` | Implemented — re-distribute staged image to slaves only | -| 21 | `OTA_SLAVE_PROGRESS` | Implemented (`cmd_ota_slave_progress.c`) — query per-slave ESP-NOW OTA progress | -| 22 | `FIND_ME` | Implemented (`cmd_espnow_find_me.c`) — `client_id=0` local ring, `>0` ESP-NOW to slave | -| 23 | `RESTART` | Implemented (`cmd_restart.c`) — `client_id=0` reboot master, `>0` ESP-NOW reboot slave | +| 21 | `OTA_SLAVE_PROGRESS` | Implemented (`cmd/cmd_ota_slave_progress.c`) — query per-slave ESP-NOW OTA progress | +| 22 | `FIND_ME` | Implemented (`cmd/cmd_espnow_find_me.c`) — `client_id=0` local ring, `>0` ESP-NOW to slave | +| 23 | `RESTART` | Implemented (`cmd/cmd_restart.c`) — `client_id=0` reboot master, `>0` ESP-NOW reboot slave | Regenerate C code: @@ -264,7 +264,7 @@ During OTA the LED ring shows progress at ~5 % brightness: **blue** while the im `OTA_START_ESPNOW` (type `20`): re-run ESP-NOW distribution from the last staged image without a new UART upload (no-op if nothing staged). -Implementation: `ota_uart.c` (4 KiB buffer, `esp_ota_write`), `ota_espnow.c`, `cmd_ota.c`. +Implementation: `ota_uart.c` (4 KiB buffer, `esp_ota_write`), `ota_espnow.c`, `cmd/cmd_ota.c`. Host upload: @@ -446,19 +446,19 @@ Target: ESP32-S3. Close serial monitor on the UART adapter port before running ` | `esp_now_comm.c/h` | WiFi, ESP-NOW, discover / slave info / OTA send | | `ota_uart.c/h` | Shared 4 KiB OTA flash buffer (UART + ESP-NOW) | | `ota_espnow.c/h` | Master: distribute staged image to slaves | -| `cmd_ota.c/h` | UART OTA command handlers (master only) | +| `cmd/cmd_ota.c/h` | UART OTA command handlers (master only) | | `uart.c/h` | Framed UART RX/TX | | `uart_proto.c/h` | Encode/send `UartMessage` | -| `cmd_handler.c/h` | Command queue and dispatch | +| `cmd/cmd_handler.c/h` | Command queue and dispatch | | `uart_cmd.c/h` | Shared UART decode/send helpers for handlers | -| `cmd_version.c/h` | VERSION handler | -| `cmd_client_info.c/h` | CLIENT_INFO handler | +| `cmd/cmd_version.c/h` | VERSION handler | +| `cmd/cmd_client_info.c/h` | CLIENT_INFO handler | | `client_registry.c/h` | Registered slave table | | `bosch456.c/h` | BMA456H I2C driver, accel poll, tap INT, deadzone filter | | `board_input.c/h` | Taster GPIO12, LiPo ADC on GPIO1 / GPIO12 | | `pod_settings.c/h` | NVS persistence (accel deadzone, …) | | `led_ring.c/h` | LED ring (digit display, progress bar) | -| `cmd_led_ring.c` | UART `LED_RING` progress command | +| `cmd/cmd_led_ring.c` | UART `LED_RING` progress command | | `proto/uart_messages.proto` | UART protocol schema | | `proto/esp_now_messages.proto` | ESP-NOW protocol schema | | `esp_now_proto.c/h` | Encode/decode `EspNowMessage` | @@ -475,7 +475,7 @@ Short checklist: 1. Add or extend messages in `uart_messages.proto` (and `esp_now_messages.proto` if slaves are involved); run `make proto_generate` and `make gotool-proto`. 2. Implement device logic in a shared module (e.g. `led_ring.c`), not only in the UART handler. -3. Create `cmd_*.c`, register with `uart_cmd_register()`; decode with `uart_cmd_decode()` / `UART_CMD_REQ()`; reply with `uart_cmd_init_response()` + `uart_cmd_send()`. +3. Create `cmd/cmd_*.c`, register with `uart_cmd_register()`; decode with `uart_cmd_decode()` / `UART_CMD_REQ()`; reply with `uart_cmd_init_response()` + `uart_cmd_send()`. 4. Master → slave: `esp_now_comm_send_*()` + slave branch in `espnow_recv_cb`. 5. Extend `goTool` (CLI, optional `/api/…` and web UI). diff --git a/main/cmd_accel_deadzone.c b/main/cmd/cmd_accel_deadzone.c similarity index 100% rename from main/cmd_accel_deadzone.c rename to main/cmd/cmd_accel_deadzone.c diff --git a/main/cmd_accel_deadzone.h b/main/cmd/cmd_accel_deadzone.h similarity index 100% rename from main/cmd_accel_deadzone.h rename to main/cmd/cmd_accel_deadzone.h diff --git a/main/cmd_client_info.c b/main/cmd/cmd_client_info.c similarity index 100% rename from main/cmd_client_info.c rename to main/cmd/cmd_client_info.c diff --git a/main/cmd_client_info.h b/main/cmd/cmd_client_info.h similarity index 100% rename from main/cmd_client_info.h rename to main/cmd/cmd_client_info.h diff --git a/main/cmd_espnow_find_me.c b/main/cmd/cmd_espnow_find_me.c similarity index 100% rename from main/cmd_espnow_find_me.c rename to main/cmd/cmd_espnow_find_me.c diff --git a/main/cmd_espnow_find_me.h b/main/cmd/cmd_espnow_find_me.h similarity index 100% rename from main/cmd_espnow_find_me.h rename to main/cmd/cmd_espnow_find_me.h diff --git a/main/cmd_espnow_unicast_test.c b/main/cmd/cmd_espnow_unicast_test.c similarity index 100% rename from main/cmd_espnow_unicast_test.c rename to main/cmd/cmd_espnow_unicast_test.c diff --git a/main/cmd_espnow_unicast_test.h b/main/cmd/cmd_espnow_unicast_test.h similarity index 100% rename from main/cmd_espnow_unicast_test.h rename to main/cmd/cmd_espnow_unicast_test.h diff --git a/main/cmd_handler.c b/main/cmd/cmd_handler.c similarity index 100% rename from main/cmd_handler.c rename to main/cmd/cmd_handler.c diff --git a/main/cmd_handler.h b/main/cmd/cmd_handler.h similarity index 100% rename from main/cmd_handler.h rename to main/cmd/cmd_handler.h diff --git a/main/cmd_led_ring.c b/main/cmd/cmd_led_ring.c similarity index 100% rename from main/cmd_led_ring.c rename to main/cmd/cmd_led_ring.c diff --git a/main/cmd_led_ring.h b/main/cmd/cmd_led_ring.h similarity index 100% rename from main/cmd_led_ring.h rename to main/cmd/cmd_led_ring.h diff --git a/main/cmd_ota.c b/main/cmd/cmd_ota.c similarity index 100% rename from main/cmd_ota.c rename to main/cmd/cmd_ota.c diff --git a/main/cmd_ota.h b/main/cmd/cmd_ota.h similarity index 100% rename from main/cmd_ota.h rename to main/cmd/cmd_ota.h diff --git a/main/cmd_ota_slave_progress.c b/main/cmd/cmd_ota_slave_progress.c similarity index 100% rename from main/cmd_ota_slave_progress.c rename to main/cmd/cmd_ota_slave_progress.c diff --git a/main/cmd_ota_slave_progress.h b/main/cmd/cmd_ota_slave_progress.h similarity index 100% rename from main/cmd_ota_slave_progress.h rename to main/cmd/cmd_ota_slave_progress.h diff --git a/main/cmd_restart.c b/main/cmd/cmd_restart.c similarity index 100% rename from main/cmd_restart.c rename to main/cmd/cmd_restart.c diff --git a/main/cmd_restart.h b/main/cmd/cmd_restart.h similarity index 100% rename from main/cmd_restart.h rename to main/cmd/cmd_restart.h diff --git a/main/cmd_version.c b/main/cmd/cmd_version.c similarity index 100% rename from main/cmd_version.c rename to main/cmd/cmd_version.c diff --git a/main/cmd_version.h b/main/cmd/cmd_version.h similarity index 100% rename from main/cmd_version.h rename to main/cmd/cmd_version.h diff --git a/main/ota_uart.h b/main/ota_uart.h index 2cf6387..a086b34 100644 --- a/main/ota_uart.h +++ b/main/ota_uart.h @@ -17,7 +17,7 @@ typedef enum { OTA_UART_ST_BLOCK_ACK = 3, OTA_UART_ST_SUCCESS = 4, OTA_UART_ST_FAILED = 5, - /** ESP-NOW slave distribution in progress (see OTA_DIST_* in cmd_ota.c). */ + /** ESP-NOW slave distribution in progress (see OTA_DIST_* in cmd/cmd_ota.c). */ OTA_UART_ST_DISTRIBUTING = 6, } ota_uart_status_t;