Public Access
Debug Console: files, screenshots and Update from SD over Wi-Fi
New commands everywhere: ls, rm and install <path> (Update from SD without the Firmware page), all as Storage Service jobs. In Debug Builds the console task answers get and put (one storage job per transfer, file kept open, TCP flow control: about 300 KB/s, against 55 KB/s over serial) and screenshot (the RGB332 frame the UI composes into). rdbg.py turns those into files and PNGs. A failed put closes the connection: the rest of the file had been parsed as commands. Card writes are retried 3 times after closing, truncating to the last good byte and reopening, since FATFS keeps a file in error after one failed write (seen once at 1.3 MB on this card). onStorage() decides with one compare-and-swap whether the job or the timeout wins, so an abandoned job can't touch a returned stack frame. Verified on the device: screenshot; a get round trip byte-identical; 4 puts in a row; a tampered .ota refused by install; a good one put, installed from SD, confirmed on Probation. The retry path itself has not fired since it was added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
@@ -74,6 +74,8 @@ To install from the SD card instead, copy the `.ota` file from `.pio/build/cardp
|
||||
| `tasks` | FreeRTOS tasks: state, priority, lowest free stack, CPU share |
|
||||
| `reboot` / `boot other` | Restart, or restart into the other app slot (a manual Rollback) |
|
||||
| `log level <0-5>` | ESP-IDF log level |
|
||||
| `ls [folder]` / `rm <path>` | Lists a folder of the SD card, or deletes a file |
|
||||
| `install <path>` | Update from SD with that `.ota` file, as Settings → Firmware does |
|
||||
| `crash` | The last crash: which firmware, why, task, PC and backtrace (from the core dump in flash) |
|
||||
| `coredump erase` | Forgets the core dump |
|
||||
| `crash abort` / `crash wdt` | Debug Builds: crash on purpose, or hang the main loop until the watchdog fires |
|
||||
@@ -97,8 +99,13 @@ Every command above works there too, plus a few handled by the PC side or the co
|
||||
scripts/rdbg.py crash # the last crash, its backtrace decoded against that exact build's ELF
|
||||
scripts/rdbg.py coredump # fetch the core dump and decode it all (registers, every task) with esp-coredump
|
||||
scripts/rdbg.py reset # restart at once, even if the main loop is stuck
|
||||
scripts/rdbg.py screenshot # the screen as a PNG (2x)
|
||||
scripts/rdbg.py put <file> [card path] # to the SD card (default /updates/<name>), SHA-256 checked, ~300 KB/s
|
||||
scripts/rdbg.py get <card path> [file] # from the SD card
|
||||
```
|
||||
|
||||
So a Firmware Update can also go `rdbg.py put roro9stack-….ota` then `rdbg.py install /updates/roro9stack-….ota`: the Update from SD path, without touching the device.
|
||||
|
||||
Every build keeps its ELF in `.pio/elves/` (version and digest in the name) for that; `scripts/decode_backtrace.sh <version|digest> <addresses>` decodes any backtrace by hand.
|
||||
|
||||
After 3 crash restarts in a row the firmware starts in **Safe Mode** (ADR 0005): only Wi-Fi, Firmware Updates and the Debug Console, so a fix can be pushed as usual. `reboot` leaves it. The token is in `~/.config/roro9stack/debug-token`, made by the first build; keep developing on Debug Builds, so the firmware a Rollback returns to always has the console.
|
||||
|
||||
Reference in New Issue
Block a user