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.
		
		
		
		
			
				
					40 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					40 lines
				
				1.1 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								from collections import defaultdict
							 | 
						||
| 
								 | 
							
								from selfdrive.can.libdbc_py import libdbc, ffi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CANDefine(object):
							 | 
						||
| 
								 | 
							
								  def __init__(self, dbc_name):
							 | 
						||
| 
								 | 
							
								    self.dv = defaultdict(dict)
							 | 
						||
| 
								 | 
							
								    self.dbc_name = dbc_name
							 | 
						||
| 
								 | 
							
								    self.dbc = libdbc.dbc_lookup(dbc_name)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    num_vals = self.dbc[0].num_vals
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.address_to_msg_name = {}
							 | 
						||
| 
								 | 
							
								    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.address_to_msg_name[address] = name
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for i in range(num_vals):
							 | 
						||
| 
								 | 
							
								      val = self.dbc[0].vals[i]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      sgname = ffi.string(val.name)
							 | 
						||
| 
								 | 
							
								      address = val.address
							 | 
						||
| 
								 | 
							
								      def_val = ffi.string(val.def_val)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      #separate definition/value pairs
							 | 
						||
| 
								 | 
							
								      def_val = def_val.split()
							 | 
						||
| 
								 | 
							
								      values = [int(v) for v in def_val[::2]]
							 | 
						||
| 
								 | 
							
								      defs = def_val[1::2]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if address not in self.dv:
							 | 
						||
| 
								 | 
							
								        self.dv[address] = {}
							 | 
						||
| 
								 | 
							
								        msgname = self.address_to_msg_name[address]
							 | 
						||
| 
								 | 
							
								        self.dv[msgname] = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      # two ways to lookup: address or msg name
							 | 
						||
| 
								 | 
							
								      self.dv[address][sgname] = {v: d for v, d in zip(values, defs)} #build dict
							 | 
						||
| 
								 | 
							
								      self.dv[msgname][sgname] = self.dv[address][sgname]
							 |