This commit is contained in:
david rice
2026-01-19 16:00:19 +00:00
parent e1423fc4c3
commit 4490dd803a
5 changed files with 136 additions and 67 deletions

96
main.py
View File

@@ -12,7 +12,7 @@ AUTHOR: D. RICE 06/01/2026
# Imports # Imports
import sys import sys
from PySide6.QtWidgets import (QApplication, QDialog, QMainWindow) from PySide6.QtWidgets import (QApplication, QDialog, QMainWindow)
from PySide6.QtCore import (QIODevice, QByteArray) from PySide6.QtCore import (QIODevice, QByteArray, QTimer)
from PySide6.QtSerialPort import (QSerialPort, QSerialPortInfo) from PySide6.QtSerialPort import (QSerialPort, QSerialPortInfo)
import time import time
@@ -65,14 +65,16 @@ class MainWindow(QMainWindow):
# Hold process reference. # Hold process reference.
self.p = None self.p = None
# Thread and Worker initialisation
self.worker_thread = None
self.worker = None
# Add start button action # Add start button action
self.ui.connButton.setCheckable(True) self.ui.connButton.setCheckable(True)
self.ui.connButton.clicked.connect(self.conn_button_press) self.ui.connButton.clicked.connect(self.conn_button_press)
# Hide other controls
self.ui.sn.setHidden(True)
self.ui.snLabel.setHidden(True)
self.ui.fw.setHidden(True)
self.ui.fwLabel.setHidden(True)
# Set initial size # Set initial size
initial_width = 1000 initial_width = 1000
initial_height = 600 initial_height = 600
@@ -95,6 +97,20 @@ class MainWindow(QMainWindow):
# Create serial rx buffer # Create serial rx buffer
self.receive_buffer = bytearray() self.receive_buffer = bytearray()
# Create store buffer
self.store_buffer = bytearray()
# Create a timeout counter flag
self.timeoutflag = False
# Create a window response variable
self.windowresponse = False
# Setup QT timers
self.timeouttimer = QTimer()
self.timeouttimer.setInterval(5000)
self.timeouttimer.timeout.connect(self.time_out_timer)
self.show() self.show()
def conn_button_press (self): def conn_button_press (self):
@@ -122,12 +138,40 @@ class MainWindow(QMainWindow):
self.serial.write(QByteArray(byte_data)) self.serial.write(QByteArray(byte_data))
while (self.serial_rx_flag == False): self.timeouttimer.start()
QApplication.processEvents()
while ((self.serial_rx_flag == False) and (self.timeoutflag == False)):
QApplication.processEvents()
w.close()
if self.timeoutflag == True:
self.windowresponse = NoDeviceWindow.get_response(self)
self.serial.close()
self.ui.connButton.setText("CONNECT")
self.ui.sn.setHidden(True)
self.ui.snLabel.setHidden(True)
self.ui.fw.setHidden(True)
self.ui.fwLabel.setHidden(True)
self.ui.sn.setText("---")
self.ui.fw.setText("---")
else:
self.process_serial_number()
self.serial_rx_flag = False
self.timeoutflag = False
else: else:
self.serial.close() self.serial.close()
self.ui.connButton.setText("CONNECT") self.ui.connButton.setText("CONNECT")
self.ui.sn.setHidden(True)
self.ui.snLabel.setHidden(True)
self.ui.fw.setHidden(True)
self.ui.fwLabel.setHidden(True)
self.ui.sn.setText("---")
self.ui.fw.setText("---")
QApplication.processEvents() QApplication.processEvents()
@@ -167,21 +211,42 @@ class MainWindow(QMainWindow):
def handle_valid_packet(self, packet): def handle_valid_packet(self, packet):
# Checksum validity check # Checksum validity check
try: try:
print (packet)
data_bytes = list(packet[3 : -2]) data_bytes = list(packet[3 : -2])
received_checksum = (packet[-2] << 8) | packet[-1] received_checksum = (packet[-2] << 8) | packet[-1]
if((~sum(data_bytes)) & 0xFFFF) == received_checksum: if((~sum(data_bytes)) & 0xFFFF) == received_checksum:
print(f"RX DATA: {data_bytes}") self.serial_rx_flag = True
self.store_buffer = data_bytes
else: else:
pass pass
except Exception as e: except Exception as e:
pass pass
def process_serial_number(self):
# Get and update serial number
sub_sn = self.store_buffer[0:19]
sn_chars = [chr(c) for c in sub_sn if 0 <= c <= 127]
sn_str = "".join(sn_chars)
self.ui.sn.setText(sn_str)
# Get and update FW Rev
sub_fw = self.store_buffer[19:22]
major = sub_fw[1:2]
sep = sub_fw[0:1]
minor = sub_fw[2:3]
full = major + sep + minor
fw_chars = [chr(c) for c in full if 0 <= c <= 127]
fw_str = "".join(fw_chars)
self.ui.fw.setText(fw_str)
self.ui.sn.setHidden(False)
self.ui.snLabel.setHidden(False)
self.ui.fw.setHidden(False)
self.ui.fwLabel.setHidden(False)
def pack_integers_to_bytes(self, *integers: int) -> bytes: def pack_integers_to_bytes(self, *integers: int) -> bytes:
# Setup header # Setup header
@@ -211,11 +276,10 @@ class MainWindow(QMainWindow):
# We need as many 'B's as there are elements in the full packet # We need as many 'B's as there are elements in the full packet
format_string = f"!{len(full_packet)}B" format_string = f"!{len(full_packet)}B"
return struct.pack(format_string, *full_packet) return struct.pack(format_string, *full_packet)
def run_scope_setup (self): def time_out_timer(self):
self.worker.run_setup() self.timeoutflag = True
# Run main # Run main
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -62,5 +62,5 @@ class Ui_connerrorDialog(object):
# setupUi # setupUi
def retranslateUi(self, Dialog): def retranslateUi(self, Dialog):
self.label.setText(QCoreApplication.translate("Dialog", u"COULDN'T CONNECT TO DSO80204B", None)) self.label.setText(QCoreApplication.translate("Dialog", u"COULDN'T CONNECT TO POWERSIM DEVICE", None))
# retranslateUi # retranslateUi

