- EcdsaVerifier (mbedTLS, embedded public key) and EspOtaSink (writes the inactive app slot, esp_ota_end validates the image, then sets the boot partition) - UpdateService: listens on TCP 3232 (and mDNS roro9stack-<id>) while Wi-Fi is Connected; streams into UpdateParser; replies OK/ERR to the sender; remembers the pending version so a Rollback is reported after the reboot - Probation (host-tested): confirm after the first frame + 30 s + Wi-Fi (if configured); roll back if configured Wi-Fi never connects in 3 min - Main loop: full-screen progress while receiving; restart once installed, waiting up to 60 s for Text Entry to end - Settings > Firmware: version, Probation status, push address and name, and the .ota files in /updates on the SD card to install - StorageService.runJob() runs work on the storage task (SD installs) - wifi status prints IP and running version; RORO_TEST_CRASH test hook Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
roro9stack
A multi-app firmware for the M5Stack Cardputer ADV with the Cap LoRa-1262. It's a Meshtastic-compatible mesh messenger, plus Wi-Fi tools, IRC, GNSS and more. Licensed GPL-3.0.
- Domain language: CONTEXT.md
- Decisions: docs/adr/
- Milestones: docs/milestones/
Requirements
Only Docker is needed. PlatformIO and the ESP32 toolchain run inside a container, and are cached in the roro9stack-pio Docker volume. The first build downloads about 1 GB and takes a few minutes.
Build and test (local CI)
scripts/ci.sh
This runs the host-side unit tests (test/, native environment), then builds the firmware. The output is .pio/build/cardputer-adv/firmware.factory.bin.
Flash
-
Connect the Cardputer by USB-C.
-
Run:
scripts/flash.sh # auto-detects the port; or: scripts/flash.sh /dev/ttyACM1This uploads the firmware, then opens the serial monitor. Quit the monitor with
Ctrl+C.
If the upload can't connect, put the device in download mode: hold G0 (the button next to the screen) while plugging in USB, or while pressing reset. Then retry.
If you get "permission denied" on the port, your user needs access to the serial device. Run this once, then log out and back in:
sudo usermod -aG dialout "$USER"
Development aids
scripts/serial_log.sh [seconds] [command…] records the serial output, and can send commands to the firmware first. For example, scripts/serial_log.sh 30 short sleep:12 burst sets short screen timeouts, waits 12 s, then sends a burst of Toasts.
| Command | Effect |
|---|---|
burst |
Publishes 5 Notifications at once |
key up|down|left|right|select|back|home, or key <char> |
Injects a key press |
sound on / sound off |
Toggles the Sound setting (beep + LED) |
short / normal |
Screen timeouts 5 s / 10 s, or 30 s / 60 s |
wifi add <ssid><TAB><password> |
Adds a Saved Network (so credentials stay out of the repo) |
log <text> |
Appends a line to a test IRC Log (/irc/dev/#test/<date>.log) |
sd list |
Lists the files of each Storage Clean-up category |
cat <path> |
Prints the first ~1.2 KB of a file on the SD card |
irc start |
Starts the IRC Service (normally done by opening the IRC App) |
irc say <buffer> <text> |
Types into a Buffer, commands included (irc say 0 /join #test) |
irc dump |
Prints IRC status, memory, and the last lines of each Buffer |
wifi status |
Prints Wi-Fi state, network, signal, clock and free heap |
scripts/flash.sh stops a running serial log first, since it would hold the port.