- обновлён простой режим: тест цвета и проверка подсветки кнопок объединены в раздел «Тест подсветки» - добавлена проверка подсветки кнопок через 8-й силовой выход с автоматическим коротким тестом - упрощены описания пользовательских проверок и убраны лишние технические подробности из простого режима - изменена раскладка теста цвета, увеличена длительность шага до 1 секунды и убраны описания из PRO-блока - добавлена защита выпадающих списков от случайного изменения колесом мыши - улучшены немодальные PRO-диалоги, настройки соединения и обработка событий COM-порта - обновлены визуальные детали приложения, пользовательские ресурсы, инструкции AGENTS и Release Notes 1.3.0
126 lines
4.9 KiB
Python
126 lines
4.9 KiB
Python
"""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
|