e7a974e1be
PLIP was out of scope by design (Wi-Fi/HTTP-only); brought back in by
request. New src/scenario_now.{h,cpp}: owns the single esp_now recv
callback (no MSG_* demux needed — PLIP has no legacy ESP-NOW traffic),
reassembles scenario_mesh frames ({seq:u16 LE, total:u16 LE} + <=236 B
payload, <=64 KiB, 5 s sender-silence timeout) in a worker task, then
persists to LittleFS /scenario.json (temp-then-rename). Optional
consumer hook for a future Runtime 3 engine; stored-and-logged without
one. network_task calls scenario_now_init() once the station is up
(idempotent, repeated on reconnect).
Build green: pio run (devkit_es8388), RAM 14.8%, Flash 63.1%.
1.4 KiB
1.4 KiB
PLIP Firmware
ESP32 firmware for the retro telephone annex. Bringup target: ESP32-A1S Audio Kit (ES8388 codec). End target: custom PCB with Si3210 SLIC.
See README.md for architecture, REST contract, pin map, and the
submodule conversion procedure when a remote URL is ready.
Build
cd PLIP_FIRMWARE
pio run # compile
pio run -t upload # flash via USB
pio device monitor # serial @ 115200
Source layout
| File | Role |
|---|---|
src/main.cpp |
setup() boots the three FreeRTOS tasks |
src/phone_task.cpp |
Off-hook GPIO interrupt + ring control |
src/audio_task.cpp |
ES8388 / Si3210 audio routing, drains a command queue |
src/network_task.cpp |
WiFi station + REST server (/ring, /play, /stop, /status) |
src/scenario_now.cpp |
ESP-NOW scenario hot-load receiver → LittleFS /scenario.json |
Anti-patterns
- Hardcoding pin numbers in source — they live in
platformio.inibuild_flagsso the dev kit ↔ PCB swap stays mechanical. - Adding I2S/SPI calls outside
audio_taskorphone_task— codec access must stay single-threaded per peripheral. - Skipping NVS for WiFi credentials in committed code. Compile-time defaults are OK for local bringup but never merge them.
- Implementing OTA before the bringup loop (REST
/ringround-trip) is rock solid — chasing OTA bugs on top of audio bugs is misery.