diff --git a/poetry.lock b/poetry.lock index 5c77a36..2570341 100644 --- a/poetry.lock +++ b/poetry.lock @@ -26,10 +26,21 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "pyserial" +version = "3.5" +description = "Python Serial Port Extension" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +cp2110 = ["hidapi"] + [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "ce4feb2a6a42610a01d5e986a40980aaf9f73c3fdc2368f55ec75e70f39c70cf" +content-hash = "9d0dcef05f7296031f76c658f997974caf9b45c1efa59678ef5823b803580e43" [metadata.files] pyqt5 = [ @@ -64,3 +75,7 @@ pyqt5-sip = [ {file = "PyQt5_sip-12.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:42320e7a94b1085ed85d49794ed4ccfe86f1cae80b44a894db908a8aba2bc60e"}, {file = "PyQt5_sip-12.11.0.tar.gz", hash = "sha256:b4710fd85b57edef716cc55fae45bfd5bfac6fc7ba91036f1dcc3f331ca0eb39"}, ] +pyserial = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] diff --git a/pyproject.toml b/pyproject.toml index 9f88869..1a7d44b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ authors = ["Your Name "] [tool.poetry.dependencies] python = "^3.10" PyQt5 = "^5.15.7" +pyserial = "^3.5" [tool.poetry.dev-dependencies] diff --git a/test.py b/test.py index b28f8f4..a3a0c83 100644 --- a/test.py +++ b/test.py @@ -89,19 +89,23 @@ class AccumulatorData: class StackGuiElement: title: str + stack_id: int min_voltage_label: QLabel max_voltage_label: QLabel min_temp_label: QLabel max_temp_label: QLabel groupBox: QGroupBox + detail_popup: QWidget - def __init__(self, title: str): + def __init__(self, title: str, stack_id: int): self.title = title + self.stack_id = stack_id self.min_voltage_label = QLabel() self.max_voltage_label = QLabel() self.min_temp_label = QLabel() self.max_temp_label = QLabel() self.groupBox = QGroupBox() + self.detail_popup = None self.__post__init__() def __post__init__(self): @@ -109,6 +113,8 @@ class StackGuiElement: l2 = QLabel("Max Voltage [V]") l3 = QLabel("Min Temperature [°C]") l4 = QLabel("Max Temperature [°C]") + popup_btn = QPushButton(self.title + " details") + popup_btn.clicked.connect(self.show_popup) l1.setAlignment(Qt.AlignLeft) l2.setAlignment(Qt.AlignLeft) @@ -123,13 +129,15 @@ class StackGuiElement: grid = QGridLayout() grid.addWidget(l1, 0, 0) grid.addWidget(l2, 1, 0) - grid.addWidget(l3, 0, 2) - grid.addWidget(l4, 1, 2) + grid.addWidget(l3, 2, 0) + grid.addWidget(l4, 3, 0) grid.addWidget(self.min_voltage_label, 0, 1) grid.addWidget(self.max_voltage_label, 1, 1) - grid.addWidget(self.min_temp_label, 0, 3) - grid.addWidget(self.max_temp_label, 1, 3) + grid.addWidget(self.min_temp_label, 2, 1) + grid.addWidget(self.max_temp_label, 3, 1) + + grid.addWidget(popup_btn, 0, 2) self.groupBox.setTitle(self.title) self.groupBox.setLayout(grid) @@ -140,6 +148,60 @@ class StackGuiElement: self.min_temp_label.setNum(min(slave.cell_temps)) self.max_temp_label.setNum(max(slave.cell_temps)) + def show_popup(self): + if self.detail_popup is None: + self.detail_popup = StackPopup(self.stack_id) + self.detail_popup.show() + + +class StackPopup(QWidget): + stack_id: int + voltage_labels: list[QLabel] + temp_labels: list[QLabel] + + def __init__(self, stack_id: int): + super().__init__() + self.stack_id = stack_id + self.voltage_labels = [] + self.temp_labels = [] + layout = QVBoxLayout() + groupbox = QGroupBox() + + grid = QGridLayout() + + for i in range(len(data.slaves[stack_id].cell_voltages)): + l1 = QLabel(f"Voltage Cell {i}") + l2 = QLabel(f"Temperature Cell {i}") + l1.setAlignment(Qt.AlignLeft) + l2.setAlignment(Qt.AlignLeft) + + l_v = QLabel() + l_v.setNum(data.slaves[stack_id].cell_voltages[i]) + l_v.setAlignment(Qt.AlignLeft) + self.voltage_labels.append(l_v) + + l_t = QLabel() + l_t.setNum(data.slaves[stack_id].cell_temps[i]) + l_t.setAlignment(Qt.AlignLeft) + self.temp_labels.append(l_t) + + grid.addWidget(l1, i, 0) + grid.addWidget(l2, i, 2) + grid.addWidget(l_v, i, 1) + grid.addWidget(l_t, i, 3) + + groupbox.setTitle(f"Stack {stack_id}") + groupbox.setLayout(grid) + layout.addWidget(groupbox) + self.setLayout(layout) + self.update_data() + timer.timeout.connect(self.update_data) + + def update_data(self): + for i in range(len(data.slaves[self.stack_id].cell_voltages)): + self.voltage_labels[i].setNum(data.slaves[self.stack_id].cell_voltages[i]) + self.temp_labels[i].setNum(data.slaves[self.stack_id].cell_temps[i]) + class Window(QWidget): @@ -227,7 +289,7 @@ class Window(QWidget): ### STACKS ### self.stack_gui_elements = [] for i in range(N_SLAVES): - sge = StackGuiElement(f"Stack {i}") + sge = StackGuiElement(f"Stack {i}", i) sge.update_data_from_slave(data.slaves[i]) self.stack_gui_elements.append(sge) @@ -430,15 +492,16 @@ if __name__ == "__main__": data = AccumulatorData() rx_buf = bytes() - """ if len(sys.argv) != 2: print(f"Usage: {sys.argv[0]} SERIAL-PORT", file=sys.stderr) sys.exit(os.EX_USAGE) SERIAL_PORT = sys.argv[1] print(SERIAL_PORT) - ser = serial.Serial(SERIAL_PORT, BITRATE, timeout=TIMEOUT) - """ + try: + ser = serial.Serial(SERIAL_PORT, BITRATE, timeout=TIMEOUT) + except serial.serialutil.SerialException: + pass app = QApplication(sys.argv) gui = Window()