@ -11,19 +11,30 @@ 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# include  "selfdrive/common/swaglog.h"  
					 
					 
					 
					# include  "selfdrive/common/swaglog.h"  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# include  "selfdrive/common/util.h"  
					 
					 
					 
					# include  "selfdrive/common/util.h"  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  int  init_usb_ctx ( libusb_context  * context )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  int  err  =  libusb_init ( & context ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  if  ( err  ! =  0 )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    LOGE ( " libusb initialization error " ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    return  err ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# if LIBUSB_API_VERSION >= 0x01000106  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  libusb_set_option ( context ,  LIBUSB_OPTION_LOG_LEVEL ,  LIBUSB_LOG_LEVEL_INFO ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# else  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  libusb_set_debug ( context ,  3 ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# endif  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  return  err ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					Panda : : Panda ( std : : string  serial )  {  
					 
					 
					 
					Panda : : Panda ( std : : string  serial )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  // init libusb
   
					 
					 
					 
					  // init libusb
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  ssize_t  num_devices ;   
					 
					 
					 
					  ssize_t  num_devices ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  libusb_device  * * dev_list  =  NULL ;   
					 
					 
					 
					  libusb_device  * * dev_list  =  NULL ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  int  err  =  libusb_init ( & ctx ) ;   
					 
					 
					 
					  int  err  =  init_usb_ctx ( ctx ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					  if  ( err  ! =  0 )  {  goto  fail ;  }   
					 
					 
					 
					  if  ( err  ! =  0 )  {  goto  fail ;  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# if LIBUSB_API_VERSION >= 0x01000106  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  libusb_set_option ( ctx ,  LIBUSB_OPTION_LOG_LEVEL ,  LIBUSB_LOG_LEVEL_INFO ) ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# else  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  libusb_set_debug ( ctx ,  3 ) ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  // connect by serial
   
					 
					 
					 
					  // connect by serial
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  num_devices  =  libusb_get_device_list ( ctx ,  & dev_list ) ;   
					 
					 
					 
					  num_devices  =  libusb_get_device_list ( ctx ,  & dev_list ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  if  ( num_devices  <  0 )  {  goto  fail ;  }   
					 
					 
					 
					  if  ( num_devices  <  0 )  {  goto  fail ;  }   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -34,11 +45,12 @@ Panda::Panda(std::string serial) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      libusb_open ( dev_list [ i ] ,  & dev_handle ) ;   
					 
					 
					 
					      libusb_open ( dev_list [ i ] ,  & dev_handle ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      if  ( dev_handle  = =  NULL )  {  goto  fail ;  }   
					 
					 
					 
					      if  ( dev_handle  = =  NULL )  {  goto  fail ;  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      unsigned  char  desc_serial [ 25 ]  ;   
					 
					 
					 
					      unsigned  char  desc_serial [ 26 ]  =  {  0  }  ;   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					      int  ret  =  libusb_get_string_descriptor_ascii ( dev_handle ,  desc . iSerialNumber ,  desc_serial ,  sizeof ( desc_serial ) ) ;   
					 
					 
					 
					      int  ret  =  libusb_get_string_descriptor_ascii ( dev_handle ,  desc . iSerialNumber ,  desc_serial ,  std : : size ( desc_serial ) ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      if  ( ret  <  0 )  {  goto  fail ;  }   
					 
					 
					 
					      if  ( ret  <  0 )  {  goto  fail ;  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      if  ( serial . empty ( )  | |  serial . compare ( reinterpret_cast < const  char * > ( desc_serial ) )  = =  0 )  {   
					 
					 
					 
					      usb_serial  =  std : : string ( ( char  * ) desc_serial ,  ret ) . c_str ( ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      if  ( serial . empty ( )  | |  serial  = =  usb_serial )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        break ;   
					 
					 
					 
					        break ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      }   
					 
					 
					 
					      }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      libusb_close ( dev_handle ) ;   
					 
					 
					 
					      libusb_close ( dev_handle ) ;   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -92,6 +104,48 @@ void Panda::cleanup() { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }   
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					std : : vector < std : : string >  Panda : : list ( )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  // init libusb
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  ssize_t  num_devices ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  libusb_context  * context  =  NULL ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  libusb_device  * * dev_list  =  NULL ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  std : : vector < std : : string >  serials ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  int  err  =  init_usb_ctx ( context ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  if  ( err  ! =  0 )  {  return  serials ;  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  num_devices  =  libusb_get_device_list ( context ,  & dev_list ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  if  ( num_devices  <  0 )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    LOGE ( " libusb can't get device list " ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    goto  finish ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  for  ( size_t  i  =  0 ;  i  <  num_devices ;  + + i )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    libusb_device  * device  =  dev_list [ i ] ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    libusb_device_descriptor  desc ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    libusb_get_device_descriptor ( device ,  & desc ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    if  ( desc . idVendor  = =  0xbbaa  & &  desc . idProduct  = =  0xddcc )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      libusb_device_handle  * handle  =  NULL ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      libusb_open ( device ,  & handle ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      unsigned  char  desc_serial [ 26 ]  =  {  0  } ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      int  ret  =  libusb_get_string_descriptor_ascii ( handle ,  desc . iSerialNumber ,  desc_serial ,  std : : size ( desc_serial ) ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      libusb_release_interface ( handle ,  0 ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      libusb_close ( handle ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      if  ( ret  <  0 )  {  goto  finish ;  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      serials . push_back ( std : : string ( ( char  * ) desc_serial ,  ret ) . c_str ( ) ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					finish :  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  if  ( context )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    libusb_exit ( context ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  if  ( dev_list  ! =  NULL )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    libusb_free_device_list ( dev_list ,  1 ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  return  serials ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					void  Panda : : handle_usb_issue ( int  err ,  const  char  func [ ] )  {  
					 
					 
					 
					void  Panda : : handle_usb_issue ( int  err ,  const  char  func [ ] )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  LOGE_100 ( " usb error %d  \" %s \"  in %s " ,  err ,  libusb_strerror ( ( enum  libusb_error ) err ) ,  func ) ;   
					 
					 
					 
					  LOGE_100 ( " usb error %d  \" %s \"  in %s " ,  err ,  libusb_strerror ( ( enum  libusb_error ) err ) ,  func ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  if  ( err  = =  LIBUSB_ERROR_NO_DEVICE )  {   
					 
					 
					 
					  if  ( err  = =  LIBUSB_ERROR_NO_DEVICE )  {