From dd84d3ff28816a22a911bb26b435026b728676db Mon Sep 17 00:00:00 2001 From: tao_z <tzj0429@163.com> Date: Sun, 07 Aug 2022 21:42:44 +0800 Subject: [PATCH] 针对B41V修改 --- Shifter.py | 144 +++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 123 insertions(+), 21 deletions(-) diff --git a/Shifter.py b/Shifter.py index 56dbb40..00d08d9 100644 --- a/Shifter.py +++ b/Shifter.py @@ -3,7 +3,9 @@ from udsoncan import DidCodec import configparser -from dbc import * +import cantools + +ProjectDBC = cantools.database.load_file("DBC/BJEV_B41V_20220411.dbc") class AsciiCodec(DidCodec): @@ -138,9 +140,9 @@ class ShifterClass(): def __init__(self): - self.position = ShifterPosition(0) - self.Pbutton = 0 - self.UnlockButton = 0 + self.position = None + self.Pbutton = None + self.UnlockButton = None self.Voltage = 0 self.canid = ShifterCANID() @@ -190,21 +192,121 @@ self.canid.phy_txId = 0x77A self.canid.phy_rxId = 0x742 self.canid.fun_rxId = 0x7df - self.canid.normalid = 0x420 - self.dbc = DBC("DBC/DFLZM.dbc") + self.canid.normalid = 0x5E0 + self.SA1_message = ProjectDBC.get_message_by_name('EGSM_1') - def FramUnpack(self, id=0x420, frame=[]): - data = [] - data.append(' '.join( - ['{:0>2x}'.format(a).upper() for a in list(frame)])) - # print(data) - unpackframe = self.dbc.analyzer(msgid=0x420, data=str(data[0])) - # print(unpackframe[5]['value']['raw']) - self.Pbutton = unpackframe[5]['value']['raw'] - print(unpackframe[5]["name"], unpackframe[5]['value']['raw']) - # print(unpackframe[6]['value']['raw']) - self.UnlockButton = unpackframe[4]['value']['raw'] - print(unpackframe[4]["name"], unpackframe[4]['value']['raw']) - # print(unpackframe[4]['value']['raw']) - self.position = unpackframe[7]['value']['raw'] - print(unpackframe[7]["name"], unpackframe[7]['value']['raw']) + def FramUnpack(self, id=0x5E0, frame=[]): + input_signal = ProjectDBC.decode_message(id, frame) + self.Pbutton = SA1_Status_ParkButtonReq_dic[str( + input_signal['EGSM1_St_DrvRqPark'])] + self.UnlockButton = SA1_Status_UnlockButtonReq_dic[str( + input_signal['EGSM1_St_DrvRqUnlock'])] + self.position = SA1_Status_GearShftPosReq_dic[str( + input_signal['EGSM1_St_DrvRqShft'])] + + def PackFrame(self, dic): + data = self.SA1_message.encode({ + 'SA1_Status_PRNDL': + 0, + 'EGSM1_St_DrvRqShft': + SA1_Status_GearShftPosReq_dic[self.position], + 'EGSM1_St_DrvRqPark': + SA1_Status_ParkButtonReq_dic[self.Pbutton], + "SA1_ShifterManualSignal": + 0, + "SA1_ShifterModeSignal": + 0, + "SA1_Status_ShftSensSng_Fault": + 0, + "SA1_IND_ShifterMisUsd": + 0, + "SA1_Live_counter": + 1, + "EGSM1_St_DrvRqUnlock": + SA1_Status_UnlockButtonReq_dic[self.UnlockButton], + "SA1_Status_EcoShifterModeReq": + 0, + "SA1_Status_RqGearPosInV": + 0xf, + "SA1_Status_ShiftPosValidFlag": + 0, + }) + return data + + +class VehicleClass(): + + def __init__(self): + self.Odm = 0 + self.speed = 0 + self.brake = 0 + self.ShiftLeverPos = 'P' + self.pre_ShiftLeverPos = 'P' + self.max_pos = 'Shifter position Zero' + self.BCM1_message = ProjectDBC.get_message_by_name('BCM_1') + self.BCM_9_message = ProjectDBC.get_message_by_name('BDC_BCM_9') + self.EHC6_message = ProjectDBC.get_message_by_name('CDC_EHC_6') + self.CAPE1_message = ProjectDBC.get_message_by_name('BDC_CAPE_1') + + self.IPC1_message = ProjectDBC.get_message_by_name('CDC_IPC1') + self.CGW_1_message = ProjectDBC.get_message_by_name('CGW_1') + self.EMS_5_message = ProjectDBC.get_message_by_name('EMS_5') + self.TBOX_1_message = ProjectDBC.get_message_by_name('TBOX_1') + self.TCM_5_message = ProjectDBC.get_message_by_name('TCM_5') + + def pack_IC1(self, odm): + self.Odm = odm + data = self.IC1_message.encode({"odometer_value": odm}) + return data + + def pack_TCU2(self, shiftpos): + #from value get key + self.ShiftLeverPos = [ + k for k, v in TCU2_ShiterLevel_dic.items() if v == shiftpos + ][0] + data = self.TCU2_message.encode({ + "ShiftLeverPos": shiftpos, + "TCUDrivingMode": 0, + "ActualGear": 0 + }) + return data + + def pack_ABS1(self, speed): + self.speed = speed + data = self.ABS1_message.encode({"vehicle_speed": speed}) + return data + + def pack_Engine2(self, brake): + self.brake = brake + data = self.Engine2_message.encode({"brake_pedal_status ": brake}) + return data + + def ShiftLogic(self, shift: ShifterClass): + reqpos = 0 + if shift.Pbutton == SA1_Status_ParkButtonReq_dic[ + 'Driver request park button']: + reqpos = TCU2_ShiterLevel_dic['P'] + self.pre_ShiftLeverPos = "P" + self.max_pos = 'Shifter position Zero' + elif (shift.position >= SA1_Status_GearShftPosReq_dic['M-']) and ( + shift.position <= SA1_Status_GearShftPosReq_dic['M']): + reqpos = TCU2_ShiterLevel_dic['M'] + self.pre_ShiftLeverPos = "P" + self.max_pos = 'Shifter position Zero' + elif shift.position is SA1_Status_GearShftPosReq_dic[ + 'Shifter not initialized']: + pass + else: + if shift.position is not SA1_Status_GearShftPosReq_dic[ + 'Shifter position Zero']: + self.max_pos = ShiftMaxPosMap_dic[self.max_pos][shift.position] + reqpos = GearShiftMap_dic[self.pre_ShiftLeverPos][self.max_pos] + else: + reqpos = GearShiftMap_dic[self.pre_ShiftLeverPos][self.max_pos] + self.max_pos = 'Shifter position Zero' + self.pre_ShiftLeverPos = [ + k for k, v in TCU2_ShiterLevel_dic.items() if v == reqpos + ][0] + + data = self.pack_TCU2(reqpos) + return data -- Gitblit v1.8.0