You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					42 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					42 lines
				
				1.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								import copy
							 | 
						||
| 
								 | 
							
								import crcmod
							 | 
						||
| 
								 | 
							
								from opendbc.can.can_define import CANDefine
							 | 
						||
| 
								 | 
							
								from selfdrive.car.tesla.values import CANBUS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TeslaCAN:
							 | 
						||
| 
								 | 
							
								  def __init__(self, dbc_name, packer):
							 | 
						||
| 
								 | 
							
								    self.can_define = CANDefine(dbc_name)
							 | 
						||
| 
								 | 
							
								    self.packer = packer
							 | 
						||
| 
								 | 
							
								    self.crc = crcmod.mkCrcFun(0x11d, initCrc=0x00, rev=False, xorOut=0xff)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @staticmethod
							 | 
						||
| 
								 | 
							
								  def checksum(msg_id, dat):
							 | 
						||
| 
								 | 
							
								    # TODO: get message ID from name instead
							 | 
						||
| 
								 | 
							
								    ret = (msg_id & 0xFF) + ((msg_id >> 8) & 0xFF)
							 | 
						||
| 
								 | 
							
								    ret += sum(dat)
							 | 
						||
| 
								 | 
							
								    return ret & 0xFF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def create_steering_control(self, angle, enabled, frame):
							 | 
						||
| 
								 | 
							
								    values = {
							 | 
						||
| 
								 | 
							
								      "DAS_steeringAngleRequest": -angle,
							 | 
						||
| 
								 | 
							
								      "DAS_steeringHapticRequest": 0,
							 | 
						||
| 
								 | 
							
								      "DAS_steeringControlType": 1 if enabled else 0,
							 | 
						||
| 
								 | 
							
								      "DAS_steeringControlCounter": (frame % 16),
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    data = self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)[2]
							 | 
						||
| 
								 | 
							
								    values["DAS_steeringControlChecksum"] = self.checksum(0x488, data[:3])
							 | 
						||
| 
								 | 
							
								    return self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def create_action_request(self, msg_stw_actn_req, cancel, bus, counter):
							 | 
						||
| 
								 | 
							
								    values = copy.copy(msg_stw_actn_req)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if cancel:
							 | 
						||
| 
								 | 
							
								      values["SpdCtrlLvr_Stat"] = 1
							 | 
						||
| 
								 | 
							
								      values["MC_STW_ACTN_RQ"] = counter
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    data = self.packer.make_can_msg("STW_ACTN_RQ", bus, values)[2]
							 | 
						||
| 
								 | 
							
								    values["CRC_STW_ACTN_RQ"] = self.crc(data[:7])
							 | 
						||
| 
								 | 
							
								    return self.packer.make_can_msg("STW_ACTN_RQ", bus, values)
							 |