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
This commit is contained in:
2026-07-16 20:22:25 +02:00
co-authored by Claude Sonnet 5
parent d506f9afe0
commit 2dba3a9a2f
8 changed files with 176 additions and 27 deletions
+18 -1
View File
@@ -34,6 +34,7 @@ class SkyTab(QWidget):
self._pdop: dict = {} # rid -> float
self._info_cards: dict = {} # rid -> QFrame
self._info_labels: dict = {} # rid -> (lbl_pdop, lbl_visible, lbl_used)
self._name_labels: dict = {} # rid -> QLabel (receiver display name)
self._trail: dict = {} # (rid, gnss_id, sv_id) -> deque[(elev, azim)]
self._hi_timers: dict = {} # (rid, gnss_id, sv_id) -> QTimer
@@ -113,6 +114,7 @@ class SkyTab(QWidget):
model.receiver_removed.connect(self._on_receiver_removed)
model.satellite_update.connect(self._on_sat_update)
model.pdop_update.connect(self._on_pdop_update)
model.version_update.connect(self._on_version_update)
# ── Source list management ────────────────────────────────────────────────
@@ -136,6 +138,7 @@ class SkyTab(QWidget):
cl.addWidget(w)
self._info_cards[rid] = card
self._info_labels[rid] = (lbl_pdop, lbl_visible, lbl_used)
self._name_labels[rid] = name_lbl
self._info_layout.insertWidget(self._info_layout.count() - 1, card)
def _on_receiver_removed(self, rid: str):
@@ -151,6 +154,20 @@ class SkyTab(QWidget):
self._info_layout.removeWidget(card)
card.deleteLater()
self._info_labels.pop(rid, None)
self._name_labels.pop(rid, None)
self._refresh_immediate()
def _on_version_update(self, rid: str, device_id: str, sw_version: str):
label = self._model.display_name(rid)
for i in range(self._src_list.count()):
item = self._src_list.item(i)
if item.data(Qt.UserRole) == rid:
item.setText(f" {label} ")
break
lbl = self._name_labels.get(rid)
if lbl:
lbl.setText(f"<b>{label}</b>")
self._table_keys = [] # force a full rebuild so the Receiver column updates
self._refresh_immediate()
def _selected_rids(self) -> set:
@@ -297,7 +314,7 @@ class SkyTab(QWidget):
self._table.setItem(row, 3, cell(f"{sat.azimuth:.0f}"))
self._table.setItem(row, 4, cell(f"{sat.cno:.1f}"))
self._table.setItem(row, 5, cell("" if sat.used_in_fix else ""))
self._table.setItem(row, 6, cell(rid))
self._table.setItem(row, 6, cell(self._model.display_name(rid)))
msg_item = QTableWidgetItem("")
msg_item.setTextAlignment(Qt.AlignCenter)
msg_item.setBackground(brush)