from  selfdrive . car . interfaces  import  get_interface_attr 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								FW_VERSIONS  =  get_interface_attr ( ' FW_VERSIONS ' ,  combine_brands = True ,  ignore_none = True ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_FINGERPRINTS  =  get_interface_attr ( ' FINGERPRINTS ' ,  combine_brands = True ,  ignore_none = True ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_DEBUG_ADDRESS  =  { 1880 :  8 }    # reserved for debug purposes 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  is_valid_for_fingerprint ( msg ,  car_fingerprint ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  adr  =  msg . address 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  # ignore addresses that are more than 11 bits 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  ( adr  in  car_fingerprint  and  car_fingerprint [ adr ]  ==  len ( msg . dat ) )  or  adr  > =  0x800 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  eliminate_incompatible_cars ( msg ,  candidate_cars ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  """ Removes cars that could not have sent msg. 
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     Inputs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      msg :  A  cereal / log  CanData  message  from  the  car . 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      candidate_cars :  A  list  of  cars  to  consider . 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     Returns : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      A  list  containing  the  subset  of  candidate_cars  that  could  have  sent  msg . 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  """ 
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  compatible_cars  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  car_name  in  candidate_cars : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    car_fingerprints  =  _FINGERPRINTS [ car_name ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  fingerprint  in  car_fingerprints : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      fingerprint . update ( _DEBUG_ADDRESS )   # add alien debug address 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  is_valid_for_fingerprint ( msg ,  fingerprint ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        compatible_cars . append ( car_name ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        break 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  compatible_cars 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  all_known_cars ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  """ Returns a list of all known car strings. """ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  return  list ( { * FW_VERSIONS . keys ( ) ,  * _FINGERPRINTS . keys ( ) } ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  all_legacy_fingerprint_cars ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  """ Returns a list of all known car strings, FPv1 only. """ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  list ( _FINGERPRINTS . keys ( ) )