diff options
| author | Christian Kolset <christian.kolset@gmail.com> | 2026-04-13 15:22:56 -0600 |
|---|---|---|
| committer | Christian Kolset <christian.kolset@gmail.com> | 2026-04-13 15:22:56 -0600 |
| commit | 2ed9d37da7b27d25173535550fb92702225ac14e (patch) | |
| tree | d6ff360a656e577629d3cefdaa1ae02af7255864 /daq_system/ui/readout_panel.py | |
| parent | 8d6acf3a8ea4b37f86b321dbf430be5be01b1267 (diff) | |
Removed QtPy5 snippet and fixed directories
Diffstat (limited to 'daq_system/ui/readout_panel.py')
| -rw-r--r-- | daq_system/ui/readout_panel.py | 128 |
1 files changed, 0 insertions, 128 deletions
diff --git a/daq_system/ui/readout_panel.py b/daq_system/ui/readout_panel.py deleted file mode 100644 index 6086c30..0000000 --- a/daq_system/ui/readout_panel.py +++ /dev/null @@ -1,128 +0,0 @@ -""" -ui/readout_panel.py - -Right-side numeric readout panel. Shows current value for every channel -with a colored bar indicator and alarm highlighting. -""" - -from PyQt6.QtWidgets import ( - QWidget, QVBoxLayout, QHBoxLayout, QLabel, - QScrollArea, QFrame, QProgressBar -) -from PyQt6.QtCore import Qt, pyqtSlot -from PyQt6.QtGui import QColor - -from devices.device_registry import DeviceRegistry - - -class ChannelReadout(QFrame): - def __init__(self, device_name: str, channel_config, parent=None): - super().__init__(parent) - self.ch = channel_config - self.device_name = device_name - self.setObjectName("channelReadout") - self._alarm_active = False - self._build() - - def _build(self): - layout = QVBoxLayout(self) - layout.setContentsMargins(8, 6, 8, 6) - layout.setSpacing(2) - - top = QHBoxLayout() - self.name_lbl = QLabel(f"{self.ch.name}") - self.name_lbl.setObjectName("readoutName") - top.addWidget(self.name_lbl) - top.addStretch() - self.value_lbl = QLabel("---") - self.value_lbl.setObjectName("readoutValue") - self.value_lbl.setStyleSheet(f"color: {self.ch.color};") - top.addWidget(self.value_lbl) - unit = QLabel(self.ch.unit) - unit.setObjectName("readoutUnit") - top.addWidget(unit) - layout.addLayout(top) - - # Mini bar - self.bar = QProgressBar() - self.bar.setRange(0, 1000) - self.bar.setValue(0) - self.bar.setTextVisible(False) - self.bar.setMaximumHeight(4) - self.bar.setObjectName("readoutBar") - self.bar.setStyleSheet( - f"QProgressBar::chunk {{ background: {self.ch.color}; border-radius: 2px; }}" - ) - layout.addWidget(self.bar) - - def update_value(self, value: float): - self.value_lbl.setText(f"{value:.3f}") - rng = self.ch.max_value - self.ch.min_value - if rng > 0: - norm = int(((value - self.ch.min_value) / rng) * 1000) - self.bar.setValue(max(0, min(1000, norm))) - - def set_alarm(self, active: bool): - if active != self._alarm_active: - self._alarm_active = active - self.setProperty("alarm", active) - self.style().unpolish(self) - self.style().polish(self) - - -class ReadoutPanel(QWidget): - def __init__(self, registry: DeviceRegistry): - super().__init__() - self.registry = registry - self._readouts: dict = {} # (device_id, channel_id) -> ChannelReadout - self._build_ui() - self.refresh() - - def _build_ui(self): - layout = QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(0) - - hdr = QLabel(" CHANNELS") - hdr.setObjectName("panelHeader") - layout.addWidget(hdr) - - scroll = QScrollArea() - scroll.setWidgetResizable(True) - scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) - - self._container = QWidget() - self._inner = QVBoxLayout(self._container) - self._inner.setContentsMargins(6, 6, 6, 6) - self._inner.setSpacing(4) - self._inner.addStretch() - - scroll.setWidget(self._container) - layout.addWidget(scroll) - - def refresh(self): - for w in self._readouts.values(): - self._inner.removeWidget(w) - w.deleteLater() - self._readouts.clear() - - for dev in self.registry.all_instances(): - for ch in dev.info.channels: - if not ch.enabled: - continue - ro = ChannelReadout(dev.info.name, ch) - self._inner.insertWidget(self._inner.count() - 1, ro) - self._readouts[(dev.info.device_id, ch.channel_id)] = ro - - @pyqtSlot(str, str, float, float) - def on_new_data(self, device_id: str, channel_id: str, timestamp: float, value: float): - ro = self._readouts.get((device_id, channel_id)) - if ro: - ro.update_value(value) - ch = ro.ch - alarm = False - if ch.alarm_low is not None and value < ch.alarm_low: - alarm = True - if ch.alarm_high is not None and value > ch.alarm_high: - alarm = True - ro.set_alarm(alarm) |
