#!/usr/bin/env python3 """ GNSS Sky Plot Viewer Unterstützt UBX über serielle Schnittstelle UND TCP/IP (Ser2net). TCP/IP-Verbindungen werden in einer persistenten LRU-Liste (max. 5) gespeichert. """ import sys from PyQt5.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QStatusBar, QSplitter, ) from PyQt5.QtCore import Qt from connection_panel import ConnectionPanel from gnss_thread import GnssReader from sat_table import SatelliteTable from sky_plot_widget import SkyPlotWidget # --------------------------------------------------------------------------- # Hauptfenster # --------------------------------------------------------------------------- class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("GNSS Sky Plot – UBX | Seriell + TCP/IP") self.resize(980, 680) self.setStyleSheet("background-color: #12192b; color: #cccccc;") self._reader = None self._build_ui() def _build_ui(self): central = QWidget() self.setCentralWidget(central) root = QVBoxLayout(central) root.setContentsMargins(8, 8, 8, 8) # Obere Leiste top = QHBoxLayout() self._conn_panel = ConnectionPanel() self._conn_panel.connect_requested.connect(self._connect) self._conn_panel.disconnect_requested.connect(self._disconnect) top.addWidget(self._conn_panel) self._sat_label = QLabel("Satelliten: –") self._sat_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self._sat_label.setStyleSheet("font-size: 13px; color: #7ab7d4;") top.addStretch() top.addWidget(self._sat_label) root.addLayout(top) # Splitter: Sky Plot | Tabelle splitter = QSplitter(Qt.Horizontal) self._sky_plot = SkyPlotWidget() self._table = SatelliteTable() splitter.addWidget(self._sky_plot) splitter.addWidget(self._table) splitter.setSizes([540, 380]) root.addWidget(splitter) self._status = QStatusBar() self.setStatusBar(self._status) self._status.showMessage("Nicht verbunden.") def _connect(self, factory, label: str): self._reader = GnssReader(factory) self._reader.satellites_updated.connect(self._on_satellites) self._reader.error_occurred.connect(self._on_error) self._reader.connected.connect( lambda msg: self._status.showMessage(f"{msg}: {label}") ) self._reader.start() self._conn_panel.set_connected(True) self._status.showMessage(f"Verbinde mit {label} …") def _disconnect(self): if self._reader: self._reader.stop() self._reader = None 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) def _on_error(self, msg: str): self._status.showMessage(f"Fehler: {msg}") self._disconnect() def closeEvent(self, event): self._disconnect() super().closeEvent(event) # --------------------------------------------------------------------------- if __name__ == "__main__": app = QApplication(sys.argv) app.setStyle("Fusion") win = MainWindow() win.show() sys.exit(app.exec_())