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.
		
		
		
		
			
				
					68 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					68 lines
				
				1.9 KiB
			| 
								 
											7 years ago
										 
									 | 
							
								import struct
							 | 
						||
| 
								 | 
							
								from selfdrive.can.libdbc_py import libdbc, ffi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CANPacker(object):
							 | 
						||
| 
								 | 
							
								  def __init__(self, dbc_name):
							 | 
						||
| 
								 | 
							
								    self.packer = libdbc.canpack_init(dbc_name)
							 | 
						||
| 
								 | 
							
								    self.dbc = libdbc.dbc_lookup(dbc_name)
							 | 
						||
| 
								 | 
							
								    self.sig_names = {}
							 | 
						||
| 
								 | 
							
								    self.name_to_address_and_size = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    num_msgs = self.dbc[0].num_msgs
							 | 
						||
| 
								 | 
							
								    for i in range(num_msgs):
							 | 
						||
| 
								 | 
							
								      msg = self.dbc[0].msgs[i]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      name = ffi.string(msg.name)
							 | 
						||
| 
								 | 
							
								      address = msg.address
							 | 
						||
| 
								 | 
							
								      self.name_to_address_and_size[name] = (address, msg.size)
							 | 
						||
| 
								 | 
							
								      self.name_to_address_and_size[address] = (address, msg.size)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def pack(self, addr, values, counter):
							 | 
						||
| 
								 | 
							
								    values_thing = []
							 | 
						||
| 
								 | 
							
								    for name, value in values.iteritems():
							 | 
						||
| 
								 | 
							
								      if name not in self.sig_names:
							 | 
						||
| 
								 | 
							
								        self.sig_names[name] = ffi.new("char[]", name)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      values_thing.append({
							 | 
						||
| 
								 | 
							
								        'name': self.sig_names[name],
							 | 
						||
| 
								 | 
							
								        'value': value
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    values_c = ffi.new("SignalPackValue[]", values_thing)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return libdbc.canpack_pack(self.packer, addr, len(values_thing), values_c, counter)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def pack_bytes(self, addr, values, counter=-1):
							 | 
						||
| 
								 | 
							
								    addr, size = self.name_to_address_and_size[addr]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    val = self.pack(addr, values, counter)
							 | 
						||
| 
								 | 
							
								    r = struct.pack(">Q", val)
							 | 
						||
| 
								 | 
							
								    return addr, r[:size]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def make_can_msg(self, addr, bus, values, counter=-1):
							 | 
						||
| 
								 | 
							
								    addr, msg = self.pack_bytes(addr, values, counter)
							 | 
						||
| 
								 | 
							
								    return [addr, 0, msg, bus]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  ## little endian test
							 | 
						||
| 
								 | 
							
								  cp = CANPacker("hyundai_santa_fe_2019_ccan")
							 | 
						||
| 
								 | 
							
								  s = cp.pack_bytes(0x340, {
							 | 
						||
| 
								 | 
							
								    "CR_Lkas_StrToqReq": -0.06,
							 | 
						||
| 
								 | 
							
								    #"CF_Lkas_FcwBasReq": 1,
							 | 
						||
| 
								 | 
							
								    "CF_Lkas_MsgCount": 7,
							 | 
						||
| 
								 | 
							
								    "CF_Lkas_HbaSysState": 0,
							 | 
						||
| 
								 | 
							
								    #"CF_Lkas_Chksum": 3,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  s = cp.pack_bytes(0x340, {
							 | 
						||
| 
								 | 
							
								    "CF_Lkas_MsgCount": 1,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  # big endian test
							 | 
						||
| 
								 | 
							
								  #cp = CANPacker("honda_civic_touring_2016_can_generated")
							 | 
						||
| 
								 | 
							
								  #s = cp.pack_bytes(0xe4, {
							 | 
						||
| 
								 | 
							
								  #  "STEER_TORQUE": -2,
							 | 
						||
| 
								 | 
							
								  #})
							 | 
						||
| 
								 | 
							
								  print([hex(ord(v)) for v in s[1]])
							 | 
						||
| 
								 | 
							
								  print(s[1].encode("hex"))
							 |