Commit Graph
59 Commits
Author SHA1 Message Date
DeFiDude b70342a2f5 Fix wrong-recipient message delivery via stale outbound link
When switching between peers, sendDirect() updated _outLinkDestHash to the
new destination before the new link was established, while _outLink still
held the old peer's active link. On the next retry, the hash check passed
(both matched the new peer) but the link object was still connected to the
old peer — delivering the message to the wrong recipient.

Fix: only update _outLinkDestHash in onOutLinkEstablished() when the new
link is actually ready. Use _outLinkPendingHash to track what's being
connected to.
2026-03-20 20:25:47 -06:00
DeFiDude e250ea1ad0 Switch microReticulum dependency to fork master branch
PlatformIO Build / release (push) Has been skipped
PlatformIO Build / build (push) Failing after 7m17s
All fixes from fix/tcp-transport-and-identity-persistence have been
merged into master on ratspeak/microReticulum. No need for the branch
reference anymore.
2026-03-20 19:47:47 -06:00
DeFiDude ca9c736a2a v1.6.4: Bump version for LXMF bidirectional messaging fix 2026-03-20 19:43:09 -06:00
DeFiDude 43e5420416 Fix LXMF bidirectional messaging, increase known_destinations cap
Outbound (Ratdeck→Python) was broken because Identity::recall() could
never find the recipient. Root cause: OS::time() returns seconds since
boot on ESP32, but persisted known_destinations entries carried timestamps
from the previous session. New announces got timestamp ~31s while persisted
entries had ~5000s, so the LRU cull immediately removed the new entry.

The microReticulum Identity.cpp fix (timestamp normalization on load) is
in .pio/libdeps and must be upstreamed to ratspeak/microReticulum separately.

Changes:
- known_destinations cap 256→512 (PSRAM pool was 1% used, plenty of room)
- Fix link delivery destHash: onLinkEstablished callback was passing link_id
  instead of LXMF destination hash, corrupting conversation routing
- Add diagnostic logging: [LXMF-DIAG], [TCP-DIAG], [HEART-DIAG], [DIAG-PROOF]
  for tracing link establishment, proof routing, and interface status
2026-03-20 19:24:28 -06:00
DeFiDude 45df807424 Fix TCP announce flood: adaptive filter, TCP backpressure, aligned table caps
- Enhanced announce filter: adaptive rate (3/sec boot, 5/sec normal),
  skip re-validation of known paths unless hop count improved or 5min
  revalidation window expired
- Skip TCP reads when RNS loop exceeds 200ms to prevent UI starvation
- Lower MAX_ANNOUNCES_PER_SEC from 8 to 5
- Align build flag table caps (256/128) with runtime values
2026-03-19 15:24:31 -06:00
DeFiDude 00d04284c1 v1.6.3: Fix LXMF wire format, add link-based delivery
PlatformIO Build / build (push) Failing after 12m51s
PlatformIO Build / release (push) Has been skipped
Fix opportunistic LXMF wire format to match Python reference
(strip dest_hash from payload, carried by RNS packet header).
Compute messageId in packFull() matching Python LXMessage.pack().
Prepend dest_hash in onPacketReceived() for correct unpack.
Add opportunistic-first delivery with background link establishment.
Fix boot crash from RNS::Link default constructor in global scope.
v1.6.3
2026-03-19 14:37:09 -06:00
DeFiDude 8b8a9b572f Add link-based LXMF delivery, fix display SPI contention
Display: switch pushPixelsDMA to blocking pushPixels to prevent SPI bus
contention between the display and SX1262 radio on the shared FSPI bus.

LXMF: add opportunistic-first delivery with background link upgrade.
First message to a peer sends immediately via opportunistic packet. A
link is established in the background; subsequent messages use the link
when active (prepending dest_hash for Python DIRECT format), falling
back to opportunistic otherwise. No user-facing delay.
2026-03-19 13:07:19 -06:00
DeFiDude 71849cbb62 Fix LXMF wire format for Python interoperability
Opportunistic (non-link) delivery must strip dest_hash from the LXMF
payload — it's carried by the RNS packet header. Python prepends it
back on receive; we now do the same. Previously ratdeck always included
dest_hash when sending and never prepended it when receiving, breaking
interop in both directions.

