# --------------------------------------------------------------------------- # 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, extract_satellites class GnssReader(QThread): satellites_updated = pyqtSignal(list) 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") poll_msg = build_poll(UBX_CLASS_NAV, UBX_ID_NAV_SAT) self._transport.write(poll_msg) while self._running: 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) 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)