Commit Graph
64 Commits
Author SHA1 Message Date
DeFiDude a2aad03a39 lxmf: avoid split LoRa opportunistic sends
Gate rsDeck opportunistic LXMF sends by the final packed Reticulum raw size when the next hop is LoRa, instead of using the pre-encryption LXMF payload size as the 254-byte limit.

Keep TCP paths on the normal Reticulum MDU, route LoRa packets that would exceed one RNode RF frame into link delivery, and log payload/raw/lora_raw sizing for field diagnosis.

Tested with rsDeck/Ratdeck T-Deck and Heltec V3 RNode attached over USB to a MacBook Pro running Ratspeak, using the medium-fast LoRa preset. Short 1-5 character opportunistic sends worked bidirectionally. Direct link delivery worked from T-Deck to Ratspeak/Heltec; Ratspeak-to-T-Deck link delivery later queued during link establishment while opportunistic still worked.
2026-06-26 15:13:12 -06:00
DeFiDude e497de63b3 input: ignore wake key dispatch 2026-06-15 00:16:42 -06:00
DeFiDude f6d6aff288 rsdeck: prepare dual-mode 2.0 release 2026-06-13 17:33:00 -06:00
DeFiDude 394a38e2ee ui: light/dark theme toggle 2026-06-12 03:30:58 -06:00
DeFiDude a2dee44b07 rsdeck: dual-boot launcher, RNode mode, build pipeline 2026-06-10 18:38:49 -06:00
DeFiDude 16dedbfa3e diagnostics: add lite relay packet probes 2026-06-08 12:25:07 -06:00
DeFiDude caddd445bd radio: apply persisted LoRa config on boot 2026-05-24 00:13:20 -06:00
DeFiDude 8913046a61 radio: add serial test harness controls 2026-05-21 23:40:49 -06:00
DeFiDude b4553a2299 radio: harden T-Deck SX1262 link 2026-05-21 23:11:23 -06:00
DeFiDude 8031fe0c4d radio: harden SX126x LoRa mode on Ratdeck 2026-05-21 19:57:26 -06:00
dude.ethandGitHub e7190b4126 Merge pull request #52 from drkhsh/feat/qr-share
ui: QR sharing overlay + Share My QR header on Contacts tab
2026-05-08 14:46:42 -06:00
drkhsh d9c92abf6c ui: QR sharing overlay + Share My QR header on Contacts tab
Adds an lxma://<hash>:<pubkey> QR overlay reachable from Settings and
from a new header row at the top of the Contacts tab. Including the
public key lets Columba/Sideband skip the PENDING_IDENTITY round-trip.

Contacts list stays visible even with no saved contacts so the header
row is always reachable; the empty-state floats above it.
2026-05-05 21:54:05 +02:00
drkhsh a9ec7f9d1e ui: bypass LVGL frame throttle on input activity
Input events otherwise wait up to a full 33ms frame interval before
LVGL renders, which is noticeable when the loop body is loaded.
When the input poll reports activity, run lv_timer_handler()
immediately and let the next idle frame fall back to the 30 FPS cadence.
2026-05-05 20:50:24 +02:00
DeFiDude 00782336f3 fix msg status, home button(s), active msg improvement 2026-05-04 13:14:13 -06:00
DeFiDude c4e5610408 Harden flash config persistence 2026-05-04 01:08:17 -06:00
dude.ethandGitHub bc4d0beeac Merge pull request #43 from drkhsh/fix/boot-backlight
Boot: bring backlight up after first boot-screen frame
2026-05-03 21:00:26 -06:00
DeFiDude 4ffa9f6184 Port reconnect backoff to selected profile 2026-05-03 20:57:56 -06:00
DeFiDude 4402c010e9 ratdeck: lvgl redesign, async transport, hardened storage 2026-05-03 20:48:57 -06:00
drkhsh 2ba43fd0ba Boot: bring backlight up after first boot-screen frame
037af2a left the backlight at 0 in Display::begin() to avoid exposing an
unpainted framebuffer, but powerMgr.setBrightness() at step 24 only runs
at the end of boot, so the whole boot sequence rendered onto a dark panel.

