From 698b17133dd304fe293f495aa3b96c4274ccdd50 Mon Sep 17 00:00:00 2001
From: tao_z <tzj0429@163.com>
Date: Wed, 22 Jun 2022 23:03:00 +0800
Subject: [PATCH] 新增换挡逻辑功能

---
 Shifter.py |  136 +++++++++++++++++++++++++++++++++++++++------
 1 files changed, 117 insertions(+), 19 deletions(-)

diff --git a/Shifter.py b/Shifter.py
index 56dbb40..d637499 100644
--- a/Shifter.py
+++ b/Shifter.py
@@ -1,9 +1,12 @@
+from email.message import Message
 from ShifterDefine import *
 import struct
 from udsoncan import DidCodec
 
 import configparser
-from dbc import *
+import cantools
+
+ProjectDBC = cantools.database.load_file("DBC/SX7H.dbc")
 
 
 class AsciiCodec(DidCodec):
@@ -138,9 +141,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()
 
@@ -191,20 +194,115 @@
             self.canid.phy_rxId = 0x742
             self.canid.fun_rxId = 0x7df
             self.canid.normalid = 0x420
-        self.dbc = DBC("DBC/DFLZM.dbc")
+        self.SA1_message = ProjectDBC.get_message_by_name('SA1')
 
     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'])
+        input_signal = ProjectDBC.decode_message(id, frame)
+        # part_str = str(input_signal['SA1_Status_ParkButtonReq'])
+        # print(type(part_str))
+        # if input_signal['SA1_Status_ParkButtonReq'] == 'No request':
+        #     print('yes')
+        # print(SA1_Status_ParkButtonReq_dic[part_str])
+        self.Pbutton = SA1_Status_ParkButtonReq_dic[str(
+            input_signal['SA1_Status_ParkButtonReq'])]
+        self.UnlockButton = SA1_Status_UnlockButtonReq_dic[str(
+            input_signal['SA1_Status_UnlockButtonReq'])]
+        self.position = SA1_Status_GearShftPosReq_dic[str(
+            input_signal['SA1_Status_GearShftPosReq'])]
+
+    def PackFrame(self, dic):
+        data = self.SA1_message.encode({
+            'SA1_Status_PRNDL':
+            0,
+            'SA1_Status_GearShftPosReq':
+            SA1_Status_GearShftPosReq_dic[self.position],
+            'SA1_Status_ParkButtonReq':
+            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,
+            "SA1_Status_UnlockButtonReq":
+            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.IC1_message = ProjectDBC.get_message_by_name('IC1')
+        self.TCU2_message = ProjectDBC.get_message_by_name('TCU2')
+        self.ABS1_message = ProjectDBC.get_message_by_name('ABS1')
+        self.Engine2_message = ProjectDBC.get_message_by_name('Engine2')
+
+    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'
+        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