- packFull: return [src:16][sig:64][msgpack] instead of [dest:16][src:16][sig:64][msgpack]
- onPacketReceived: prepend dest_hash from packet header before unpacking
- sendDirect: use messageId computed by packFull instead of re-hashing wire payload
- Add docs/WIRE-FORMAT.md documenting the exact format for all delivery methods
2026-03-19 12:37:09 -06:00
DeFiDude 2c161238c7 Fix messageId hash to exclude signature, matching Python/Rust
PlatformIO Build / build (push) Failing after 7m56s
PlatformIO Build / release (push) Has been skipped
messageId was computed as SHA256(dest+src+sig+payload) but Python/Rust
compute SHA256(dest+src+payload) — skipping the 64-byte signature.
This caused message ID mismatches across implementations, breaking
deduplication and propagation node lookups.
2026-03-17 18:11:35 -06:00
DeFiDude d89b6699ab v1.6.2: Fix announce bin8 encoding in Settings, deduplicate encodeAnnounceName
PlatformIO Build / build (push) Failing after 30s
PlatformIO Build / release (push) Has been skipped
Apply bin8 fix to the duplicate announce encoding in LvSettingsScreen
(Send Announce action). Replace inline copy with shared function from
main.cpp. Follows up on PR #5.
v1.6.2
2026-03-15 12:32:54 -06:00
dude.ethandGitHub e3dffe6df2 Merge pull request #5 from scotty007/fix/announce-format
Fix msgpack format of announce app data
2026-03-15 12:27:22 -06:00
DeFiDude fc91f8214e TCP scaling, GUI pooling, dev mode, protocol improvements
- TCP: wider drain budgets, TCP_NODELAY, no flush, PSRAM buffers, queue announces until hub ID
- GUI: object pool Messages/Contacts screens, partial MessageView status, targeted tab refresh
- LVGL throttled to 5fps when dimmed, non-blocking RSSI monitor, bounded I2S writes
- LXMF batch drain, BLE frame mutex, LoRa interrupt-driven RX, name cache cap 300
- Developer mode in settings: custom radio params (freq/txp/SF/BW/CR/preamble) behind warning
2026-03-15 12:25:29 -06:00
Scotty d9097c0289 Fix msgpack format of announce app data 2026-03-15 13:26:09 +01:00
DeFiDude 02d7dedcce v1.6.1: Fix TCP port input, flash status, PSRAM audio optimization
- Fix TCP port input: allow direct digit entry instead of scroll-only
- Fix flash status always showing "Error" (was checking SD path on flash)
- Flash now shows used/total KB instead of just Mounted/Error
- Audio buffers use PSRAM (ps_malloc) with internal heap fallback
- Bump version to 1.6.1
v1.6.1
2026-03-13 13:42:17 -06:00
DeFiDude 813a14641f v1.6.0: Update microReticulum ref, LXMF fixes, bump version v1.6.0 2026-03-13 04:24:29 -06:00
dude.ethandGitHub c4669a2fcc Update README.md 2026-03-12 15:50:05 -06:00
dude.ethandGitHub ec66d24aa3 Update README.md 2026-03-12 15:42:22 -06:00
DeFiDude 81d5f31e08 v1.5.11: Fix TCP outbound messaging + PSRAM optimization
- Fix path destruction on announce_packet cache miss (microReticulum)
- Fix hops_to() triggering unnecessary flash cache reads (microReticulum)
- Add PSRAM allocator for ArduinoJson Persistence (microReticulum)
- Enable PSRAM pool allocator for ContainerAllocator (2MB PSRAM pool)
- PathTable and AnnounceTable now allocate on PSRAM instead of heap
v1.5.11
2026-03-11 14:49:08 -06:00
DeFiDude 957911d7e7 Fix LXMF TX: Header2 transport_id correction and TCP transport improvements
- Restructure send_outgoing() to handle both Header1 wrapping and
  Header2 transport_id correction (for multi-hop edge case where
  Transport::outbound uses wrong _received_from as transport_id)
