| | |
| | | |
| | | |
| | | class FlashBootloaderWidget(QtWidgets.QWidget): |
| | | |
| | | def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags()): |
| | | super().__init__(parent=parent, flags=flags) |
| | | self.initUI() |
| | |
| | | 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) |
| | | |
| | |
| | | # 发送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) |
| | |
| | | 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) |
| | | |
| | |
| | | # 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存储空间 |
| | |
| | | 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) |
| | | |
| | |
| | | |
| | | 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) |
| | | |
| | |
| | | |
| | | 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 |
| | |
| | | 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] |
| | | |
| | |
| | | |
| | | 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, |
| | |
| | | @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 |