Commit Graph

43 Commits

Author SHA1 Message Date
DeFiDude 6f8e53c060 Fix LoRa TX killed by receive() after handle_incoming (untested)
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 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 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.
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.
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
2026-03-13 13:42:17 -06:00
DeFiDude 813a14641f v1.6.0: Update microReticulum ref, LXMF fixes, bump version 2026-03-13 04:24:29 -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
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 2026-03-10 23:00:49 -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
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 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.
2026-03-10 00:08:56 -06:00
DeFiDude fc5b7a527e Fix TCP messaging via hub and persist known_destinations (v1.5.6) 2026-03-08 22:01:41 -06:00
DeFiDude 58615b845a v1.5.5: Fix message duplication and ordering over LoRa 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
2026-03-08 17:53:43 -06:00
DeFiDude 76b03a7508 v1.5.3: Cross-compat fixes, announce parsing, UI improvements 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 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
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
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
2026-03-07 21:05:19 -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
2026-03-07 17:03:34 -07:00
DeFiDude 07025bfa23 v1.4.0: LVGL UI, async radio TX, live TCP management, input fixes
- Migrate all screens to LVGL v8.4 widget system
- Non-blocking radio TX (async endPacket via LoRaInterface)
- Live TCP server switching with transient node cleanup
- Fix UI freeze during radio transmit
- Trackball long-press delete, deferred click with debounce
- Pin microReticulum to 392363c, fix list_directory API
- Fix CI build: portable include path, remove hardcoded local path
2026-03-07 13:00:59 -07:00
DeFiDude 9b7980665c v1.3.1: Chat bubbles, identity management, transport mode fix, performance
- Rewrite MessageView with word-wrapped chat bubbles, timestamps,
  incoming/outgoing alignment, pixel-based scrolling
- Add IdentityManager for multi-identity support (create/switch/delete,
  8 slots max, per-identity display names)
- Fix transport mode: default to endpoint (no rebroadcast) — was acting
  as transport node, rebroadcasting every TCP announce over LoRa causing
  5-11 second UI freezes per TX. Loop time: 11146ms → 6ms
- Add Transport Node toggle in Settings > Network
- TCP interface now drains up to 10 frames per loop (was 1)
- Reduce LoRa debug polling from 5s to 30s
2026-03-06 22:32:54 -07:00
DeFiDude 4c55c3ee6c v1.3.0: Major stability, settings redesign, WiFi scanner, TCP support
Stability fixes:
- Fix message duplication (8x repeat) via messageId-based filenames
- Fix message ordering with epoch timestamps (NTP-aware fallback)
- Fix device freezes: MessageView caches messages instead of reading
  disk every frame at 20fps (now refreshes every 500ms)
- Fix .bak file cascade: filter all file ops to .json only, cleanup junk
- Fix radio presets not persisting across reboots (removed force-override)

Settings redesign:
- Collapsible category navigation (6 categories with summaries)
- Enter to drill into category, Backspace to return
- WiFi network scanner with signal bars and RSSI display
- WiFi SSID/Password fields for STA mode
- TCP server preset (None / Ratspeak Hub / Custom) with host/port
- Frequency selector (868/906/915/923 MHz) and Preamble setting
- Factory reset with confirmation step
- Reboot device action
- Merged small categories (Input into Display, Actions into System)

New features:
- TCP network support for rns.ratspeak.org connectivity
- Preamble stored/applied in config and radio at boot
- Version bumped to 1.3.0
2026-03-06 22:09:17 -07:00
DeFiDude dbc33c7926 Fix LXMF message duplication: add messageId deduplication
- Add seen messageId set to processIncoming() to prevent duplicate
  processing of the same message arriving via multiple callbacks
- Remove redundant save at QUEUED stage (only save after send attempt)
- Cap dedup set at 100 entries to prevent memory growth
2026-03-06 16:32:59 -07:00
DeFiDude d518921eed v1.2.2: Fix trackball, add display name support, announce with app_data
- Fix trackball completely dead: remove gpio_reset_pin() calls that
  prevented GPIO interrupts from registering on ESP32-S3
- Add trackball left/right tab cycling when screen doesn't consume event
- Add NameInputScreen: Ratspeak-branded first-boot name input
- Add display name to all announces as MessagePack app_data
- Add TEXT_INPUT setting type; expose Display Name in Settings
- HomeScreen Enter key sends announce with toast notification
- Bump version to 1.2.2
2026-03-06 16:28:18 -07:00
DeFiDude 5d038aec9e Fix trackball dead after USB web flash
After ESP32-S3 USB download mode, GPIO peripheral state may persist
across soft reset. The trackball interrupts silently fail because
pins are in an unknown state from the bootloader.

Fix: call gpio_reset_pin() and detachInterrupt() before configuring
the trackball GPIOs, ensuring a clean state regardless of how the
device was reset (power cycle, RTS toggle, or software reset).
2026-03-06 15:43:13 -07:00
DeFiDude 80d4cd45f6 v1.1.0: UI polish, LXMF messaging fixes, keyboard cleanup
- Remove boot display test (color bars + 1.5s delay)
- Show identity hashes on NodesScreen (colon-formatted, matching own identity display)
- Show node names in MessagesScreen and MessageView instead of raw hex
- Add message status indicators in chat (*/!/~ for sent/failed/queued)
- Fix LXMF send: retry Identity::recall() up to 5 times before failing
- Add LXMF logging throughout send/receive/queue drain
- Remove Alt+IJML arrow key mapping (obsolete with trackball)
- Filter own node from discovered nodes list
- Update troubleshooting docs with SetModulationParams STDBY fix
2026-03-06 13:34:15 -07:00
DeFiDude 1255f0db51 Initial release: Ratdeck v1.0.0
Reticulum transport node + LXMF encrypted messenger for LilyGo T-Deck Plus.
ESP32-S3, 16MB flash, SX1262 LoRa, LovyanGFX display, NimBLE BLE.
2026-03-06 12:40:34 -07:00