parse and show p_dop

This commit is contained in:
2026-05-19 10:38:41 +02:00
parent f0d49a3a7c
commit f3a3f9b5a3
4 changed files with 51 additions and 25 deletions
+10 -10
View File
@@ -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")
while self._running:
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_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:
+4 -1
View File
@@ -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']}"
+7 -1
View File
@@ -163,13 +163,19 @@ class MainWindow(QMainWindow):
self._conn_panel.set_connected(False)
self._status.showMessage("Verbindung getrennt.")
def _on_satellites(self, sats: list):
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}")
+23 -6
View File
@@ -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(
"<IHHHHHHH", payload
)
scale = 0.01
res = {
"p_dop": p_dop*scale, "g_dop": g_dop*scale, "t_dop": t_dop*scale,
"v_dop": v_dop*scale, "h_dop": h_dop*scale, "n_dop": n_dop*scale, "e_dop": e_dop*scale
}
return res
def extract_satellites(frames: list[dict]) -> 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 {}