v0.0.4
Changelog
Added
- Boot screen now opens with a short Cryptspeak intro animation: the speech-bubble/keyhole mark wipes in top-to-bottom, "CRYPTSPEAK" decrypts into place letter-by-letter through scrambled noise glyphs, then the subtitle/version/progress bar fade in together instead of popping in at full brightness. The mark is drawn with the live theme accent color, so it matches whatever preset is active. Adds a fixed one-time ~1s cosmetic delay at the very start of boot; nothing else in the boot sequence is reordered or delayed.
- LoRa interface now defaults to Reticulum's roaming mode instead of the library default, matching this firmware's use as a mobile endpoint rather than a fixed gateway.
Fixed
- Radio: image/PLL calibration was issued from the wrong standby mode (
STDBY_XOSCinstead of the datasheet-requiredSTDBY_RC) whenever the configured LoRa region changed (e.g. Americas 915MHz → Europe 868MHz). This left the chip locked on the previously calibrated band until a happenstance no-op Settings save "fixed" it — a real bug that's been present since the radio driver was written. - Radio:
isTxBusy()checked the timeout deadline before checking the TX-done IRQ flag, so aloop()call delayed past the deadline by UI rendering could discard a transmission that had actually completed successfully. The radio driver now checks the IRQ first, and a genuine TX timeout is retried once automatically instead of silently dropping the packet. Also logs if the SPI mutex fails to allocate, which previously failed silently. - Transport:
TCPClientInterface's RX/TX frame buffers werestatic, shared across every instance under the assumption only one TCP hub connection runs at a time. Since up to 4 hub connections can run concurrently, two in-flight connections could silently corrupt each other's buffered bytes. Buffers are now per-instance. Also fixed Header2 hubtransport_idlearning, which was cached once from the first packet and never re-checked — if a hub later regenerated its identity without dropping the TCP socket, outgoing packets kept using the stale id. - UI: password/unlock screen had a dead backspace handler (an unreachable code path meant to return focus to the password field from an empty confirm field) and a layout bug where setup mode's two-field box overlapped the status/hint text. Both fixed, and field labels are now left-aligned to their box instead of floating centered above it.
Removed
- The M5Launcher boot-mode chooser and the bundled GPLv3 RNode TNC firmware image, along with the dual-image OTA partition-switching code that supported them. This fork only ever ships the standalone LXMF messenger, so the dual-image infrastructure inherited from upstream was dead weight — and the OTA mode-switch code was actively harmful, since it unconditionally forced the boot partition back to slot 0 on every boot. Does not affect RNode on-air protocol compatibility; the SX1262 driver and LoRa transport used by standalone mode are untouched.
- Dead code: an unused
HotkeyManagertab-cycle callback that was never invoked, and aUIManagerrender flag that was written once and never read.
Docs
- Added six technical docs covering the Reticulum/LXMF core, every network transport interface, the SX1262 radio driver, the hardware/peripheral layer, and the UI framework — filling in the gaps left by the existing encryption/storage docs.
- Fixed the
Makefile/merge_firmware.pybuild-and-package flow, which never actually worked under a pipx-installed PlatformIO.make packagenow producesdist/rscardputer-standalone.zipend to end.
Full diff: https://github.com/0x00001312/rsCardputer-CE/compare/v0.0.3...v0.0.4
Note: This is still Beta Software, some issues may occur. The TX-timeout/retry fix has not yet been verified on real hardware.