From 20cc603922983f154d10b7d56c6b49e5e02997bd Mon Sep 17 00:00:00 2001
From: tao_z <tzj0429@163.com>
Date: Mon, 06 Jun 2022 00:13:05 +0800
Subject: [PATCH] 初步bootloader实现。dbc解析存在解析值不正确问题。

---
 widgets/ShifterTool.py     |  254 +++++----
 /dev/null                  |  345 -------------
 Shifter.py                 |   30 
 .gitignore                 |    4 
 .qt_for_python/uic/main.py |    2 
 dbc.py                     |  238 ++++----
 USBCAN.py                  |  267 +++++----
 DBC/SX7H.ini               |  165 ++++++
 DBC/DFLZM.dbc              |  230 ++++++++
 main.ui                    |    2 
 styleSheet.py              |    9 
 11 files changed, 852 insertions(+), 694 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5246cf4..997b4a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -147,3 +147,7 @@
 .vscode/*
 files/*
 .idea/*
+log/*
+source bin/*
+.qt_for_python/*
+sx7h_env/*
diff --git a/.qt_for_python/uic/main.py b/.qt_for_python/uic/main.py
index 1b0c42c..8f04f45 100644
--- a/.qt_for_python/uic/main.py
+++ b/.qt_for_python/uic/main.py
@@ -1033,7 +1033,7 @@
 
         self.retranslateUi(MainWindow)
 
-        self.tabWidget.setCurrentIndex(3)
+        self.tabWidget.setCurrentIndex(2)
         self.tabWidget_2.setCurrentIndex(2)
 
 
diff --git a/DBC/DFLZM.dbc b/DBC/DFLZM.dbc
new file mode 100644
index 0000000..1f4873b
--- /dev/null
+++ b/DBC/DFLZM.dbc
@@ -0,0 +1,230 @@
+VERSION ""
+
+
+NS_ : 
+	NS_DESC_
+	CM_
+	BA_DEF_
+	BA_
+	VAL_
+	CAT_DEF_
+	CAT_
+	FILTER
+	BA_DEF_DEF_
+	EV_DATA_
+	ENVVAR_DATA_
+	SGTYPE_
+	SGTYPE_VAL_
+	BA_DEF_SGTYPE_
+	BA_SGTYPE_
+	SIG_TYPE_REF_
+	VAL_TABLE_
+	SIG_GROUP_
+	SIG_VALTYPE_
+	SIGTYPE_VALTYPE_
+	BO_TX_BU_
+	BA_DEF_REL_
+	BA_REL_
+	BA_DEF_DEF_REL_
+	BU_SG_REL_
+	BU_EV_REL_
+	BU_BO_REL_
+	SG_MUL_VAL_
+
+BS_:
+
+BU_: GW_BCM_PT GW_BCM_PEPS_PT ABSESP AGS AMT AT CVT DAS EMS EPS SA SRS TBox TCU GW_Tester BCM
+
+
+BO_ 329 IC1: 8 GW_BCM_PT
+ SG_ odometer_value : 31|24@0+ (1,0) [0|1999999] "km"  ABSESP,AMT,AT,CVT,DAS,EMS,SA,TCU
+
+BO_ 534 CVT1: 8 CVT
+ SG_ Shifter_Lever_Signals : 63|8@0+ (1,0) [0|255] ""  GW_BCM_PT,GW_BCM_PEPS_PT,ABSESP,EMS,EPS,SA,TBox
+
+BO_ 530 Engine2: 8 EMS
+ SG_ brake_pedal_status : 57|2@0+ (1,0) [0|3] ""  ABSESP,AMT,AT,CVT,DAS,SA,SRS,TBox,TCU
+
+BO_ 1056 SA1: 8 SA
+ SG_ SA1_ShifterModeSignal : 1|2@0+ (1,0) [0|3] ""  AT,TCU
+ SG_ SA1_IND_ShifterMisUsd : 14|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ SA1_Status_ShftSensSng_Fault : 15|1@0+ (1,0) [0|1] ""  TCU
+ SG_ SA1_Status_EcoShifterModeReq : 16|1@0+ (1,0) [0|1] ""  TCU
+ SG_ SA1_Status_UnlockButtonReq : 17|1@0+ (1,0) [0|1] ""  TCU
+ SG_ SA1_Status_ParkButtonReq : 19|2@0+ (1,0) [0|3] ""  TCU
+ SG_ SA1_ShifterManualSignal : 4|3@0+ (1,0) [0|7] ""  AT,TCU
+ SG_ SA1_Status_GearShftPosReq : 23|4@0+ (1,0) [0|15] ""  TCU
+ SG_ SA1_Status_RqGearPosInV : 31|4@0+ (1,0) [0|15] ""  TCU
+ SG_ SA1_Status_ShiftPosValidFlag : 32|1@0+ (1,0) [0|1] "" Vector__XXX
+ SG_ SA1_Status_PRNDL : 7|3@0+ (1,0) [0|7] "" Vector__XXX
+ SG_ SA1_Live_counter : 11|4@0+ (1,0) [0|15] ""  AT,TCU
+
+BO_ 16 TCU2: 8 AT
+ SG_ ShiftLeverPos : 2|3@0+ (1,0) [0|7] ""  GW_BCM_PT,GW_BCM_PEPS_PT,ABSESP,DAS,EMS,EPS,SA,SRS,TBox
+ SG_ ActualGear : 14|4@0+ (1,0) [0|15] ""  ABSESP,DAS,EMS,SA
+ SG_ TCUDrivingMode : 10|3@0+ (1,0) [0|7] ""  EMS,SA
+
+BO_ 512 ABS1: 8 ABSESP
+ SG_ vehicle_speed : 15|13@0+ (0.05625,0) [0|270] "km/h"  GW_BCM_PT,GW_BCM_PEPS_PT,AGS,AMT,AT,DAS,EMS,EPS,SA,SRS,TBox,TCU
+
+BO_ 1858 BCM_DiagReq_CHINA_VI: 8 GW_Tester
+
+BO_ 1914 BCM_DiagResp_CHINA_VI: 8 BCM
+ SG_ EGSM_77A_DiagRep_8 : 63|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_7 : 55|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_6 : 47|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_5 : 39|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_4 : 31|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_3 : 23|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_2 : 15|8@0+ (1,0) [0|0] "" Vector__XXX
+ SG_ EGSM_77A_DiagRep_1 : 7|8@0+ (1,0) [0|0] "" Vector__XXX
+
+BO_ 2015 Func_DiagReq: 8 GW_Tester
+
+BO_TX_BU_ 329 : GW_BCM_PT,GW_BCM_PEPS_PT;
+BO_TX_BU_ 16 : AT,TCU;
+
+
+CM_ "Version:V2.5.3 , Date:2016/4/2 , Author:����� , Review: , Approval: , Description:���� ;
+Version:V2.5.5 , Date:2016.7.7 , Author:����� , Review: , Approval: , Description:1.SA���ӽ����ź�brake_pedal_status��Engine2����
+2.SA���ӽ����ź�ShiftLeverPos��AT2���� 
+3.SA�������ͱ���SA1,AT�������ź�SA1_ShifterModeSignal��SA1_ShifterManualSignal �� ;
+Version:V2.5.6 , Date:2016.11.09 , Author:����� , Review: , Approval: , Description:1.�����ź�ActualGear��AT2�����ź�ֵ���������ӡ�0x7:Current_gear_7���� ;
+Version:V2.5.8 , Date:2017.12.04 , Author:����� , Review: , Approval: , Description:1.���ӽڵ�TCU��
+2.����TCU�����ź�SA1_ShifterModeSignal��SA1_ShifterManualSignal��SA1_Live_counter��SA1����
+3.�����ź�SA1_Status_ShftSensSng_Fault��SA1_Status_EcoShifterModeReq��SA1_Status_UnlockButtonReq��SA1_Status_ParkButtonReq��SA1_Status_GearShftPosReq��SA1_Checksum��SA1����TCU���ա�
+4.���ӽڵ�GW_BCM��ABSESP��
+5.����SA�����ź�odometer_value��IC1����vehicle_speed��ABS1���� ;
+Version:V2.5.9 , Date:2018.04.10 , Author:���";
+CM_ SG_ 329 odometer_value "odometer value";
+CM_ SG_ 534 Shifter_Lever_Signals "Actual position measured inside the gearbox from the position sensor";
+CM_ SG_ 530 brake_pedal_status "brake pedal switch status
+����EMS���˫�����ƶ��ƿ��ص��ź���Ч�ԣ��ƶ��ƿ��ؽ����ٽ��������Чʱ���ڲ�Ӧ��0x3������0x3����ʾ�ƶ��ƿ��س���ʧЧ�����)
+1��While(brake_pedal_BLS_active=0  & brake_pedal_BTS_active=1), brake_pedal_status=0;   While(BLS=1  & BTS=0), brake_pedal_status=1; 
+2����brake_pedal_parity=0�����ҳ���ʱ�����˫·�ƶ������ٽ��������Чʱ�䣬brake_pedal_status=3;  �����ƶ������ٽ��������Чʱ��Ϊ50ms";
+CM_ SG_ 1056 SA1_ShifterModeSignal "Shifter Mode signal";
+CM_ SG_ 1056 SA1_IND_ShifterMisUsd "Shifter misoperation reminder.
+��������������ѡ�";
+CM_ SG_ 1056 SA1_Status_ShftSensSng_Fault "Indicate Shift Sensor Single Fault Status
+���ӻ���������������״̬";
+CM_ SG_ 1056 SA1_Status_EcoShifterModeReq "Eco Shifter Mode Request Status
+���ܼ�ʻģʽ����״̬";
+CM_ SG_ 1056 SA1_Status_UnlockButtonReq "Unlock Button Request Status
+������������״̬";
+CM_ SG_ 1056 SA1_Status_ParkButtonReq "Parking Button Request Status
+פ����������״̬";
+CM_ SG_ 1056 SA1_ShifterManualSignal "Shifter Manual Signal";
+CM_ SG_ 1056 SA1_Status_GearShftPosReq "Gear Shift Position Request Status
+���ӻ�������������״̬";
+CM_ SG_ 1056 SA1_Status_RqGearPosInV "Driver Requested Gear Shift Position Inverse
+���ӻ������������󻥲�У��";
+CM_ SG_ 1056 SA1_Status_ShiftPosValidFlag "Indicate Shift lever Pos valid or invalid Status
+�����ֱ�λ����Ч�ź�
+";
+CM_ SG_ 1056 SA1_Status_PRNDL "Gear Status 
+��λ״̬";
+CM_ SG_ 1056 SA1_Live_counter "Message counter";
+CM_ SG_ 16 ShiftLeverPos "Gear Selector Display: actual transmission Gear lever position based on the Transmission range selected by driver.";
+CM_ SG_ 16 ActualGear "Actual Gear: shows the transmission gear being currently engaged in the gear box.";
+CM_ SG_ 16 TCUDrivingMode "Driving program:
+Indicates the mode selection of TCU";
+CM_ SG_ 512 vehicle_speed "vehicle reference speed";
+BA_DEF_ BO_  "NmMessage" ENUM  "No","Yes";
+BA_DEF_ BO_  "DiagState" ENUM  "No","Yes";
+BA_DEF_ BO_  "DiagRequest" ENUM  "No","Yes";
+BA_DEF_ BO_  "DiagResponse" ENUM  "No","Yes";
+BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cycle","NoSendType","IfActive";
+BA_DEF_ BO_  "GenMsgCycleTime" INT 0 0;
+BA_DEF_ SG_  "GenSigSendType" ENUM  "Cycle","OnChange","OnWrite","IfActive","OnChangeWithRepetition","OnWriteWithRepetition","IfActiveWithRepetition";
+BA_DEF_ SG_  "GenSigStartValue" INT 0 0;
+BA_DEF_ SG_  "GenSigInactiveValue" INT 0 0;
+BA_DEF_ BO_  "GenMsgCycleTimeFast" INT 0 0;
+BA_DEF_ BO_  "GenMsgNrOfRepetition" INT 0 0;
+BA_DEF_ BO_  "GenMsgDelayTime" INT 0 0;
+BA_DEF_  "DBName" STRING ;
+BA_DEF_ BU_  "NodeLayerModules" STRING ;
+BA_DEF_ SG_  "GenSigTimeoutValue" INT 0 1000000000;
+BA_DEF_ BO_  "GenMsgCycleTimeActive" INT 0 0;
+BA_DEF_ BU_  "ILUsed" ENUM  "No","Yes";
+BA_DEF_ BU_  "DiagStationAddress" HEX 0 255;
+BA_DEF_ BU_  "NmNode" ENUM  "Not","Yes";
+BA_DEF_ BU_  "NmStationAddress" HEX 0 65535;
+BA_DEF_ BU_  "NmCAN" INT 0 2;
+BA_DEF_  "Manufacturer" STRING ;
+BA_DEF_  "NmType" STRING ;
+BA_DEF_  "NmBaseAddress" HEX 0 2047;
+BA_DEF_  "NmMessageCount" INT 0 255;
+BA_DEF_ BO_  "GenMsgILSupport" ENUM  "No","Yes";
+BA_DEF_ BO_  "GenMsgStartDelayTime" INT 0 65535;
+BA_DEF_  "BusType" STRING ;
+BA_DEF_DEF_  "NmMessage" "No";
+BA_DEF_DEF_  "DiagState" "No";
+BA_DEF_DEF_  "DiagRequest" "No";
+BA_DEF_DEF_  "DiagResponse" "No";
+BA_DEF_DEF_  "GenMsgSendType" "Cycle";
+BA_DEF_DEF_  "GenMsgCycleTime" 0;
+BA_DEF_DEF_  "GenSigSendType" "Cycle";
+BA_DEF_DEF_  "GenSigStartValue" 0;
+BA_DEF_DEF_  "GenSigInactiveValue" 0;
+BA_DEF_DEF_  "GenMsgCycleTimeFast" 0;
+BA_DEF_DEF_  "GenMsgNrOfRepetition" 0;
+BA_DEF_DEF_  "GenMsgDelayTime" 0;
+BA_DEF_DEF_  "DBName" "";
+BA_DEF_DEF_  "NodeLayerModules" "CANoeILNLVector.dll";
+BA_DEF_DEF_  "GenSigTimeoutValue" 0;
+BA_DEF_DEF_  "GenMsgCycleTimeActive" 0;
+BA_DEF_DEF_  "ILUsed" "No";
+BA_DEF_DEF_  "DiagStationAddress" 0;
+BA_DEF_DEF_  "NmNode" "Not";
+BA_DEF_DEF_  "NmStationAddress" 0;
+BA_DEF_DEF_  "NmCAN" 0;
+BA_DEF_DEF_  "Manufacturer" "";
+BA_DEF_DEF_  "NmType" "";
+BA_DEF_DEF_  "NmBaseAddress" 1024;
+BA_DEF_DEF_  "NmMessageCount" 128;
+BA_DEF_DEF_  "GenMsgILSupport" "No";
+BA_DEF_DEF_  "GenMsgStartDelayTime" 0;
+BA_DEF_DEF_  "BusType" "CAN";
+BA_ "DBName" "PTCAN";
+BA_ "GenMsgCycleTime" BO_ 329 10;
+BA_ "GenMsgCycleTime" BO_ 534 10;
+BA_ "GenMsgCycleTime" BO_ 530 10;
+BA_ "GenMsgDelayTime" BO_ 1056 20;
+BA_ "GenMsgNrOfRepetition" BO_ 1056 3;
+BA_ "GenMsgCycleTimeFast" BO_ 1056 20;
+BA_ "GenMsgCycleTime" BO_ 1056 100;
+BA_ "GenMsgCycleTime" BO_ 16 10;
+BA_ "GenMsgCycleTime" BO_ 512 20;
+BA_ "GenMsgSendType" BO_ 1858 8;
+BA_ "GenMsgCycleTime" BO_ 1858 0;
+BA_ "GenMsgILSupport" BO_ 1914 1;
+BA_ "GenMsgSendType" BO_ 1914 1;
+BA_ "GenMsgCycleTime" BO_ 1914 0;
+BA_ "GenMsgSendType" BO_ 2015 8;
+BA_ "GenMsgCycleTime" BO_ 2015 0;
+BA_ "GenSigStartValue" SG_ 530 brake_pedal_status 3;
+BA_ "GenSigStartValue" SG_ 1056 SA1_Status_GearShftPosReq 15;
+BA_ "GenSigSendType" SG_ 1056 SA1_Status_GearShftPosReq 4;
+BA_ "GenSigStartValue" SG_ 1056 SA1_Status_PRNDL 7;
+BA_ "GenSigStartValue" SG_ 16 ShiftLeverPos 7;
+BA_ "GenSigStartValue" SG_ 16 ActualGear 15;
+BA_ "GenSigStartValue" SG_ 512 vehicle_speed 8190;
+VAL_ 329 odometer_value 16777215 "Invalid" ;
+VAL_ 534 Shifter_Lever_Signals 24 "8" 23 "7" 22 "6" 21 "5" 20 "4" 19 "3" 18 "2" 17 "1" 15 "Invalid" 11 "Z4 (Between D and L)" 10 "Z3 (Between N and D)" 9 "Z2 (Between R and N)" 8 "Z1 (Between P and R)" 7 "P (Park)" 6 "R (Reverse)" 5 "N (Neutral)" 4 "D (Drive)" 3 "Sport mode,display PWR on IC." 0 "Unknown" ;
+VAL_ 530 brake_pedal_status 3 "Invalid" 2 "Not specified" 1 "Brake actuated" 0 "Brake not actuated" ;
+VAL_ 1056 SA1_ShifterModeSignal 3 "Error" 2 "Winter mode" 1 "Sport mode" 0 "Normal mode" ;
+VAL_ 1056 SA1_IND_ShifterMisUsd 7 "Reserved" 6 "Please make sure shiftlever in Park position" 5 "Reserved" 4 "Press brake pedal and push unlock button to change gear" 3 "Push unlock button to change gear" 2 "Vehicle speed is too high to change gear" 1 "Press brake pedal  to change gear" 0 "Invalid" ;
+VAL_ 1056 SA1_Status_ShftSensSng_Fault 1 "Shift sensor single fault" 0 "Shift sensor single OK" ;
+VAL_ 1056 SA1_Status_EcoShifterModeReq 1 "Request" 0 "No request" ;
+VAL_ 1056 SA1_Status_UnlockButtonReq 1 "Driver request unlock button" 0 "No request" ;
+VAL_ 1056 SA1_Status_ParkButtonReq 3 "Reserved" 2 "Park button fault" 1 "Driver request park button" 0 "No request" ;
+VAL_ 1056 SA1_ShifterManualSignal 7 "Error" 6 "Reserved" 5 "Reserved" 4 "Reserved" 3 "M- position" 2 "M+ position" 1 "Manual position" 0 "not manual" ;
+VAL_ 1056 SA1_Status_GearShftPosReq 15 "Signal not available / SNA (Double fault shifter sensor)" 14 "M" 13 "M+" 12 "M-" 11 "Reserved" 10 "Reserved" 9 "Reserved" 8 "Shifter not initialized / INIT" 7 "Reserved" 6 "Reserved" 5 "Shifter position five (backwards twice / Y2) / POS_FIVE" 4 "Shifter position four (backwards once / Y1) / POS_FOUR" 3 "Shifter position three (forward once / X1) / POS_THREE" 2 "Shifter position two (forward twice / X2) / POS_TWO" 1 "Reserved" 0 "Shifter position zero (Z) / POS_ZERO" ;
+VAL_ 1056 SA1_Status_RqGearPosInV 15 "Shifter position zero (Z) / POS_ZERO" 14 "Reserved" 13 "Shifter position two (forward twice / X2) / POS_TWO" 12 "Shifter position three (forward once / X1) / POS_THREE" 11 "Shifter position four (backwards once / Y1) / POS_FOUR" 9 "Reserved" 8 "Reserved" 7 "Shifter not initialized / INIT" 6 "Reserved" 5 "Reserved" 4 "Reserved" 3 "M-" 2 "M+" 1 "M" 0 "AShifterpositionfive(backwardstwice/Y2)/POS_FIVE" 0 "Signal not available / SNA (Double fault shifter sensor)" ;
+VAL_ 1056 SA1_Status_ShiftPosValidFlag 1 "invalid" 0 "valid" ;
+VAL_ 1056 SA1_Status_PRNDL 7 "Invalid" 6 "Reserved" 5 "Reserved" 4 "Reserved" 3 "R" 2 "N" 1 "D" 0 "P" ;
+VAL_ 16 ShiftLeverPos 7 "Invalid" 6 "M-��GJT:Reserved��" 5 "M+��GJT:Reserved��" 4 "M" 3 "R" 2 "N" 1 "D" 0 "P" ;
+VAL_ 16 ActualGear 15 "Invalid" 14 "Reserved" 13 "Current_gear_P" 12 "Reserved" 11 "Current_gear_R" 10 "Reserved" 9 "Reserved" 8 "Reserved" 7 "Current_gear_7" 6 "Current_gear_6" 5 "Current_gear_5" 4 "Current_gear_4" 3 "Current_gear_3" 2 "Current_gear_2" 1 "Current_gear_1" 0 "Current_gear_N" ;
+VAL_ 16 TCUDrivingMode 7 "Invalid" 6 "Reserved" 5 "Reserved" 4 "Sport" 3 "Reserved��GJT:Normal��" 2 "Manual" 1 "Snow Mode��GJT:Reserved��" 0 "Standard(Economic)��GJT:ECO��" ;
+VAL_ 512 vehicle_speed 8191 "Invalid" ;
+
diff --git a/DBC/SX7H.ini b/DBC/SX7H.ini
new file mode 100644
index 0000000..d0a65f0
--- /dev/null
+++ b/DBC/SX7H.ini
@@ -0,0 +1,165 @@
+[View_Vehicles]
+HIDDEN=
+ORDER=0,1,
+DEFINITIONS=
+COLUMNWIDTHS=250,150,
+[View_Vehicle]
+HIDDEN=
+ORDER=0,1,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,
+[View_VehicleNetworks]
+HIDDEN=3,
+ORDER=0,1,2,3,4,
+DEFINITIONS=1,
+COLUMNWIDTHS=250,250,100,100,150,100,
+[View_VehicleNetwork]
+HIDDEN=
+ORDER=0,1,2,3,4,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,250,150,
+[View_VehicleNetworkTxMessages]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,55,100,50,100,100,100,150,
+[View_VehicleNetworkSignals]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,100,50,100,100,100,50,50,50,50,100,100,150,
+[View_VehicleControlUnit]
+HIDDEN=
+ORDER=0,1,2,3,4,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,250,150,
+[View_VehicleGateways]
+HIDDEN=
+ORDER=0,1,2,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,
+[View_VehicleGatewaySignals]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,250,250,250,250,250,
+[View_Networks]
+HIDDEN=2,
+ORDER=0,1,2,3,
+DEFINITIONS=1,
+COLUMNWIDTHS=250,100,100,150,100,
+[View_Network]
+HIDDEN=
+ORDER=0,1,2,3,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,150,
+[View_NetworkTxMessages]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,55,100,50,100,100,100,150,
+[View_NetworkTxSignals]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,100,50,100,100,100,50,50,50,50,100,100,150,-1,
+[View_NetworkNodeGroup]
+HIDDEN=
+ORDER=0,1,2,
+DEFINITIONS=
+COLUMNWIDTHS=250,100,150,
+[View_Ecus]
+HIDDEN=
+ORDER=0,1,
+DEFINITIONS=
+COLUMNWIDTHS=250,150,
+[View_Ecu]
+HIDDEN=
+ORDER=0,1,2,3,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,150,
+[View_EnvVars]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,
+DEFINITIONS=
+COLUMNWIDTHS=250,100,100,50,50,50,50,100,100,150,
+[View_EnvVar]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,100,50,50,50,50,100,100,150,
+[View_NodeGroups]
+HIDDEN=
+ORDER=0,1,
+DEFINITIONS=
+COLUMNWIDTHS=250,150,
+[View_NodeGroup]
+HIDDEN=
+ORDER=0,1,2,3,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,55,150,
+[View_Nodes]
+HIDDEN=
+ORDER=0,1,2,
+DEFINITIONS=
+COLUMNWIDTHS=250,100,150,
+[View_Node]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,50,100,100,100,50,50,50,50,100,100,150,-1,
+[View_NodeTxMessages]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,55,100,50,100,100,150,
+[View_NodeTxMsg]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,50,100,100,100,50,50,50,50,100,100,150,-1,
+[View_NodeTxSignals]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,50,100,100,100,50,50,50,50,100,100,150,-1,
+[View_NodeRxSignals]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,50,100,100,100,50,50,50,50,100,100,150,-1,
+[View_NodeTxSigs]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,50,100,100,100,50,50,50,50,100,100,150,
+[View_NodeRxSigs]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,50,100,100,100,50,50,50,50,100,100,150,
+[View_Messages]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,
+DEFINITIONS=
+COLUMNWIDTHS=250,55,100,50,100,100,100,150,
+[View_Message]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
+DEFINITIONS=
+COLUMNWIDTHS=250,250,100,50,50,100,100,100,50,50,50,50,100,100,150,
+[View_Signals]
+HIDDEN=
+ORDER=0,1,2,3,4,5,6,7,8,9,10,11,12,
+DEFINITIONS=
+COLUMNWIDTHS=250,50,100,100,100,50,50,50,50,100,100,150,100,
+[View_ValueTables]
+HIDDEN=
+ORDER=0,1,
+DEFINITIONS=
+COLUMNWIDTHS=250,150,
+[View_AttrDefs]
+HIDDEN=6,
+ORDER=0,1,2,3,4,5,
+DEFINITIONS=
+COLUMNWIDTHS=250,100,100,50,50,100,150,
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index e6229fe..0000000
--- a/Pipfile
+++ /dev/null
@@ -1,21 +0,0 @@
-[[source]]
-name = "pypi"
-url = "https://mirrors.aliyun.com/pypi/simple/"
-verify_ssl = false
-
-[dev-packages]
-autopep8 = "==1.4.4"
-pylint = "==2.3.1"
-
-[packages]
-aioisotp = "==0.1.1"
-udsoncan = "==1.8"
-pyqt5 = "==5.12.2"
-asyncqt = "==0.7.0"
-autopep8 = "==1.4.4"
-pylint = "==2.3.1"
-pyinstaller = "==3.5"
-pywin32-ctypes ="==0.2.0"
-
-[requires]
-python_version = "3.7"
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index e6e02e6..0000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,436 +0,0 @@
-{
-    "_meta": {
-        "hash": {
-            "sha256": "52208087d2a67939bdd327679176e1be6ac48f123bc907ac01736becd16fe1f5"
-        },
-        "pipfile-spec": 6,
-        "requires": {
-            "python_version": "3.7"
-        },
-        "sources": [
-            {
-                "name": "pypi",
-                "url": "https://mirrors.aliyun.com/pypi/simple/",
-                "verify_ssl": false
-            }
-        ]
-    },
-    "default": {
-        "aenum": {
-            "hashes": [
-                "sha256:284ddb976413d97239a932d7e5202ba58d66e5dbd81531bf3033ebb36ec30b23",
-                "sha256:a4334cabf47c167d44ab5a6198837b80deec5d5bad1b5cf70c966c3a330260e8",
-                "sha256:d2bb6ea7586aaae889d3a5c332eafa851eeffe6e7068807c79b6c86c4326b938"
-            ],
-            "version": "==2.2.3"
-        },
-        "aioisotp": {
-            "hashes": [
-                "sha256:27bcffe39835e937e7be2f3374e613399d2c95631b324d292caf1f5a18f829bd",
-                "sha256:f998284978a7a41a5b527fdcf1555fe7996fd98e80b48dbe95c005df1ddf1b4a"
-            ],
-            "index": "pypi",
-            "version": "==0.1.1"
-        },
-        "altgraph": {
-            "hashes": [
-                "sha256:1f05a47122542f97028caf78775a095fbe6a2699b5089de8477eb583167d69aa",
-                "sha256:c623e5f3408ca61d4016f23a681b9adb100802ca3e3da5e718915a9e4052cebe"
-            ],
-            "version": "==0.17"
-        },
-        "astroid": {
-            "hashes": [
-                "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a",
-                "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"
-            ],
-            "version": "==2.3.3"
-        },
-        "asyncqt": {
-            "hashes": [
-                "sha256:8b1507c968c85cf0b7eee5d2a887162d38af15fb8c5b1ec25beed6025d7383ac",
-                "sha256:e0f51a0c27d7276b50ef2a4539e0d56bbcf5e837854caba40b41741dbe36ffb3"
-            ],
-            "index": "pypi",
-            "version": "==0.7.0"
-        },
-        "autopep8": {
-            "hashes": [
-                "sha256:4d8eec30cc81bc5617dbf1218201d770dc35629363547f17577c61683ccfb3ee"
-            ],
-            "index": "pypi",
-            "version": "==1.4.4"
-        },
-        "colorama": {
-            "hashes": [
-                "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff",
-                "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"
-            ],
-            "markers": "sys_platform == 'win32'",
-            "version": "==0.4.3"
-        },
-        "future": {
-            "hashes": [
-                "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
-            ],
-            "version": "==0.18.2"
-        },
-        "isort": {
-            "hashes": [
-                "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
-                "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
-            ],
-            "version": "==4.3.21"
-        },
-        "lazy-object-proxy": {
-            "hashes": [
-                "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
-                "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
-                "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
-                "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
-                "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
-                "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
-                "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
-                "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
-                "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
-                "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
-                "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
-                "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
-                "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
-                "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
-                "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
-                "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
-                "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
-                "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
-                "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
-                "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
-                "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
-            ],
-            "version": "==1.4.3"
-        },
-        "mccabe": {
-            "hashes": [
-                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
-                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
-            ],
-            "version": "==0.6.1"
-        },
-        "packaging": {
-            "hashes": [
-                "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73",
-                "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334"
-            ],
-            "version": "==20.1"
-        },
-        "pefile": {
-            "hashes": [
-                "sha256:a5d6e8305c6b210849b47a6174ddf9c452b2888340b8177874b862ba6c207645"
-            ],
-            "version": "==2019.4.18"
-        },
-        "pycodestyle": {
-            "hashes": [
-                "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56",
-                "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"
-            ],
-            "version": "==2.5.0"
-        },
-        "pyinstaller": {
-            "hashes": [
-                "sha256:ee7504022d1332a3324250faf2135ea56ac71fdb6309cff8cd235de26b1d0a96"
-            ],
-            "index": "pypi",
-            "version": "==3.5"
-        },
-        "pylint": {
-            "hashes": [
-                "sha256:5d77031694a5fb97ea95e828c8d10fc770a1df6eb3906067aaed42201a8a6a09",
-                "sha256:723e3db49555abaf9bf79dc474c6b9e2935ad82230b10c1138a71ea41ac0fff1"
-            ],
-            "index": "pypi",
-            "version": "==2.3.1"
-        },
-        "pyparsing": {
-            "hashes": [
-                "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f",
-                "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec"
-            ],
-            "version": "==2.4.6"
-        },
-        "pyqt5": {
-            "hashes": [
-                "sha256:06cb9a1ea1289ca2b2d81f9a2da44a05029d5b4d36fa47b6a0c0b9027ff03fef",
-                "sha256:44b263f395045eb5bba34f4df2d269e07b1e073fd359645b022943dd1accadfd",
-                "sha256:bb4ec5583baa18f741ec6c229489dc1910290d4ce4d6756a2ea062f7bf6456e6",
-                "sha256:c168a8883bbe7877809c3239c5dcfb9e8de5fe7e8e828c8add7e4f77cc8fc02a"
-            ],
-            "index": "pypi",
-            "version": "==5.12.2"
-        },
-        "pyqt5-sip": {
-            "hashes": [
-                "sha256:1115728644bbadcde5fc8a16e7918bd31915a42dd6fb36b10d4afb78c582753e",
-                "sha256:1f4289276d355b6521dc2cc956189315da6f13adfb6bbab8f25ebd15e3bce1d4",
-                "sha256:288c6dc18a8d6a20981c07b715b5695d9b66880778565f3792bc6e38f14f20fb",
-                "sha256:3f665376d9e52faa9855c3736a66ce6d825f85c86d7774d3c393f09da23f4f86",
-                "sha256:6b4860c4305980db509415d0af802f111d15f92016c9422eb753bc8883463456",
-                "sha256:7ffa39763097f64de129cf5cc770a651c3f65d2466b4fe05bef2bd2efbaa38e6",
-                "sha256:8a18e6f45d482ddfe381789979d09ee13aa6450caa3a0476503891bccb3ac709",
-                "sha256:8da842d3d7bf8931d1093105fb92702276b6dbb7e801abbaaa869405d616171a",
-                "sha256:b42021229424aa44e99b3b49520b799fd64ff6ae8b53f79f903bbd85719a28e4",
-                "sha256:b5b4906445fe980aee76f20400116b6904bf5f30d0767489c13370e42a764020",
-                "sha256:c1e730a9eb2ec3869ed5d81b0f99f6e2460fb4d77750444c0ec183b771d798f7",
-                "sha256:cbeeae6b45234a1654657f79943f8bccd3d14b4e7496746c62cf6fbce69442c7",
-                "sha256:d46b0f8effc554de52a1466b1bd80e5cb4bce635a75ac4e7ad6247c965dec5b9",
-                "sha256:e28c3abc9b62a1b7e796891648b9f14f8167b31c8e7990fae79654777252bb4d",
-                "sha256:e6078f5ee7d31c102910d0c277a110e1c2a20a3fc88cd017a39e170120586d3f",
-                "sha256:ee1a12f09d5af2304273bfd2f6b43835c1467d5ed501a6c95f5405637fa7750a",
-                "sha256:f314f31f5fd39b06897f013f425137e511d45967150eb4e424a363d8138521c6"
-            ],
-            "version": "==12.7.1"
-        },
-        "python-can": {
-            "hashes": [
-                "sha256:5fefb5c1e7e7f07faefc02c6eac79f9b58376f007048a04d8e7f325d48ec6b2e"
-            ],
-            "version": "==3.3.2"
-        },
-        "pywin32": {
-            "hashes": [
-                "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be",
-                "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511",
-                "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0",
-                "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507",
-                "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116",
-                "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e",
-                "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc",
-                "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2",
-                "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4",
-                "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295",
-                "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c",
-                "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"
-            ],
-            "index": "pypi",
-            "version": "==227"
-        },
-        "pywin32-ctypes": {
-            "hashes": [
-                "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942",
-                "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"
-            ],
-            "version": "==0.2.0"
-        },
-        "sip": {
-            "hashes": [
-                "sha256:066654acad02685cbdc84c3741e56b45845505426e9fc3c193fd3fe09afc0738",
-                "sha256:1b4c78e57b5876b9848c7634dbde5f9a1eff21cc13d0c589d461b5d4370b8b09",
-                "sha256:3b600dd1c8293bb7cf002a20dbbc736010c6a5e161241d73b16685744ffe57c2",
-                "sha256:42f7d43379e8f9bb50997870e94bdd691eadfe61ca2dfd679f821144afb50f24",
-                "sha256:4fe6f7e1a1f1bf38cbc6cbc5f0888934d8fc101d1478b0514477a7b44f3d41c0",
-                "sha256:62df2afa4c872bcac15746d8082de0ff14cfff6a487d5e25c6568bff5298cb88",
-                "sha256:9193914b685d02cd9a3d562d0132ab2297bc7b518a591a4ef39a1ca59da31fdd",
-                "sha256:9f331f61250df2427a92acabf18dfb2383e6ca74407fc5ff05c1cb037b03b62f",
-                "sha256:b2fda76ecb78df121fc165104050890c23ac41fa91e2a7d1b9a37aa22b212550",
-                "sha256:ba4a8a75bde2e58ee5bf28cf7c1aa3e90d2f51e9386ab812b0220786d684b340",
-                "sha256:bc9e061b16e6b3836621d4f6e6e8af0db3f2715643d54b975359ddb754896439",
-                "sha256:d08f9566f9a869d390f0c70e8e514eb4f650c56e5f1bd894fbceb793b598b9f0",
-                "sha256:de370fc4048684123c78f2f6e261d9ac53b51dc005f727f362e4e671322cdbd5",
-                "sha256:e896200e4a05bc8bf2ad5da3a9f733ca56f313bf0c6366a71677b39fd6a2ec2f",
-                "sha256:eeba96ca1d1bbf8de9b262df500176a689bdfc338d0f418eca7ff432731839a4",
-                "sha256:f287bb196e3453365032bc0931b61419e0a61631729f7ffa2df1aba5c49514d7",
-                "sha256:fbf8f71a26a94f7e32eb780bea0e55856dbb99dbcf33a99529565ed5cd060259"
-            ],
-            "index": "pypi",
-            "version": "==5.1.1"
-        },
-        "six": {
-            "hashes": [
-                "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
-                "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
-            ],
-            "version": "==1.14.0"
-        },
-        "toml": {
-            "hashes": [
-                "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c",
-                "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"
-            ],
-            "version": "==0.10.0"
-        },
-        "typed-ast": {
-            "hashes": [
-                "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
-                "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
-                "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
-                "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
-                "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
-                "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
-                "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
-                "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
-                "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
-                "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
-                "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
-                "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
-                "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
-                "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
-                "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
-                "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
-                "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
-                "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
-                "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
-                "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
-                "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
-            ],
-            "markers": "implementation_name == 'cpython' and python_version < '3.8'",
-            "version": "==1.4.1"
-        },
-        "udsoncan": {
-            "hashes": [
-                "sha256:beb34bf11c229131c2e87fd0e0263b91787913e79d8462408e8cb04666351e8b",
-                "sha256:c71195d3a8fa10f0b17fb13d705c0dd2a37c1100855d95e6c3fede3e8fef3c3b"
-            ],
-            "index": "pypi",
-            "version": "==1.8"
-        },
-        "windows-curses": {
-            "hashes": [
-                "sha256:261fde5680d1ce4ce116908996b9a3cfb0ffb03ea68d42240f62b56a9fa6af2c",
-                "sha256:66034dc9a705d87308cc9ea90836f4ee60008a1d5e2c1d34ace627f60268158b",
-                "sha256:669caad3ae16faf2d201d7ab3b8af418a2fd074d8a39d60ca26f3acb34b6afe5",
-                "sha256:73bd3eebccfda55330783f165151de115bfa238d1332f0b2e224b550d6187840",
-                "sha256:89a6d973f88cfe49b41ea80164dcbec209d296e0cec34a02002578b0bf464a64",
-                "sha256:8ba7c000d7ffa5452bbd0966b96e69261e4f117ebe510aeb8771a9650197b7f0",
-                "sha256:97084c6b37b1534f6a28a514d521dfae402f77dcbad42b14ee32e8d5bdc13648",
-                "sha256:9e474a181f96d60429a4766145628264e60b72e7715876f9135aeb2e842f9433",
-                "sha256:cfe64c30807c146ef8d094412f90f2a2c81ad6aefff3ebfe8e37aabe2f801303",
-                "sha256:ff8c67f74b88944d99fa9d22971c05c335bc74f149120f0a69340c2c3a595497"
-            ],
-            "version": "==2.1.0"
-        },
-        "wrapt": {
-            "hashes": [
-                "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
-            ],
-            "version": "==1.11.2"
-        }
-    },
-    "develop": {
-        "astroid": {
-            "hashes": [
-                "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a",
-                "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"
-            ],
-            "version": "==2.3.3"
-        },
-        "autopep8": {
-            "hashes": [
-                "sha256:4d8eec30cc81bc5617dbf1218201d770dc35629363547f17577c61683ccfb3ee"
-            ],
-            "index": "pypi",
-            "version": "==1.4.4"
-        },
-        "colorama": {
-            "hashes": [
-                "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff",
-                "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"
-            ],
-            "markers": "sys_platform == 'win32'",
-            "version": "==0.4.3"
-        },
-        "isort": {
-            "hashes": [
-                "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
-                "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
-            ],
-            "version": "==4.3.21"
-        },
-        "lazy-object-proxy": {
-            "hashes": [
-                "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
-                "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
-                "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
-                "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
-                "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
-                "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
-                "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
-                "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
-                "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
-                "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
-                "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
-                "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
-                "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
-                "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
-                "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
-                "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
-                "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
-                "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
-                "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
-                "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
-                "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
-            ],
-            "version": "==1.4.3"
-        },
-        "mccabe": {
-            "hashes": [
-                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
-                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
-            ],
-            "version": "==0.6.1"
-        },
-        "pycodestyle": {
-            "hashes": [
-                "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56",
-                "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"
-            ],
-            "version": "==2.5.0"
-        },
-        "pylint": {
-            "hashes": [
-                "sha256:5d77031694a5fb97ea95e828c8d10fc770a1df6eb3906067aaed42201a8a6a09",
-                "sha256:723e3db49555abaf9bf79dc474c6b9e2935ad82230b10c1138a71ea41ac0fff1"
-            ],
-            "index": "pypi",
-            "version": "==2.3.1"
-        },
-        "six": {
-            "hashes": [
-                "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
-                "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
-            ],
-            "version": "==1.14.0"
-        },
-        "typed-ast": {
-            "hashes": [
-                "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
-                "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
-                "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
-                "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
-                "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
-                "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
-                "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
-                "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
-                "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
-                "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
-                "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
-                "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
-                "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
-                "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
-                "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
-                "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
-                "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
-                "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
-                "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
-                "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
-                "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
-            ],
-            "markers": "implementation_name == 'cpython' and python_version < '3.8'",
-            "version": "==1.4.1"
-        },
-        "wrapt": {
-            "hashes": [
-                "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
-            ],
-            "version": "==1.11.2"
-        }
-    }
-}
diff --git a/Shifter.py b/Shifter.py
index c920bd0..9cf09ee 100644
--- a/Shifter.py
+++ b/Shifter.py
@@ -1,4 +1,3 @@
-
 from ShifterDefine import *
 import struct
 from udsoncan import DidCodec
@@ -11,8 +10,7 @@
 
     def __init__(self, string_len=None):
         if string_len is None:
-            raise ValueError(
-                "You must provide a length to the AsciiCodec")
+            raise ValueError("You must provide a length to the AsciiCodec")
         self.string_len = string_len
 
     def encode(self, string_ascii):
@@ -37,6 +35,7 @@
 
 
 class PartNumberCodec(DidCodec):
+
     def __init__(self, byte_len=None):
         if byte_len is None:
             raise ValueError(
@@ -69,6 +68,7 @@
 
 
 class PartNumberVersionCodec(DidCodec):
+
     def __init__(self, byte_len=None):
         if byte_len is None:
             raise ValueError(
@@ -116,7 +116,7 @@
 
         data = bytearray()
         for i in range(self.byte_len):
-            part = string_ascii[2 * i: 2 * i + 2]
+            part = string_ascii[2 * i:2 * i + 2]
             data.append(int(part, 16))
 
         return data
@@ -132,7 +132,11 @@
         return self.byte_len
 
 
+UnlockButton_dic = {"Unlock Button No Request": 0, "Unlock Button Request": 1}
+
+
 class ShifterClass():
+
     def __init__(self):
         self.position = ShifterPosition(0)
         self.Pbutton = 0
@@ -166,7 +170,6 @@
             0x211B: PartNumberCodec(1),
             0x211c: PartNumberCodec(2),
             0xF197: AsciiCodec(8),
-
             0xF15a: AsciiCodec(10),
             0xF15B: AsciiCodec(10),
         }
@@ -182,13 +185,14 @@
             self.canid.phy_rxId = 0x742
             self.canid.fun_rxId = 0x7df
             self.canid.normalid = 0x420
-        self.dbc = DBC("DBC/SX7H.dbc")
+        self.dbc = DBC("DBC/DFLZM.dbc")
 
     def FramUnpack(self, id=0x420, frame=[]):
-        data = []
-        data.append(' '.join(['0x' +
-                              '{:0<2x}'.format(a).upper() for a in list(frame)]))
-        unpackframe = self.dbc.analyzer(msgid=0x420, data=data)
-        self.position = ShifterPosition(unpackframe[4]['value']['raw'])
-        self.Pbutton = unpackframe[5]['value']['raw']
-        self.UnlockButton = unpackframe[6]['value']['raw']
+        data = ' '.join(['{:0<2x}'.format(a).upper() for a in list(frame)])
+        unpackframe = self.dbc.analyzer(msgid=0x420, data=str(data))
+        # print(unpackframe[5]['value']['raw'])
+        self.Pbutton = unpackframe[5]['value']['phy']
+        # print(unpackframe[6]['value']['raw'])
+        self.UnlockButton = unpackframe[4]['value']['phy']
+        # print(unpackframe[4]['value']['raw'])
+        self.position = unpackframe[7]['value']['phy']
diff --git a/USBCAN.py b/USBCAN.py
index 89eebe0..32adf03 100644
--- a/USBCAN.py
+++ b/USBCAN.py
@@ -1,3 +1,4 @@
+from asyncio.log import logger
 from ctypes import *
 from curses import raw
 # import platform
@@ -50,7 +51,6 @@
 SEND_SINGLE = 1
 SELF_SEND_RECV = 2
 SELF_SEND_RECV_SINGLE = 3
-
 '''
  Interface return status
 '''
@@ -62,52 +62,84 @@
 
 
 class VCI_INIT_CONFIG(Structure):
-    _fields_ = [("AccCode", c_ulong),
-                ("AccMask", c_ulong),
-                ("Reserved", c_ulong),
-                ("Filter", c_ubyte),
-                ("Timing0", c_ubyte),
-                ("Timing1", c_ubyte),
-                ("Mode", c_ubyte)
-                ]
+    _fields_ = [("AccCode", c_ulong), ("AccMask", c_ulong),
+                ("Reserved", c_ulong), ("Filter", c_ubyte),
+                ("Timing0", c_ubyte), ("Timing1", c_ubyte), ("Mode", c_ubyte)]
 
 
 class VCI_CAN_OBJ(Structure):
-    _fields_ = [("ID", c_uint),
-                ("TimeStamp", c_uint),
-                ("TimeFlag", c_ubyte),
-                ("SendType", c_ubyte),
-                ("RemoteFlag", c_ubyte),
-                ("ExternFlag", c_ubyte),
-                ("DataLen", c_ubyte),
-                ("Data", c_ubyte*8),
-                ("Reserved", c_ubyte*3)
-                ]
+    _fields_ = [("ID", c_uint), ("TimeStamp", c_uint), ("TimeFlag", c_ubyte),
+                ("SendType", c_ubyte), ("RemoteFlag", c_ubyte),
+                ("ExternFlag", c_ubyte), ("DataLen", c_ubyte),
+                ("Data", c_ubyte * 8), ("Reserved", c_ubyte * 3)]
 
 
 class PVCI_ERR_INFO(Structure):
-    _fields_ = [("ErrorCode", c_uint),
-                ("PassiveErrData", c_ubyte*3),
-                ("ArLostErrData", c_ubyte)
-                ]
+    _fields_ = [("ErrorCode", c_uint), ("PassiveErrData", c_ubyte * 3),
+                ("ArLostErrData", c_ubyte)]
 
 
 baudRateConfig = {
-    '5Kbps': {'time0': 0xBF, 'time1': 0xFF},
-    '10Kbps': {'time0': 0x31, 'time1': 0x1C},
-    '20Kbps': {'time0': 0x18, 'time1': 0x1C},
-    '40Kbps': {'time0': 0x87, 'time1': 0xFF},
-    '50Kbps': {'time0': 0x09, 'time1': 0x1C},
-    '80Kbps': {'time0': 0x83, 'time1': 0xFF},
-    '100Kbps': {'time0': 0x04, 'time1': 0x1C},
-    '125Kbps': {'time0': 0x03, 'time1': 0x1C},
-    '200Kbps': {'time0': 0x81, 'time1': 0xFA},
-    '250Kbps': {'time0': 0x01, 'time1': 0x1C},
-    '400Kbps': {'time0': 0x80, 'time1': 0xFA},
-    '500Kbps': {'time0': 0x00, 'time1': 0x1C},
-    '666Kbps': {'time0': 0x80, 'time1': 0xB6},
-    '800Kbps': {'time0': 0x00, 'time1': 0x16},
-    '1000Kbps': {'time0': 0x00, 'time1': 0x14},
+    '5Kbps': {
+        'time0': 0xBF,
+        'time1': 0xFF
+    },
+    '10Kbps': {
+        'time0': 0x31,
+        'time1': 0x1C
+    },
+    '20Kbps': {
+        'time0': 0x18,
+        'time1': 0x1C
+    },
+    '40Kbps': {
+        'time0': 0x87,
+        'time1': 0xFF
+    },
+    '50Kbps': {
+        'time0': 0x09,
+        'time1': 0x1C
+    },
+    '80Kbps': {
+        'time0': 0x83,
+        'time1': 0xFF
+    },
+    '100Kbps': {
+        'time0': 0x04,
+        'time1': 0x1C
+    },
+    '125Kbps': {
+        'time0': 0x03,
+        'time1': 0x1C
+    },
+    '200Kbps': {
+        'time0': 0x81,
+        'time1': 0xFA
+    },
+    '250Kbps': {
+        'time0': 0x01,
+        'time1': 0x1C
+    },
+    '400Kbps': {
+        'time0': 0x80,
+        'time1': 0xFA
+    },
+    '500Kbps': {
+        'time0': 0x00,
+        'time1': 0x1C
+    },
+    '666Kbps': {
+        'time0': 0x80,
+        'time1': 0xB6
+    },
+    '800Kbps': {
+        'time0': 0x00,
+        'time1': 0x16
+    },
+    '1000Kbps': {
+        'time0': 0x00,
+        'time1': 0x14
+    },
 }
 
 TIMING_DICT = {
@@ -136,22 +168,20 @@
 
 
 class USBCAN_DEVICE_INFO(Structure):
-    _fields_ = [("hw_Version", c_ushort),
-                ("fw_Version", c_ushort),
-                ("dr_Version", c_ushort),
-                ("in_Version", c_ushort),
-                ("irq_Num", c_ushort),
-                ("can_Num", c_ubyte),
+    _fields_ = [("hw_Version", c_ushort), ("fw_Version", c_ushort),
+                ("dr_Version", c_ushort), ("in_Version", c_ushort),
+                ("irq_Num", c_ushort), ("can_Num", c_ubyte),
                 ("str_Serial_Num", c_ubyte * 20),
-                ("str_hw_Type", c_ubyte * 40),
-                ("reserved", c_ushort * 4)]
+                ("str_hw_Type", c_ubyte * 40), ("reserved", c_ushort * 4)]
 
     def __str__(self):
         return "Hardware Version:%s\nFirmware Version:%s\nDriver Interface:%s\nInterface Interface:%s\nInterrupt Number:%d\nCAN Number:%d\nSerial:%s\nHardware Type:%s\n" % (
-            self.hw_version, self.fw_version, self.dr_version, self.in_version, self.irq_num, self.can_num, self.serial, self.hw_type)
+            self.hw_version, self.fw_version, self.dr_version, self.in_version,
+            self.irq_num, self.can_num, self.serial, self.hw_type)
 
     def _version(self, version):
-        return ("V%02x.%02x" if version // 0xFF >= 9 else "V%d.%02x") % (version // 0xFF, version & 0xFF)
+        return ("V%02x.%02x" if version // 0xFF >= 9 else
+                "V%d.%02x") % (version // 0xFF, version & 0xFF)
 
     @property
     def hw_version(self):
@@ -199,25 +229,16 @@
 
 
 class _USBCAN_CHANNEL_CAN_INIT_CONFIG(Structure):
-    _fields_ = [("acc_code", c_uint),
-                ("acc_mask", c_uint),
-                ("reserved", c_uint),
-                ("filter",   c_ubyte),
-                ("timing0",  c_ubyte),
-                ("timing1",  c_ubyte),
-                ("mode",     c_ubyte)]
+    _fields_ = [("acc_code", c_uint), ("acc_mask", c_uint),
+                ("reserved", c_uint), ("filter", c_ubyte),
+                ("timing0", c_ubyte), ("timing1", c_ubyte), ("mode", c_ubyte)]
 
 
 class _USBCAN_CHANNEL_CANFD_INIT_CONFIG(Structure):
-    _fields_ = [("acc_code",     c_uint),
-                ("acc_mask",     c_uint),
-                ("abit_timing",  c_uint),
-                ("dbit_timing",  c_uint),
-                ("brp",          c_uint),
-                ("filter",       c_ubyte),
-                ("mode",         c_ubyte),
-                ("pad",          c_ushort),
-                ("reserved",     c_uint)]
+    _fields_ = [("acc_code", c_uint), ("acc_mask", c_uint),
+                ("abit_timing", c_uint), ("dbit_timing", c_uint),
+                ("brp", c_uint), ("filter", c_ubyte), ("mode", c_ubyte),
+                ("pad", c_ushort), ("reserved", c_uint)]
 
 
 class _USBCAN_CHANNEL_INIT_CONFIG(Union):
@@ -226,26 +247,20 @@
 
 
 class USBCAN_CHANNEL_INIT_CONFIG(Structure):
-    _fields_ = [("can_type", c_uint),
-                ("config", _USBCAN_CHANNEL_INIT_CONFIG)]
+    _fields_ = [("can_type", c_uint), ("config", _USBCAN_CHANNEL_INIT_CONFIG)]
 
 
 class USBCAN_CHANNEL_ERR_INFO(Structure):
-    _fields_ = [("error_code", c_uint),
-                ("passive_ErrData", c_ubyte * 3),
+    _fields_ = [("error_code", c_uint), ("passive_ErrData", c_ubyte * 3),
                 ("arLost_ErrData", c_ubyte)]
 
 
 class USBCAN_CHANNEL_STATUS(Structure):
-    _fields_ = [("errInterrupt", c_ubyte),
-                ("regMode",      c_ubyte),
-                ("regStatus",    c_ubyte),
-                ("regALCapture", c_ubyte),
-                ("regECCapture", c_ubyte),
-                ("regEWLimit",   c_ubyte),
-                ("regRECounter", c_ubyte),
-                ("regTECounter", c_ubyte),
-                ("Reserved",     c_ubyte)]
+    _fields_ = [("errInterrupt", c_ubyte), ("regMode", c_ubyte),
+                ("regStatus", c_ubyte), ("regALCapture", c_ubyte),
+                ("regECCapture", c_ubyte), ("regEWLimit", c_ubyte),
+                ("regRECounter", c_ubyte), ("regTECounter", c_ubyte),
+                ("Reserved", c_ubyte)]
 
 
 platformInfo = sys.version
@@ -257,18 +272,27 @@
 
 
 class USBCAN():
-    def __init__(self, device_type=4, device_index=0, can_index=0, bitrate=None, can_filters=None, **kwargs):
+
+    def __init__(self,
+                 device_type=4,
+                 device_index=0,
+                 can_index=0,
+                 bitrate=None,
+                 can_filters=None,
+                 **kwargs):
         # super(USBCAN, self).__init__(can_index, can_filters, **kwargs)
-        self.logger = logging.getLogger()
-        self.logger.setLevel(logging.DEBUG)
+        # self.logger = logging.getLogger()
+        # self.logger.setLevel(logging.DEBUG)
+        self.logger = logger
         formatter = logging.Formatter(
             '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
         # 终端Handler
         consoleHandler = logging.StreamHandler()
         consoleHandler.setLevel(logging.DEBUG)
         # 文件Handler
-        fileHandler = logging.FileHandler(
-            './log/USBCAN.log', mode='a', encoding='UTF-8')
+        fileHandler = logging.FileHandler('./log/USBCAN.log',
+                                          mode='a',
+                                          encoding='UTF-8')
         fileHandler.setLevel(logging.NOTSET)
 
         consoleHandler.setFormatter(formatter)
@@ -286,21 +310,25 @@
         if Timing0 is None or Timing1 is None:
             self.logger.error("Timing registers are not set")
 
-        self.init_config = VCI_INIT_CONFIG(
-            0, 0xFFFFFFFF, 0, 1, Timing0, Timing1, 0)
+        self.init_config = VCI_INIT_CONFIG(0, 0xFFFFFFFF, 0, 1, Timing0,
+                                           Timing1, 0)
 
     def InitAndStart(self):
-        if USBCAN_DLL.VCI_OpenDevice(self.device, self.device_index, 0) == USBCAN_STATUS_ERR:
+        if USBCAN_DLL.VCI_OpenDevice(self.device, self.device_index,
+                                     0) == USBCAN_STATUS_ERR:
             self.logger.error("VCI_OpenDevice Error")
             return False
 
             # for can_index in self.channels:
-        if USBCAN_DLL.VCI_InitCAN(self.device, self.device_index, self.channel, byref(self.init_config)) == USBCAN_STATUS_ERR:
+        if USBCAN_DLL.VCI_InitCAN(self.device, self.device_index, self.channel,
+                                  byref(
+                                      self.init_config)) == USBCAN_STATUS_ERR:
             self.logger.error("VCI_InitCAN Error")
             self.CloseDevice()
             return False
 
-        if USBCAN_DLL.VCI_StartCAN(self.device, self.device_index, self.channel) == USBCAN_STATUS_ERR:
+        if USBCAN_DLL.VCI_StartCAN(self.device, self.device_index,
+                                   self.channel) == USBCAN_STATUS_ERR:
             self.logger.error("VCI_StartCAN Error")
             self.CloseDevice()
             return False
@@ -308,7 +336,8 @@
 
     def OpenDevice(self, device_type, device_index, reserved):
         try:
-            return USBCAN_DLL.VCI_OpenDevice(device_type, device_index, reserved)
+            return USBCAN_DLL.VCI_OpenDevice(device_type, device_index,
+                                             reserved)
         except:
             self.logger.error("Exception on OpenDevice!")
             raise
@@ -323,44 +352,49 @@
     def GetDeviceInf(self):
         try:
             info = USBCAN_DEVICE_INFO()
-            ret = USBCAN_DLL.VCI_ReadBoardInfo(
-                self.device, self.device_index, byref(info))
+            ret = USBCAN_DLL.VCI_ReadBoardInfo(self.device, self.device_index,
+                                               byref(info))
             return info if ret == USBCAN_STATUS_OK else None
         except:
             self.logger.error("Exception on USBCAN_GetDeviceInf")
             raise
 
-    def InitCAN(self, device_type,  device_index, can_index, init_config):
+    def InitCAN(self, device_type, device_index, can_index, init_config):
         try:
-            return USBCAN_DLL.VCI_InitCAN(device_type, device_index, can_index, byref(init_config))
+            return USBCAN_DLL.VCI_InitCAN(device_type, device_index, can_index,
+                                          byref(init_config))
         except:
             self.logger.error("Exception on USBCAN_InitCAN!")
             raise
 
-    def StartCAN(self, device_type,  device_index, can_index):
+    def StartCAN(self, device_type, device_index, can_index):
         try:
-            return USBCAN_DLL.VCI_StartCAN(device_type,  device_index, can_index)
+            return USBCAN_DLL.VCI_StartCAN(device_type, device_index,
+                                           can_index)
         except:
             self.logger.error("Exception on USBCAN_StartCAN!")
             raise
 
-    def ResetCAN(self, device_type,  device_index, can_index):
+    def ResetCAN(self, device_type, device_index, can_index):
         try:
-            return USBCAN_DLL.VCI_ResetCAN(device_type,  device_index, can_index)
+            return USBCAN_DLL.VCI_ResetCAN(device_type, device_index,
+                                           can_index)
         except:
             self.logger.error("Exception on USBCAN_ResetCAN!")
             raise
 
     def ClearBuffer(self):
         try:
-            return USBCAN_DLL.VCI_ClearBuffer(self.device,  self.device_index, self.channel)
+            return USBCAN_DLL.VCI_ClearBuffer(self.device, self.device_index,
+                                              self.channel)
         except:
             self.logger.error("Exception on USBCAN_ClearBuffer!")
             raise
 
     def GetReceiveNum(self):
         try:
-            return USBCAN_DLL.VCI_GetReceiveNum(self.device, self.device_index, self.channel)
+            return USBCAN_DLL.VCI_GetReceiveNum(self.device, self.device_index,
+                                                self.channel)
         except:
             self.logger.error("Exception on USBCAN_GetReceiveNum!")
             raise
@@ -376,36 +410,40 @@
         raw_message.RemoteFlag = (c_ubyte)(msg.is_remote_frame)
         raw_message.ExternFlag = (c_ubyte)(msg.is_extended_id)
         raw_message.DataLen = (c_ubyte)(msg.dlc)
-        raw_message.Data = (c_ubyte * 8)(* [c_ubyte(c) for c in msg.data])
+        raw_message.Data = (c_ubyte * 8)(*[c_ubyte(c) for c in msg.data])
 
         # (msg.arbitration_id, 0, 0, 1, msg.is_remote_frame,
         #                           extern_flag, msg.dlc, (c_ubyte * 8)(*msg.data), (c_ubyte * 3)(*[0, 0, 0]))
 
-        USBCAN_DLL.VCI_Transmit(
-            self.device, self.device_index, self.channel, byref(raw_message), 1)
+        USBCAN_DLL.VCI_Transmit(self.device, self.device_index, self.channel,
+                                byref(raw_message), 1)
 
     def Receive(self, len=10, timeout=None):
-        raw_message = (VCI_CAN_OBJ*len)()
+        raw_message = (VCI_CAN_OBJ * len)()
 
         timeout = -1 if timeout is None else c_int(timeout * 1000)
         msg = list()
-        rtn = USBCAN_DLL.VCI_Receive(
-            self.device, self.device_index, self.channel, byref(raw_message), len, timeout)
+        rtn = USBCAN_DLL.VCI_Receive(self.device,
+                                     self.device_index, self.channel,
+                                     byref(raw_message), len, timeout)
         if rtn == 0xFFFFFFFF or rtn == 0:
             return None, False
         else:
             for i in range(rtn):
-                msg.append(Message(
-                    timestamp=raw_message[i].TimeStamp if raw_message[i].TimeFlag else 0.0,
-                    arbitration_id=raw_message[i].ID,
-                    is_remote_frame=raw_message[i].RemoteFlag,
-                    channel=0,
-                    extended_id=raw_message[i].ExternFlag,
-                    data=raw_message[i].Data,
-                ))
+                msg.append(
+                    Message(
+                        timestamp=raw_message[i].TimeStamp
+                        if raw_message[i].TimeFlag else 0.0,
+                        arbitration_id=raw_message[i].ID,
+                        is_remote_frame=raw_message[i].RemoteFlag,
+                        channel=0,
+                        extended_id=raw_message[i].ExternFlag,
+                        data=raw_message[i].Data,
+                    ))
             return (msg, rtn)
 
-    def ListeningMsg(self, connectRet, needClose,  msgQueue: Queue, sendQueue: Queue):
+    def ListeningMsg(self, connectRet, needClose, msgQueue: Queue,
+                     sendQueue: Queue):
         '''call by single process to deal can messages.
         Arguments:
             connectRet {Value} -- return value of connection
@@ -436,5 +474,6 @@
                     for i in range(num):
                         msgQueue.put(revRet[i])
                         self.logger.info(
-                            "received can message.it't id is:{}".format(str(revRet[i].arbitration_id)))
+                            "received can message.it't id is:{}".format(
+                                str(revRet[i].arbitration_id)))
                 time.sleep(0.05)
diff --git a/dbc.py b/dbc.py
index 9e7a470..3bb643a 100644
--- a/dbc.py
+++ b/dbc.py
@@ -22,8 +22,10 @@
 UNSIGNED = 0
 SIGNED = 1
 
+
 def normalizeValueTable(table):
     return {int(k): v for k, v in table.items()}
+
 
 @attr.s(cmp=False)
 class Frame:
@@ -73,7 +75,7 @@
             if sig.getStartbit() + int(sig.size) > maxBit:
                 maxBit = sig.getStartbit() + int(sig.size)
         self.size = max(self.size, int(math.ceil(maxBit / 8)))
-    
+
     def setFdType(self):
         """Try to guess and set the CAN type for every frame.
         If a Frame is longer than 8 bytes, it must be Flexible Data Rate frame (CAN-FD).
@@ -92,7 +94,7 @@
         bitfieldLe = []
         bitfieldBe = []
 
-        for i in range(0,64):
+        for i in range(0, 64):
             bitfieldBe.append(0)
             bitfieldLe.append(0)
             bitfield.append(0)
@@ -100,21 +102,21 @@
 
         for sig in self.signals:
             i += 1
-            for bit in range(sig.getStartbit(),  sig.getStartbit() + int(sig.size)):
+            for bit in range(sig.getStartbit(),
+                             sig.getStartbit() + int(sig.size)):
                 if sig.is_little_endian:
                     bitfieldLe[bit] = i
                 else:
                     bitfieldBe[bit] = i
 
-        for i in range(0,8):
-            for j in range(0,8):
-                bitfield[i*8+j] = bitfieldLe[i*8+(7-j)]
+        for i in range(0, 8):
+            for j in range(0, 8):
+                bitfield[i * 8 + j] = bitfieldLe[i * 8 + (7 - j)]
 
-        for i in range(0,8):
-            for j in range(0,8):
-                if bitfield[i*8+j] == 0:
-                    bitfield[i*8+j] = bitfieldBe[i*8+j]
-
+        for i in range(0, 8):
+            for j in range(0, 8):
+                if bitfield[i * 8 + j] == 0:
+                    bitfield[i * 8 + j] = bitfieldBe[i * 8 + j]
 
         return bitfield
 
@@ -143,48 +145,51 @@
     * _multiplex ('Multiplexor' or Number of Multiplex)
     """
 
-    name = attr.ib(default = "")
+    name = attr.ib(default="")
     #    float_factory = attr.ib(default=defaultFloatFactory)
     float_factory = defaultFloatFactory
     startBit = attr.ib(type=int, default=0)
-    size = attr.ib(type=int, default = 0)
-    is_little_endian = attr.ib(type=bool, default = True)
-    is_signed = attr.ib(type=bool, default = True)
-    offset = attr.ib(converter = float_factory, default = float_factory(0.0))
-    factor = attr.ib(converter = float_factory, default = float_factory(1.0))
+    size = attr.ib(type=int, default=0)
+    is_little_endian = attr.ib(type=bool, default=True)
+    is_signed = attr.ib(type=bool, default=True)
+    offset = attr.ib(converter=float_factory, default=float_factory(0.0))
+    factor = attr.ib(converter=float_factory, default=float_factory(1.0))
 
     #    offset = attr.ib(converter = float_factory, default = 0.0)
 
-    min  = attr.ib(converter=float_factory)
+    min = attr.ib(converter=float_factory)
+
     @min.default
     def setDefaultMin(self):
-        return  self.calcMin()
+        return self.calcMin()
 
-    max =  attr.ib(converter = float_factory)
+    max = attr.ib(converter=float_factory)
+
     @max.default
     def setDefaultMax(self):
-        return  self.calcMax()
+        return self.calcMax()
 
-    unit = attr.ib(type=str, default ="")
-    receiver = attr.ib(default = attr.Factory(list))
-    comment = attr.ib(default = None)
-    multiplex  = attr.ib(default = None)
+    unit = attr.ib(type=str, default="")
+    receiver = attr.ib(default=attr.Factory(list))
+    comment = attr.ib(default=None)
+    multiplex = attr.ib(default=None)
 
-    mux_value = attr.ib(default = None)
+    mux_value = attr.ib(default=None)
     is_float = attr.ib(type=bool, default=False)
-    enumeration = attr.ib(type=str, default = None)
-    comments = attr.ib(type=dict, default = attr.Factory(dict))
-    attributes = attr.ib(type=dict, default = attr.Factory(dict))
-    values = attr.ib(type=dict, converter=normalizeValueTable, default = attr.Factory(dict))
-    calc_min_for_none = attr.ib(type=bool, default = True)
-    calc_max_for_none = attr.ib(type=bool, default = True)
-    muxValMax = attr.ib(default = 0)
-    muxValMin = attr.ib(default = 0)
-    muxerForSignal= attr.ib(type=str, default = None)
+    enumeration = attr.ib(type=str, default=None)
+    comments = attr.ib(type=dict, default=attr.Factory(dict))
+    attributes = attr.ib(type=dict, default=attr.Factory(dict))
+    values = attr.ib(type=dict,
+                     converter=normalizeValueTable,
+                     default=attr.Factory(dict))
+    calc_min_for_none = attr.ib(type=bool, default=True)
+    calc_max_for_none = attr.ib(type=bool, default=True)
+    muxValMax = attr.ib(default=0)
+    muxValMin = attr.ib(default=0)
+    muxerForSignal = attr.ib(type=str, default=None)
 
     def __attrs_post_init__(self):
         self.multiplex = self.multiplexSetter(self.multiplex)
-
 
     @property
     def spn(self):
@@ -253,7 +258,8 @@
             startBitInternal = startBitInternal + self.size - 1
         # bit numbering not consistent with byte order. reverse
         if bitNumbering is not None and bitNumbering != self.is_little_endian:
-            startBitInternal = startBitInternal - (startBitInternal % 8) + 7 - (startBitInternal % 8)
+            startBitInternal = startBitInternal - (
+                startBitInternal % 8) + 7 - (startBitInternal % 8)
         return int(startBitInternal)
 
     def calculateRawRange(self):
@@ -261,7 +267,7 @@
         :return: Signal range, i.e. (0, 15) for unsigned 4 bit Signal or (-8, 7) for signed one.
         :rtype: tuple
         """
-        rawRange = 2 ** (self.size - (1 if self.is_signed else 0))
+        rawRange = 2**(self.size - (1 if self.is_signed else 0))
         return (self.float_factory(-rawRange if self.is_signed else 0),
                 self.float_factory(rawRange - 1))
 
@@ -304,15 +310,12 @@
                     value = value_key
                     break
             else:
-                raise ValueError(
-                        "{} is invalid value choice for {}".format(value, self)
-                )
+                raise ValueError("{} is invalid value choice for {}".format(
+                    value, self))
 
         if not (self.min <= value <= self.max):
-            print(
-                "Value {} is not valid for {}. Min={} and Max={}".format(
-                    value, self, self.min, self.max)
-                )
+            print("Value {} is not valid for {}. Min={} and Max={}".format(
+                value, self, self.min, self.max))
         raw_value = (value - self.offset) / self.factor
 
         if not self.is_float:
@@ -338,7 +341,9 @@
     def __str__(self):
         return self.name
 
+
 class DBC:
+
     def __init__(self, dbcfile=None):
         self.filePath = dbcfile
         self.frames = self.__load()
@@ -349,7 +354,7 @@
         frameList = []
         i = 0
         frame = None
-        with open(self.filePath, mode='r', encoding='gb2312') as f:
+        with open(self.filePath, mode='r', encoding=dbcImportEncoding) as f:
             for line in f.readlines():
                 i = i + 1
                 l = line.strip()
@@ -358,14 +363,14 @@
                 # logging.info(l)
                 if l.startswith('BO_ '):
                     # frames
-                    regexp = re.compile("^BO\_ ([^\ ]+) ([^\ ]+) *: ([^\ ]+) ([^\ ]+)")
+                    regexp = re.compile(
+                        "^BO\_ ([^\ ]+) ([^\ ]+) *: ([^\ ]+) ([^\ ]+)")
                     temp = regexp.match(l)
                     # name, id, dlc, transmitters
-                    frame = Frame(
-                        temp.group(2),
-                        id=int(temp.group(1)),
-                        size=int(temp.group(3)),
-                        transmitters=temp.group(4).split())
+                    frame = Frame(temp.group(2),
+                                  id=int(temp.group(1)),
+                                  size=int(temp.group(3)),
+                                  transmitters=temp.group(4).split())
                     frameList.append(frame)
                     pass
                 elif l.startswith('SG_ '):
@@ -375,30 +380,34 @@
                     temp = regexp.match(l)
                     if temp:
                         extras = {}
-                        receiver = list(map(str.strip, temp.group(11).split(',')))
-                        tempSig = Signal(
-                            temp.group(1),
-                            startBit=int(temp.group(2)),
-                            size=int(temp.group(3)),
-                            is_little_endian=(int(temp.group(4)) == 1),
-                            is_signed=(temp.group(5) == '-'),
-                            factor=temp.group(6),
-                            offset=temp.group(7),
-                            min=temp.group(8),
-                            max=temp.group(9),
-                            unit=temp.group(10),
-                            receiver=receiver,
-                            **extras
-                        )
+                        receiver = list(
+                            map(str.strip,
+                                temp.group(11).split(',')))
+                        tempSig = Signal(temp.group(1),
+                                         startBit=int(temp.group(2)),
+                                         size=int(temp.group(3)),
+                                         is_little_endian=(int(
+                                             temp.group(4)) == 1),
+                                         is_signed=(temp.group(5) == '-'),
+                                         factor=temp.group(6),
+                                         offset=temp.group(7),
+                                         min=temp.group(8),
+                                         max=temp.group(9),
+                                         unit=temp.group(10),
+                                         receiver=receiver,
+                                         **extras)
                         if not tempSig.is_little_endian:
                             # startbit of motorola coded signals are MSB in dbc
-                            tempSig.setStartbit(int(temp.group(2)), bitNumbering=1)
+                            tempSig.setStartbit(int(temp.group(2)),
+                                                bitNumbering=1)
                         frame.signals.append(tempSig)
                     else:
                         pattern = "^SG\_ +(\w+) +(\w+) *: *(\d+)\|(\d+)@(\d+)([\+|\-]) +\(([0-9.+\-eE]+),([0-9.+\-eE]+)\) +\[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] +\"(.*)\" +(.*)"
                         regexp = re.compile(pattern)
                         temp = regexp.match(l)
-                        receiver = list(map(str.strip, temp.group(12).split(',')))
+                        receiver = list(
+                            map(str.strip,
+                                temp.group(12).split(',')))
                         multiplex = temp.group(2)
 
                         is_complex_multiplexed = False
@@ -413,25 +422,24 @@
                             try:
                                 multiplex = int(multiplex[1:])
                             except:
-                                raise Exception('error decoding line',line)
+                                raise Exception('error decoding line', line)
 
                         extras = {}
 
-                        tempSig = Signal(
-                            temp.group(1),
-                            startBit=int(temp.group(3)),
-                            size=int(temp.group(4)),
-                            is_little_endian=(int(temp.group(5)) == 1),
-                            is_signed=(temp.group(6) == '-'),
-                            factor=temp.group(7),
-                            offset=temp.group(8),
-                            min=temp.group(9),
-                            max=temp.group(10),
-                            unit=temp(11),
-                            receiver=receiver,
-                            multiplex=multiplex,
-                            **extras
-                        )
+                        tempSig = Signal(temp.group(1),
+                                         startBit=int(temp.group(3)),
+                                         size=int(temp.group(4)),
+                                         is_little_endian=(int(
+                                             temp.group(5)) == 1),
+                                         is_signed=(temp.group(6) == '-'),
+                                         factor=temp.group(7),
+                                         offset=temp.group(8),
+                                         min=temp.group(9),
+                                         max=temp.group(10),
+                                         unit=temp(11),
+                                         receiver=receiver,
+                                         multiplex=multiplex,
+                                         **extras)
 
                         if is_complex_multiplexed:
                             tempSig.is_multiplexer = True
@@ -439,7 +447,8 @@
 
                         if not tempSig.is_little_endian:
                             # startbit of motorola coded signals are MSB in dbc
-                            tempSig.setStartbit(int(temp.group(3)), bitNumbering=1)
+                            tempSig.setStartbit(int(temp.group(3)),
+                                                bitNumbering=1)
                         frame.addSignal(tempSig)
 
                         if is_complex_multiplexed:
@@ -468,8 +477,10 @@
                         if testF.id == int(tmpId):
                             for signal in testF.signals:
                                 if signal.name == signalName:
-                                    for i in range(math.floor(len(tempList) / 2)):
-                                        signal.values[tempList[i * 2].strip()] = tempList[i * 2 + 1].strip()
+                                    for i in range(
+                                            math.floor(len(tempList) / 2)):
+                                        signal.values[tempList[i * 2].strip(
+                                        )] = tempList[i * 2 + 1].strip()
                                     break
                             break
                 elif l.startswith("VAL_TABLE_ "):
@@ -491,7 +502,8 @@
                     regexp = re.compile("^BA\_ +\"[A-Za-z0-9[\-_ .]+\" +(.+)")
                     tempba = regexp.match(l)
                     if tempba.group(1).strip().startswith("BO_ "):
-                        regexp = re.compile(r"^BA_ +\"(.*)\" +BO_ +(\w+) +(.+);")
+                        regexp = re.compile(
+                            r"^BA_ +\"(.*)\" +BO_ +(\w+) +(.+);")
                         temp = regexp.match(l)
                         tempId = temp.group(2)
                         for testF in frameList:
@@ -501,10 +513,12 @@
                             tempCys = temp.group(3)
                             frame.cycle = int(tempCys)
                 elif l.startswith("SIG_GROUP_ "):
-                    regexp = re.compile("^SIG\_GROUP\_ +(\w+) +(\w+) +(\w+) +\:(.*);")
+                    regexp = re.compile(
+                        "^SIG\_GROUP\_ +(\w+) +(\w+) +(\w+) +\:(.*);")
                     temp = regexp.match(l)
                 elif l.startswith("SIG_VALTYPE_ "):
-                    regexp = re.compile("^SIG\_VALTYPE\_ +(\w+) +(\w+)\s*\:(.*);")
+                    regexp = re.compile(
+                        "^SIG\_VALTYPE\_ +(\w+) +(\w+)\s*\:(.*);")
                     temp = regexp.match(l)
                 elif l.startswith("BA_DEF_DEF_ "):
                     pattern = "^BA\_DEF\_DEF\_ +\"([A-Za-z0-9\-_\.]+)\" +(.+)\;"
@@ -516,7 +530,7 @@
                     pattern = "^EV_ +([A-Za-z0-9\-_]+) *\: +([0-9]+) +\[([0-9.+\-eE]+)\|([0-9.+\-eE]+)\] +\"(\w*)\" +([0-9.+\-eE]+) +([0-9.+\-eE]+) +([A-Za-z0-9\-_]+) +(.*);"
                     regexp = re.compile(pattern)
                     temp = regexp.match(l)
-                
+
         return frameList
 
     def __setFdType(self):
@@ -527,13 +541,13 @@
         for frame in self.frames:
             # if frame.size == 0:
             frame.calcDLC()
-            print(frame.id, frame.size)
+            # print(frame.id, frame.size)
             if frame.size > 8:
                 frame.is_fd = True
-    
+
     def __setExtended(self):
         for frame in self.frames:
-        # extended-flag is implicite in canid, thus repair this:
+            # extended-flag is implicite in canid, thus repair this:
             if frame.id > 0x80000000:
                 frame.id -= 0x80000000
                 frame.extended = 1
@@ -565,37 +579,37 @@
                             return test
         return None
 
-    def __getSignalVal(self, signal:Signal, data='00 01 02 03 04 05 06 07'):
+    def __getSignalVal(self, signal: Signal, data='00 01 02 03 04 05 06 07'):
         dataList = data.strip().split(' ')
         _startbit = signal.startBit
         _bitsize = signal.size
-        _little = signal.is_little_endian # (1: Intel, 0: Motorola)
-        _byteSize = math.ceil((signal.size + _startbit%8)/8)
-        _startByte = math.floor(_startbit/8)
+        _little = signal.is_little_endian  # (1: Intel, 0: Motorola)
+        _byteSize = math.ceil((signal.size + _startbit % 8) / 8)
+        _startByte = math.floor(_startbit / 8)
         phyvalue = 0
         rawvalue = ''
-        base = int('{0:0>8}'.format('1'*_bitsize+'0'*(_startbit%8)), 2)
+        base = int('{0:0>8}'.format('1' * _bitsize + '0' * (_startbit % 8)), 2)
         _byteNum = 0
-        _byteList= []
+        _byteList = []
         while _byteNum < _byteSize:
             # tmpbase = (base >> (8*_byteNum)) & 0xff
-            _byteList.append(dataList[_startByte+_byteNum])
+            _byteList.append(dataList[_startByte + _byteNum])
             _byteNum += 1
         if _little == 1:
             _byteList.reverse()
         for _byte in _byteList:
             rawvalue += _byte
-        rawvalue = ((int(rawvalue,16) & base) >> (_startbit%8))
+        rawvalue = ((int(rawvalue, 16) & base) >> (_startbit % 8))
         return {"phy": signal.raw2phys(rawvalue), "raw": rawvalue}
         # print(_startByte, _byteSize, _bitsize, int(dataList[_startByte], 16), int('{0:0>8}'.format('1'*_bitsize+'0'*(_startbit%8)), 2))
-        
+
     def analyzer(self, msgid=None, data='00 01 02 03 04 05 06 07'):
-        '''analysis given data 
-        
+        '''analysis given data
+
         Keyword Arguments:
             msgid {int} -- msg id (base 10) (default: {None})
             data {str} -- given data (default: {'00 01 02 03 04 05 06 07'})
-        
+
         Returns:
             dict -- key sorted by signal index
         '''
@@ -615,7 +629,11 @@
                 break
         return ret
 
+
 if __name__ == '__main__':
-    testDbc = DBC("data/SX7H.dbc")
-    abc=testDbc.analyzer(msgid=1056, data='40 01 C8 00 FF 00 00 00')
-    print(abc)
\ No newline at end of file
+    testDbc = DBC("DBC/DFLZM.dbc")
+    abc = testDbc.analyzer(msgid=1056, data='40 01 C8 00 FF 00 00 00')
+    print(abc)
+    print(abc[5]["name"])
+    print(abc[6]["name"])
+    print(abc[4]["name"])
diff --git a/main.ui b/main.ui
index 53c5e64..86006fa 100644
--- a/main.ui
+++ b/main.ui
@@ -194,7 +194,7 @@
            <string notr="true"/>
           </property>
           <property name="currentIndex">
-           <number>3</number>
+           <number>2</number>
           </property>
           <widget class="QWidget" name="tab">
            <attribute name="title">
diff --git a/styleSheet.py b/styleSheet.py
new file mode 100644
index 0000000..541cb16
--- /dev/null
+++ b/styleSheet.py
@@ -0,0 +1,9 @@
+FunctionButton_defaultStyle = "background-color: rgb(123, 123, 123);\n" + "color: rgb(255,255,255);  \n" + "border-radius: 30px; \n" + "font: 9pt \"AcadEref\";\n" + "border-style: outset;"
+FunctionButton_activeStyle = "background-color: rgb(0, 255, 0);\n" + "color: rgb(255,255,255);  \n" + "border-radius: 30px; \n" + "font: 9pt \"AcadEref\";\n" + "border-style: outset;"
+FunctionButton_faultStyle = "background-color: rgb(255,0,  0);\n" + "color: rgb(255,255,255);  \n" + "border-radius: 30px; \n" + "font: 9pt \"AcadEref\";\n" + "border-style: outset;"
+
+Style_dic = {
+    0: FunctionButton_defaultStyle,
+    1: FunctionButton_activeStyle,
+    2: FunctionButton_faultStyle
+}
diff --git a/uds/client.py b/uds/client.py
deleted file mode 100644
index 1b72f78..0000000
--- a/uds/client.py
+++ /dev/null
@@ -1,345 +0,0 @@
-import asyncio
-
-from udsoncan import Response, Request, Dtc, MemoryLocation, services
-from udsoncan.exceptions import NegativeResponseException, UnexpectedResponseException, ConfigError
-from udsoncan.configs import default_client_config
-
-
-class Client(object):
-
-    def __init__(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter, config=default_client_config):
-        self.reader = reader
-        self.writer = writer
-        self.config = dict(config)
-
-    async def send_request(self, request: Request, suppress_positive_response=None, timeout=None):
-        if timeout is None:
-            timeout = self.config['request_timeout']
-
-        payload = request.get_payload(suppress_positive_response)
-        self.writer.write(payload)
-
-        if suppress_positive_response is None:
-            payload = await asyncio.wait_for(self.reader.read(4095), timeout)
-            response = Response.from_payload(payload)
-
-            if not response.positive:
-                raise NegativeResponseException(response)
-
-            return response
-
-    async def change_session(self, newsession, suppress_positive_response=None, timeout=None):
-        request = services.DiagnosticSessionControl.make_request(newsession)
-
-        response = await self.send_request(request, suppress_positive_response, timeout)
-
-        if response is None:
-            return
-
-        services.DiagnosticSessionControl.interpret_response(response)
-
-        if newsession != response.service_data.session_echo:
-            raise UnexpectedResponseException(response, 'Response subfunction received from server (0x%02x) does not match the requested subfunction (0x%02x)' % (
-                response.service_data.session_echo, newsession))
-
-        return response
-
-    async def request_seed(self, level):
-        request = services.SecurityAccess.make_request(
-            level, mode=services.SecurityAccess.Mode.RequestSeed)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.SecurityAccess.interpret_response(
-            response, mode=services.SecurityAccess.Mode.RequestSeed)
-
-        expected_level = services.SecurityAccess.normalize_level(
-            mode=services.SecurityAccess.Mode.RequestSeed, level=level)
-        received_level = response.service_data.security_level_echo
-
-        if expected_level != received_level:
-            raise UnexpectedResponseException(
-                response, 'Response subfunction received from server (0x%02x) does not match the requested subfunction (0x%02x)' % (received_level, expected_level))
-
-        return response
-
-    async def send_key(self, level, key):
-        request = services.SecurityAccess.make_request(
-            level, mode=services.SecurityAccess.Mode.SendKey, key=key)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.SecurityAccess.interpret_response(
-            response, mode=services.SecurityAccess.Mode.SendKey)
-
-        expected_level = services.SecurityAccess.normalize_level(
-            mode=services.SecurityAccess.Mode.SendKey, level=level)
-        received_level = response.service_data.security_level_echo
-
-        if expected_level != received_level:
-            raise UnexpectedResponseException(
-                response, 'Response subfunction received from server (0x%02x) does not match the requested subfunction (0x%02x)' % (received_level, expected_level))
-
-        return response
-
-    async def tester_present(self, suppress_positive_response=None, timeout=None):
-        request = services.TesterPresent.make_request()
-
-        response = await self.send_request(request, suppress_positive_response, timeout)
-
-        if response is None:
-            return
-
-        services.TesterPresent.interpret_response(response)
-
-        if request.subfunction != response.service_data.subfunction_echo:
-            raise UnexpectedResponseException(response, 'Response subfunction received from server (0x%02x) does not match the requested subfunction (0x%02x)' % (
-                response.service_data.subfunction_echo, request.subfunction))
-
-        return response
-
-    async def read_data_by_identifier_first(self, didlist):
-        didlist = services.ReadDataByIdentifier.validate_didlist_input(didlist)
-        response = await self.read_data_by_identifier(didlist)
-        values = response.service_data.values
-        if len(values) > 0 and len(didlist) > 0:
-            return values[didlist[0]]
-
-    async def read_data_by_identifier(self, didlist):
-        didlist = services.ReadDataByIdentifier.validate_didlist_input(didlist)
-
-        request = services.ReadDataByIdentifier.make_request(
-            didlist=didlist, didconfig=self.config['data_identifiers'])
-
-        if 'data_identifiers' not in self.config or not isinstance(self.config['data_identifiers'], dict):
-            raise AttributeError(
-                'Configuration does not contains a valid data identifier description.')
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        params = {
-            'didlist': didlist,
-            'didconfig': self.config['data_identifiers'],
-            'tolerate_zero_padding': self.config['tolerate_zero_padding']
-        }
-
-        try:
-            services.ReadDataByIdentifier.interpret_response(
-                response, **params)
-        except ConfigError as e:
-            if e.key in didlist:
-                raise
-            else:
-                raise UnexpectedResponseException(
-                    response, "Server returned values for data identifier 0x%04x that was not requested and no Codec was defined for it. Parsing must be stopped." % (e.key))
-
-        set_request_didlist = set(didlist)
-        set_response_didlist = set(response.service_data.values.keys())
-        extra_did = set_response_didlist - set_request_didlist
-        missing_did = set_request_didlist - set_response_didlist
-
-        if len(extra_did) > 0:
-            raise UnexpectedResponseException(
-                response, "Server returned values for %d data identifier that were not requested. Dids are : %s" % (len(extra_did), extra_did))
-
-        if len(missing_did) > 0:
-            raise UnexpectedResponseException(
-                response, "%d data identifier values are missing from server response. Dids are : %s" % (len(missing_did), missing_did))
-
-        return response
-
-    async def write_data_by_identifier(self, did, value):
-        request = services.WriteDataByIdentifier.make_request(
-            did, value, didconfig=self.config['data_identifiers'])
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.WriteDataByIdentifier.interpret_response(response)
-
-        if response.service_data.did_echo != did:
-            raise UnexpectedResponseException(response, 'Server returned a response for data identifier 0x%04x while client requested for did 0x%04x' % (
-                response.service_data.did_echo, did))
-
-        return response
-
-    async def ecu_reset(self, reset_type, suppress_positive_response=None, timeout=None):
-        request = services.ECUReset.make_request(reset_type)
-
-        response = await self.send_request(request, suppress_positive_response, timeout)
-
-        if response is None:
-            return
-
-        services.ECUReset.interpret_response(response)
-
-        if response.service_data.reset_type_echo != reset_type:
-            raise UnexpectedResponseException(response, 'Response subfunction received from server (0x%02x) does not match the requested subfunction (0x%02x)' % (
-                response.service_data.reset_type_echo, reset_type))
-
-        return response
-
-    async def clear_dtc(self, group=0xFFFFFF):
-        request = services.ClearDiagnosticInformation.make_request(group)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.ClearDiagnosticInformation.interpret_response(response)
-
-        return response
-
-    async def start_routine(self, routine_id, data=None):
-        response = await self.routine_control(routine_id, services.RoutineControl.ControlType.startRoutine, data)
-        return response
-
-    async def stop_routine(self, routine_id, data=None):
-        response = await self.routine_control(routine_id, services.RoutineControl.ControlType.stopRoutine, data)
-        return response
-
-    async def routine_control(self, routine_id, control_type, data=None):
-        request = services.RoutineControl.make_request(
-            routine_id, control_type, data=data)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.RoutineControl.interpret_response(response)
-
-        if control_type != response.service_data.control_type_echo:
-            raise UnexpectedResponseException(response, 'Control type of response (0x%02x) does not match request control type (0x%02x)' % (
-                response.service_data.control_type_echo, control_type))
-
-        if routine_id != response.service_data.routine_id_echo:
-            raise UnexpectedResponseException(response, 'Response received from server (ID = 0x%04x) does not match the requested routine ID (0x%04x)' % (
-                response.service_data.routine_id_echo, routine_id))
-
-        return response
-
-    async def communication_control(self, control_type, communication_type, suppress_positive_response=None, timeout=None):
-        request = services.CommunicationControl.make_request(
-            control_type, communication_type)
-
-        response = await self.send_request(request, suppress_positive_response, timeout)
-
-        if response is None:
-            return
-
-        services.CommunicationControl.interpret_response(response)
-
-        if control_type != response.service_data.control_type_echo:
-            raise UnexpectedResponseException(response, 'Control type of response (0x%02x) does not match request control type (0x%02x)' % (
-                response.service_data.control_type_echo, control_type))
-
-        return response
-
-    async def request_download(self, memory_location, dfi=None):
-        response = await self.request_upload_download(services.RequestDownload, memory_location, dfi)
-        return response
-
-    async def request_upload(self, memory_location, dfi=None):
-        response = await self.request_upload_download(services.RequestUpload, memory_location, dfi)
-        return response
-
-    async def request_upload_download(self, service_cls, memory_location, dfi=None):
-        dfi = service_cls.normalize_data_format_identifier(dfi)
-
-        if service_cls not in [services.RequestDownload, services.RequestUpload]:
-            raise ValueError(
-                'Service must either be RequestDownload or RequestUpload')
-
-        if not isinstance(memory_location, MemoryLocation):
-            raise ValueError(
-                'memory_location must be an instance of MemoryLocation')
-
-        if 'server_address_format' in self.config:
-            memory_location.set_format_if_none(
-                address_format=self.config['server_address_format'])
-
-        if 'server_memorysize_format' in self.config:
-            memory_location.set_format_if_none(
-                memorysize_format=self.config['server_memorysize_format'])
-
-        request = service_cls.make_request(
-            memory_location=memory_location, dfi=dfi)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        service_cls.interpret_response(response)
-
-        return response
-
-    async def transfer_data(self, sequence_number, data=None):
-        request = services.TransferData.make_request(sequence_number, data)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.TransferData.interpret_response(response)
-
-        if sequence_number != response.service_data.sequence_number_echo:
-            raise UnexpectedResponseException(response, 'Block sequence number of response (0x%02x) does not match request block sequence number (0x%02x)' % (
-                response.service_data.sequence_number_echo, sequence_number))
-
-        return response
-
-    async def request_transfer_exit(self, data=None):
-        request = services.RequestTransferExit.make_request(data)
-
-        response = await self.send_request(request)
-
-        if response is None:
-            return
-
-        services.RequestTransferExit.interpret_response(response)
-
-        return response
-
-    async def control_dtc_setting(self, setting_type, data=None, suppress_positive_response=None, timeout=None):
-        request = services.ControlDTCSetting.make_request(
-            setting_type, data=data)
-
-        response = await self.send_request(request, suppress_positive_response, timeout)
-
-        if response is None:
-            return
-
-        services.ControlDTCSetting.interpret_response(response)
-
-        if response.service_data.setting_type_echo != setting_type:
-            raise UnexpectedResponseException(response, 'Setting type of response (0x%02x) does not match request control type (0x%02x)' % (
-                response.service_data.setting_type_echo, setting_type))
-
-        return response
-
-    async def get_dtc_by_status_mask(self, status_mask):
-        pass
-
-    async def get_number_of_dtc_by_status_mask(self, status_mask):
-        pass
-
-    async def get_supported_dtc(self):
-        pass
-
-    async def read_dtc_information(self, subfunction, status_mask=None, severity_mask=None,  dtc=None, snapshot_record_number=None, extended_data_record_number=None, extended_data_size=None):
-        pass
diff --git a/widgets/ShifterTool.py b/widgets/ShifterTool.py
index 020d602..3ea4ac8 100644
--- a/widgets/ShifterTool.py
+++ b/widgets/ShifterTool.py
@@ -1,6 +1,6 @@
-
 from ast import Not, Pass
 from concurrent.futures import thread
+from curses import flash
 from logging import exception
 import threading
 from typing import List
@@ -14,17 +14,19 @@
 from isotp import CanMessage
 import queue
 from USBCAN import *
-from Shifter import AsciiCodec, ShifterClass
+from Shifter import *
+from styleSheet import *
 from mainwindows import Ui_MainWindow
 from PySide2 import QtWidgets, QtCore, QtGui
 import struct
 import time
 import datetime
 from ShifterDefine import *
-from multiprocessing import Array, Pool, Process, Queue, Value, Pipe
+from multiprocessing import Process, Queue, Value, Pipe
 
 MAX_RCV_NUM = 20
-
+APP_ADDR_LOCATION_OFFSET = 8
+APP_LENGTH_LOCATION_OFFSET = 12
 logger = logging.getLogger()
 logger.setLevel(logging.DEBUG)
 formatter = logging.Formatter(
@@ -33,8 +35,9 @@
 consoleHandler = logging.StreamHandler()
 consoleHandler.setLevel(logging.DEBUG)
 
-fileHandler = logging.FileHandler(
-    './log/ShiftTool.log', mode='a', encoding='UTF-8')
+fileHandler = logging.FileHandler('./log/ShiftTool.log',
+                                  mode='a',
+                                  encoding='UTF-8')
 fileHandler.setLevel(logging.NOTSET)
 
 consoleHandler.setFormatter(formatter)
@@ -55,6 +58,7 @@
 
 
 class HardwreDevice():
+
     def __init__(self):
         self.device_type = 4
         self.channel = 0  # can_index
@@ -63,6 +67,7 @@
 
 
 class PeriodSendThread(object):
+
     def __init__(self, period_func, args=[], kwargs={}):
         self._thread = threading.Thread(target=self._run)
         self._function = period_func
@@ -117,12 +122,13 @@
             self.isotp_layer = isotp_layer
 
             assert isinstance(
-                self.isotp_layer, isotp.TransportLayer), 'isotp_layer must be a valid isotp.TransportLayer '
+                self.isotp_layer, isotp.TransportLayer
+            ), 'isotp_layer must be a valid isotp.TransportLayer '
 
         def open(self):
             self.exit_requested = False
-            self._read_thread = threading.Thread(
-                None, target=self.rxthread_task)
+            self._read_thread = threading.Thread(None,
+                                                 target=self.rxthread_task)
             self._read_thread.start()
             self.opened = True
             logger.info('Connection opened')
@@ -150,7 +156,8 @@
             if self.mtu is not None:
                 if len(payload) > self.mtu:
                     logger.warning(
-                        "Truncating payload to be set to a length of %d" % (self.mtu))
+                        "Truncating payload to be set to a length of %d" %
+                        (self.mtu))
                     payload = payload[0:self.mtu]
 
             # isotp.protocol.TransportLayer uses byte array. udsoncan is strict on bytes format
@@ -172,12 +179,14 @@
 
             if timedout:
                 raise TimeoutException(
-                    "Did not receive frame IsoTP Transport layer in time (timeout=%s sec)" % timeout)
+                    "Did not receive frame IsoTP Transport layer in time (timeout=%s sec)"
+                    % timeout)
 
             if self.mtu is not None:
                 if frame is not None and len(frame) > self.mtu:
                     logger.warning(
-                        "Truncating received payload to a length of %d" % (self.mtu))
+                        "Truncating received payload to a length of %d" %
+                        (self.mtu))
                     frame = frame[0:self.mtu]
 
             # isotp.protocol.TransportLayer uses bytearray. udsoncan is strict on bytes format
@@ -204,8 +213,9 @@
                     while self.isotp_layer.available():
                         # isotp_conn.send(self.isotp_layer.recv())
                         self.IsoTPtoUDSQueue.put(self.isotp_layer.recv())
-                        self.logger.debug("IsoTPtoUDSQueue queue size is now %d" % (
-                            self.IsoTPtoUDSQueue.qsize()))
+                        self.logger.debug(
+                            "IsoTPtoUDSQueue queue size is now %d" %
+                            (self.IsoTPtoUDSQueue.qsize()))
 
                         # time.sleep(self.isotp_layer.sleep_time())
                     time.sleep(0.001)
@@ -237,8 +247,11 @@
         self.DeviceInit()
         self.WidgetsInit()
         self.ChnInfoUpdate(self._isOpen)
-        self.drv_data: bytes = [0x1c, 0x01, 0x06, 0x80,
-                                0x1f, 0x01, 0x06, 0x80, 0xfb, 0x0a]
+        self.in_programming = False
+        self.startfromboot = False
+        self.drv_data = [
+            0x1c, 0x01, 0x06, 0x80, 0x1f, 0x01, 0x06, 0x80, 0xfb, 0x0a
+        ]
         self.app_data: bytes = None
 
     def DeviceInit(self):
@@ -275,26 +288,33 @@
             'squash_stmin_requirement': False
         }
         self._isotpaddr_PHYS = isotp.Address(
-            isotp.AddressingMode.Normal_11bits, txid=self.shifter.canid.phy_rxId, rxid=self.shifter.canid.phy_txId)
+            isotp.AddressingMode.Normal_11bits,
+            txid=self.shifter.canid.phy_rxId,
+            rxid=self.shifter.canid.phy_txId)
         self._isotpaddr_FUNC = isotp.Address(
-            isotp.AddressingMode.Normal_11bits, txid=self.shifter.canid.fun_rxId, rxid=self.shifter.canid.phy_txId)
+            isotp.AddressingMode.Normal_11bits,
+            txid=self.shifter.canid.fun_rxId,
+            rxid=self.shifter.canid.phy_txId)
         # self._isotpaddr_EPS = isotp.Address(
         #     isotp.AddressingMode.Normal_11bits, txid=EPS_RX_ID_PHYS, rxid=EPS_TX_ID)
         # self._isotpaddr_EPS4wd = isotp.Address(
         #     isotp.AddressingMode.Normal_11bits, txid=EPS4wd_RX_ID_PHYS, rxid=EPS4wd_TX_ID)
-        self.isotp_layer = isotp.TransportLayer(
-            rxfn=self.isotp_rcv, txfn=self.isotp_send, address=self._isotpaddr_PHYS, params=self.isotp_params)
+        self.isotp_layer = isotp.TransportLayer(rxfn=self.isotp_rcv,
+                                                txfn=self.isotp_send,
+                                                address=self._isotpaddr_PHYS,
+                                                params=self.isotp_params)
         self.conn = ShifterTool.IsoTpConnection(isotp_layer=self.isotp_layer)
         self.udsclient = Client(self.conn, request_timeout=2)
         self.udsclient.config['security_algo'] = self.SecAlgo
         self.udsclient.config['security_algo_params'] = [
-            0x11223344, 0x20AA097B, 0x11223344, 0x70237577]
+            0x11223344, 0x20AA097B, 0x11223344, 0x70237577
+        ]
         self.udsclient.config['data_identifiers'] = self.shifter.did_config
 
         self.udsclient.config['server_address_format'] = 32
         self.udsclient.config['server_memorysize_format'] = 32
 
-    def SecAlgo(self, level, seed, params):
+    def SecAlgo(self, level, seed, params=None):
         """
         Builds the security key to unlock a security level.
 
@@ -311,8 +331,8 @@
         self.output_key[2] = ((temp_key[1] & 0xFC) >> 2) | (temp_key[0] & 0xC0)
         self.output_key[3] = ((temp_key[0] & 0x0F) << 4) | (temp_key[3] & 0x0F)
         """
-        temp_key = (seed[0] << 24) | (
-            seed[1] << 16) | (seed[2] << 8) | (seed[3])
+        temp_key = (seed[0] << 24) | (seed[1] << 16) | (seed[2] << 8) | (
+            seed[3])
         if level == 0x01:
             output_key_temp = 0x20AA097B
             # output_key_temp = ((((temp_key >> 4) ^ temp_key)
@@ -337,8 +357,10 @@
         else:
             output_key_temp = temp_key
 
-        output_key = struct.pack('BBBB', (output_key_temp >> 24) & 0xFF, (
-            output_key_temp >> 16) & 0xFF, (output_key_temp >> 8) & 0xFF, output_key_temp & 0xFF)
+        output_key = struct.pack('BBBB', (output_key_temp >> 24) & 0xFF,
+                                 (output_key_temp >> 16) & 0xFF,
+                                 (output_key_temp >> 8) & 0xFF,
+                                 output_key_temp & 0xFF)
 
         return output_key
 
@@ -381,7 +403,7 @@
         self.UI.comboBox_2.addItem('USBCAN-II')
 
         # 波特率
-        self.UI.comboBox_3.addItems([('%dK' % (i/1000))
+        self.UI.comboBox_3.addItems([('%dK' % (i / 1000))
                                      for i in TIMING_DICT.keys()])
         # CHANNEL
         self.UI.comboBox_5.addItems(['CH1/3', 'CH2/4'])
@@ -430,7 +452,8 @@
         self.UI.radioButton.toggled.connect(self.TestPresentEvent)
 
         self.UI.pushButton_48.clicked.connect(self.start_programming)
-        seff.UI.pushButton_46.clicked.connect(self.loadAppfile)
+        self.UI.pushButton_46.clicked.connect(self.loadAppfile)
+        self.UI.radioButton_2.toggled.connect(self.SetFromBootFlag)
 
     def _formatMsgData(self, index, item, received):
         '''msg data to list
@@ -463,8 +486,8 @@
         else:
             data.append('标准帧')
 
-        data.append(' '.join(['0x' +
-                              '{:0<2x}'.format(a).upper() for a in list(item.data)]))
+        data.append(' '.join(
+            ['0x' + '{:0<2x}'.format(a).upper() for a in list(item.data)]))
         return data
 
     def can_thread_stop(self):
@@ -491,7 +514,6 @@
                                 # conn.send(msg[i])  # pipe connection send
                                 self.CANtoIsoTPQueue.put(
                                     msg[i])  # send msg to isotp
-                                print('收到77A')
 
                             self.msgQueue.put(msg[i])
                             # logger.info('time:'.format(msg[i].timestamp)+'Rx: ID=0x{:0<3x} '.format(msg[i].arbitration_id) + ' '.join(['0x' +
@@ -522,13 +544,15 @@
         if self._isOpen.value == 0:
             if self._usbcan is None:
                 self.update_HardwareDevice()
-                can_filters = [
-                    {'can_id': 0x420, 'can_mask': 0xFFFFFFFF}]
+                can_filters = [{'can_id': 0x420, 'can_mask': 0xFFFFFFFF}]
 
-                bitrate = list(TIMING_DICT.keys())[
-                    self.devicedescription.baudrate]
-                self._usbcan = USBCAN(device_type=4, device_index=0,
-                                      can_index=0, bitrate=bitrate, can_filters=can_filters)
+                bitrate = list(
+                    TIMING_DICT.keys())[self.devicedescription.baudrate]
+                self._usbcan = USBCAN(device_type=4,
+                                      device_index=0,
+                                      can_index=0,
+                                      bitrate=bitrate,
+                                      can_filters=can_filters)
                 if not self._usbcan.InitAndStart():
                     logger.info("Open usbcan device fail.")
 
@@ -550,7 +574,8 @@
 
     def update_HardwareDevice(self):
 
-        self.devicedescription.device_type = self.UI.comboBox_2.currentIndex()+3
+        self.devicedescription.device_type = self.UI.comboBox_2.currentIndex(
+        ) + 3
         self.devicedescription.channel = self.UI.comboBox_5.currentIndex()
         self.devicedescription.baudrate = self.UI.comboBox_3.currentIndex()
 
@@ -559,13 +584,14 @@
             self.UI.pushButton.setText("Close CAN")
         elif self.needdisconnect.value == 1:
             self.UI.pushButton.setText("Open CAN")
+
     # set ui info
 
     def _StartlistenMsgProcess(self):
-        self.msgProcess = Process(
-            name='pyUSBCANListener',
-            target=self._usbcan.ListeningMsg,
-            args=(self._isOpen, self.needdisconnect, self.msgQueue, self.sendQueue))
+        self.msgProcess = Process(name='pyUSBCANListener',
+                                  target=self._usbcan.ListeningMsg,
+                                  args=(self._isOpen, self.needdisconnect,
+                                        self.msgQueue, self.sendQueue))
         self.msgProcess.daemon = True
         self.msgProcess.start()
         # 1.5s后检测连接状态,该值可能需要标定
@@ -575,15 +601,19 @@
             time.sleep(0.1)
 
     def disp_string(self, out_s):
-        dt = datetime.now()
+        dt = datetime.datetime.now()
         nowtime_str = dt.strftime('%I:%M:%S')  # time
-        self.textEdit_2.insertPlainText(nowtime_str + ': ')
-        cursor = self.textEdit_2.textCursor()
+        self.UI.textEdit_2.insertPlainText(nowtime_str + ': ')
+        cursor = self.UI.textEdit_2.textCursor()
         cursor.movePosition(QtGui.QTextCursor.End)
-        self.textEdit_2.setTextCursor(cursor)
-        self.textEdit_2.insertPlainText(str(out_s+"\t\n"))
+        self.UI.textEdit_2.setTextCursor(cursor)
+        self.UI.textEdit_2.insertPlainText(str(out_s + "\t\n"))
 
         # self.statusbar.showMessage(str(out))
+    def dispShiftstatus(self):
+        self.UI.pushButton_41.setStyleSheet(
+            Style_dic[self.shifter.UnlockButton])
+        self.UI.pushButton_40.setStyleSheet(Style_dic[self.shifter.Pbutton])
 
     def _updateRootList(self):
         _dataSize = self.msgQueue.qsize()
@@ -594,9 +624,11 @@
         for i in range(_dataSize):
             receiveNum += 1
             msg = self.msgQueue.get()
+            self.shifter.FramUnpack(msg.arbitration_id, msg.data)
             formateddata.append(self._formatMsgData(
                 receiveNum, msg, True))  # return a data list
         self._insertDataSmooth(data=formateddata, datasize=_dataSize)
+        # self.dispShiftstatus()
 
     def _insertDataSmooth(self, data, datasize):
         # row = 6-datasize
@@ -628,8 +660,8 @@
 
     def sessioncontrol_req(self):
         sesson = self.UI.comboBox.currentIndex() + 1
-        t = threading.Thread(
-            target=self.udsclient.change_session, args=(sesson,))
+        t = threading.Thread(target=self.udsclient.change_session,
+                             args=(sesson, ))
         t.start()
         t.join()
         # self.udsclient.change_session(sesson)
@@ -682,15 +714,15 @@
 
     def DID_display(self):
         # print(self.UI.comboBox_6.currentText())
-        self.UI.lineEdit.setText("0x{:0<4x}".
-                                 format((DID_dic[self.UI.comboBox_6.currentText()])))
+        self.UI.lineEdit.setText("0x{:0<4x}".format(
+            (DID_dic[self.UI.comboBox_6.currentText()])))
 
     def ReadDataByID(self):
         tempdid = DID_dic[self.UI.comboBox_6.currentText()]
         self.UI.lineEdit_2.clear()
         data = self.ReadByDID(tempdid)
         if data is not None and len(str(data[tempdid])):
-            self.UI.lineEdit_2.setText(str(data[tempdid])+' ')
+            self.UI.lineEdit_2.setText(str(data[tempdid]) + ' ')
 
     def communicationControl_req(self):
         req = 0x00
@@ -701,8 +733,8 @@
             req = 1
         else:
             req = 3
-        self.udsclient.communication_control(
-            control_type=0, communication_type=req)
+        self.udsclient.communication_control(control_type=0,
+                                             communication_type=req)
 
     def StartCalibraiton(self):
         startcmd = bytearray([0x0, 0x0, 0x0, 0x0])
@@ -768,35 +800,45 @@
         resp_1 = self.udsclient.start_routine(routine_id=routine_id, data=data)
         return resp_1.positive
 
+    def SetFromBootFlag(self):
+        self.startfromboot = self.UI.radioButton_2.isChecked()
+
     def pre_programming(self):
+        if not self.startfromboot:
+            self.disp_string('# 预编程步骤')
 
-        self.disp_string('# 预编程步骤')
+            # 进入extended session
+            self.disp_string('>>> 进入扩展模式')
+            response = self.udsclient.change_session(3)
+            if response.positive:
+                self.disp_string('>>> 解锁安全访问')
+                response = self.udsclient.unlock_security_access(9)
 
-        # 进入extended session
-        self.disp_string('>>> 进入扩展模式')
-        response = self.udsclient.change_session(3)
-        if response.positive:
-            # 检查编程条件
-            self.disp_string('>>> 检查编程条件')
-            response = self.udsclient.start_routine(0xff02)
-        if response.positive:
-            # 关闭DTC的存储
-            self.disp_string('>>> 关闭DTC的存储')
-            response = self.udsclient.control_dtc_setting(2)
-        # print(response)
-        if response.positive:
-            # 关闭与诊断无关的报文
-            self.disp_string('>>> 关闭与诊断无关的报文')
-            response = self.udsclient.communication_control(0x03, 0x01)
-        else:
-            self.disp_string('>>> 预编程失败')
+            if response.positive:
+                # 检查编程条件
+                self.disp_string('>>> 检查编程条件')
+                response = self.udsclient.start_routine(0xff02)
+            if response.positive:
+                # 关闭DTC的存储
+                self.disp_string('>>> 关闭DTC的存储')
+                response = self.udsclient.control_dtc_setting(2)
+            # print(response)
+            if response.positive:
+                # 关闭与诊断无关的报文
+                self.disp_string('>>> 关闭与诊断无关的报文')
+                response = self.udsclient.communication_control(0x03, 0x01)
+            else:
+                self.disp_string('>>> 预编程失败')
 
-        return response.positive
+            return response.positive
         # print(response)
 
     def main_programming(self):
-
         self.disp_string('# 主编程步骤')
+
+        if self.startfromboot:
+            self.disp_string('>>> 进入扩展模式')
+            response = self.udsclient.change_session(3)
 
         # 进入programming session
         self.disp_string('>>> 进入编程模式')
@@ -807,49 +849,40 @@
             self.disp_string('>>> 安全访问')
             response = self.udsclient.unlock_security_access(9)
         # print(response)
-
+        if response.positive:
+            self.disp_string('>>> 请求下载驱动文件')
+            address = 0x20004600
+            memorysize = 10
+            memory_location = MemoryLocation(address, memorysize, 32, 32)
+            response = self.udsclient.request_download(memory_location)
         # print(response)
         if response.positive:
             # 发送driver文件
             self.disp_string('>>> 发送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
-            memory_location = MemoryLocation(address, memorysize, 32, 32)
-            response = self.udsclient.request_download(memory_location)
-        # print(response)
-
-            max_length = response.service_data.max_length
-
-        # 有效数据长度, 去除sid和sequence两个字节
-            payload_length = max_length - 2
-
-            count = (len(drv_file) + payload_length - 1) // payload_length
-
-            base = self.get_progressbar_pos()
-            for i in range(count):
-                start = i * payload_length
-                end = start + payload_length
-                response = self.udsclient.transfer_data((i + 1) % 256,
-                                                        drv_file[start:end])
-                self.set_progressbar_pos(base + end)
+            response = self.udsclient.transfer_data(1, bytes(drv_file))
+            self.set_progressbar_pos(len(drv_file))
             # print(response)
         if response.positive:
+            self.disp_string('>>> 发送驱动结束,请求推出')
             response = self.udsclient.request_transfer_exit()
         # print(response)
         if response.positive:
             # driver文件完整性检验
             self.disp_string('>>> driver文件完整性检验')
-            response = self.udsclient.start_routine(0xf001, drv_file[0:4])
+            drivecrc = bytes([0x9B, 0x39, 0xf2, 0xec])
+            response = self.udsclient.start_routine(0xf001, drivecrc)
         # print(response)
         if response.positive:
             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[APP_ADDR_LOCATION_OFFSET] << 24 | app_file[
+                APP_ADDR_LOCATION_OFFSET + 1] << 16 | app_file[
+                    APP_ADDR_LOCATION_OFFSET +
+                    2] << 8 | app_file[APP_ADDR_LOCATION_OFFSET + 3] << 0
+            memorysize = app_file[APP_LENGTH_LOCATION_OFFSET] << 24 | app_file[
+                APP_LENGTH_LOCATION_OFFSET + 1] << 16 | app_file[
+                    APP_LENGTH_LOCATION_OFFSET +
+                    2] << 8 | app_file[APP_LENGTH_LOCATION_OFFSET + 3] << 0
             memory_location = MemoryLocation(address, memorysize, 32, 32)
 
             # 删除app存储空间
@@ -864,11 +897,11 @@
             # 发送app文件
             self.disp_string('>>> 发送app文件')
             response = self.udsclient.request_download(memory_location)
-        # print(response)
+            # print(response)
 
             max_length = response.service_data.max_length
 
-        # 有效数据长度, 去除sid和sequence两个字节
+            # 有效数据长度, 去除sid和sequence两个字节
             payload_length = max_length - 2
 
             count = (len(app_file) + payload_length - 1) // payload_length
@@ -898,12 +931,11 @@
         # 回到default session
         self.disp_string('>>> 回到默认模式')
 
-        self.udsclient.suppress_positive_response.enabled = True
         response = self.udsclient.change_session(1)
         return response.positive
 
     def start_programming(self):
-
+        self.UI.pushButton_48.setDisabled(True)
         self.set_progressbar_pos(0)
 
         t1 = time.time()
@@ -915,13 +947,14 @@
             self.post_programming()
         except Exception as e:
 
-            self.disp_string('%s' % e, '#ff0000')
+            self.disp_string('%s' % e)
+            # self.UI.pushButton_48.setDisabled(False)
 
         t2 = time.time()
 
         self.disp_string('finished in %.2f sec' % (t2 - t1))
         self.in_programming = False
-        self.UI.pushButton_48.setDisabled(True)
+        self.UI.pushButton_48.setDisabled(False)
 
     def set_progressbar_pos(self, pos):
 
@@ -944,7 +977,8 @@
             return
 
         fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
-            self, 'comboBox_4', '.', 'All Files (*);;Bin Files (*.bin);;Hex Files (*.hex)')
+            None, 'comboBox_4', '.',
+            'All Files (*);;Bin Files (*.bin);;Hex Files (*.hex)')
 
         if fileName != '':
             self.UI.comboBox_4.addItem(fileName)

--
Gitblit v1.8.0