From 948a2df60f342536c79113cf3622f25eb5979394 Mon Sep 17 00:00:00 2001 From: livefish Date: Tue, 21 Jan 2025 00:00:09 +0300 Subject: [PATCH] Continued fixes --- controller/controller_reifined.py | 18 ++-- interface.py | 6 +- main.py | 166 +++++++++++++++++++++++++++--- 3 files changed, 165 insertions(+), 25 deletions(-) diff --git a/controller/controller_reifined.py b/controller/controller_reifined.py index b447703..b804039 100644 --- a/controller/controller_reifined.py +++ b/controller/controller_reifined.py @@ -1,3 +1,4 @@ + import glob import sys import time @@ -181,14 +182,14 @@ class ControllerInterface: "currents set": (0xBE, 0xEE), "currents get": (0xBE, 0xEF), "powers": (0xBE, 0x10), - # "address": (0xBF, 0x20), - # "device info": (0xBF, 0x00), - # "device mode set": (0xBF, 0x10), - # "device mode get": (0xBF, 0x11), - "address": (0x00, 0xF0), - "device info": (0x00, 0x60), - "device mode set": (0x00, 0xE0), - "device mode get": (0x00, 0xE1), + "address": (0xBF, 0x20), + "device info": (0xBF, 0x00), + "device mode set": (0xBF, 0x10), + "device mode get": (0xBF, 0x11), + # "address": (0x00, 0xF0), + # "device info": (0x00, 0x60), + # "device mode set": (0x00, 0xE0), + # "device mode get": (0x00, 0xE1), } # Currents # @@ -302,3 +303,4 @@ class ControllerInterface: except (OSError, SerialException): pass return result + diff --git a/interface.py b/interface.py index 4f87d2b..456d751 100644 --- a/interface.py +++ b/interface.py @@ -388,8 +388,7 @@ def finish(): win.destroy() controller.close() - -if __name__ == "__main__": +def power_test() -> None: controller.connect("/dev/ttyUSB0") pws = controller.readPowers() @@ -401,6 +400,9 @@ if __name__ == "__main__": pws = controller.readPowers() print(pws) + + +if __name__ == "__main__": win.configure(width=270, height=350) win.resizable(False, False) win.title("Controllers") diff --git a/main.py b/main.py index d743a50..1d2c40d 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ import time +from threading import Timer from PyQt6 import QtCore, QtGui, QtWidgets from ui import Ui_Controller @@ -22,6 +23,11 @@ class Window(QtWidgets.QMainWindow): self.redLineEdit = "QLineEdit { background: rgb(255, 0, 0); selection-background-color: rgb(111, 136, 222); }" self.defLineEdit = "QLineEdit { }" + # button click times + self.last_click_time = 0 + + self.savedStatus = "" + # object containers self.currentFields = [ self.ui.Current1Field, @@ -36,21 +42,6 @@ class Window(QtWidgets.QMainWindow): # connect signals self.connectMethods() - class ComboBoxHoverEventFilter(QtCore.QObject): - def __init__(self, parent, onEnter): - super().__init__(parent) - self.parent = parent - self.onEnter = onEnter - - def eventFilter(self, obj, event): - if event.type() == QtCore.QEvent.Type.Enter: - self.onEnter() - return super().eventFilter(obj, event) - - def connectMethods(self): - self.ui.DeviceSelection.activated.connect(self.deviceSelected) - self.ui.DeviceSelection.installEventFilter(self.hoverFilter) - def resetAllStyles(self) -> None: for f in self.currentFields: f.setStyleSheet(self.defLineEdit) @@ -59,11 +50,21 @@ class Window(QtWidgets.QMainWindow): for f in self.currentFields: f.setText("") + + def resetStatus(self) -> None: + self.setStatus(self.savedStatus) + def setStatus(self, text: str) -> None : print(text) self.ui.Status.setText(text) self.repaint() + def setTempStatus(self, new_status: str, reset_time: float) -> None: + if self.ui.Status.text() != new_status: + self.savedStatus = self.ui.Status.text() + self.setStatus(new_status) + Timer(reset_time, self.resetStatus).start() + def deviceSelected(self, deviceIndex: int): device = self.ui.DeviceSelection.itemText(deviceIndex) self.connected = False @@ -86,6 +87,14 @@ class Window(QtWidgets.QMainWindow): self.connected = False self.controller.close() + def connectionLost(self) -> None: + self.controller.close() + self.setStatus('Пожалуйста, выберите порт') + self.setTempStatus(f'Подключение к {self.controller.controller.ser.port} потеряно!', 2) + self.resetAllStyles() + self.ui.DeviceSelection.clear() + self.clearAllFields() + def readControllerCurrentsAndData(self) -> bool: self.setStatus(f'Чтение токов {self.controller.controller.ser.port}...') values = self.controller.readCurrents() @@ -141,10 +150,137 @@ class Window(QtWidgets.QMainWindow): return values or address != -1 or self.modes + def writeCurrentsAddressAndMode(self) -> None: + toWrite = [] + for f in self.currentFields: + x = f.text() + if x != "": + toWrite.append(int(x) // 10) + else: + toWrite.append(0) + + (self. + setStatus(f'Запись токов в {self.controller.controller.ser.port}...')) + print(f'Writing... {toWrite}') + if not self.controller.writeCurrents(toWrite): + self.connectionLost() + return + + self.setStatus(f'Запись адреса в {self.controller.controller.ser.port}...') + if self.ui.DmxAddressField.text() != "" and not self.controller.writeAddress(int(self.ui.DmxAddressField.text())): + self.connectionLost() + return + + # TODO Mode is not being written + self.setStatus(f'Запись режима в {self.controller.controller.ser.port}...') + if not self.controller.writeMode(self.ui.ModeSelection.currentIndex() + 1): + self.connectionLost() + return + + if not self.ui.Check.isChecked(): + self.setStatus(f'Выбранный порт: {self.controller.controller.ser.port}') + self.setTempStatus(f'Данные были записаны в {self.controller.controller.ser.port}', 1) + else: + time.sleep(0.5) + dmx_save = self.ui.DmxAddressField.text() + pers_save = self.ui.Personality.text() + currents_save = [] + for entry in self.currentFields: + currents_save.append(entry.text()) + + self.setStatus(f'Чтение адреса: {self.controller.controller.ser.port}...') + dmx_real = self.controller.readAddress() + + self.setStatus(f'Чтение режима: {self.controller.controller.ser.port}...') + dev_info = self.controller.readDeviceInfo() + + self.setStatus(f'Чтение токов: {self.controller.controller.ser.port}...') + time.sleep(1) + + currents_real = self.controller.readCurrents() + + if dmx_real == -1 or not dev_info or not currents_real: + self.connectionLost() + return + + pers_real = f'{dev_info[1]}:{self.modes[dev_info[1] - 1][1]}' + failed = False + if dmx_save == "" or int(dmx_save) != dmx_real: + failed = True + # TODO self.dmx_address_field.configure(style='failedToRead.TEntry') + else: + ... + # TODO dmx_address_field.configure(style='TEntry') + + if pers_save != pers_real: + failed = True + # TODO personality_combobox.set('ERROR') + else: + ... + # TODOpersonality_combobox.configure(style='TCombobox') + + for index in range(4): + if currents_save[index] == "" or int(currents_save[index]) != currents_real[index] * 10: + failed = True + # TODO current_entries[index].configure(style='failedToRead.TEntry') + else: + ... + # TODO current_entries[index].configure(style='TEntry') + + self.setStatus(f'Выбранный порт: {self.controller.controller.ser.port}') + if failed: + self.setTempStatus('Обнаружены ошибки, повторите запись', 1) + else: + self.setTempStatus('Проверка прошла успешно', 1) + def refreshDeviceList(self): self.ui.DeviceSelection.clear() self.ui.DeviceSelection.addItems(self.controller.readComPorts()) + def readCallback(self) -> None: + if time.time() - self.last_click_time < 1: + return + + self.last_click_time = time.time() + + if self.connected: + if not self.readControllerCurrentsAndData(): + self.connectionLost() + return + + self.setStatus(f'Выбранный порт: {self.controller.controller.ser.port}') + self.setTempStatus(f'Токи прочитаны, порт: {self.controller.controller.ser.port}', 1) + else: + self.setTempStatus('Порт не выбран!', 1) + + def writeCallback(self) -> None: + if time.time() - self.last_click_time < 2: + return + + self.last_click_time = time.time() + + if self.connected: + self.writeCurrentsAddressAndMode() + else: + self.setTempStatus('Порт не выбран!', 1) + + def connectMethods(self): + self.ui.DeviceSelection.activated.connect(self.deviceSelected) + self.ui.DeviceSelection.installEventFilter(self.hoverFilter) + self.ui.Read.clicked.connect(self.readCallback) + self.ui.Write.clicked.connect(self.writeCallback) + + class ComboBoxHoverEventFilter(QtCore.QObject): + def __init__(self, parent, onEnter): + super().__init__(parent) + self.parent = parent + self.onEnter = onEnter + + def eventFilter(self, obj, event): + if event.type() == QtCore.QEvent.Type.Enter: + self.onEnter() + return super().eventFilter(obj, event) + if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv)