25 Commits
Author SHA1 Message Date
jens 51727f9e24 gui: prune stale satellites from sky tab on each NAV-SAT update
Satellites that dropped out of a receiver's NAV-SAT report (set
below horizon, lost signal) were never removed from the sky tab's
store/trail/highlight-timer dicts, only on full receiver removal.
Over a long session this let ghost satellites accumulate without
bound, making table rebuilds and sky-plot rendering progressively
more expensive and the GUI increasingly laggy.
2026-07-17 17:23:57 +02:00
jens f7af4e5b31 gui: add checkable constellation legend to filter sky plot by GNSS system
Replaces the static painted legend with real checkboxes (one per
GNSS system, color-swatched to match GNSS_COLORS) so users can
toggle which constellations show in the sky plot and satellite
table, mirroring the existing receiver-source filter checkboxes.
2026-07-17 15:52:30 +02:00
jensandClaude Sonnet 5 eb18b1485f network_backend: use resolved device name in console output
NetworkBackend's connect/send/lost/error prints always used the
connect-time registration name, so GUI console output kept showing
the placeholder counter ID even after MON-VER resolved the real
device name. Add a display_name per socket (defaults to name, kept
separate from the routing key used by find_by_name/register_xcvr) and
have the GUI update it once MON-VER responds.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM4FNUjhu9x8df5Dp1hHvd
2026-07-16 20:43:45 +02:00
jensandClaude Sonnet 5 87d75aafc0 gui: fix connection history retaining stale counter-based ID
_push_lru ran right after connect, before MON-VER resolves the device
name, so history entries kept the placeholder ID forever. Dedupe LRU
entries by connection endpoint (host/port, serial port, or file path)
instead of by receiver_id, and re-push once the device name is known
so the corrected entry replaces the placeholder instead of duplicating
it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM4FNUjhu9x8df5Dp1hHvd
2026-07-16 20:30:20 +02:00
jensandClaude Sonnet 5 2dba3a9a2f add UBX-MON-VER support and surface device identification in CLI/GUI
Add the Ver message parser and a fixed UbxQuery (was unused and had a
broken semaphore/state bug) to poll MON-VER once on connect. The CLI
prints hw/sw version and extensions; the GUI polls it per receiver,
pre-fills the read-only ID field with a connection counter and
rewrites it from the MOD= extension once the device answers, and
propagates the resolved display name to the Sky and Plot tabs so they
no longer show the stale placeholder ID.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM4FNUjhu9x8df5Dp1hHvd
2026-07-16 20:22:25 +02:00
jensandClaude Sonnet 5 b3447a28c5 harden UBX parsing/dispatch and report peer-side disconnects in GUI
A struct size-mismatch or any other parse error in a listener could
propagate uncaught out of the socket-reading thread and silently kill
it. Catch broadly in the event loop and per-listener in call_listener,
and make the NAV-SAT/NAV-SIG/RXM-RAWX group parsers tolerate a
payload length that isn't an exact multiple of the group size instead
of crashing on a short struct.unpack.

Also wire NetworkBackend's socket-loss detection through to
ReceiverManager (via a queued signal, since the callback fires from
the backend thread) so the GUI reflects a peer-initiated disconnect
instead of leaving the row stuck showing "connected". Verified against
a real ZED-X20P: it drops the TCP session on its own after ~20-28s
regardless of traffic; the GUI now marks the receiver disconnected and
frees its ID for reconnecting.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AzmCaNjDb3TAqPpTwunKTY
2026-07-15 22:00:29 +02:00
jensandClaude Sonnet 4.6 e7474efed9 gui: file delay 10 ms resolution, range 0–1 s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 14:54:43 +02:00
jensandClaude Sonnet 4.6 cd5508c4d0 gui: fix reconnect after disconnect on same row
disconnect_receiver left the rid in _states, causing the duplicate-ID
check to fire on reconnect. Use remove_receiver instead (which cleans
up _states/_configs) and reset _rid to None.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 13:23:18 +02:00
jensandClaude Sonnet 4.6 dce570460e replay: delay per complete frame instead of per chunk
ReplayPacer (MsgListener+MsgTalker) sits between packetizer output and
downstream listeners; sleeps after each complete NMEA/UBX frame before
forwarding. FileBackend no longer owns the delay — it reads as fast as
possible and the pacer provides back-pressure on the same thread.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 13:11:40 +02:00
jensandClaude Sonnet 4.6 ff686b64f7 gui: add File source type to connection tab
- ConnectionConfig: new file_path and delay fields
- ConnectionRow: File page with path input, Browse button, delay
  spinner (0–10 s), and auto-fill of receiver-ID from filename
