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:
+18
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user