Commit Graph
244 Commits
Author SHA1 Message Date
James Rich 720c4c246f Merge remote-tracking branch 'origin/main' into screen-mirror-poc
# Conflicts:
#	core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/FromRadioPacketHandlerImplTest.kt
#	gradle/libs.versions.toml
2026-09-19 17:02:26 -05:00
James Rich 8bd80e9852 fix(nodes): the direct filter no longer returns MQTT nodes (#7256) 2026-09-19 20:33:54 +00:00
James Rich 5f242f6505 feat(telemetry): surface lightning, PM status and soil-water metrics (#7237) 2026-09-19 17:36:36 +00:00
James Rich bf4cf1c88b refactor: construct protos through Builder for buildersOnly protobufs (#7115) 2026-09-18 04:08:03 +00:00
James Rich 92adb816f9 fix(messaging): key conversations to channel identity, not slot index (#7162) 2026-09-15 15:18:36 +00:00
James Rich 91b6adc340 fix(storeforward): dedupe a router replay by original_id (#7158) 2026-09-14 20:32:51 +00:00
James Rich 8f4723cbb2 fix(node): keep a contact's public key when a different one arrives (#7118) 2026-09-11 16:20:25 +00:00
James RichandClaude Opus 5 db83c03df6 refactor(mirror): harden rect reassembly and extract the compositor
Third adversarial review pass over the client side.

Rect reassembly moves out of DisplayMirrorManagerImpl into
MirrorRectCompositor: the manager was carrying two unrelated state
machines and 14 methods. Every rect field is now validated before
anything is allocated (total_size is device-controlled), geometry is
latched from the chunk at offset 0 so a later chunk cannot transpose
the blit, continuations must match the buffer that was actually
allocated rather than their own claim, and bounds use the subtraction
form because rect_x + rect_width overflows for hostile values. A rect
that omits width or height covers the full panel in that axis.

remoteKeyInput no longer swallows modified keys, so Cmd+Q, Ctrl+C and
Alt+Tab stay with the desktop instead of being forwarded to the device.

MirrorFrameRenderer tracks colorized runs as a raw Int with a sentinel
rather than a boxed Color?, and MirrorFrame.hashCode includes the
format so a mono and an RGB565 frame of the same size cannot collide.

Drops mirror_view_only, orphaned since MUI gained remote input.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 ebcba96042 feat(debug): render MUI dirty-rect streams (Format.RGB565)
DisplayMirrorManager reassembles RGB565 rect chunks (sequence, geometry,
and panel-bound validation) and composites them into a persistent
little-endian RGB565 canvas emitted per completed rect; the renderer gains
a true-color branch using the same run-length row drawing. Mono frames are
untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
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 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 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 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 1fe80834e1 fix(network): never send heartbeat nonce 1, the firmware NodeInfo-ping trigger (#7078) 2026-09-08 22:56:12 +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 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
Jeremiah K e2d033ae6f fix(connections): scope region warnings to the active connection (#7015) 2026-09-03 19:31:17 +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 Rich ca231c3db0 ci: clear the recurring warnings and dead job the workflow logs carry (#6982) 2026-08-31 17:08:38 +00:00
James Rich ab0c8d4dba fix(ai): bound assistant messages at what the send path will actually encode (#6970) 2026-08-30 23:35:04 +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 f78268581e feat(messaging): mark unread, swipe row actions, and pinned conversations (#6857) 2026-08-24 20:44:07 +00:00
James Rich 1ab4da0fa6 feat(messaging): per-contact drafts and a quieter composer (#6851) 2026-08-24 10:43:59 -05:00
James Rich e549d24ea3 fix(messaging): clear and suppress notifications for the conversation on screen (#6849) 2026-08-24 15:01:46 +00:00
James RichandClaude Fable 5 5447674bb4 fix(connection): extend BLE handshake deadlines while config progress flows (#6848)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 06:18:42 -05:00
James RichandClaude Sonnet 5 99075c5dbe feat(hardware): fetch the maintenance UF2 manifest from the API, digest-pinned (#6803)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 17:58:51 +00:00
James RichandClaude Sonnet 5 4651c85361 feat(hardware): fetch bootloader OTA quirks from the API, seeded from the bundled asset (#6802)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 13:23:32 +00:00
James Rich 2df817db7a fix(node): make node-list search case-insensitive for non-ASCII names (#6753) 2026-08-17 17:37:23 +00:00
James RichandClaude Opus 5 19bb682c9c feat(firmware): add nRF52/RP2040 factory erase and OTAFIX bootloader upgrade over USB (#6526)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 16:43:07 +00:00
Jeremiah K e9d09a3380 fix(lifecycle): harden packet admission and transport ownership (#6716) 2026-08-15 21:44:17 +00:00
99c5be7858 fix(notifications): stop repeated protected position alerts (#6700)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Co-authored-by: James Rich <james.a.rich@gmail.com>
2026-08-14 13:08:40 +00:00
simulationstation 2f387369c1 fix(messaging): disambiguate sender-scoped packet IDs (#6624) 2026-08-13 13:50:37 +00:00
simulationstation b4bedd92fc fix(settings): restore channels from device profiles (#6618) 2026-08-13 12:10:18 +00:00
James RichandClaude Fable 5 b3e3804b78 fix(database): recover from Room's silent connection-pool wedge (#6608) (#6658)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 03:08:37 +00:00
James RichandClaude Opus 5 492afbde5c fix(telemetry): repoint 1-Wire temperature at per-channel fields, adopt ADC voltage (#6653)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 19:39:54 +00:00
James RichandClaude Fable 5 dda971b5ce fix(messaging): time out orphaned "Sending..." messages into a retryable failure (#6630)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 02:10:30 +00:00
James RichandClaude Opus 5 bfb66eb988 fix(data): stop "1 hour" log retention from wiping the MeshLog table (#6635)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 02:01:32 +00:00
simulationstation fd8414abe3 fix(database): delete nodes and metadata atomically (#6623) 2026-08-12 01:36:57 +00:00
simulationstation 7a7bc50a75 fix(messaging): wait for shared-contact routing ACK (#6603) 2026-08-11 15:35:07 +00:00
James RichandClaude Opus 5 1dac0f3ac9 fix(service): unwedge the inbound pipeline behind stale-Connected zombies (#6587)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 00:57:35 +00:00
Jeremiah K 2f191868e9 fix(database): recover wedged observer pools (#6540) 2026-08-01 21:39:16 +00:00
Jeremiah K 064c8c92d9 fix(nodes): suppress alerts during initial database sync (#6538) 2026-08-01 21:38:51 +00:00
James RichandClaude Opus 5 07d253130b refactor(di): replace Koin string qualifiers with distinct types (#6522)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 20:56:07 +00:00
James RichandClaude Opus 5 2d20cd8a47 fix(ui): give rx_snr real presence semantics end to end (#6523)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 16:40:41 +00:00
James RichandClaude Opus 5 d714b22571 chore(deps): bump protobufs to 2.7.26.140 (optional rx_time) (#6510)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 18:08:24 +00:00
James RichandClaude Fable 5 be320ec622 fix(mqtt): stop reporting transport failures as credential rejections (#6506)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 20:09:23 -05:00
James RichandClaude Fable 5 8a4e2e3567 fix(connections): send set_time_only at MyNodeInfo instead of onNodeDbReady (#6503)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 23:14:19 +00:00
James RichandClaude Opus 5 39139398e6 fix(model): rssi explicit presence for protobufs 2.7.26.138 (#6498)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:12:28 +00:00
James RichandClaude Opus 5 6c32af9a84 test: revive 80 dormant tests in eight abstract Common*Test classes (#6501)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:11:42 +00:00