- ReceiverManager.connect_receiver: FileBackend wired for 'file' type;
  UBX poll timer skipped for file sources
- FileBackend.register_xcvr: fallback to first unoccupied entry when
  name does not match filename pattern

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 12:47:28 +02:00
jensandClaude Sonnet 4.6 9ae3667123 backend: rename serial.py to serial_backend.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:22:46 +02:00
jensandClaude Sonnet 4.6 68f8196fbb backend: rename network.py to network_backend.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:21:50 +02:00
jensandClaude Sonnet 4.6 4ab9a349a2 backend: move gui/backends.py to backend/serial.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:18:55 +02:00
jensandClaude Sonnet 4.6 53ed665f44 backend: move NetworkBackend and ABackend into backend/ folder
- network_backend.py -> backend/network.py
- a_backend.py -> backend/a_backend.py
- update all imports accordingly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:16:23 +02:00
jensandClaude Sonnet 4.6 5efef47f1a data_model: add NavIC (GNSS id 7) to names, shorts, and colors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 19:08:56 +02:00
jensandClaude Sonnet 4.6 d54259a772 sky tab: add Msg column with 10s activity indicator per satellite row
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 17:33:43 +02:00
jensandClaude Sonnet 4.6 7862989fd4 sky tab: extend trail storage to 24h, add visible trail depth spinbox
Trail history increased from 1h to 24h (86400 points). Added a spinbox
(0-24h, default 1h) next to 'Show Trails' to control how much trail is
rendered; spinbox is disabled when trails are off.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:08:13 +02:00
jensandClaude Sonnet 4.6 7fe6c34fd2 sky tab: replace per-satellite trail toggle with global 'Show Trails' checkbox
Removed Trail column from satellite table. Added a single 'Show Trails'
checkbox in the source selector box that enables/disables all trails at once.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:55:31 +02:00
jensandClaude Sonnet 4.6 1522a2eb6a sky plot: add per-satellite trajectory trails
- Store up to 1 hour of (elevation, azimuth) history per satellite/source
- Trail column in satellite table (checkbox, default off); clicking the
  column header toggles all trails on/off
- Trail rendered in GNSS color with alpha fading from 15 (oldest) to 200
  (newest), subsampled to max 120 points for render performance
- Trail column fixed at 42 px to avoid checkbox + empty-text visual split

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 13:23:14 +02:00
jensandClaude Sonnet 4.6 19cf6fa05e plot tab: fix y-axis scaling, add Visible/Used Sats modes, right-click menu
- Fix _nice_ticks: use floor for first tick and ceil for last tick so the
  tick range always fully brackets the data; data was previously clipped
  when the maximum fell between two nice tick values
- Add 5% headroom padding so data does not sit flush against plot edges
- Add 'Visible Sats' and 'Used Sats' y-axis modes (global, like pDOP)
- Right-click context menu on plot canvas: Save as PNG and Copy to clipboard

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 12:46:52 +02:00
jensandClaude Sonnet 4.6 495f4c15c9 sky tab: add per-receiver info bar with pDOP, visible and used satellite counts
One card per receiver showing receiver ID, pDOP, visible satellites and
used satellites. Cards are added/removed dynamically with receivers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 12:27:36 +02:00
jensandClaude Sonnet 4.6 07444fd299 sky tab: decouple table rebuilds from sky updates, update cells in-place
- Sky widget always gets the latest data immediately (off-thread render)
- Table rebuilds throttled to ~2 Hz via single-shot QTimer
- Cell values updated in-place when satellite set is unchanged, preserving
  scroll position; full rebuild only when satellites appear/disappear

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 12:18:49 +02:00
jens d492e32a8b plot tab remembers now value, satellite, points 2026-05-24 12:07:41 +02:00
jens 45ef58ea8d refactored connection tab 2026-05-24 11:59:34 +02:00
jens 561d4ad77f added gui 2026-05-24 11:52:03 +02:00