Three follow-ups after the reading game landed.
- WiFi: a "Réglages" home tile (gear) opens LISAEL_MODE_WIFI which forces
the SoftAP + captive portal up on demand (lisael_ui_goto starts them;
the screen's "Fermer" button tears them down), so the provisioning
portal can be tested/used without waiting for the station to fail.
- Lire: the content generator now also takes words that have no emoji
(optional img in the regex) -> 366 words instead of 286 (the extra
~80 are abstract words: text + spoken audio, no picture).
- Cleanup: removed 21 baked word icons that became dead weight once the
reading game started loading its pictures from the SD (~315 KB flash),
plus their declarations and gen_icons.py specs.
Context: the box needs a learn-to-read game for Lisael (6). Baking
hundreds of word pictures into the firmware does not fit in flash, so
content must live on the SD card and grow without reflashing.
Approach: words, Twemoji .bin icons and pre-generated French TTS audio
all live on the SD under /sdcard/lire/; the box loads them at runtime
(LVGL stdio FS for icons, MP3 player for audio). A small LAN file
server lets a computer push that content over Wi-Fi (no USB-MSC).
Changes:
- modes/lire.c: 3 round types (listen->word, image->word, word->image),
reads /sdcard/lire/words.json into a PSRAM array, loads per-word
icons from SD, plays the spoken word; score + tap-to-replay.
- net/file_server.c/.h: POST /put?name=... on :8080 writes the body to
/sdcard/<name>; started by net_task once the station connects.
- home tile "Lire" + LISAEL_MODE_LIRE routing; 20 extra Twemoji icons.
- tools/gen_lire_content.py + push_to_box.sh: content pipeline
(lecture.data.js -> icons + TTS + words.json -> Wi-Fi push).
Impact: 286 words (vs 12), expandable over Wi-Fi; reusable file-drop
for future content (podcasts, more words) without the MSC dance.