diff --git a/interface.py b/interface.py index e3660bc..10508c7 100644 --- a/interface.py +++ b/interface.py @@ -133,7 +133,8 @@ def readControllerCurrentsAndData() -> bool: dmx_address_field.delete(0, tk.END) dmx_address_field.insert(tk.END, str(address)) - global modes + global modesself.ui.DeviceSelection.addItems(['/dev/ttyUSB0', '/dev/ttyUSB2']) + modes = [] setStatus(f'Чтение режимов {controller.controller.ser.port}...') diff --git a/main.py b/main.py index d2cd756..b88b7bd 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,9 @@ +import time + from PyQt6 import QtCore, QtGui, QtWidgets from ui import Ui_Controller import controller.controller_reifined as controller -controller = controller.ControllerInterface(controller.ControllerRefined(0xFFFFFFFFFFFF, 0x112233445542)) class Window(QtWidgets.QMainWindow): def __init__(self): @@ -10,8 +11,29 @@ class Window(QtWidgets.QMainWindow): self.ui = Ui_Controller() self.ui.setupUi(self) - self.hoverFilter = self.ComboBoxHoverEventFilter(self.ui.DeviceSelection, self.hover) + # controller + self.controller = controller.ControllerInterface(controller.ControllerRefined(0xFFFFFFFFFFFF, 0x112233445542)) + # dev selection + self.hoverFilter = self.ComboBoxHoverEventFilter(self.ui.DeviceSelection, self.refreshDeviceList) + self.connected = False + + # qt styles + self.redLineEdit = "QLineEdit { background: rgb(255, 0, 0); selection-background-color: rgb(111, 136, 222); }" + self.defLineEdit = "QLineEdit { }" + + # object containers + self.currentFields = [ + self.ui.Current1Field, + self.ui.Current2Field, + self.ui.Current3Field, + self.ui.Current4Field, + ] + + # modes, currents, etc + self.modes = [] + + # connect signals self.connectMethods() class ComboBoxHoverEventFilter(QtCore.QObject): @@ -21,20 +43,105 @@ class Window(QtWidgets.QMainWindow): self.onEnter = onEnter def eventFilter(self, obj, event): - if event.type() == QtCore.QEvent.Type.Enter: # Наведение мыши + if event.type() == QtCore.QEvent.Type.Enter: self.onEnter() return super().eventFilter(obj, event) def connectMethods(self): - self.ui.DeviceSelection.addItems(['/dev/ttyUSB1', '/dev/ttyUSB2']) - self.ui.DeviceSelection.currentTextChanged.connect(self.deviceSelected) + self.ui.DeviceSelection.activated.connect(self.deviceSelected) self.ui.DeviceSelection.installEventFilter(self.hoverFilter) - def deviceSelected(self, device: str): + def resetAllStyles(self) -> None: + for f in self.currentFields: + f.setStyleSheet(self.defLineEdit) + + def clearAllFields(self) -> None: + for f in self.currentFields: + f.setText("") + + def setStatus(self, text: str) -> None : + print(text) + + def deviceSelected(self, deviceIndex: int): + device = self.ui.DeviceSelection.itemText(deviceIndex) + self.connected = False + self.resetAllStyles() + self.clearAllFields() + + self.setStatus(f'Подключение к {device}...') + + self.controller.close() + self.controller.connect(device) + print(device) - def hover(self): - print('a') + if self.readControllerCurrentsAndData(): + self.setStatus(f'Выбранный порт: {device}') + self.connected = True + else: + self.setStatus(f'Не удалось подключиться к {device}') + self.ui.DeviceSelection.clear() + self.connected = False + self.controller.close() + + def readControllerCurrentsAndData(self) -> bool: + self.setStatus(f'Чтение токов {self.controller.controller.ser.port}...') + values = self.controller.readCurrents() + + if not values: + for f in self.currentFields: + f.setStyleSheet(self.redLineEdit) + else: + for i, f in enumerate(self.currentFields): + f.setStyleSheet(self.defLineEdit) + f.setText(str(values[i] * 10)) + + self.setStatus(f'Чтение адреса {self.controller.controller.ser.port}...') + address = self.controller.readAddress() + + if address == -1: + self.ui.DmxAddressField.setStyleSheet(self.redLineEdit) + else: + self.ui.DmxAddressField.setStyleSheet(self.defLineEdit) + self.ui.DmxAddressField.setText(str(address)) + + self.modes = [] + + self.setStatus(f'Чтение режимов {self.controller.controller.ser.port}...') + dev_info = self.controller.readDeviceInfo() + if dev_info: + mode_count = dev_info[2] + for index in range(mode_count): + self.setStatus(f'Чтение режима {index + 1} {self.controller.controller.ser.port}...') + mode = self.controller.readMode(index) + if not mode: + self.modes = [] + break + self.modes.append(mode) + time.sleep(0.05) + + if not self.modes: + self.ui.ModeSelection.clear() + self.ui.ModeSelection.setCurrentText('ERROR') + else: + self.ui.ModeSelection.setStyleSheet('QComboBox {}') + self.ui.ModeSelection.clear() + for m in self.modes: + self.ui.ModeSelection.addItem(m[1]) + + mode_names = [] + for index, m in enumerate(self.modes): + mode_names.append(f'{index + 1}:{m[1]}') + + self.ui.ModeSelection.setCurrentText(mode_names[dev_info[1] - 1]) + self.ui.ModeSelection.clear() + self.ui.ModeSelection.addItems(mode_names) + + return values or address != -1 or self.modes + + def refreshDeviceList(self): + self.ui.DeviceSelection.clear() + self.ui.DeviceSelection.addItems(self.controller.readComPorts()) if __name__ == '__main__': import sys diff --git a/ui.py b/ui.py index 7b50464..45f7b4e 100644 --- a/ui.py +++ b/ui.py @@ -186,7 +186,6 @@ class Ui_Controller(object): _translate = QtCore.QCoreApplication.translate Controller.setWindowTitle(_translate("Controller", "Controller")) self.ComPort.setText(_translate("Controller", "COM Порт:")) - self.DeviceSelection.setItemText(0, _translate("Controller", "/dev/ttyUSB0")) self.DmxAddress.setText(_translate("Controller", "DMX Адрес:")) self.DmxAddressField.setText(_translate("Controller", "10")) self.DmxAddressField.setPlaceholderText(_translate("Controller", "no data"))