- Add announce management improvements and LXMF delivery fixes
- Add LoRa interface enhancements and nodes screen updates
- Sync microReticulum hops > 1 revert in libdeps
2026-03-11 13:43:39 -06:00
DeFiDude 6e36e6524a Remove transport node feature — ratdeck is endpoint only
These standalone devices should not act as transport nodes.
Remove the config toggle, settings UI, and boot-time config peek.
Hardcode transport_enabled(false).
2026-03-11 03:32:35 -06:00
DeFiDude cb74e7233e v1.5.10: M5Burner merged binary support v1.5.10 2026-03-10 23:00:49 -06:00
DeFiDude 0a969ef4c6 Add merged single .bin output for M5Burner compatibility
Add post-build script that produces ratdeck-merged.bin with bootloader,
partitions, boot_app0, and firmware at correct offsets. CI now attaches
the merged binary as a standalone release asset alongside the existing
multi-part ZIP.
2026-03-10 22:59:01 -06:00
DeFiDude 2a7808cf5a Add release protocol documentation
Standardized checklist for version bumps, tagging, post-release
verification, and hotfix workflow. Moves inline release steps from
BUILDING.md into dedicated RELEASING.md.
2026-03-10 14:57:40 -06:00
DeFiDude 9d81d05979 Performance and stability pass (v1.5.9)
- Tighten transport announce rate limit from 5/sec to 2/sec
- Reduce RNS loop frequency from 200Hz to 100Hz
- Throttle LVGL rendering to 30 FPS (was unthrottled)
- Time-box TCP frame loop to 3 frames / 8ms per client
- Add 12ms global TCP budget across all clients
- Replace blocking WiFi announce delay(1500) with deferred non-blocking check
- Rotate persistData() across 3 cycles to spread file I/O
- Reduce LvNodesScreen rebuild frequency (2s → 5s, skip small transient changes)
- Bump version to 1.5.9
v1.5.9
2026-03-10 12:10:24 -06:00
DeFiDude 1c6f1a7633 Fix boot loop crash from null Identity in announce handler
Guard AnnounceManager::received_announce() against null Identity
objects — Identity::recall() can fail when known_destinations table
is full and cull removes the entry. Also removes dead-code
needs_transport_headers() override from TCPClientInterface.
2026-03-10 11:22:19 -06:00
DeFiDude c630fe9d30 Bump version to 1.5.8 v1.5.8 2026-03-10 00:53:48 -06:00
DeFiDude fb9eb4a4c3 Fix TCP messaging, LoRa status reversion, and message ordering (v1.5.8)
- TCPClientInterface overrides needs_transport_headers() so hops==1
  packets get HEADER_2 wrapping through the hub
- Track savedCounter in LXMFMessage and use direct filename lookup
  for status updates, fixing LoRa uptime-timestamp precision loss
  that caused SENT status to revert to QUEUED on reload
- Remove timestamp-based re-sort in loadConversation() which broke
  chronological order when mixing LoRa (uptime) and TCP (epoch)
  timestamps; counter-based filenames already provide correct order
2026-03-10 00:49:59 -06:00
DeFiDude 6f272596c8 Fix announce flood from TCP hub overwhelming device (v1.5.7)
4-layer defense against 100+ node announce storms from rns.ratspeak.org:
- Transport-level rate limiter (5/sec) via filter_packet callback, before Ed25519 verify
- TCP frame processing time-boxed to 15ms per loop iteration
- Global announce rate limit (3/sec) in AnnounceManager
- UI rebuild throttled to once per 2 seconds

Also fixes message status not persisting to disk on queue drain.
v1.5.7
2026-03-10 00:08:56 -06:00
DeFiDude 9c48530ec8 Fix incorrect radio preset values in QUICKSTART docs
Preset table and inline reference had wrong BW and TX power values
that didn't match the actual firmware presets.
2026-03-09 15:43:30 -06:00
DeFiDude fc5b7a527e Fix TCP messaging via hub and persist known_destinations (v1.5.6) v1.5.6 2026-03-08 22:01:41 -06:00
dude.ethandGitHub e8b7592f33 Update README.md 2026-03-08 20:45:59 -06:00
DeFiDude 84b7f7175f Fix README video: restore HD thumbnail, add YouTube caption
Switch back to maxresdefault.jpg (1280x720) from hqdefault.jpg
(480x360 with black letterbox bars). Add small caption below the
thumbnail so visitors know it's a clickable video.
2026-03-08 20:35:36 -06:00
DeFiDude 881f9da262 Use YouTube thumbnail with play button overlay 2026-03-08 20:25:18 -06:00
DeFiDude 3f5f225a36 Replace product images with YouTube video in README 2026-03-08 20:23:48 -06:00
DeFiDude 58615b845a v1.5.5: Fix message duplication and ordering over LoRa v1.5.5 2026-03-08 19:28:23 -06:00
DeFiDude 1e22924159 v1.5.4: Hop-based eviction, first-boot data cleanup, message performance
- Evict highest-hop unsaved nodes first when peer list is full (nearby peers survive)
- Add first-boot SD data cleanup screen before name input
- Conversation summaries cache for faster message list rendering
- Optimize message view refresh with summary-based change detection
- Streamline unread tracking through MessageStore instead of LXMFManager
v1.5.4
2026-03-08 17:53:43 -06:00
DeFiDude 76b03a7508 v1.5.3: Cross-compat fixes, announce parsing, UI improvements v1.5.3 2026-03-08 16:52:36 -06:00
DeFiDude 4687bc9d38 Remove legacy dead code: pre-LVGL screens and unused stubs
Delete 24 files (2487 lines):
- 18 legacy screen files (BootScreen, HomeScreen, NodesScreen,
  MessagesScreen, MessageView, SettingsScreen, HelpOverlay,
  NameInputScreen, MapScreen) replaced by Lv-prefixed LVGL versions
- PowerManager (superseded by hal/Power)
- hal/Audio (ES7210 stub, working audio is audio/AudioNotify)
- hal/GPS (stub, GPS deprioritized)

Move shared types (SettingType, SettingItem, SettingsCategory) from
deleted SettingsScreen.h into LvSettingsScreen.h.

Clean main.cpp: remove legacy includes, instances, and tab mapping.

Note: StatusBar and TabBar retained — still used by UIManager/main.cpp.
2026-03-08 16:52:36 -06:00
DeFiDude b3fa3927ce Fix stale defidude references and version bumps
- Update clone URLs in BUILDING.md and QUICKSTART.md to ratspeak/ratdeck
- Fix update checker API URL in LvSettingsScreen.cpp to ratspeak/ratdeck
- Bump version examples in BUILDING.md from v1.4.2 to v1.5.2
2026-03-08 16:51:59 -06:00
DeFiDude ddaba06f14 Rewrite README, add product photos 2026-03-08 04:37:38 -06:00
DeFiDude d49fe332d3 Add LICENSE file, fix README: BLE status, beleth→ratspeak.org, update presets 2026-03-08 04:00:26 -06:00
DeFiDude 8947b636fc Fix LoRa presets: true max range BW 62.5kHz/22dBm, shift balanced and fast down
Long Range: SF12, 62.5 kHz, CR 4/8, 22 dBm (~37 bps)
Balanced:   SF9, 125 kHz, CR 4/5, 17 dBm (~1.8 Kbps)
Fast:       SF7, 250 kHz, CR 4/5, 14 dBm (~11 Kbps)

Previous Long Range used 125 kHz (3rd highest BW) and 17 dBm — not
actually max range. SX1262 supports 62.5 kHz BW and 22 dBm TX power.
2026-03-08 03:45:33 -06:00
dude.ethandGitHub 5ebf95658c Update README.md
Remove silly slop text
2026-03-07 23:32:30 -07:00
DeFiDude 6cb3118230 v1.5.2: Fix TCP client failures on WiFi reconnect
- TCP connect timeout 500ms → 5000ms (matches RatCom)
- Always recreate TCP clients on WiFi reconnect (stale socket fix)
- Stop TCP clients cleanly on WiFi disconnect
v1.5.2
2026-03-07 22:22:47 -07:00
DeFiDude 9ec2984d4f v1.5.1: Fix messaging failures, stale timestamps, retry logic
- Add NTP time sync on WiFi STA connect (fixes --:-- timestamps)
- Throttle LXMF send retries to 2s intervals, increase max to 30 (~60s window)
- Restore message status re-save to disk after send completes (QUEUED→SENT/FAILED)
- Update GitHub org URLs to ratspeak
v1.5.1
2026-03-07 21:05:19 -07:00
dude.eth 255030955a fix download URL to /download.html 2026-03-07 17:50:05 -07:00
dude.eth 349f08e80c fix web flasher URL: /flash -> /download 2026-03-07 17:44:03 -07:00
dude.ethandGitHub 0f95cdeeef Update README.md 2026-03-07 17:40:32 -07:00
dude.eth b48c9064b9 updating docs to reflect v1.4.2 2026-03-07 17:38:45 -07:00
dude.eth a32182140d v1.4.2: LXMF interop fix, UI redesign, radio defaults
- Fix LXMF wire format: standardize on opportunistic [src:16][sig:64][content]
- Fix LXMF signature: sign(dest||src||packed) per spec, remove message_hash
- Fix MsgPack interop: handle both str and bin types for title/content
- Radio defaults changed to Balanced preset (SF9/BW250k/CR5/TX14)
- Messages screen: sorted by most recent, preview with You:/Them:, green unread dot, timestamps
- Status bar: replace LoRa/BLE/WiFi text with signal bars (green=connected, red=offline)
- Home screen: remove Unread info (shown in Messages tab)
- Contacts screen added (Friends tab)
- Identity manager: multi-slot identity support with per-slot display names
- Message store: fix peer hash truncation, SD directory creation, .bak file leak
- Settings: check for updates, active identity display, info diagnostics
v1.4.2
2026-03-07 17:03:34 -07:00