| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -5,7 +5,7 @@ import time | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import signal | 
					 | 
					 | 
					 | 
					import signal | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import traceback | 
					 | 
					 | 
					 | 
					import traceback | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import usb1 | 
					 | 
					 | 
					 | 
					import usb1 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from panda import Panda | 
					 | 
					 | 
					 | 
					from panda import Panda, PandaDFU | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from multiprocessing import Pool | 
					 | 
					 | 
					 | 
					from multiprocessing import Pool | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					jungle = "JUNGLE" in os.environ | 
					 | 
					 | 
					 | 
					jungle = "JUNGLE" in os.environ | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -22,31 +22,31 @@ def initializer(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def send_thread(sender_serial): | 
					 | 
					 | 
					 | 
					def send_thread(sender_serial): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  global jungle | 
					 | 
					 | 
					 | 
					  global jungle | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  try: | 
					 | 
					 | 
					 | 
					  while True: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if jungle: | 
					 | 
					 | 
					 | 
					    try: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      sender = PandaJungle(sender_serial) | 
					 | 
					 | 
					 | 
					      if jungle: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					        sender = PandaJungle(sender_serial) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      sender = Panda(sender_serial) | 
					 | 
					 | 
					 | 
					      else: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      sender.set_safety_mode(Panda.SAFETY_ALLOUTPUT) | 
					 | 
					 | 
					 | 
					        sender = Panda(sender_serial) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    sender.set_can_loopback(False) | 
					 | 
					 | 
					 | 
					        sender.set_safety_mode(Panda.SAFETY_ALLOUTPUT) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    can_sock = messaging.sub_sock('can') | 
					 | 
					 | 
					 | 
					      sender.set_can_loopback(False) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      can_sock = messaging.sub_sock('can') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    while True: | 
					 | 
					 | 
					 | 
					      while True: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # Send messages one bus 0 and 1 | 
					 | 
					 | 
					 | 
					        tsc = messaging.recv_one(can_sock) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      tsc = messaging.recv_one(can_sock) | 
					 | 
					 | 
					 | 
					        snd = can_capnp_to_can_list(tsc.can) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      snd = can_capnp_to_can_list(tsc.can) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      snd = list(filter(lambda x: x[-1] <= 2, snd)) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      try: | 
					 | 
					 | 
					 | 
					        try: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        sender.can_send_many(snd) | 
					 | 
					 | 
					 | 
					          sender.can_send_many(snd) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      except usb1.USBErrorTimeout: | 
					 | 
					 | 
					 | 
					        except usb1.USBErrorTimeout: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("Can TX overflow", sender_serial) | 
					 | 
					 | 
					 | 
					          pass | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # Drain panda message buffer | 
					 | 
					 | 
					 | 
					        # Drain panda message buffer | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      sender.can_recv() | 
					 | 
					 | 
					 | 
					        sender.can_recv() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  except Exception: | 
					 | 
					 | 
					 | 
					    except Exception: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    traceback.print_exc() | 
					 | 
					 | 
					 | 
					      traceback.print_exc() | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      time.sleep(1) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					if __name__ == "__main__": | 
					 | 
					 | 
					 | 
					if __name__ == "__main__": | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if jungle: | 
					 | 
					 | 
					 | 
					  if jungle: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -55,12 +55,22 @@ if __name__ == "__main__": | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    serials = Panda.list() | 
					 | 
					 | 
					 | 
					    serials = Panda.list() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  num_senders = len(serials) | 
					 | 
					 | 
					 | 
					  num_senders = len(serials) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if num_senders == 0: | 
					 | 
					 | 
					 | 
					  if num_senders == 0: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    print("No senders found. Exiting") | 
					 | 
					 | 
					 | 
					    print("No senders found. Exiting") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    sys.exit(1) | 
					 | 
					 | 
					 | 
					    sys.exit(1) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  else: | 
					 | 
					 | 
					 | 
					  else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    print("%d senders found. Starting broadcast" % num_senders) | 
					 | 
					 | 
					 | 
					    print("%d senders found. Starting broadcast" % num_senders) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  if "FLASH" in os.environ: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    for s in PandaDFU.list(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      PandaDFU(s).recover() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    time.sleep(1) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    for s in serials: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      Panda(s).recover() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      Panda(s).flash() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  pool = Pool(num_senders, initializer=initializer) | 
					 | 
					 | 
					 | 
					  pool = Pool(num_senders, initializer=initializer) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  pool.map_async(send_thread, serials) | 
					 | 
					 | 
					 | 
					  pool.map_async(send_thread, serials) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |