| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -4,7 +4,7 @@ import os | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import usb1 | 
					 | 
					 | 
					 | 
					import usb1 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import time | 
					 | 
					 | 
					 | 
					import time | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import subprocess | 
					 | 
					 | 
					 | 
					import subprocess | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from typing import List, NoReturn | 
					 | 
					 | 
					 | 
					from typing import NoReturn | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from functools import cmp_to_key | 
					 | 
					 | 
					 | 
					from functools import cmp_to_key | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from panda import DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, Panda, PandaDFU | 
					 | 
					 | 
					 | 
					from panda import DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, Panda, PandaDFU | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -30,12 +30,7 @@ def flash_panda(panda_serial : str) -> Panda: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  panda_version = "bootstub" if panda.bootstub else panda.get_version() | 
					 | 
					 | 
					 | 
					  panda_version = "bootstub" if panda.bootstub else panda.get_version() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  panda_signature = b"" if panda.bootstub else panda.get_signature() | 
					 | 
					 | 
					 | 
					  panda_signature = b"" if panda.bootstub else panda.get_signature() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cloudlog.warning("Panda {} connected, version: {}, signature {}, expected {}".format( | 
					 | 
					 | 
					 | 
					  cloudlog.warning(f"Panda {panda_serial} connected, version: {panda_version}, signature {panda_signature.hex()[:16]}, expected {fw_signature.hex()[:16]}") | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    panda_serial, | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    panda_version, | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    panda_signature.hex()[:16], | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    fw_signature.hex()[:16], | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  )) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if panda.bootstub or panda_signature != fw_signature: | 
					 | 
					 | 
					 | 
					  if panda.bootstub or panda_signature != fw_signature: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cloudlog.info("Panda firmware out of date, update required") | 
					 | 
					 | 
					 | 
					    cloudlog.info("Panda firmware out of date, update required") | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -72,7 +67,7 @@ def panda_sort_cmp(a : Panda, b : Panda): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # sort by hardware type | 
					 | 
					 | 
					 | 
					  # sort by hardware type | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if a_type != b_type: | 
					 | 
					 | 
					 | 
					  if a_type != b_type: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return a_type < b_type | 
					 | 
					 | 
					 | 
					    return a_type < b_type | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # last resort: sort by serial number | 
					 | 
					 | 
					 | 
					  # last resort: sort by serial number | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return a.get_usb_serial() < b.get_usb_serial() | 
					 | 
					 | 
					 | 
					  return a.get_usb_serial() < b.get_usb_serial() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |