Commit Graph

77 Commits

Author SHA1 Message Date
DeFiDude
fad3de7057 v1.7.0: LoRa split-packet framing, hub performance, silent auto-announce v1.7.0 2026-03-24 23:12:11 -06:00
DeFiDude
6df6017ab4 Suppress UI notifications for auto-announce when screen is off 2026-03-24 22:29:26 -06:00
DeFiDude
949e508f80 Reduce table caps for client device performance
Lower known_destinations from 512→128, announce_table from 128→32,
path_table from 256→64. Ratdeck is a client, not a transport node —
smaller tables reduce cull overhead and memory pressure on busy hubs.
2026-03-24 22:23:15 -06:00
DeFiDude
851da63220 LoRa split-packet framing, TX queue, and LXMF delivery fixes
LoRaInterface: Implement RNode-compatible split-packet framing so the
full Reticulum MTU (500 bytes) works over LoRa. Packets >254 bytes are
transparently split into two LoRa frames with matching sequence numbers
and reassembled on the receiver. Also adds a 4-deep TX queue instead of
dropping packets when the radio is busy — critical for link handshakes.

LXMFManager: Large messages (>MDU) now queue pending link establishment
and retry via resource transfer instead of failing immediately. Stale
link-pending state is detected and reset. Speculative background link
establishment removed to avoid LoRa collisions.

AnnounceManager: Add app_data hex diagnostics on announce RX for
debugging name extraction issues.

main.cpp: Centralize all announce paths through announceWithName() so
display name and app_data are always logged.
2026-03-24 20:55:07 -06:00
DeFiDude
2221eb832f Route large LXMF messages through Resource transfer over link
When link payload exceeds MDU (263 bytes), use Link::start_resource_transfer()
instead of failing. This enables sending files, images, and long messages
(>295 bytes content) via the microReticulum Resource protocol.

Delivery path selection:
1. Link active + payload ≤ MDU → single link packet (existing)
2. Link active + payload > MDU → Resource transfer (NEW)
3. No link → opportunistic (existing, fails for >MDU)
2026-03-24 17:06:43 -06:00
DeFiDude
cc8701436e Remove local LXMFMessage — now provided by microReticulum library
LXMFMessage.h/cpp is now part of the microReticulum library (commit 6f3c08d).
This eliminates the duplicate LXMF codec and ensures all platforms (Ratdeck,
Ratcom, native tests) use the same shared implementation.

The local header is replaced with a forward to <LXMFMessage.h> so existing
#include "LXMFMessage.h" references still resolve.

microReticulum library includes 32 tests validating the LXMF codec:
- 10 pack/unpack/sign tests (test_lxmf_codec)
- 10 cross-platform fixture tests (test_lxmf_interop)
- 6 announce interop tests (test_announce_interop)
- 6 protocol edge case tests (test_protocol_edge_cases)
2026-03-24 16:22:47 -06:00
DeFiDude
5fd01251dd v1.6.6: LoRa stability, announce interval config, touch input fix v1.6.6 2026-03-23 18:09:09 -06:00
DeFiDude
8c0b0853e4 Fix GT911 touch coordinate axes for T-Deck Plus display orientation
Swap X/Y axes and invert Y so (0, 0) maps to the top-left corner,
matching the physical display orientation on the T-Deck Plus.
Patch suggested by scotty007 in PR #10.
2026-03-23 17:57:34 -06:00
dude.eth
f060b892b9 Merge pull request #10 from scotty007/fix/read-touch-input
Fix touch input reading
2026-03-23 17:56:30 -06:00
Scotty
3b1772147b Fix register address and size of GT911 point data 2026-03-22 09:20:43 +01:00
Scotty
67a682080d Store and use I2C address at which GT911 was found 2026-03-22 09:05:41 +01:00
DeFiDude
f1cf2e654c Fix ISR deadlock crash: remove SPI call from DIO1 interrupt handler 2026-03-21 14:48:39 -06:00
dude.eth
92e02f5442 Merge pull request #9 from scotty007/feature/config-announce-interval
Add user config setting for auto-announce interval
2026-03-21 14:35:51 -06:00
DeFiDude
0c4fbb5cd5 Drop oversized LoRa packets instead of silently truncating
The previous LORA_SAFE_LINK_PAYLOAD check only guarded link delivery,
but opportunistic delivery also exceeds the 255-byte LoRa MTU for longer
messages. Truncated packets corrupt the HMAC/ciphertext, wasting airtime
and confusing receivers.

Fix: LoRaInterface::send_outgoing() now rejects packets exceeding
MAX_PACKET_SIZE before they reach the radio. This is a hard limit —
messages too large for a single LoRa packet will not be sent until
Resource-based multi-packet transfer is implemented.
2026-03-21 14:14:34 -06:00
DeFiDude
4a7b1935d5 Workaround LoRa link delivery truncation for large LXMF messages
Link delivery adds ~64 bytes of overhead (dest_hash + Token IV/HMAC/padding)
which can push encrypted payloads past the 255-byte LoRa MTU. SX1262::write()
silently truncates, corrupting the HMAC and failing decryption on the receiver.

Band-aid: cap link delivery plaintext at 180 bytes, falling back to
opportunistic delivery for larger messages. Long-term fix needed: negotiate
link MTU based on interface HW_MTU, or implement Resource-based multi-packet
transfer for oversized payloads.
2026-03-21 14:00:12 -06:00
Scotty
42c5a8b1a5 Add user config setting for auto-announce interval 2026-03-21 11:35:10 +01:00
DeFiDude
6f8e53c060 Fix LoRa TX killed by receive() after handle_incoming (untested)
Some checks failed
PlatformIO Build / build (push) Failing after 13m14s
PlatformIO Build / release (push) Has been skipped
2026-03-21 02:19:07 -06:00
DeFiDude
87723e891a v1.6.5: Disable BLE by default, remove DataCleanScreen prompt v1.6.5 2026-03-20 20:42:37 -06:00
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
Some checks failed
PlatformIO Build / build (push) Failing after 7m17s
PlatformIO Build / release (push) Has been skipped
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
Some checks failed
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
Some checks failed
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
Some checks failed
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.eth
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.eth
c4669a2fcc Update README.md 2026-03-12 15:50:05 -06:00
dude.eth
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.eth
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