From f3a3f9b5a3e04427feac00a4e1c71b991f2219b8 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Tue, 19 May 2026 10:38:41 +0200 Subject: [PATCH] parse and show p_dop --- gnss_thread.py | 22 +++++++++++----------- plot_tab.py | 5 ++++- sky_plot.py | 20 +++++++++++++------- ubx.py | 29 +++++++++++++++++++++++------ 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/gnss_thread.py b/gnss_thread.py index 4f561b5..7710017 100644 --- a/gnss_thread.py +++ b/gnss_thread.py @@ -6,10 +6,10 @@ import socket import serial from PyQt5.QtCore import QThread, pyqtSignal -from ubx import UbxPacketizer, build_poll, UBX_CLASS_NAV, UBX_ID_NAV_SAT, extract_satellites +from ubx import UbxPacketizer, build_poll, UBX_CLASS_NAV, UBX_ID_NAV_SAT, UBX_ID_NAV_DOP, extract_satellites class GnssReader(QThread): - satellites_updated = pyqtSignal(list) + satellites_updated = pyqtSignal(dict) error_occurred = pyqtSignal(str) connected = pyqtSignal(str) @@ -26,18 +26,18 @@ class GnssReader(QThread): try: self._transport = self._factory() self.connected.emit("Verbunden") - poll_msg = build_poll(UBX_CLASS_NAV, UBX_ID_NAV_SAT) - self._transport.write(poll_msg) - while self._running: + poll_msg = build_poll(UBX_CLASS_NAV, UBX_ID_NAV_SAT) + self._transport.write(poll_msg) + poll_msg = build_poll(UBX_CLASS_NAV, UBX_ID_NAV_DOP) + self._transport.write(poll_msg) chunk = self._transport.read(512) frames = self.packetizer.on_recv(chunk) - sats = extract_satellites(frames) - if sats: - self.satellites_updated.emit(sats) - else: - # Kein Datum – erneut pollen - self._transport.write(poll_msg) + res = extract_satellites(frames) + if 'sat' in res: + self.satellites_updated.emit(res) + if 'dop' in res: + self.satellites_updated.emit(res) except (serial.SerialException, OSError, ConnectionRefusedError, socket.timeout, socket.gaierror) as exc: diff --git a/plot_tab.py b/plot_tab.py index a320b19..6dcfa7f 100644 --- a/plot_tab.py +++ b/plot_tab.py @@ -165,8 +165,11 @@ class SinglePlotPanel(QWidget): active_keys: set[str] = set() if self._field == "pdop": + if pdop is None: + return active_keys.add("PDOP") - self._push("PDOP", ts, pdop if pdop is not None else float("nan")) + print(f"PDOP: {pdop}") + self._push("PDOP", ts, pdop) else: for sat in sats: key = f"{GNSS_NAMES.get(sat['gnssId'], '?')}-{sat['svId']}" diff --git a/sky_plot.py b/sky_plot.py index d84e209..cad8a4c 100644 --- a/sky_plot.py +++ b/sky_plot.py @@ -163,13 +163,19 @@ class MainWindow(QMainWindow): self._conn_panel.set_connected(False) self._status.showMessage("Verbindung getrennt.") - def _on_satellites(self, sats: list): - visible = [s for s in sats if s["elev"] >= 0] - used = sum(1 for s in sats if s["used"]) - self._sat_label.setText(f"Satelliten: {len(visible)} sichtbar, {used} genutzt") - self._sky_plot.update_satellites(visible) - self._table.update_satellites(visible) - self._plot_tab.update_data(visible) # ← neu + def _on_satellites(self, msg: dict): + if 'sat' in msg: + sats = msg['sat'] + visible = [s for s in sats if s["elev"] >= 0] + used = sum(1 for s in sats if s["used"]) + self._sat_label.setText(f"Satelliten: {len(visible)} sichtbar, {used} genutzt") + self._sky_plot.update_satellites(visible) + self._table.update_satellites(visible) + self._plot_tab.update_data(visible) # ← neu + if 'dop' in msg: + dop = msg['dop'] + self._plot_tab.update_data([], pdop=dop['p_dop']) # ← neu + def _on_error(self, msg: str): self._status.showMessage(f"Fehler: {msg}") diff --git a/ubx.py b/ubx.py index 6a189b5..67cced0 100644 --- a/ubx.py +++ b/ubx.py @@ -8,6 +8,8 @@ UBX_SYNC2 = 0x62 UBX_CLASS_NAV = 0x01 UBX_ID_NAV_SAT = 0x35 UBX_ID_NAV_SVINFO = 0x30 +UBX_ID_NAV_DOP = 0x04 + UBX_SYNC_WORD = b'\xb5\x62' @@ -156,12 +158,27 @@ def parse_nav_svinfo(payload: bytes) -> list[dict]: }) return sats -def extract_satellites(frames: list[dict]) -> list[dict]: +def parse_nav_dop(payload: bytes) -> dict: + if len(payload) < 18: + return {} + + i_tow, p_dop, g_dop, t_dop, v_dop, h_dop, n_dop, e_dop = struct.unpack_from( + " dict: for f in frames: if f["cls"] == UBX_CLASS_NAV and f["id"] == UBX_ID_NAV_SAT: - return parse_nav_sat(f["payload"]) + return {'sat': parse_nav_sat(f["payload"])} if f["cls"] == UBX_CLASS_NAV and f["id"] == UBX_ID_NAV_SVINFO: - return parse_nav_svinfo(f["payload"]) - return [] - - + return {'sat': parse_nav_svinfo(f["payload"])} + if f["cls"] == UBX_CLASS_NAV and f["id"] == UBX_ID_NAV_DOP: + return {'dop': parse_nav_dop(f["payload"])} + return {}