From fb3a1cfb94012ee90104ddcac5f49aac2158c5de Mon Sep 17 00:00:00 2001 From: Godpp <tzj0429@163.com> Date: Sat, 22 Feb 2020 22:56:23 +0800 Subject: [PATCH] 更新界面 --- widgets/flash_bootloader_widget.py | 217 ++++++++++++++++++++++++------------------------------ 1 files changed, 97 insertions(+), 120 deletions(-) diff --git a/widgets/flash_bootloader_widget.py b/widgets/flash_bootloader_widget.py index ed3c383..05661eb 100644 --- a/widgets/flash_bootloader_widget.py +++ b/widgets/flash_bootloader_widget.py @@ -11,7 +11,6 @@ class FlashBootloaderWidget(QtWidgets.QWidget): - def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags()): super().__init__(parent=parent, flags=flags) self.initUI() @@ -28,151 +27,123 @@ self.append_text_to_log_display('read config.ini success') except Exception as e: self.append_text_to_log_display( - 'read config.ini error, use 0x692 and 0x693 for default tx_id and rx_id', '#ff0000') + 'read config.ini error, use 0x692 and 0x693 for default tx_id and rx_id', + '#ff0000') self.tx_id = 0x692 self.rx_id = 0x693 def initUI(self): - - self.setWindowTitle('Flash Bootloader') + self.setWindowTitle('Bootloader') self.setFont(QtGui.QFont('Segoe UI')) desktop = QtWidgets.QApplication.desktop() # 获得屏幕尺寸 - self.resize(desktop.width()/2, desktop.height()/3) + self.resize(desktop.width() / 2, desktop.height() / 2) + + # 设置文本输入框 le_drv = QtWidgets.QLineEdit(self) le_drv.setReadOnly(True) le_drv.setObjectName('le_drv') btn_drv = QtWidgets.QPushButton(self) - btn_drv.setText('driver') + btn_drv.setText('驱动程序') btn_drv.setObjectName('btn_drv') le_app = QtWidgets.QLineEdit(self) le_app.setReadOnly(True) le_app.setObjectName('le_app') btn_app = QtWidgets.QPushButton(self) - btn_app.setText('app') + btn_app.setText('应用程序') btn_app.setObjectName('btn_app') + # 创建网格布局 2行2列 void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0); + gridlayer_file = QtWidgets.QGridLayout() + gridlayer_file.addWidget(le_drv, 0, 0, 1, 1) + gridlayer_file.addWidget(btn_drv, 0, 1, 1, 1) + gridlayer_file.addWidget(le_app, 1, 0, 1, 1) + gridlayer_file.addWidget(btn_app, 1, 1, 1, 1) - gl0 = QtWidgets.QGridLayout() - gl0.addWidget(le_drv, 0, 0, 1, 1) - gl0.addWidget(btn_drv, 0, 1, 1, 1) - gl0.addWidget(le_app, 1, 0, 1, 1) - gl0.addWidget(btn_app, 1, 1, 1, 1) + gb_file = QtWidgets.QGroupBox(self) + gb_file.setTitle('加载文件') + gb_file.setLayout(gridlayer_file) cb_interface_type = QtWidgets.QComboBox(self) - cb_interface_type.addItems(['vector', 'canalystii']) + cb_interface_type.addItems(['CANoe', 'USBCAN']) cb_interface_type.setObjectName('cb_interface_type') cb_baudrate = QtWidgets.QComboBox(self) - cb_baudrate.addItems([('%dK' % (i/1000)) for i in TIMING_DICT.keys()]) + cb_baudrate.addItems([('%dK' % (i / 1000)) + for i in TIMING_DICT.keys()]) cb_baudrate.setCurrentIndex(14) cb_baudrate.setObjectName('cb_baudrate') cb_can_channel = QtWidgets.QComboBox(self) - cb_can_channel.addItems(['CH1/3', 'CH2/4']) + cb_can_channel.addItems(['通道1', '通道2']) cb_can_channel.setObjectName('cb_can_channel') btn_open = QtWidgets.QPushButton(self) - btn_open.setText('open') + btn_open.setText('打开') btn_open.setObjectName('btn_open') - hb0 = QtWidgets.QHBoxLayout() - hb0.addWidget(cb_interface_type) - hb0.addWidget(cb_baudrate) - hb0.addWidget(cb_can_channel) - hb0.addWidget(btn_open) - cb_only_main = QtWidgets.QCheckBox(self) - cb_only_main.setText('only programming step') + cb_only_main.setText('仅主编程') btn_start = QtWidgets.QPushButton(self) - btn_start.setText('start programming') + btn_start.setText('开始刷写') btn_start.setObjectName('btn_start') btn_start.setDisabled(True) - - hb1 = QtWidgets.QHBoxLayout() - hb1.addWidget(cb_only_main) - hb1.addWidget(btn_start) progress_bar = QtWidgets.QProgressBar() progress_bar.setObjectName('progress_bar') - hb2 = QtWidgets.QHBoxLayout() - hb2.addWidget(progress_bar) + GL0 = QtWidgets.QGridLayout() + GL0.addWidget(cb_interface_type, 0, 0, 1, 1) + GL0.addWidget(cb_baudrate, 0, 1, 1, 1) + GL0.addWidget(cb_can_channel, 0, 2, 1, 1) + GL0.addWidget(btn_open, 0, 3, 1, 1) - # checkbox1 = QtWidgets.QCheckBox(self) - # checkbox2 = QtWidgets.QCheckBox(self) - # checkbox3 = QtWidgets.QCheckBox(self) - # checkbox4 = QtWidgets.QCheckBox(self) - # checkbox5 = QtWidgets.QCheckBox(self) - # checkbox6 = QtWidgets.QCheckBox(self) - # checkbox7 = QtWidgets.QCheckBox(self) - # checkbox8 = QtWidgets.QCheckBox(self) - # checkbox9 = QtWidgets.QCheckBox(self) - # checkbox10 = QtWidgets.QCheckBox(self) - # checkbox11 = QtWidgets.QCheckBox(self) + gb_cfg = QtWidgets.QGroupBox(self) + gb_cfg.setTitle('配置') + gb_cfg.setLayout(GL0) - # # https://blog.csdn.net/jianfengxia/article/details/86623321 + GL1 = QtWidgets.QGridLayout() + GL1.addWidget(cb_only_main, 0, 0, 1, 1) + GL1.addWidget(btn_start, 1, 8, 1, 1) + GL1.addWidget(progress_bar, 1, 0, 1, 8) - # checkbox1.setText('Enter extended session') - # checkbox2.setText('Stop setting of DTCs') - # checkbox3.setText('Disable non-diagnostic communication') - # vb_pre = QtWidgets.QVBoxLayout() - # vb_pre.setAlignment(QtCore.Qt.AlignTop) - # vb_pre.addWidget(checkbox1) - # vb_pre.addWidget(checkbox2) - # vb_pre.addWidget(checkbox3) - # gb_pre = QtWidgets.QGroupBox(self) - # gb_pre.setTitle('pre-programming') - # gb_pre.setLayout(vb_pre) - - # checkbox4.setText('Enter programming session') - # checkbox5.setText('Request seed') - # checkbox6.setText('Send key') - # checkbox7.setText('Write Programming Date') - # checkbox8.setText('Erase Application Software Memory') - # checkbox9.setText('Download Application Software') - # checkbox10.setText( - # 'Check Programming Application Software Dependencie') - - # vb_main = QtWidgets.QVBoxLayout() - # vb_main.setAlignment(QtCore.Qt.AlignTop) - # vb_main.addWidget(checkbox4) - # vb_main.addWidget(checkbox5) - # vb_main.addWidget(checkbox6) - # vb_main.addWidget(checkbox7) - # vb_main.addWidget(checkbox8) - # vb_main.addWidget(checkbox9) - # vb_main.addWidget(checkbox10) - # gb_main = QtWidgets.QGroupBox(self) - # gb_main.setTitle('programming') - # gb_main.setLayout(vb_main) - - # checkbox11.setText('ECUReset') - # vb_post = QtWidgets.QVBoxLayout() - # vb_post.setAlignment(QtCore.Qt.AlignTop) - # vb_post.addWidget(checkbox11) - # gb_post = QtWidgets.QGroupBox(self) - # gb_post.setTitle('post-programming') - # gb_post.setLayout(vb_post) - - # hb3 = QtWidgets.QHBoxLayout() - # hb3.addWidget(gb_pre) - # hb3.addWidget(gb_main) - # hb3.addWidget(gb_post) + gb_progress = QtWidgets.QGroupBox(self) + gb_progress.setTitle('进度控制') + gb_progress.setLayout(GL1) tb_log_display = QtWidgets.QTextBrowser(self) tb_log_display.setObjectName('tb_log_display') - hb4 = QtWidgets.QHBoxLayout() - hb4.addWidget(tb_log_display) + table_data_display = QtWidgets.QTableWidget(self) + table_data_display.setObjectName('table_data_display') + table_data_display.setColumnCount(4) + table_data_display.setRowCount(8) + table_data_display.setHorizontalHeaderLabels( + ['时间', 'CAN ID', 'DLC', '数据']) + table_data_display.verticalHeader().setVisible(False) + table_data_display.horizontalHeader().setStretchLastSection( + True) # 设置表格最后一列自适应 + table_data_display.setColumnWidth(0, 100) + table_data_display.setColumnWidth(1, 80) + table_data_display.setColumnWidth(2, 80) + table_data_display.setShowGrid(False) + GL_disp = QtWidgets.QGridLayout() + GL_disp.setColumnStretch(0, 1) # 设置表格列宽 + GL_disp.setColumnStretch(1, 3) + GL_disp.addWidget(table_data_display, 0, 1, 1, 3) + GL_disp.addWidget(tb_log_display, 0, 0, 1, 1) + + gb_log = QtWidgets.QGroupBox(self) + gb_log.setTitle('数据事件') + gb_log.setLayout(GL_disp) + + # 垂直布局 vb = QtWidgets.QVBoxLayout() - vb.addLayout(gl0) - vb.addLayout(hb0) - vb.addLayout(hb1) - vb.addLayout(hb2) - # vb.addLayout(hb3) - vb.addLayout(hb4) + vb.addWidget(gb_file) + vb.addWidget(gb_cfg) + vb.addWidget(gb_progress) + vb.addWidget(gb_log) self.setLayout(vb) @@ -224,8 +195,10 @@ # 发送driver文件 self.append_text_to_log_display('>>> 发送driver文件') drv_file = self.drv_data - address = drv_file[16] << 24 | drv_file[17] << 16 | drv_file[18] << 8 | drv_file[19] << 0 - memorysize = drv_file[20] << 24 | drv_file[21] << 16 | drv_file[22] << 8 | drv_file[23] << 0 + address = drv_file[16] << 24 | drv_file[17] << 16 | drv_file[ + 18] << 8 | drv_file[19] << 0 + memorysize = drv_file[20] << 24 | drv_file[21] << 16 | drv_file[ + 22] << 8 | drv_file[23] << 0 memory_location = MemoryLocation(address, memorysize, 32, 32) response = await client.request_download(memory_location) # print(response) @@ -241,7 +214,8 @@ for i in range(count): start = i * payload_length end = start + payload_length - response = await client.transfer_data((i + 1) % 256, drv_file[start:end]) + response = await client.transfer_data((i + 1) % 256, + drv_file[start:end]) self.set_progressbar_pos(base + end) # print(response) @@ -254,8 +228,10 @@ # print(response) app_file = self.app_data - address = app_file[16] << 24 | app_file[17] << 16 | app_file[18] << 8 | app_file[19] << 0 - memorysize = app_file[20] << 24 | app_file[21] << 16 | app_file[22] << 8 | app_file[23] << 0 + address = app_file[16] << 24 | app_file[17] << 16 | app_file[ + 18] << 8 | app_file[19] << 0 + memorysize = app_file[20] << 24 | app_file[21] << 16 | app_file[ + 22] << 8 | app_file[23] << 0 memory_location = MemoryLocation(address, memorysize, 32, 32) # 删除app存储空间 @@ -283,7 +259,8 @@ for i in range(count): start = i * payload_length end = start + payload_length - response = await client.transfer_data((i + 1) % 256, app_file[start:end]) + response = await client.transfer_data((i + 1) % 256, + app_file[start:end]) self.set_progressbar_pos(base + end) # print(response) @@ -310,7 +287,8 @@ with network.open(): - reader, writer = await network.open_connection(self.rx_id, self.tx_id) + reader, writer = await network.open_connection( + self.rx_id, self.tx_id) client = Client(reader, writer) @@ -354,10 +332,8 @@ def set_progressbar_pos(self, pos): - drv_data_len = len( - self.drv_data) if self.drv_data is not None else 0 - app_data_len = len( - self.app_data) if self.app_data is not None else 0 + drv_data_len = len(self.drv_data) if self.drv_data is not None else 0 + app_data_len = len(self.app_data) if self.app_data is not None else 0 total_len = drv_data_len + app_data_len if pos > total_len: pos = total_len @@ -452,20 +428,18 @@ interface_type_index = self.findChild( QtWidgets.QComboBox, 'cb_interface_type').currentIndex() - baudrate_index = self.findChild( - QtWidgets.QComboBox, 'cb_baudrate').currentIndex() + baudrate_index = self.findChild(QtWidgets.QComboBox, + 'cb_baudrate').currentIndex() - can_channel_index = self.findChild( - QtWidgets.QComboBox, 'cb_can_channel').currentIndex() + can_channel_index = self.findChild(QtWidgets.QComboBox, + 'cb_can_channel').currentIndex() # bus = VectorBus(channel=1, bitrate=500000, can_filters=can_filters) # bus = CANalystIIBus(channel=0, baud=500000, can_filters=can_filters) self.clear_log_display() - can_filters = [ - {'can_id': self.rx_id, 'can_mask': 0xFFFFFFFF} - ] + can_filters = [{'can_id': self.rx_id, 'can_mask': 0xFFFFFFFF}] bitrate = list(TIMING_DICT.keys())[baudrate_index] @@ -473,11 +447,13 @@ if interface_type_index == 0: self.bus = VectorBus(channel=can_channel_index, - bitrate=bitrate, can_filters=can_filters) + bitrate=bitrate, + can_filters=can_filters) elif interface_type_index == 1: self.bus = CANalystIIBus(channel=can_channel_index, - baud=bitrate, can_filters=can_filters) + baud=bitrate, + can_filters=can_filters) self.append_text_to_log_display('open device success') self.findChild(QtWidgets.QPushButton, @@ -489,17 +465,18 @@ @QtCore.pyqtSlot(str) def on_cb_interface_type_currentIndexChanged(self, text): - if text == 'vector': + if text == 'CANoe': self.findChild(QtWidgets.QComboBox, - 'cb_can_channel').setItemText(0, 'CH1/3') + 'cb_can_channel').setItemText(0, '通道1/3') self.findChild(QtWidgets.QComboBox, - 'cb_can_channel').setItemText(1, 'CH2/4') - elif text == 'canalystii': + 'cb_can_channel').setItemText(1, '通道2/4') + elif text == 'USBCAN': self.findChild(QtWidgets.QComboBox, 'cb_can_channel').setItemText(0, 'CAN1') self.findChild(QtWidgets.QComboBox, 'cb_can_channel').setItemText(1, 'CAN2') + # @PyQt5.QtCore.pyqtSlot(参数) # def on_发送者对象名称_发射信号名称(self, 参数): # pass -- Gitblit v1.8.0