Set PWM 128 right after the first lvBootScreen.setProgress(), once LVGL
has flushed the boot screen. powerMgr at step 24 still overrides with the
user's configured brightness.
2026-05-04 00:37:39 +02:00
DeFiDude db0070eabd AutoInterface: notify_link_change on SLAAC privacy-address rotation 2026-05-01 16:39:42 -06:00
dude.ethandGitHub bb11a38e2e Merge pull request #32 from drkhsh/feat/power-management
Power: manual screen-off + pocket-carry input gating
2026-04-25 21:17:13 -06:00
dude.ethandGitHub 7896d3bfe6 Merge pull request #31 from drkhsh/fix/announce-name-and-aspect
AnnounceManager: stop doubling peers and dropping name characters
2026-04-25 21:16:04 -06:00
DeFiDude f9ef856a6f Add AutoInterface support (IPv6 LAN auto-discovery via microReticulum AutoInterface) 2026-04-25 20:39:18 -06:00
drkhsh 0b6bf5d24b AnnounceManager: filter to lxmf.delivery aspect
The handler had no aspect filter, so it captured every announce from
every aspect of a peer (lxmf.delivery, lxmf.propagation, NomadNet
node, etc.). Each aspect has a different destination hash, so the
same Sideband/Columba peer appeared multiple times in the nodes list
— once with the display name (lxmf.delivery's app_data carries it)
and once or more as raw hex (other aspects had no/different name).

Restrict to lxmf.delivery: that's the only destination we ever route
LXMF messages to. Propagation/NomadNet visibility can come back later
behind an opt-in toggle if needed.

Note: existing saved contacts captured under other aspects will still
appear after this change since they're loaded from disk. They can be
removed manually via the contacts UI.
2026-04-26 02:50:54 +02:00
drkhsh ef5d8ea189 Long-press trackball blanks screen; suppress touch wakes when off
Two pocket-carry quality-of-life additions:

1. Long-press (1.2s) trackball click blanks the screen if no LVGL
   screen consumes the long-press. InputManager captures the power
   state at click DOWN (_clickFromScreenOn) and only emits the
   long-press if the screen was already on, so a long-press from
   SCREEN_OFF wakes without immediately re-blanking.

2. Touch events are ignored entirely while screen is off, preventing
   accidental wakes from pressure on the panel in a pocket/bag.
   Trackball click and keyboard keys still wake normally.

InputManager now holds a Power* injected via setPowerMgr() in setup.
2026-04-26 02:50:54 +02:00
DeFiDude 3393d0afb4 Remove auto-seeded TCP hub default; users opt-in via Settings 2026-04-25 18:41:14 -06:00
DeFiDude b54ac52666 LXMF announce: advertise no SF_COMPRESSION (don't trigger Python bz2)
encodeAnnounceName now emits msgpack fixarray(3):
  [display_name(bin), stamp_cost=0, supported_functionality=[]]

Empty supported_functionality list = SF_COMPRESSION (=0x00) absent,
so Python LXMF disables auto_compress for our destinations and stops
shipping bz2-compressed Resources we can't decode. Always emit the
3-element form even when the name is empty — Python defaults to
auto_compress=True for legacy <3-element app_data.

Pairs with microReticulum 290a133 which removed bz2 entirely.
2026-04-23 21:41:59 -06:00
DeFiDude be771818f9 Silence vfs_api error spam and rename /ratputer/ SD paths to /ratdeck/
CORE_DEBUG_LEVEL=0 drops Arduino core noise on expected-missing files, LittleFSFileSystem::open_file now actually works so path_table persists across reboots.
2026-04-16 21:54:44 -06:00
dude.ethandGitHub 675ae47b4d Merge pull request #18 from scotty007/feature/keyboard-backlight
Add keyboard backlight config and control
2026-04-06 22:39:25 -06:00
DeFiDude ed61d901ff Fix TCP client interface mode: MODE_GATEWAY → MODE_FULL
Gateway mode is for server-side interfaces facing clients per the
Reticulum manual. Client connections to a hub should use MODE_FULL.
2026-04-05 19:22:24 -06:00
DeFiDude f5c584949d - LVGL changes, lost some spirit, but WIP 2026-04-03 19:10:58 -06:00
DeFiDude a83739c1cf Fix LXMF link delivery and improve LoRa reliability
Link proof signature, TCP proof routing, and split-packet handling
were causing intermittent message failures with Python LXMF clients.
Route >254B messages through link delivery, add proof retry for LoRa.
2026-04-02 22:48:24 -06:00
Scotty 51dbfa1a4e Add keyboard backlight config and control
- Add user config for brightness and auto-on/off control.
- Auto-switch backlight on/off according to power state.
2026-04-02 09:04:33 +02:00
DeFiDude 6836b6967a Fix bidirectional comms regression: remove unsafe core 0 persist task, restore better-path announce bypass
Increase TCP drain budget (5→10 frames), raise RNS-overload skip threshold (200→500ms)
2026-03-30 02:15:22 -06:00
DeFiDude 9e4217085a Reduce device freeze on large TCP hubs, reduce announce processing overhead 2026-03-28 21:11:31 -06:00
DeFiDude 6cd4197503 Add per-node RSSI/SNR display on Nodes screen (developer mode)
Backend:
- LoRaInterface captures packet RSSI/SNR immediately after every RX,
  removing redundant SPI re-reads from log statements
- AnnounceManager populates DiscoveredNode.rssi/snr from LoRaInterface
  on every announce (fields existed but were never wired up)

Frontend:
- Nodes screen shows RSSI appended to hops/age when dev mode is on
- Node name label uses smaller font (montserrat_12) to reduce truncation
- Normal users see no change
2026-03-28 14:27:07 -06:00
DeFiDude a77fb594a2 Fix screen wake on idle, add regional frequency presets and Hz input
Screen idle:
- Remove powerMgr.activity() from radio yield callback — screen no
  longer wakes on LoRa RX, auto-announce, or RSSI polls
- Add [POWER] state transition logging for on-device diagnostics

Radio regions:
- Add 4-region system: Americas (915), Europe (868), Australia (915),
  Asia (923) with timezone-to-region mapping
- Region picker in Radio settings (always visible)
- Presets now apply region-appropriate frequency + modulation params
- Timezone change warns if it suggests a different radio region

Frequency input (developer mode):
- Hz-precision input (9 digits) displayed as MHz with trimmed decimals
- Left/right arrows step by 125 kHz, digit keys for direct entry
- Inspired by @strijar in https://github.com/ratspeak/ratdeck/pull/12
2026-03-28 14:06:31 -06:00
DeFiDude b2fcfe526e v1.7.1: GPS time sync, timezone picker, status bar clock
- GPS time sync via UBlox MIA-M10Q (38400 baud auto-detect)
- Custom zero-dependency NMEA parser with XOR checksum validation
- Only trust GPS time when satellites > 0 (no stale RTC cache)
- DST-aware timezone picker at first boot (21 cities, POSIX TZ strings)
- Timezone also configurable in Settings > GPS/Time
- GPS Time on by default, GPS Location off by default (opt-in)
- Status bar: clock (top-left), Ratspeak.org (center), battery (right)
- 12h time default (no AM/PM), configurable 24h in settings
- NVS persistence of GPS time for approximate timestamps across reboots
- Fix factory reset Enter key bleed-through (600ms input guard)
- Fix hardcoded UTC-5 NTP timezone (now uses DST-aware POSIX TZ)
2026-03-25 02:42:18 -06:00
DeFiDude 311c5ad3df GPS time sync, status bar clock, configurable UTC offset
- Enable UBlox MIA-M10Q GPS on T-Deck Plus (HAS_GPS true)
- Custom zero-dependency NMEA parser (NMEAParser.h) with XOR checksum
- GPSManager: baud auto-detect (115200/38400/9600, 10s timeout),
  settimeofday() sync every 60s, NVS time/position persistence
- GPS Time enabled by default, GPS Location disabled by default
  (user must explicitly opt in via Settings)
- Replace status bar connectivity bars with clock display (top-left)
- Default 12h format without AM/PM, configurable 24h in Settings
- Add GPS/Time settings category: GPS Time, GPS Location,
  UTC Offset (-12 to +14), 24h Time toggle
- Fix hardcoded UTC-5 NTP timezone to use configurable utcOffset
- Change status bar brand text to "Ratspeak.org"
2026-03-25 01:36:56 -06:00
DeFiDude 6df6017ab4 Suppress UI notifications for auto-announce when screen is off 2026-03-24 22:29:26 -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
Scotty 42c5a8b1a5 Add user config setting for auto-announce interval 2026-03-21 11:35:10 +01:00
DeFiDude 87723e891a v1.6.5: Disable BLE by default, remove DataCleanScreen prompt 2026-03-20 20:42:37 -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 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.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 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