# Changelog Firmware Tous les changements notables du firmware sont documentés ici. Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/), et ce projet adhère au [Semantic Versioning](https://semver.org/lang/fr/). ## [Unreleased] ### En cours (branche `hardware/firmware`) #### Added - Documentation complète architecture UML (diagrammes classes/séquence) - Documentation état des lieux firmware (métriques, tests, structure) - Documentation recommandations sprint (roadmap actions) - Index navigation documentation (docs/INDEX.md) - Skill local embarqué: `docs/skills/EMBEDDED_CPP_OO_ESP32S3_PIO_ARDUINO.md` - Observabilité Freenove: boot report + runtime metrics (`audio_underrun`, `sd_errors`, `ui_fps_approx`, reset reason) - Nouveau socle display: `DisplayHal` + `SpiBusManager` + hooks backend LGFX/TFT_eSPI - Interfaces phase-2 préparatoires: `audio_pipeline`, `storage_prefetch`, `camera_pipeline`, `task_topology`, `ui/fx/fx_engine` #### Changed - Structure nettoyée : suppression symlink `esp32 → esp32_audio` - Structure nettoyée : suppression duplication `hardware/firmware/hardware/` - Paths corrigés dans AGENTS.md, READMEs, tools/qa docs - Port mapping ESP8266 OLED : marker ready timeout étendu - Port mapping ESP32/ESP8266 : swap 20-6.4.1/20-6.4.2 - Migration modulaire Freenove: `src/{app,ui,audio,storage,camera,drivers,system}` avec headers façade legacy - UI stack: draw buffers PSRAM unifiés via `UI_DRAW_BUF_IN_PSRAM` + mapping legacy `FREENOVE_PSRAM_UI_DRAW_BUFFER` - SCENE_WIN_ETAPE: logs périodiques enrichis (`fx_fps`, heap internal/psram, largest dma) #### Fixed - Documentation cohérente (esp32/ vs esp32_audio/ résolu) --- ## [0.9.0-beta] - 2026-02-15 (à venir après merge PR #86) ### Summary **Refonte complète architecture firmware** avec introduction multi-MCU (ESP32 + ESP8266 OLED + RP2040 TFT), Story Engine V2, protocole UI Link v2, dual-channel audio. ### Added #### Architecture multi-MCU - ESP32 Audio Kit : Firmware principal C++ (18.6K lignes) - ESP8266 NodeMCU : UI OLED SSD1306 (1.2K lignes) - RP2040 Pico : UI TFT tactile LVGL (285 lignes) - Protocol UI Link v2 : UART 19200 baud, frame-based ASCII #### Story Engine V2 - Machine à états déclarative (ScenarioDef YAML) - Event queue asynchrone (BTN, TOUCH, timers, conditions) - Transitions implicites (timeout, LA detection, MP3 gate) - Actions modulaires via ActionRegistry - Story Apps pluggables : LaDetectorApp, Mp3GateApp, ScreenSceneApp, AudioPackApp - StoryAppHost : Lifecycle apps (activate/deactivate par step) #### Audio subsystem - Dual-channel audio : Base (main) + Overlay (effects) - AsyncAudioService : MP3 decoder ESP8266Audio - FmRadioScanFx : Effets I2S (sweep, noise, beep) via arduino-audio-tools - Mp3Player : Lecteur SD synchrone, TrackCatalog - I2sJinglePlayer : RTTTL ringtones - CodecES8388Driver : I2C/I2S hardware config - Timeouts explicites : Base 30s, Overlay 5s - Fallback FX si MP3 manquant/corrupt #### Services layer - AudioService : Dual-channel orchestration - RadioService : Web streaming, station presets - WifiService : AP mode, network management - WebUiService : AsyncWebServer REST API - InputService : Analog keypad, debounce, long-press - ScreenSyncService : UI Link coordination, ScreenFrame serialization - SerialRouter : USB terminal, debug commands - CatalogScanService : SD track indexing - LaDetectorRuntimeService : 440Hz detection #### Controllers layer - StoryControllerV2 : Story mode orchestration (142 lignes) - Mp3Controller : SD player mode - InputController : Keyboard/touch routing - BootProtocolRuntime : Boot sequence (Serial, WiFi, Codec, I2C, SD) #### UI Link Protocol v2 - Frame types : HELLO, ACK, KEYFRAME, STAT, BTN, TOUCH, PING, PONG - Fields : mode, track, track_tot, vol, tune_ofs, tune_conf, uptime_ms, seq, scene - CRC8 validation, 320 byte max line, 40 fields max - Timeouts : HEARTBEAT_MS=1000, TIMEOUT_MS=1500 - Reconnection automatique : session counter, KEYFRAME resync #### PlatformIO workspace - 5 environments : esp32dev, esp32_release, esp8266_oled, ui_rp2040_ili9488, ui_rp2040_ili9486 - Shared protocol/ directory (ui_link_v2.h/md) - Fast build Makefile targets : `make fast-esp32`, `make fast-ui-oled`, `make fast-ui-tft` - `build_all.sh` : Build 5/5 environments #### Testing & Automation - `tools/dev/run_matrix_and_smoke.sh` : Build matrix + smoke tests hardware - Port mapping by LOCATION (macOS CP2102 stable) - Smoke gates stricts : panic/reboot markers → FAIL - UI Link status gate : `connected==1` requis - RC Live sessions : `./tools/dev/zacus.sh rc` - Artifacts : `artifacts/rc_live/{timestamp}/` (logs + rapport _rc.md) #### Documentation - docs/QUICKSTART.md : Getting started dev - docs/HW_NOW.md : Hardware status rapide - docs/RC_FINAL_BOARD.md : Tests RC dashboard - docs/protocols/PROTOCOL.md : Story Engine V2 format YAML - protocol/ui_link_v2.md : Spéc protocole UART - esp32_audio/WIRING.md : Câblage ESP32/UI - ui/rp2040_tft/WIRING.md : Câblage TFT ### Changed #### Runtime modes flexibles - Mode STORY_V2 (défaut) : Quête ETAPE1 → unlock → ETAPE2 → MP3 libre - Mode MP3_PLAYER : Lecteur SD pur (skip story) - Mode RADIO : Streaming web (skip story + MP3) - Sélection boot via config.h flags #### Architecture refactor - Séparation claire Controllers / Services / Drivers - Event-driven architecture (non-blocking) - Dependency injection via constructeurs - Error handling via Result enum (Success/Timeout/Failed) - Timeouts explicites partout (audio, UI link, network) #### Build improvements - PlatformIO cache : `$HOME/.platformio` (pas dans repo) - Artifacts deterministes : `artifacts/rc_live//` - Environment overrides : ZACUS_REQUIRE_HW, ZACUS_WAIT_PORT, ZACUS_NO_COUNTDOWN, ZACUS_SKIP_SMOKE, ZACUS_ENV, ZACUS_FORCE_BUILD ### Deprecated - Ancien Story Engine V1 (remplacé par V2) - Protocole UI Link v1 (remplacé par v2 frames) - Single-channel audio (remplacé par dual-channel) - Hardcoded scénarios (remplacé par YAML loader) ### Removed - Code legacy Story V1 (src/story_old/) - Anciens tests manuels (remplacés par automation) - Symlink `esp32 → esp32_audio` (confusion docs) - Duplicate `hardware/firmware/hardware/` (artifacts) ### Fixed - UI Link reconnection robuste (session counter, timeout recovery) - Audio timeout fallback (MP3 bloqué → FX I2S) - ESP8266 OLED heap stability (pooled buffers) - Port mapping macOS CP2102 (by LOCATION stable) - Panic detection smoke tests (strict gates) ### Security - Aucun secret committé (tokens exclus .gitignore) - WiFi credentials via config.h (local only, .gitignore) - Web UI authentication stub (TODO prod) --- ## [0.1.0] - 2024-XX-XX ### Initial Release - Proof-of-concept ESP32 Audio Kit - Simple MP3 player SD - Basic web UI control - Single MCU architecture --- ## Conventions de versioning - **MAJOR** : Breaking changes architecture/API - **MINOR** : Ajout features backward compatible - **PATCH** : Bug fixes backward compatible - **Suffix** : - `-alpha` : Fonctionnalités incomplètes, instable - `-beta` : Fonctionnalités complètes, tests en cours - `-rc.N` : Release candidate (pre-production) - Rien : Release stable production **Exemples :** - `0.9.0-beta` : Refonte v2 beta (pre-production) - `1.0.0-rc.1` : Release candidate 1 (pre-prod final) - `1.0.0` : First stable production release - `1.1.0` : Ajout feature (ex: nouveau runtime mode) - `1.1.1` : Bug fix - `2.0.0` : Breaking change (ex: nouveau protocole incompatible) --- **Dernière mise à jour :** 15 février 2026 **Maintenu par :** Firmware team (@electron-rare)