Commit Graph

129 Commits

Author SHA1 Message Date
drkhsh f4eaf71983 sanitizeName: allow forward slash in display names
Sideband/Columba and other LXMF clients commonly include "/" in display
names (e.g. handle/path conventions). The allowlist in sanitizeName
stripped it, mangling "alice/columba" into "alicecolumba". Saved
contacts get re-sanitized on each load (line 393), so existing names
also lose the slash on next boot.
2026-04-26 02:50:54 +02:00
DeFiDude 9cb5a4f3db v1.8.3: LXMF Python interop — disable bz2 compression
Python LXMF was sending bz2-compressed Resource transfers that
microReticulum cannot decode on ESP32 (bz2's working memory exceeds
available SRAM). The companion microReticulum commit (290a133)
removes bz2 entirely; this release advertises no-compression-support
in our LXMF announces so Python LXMF disables auto_compress when
sending to Ratdeck destinations.

Also pins lvgl and LovyanGFX minor versions in lib_deps to prevent
future fresh-clone builds from pulling incompatible 1.2.x / 8.4.x.

Thanks to @RFNexus for surfacing the ESP32 bz2 constraint.
v1.8.3
2026-04-24 18:23:35 -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 401107995a Pin lvgl and LovyanGFX to ~1.1.16 / ~8.3.4 (block 1.2.x / 8.4.x)
LovyanGFX 1.2.x bundles its own lvgl-compat headers that collide
with lvgl >=8.4 on shared types (lv_area_t, lv_font_t, etc.).
Tilde restricts fresh clones to the 1.1.x and 8.3.x ranges this
build was originally cached against, so `pio run` from a fresh
checkout doesn't randomly break.
2026-04-23 21:41:13 -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
DeFiDude b27e5c9f1e Update presets
Updating radio presets now, planned for the website overhaul but doing presets early since users are having troubles.
2026-04-16 13:27:03 -06:00
dude.eth de608c4667 Increase supply chain risk
I simply do not care enough to keep the proper microReticulum commit pinned, started as a joke. Still keeping crypto dependencies internal, though.
2026-04-08 13:38:23 -06:00
DeFiDude e8000538aa Reduce supply chain risk 2026-04-07 15:11:39 -06:00
DeFiDude 037af2a6ac - Brightness adjustments 2026-04-06 23:02:40 -06:00
dude.eth 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 61d6a861f8 v1.8.2
- Fix issue #23
- Improve menu focus
v1.8.2
2026-04-06 16:56:08 -06:00
DeFiDude bcd30fa0b3 v1.8.1 v1.8.1 2026-04-05 19:52:52 -06:00
DeFiDude bc475bc75e Use local receive time for incoming message timestamps 2026-04-05 19:45:11 -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 92112de000 Fix stale orange theme comments — palette is matrix green 2026-04-03 23:32:18 -06:00
DeFiDude f5c584949d - LVGL changes, lost some spirit, but WIP 2026-04-03 19:10:58 -06:00
dude.eth a85c18d8f3 Merge pull request #21 from scotty007/fix/send-button-callback
Add send button callback in LvMessageView
2026-04-03 16:16:27 -06:00
DeFiDude 77de14baef Playing w/ LVGL 2026-04-03 16:12:40 -06:00
Scotty d0563220b6 Add send button callback in LvMessageView 2026-04-03 12:47:17 +02:00
DeFiDude fecf8249ba v1.8.0: LXMF link delivery, LoRa reliability, touch support v1.8.0 2026-04-03 00:14:08 -06:00
DeFiDude 0c47e2204f Touch screen capability (closes #19) 2026-04-03 00:06:48 -06:00
DeFiDude 48e2b98bd7 Merge branch 'main' into touch 2026-04-02 23:06:43 -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
Belousov Oleg ba4a729d16 The touch work has been completed 2026-04-02 18:42:50 +03: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 0d2a75a71c Remove the pesky 0.1% Python 2026-03-30 01:32:44 -06:00
DeFiDude 33ce7eab56 Shorten LoRa preset labels, default to Long Fast 2026-03-30 01:21:33 -06:00
Belousov Oleg 4b35318121 Fix: custom label in Lora presets 2026-03-29 13:25:56 +03:00
Belousov Oleg 8ea5993e8d The list of Lora presets has been expanded 2026-03-29 13:18:11 +03:00
DeFiDude 16412067e0 v1.7.3: performance, Cyrillic fonts, scroll/UI fixes v1.7.3 2026-03-28 22:40:42 -06:00
DeFiDude 15e0e67610 Set microReticulum log level to WARNING, document verbose logging for debugging 2026-03-28 22:21:05 -06:00
DeFiDude bcba228635 Move flash persistence to core 0 background task, eliminate 4s main loop freeze 2026-03-28 22:07:43 -06:00
DeFiDude 2c73a10c80 Hide unknown hop count, remove hops_to and toHex from transport filter hot path 2026-03-28 21:18:08 -06:00
DeFiDude 9e4217085a Reduce device freeze on large TCP hubs, reduce announce processing overhead 2026-03-28 21:11:31 -06:00
DeFiDude 59200d6aea Cyrillic and Latin Extended font support (fixes #14)
Regenerated Montserrat 10/12/14 with Cyrillic and Latin Extended
Unicode ranges so messages in Russian, Ukrainian, Bulgarian, and
accented European languages render properly instead of rectangles.
2026-03-28 20:58:01 -06:00
DeFiDude 4958ed9289 Fix nodes list scroll truncation, center action modal, trackball parity
Scroll: scrollToSelected() was defined but never called — LVGL didn't
know which pool row to show after viewport updates. Nodes at the
bottom of long lists were invisible. Now called after every sync.

Modal: Replace lv_obj_center() with explicit pixel positioning so
the action modal renders centered regardless of list scroll state.

Trackball: Click now sets character='\n' matching keyboard Enter for
complete event parity.
2026-03-28 20:37:48 -06:00
DeFiDude a32c6d9a42 Prevent selecting Custom preset, detect custom frequency in preset v1.7.2 2026-03-28 19:47:27 -06:00
DeFiDude e92a013caf v1.7.2: idle optimization, regional presets, RSSI, UX improvements 2026-03-28 19:43:14 -06:00
DeFiDude d81921357b Stamp incoming messages with receiver time, radio-style freq editor
Timestamps: Incoming messages with invalid sender timestamps
(< Nov 2023 epoch) are now stamped with the receiver's local time
if available. Previously, messages from devices without NTP/GPS
showed no timestamp at all.

Frequency editor: Replace raw 9-digit Hz accumulator with a
radio-style digit cursor. Display shows NNN.NNN.NNN format with
bracket cursor on active digit (e.g., "920.[6]50.500"). Trackball
left/right moves cursor, digit keys replace at cursor and advance.
Esc restores original value. Matches amateur radio transceiver UX.
2026-03-28 16:25:50 -06:00
DeFiDude f41e4c0363 Tune RNS tables, cache status bar time, add BLE idle timeout
Status bar: Cache last displayed hour/minute, skip LVGL label
update when minute hasn't changed (eliminates 59/60 redundant
invalidations per minute).

RNS tables: Increase ANNOUNCE_TABLE_MAX 32→48 (prevents premature
eviction on networks >32 nodes). Increase RATE_TIMESTAMPS_MAX
16→32 (prevents false rate-limit rejects on busy networks).

BLE: Add 5-minute idle timeout. Stale connections now get
disconnected to free the single NimBLE connection slot for new
devices. Activity tracked on connect, RX, and TX events.
2026-03-28 15:51:43 -06:00
DeFiDude d3ed421038 Optimize message view rendering, WiFi TX buffering, remove unused font
Message view: Extract appendMessage() from rebuildMessages(). New
messages are now incrementally appended (O(delta) widget ops) instead
of destroying and recreating all bubbles (O(N)). Full rebuild only
on initial load or message count decrease.

WiFi TX: Buffer HDLC frame in PSRAM then send with single write()
call. Previously sent per-byte (200+ syscalls per packet), now 1
syscall. Reduces CPU overhead and TCP fragmentation.

Font: Disable unused LV_FONT_UNSCII_8 (compiled but never referenced).
2026-03-28 15:48:40 -06:00
DeFiDude c3025eb98e Fix TCP stack overflow risk and cap WiFi AP client connections
TCP: Move 2KB stack-allocated packet rewrite buffers in
send_outgoing() to a PSRAM-allocated member (_wrapBuffer).
The ESP32-S3 loop task has 8KB stack — a single 2KB VLA used
25%, risking overflow under deep call chains during TCP load.

WiFi AP: Cap concurrent client connections at 4. Previously
unbounded — any number of clients could connect and exhaust
memory. New clients beyond the limit get a clean TCP RST.
2026-03-28 15:43:49 -06:00
DeFiDude 16f1bb516c Show WiFi reboot toast only once, not on every setting change
Previously, "Reboot Required!" fired on every applyAndSave() once
any WiFi setting changed — showing 3 times during a single STA
setup (mode + SSID + password). Now the toast only shows on first
detection with a gentler message: "WiFi changes apply on reboot".
Subsequent saves show "Saved" normally.
2026-03-28 15:26:24 -06:00
DeFiDude 7bf1be2724 Fix GPS time not showing without satellite lock (LoRa-only boot)
Two-layer fix:
- NMEAParser: parse time fields from RMC sentences even when status
  is void ('V'). The MIA-M10Q's battery-backed RTC provides time in
  every sentence — we were discarding it along with the void location.
- GPSManager: allow first time sync without satellite lock. Subsequent
  syncs still require sats>0 for accuracy. Year/epoch validation still
  guards against garbage data from uninitialized modules.

Previously, time only appeared after WiFi connection (NTP via
configTzTime). Now the clock shows within seconds of boot using the
GPS module's RTC, then corrects when satellites lock.
2026-03-28 15:16:57 -06:00
DeFiDude 4086609054 Fix stale unread badge when message arrives during active conversation
refreshUI() detected and displayed new messages but never called
markRead() or updated the tab badge. Now marks conversation as read
and refreshes the badge whenever new messages are loaded while the
user is actively viewing the conversation.
2026-03-28 14:51:26 -06:00
DeFiDude 31ce457192 Add action modal for node selection (Add Contact / Message / Back)
Replace direct-message-on-Enter with a 3-option modal overlay:
- "Add Contact" prompts for a nickname (pre-filled with announce
  name, falls back to hex hash if left empty), then saves contact
- "Message" opens conversation (previous Enter behavior)
- "Back" closes modal (also Esc at any point)

Long press on unsaved nodes now also shows the modal instead of
silently adding. Long press on saved contacts keeps the existing
delete confirmation flow.
2026-03-28 14:38:59 -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)
v1.7.1
2026-03-25 02:42:18 -06:00