"""Inline-секция проверки подсветки кнопок через 8-й силовой выход.""" from __future__ import annotations from PySide6.QtCore import QTimer from PySide6.QtWidgets import ( QGroupBox, QHBoxLayout, QLabel, QMessageBox, QPushButton, QVBoxLayout, QWidget, ) from ...services.com_service import ComConnection from ...ui.icons import get_icon_color, get_icon_muted, icon _BUTTON_BACKLIGHT_INDEX = 7 # Пользовательский "8-й выход" в протоколе имеет индекс 7. _BACKLIGHT_ON_CMD = f"21{_BUTTON_BACKLIGHT_INDEX}1" _BACKLIGHT_OFF_CMD = f"21{_BUTTON_BACKLIGHT_INDEX}0" class ButtonBacklightSection(QWidget): """Проверка подсветки кнопок в базовом режиме.""" def __init__(self, connection: ComConnection, parent: QWidget | None = None) -> None: super().__init__(parent) self._conn = connection self._pulse_timer = QTimer(self) self._pulse_timer.setSingleShot(True) self._pulse_timer.timeout.connect(self._finish_pulse_test) self._setup_ui() def _setup_ui(self) -> None: root = QVBoxLayout(self) root.setContentsMargins(0, 0, 0, 0) root.setSpacing(10) group = QGroupBox("Подсветка кнопок (8-й силовой выход)") layout = QVBoxLayout(group) desc = QLabel( "Проверяет подсветку кнопок. Нажмите «Включить» и убедитесь, что кнопки загорелись, " "затем нажмите «Выключить» и проверьте, что подсветка погасла. " "Кнопка «Проверить» включает подсветку на короткое время автоматически." ) desc.setWordWrap(True) desc.setObjectName("HelpText") layout.addWidget(desc) row = QHBoxLayout() self._on_btn = QPushButton("Включить") self._on_btn.setProperty("role", "primary") self._on_btn.setIcon(icon("fa5s.lightbulb", color="#ecfdf5")) self._on_btn.clicked.connect(lambda: self._send(_BACKLIGHT_ON_CMD)) row.addWidget(self._on_btn) self._off_btn = QPushButton("Выключить") self._off_btn.setIcon(icon("fa5s.power-off", color=get_icon_color())) self._off_btn.clicked.connect(lambda: self._send(_BACKLIGHT_OFF_CMD)) row.addWidget(self._off_btn) self._pulse_btn = QPushButton("Проверить") self._pulse_btn.setIcon(icon("fa5s.play", color=get_icon_muted())) self._pulse_btn.clicked.connect(self._run_pulse_test) row.addWidget(self._pulse_btn) row.addStretch() layout.addLayout(row) self._log = QLabel("") self._log.setObjectName("LogLabel") self._log.setWordWrap(True) layout.addWidget(self._log) root.addWidget(group) def refresh_icons(self) -> None: clr = get_icon_color() muted = get_icon_muted() self._on_btn.setIcon(icon("fa5s.lightbulb", color="#ecfdf5")) self._off_btn.setIcon(icon("fa5s.power-off", color=clr)) self._pulse_btn.setIcon(icon("fa5s.play", color=muted)) def shutdown(self) -> None: if self._pulse_timer.isActive(): self._pulse_timer.stop() self._pulse_btn.setEnabled(True) if self._conn.is_connected: self._send(_BACKLIGHT_OFF_CMD) def _run_pulse_test(self) -> None: if not self._conn.is_connected: QMessageBox.warning(self, "Ошибка", "Порт не подключён.") return self._pulse_btn.setEnabled(False) if self._send(_BACKLIGHT_ON_CMD): self._log.setText("Подсветка включена на 1,5 секунды. Проверьте, что кнопки загорелись.") self._pulse_timer.start(1500) else: self._pulse_btn.setEnabled(True) def _finish_pulse_test(self) -> None: self._send(_BACKLIGHT_OFF_CMD) self._pulse_btn.setEnabled(True) self._log.setText("Проверка завершена: подсветка должна погаснуть.") def _send(self, cmd: str) -> bool: if not self._conn.is_connected: QMessageBox.warning(self, "Ошибка", "Порт не подключён.") return False try: self._conn.send_command(cmd) self._log.setText(f"→ {cmd}") resp = self._conn.read_response(timeout=0.3) self._conn.release() if resp: self._log.setText(f"→ {cmd}\n← {resp}") return True except Exception as exc: self._conn.release() self._log.setText(f"Ошибка: {exc}") return False