Godpp
2020-02-22 fb3a1cfb94012ee90104ddcac5f49aac2158c5de
更新界面
1 files modified
217 ■■■■■ changed files
widgets/flash_bootloader_widget.py 217 ●●●●● patch | view | raw | blame | history
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