View File

@@ -63,7 +63,7 @@ class Ui_MainWindow(object):
self.connButton = QPushButton(self.test_area) self.connButton = QPushButton(self.test_area)
self.connButton.setObjectName(u"connButton") self.connButton.setObjectName(u"connButton")
self.connButton.setGeometry(QRect(350, 25, 200, 25)) self.connButton.setGeometry(QRect(25, 25, 200, 25))
self.connButton.setStyleSheet(button_style) self.connButton.setStyleSheet(button_style)
text_label_style = """ text_label_style = """
@@ -75,12 +75,6 @@ class Ui_MainWindow(object):
} }
""" """
#self.manuLabel = QLabel(self.test_area)
#self.manuLabel.setObjectName(u"manuLabel")
#self.manuLabel.setGeometry(QRect(200, 5, 250, 15))
#self.manuLabel.setAlignment(Qt.AlignCenter)
#self.manuLabel.setStyleSheet(text_label_style)
label_style = """ label_style = """
QLabel { QLabel {
background-image: url(""); background-image: url("");
@@ -90,49 +84,59 @@ class Ui_MainWindow(object):
} }
""" """
#self.manu = QLabel(self.test_area) self.fwLabel = QLabel(self.test_area)
#self.manu.setObjectName(u"manu") self.fwLabel.setObjectName(u"fwLabel")
#self.manu.setGeometry(QRect(200, 25, 250, 25)) self.fwLabel.setGeometry(QRect(675, 5, 200, 15))
#self.manu.setAlignment(Qt.AlignCenter) self.fwLabel.setAlignment(Qt.AlignCenter)
#self.manu.setStyleSheet(label_style) self.fwLabel.setStyleSheet(text_label_style)
#self.modelLabel = QLabel(self.test_area) self.fw = QLabel(self.test_area)
#self.modelLabel.setObjectName(u"modelLabel") self.fw.setObjectName(u"fw")
#self.modelLabel.setGeometry(QRect(475, 5, 125, 15)) self.fw.setGeometry(QRect(675, 25, 200, 25))
#self.modelLabel.setAlignment(Qt.AlignCenter) self.fw.setAlignment(Qt.AlignCenter)
#self.modelLabel.setStyleSheet(text_label_style) self.fw.setStyleSheet(label_style)
#self.model = QLabel(self.test_area) self.snLabel = QLabel(self.test_area)
#self.model.setObjectName(u"model") self.snLabel.setObjectName(u"snlabel")
#self.model.setGeometry(QRect(475, 25, 125, 25)) self.snLabel.setGeometry(QRect(450, 5, 200, 15))
#self.model.setAlignment(Qt.AlignCenter) self.snLabel.setAlignment(Qt.AlignCenter)
#self.model.setStyleSheet(label_style) self.snLabel.setStyleSheet(text_label_style)
#self.snLabel = QLabel(self.test_area) self.sn = QLabel(self.test_area)
#self.snLabel.setObjectName(u"snlabel") self.sn.setObjectName(u"sn")
#self.snLabel.setGeometry(QRect(625, 5, 125, 15)) self.sn.setGeometry(QRect(450, 25, 200, 25))
#self.snLabel.setAlignment(Qt.AlignCenter) self.sn.setAlignment(Qt.AlignCenter)
#self.snLabel.setStyleSheet(text_label_style) self.sn.setStyleSheet(label_style)
#self.sn = QLabel(self.test_area) self.powerButton = QPushButton(self.test_area)
#self.sn.setObjectName(u"sn") self.powerButton.setObjectName(u"powerButton")
#self.sn.setGeometry(QRect(625, 25, 125, 25)) self.powerButton.setGeometry(QRect(25, 75, 200, 25))
#self.sn.setAlignment(Qt.AlignCenter) self.powerButton.setStyleSheet(button_style)
#self.sn.setStyleSheet(label_style)
#self.fwLabel = QLabel(self.test_area) self.setvLabel = QLabel(self.test_area)
#self.fwLabel.setObjectName(u"fwLabel") self.setvLabel.setObjectName(u"setvlabel")
#self.fwLabel.setGeometry(QRect(775, 5, 125, 15)) self.setvLabel.setGeometry(QRect(450, 55, 200, 15))
#self.fwLabel.setAlignment(Qt.AlignCenter) self.setvLabel.setAlignment(Qt.AlignCenter)
#self.fwLabel.setStyleSheet(text_label_style) self.setvLabel.setStyleSheet(text_label_style)
#self.fw = QLabel(self.test_area) self.setv = QLabel(self.test_area)
#self.fw.setObjectName(u"fw") self.setv.setObjectName(u"setv")
#self.fw.setGeometry(QRect(775, 25, 125, 25)) self.setv.setGeometry(QRect(450, 75, 200, 25))
#self.fw.setAlignment(Qt.AlignCenter) self.setv.setAlignment(Qt.AlignCenter)
#self.fw.setStyleSheet(label_style) self.setv.setStyleSheet(label_style)
self.actvLabel = QLabel(self.test_area)
self.actvLabel.setObjectName(u"actvlabel")
self.actvLabel.setGeometry(QRect(675, 55, 200, 15))
self.actvLabel.setAlignment(Qt.AlignCenter)
self.actvLabel.setStyleSheet(text_label_style)
self.actv = QLabel(self.test_area)
self.actv.setObjectName(u"actv")
self.actv.setGeometry(QRect(675, 75, 200, 25))
self.actv.setAlignment(Qt.AlignCenter)
self.actv.setStyleSheet(label_style)
frame_style = """ frame_style = """
QFrame { QFrame {
background-image: url(""); background-image: url("");
@@ -157,14 +161,15 @@ class Ui_MainWindow(object):
None)) None))
self.header.setText(QCoreApplication.translate("MainWindow", u"AUTOMOTIVE POWER SIMULATOR", None)) self.header.setText(QCoreApplication.translate("MainWindow", u"AUTOMOTIVE POWER SIMULATOR", None))
self.connButton.setText(QCoreApplication.translate("MainWindow", u"CONNECT", None)) self.connButton.setText(QCoreApplication.translate("MainWindow", u"CONNECT", None))
#self.manuLabel.setText(QCoreApplication.translate("MainWindow", u"MANUFACTURER", None)) self.snLabel.setText(QCoreApplication.translate("MainWindow", u"SERIAL NO", None))
#self.manu.setText(QCoreApplication.translate("MainWindow", u"---", None)) self.sn.setText(QCoreApplication.translate("MainWindow", u"---", None))
#self.modelLabel.setText(QCoreApplication.translate("MainWindow", u"MODEL", None)) self.fwLabel.setText(QCoreApplication.translate("MainWindow", u"F/W REV", None))
#self.model.setText(QCoreApplication.translate("MainWindow", u"---", None)) self.fw.setText(QCoreApplication.translate("MainWindow", u"---", None))
#self.snLabel.setText(QCoreApplication.translate("MainWindow", u"SERIAL NO", None)) self.powerButton.setText(QCoreApplication.translate("MainWindow", u"POWER OFF", None))
#self.sn.setText(QCoreApplication.translate("MainWindow", u"---", None)) self.setvLabel.setText(QCoreApplication.translate("MainWindow", u"VOLTAGE SETPOINT", None))
#self.fwLabel.setText(QCoreApplication.translate("MainWindow", u"F/W REV", None)) self.setv.setText(QCoreApplication.translate("MainWindow", u"00.00V", None))
#self.fw.setText(QCoreApplication.translate("MainWindow", u"---", None)) self.actvLabel.setText(QCoreApplication.translate("MainWindow", u"VOLTAGE MEASURED", None))
self.actv.setText(QCoreApplication.translate("MainWindow", u"00.00V", None))
# retranslateUi # retranslateUi