@ -1,5 +1,5 @@ 
			
		
	
		
		
			
				
					
					import  os import  os  
			
		
	
		
		
			
				
					
					from  typing  import  Dict ,  List from  typing  import  Callable ,  Dict ,  List ,  Optional ,  Tuple  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					from  cereal  import  car from  cereal  import  car  
			
		
	
		
		
			
				
					
					from  common . params  import  Params from  common . params  import  Params  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -77,6 +77,46 @@ interface_names = _get_interface_names() 
			
		
	
		
		
			
				
					
					interfaces  =  load_interfaces ( interface_names ) interfaces  =  load_interfaces ( interface_names )  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					def  can_fingerprint ( next_can :  Callable )  - >  Tuple [ Optional [ str ] ,  Dict [ int ,  dict ] ] :  
			
		
	
		
		
			
				
					
					  finger  =  gen_empty_fingerprint ( )   
			
		
	
		
		
			
				
					
					  candidate_cars  =  { i :  all_legacy_fingerprint_cars ( )  for  i  in  [ 0 ,  1 ] }   # attempt fingerprint on both bus 0 and 1   
			
		
	
		
		
			
				
					
					  frame  =  0   
			
		
	
		
		
			
				
					
					  car_fingerprint  =  None   
			
		
	
		
		
			
				
					
					  done  =  False   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  while  not  done :   
			
		
	
		
		
			
				
					
					    a  =  next_can ( )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    for  can  in  a . can :   
			
		
	
		
		
			
				
					
					      # The fingerprint dict is generated for all buses, this way the car interface   
			
		
	
		
		
			
				
					
					      # can use it to detect a (valid) multipanda setup and initialize accordingly   
			
		
	
		
		
			
				
					
					      if  can . src  <  128 :   
			
		
	
		
		
			
				
					
					        if  can . src  not  in  finger :   
			
		
	
		
		
			
				
					
					          finger [ can . src ]  =  { }   
			
		
	
		
		
			
				
					
					        finger [ can . src ] [ can . address ]  =  len ( can . dat )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      for  b  in  candidate_cars :   
			
		
	
		
		
			
				
					
					        # Ignore extended messages and VIN query response.   
			
		
	
		
		
			
				
					
					        if  can . src  ==  b  and  can . address  <  0x800  and  can . address  not  in  ( 0x7df ,  0x7e0 ,  0x7e8 ) :   
			
		
	
		
		
			
				
					
					          candidate_cars [ b ]  =  eliminate_incompatible_cars ( can ,  candidate_cars [ b ] )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    # if we only have one car choice and the time since we got our first   
			
		
	
		
		
			
				
					
					    # message has elapsed, exit   
			
		
	
		
		
			
				
					
					    for  b  in  candidate_cars :   
			
		
	
		
		
			
				
					
					      if  len ( candidate_cars [ b ] )  ==  1  and  frame  >  FRAME_FINGERPRINT :   
			
		
	
		
		
			
				
					
					        # fingerprint done   
			
		
	
		
		
			
				
					
					        car_fingerprint  =  candidate_cars [ b ] [ 0 ]   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    # bail if no cars left or we've been waiting for more than 2s   
			
		
	
		
		
			
				
					
					    failed  =  ( all ( len ( cc )  ==  0  for  cc  in  candidate_cars . values ( ) )  and  frame  >  FRAME_FINGERPRINT )  or  frame  >  200   
			
		
	
		
		
			
				
					
					    succeeded  =  car_fingerprint  is  not  None   
			
		
	
		
		
			
				
					
					    done  =  failed  or  succeeded   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    frame  + =  1   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  return  car_fingerprint ,  finger   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# **** for use live only **** # **** for use live only ****  
			
		
	
		
		
			
				
					
					def  fingerprint ( logcan ,  sendcan ,  num_pandas ) : def  fingerprint ( logcan ,  sendcan ,  num_pandas ) :  
			
		
	
		
		
			
				
					
					  fixed_fingerprint  =  os . environ . get ( ' FINGERPRINT ' ,  " " )    fixed_fingerprint  =  os . environ . get ( ' FINGERPRINT ' ,  " " )   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -125,44 +165,10 @@ def fingerprint(logcan, sendcan, num_pandas): 
			
		
	
		
		
			
				
					
					  set_obd_multiplexing ( params ,  False )    set_obd_multiplexing ( params ,  False )   
			
		
	
		
		
			
				
					
					  params . put_bool ( " FirmwareQueryDone " ,  True )    params . put_bool ( " FirmwareQueryDone " ,  True )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  finger  =  gen_empty_fingerprint ( )    # CAN fingerprint   
			
				
				
			
		
	
		
		
			
				
					
					  candidate_cars  =  { i :  all_legacy_fingerprint_cars ( )  for  i  in  [ 0 ,  1 ] }   # attempt fingerprint on both bus 0 and 1    # drain CAN socket so we get the latest messages   
			
				
				
			
		
	
		
		
			
				
					
					  frame  =  0   
			
		
	
		
		
			
				
					
					  car_fingerprint  =  None   
			
		
	
		
		
			
				
					
					  done  =  False   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  # drain CAN socket so we always get the latest messages   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					  messaging . drain_sock_raw ( logcan )    messaging . drain_sock_raw ( logcan )   
			
		
	
		
		
			
				
					
					
  car_fingerprint ,  finger  =  can_fingerprint ( lambda :  get_one_can ( logcan ) )   
			
				
				
			
		
	
		
		
			
				
					
					  while  not  done :   
			
		
	
		
		
			
				
					
					    a  =  get_one_can ( logcan )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    for  can  in  a . can :   
			
		
	
		
		
			
				
					
					      # The fingerprint dict is generated for all buses, this way the car interface   
			
		
	
		
		
			
				
					
					      # can use it to detect a (valid) multipanda setup and initialize accordingly   
			
		
	
		
		
			
				
					
					      if  can . src  <  128 :   
			
		
	
		
		
			
				
					
					        if  can . src  not  in  finger :   
			
		
	
		
		
			
				
					
					          finger [ can . src ]  =  { }   
			
		
	
		
		
			
				
					
					        finger [ can . src ] [ can . address ]  =  len ( can . dat )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      for  b  in  candidate_cars :   
			
		
	
		
		
			
				
					
					        # Ignore extended messages and VIN query response.   
			
		
	
		
		
			
				
					
					        if  can . src  ==  b  and  can . address  <  0x800  and  can . address  not  in  ( 0x7df ,  0x7e0 ,  0x7e8 ) :   
			
		
	
		
		
			
				
					
					          candidate_cars [ b ]  =  eliminate_incompatible_cars ( can ,  candidate_cars [ b ] )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    # if we only have one car choice and the time since we got our first   
			
		
	
		
		
			
				
					
					    # message has elapsed, exit   
			
		
	
		
		
			
				
					
					    for  b  in  candidate_cars :   
			
		
	
		
		
			
				
					
					      if  len ( candidate_cars [ b ] )  ==  1  and  frame  >  FRAME_FINGERPRINT :   
			
		
	
		
		
			
				
					
					        # fingerprint done   
			
		
	
		
		
			
				
					
					        car_fingerprint  =  candidate_cars [ b ] [ 0 ]   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    # bail if no cars left or we've been waiting for more than 2s   
			
		
	
		
		
			
				
					
					    failed  =  ( all ( len ( cc )  ==  0  for  cc  in  candidate_cars . values ( ) )  and  frame  >  FRAME_FINGERPRINT )  or  frame  >  200   
			
		
	
		
		
			
				
					
					    succeeded  =  car_fingerprint  is  not  None   
			
		
	
		
		
			
				
					
					    done  =  failed  or  succeeded   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    frame  + =  1   
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  exact_match  =  True    exact_match  =  True   
			
		
	
		
		
			
				
					
					  source  =  car . CarParams . FingerprintSource . can    source  =  car . CarParams . FingerprintSource . can