from PyQt5 import QtWidgets, QtCore, QtGui from can.interfaces.canalystii import CANalystIIBus, TIMING_DICT from can.interfaces.vector import VectorBus from can.bus import BusABC import asyncio import time import aioisotp from uds.client import Client from udsoncan import DidCodec from udsoncan import DataIdentifier from udsoncan.configs import default_client_config import struct import configparser class AsciiCodec(DidCodec): def __init__(self, string_len=None): if string_len is None: raise ValueError( "You must provide a length to the AsciiCodec") self.string_len = string_len def encode(self, string_ascii): if len(string_ascii) > self.string_len: string_ascii = string_ascii[0:self.string_len] elif len(string_ascii) < self.string_len: for i in range(self.string_len - len(string_ascii)): string_ascii += ' ' return string_ascii.encode('ascii') def decode(self, string_bin): string_ascii = string_bin.decode('ascii') if len(string_ascii) > self.string_len: string_ascii = string_ascii[0:self.string_len] return string_ascii.strip() def __len__(self): return self.string_len class PartNumberCodec(DidCodec): def __init__(self, byte_len=None): if byte_len is None: raise ValueError( "You must provide a length to the PartNumberCodec") self.byte_len = byte_len def encode(self, string_ascii): if self.byte_len == 1: data = struct.pack('>B', int(string_ascii)) elif self.byte_len == 2: data = struct.pack('>H', int(string_ascii)) elif self.byte_len == 4: data = struct.pack('>L', int(string_ascii)) elif self.byte_len == 8: data = struct.pack('>Q', int(string_ascii)) if len(data) > self.byte_len: data = data[0:self.byte_len] return data def decode(self, byte_data): data = 0 for i in byte_data: data = data << 8 | i return str(data) def __len__(self): return self.byte_len class PartNumberVersionCodec(DidCodec): def __init__(self, byte_len=None): if byte_len is None: raise ValueError( "You must provide a length to the PartNumberCodec") self.byte_len = byte_len def encode(self, string_ascii): if self.byte_len == 1: data = struct.pack('>B', int(string_ascii)) elif self.byte_len == 2: data = struct.pack('>H', int(string_ascii)) elif self.byte_len == 4: data = struct.pack('>L', int(string_ascii)) elif self.byte_len == 8: data = struct.pack('>Q', int(string_ascii)) if len(data) > self.byte_len: data = data[0:self.byte_len] return data def decode(self, byte_data): ret = '' for i in byte_data: ret += '%.1x' % i return ret def __len__(self): return self.byte_len class BCDCodec(DidCodec): def __init__(self, byte_len=None): self.byte_len = byte_len def encode(self, string_ascii): string_ascii = string_ascii.strip() if len(string_ascii) > self.byte_len * 2: string_ascii = string_ascii[0:self.byte_len * 2] elif len(string_ascii) < self.byte_len * 2: for i in range(self.byte_len * 2 - len(string_ascii)): string_ascii += '0' data = bytearray() for i in range(self.byte_len): part = string_ascii[2 * i: 2 * i + 2] data.append(int(part, 16)) return data def decode(self, byte_data): ret = '' for i in byte_data: ret += '%.2x' % i return ret def __len__(self): return self.byte_len class DataIdentifierWidget(QtWidgets.QWidget): def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags()): super().__init__(parent=parent, flags=flags) self.initUI() self.client: Client = None self.opened_flag = False self.did_config = { 0xF190: AsciiCodec(17), 0xF1B1: AsciiCodec(9), 0xF1B2: AsciiCodec(16), 0xF1D0: PartNumberCodec(4), 0xF1D1: PartNumberVersionCodec(2), 0xF1D2: PartNumberCodec(4), 0xF1D3: PartNumberVersionCodec(2), 0xF0DF: PartNumberVersionCodec(1), 0xF187: AsciiCodec(21), 0xF195: AsciiCodec(16), 0xF198: BCDCodec(8), 0xF199: BCDCodec(4), } try: config = configparser.ConfigParser() config.read('config.ini') self.tx_id = int(config['CAN_ID']['tx_id'], 16) self.rx_id = int(config['CAN_ID']['rx_id'], 16) 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') self.tx_id = 0x692 self.rx_id = 0x693 def initUI(self): self.setWindowTitle('Data Identifier') self.setFont(QtGui.QFont('Segoe UI')) cb_interface_type = QtWidgets.QComboBox(self) cb_interface_type.addItems(['vector', 'canalystii']) 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.setCurrentIndex(14) cb_baudrate.setObjectName('cb_baudrate') cb_can_channel = QtWidgets.QComboBox(self) cb_can_channel.addItems(['CH1/3', 'CH2/4']) cb_can_channel.setObjectName('cb_can_channel') btn_open = QtWidgets.QPushButton(self) btn_open.setText('open') btn_open.setObjectName('btn_open') btn_close = QtWidgets.QPushButton(self) btn_close.setText('close') btn_close.setObjectName('btn_close') hb0 = QtWidgets.QHBoxLayout() hb0.addWidget(cb_interface_type) hb0.addWidget(cb_baudrate) hb0.addWidget(cb_can_channel) hb0.addWidget(btn_open) hb0.addWidget(btn_close) # 0xF190 lb_0xf190 = QtWidgets.QLabel(self) lb_0xf190.setText('Vehicle Identification Number') le_0xf190 = QtWidgets.QLineEdit(self) le_0xf190.setObjectName('le_0xf190') btn_read_0xf190 = QtWidgets.QPushButton(self) btn_read_0xf190.setText('read') btn_read_0xf190.setObjectName('btn_read_0xf190') btn_write_0xf190 = QtWidgets.QPushButton(self) btn_write_0xf190.setText('write') btn_write_0xf190.setObjectName('btn_write_0xf190') # 0xF1B1 lb_0xf1b1 = QtWidgets.QLabel(self) lb_0xf1b1.setText('Data Universal Numbering System') le_0xf1b1 = QtWidgets.QLineEdit(self) le_0xf1b1.setObjectName('le_0xf1b1') btn_read_0xf1b1 = QtWidgets.QPushButton(self) btn_read_0xf1b1.setText('read') btn_read_0xf1b1.setObjectName('btn_read_0xf1b1') # 0xF1B2 lb_0xf1b2 = QtWidgets.QLabel(self) lb_0xf1b2.setText('Manufacturing Traceability Characters') le_0xf1b2 = QtWidgets.QLineEdit(self) le_0xf1b2.setObjectName('le_0xf1b2') btn_read_0xf1b2 = QtWidgets.QPushButton(self) btn_read_0xf1b2.setText('read') btn_read_0xf1b2.setObjectName('btn_read_0xf1b2') btn_write_0xf1b2 = QtWidgets.QPushButton(self) btn_write_0xf1b2.setText('write') btn_write_0xf1b2.setObjectName('btn_write_0xf1b2') # 0xF1D0 lb_0xf1d0 = QtWidgets.QLabel(self) lb_0xf1d0.setText('Base Model Part Number') le_0xf1d0 = QtWidgets.QLineEdit(self) le_0xf1d0.setObjectName('le_0xf1d0') btn_read_0xf1d0 = QtWidgets.QPushButton(self) btn_read_0xf1d0.setText('read') btn_read_0xf1d0.setObjectName('btn_read_0xf1d0') # 0xF1D1 lb_0xf1d1 = QtWidgets.QLabel(self) lb_0xf1d1.setText('Base Model Part Number Version Code') le_0xf1d1 = QtWidgets.QLineEdit(self) le_0xf1d1.setObjectName('le_0xf1d1') btn_read_0xf1d1 = QtWidgets.QPushButton(self) btn_read_0xf1d1.setText('read') btn_read_0xf1d1.setObjectName('btn_read_0xf1d1') # 0xF1D2 lb_0xf1d2 = QtWidgets.QLabel(self) lb_0xf1d2.setText('End Model Part Number') le_0xf1d2 = QtWidgets.QLineEdit(self) le_0xf1d2.setObjectName('le_0xf1d2') btn_read_0xf1d2 = QtWidgets.QPushButton(self) btn_read_0xf1d2.setText('read') btn_read_0xf1d2.setObjectName('btn_read_0xf1d2') # 0xF1D3 lb_0xf1d3 = QtWidgets.QLabel(self) lb_0xf1d3.setText('End Model Part Number Version Code') le_0xf1d3 = QtWidgets.QLineEdit(self) le_0xf1d3.setObjectName('le_0xf1d3') btn_read_0xf1d3 = QtWidgets.QPushButton(self) btn_read_0xf1d3.setText('read') btn_read_0xf1d3.setObjectName('btn_read_0xf1d3') # 0xF0DF lb_0xf0df = QtWidgets.QLabel(self) lb_0xf0df.setText('Manufacturers Mode Flag') cb_0xf0df = QtWidgets.QComboBox(self) cb_0xf0df.setObjectName('cb_0xf0df') cb_0xf0df.addItem('NonFactoryModel', 0) cb_0xf0df.addItem('FactoryMode', 1) btn_read_0xf0df = QtWidgets.QPushButton(self) btn_read_0xf0df.setText('read') btn_read_0xf0df.setObjectName('btn_read_0xf0df') btn_write_0xf0df = QtWidgets.QPushButton(self) btn_write_0xf0df.setText('write') btn_write_0xf0df.setObjectName('btn_write_0xf0df') # 0xF187 lb_0xf187 = QtWidgets.QLabel(self) lb_0xf187.setText('ECU Part Number') le_0xf187 = QtWidgets.QLineEdit(self) le_0xf187.setObjectName('le_0xf187') btn_read_0xf187 = QtWidgets.QPushButton(self) btn_read_0xf187.setText('read') btn_read_0xf187.setObjectName('btn_read_0xf187') # 0xF195 lb_0xf195 = QtWidgets.QLabel(self) lb_0xf195.setText('Supplier ECU Software Version Number') le_0xf195 = QtWidgets.QLineEdit(self) le_0xf195.setObjectName('le_0xf195') btn_read_0xf195 = QtWidgets.QPushButton(self) btn_read_0xf195.setText('read') btn_read_0xf195.setObjectName('btn_read_0xf195') # 0xF198 lb_0xf198 = QtWidgets.QLabel(self) lb_0xf198.setText('Repair Shop Code') le_0xf198 = QtWidgets.QLineEdit(self) le_0xf198.setObjectName('le_0xf198') btn_read_0xf198 = QtWidgets.QPushButton(self) btn_read_0xf198.setText('read') btn_read_0xf198.setObjectName('btn_read_0xf198') btn_write_0xf198 = QtWidgets.QPushButton(self) btn_write_0xf198.setText('write') btn_write_0xf198.setObjectName('btn_write_0xf198') # 0xF199 lb_0xf199 = QtWidgets.QLabel(self) lb_0xf199.setText('Programming Date') le_0xf199 = QtWidgets.QLineEdit(self) le_0xf199.setObjectName('le_0xf199') btn_read_0xf199 = QtWidgets.QPushButton(self) btn_read_0xf199.setText('read') btn_read_0xf199.setObjectName('btn_read_0xf199') btn_write_0xf199 = QtWidgets.QPushButton(self) btn_write_0xf199.setText('write') btn_write_0xf199.setObjectName('btn_write_0xf199') gl0 = QtWidgets.QGridLayout() gl0.addWidget(lb_0xf190, 0, 0, 1, 1) gl0.addWidget(le_0xf190, 0, 1, 1, 1) gl0.addWidget(btn_read_0xf190, 0, 2, 1, 1) gl0.addWidget(btn_write_0xf190, 0, 3, 1, 1) gl0.addWidget(lb_0xf1b1, 1, 0, 1, 1) gl0.addWidget(le_0xf1b1, 1, 1, 1, 1) gl0.addWidget(btn_read_0xf1b1, 1, 2, 1, 1) gl0.addWidget(lb_0xf1b2, 2, 0, 1, 1) gl0.addWidget(le_0xf1b2, 2, 1, 1, 1) gl0.addWidget(btn_read_0xf1b2, 2, 2, 1, 1) gl0.addWidget(btn_write_0xf1b2, 2, 3, 1, 1) gl0.addWidget(lb_0xf1d0, 3, 0, 1, 1) gl0.addWidget(le_0xf1d0, 3, 1, 1, 1) gl0.addWidget(btn_read_0xf1d0, 3, 2, 1, 1) gl0.addWidget(lb_0xf1d1, 4, 0, 1, 1) gl0.addWidget(le_0xf1d1, 4, 1, 1, 1) gl0.addWidget(btn_read_0xf1d1, 4, 2, 1, 1) gl0.addWidget(lb_0xf1d2, 5, 0, 1, 1) gl0.addWidget(le_0xf1d2, 5, 1, 1, 1) gl0.addWidget(btn_read_0xf1d2, 5, 2, 1, 1) gl0.addWidget(lb_0xf1d3, 6, 0, 1, 1) gl0.addWidget(le_0xf1d3, 6, 1, 1, 1) gl0.addWidget(btn_read_0xf1d3, 6, 2, 1, 1) gl0.addWidget(lb_0xf0df, 7, 0, 1, 1) gl0.addWidget(cb_0xf0df, 7, 1, 1, 1) gl0.addWidget(btn_read_0xf0df, 7, 2, 1, 1) gl0.addWidget(btn_write_0xf0df, 7, 3, 1, 1) gl0.addWidget(lb_0xf187, 8, 0, 1, 1) gl0.addWidget(le_0xf187, 8, 1, 1, 1) gl0.addWidget(btn_read_0xf187, 8, 2, 1, 1) gl0.addWidget(lb_0xf195, 9, 0, 1, 1) gl0.addWidget(le_0xf195, 9, 1, 1, 1) gl0.addWidget(btn_read_0xf195, 9, 2, 1, 1) gl0.addWidget(lb_0xf198, 10, 0, 1, 1) gl0.addWidget(le_0xf198, 10, 1, 1, 1) gl0.addWidget(btn_read_0xf198, 10, 2, 1, 1) gl0.addWidget(btn_write_0xf198, 10, 3, 1, 1) gl0.addWidget(lb_0xf199, 11, 0, 1, 1) gl0.addWidget(le_0xf199, 11, 1, 1, 1) gl0.addWidget(btn_read_0xf199, 11, 2, 1, 1) gl0.addWidget(btn_write_0xf199, 11, 3, 1, 1) tb_log_display = QtWidgets.QTextBrowser(self) tb_log_display.setObjectName('tb_log_display') hb1 = QtWidgets.QHBoxLayout() hb1.addWidget(tb_log_display) vb = QtWidgets.QVBoxLayout() vb.addLayout(hb0) vb.addLayout(gl0) vb.addLayout(hb1) self.setLayout(vb) QtCore.QMetaObject.connectSlotsByName(self) @QtCore.pyqtSlot(str) def on_cb_interface_type_currentIndexChanged(self, text): if text == 'vector': self.findChild(QtWidgets.QComboBox, 'cb_can_channel').setItemText(0, 'CH1/3') self.findChild(QtWidgets.QComboBox, 'cb_can_channel').setItemText(1, 'CH2/4') elif text == 'canalystii': self.findChild(QtWidgets.QComboBox, 'cb_can_channel').setItemText(0, 'CAN1') self.findChild(QtWidgets.QComboBox, 'cb_can_channel').setItemText(1, 'CAN2') @QtCore.pyqtSlot() def on_btn_open_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.open_device_task()) @QtCore.pyqtSlot() def on_btn_close_clicked(self): self.opened_flag = False self.client = None self.append_text_to_log_display('close device success') @QtCore.pyqtSlot() def on_btn_read_0xf190_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf190_task()) @QtCore.pyqtSlot() def on_btn_write_0xf190_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf190_task()) @QtCore.pyqtSlot() def on_btn_read_0xf1b1_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf1b1_task()) @QtCore.pyqtSlot() def on_btn_write_0xf1b1_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf1b1_task()) @QtCore.pyqtSlot() def on_btn_read_0xf1b2_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf1b2_task()) @QtCore.pyqtSlot() def on_btn_write_0xf1b2_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf1b2_task()) @QtCore.pyqtSlot() def on_btn_read_0xf1d0_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf1d0_task()) @QtCore.pyqtSlot() def on_btn_write_0xf1d0_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf1d0_task()) @QtCore.pyqtSlot() def on_btn_read_0xf1d1_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf1d1_task()) @QtCore.pyqtSlot() def on_btn_read_0xf1d2_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf1d2_task()) @QtCore.pyqtSlot() def on_btn_write_0xf1d2_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf1d2_task()) @QtCore.pyqtSlot() def on_btn_read_0xf1d3_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf1d3_task()) @QtCore.pyqtSlot() def on_btn_read_0xf0df_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf0df_task()) @QtCore.pyqtSlot() def on_btn_write_0xf0df_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf0df_task()) @QtCore.pyqtSlot() def on_btn_read_0xf187_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf187_task()) @QtCore.pyqtSlot() def on_btn_read_0xf195_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf195_task()) @QtCore.pyqtSlot() def on_btn_read_0xf198_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf198_task()) @QtCore.pyqtSlot() def on_btn_write_0xf198_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf198_task()) @QtCore.pyqtSlot() def on_btn_read_0xf199_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.read_0xf199_task()) @QtCore.pyqtSlot() def on_btn_write_0xf199_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf199_task()) @QtCore.pyqtSlot() def on_btn_write_0xf199_clicked(self): loop = asyncio.get_event_loop() loop.create_task(self.write_0xf199_task()) def append_text_to_log_display(self, text, color='#000000'): text = '%s' % (color, text) self.findChild(QtWidgets.QTextEdit, 'tb_log_display').append(text) def clear_log_display(self): self.findChild(QtWidgets.QTextEdit, 'tb_log_display').clear() async def open_device_task(self): if self.opened_flag is True: self.append_text_to_log_display('already opened', '#ff0000') return interface_type_index = self.findChild( QtWidgets.QComboBox, 'cb_interface_type').currentIndex() baudrate_index = self.findChild( QtWidgets.QComboBox, 'cb_baudrate').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} ] bitrate = list(TIMING_DICT.keys())[baudrate_index] try: bus: BusABC = None if interface_type_index == 0: bus = VectorBus(channel=can_channel_index, bitrate=bitrate, can_filters=can_filters) elif interface_type_index == 1: bus = CANalystIIBus(channel=can_channel_index, baud=bitrate, can_filters=can_filters) network = aioisotp.ISOTPNetwork(bus=bus) with network.open(): reader, writer = await network.open_connection(self.rx_id, self.tx_id) client = Client(reader, writer) client.config['data_identifiers'] = self.did_config self.client = client try: response = await client.tester_present(timeout=0.3) except asyncio.TimeoutError: pass except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') await client.change_session(3) await client.request_seed(1) await client.send_key(1, bytes([0x6d, 0xfb, 0x53, 0x20])) self.append_text_to_log_display('open device success') self.opened_flag = True while self.opened_flag: await client.tester_present(True) await asyncio.sleep(1) # print('tester present') except asyncio.TimeoutError: self.append_text_to_log_display('open device failed', '#ff0000') except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf190_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf190) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf190').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf190_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf190').text() await client.write_data_by_identifier(0xf190, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf1b1_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf1b1) data = response.strip() self.findChild(QtWidgets.QLineEdit, 'le_0xf1b1').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf1b1_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf1b1').text() await client.write_data_by_identifier(0xf1b1, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf1b2_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf1b2) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf1b2').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf1b2_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf1b2').text() await client.write_data_by_identifier(0xf1b2, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf1d0_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf1d0) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf1d0').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf1d0_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf1d0').text() await client.write_data_by_identifier(0xf1d0, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf1d1_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf1d1) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf1d1').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf1d2_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf1d2) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf1d2').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf1d2_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf1d2').text() await client.write_data_by_identifier(0xf1d2, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf1d3_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf1d3) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf1d3').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf0df_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf0df) data = response self.findChild(QtWidgets.QComboBox, 'cb_0xf0df').setCurrentIndex(int(data)) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf0df_task(self): try: client = self.client value = self.findChild(QtWidgets.QComboBox, 'cb_0xf0df').currentIndex() await client.write_data_by_identifier(0xf0df, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf187_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf187) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf187').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf195_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf195) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf195').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf198_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf198) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf198').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf198_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf198').text() await client.write_data_by_identifier(0xf198, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def read_0xf199_task(self): try: client = self.client response = await client.read_data_by_identifier_first(0xf199) data = response self.findChild(QtWidgets.QLineEdit, 'le_0xf199').setText(data) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000') async def write_0xf199_task(self): try: client = self.client value = self.findChild(QtWidgets.QLineEdit, 'le_0xf199').text() await client.write_data_by_identifier(0xf199, value) except Exception as e: self.append_text_to_log_display('%s' % e, '#ff0000')