Files
skyplot/gnss_thread.py
T
2026-05-19 10:38:41 +02:00

52 lines
1.8 KiB
Python

# ---------------------------------------------------------------------------
# GNSS Lese-Thread
# ---------------------------------------------------------------------------
import socket
import serial
from PyQt5.QtCore import QThread, pyqtSignal
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(dict)
error_occurred = pyqtSignal(str)
connected = pyqtSignal(str)
def __init__(self, transport_factory):
super().__init__()
self._factory = transport_factory
self._running = False
self._transport = None
self.packetizer = UbxPacketizer()
def run(self):
self._running = True
buf = b""
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)
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)
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:
self.error_occurred.emit(str(exc))
finally:
if self._transport:
self._transport.close()
def stop(self):
self._running = False
self.wait(3000)