Commit Graph
10 Commits
Author SHA1 Message Date
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 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 3f6f403b7b network_backend: fix crash on lost/refused connection
getpeername() raised ENOTCONN when a connect failed or the peer
closed the socket, crashing the event loop thread. Identify sockets
via the selector key's data (set at register time) instead, and
catch OSError on recv/send to cleanly close and unregister a dead
socket rather than crashing.

Also fix select(timeout=100) which waited 100 seconds instead of
100ms, causing stop() to hang after a dead socket was unregistered.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 20:48:17 +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 eba3a9dde9 main: full CLI config with network/serial/file sources and JSON project export
- --network NAME HOST PORT  (repeatable)
- --serial  NAME DEVICE BAUD  (repeatable)
- --file    PATH  (repeatable, replayed via FileBackend)
- --log-dir DIR   (frame logging, default ./log)
- --delay   SECS  (file replay inter-frame delay, default 1.0)
- --project FILE  load config from JSON project file
- --save    FILE  export current config as JSON project file

Multiple source types can be combined. Network sources share one
NetworkBackend; serial sources each get their own SerialBackend;
file sources share one FileBackend. The poll loop runs only for
network sources; file-only mode joins the reader threads; serial-only
mode blocks on signal.pause().

file_backend: rename _source_id -> source_id_from_path (public),
add join() to wait for reader threads.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:44:34 +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