Commit Graph
684 Commits
Author SHA1 Message Date
James RichandClaude Fable 5 21bc10affb refactor(debug): pre-PR review fixes for the mirror
Circular D-pad ring replaces the cross cluster (wedge hit-testing with a
radial dead band, hold-to-repeat, per-wedge semantics, haptics), keyboard
capture becomes an explicit chip with tap-to-toggle, and taps on touch
devices forward real panel coordinates (long-press = SELECT, matching the
physical touch driver). Manager gains reset() (wired to ViewModel creation
and disconnect), a palette region cap, and first-chunk geometry pinning;
renderer uses bit-replicated RGB565 and run-length row drawing with the
pixel resolver extracted pure and tested; KeyUp of captured keys is
consumed; ViewModel moved to its own file; all strings localized; the
stray .bak test file is gone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 8753bdb47e feat(debug): adaptive mirror layout and keyboard-capture exit
Controls sit beside the mirror when the content width allows (>=760dp,
BoxWithConstraints) and stack below it otherwise; tapping the mirror now
toggles keyboard capture instead of only acquiring it, with the hint text
naming the way out.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 3c8e94b40b feat(debug): color-accurate mirror via DisplayPalette
DisplayMirrorManager reassembles FromRadio.display_palette chunks
(signature-keyed, defaults captured on the offset-0 chunk) into a
MirrorPalette; frames carry palette_signature and the renderer resolves
each pixel through the region table (last overlapping region wins,
matching firmware precedence) with RGB565 conversion, falling back to
monochrome when the referenced palette hasn't arrived. Renderer split
into MirrorFrameRenderer.kt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 4b06abfd17 feat(debug): TV-remote-grade mirror controls and DisplayInfo awareness
Replace the flat button stack with the researched control surface:
cross-shaped 5-way cluster (56dp circular keys, 8dp gaps, Material
Symbols chevrons with contentDescriptions), directions auto-repeat on
hold (500ms then 10Hz — slow enough for the radio to render), OK
long-press sends SELECT_LONG, Back sits below per TV-remote convention.
The mirror itself becomes an input surface: click to capture the
keyboard (arrows / Enter / Esc, with a visible focus ring and hint) and
swipe in a cardinal direction to navigate. Consumes the new
DeviceMetadata.display: shows an e-ink hint steering toward one-shot
Refresh. Adds keyboard_arrow_left/right icons (Material Symbols rounded,
transposed from the existing up glyph).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 d0d35d2a43 feat(metadata): describe the display in DeviceMetadata.display
Populates the new DisplayInfo during the handshake — dimensions from the
live display device, MONO_VLSB frame format, PanelClass from the panel
defines (EINK/HUB75/TFT/LCD/OLED), has_touch from HAS_TOUCHSCREEN — so
clients can gate mirroring UI and adapt to the panel. Absent on
display-less builds. Regenerates protos (DisplayInfo, DisplayFrame rect
fields reserved for dirty-rect streaming).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 e34dea7ac1 refactor(debug): harden screen mirror from adversarial review
Manager: validate format (MONO_VLSB only) and geometry (width/height must
describe exactly total_size bytes) so malformed device input can't reach
aspectRatio and crash; unit tests for reassembly, drops, restarts.
AdminController: setDisplayMirror/sendInputEvent become non-suspend
immediate sends (teardown-safe, input never queues behind bulk admin) and
gain requestDisplayFrame. Mirror tab: render each frame once into a 1:1
ImageBitmap scaled with FilterQuality.None (kills the fractional-scale
seams), gate controls on connection state, reset the toggle on disconnect,
stop the stream on tab dispose and ViewModel clear, add a one-shot Refresh,
inject AdminController/ConnectionStateProvider instead of RadioController.
Dispatch: display_frame test coverage incl. revoked-session.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 9d5d07d4c6 fix(debug): keep the Mirror tab's D-pad above the fold
Cap the mirror canvas at 512.dp (4x for a 128px OLED) instead of filling
the window width, fold the frame info into the toggle row, and pair
Down/Back so the controls fit without scrolling on desktop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 c33fa4d225 feat(debug): PoC live device screen mirror + remote D-pad (Mirror tab)
Consumes the DisplayFrame PoC protobufs (2.99.0-screen-mirror-poc-SNAPSHOT
from mavenLocal, useMavenLocal committed on this branch): DisplayMirrorManager
reassembles FromRadio.display_frame chunks into MirrorFrame snapshots,
AdminController gains setDisplayMirror + sendInputEvent, and the Debug panel
gains a Mirror tab rendering the device's 1bpp framebuffer live with a D-pad
driving the firmware InputBroker. PoC: tab strings deliberately unlocalized.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James Rich e51b727344 fix(messaging): keep the composer IME session stable while the node list changes (#7079) 2026-09-08 22:17:42 +00:00
James Rich 64fffac6ce fix(settings): fetch Mesh Beacon config from remote-admin nodes (#7077) 2026-09-08 22:17:40 +00:00
James Rich 0d15707f9a fix(firmware): move firmware artifact fetching onto the R2 hosts (#7073) 2026-09-08 15:06:06 -05:00
James Rich 8d97982018 chore: device link disclosure (#7068) 2026-09-08 14:23:22 +00:00
James Rich 5a0cb5cf41 feat: mark nodes not heard since the LoRa config changed (#7055) 2026-09-07 10:44:43 +00:00
James Rich a5f7c5d917 feat(firmware): factory erase through the OTAFIX bootloader when the drive advertises it (#7058) 2026-09-06 14:46:59 +00:00
James Rich 7e74dcec3f fix(node): gate direct messages on holding a public key (#7050) 2026-09-05 20:11:30 +00:00
James Rich 0cfb05ad2c feat(node): add an update-status shortcut to the local node menu (#7047) 2026-09-05 16:05:35 +00:00
James Rich 29a3cd005a chore: Scheduled updates (Graphs, Baseline Profile) (#7031) 2026-09-04 13:03:59 +00:00
James Rich 5e61b6af3a feat(map): offline banner and Google basemap auto-fallback on connectivity loss (#6998) 2026-09-03 21:18:52 +00:00
James Rich d0806f60a3 feat(map-maplibre): offline terrain (hillshade + contours) for MapLibre (#7012) 2026-09-03 20:18:15 +00:00
Jeremiah K e2d033ae6f fix(connections): scope region warnings to the active connection (#7015) 2026-09-03 19:31:17 +00:00
Copilotandjamesarich 0595852ad7 Remove stale Vico workaround and close dependency-upgrade follow-ups (#7025)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jamesarich <2199651+jamesarich@users.noreply.github.com>
2026-09-03 18:09:34 +00:00
James Rich 23e5e2aeea fix(map): show a message instead of crashing when a device has no map engine, and fail CI on the gap (#7005) 2026-09-03 14:27:41 +00:00
James Rich 680e78d7b1 fix(settings): re-learn the node number when the first region set renumbers the radio (#7021) 2026-09-03 14:16:54 +00:00
James RichandClaude Sonnet 5 60019db962 feat(ui): blend noise floor into signal quality rating (design#15) (#7009)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 20:21:51 +00:00
James RichandClaude Sonnet 5 ea5fd32991 fix(settings): floor the beacon broadcast-target list at one row (#7010)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 18:20:26 +00:00
James Rich ca231c3db0 ci: clear the recurring warnings and dead job the workflow logs carry (#6982) 2026-08-31 17:08:38 +00:00
James RichandClaude Fable 5 3b08d8d5af fix(map): resolve the persisted basemap before the map first renders (#6978)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:49:31 +00:00
James Rich 19cd23f46f fix(firmware): hide USB maintenance where the platform cannot run it (#6974) 2026-08-31 12:44:50 +00:00
James Rich 0fe912e056 chore(resources): drop dead string keys, and fix help text that contradicts the code (#6972) 2026-08-31 12:44:17 +00:00
James Rich ef4e4154f2 docs: audit the user guide against the code, and fix what had drifted (#6968) 2026-08-30 23:29:09 +00:00
James Rich 08e3673797 chore(discovery): remove the scan state nothing ever enters (#6971) 2026-08-30 22:58:04 +00:00
James Rich a0760d0ea1 fix(map): gate the MapLibre waypoint editor on isModifiableBy (#6969) 2026-08-30 22:42:03 +00:00
James RichandClaude Fable 5 ce137a7f5e feat(discovery): suppress beacon invitations for channels the radio already has (#6964)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 18:05:25 +00:00
James Rich 431f78c4e1 feat(settings): align the Mesh Beacon config editor with design#140 (#6963) 2026-08-30 18:04:46 +00:00
James Rich f4810ff314 chore: Scheduled updates (Graphs, Baseline Profile) (#6957) 2026-08-30 12:55:50 +00:00
James Rich 37e8649ae4 fix(ui): show device roles by name, and stop doubling two percent signs (#6962) 2026-08-30 12:55:21 +00:00
James Rich 2ac28e28c3 feat(map): filter the map by node role and by how a node was heard (#6959) 2026-08-30 05:45:05 +00:00
James Rich 17587eb242 feat(map): give every map layer its own opacity slider (#6958) 2026-08-30 03:59:27 +00:00
James RichandClaude Fable 5 80849ca503 docs: house style guide + corpus-wide style and prose audit (#6954)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 01:21:39 +00:00
James Rich 657592ebe0 refactor(settings): edit the status message on the user screen (#6951) 2026-08-29 16:08:33 +00:00
James RichandClaude Opus 5 f5a6ae38b8 feat(map): replace OSMdroid with MapLibre on F-Droid, and put a map on desktop (#6901)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 15:59:26 +00:00
9bd91c75ad fix(node): scroll traceroute/log history detail popups (#6708)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: James Rich <james.a.rich@gmail.com>
2026-08-28 19:40:39 +00:00
James Rich e319ceb88a feat(connections): notice when transmit is disabled (#6945) 2026-08-28 19:04:13 +00:00
James Rich 842e2ebeb3 fix(settings): drop the beacon single-target scalars protobufs reserved (#6942) 2026-08-28 17:51:23 +00:00
James RichandClaude Opus 5 0cdaddbd4d chore: give each display unit symbol one definition, and pin action digests (#6936)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 15:30:01 +00:00
James RichandClaude Opus 5 2b840dfe4d docs(discovery): name the page Local Mesh Discovery, as the app does (#6937)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 10:29:03 -05:00
James RichandClaude Opus 5 3d0fd08637 docs: audit the documentation against the code it describes (#6926)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 13:24:00 +00:00
James RichandClaude Opus 5 834b99ce8c fix(node): convert temperature before labelling it °F, and show wind in km/h (#6925)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 12:44:49 +00:00
232d2f9d51 feat(units): resolve units from the device region, add a Units setting, render through ICU (#6916)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: nomdetom <nomdetom@protonmail.com>
2026-08-27 14:32:55 -05:00
AustinandClaude Opus 5 bfcdb2f201 feat(settings): send the optional ham long_name alongside the call sign (#6875)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 11:40:47 +00:00