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