Commit Graph

141 Commits

Author SHA1 Message Date
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
DeFiDude 37b536ea7f v1.8.4-beta: prerelease build
Mark prerelease tags (containing '-') as GitHub Pre-release.
v1.8.4-beta
2026-04-26 23:54:53 -06:00
dude.eth 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.eth 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
dude.eth 2b39f72292 Merge pull request #30 from drkhsh/fix/dir-path-trailing-slash
Fix contacts and conversations vanishing on reboot
2026-04-25 21:03:04 -06:00
DeFiDude f9ef856a6f Add AutoInterface support (IPv6 LAN auto-discovery via microReticulum AutoInterface) 2026-04-25 20:39:18 -06:00
drkhsh ef08510511 Suppress trackball nav events while screen is off
Trackball deltas crossing the nav threshold previously fired
up/down/left/right key events AND set _strongActivity=true, which
woke the screen from SCREEN_OFF on any pocket/backpack jostle and
also accumulated phantom navigation in the UI behind the dark screen.

Gate the nav-event block on isScreenOn(), mirroring the touch
suppression. Click/long-press detection stays unconditional so an
intentional trackball press still wakes the device.
2026-04-26 02:50:55 +02: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 3d135ceca1 Strip trailing slashes from dir-path constants
PATH_CONTACTS / PATH_MESSAGES / SD_PATH_CONTACTS / SD_PATH_MESSAGES
all ended in '/'. The FATFS layer used by the SD library and LittleFS
won't reliably enumerate when given a path ending in slash — opendir
returns a valid handle but readdir yields nothing. Direct file reads
(SD.open with FILE_READ for a known path) still work, which is why
settings/identity persisted but contacts and conversations vanished
on reboot.

Drop the trailing slash from the constants and add explicit "/" at
all concat sites: saveContact, removeContact, conversationDir,
sdConversationDir, and the migrateTruncatedDirs path builders.
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
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
drkhsh a8da0d8918 Add Power::forceScreenOff() for manual screen-off triggers
New public method that transitions to SCREEN_OFF on demand. A
_justWokeFromOff flag is set in activity() and cleared at the end
of loop() so a single keypress that woke the screen can't immediately
re-blank it via a hotkey/long-press handler running in the same tick.

Pure infrastructure — no UI binding included; consumers can wire it
to whatever input event they want (long-press, hotkey, etc.).
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 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