| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -75,9 +75,12 @@ def panda_sort_cmp(a: Panda, b: Panda): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def main() -> NoReturn: | 
					 | 
					 | 
					 | 
					def main() -> NoReturn: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  first_run = True | 
					 | 
					 | 
					 | 
					  first_run = True | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  params = Params() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  while True: | 
					 | 
					 | 
					 | 
					  while True: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    try: | 
					 | 
					 | 
					 | 
					    try: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      params.delete("PandaSignatures") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # Flash all Pandas in DFU mode | 
					 | 
					 | 
					 | 
					      # Flash all Pandas in DFU mode | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      for p in PandaDFU.list(): | 
					 | 
					 | 
					 | 
					      for p in PandaDFU.list(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        cloudlog.info(f"Panda in DFU mode found, flashing recovery {p}") | 
					 | 
					 | 
					 | 
					        cloudlog.info(f"Panda in DFU mode found, flashing recovery {p}") | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -99,7 +102,7 @@ def main() -> NoReturn: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      for panda in pandas: | 
					 | 
					 | 
					 | 
					      for panda in pandas: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        health = panda.health() | 
					 | 
					 | 
					 | 
					        health = panda.health() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if health["heartbeat_lost"]: | 
					 | 
					 | 
					 | 
					        if health["heartbeat_lost"]: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          Params().put_bool("PandaHeartbeatLost", True) | 
					 | 
					 | 
					 | 
					          params.put_bool("PandaHeartbeatLost", True) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          cloudlog.event("heartbeat lost", deviceState=health, serial=panda.get_usb_serial()) | 
					 | 
					 | 
					 | 
					          cloudlog.event("heartbeat lost", deviceState=health, serial=panda.get_usb_serial()) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if first_run: | 
					 | 
					 | 
					 | 
					        if first_run: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -110,6 +113,9 @@ def main() -> NoReturn: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      pandas.sort(key=cmp_to_key(panda_sort_cmp)) | 
					 | 
					 | 
					 | 
					      pandas.sort(key=cmp_to_key(panda_sort_cmp)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      panda_serials = list(map(lambda p: p.get_usb_serial(), pandas)) | 
					 | 
					 | 
					 | 
					      panda_serials = list(map(lambda p: p.get_usb_serial(), pandas)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      # log panda fw versions | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      params.put("PandaSignatures", b','.join(p.get_signature() for p in pandas)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # close all pandas | 
					 | 
					 | 
					 | 
					      # close all pandas | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      for p in pandas: | 
					 | 
					 | 
					 | 
					      for p in pandas: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        p.close() | 
					 | 
					 | 
					 | 
					        p.close() | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |