Commit Graph
68 Commits
Author SHA1 Message Date
dj2ls d6054b317a fixing font size for battery level so its consistent with time size 2026-06-08 09:32:05 +02:00
dj2ls 605b533f3f suppress single-percent ADC noise for battery level 2026-06-08 08:57:40 +02:00
DeFiDude caddd445bd radio: apply persisted LoRa config on boot 2026-05-24 00:13:20 -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
DeFiDude 00782336f3 fix msg status, home button(s), active msg improvement 2026-05-04 13:14:13 -06:00
DeFiDude e87cef3fb3 ui: fix stale peer age display 2026-05-04 02:11:30 -06:00
DeFiDude c4e5610408 Harden flash config persistence 2026-05-04 01:08:17 -06:00
DeFiDude 4402c010e9 ratdeck: lvgl redesign, async transport, hardened storage 2026-05-03 20:48:57 -06:00
dude.eth 07abaaf3c3 Merge pull request #40 from drkhsh/fix/full-address-display
Settings: show full LXMF address and identity hash
2026-04-29 02:45:13 -06:00
dude.eth 1c15d1e604 Merge pull request #36 from drkhsh/feat/delivery-status-checkmarks
Delivery status checkmarks
2026-04-29 02:45:01 -06:00
dude.eth e1c3423e3a Merge pull request #35 from drkhsh/fix/message-bubble-time-clipping
Fix message timestamps clipping out of bubble
2026-04-29 02:44:55 -06:00
dude.eth 372f40512d Merge pull request #34 from drkhsh/fix/wake-click-and-longpress-blank
Fix wake-click and long-press blanking from subscreens
2026-04-29 02:44:48 -06:00
DeFiDude 19017bfe2e Add 41.7 kHz in dev mode, closes issue #29 2026-04-27 14:53:45 -06:00
drkhsh 423b56c1d8 Settings: show full LXMF address and identity hash
Both the LXMF Addr and Identity readonly entries truncated to the
first 16 hex chars, which made it impossible to type or read the
real address into another client (Sideband, Columba, etc) for adding
ratdeck as a contact. Drop the substring(0, 16) calls and show the
full 32-char hex. Wraps inside the row at the existing font; legible
and copyable.
2026-04-27 20:23:28 +02:00
drkhsh 17f012b777 Distinguish sent vs delivered with check-mark indicators
Previously a single ASCII glyph collapsed SENT and DELIVERED. Wire
PacketReceipt delivery callbacks through to sideband-style single
and double checks.

LXMFManager tracks outstanding receipts (opportunistic + link
single-packet) by hash. On delivery: persist DELIVERED and fire
_statusCb. On 60s timeout: drop the entry, leave at SENT — lack
of proof over LoRa isn't proof of failure. Resource transfers stay
at SENT; microReticulum's Transport skips receipts for resource
packets and Link::start_resource_transfer exposes no concluded
callback to hook.

LvMessageView renders the glyph via applyStatusGlyph (Montserrat 12):
REFRESH for in-flight, single OK for SENT, double OK for DELIVERED,
WARNING for FAILED. Status callback matches by timestamp (~1s
tolerance) so DELIVERED lands on the right bubble after later
messages have already moved past QUEUED.
2026-04-27 19:44:38 +02:00
drkhsh edbb67c0c8 LvMessageView: reserve bubble pad-bottom for timestamp row
The timestamp label was positioned via lv_obj_align_to below the
message box, but the bubble container's LV_SIZE_CONTENT height was
driven entirely by the box, so the time rendered below the bubble's
allocated row in the flex scroll — visibly hanging into the gap.

Add pad_bottom=14 to the bubble so its outer height includes the
timestamp row, and anchor the box at TOP_LEFT/TOP_RIGHT (was
LEFT_MID/RIGHT_MID) so the layout stacks cleanly: box on top,
timestamp tucked under it inside the bubble's bbox.
2026-04-27 12:26:27 +02:00
drkhsh 429a578cfd Long-press blanks screen unless actively browsing a list
Contacts/Messages/Nodes screens consumed long-press as soon as they
loaded, which surfaced delete/menu dialogs instead of blanking the
display. Gate per-screen long-press consumption on _focusActive so the
delete affordance only fires after the user has navigated into the
list with up/down/enter. From the resting tab view, long-press falls
through to main.cpp and powers the screen off — same behaviour as the
home screen.
2026-04-26 23:08:42 +02:00
DeFiDude f9ef856a6f Add AutoInterface support (IPv6 LAN auto-discovery via microReticulum AutoInterface) 2026-04-25 20:39:18 -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.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
2026-04-06 16:56:08 -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 0c47e2204f Touch screen capability (closes #19) 2026-04-03 00:06:48 -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 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 2c73a10c80 Hide unknown hop count, remove hops_to and toHex from transport filter hot path 2026-03-28 21:18:08 -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 2026-03-28 19:47:27 -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 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 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)
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
Scotty 42c5a8b1a5 Add user config setting for auto-announce interval 2026-03-21 11:35:10 +01: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
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
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