add stack detail popups
This commit is contained in:
		
							
								
								
									
										17
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										17
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							@ -26,10 +26,21 @@ category = "main"
 | 
				
			|||||||
optional = false
 | 
					optional = false
 | 
				
			||||||
python-versions = ">=3.7"
 | 
					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]
 | 
					[metadata]
 | 
				
			||||||
lock-version = "1.1"
 | 
					lock-version = "1.1"
 | 
				
			||||||
python-versions = "^3.10"
 | 
					python-versions = "^3.10"
 | 
				
			||||||
content-hash = "ce4feb2a6a42610a01d5e986a40980aaf9f73c3fdc2368f55ec75e70f39c70cf"
 | 
					content-hash = "9d0dcef05f7296031f76c658f997974caf9b45c1efa59678ef5823b803580e43"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[metadata.files]
 | 
					[metadata.files]
 | 
				
			||||||
pyqt5 = [
 | 
					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-cp39-cp39-win_amd64.whl", hash = "sha256:42320e7a94b1085ed85d49794ed4ccfe86f1cae80b44a894db908a8aba2bc60e"},
 | 
				
			||||||
    {file = "PyQt5_sip-12.11.0.tar.gz", hash = "sha256:b4710fd85b57edef716cc55fae45bfd5bfac6fc7ba91036f1dcc3f331ca0eb39"},
 | 
					    {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"},
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@ authors = ["Your Name <you@example.com>"]
 | 
				
			|||||||
[tool.poetry.dependencies]
 | 
					[tool.poetry.dependencies]
 | 
				
			||||||
python = "^3.10"
 | 
					python = "^3.10"
 | 
				
			||||||
PyQt5 = "^5.15.7"
 | 
					PyQt5 = "^5.15.7"
 | 
				
			||||||
 | 
					pyserial = "^3.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.poetry.dev-dependencies]
 | 
					[tool.poetry.dev-dependencies]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										79
									
								
								test.py
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								test.py
									
									
									
									
									
								
							@ -89,19 +89,23 @@ class AccumulatorData:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class StackGuiElement:
 | 
					class StackGuiElement:
 | 
				
			||||||
    title: str
 | 
					    title: str
 | 
				
			||||||
 | 
					    stack_id: int
 | 
				
			||||||
    min_voltage_label: QLabel
 | 
					    min_voltage_label: QLabel
 | 
				
			||||||
    max_voltage_label: QLabel
 | 
					    max_voltage_label: QLabel
 | 
				
			||||||
    min_temp_label: QLabel
 | 
					    min_temp_label: QLabel
 | 
				
			||||||
    max_temp_label: QLabel
 | 
					    max_temp_label: QLabel
 | 
				
			||||||
    groupBox: QGroupBox
 | 
					    groupBox: QGroupBox
 | 
				
			||||||
 | 
					    detail_popup: QWidget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, title: str):
 | 
					    def __init__(self, title: str, stack_id: int):
 | 
				
			||||||
        self.title = title
 | 
					        self.title = title
 | 
				
			||||||
 | 
					        self.stack_id = stack_id
 | 
				
			||||||
        self.min_voltage_label = QLabel()
 | 
					        self.min_voltage_label = QLabel()
 | 
				
			||||||
        self.max_voltage_label = QLabel()
 | 
					        self.max_voltage_label = QLabel()
 | 
				
			||||||
        self.min_temp_label = QLabel()
 | 
					        self.min_temp_label = QLabel()
 | 
				
			||||||
        self.max_temp_label = QLabel()
 | 
					        self.max_temp_label = QLabel()
 | 
				
			||||||
        self.groupBox = QGroupBox()
 | 
					        self.groupBox = QGroupBox()
 | 
				
			||||||
 | 
					        self.detail_popup = None
 | 
				
			||||||
        self.__post__init__()
 | 
					        self.__post__init__()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __post__init__(self):
 | 
					    def __post__init__(self):
 | 
				
			||||||
@ -109,6 +113,8 @@ class StackGuiElement:
 | 
				
			|||||||
        l2 = QLabel("Max Voltage [V]")
 | 
					        l2 = QLabel("Max Voltage [V]")
 | 
				
			||||||
        l3 = QLabel("Min Temperature [°C]")
 | 
					        l3 = QLabel("Min Temperature [°C]")
 | 
				
			||||||
        l4 = QLabel("Max Temperature [°C]")
 | 
					        l4 = QLabel("Max Temperature [°C]")
 | 
				
			||||||
 | 
					        popup_btn = QPushButton(self.title + " details")
 | 
				
			||||||
 | 
					        popup_btn.clicked.connect(self.show_popup)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        l1.setAlignment(Qt.AlignLeft)
 | 
					        l1.setAlignment(Qt.AlignLeft)
 | 
				
			||||||
        l2.setAlignment(Qt.AlignLeft)
 | 
					        l2.setAlignment(Qt.AlignLeft)
 | 
				
			||||||
@ -123,13 +129,15 @@ class StackGuiElement:
 | 
				
			|||||||
        grid = QGridLayout()
 | 
					        grid = QGridLayout()
 | 
				
			||||||
        grid.addWidget(l1, 0, 0)
 | 
					        grid.addWidget(l1, 0, 0)
 | 
				
			||||||
        grid.addWidget(l2, 1, 0)
 | 
					        grid.addWidget(l2, 1, 0)
 | 
				
			||||||
        grid.addWidget(l3, 0, 2)
 | 
					        grid.addWidget(l3, 2, 0)
 | 
				
			||||||
        grid.addWidget(l4, 1, 2)
 | 
					        grid.addWidget(l4, 3, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        grid.addWidget(self.min_voltage_label, 0, 1)
 | 
					        grid.addWidget(self.min_voltage_label, 0, 1)
 | 
				
			||||||
        grid.addWidget(self.max_voltage_label, 1, 1)
 | 
					        grid.addWidget(self.max_voltage_label, 1, 1)
 | 
				
			||||||
        grid.addWidget(self.min_temp_label, 0, 3)
 | 
					        grid.addWidget(self.min_temp_label, 2, 1)
 | 
				
			||||||
        grid.addWidget(self.max_temp_label, 1, 3)
 | 
					        grid.addWidget(self.max_temp_label, 3, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        grid.addWidget(popup_btn, 0, 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.groupBox.setTitle(self.title)
 | 
					        self.groupBox.setTitle(self.title)
 | 
				
			||||||
        self.groupBox.setLayout(grid)
 | 
					        self.groupBox.setLayout(grid)
 | 
				
			||||||
@ -140,6 +148,60 @@ class StackGuiElement:
 | 
				
			|||||||
        self.min_temp_label.setNum(min(slave.cell_temps))
 | 
					        self.min_temp_label.setNum(min(slave.cell_temps))
 | 
				
			||||||
        self.max_temp_label.setNum(max(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):
 | 
					class Window(QWidget):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -227,7 +289,7 @@ class Window(QWidget):
 | 
				
			|||||||
        ### STACKS ###
 | 
					        ### STACKS ###
 | 
				
			||||||
        self.stack_gui_elements = []
 | 
					        self.stack_gui_elements = []
 | 
				
			||||||
        for i in range(N_SLAVES):
 | 
					        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])
 | 
					            sge.update_data_from_slave(data.slaves[i])
 | 
				
			||||||
            self.stack_gui_elements.append(sge)
 | 
					            self.stack_gui_elements.append(sge)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -430,15 +492,16 @@ if __name__ == "__main__":
 | 
				
			|||||||
    data = AccumulatorData()
 | 
					    data = AccumulatorData()
 | 
				
			||||||
    rx_buf = bytes()
 | 
					    rx_buf = bytes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    if len(sys.argv) != 2:
 | 
					    if len(sys.argv) != 2:
 | 
				
			||||||
        print(f"Usage: {sys.argv[0]} SERIAL-PORT", file=sys.stderr)
 | 
					        print(f"Usage: {sys.argv[0]} SERIAL-PORT", file=sys.stderr)
 | 
				
			||||||
        sys.exit(os.EX_USAGE)
 | 
					        sys.exit(os.EX_USAGE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SERIAL_PORT = sys.argv[1]
 | 
					    SERIAL_PORT = sys.argv[1]
 | 
				
			||||||
    print(SERIAL_PORT)
 | 
					    print(SERIAL_PORT)
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
        ser = serial.Serial(SERIAL_PORT, BITRATE, timeout=TIMEOUT)
 | 
					        ser = serial.Serial(SERIAL_PORT, BITRATE, timeout=TIMEOUT)
 | 
				
			||||||
    """
 | 
					    except serial.serialutil.SerialException:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app = QApplication(sys.argv)
 | 
					    app = QApplication(sys.argv)
 | 
				
			||||||
    gui = Window()
 | 
					    gui = Window()
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user