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.
		
		
		
		
		
			
		
			
				
					
					
						
							39 lines
						
					
					
						
							1.1 KiB
						
					
					
				
			
		
		
	
	
							39 lines
						
					
					
						
							1.1 KiB
						
					
					
				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]
 | 
						|
 |