You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							1.9 KiB
						
					
					
				#!/usr/bin/env python3
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import time
 | 
						|
import signal
 | 
						|
import traceback
 | 
						|
import usb1
 | 
						|
from panda import Panda, PandaDFU
 | 
						|
from multiprocessing import Pool
 | 
						|
 | 
						|
jungle = "JUNGLE" in os.environ
 | 
						|
if jungle:
 | 
						|
  from panda_jungle import PandaJungle  # pylint: disable=import-error
 | 
						|
 | 
						|
import cereal.messaging as messaging
 | 
						|
from selfdrive.boardd.boardd import can_capnp_to_can_list
 | 
						|
 | 
						|
def initializer():
 | 
						|
  """Ignore CTRL+C in the worker process.
 | 
						|
  source: https://stackoverflow.com/a/44869451 """
 | 
						|
  signal.signal(signal.SIGINT, signal.SIG_IGN)
 | 
						|
 | 
						|
def send_thread(sender_serial):
 | 
						|
  global jungle
 | 
						|
  while True:
 | 
						|
    try:
 | 
						|
      if jungle:
 | 
						|
        sender = PandaJungle(sender_serial)
 | 
						|
      else:
 | 
						|
        sender = Panda(sender_serial)
 | 
						|
        sender.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
 | 
						|
 | 
						|
      sender.set_can_loopback(False)
 | 
						|
      can_sock = messaging.sub_sock('can')
 | 
						|
 | 
						|
      while True:
 | 
						|
        tsc = messaging.recv_one(can_sock)
 | 
						|
        snd = can_capnp_to_can_list(tsc.can)
 | 
						|
        snd = list(filter(lambda x: x[-1] <= 2, snd))
 | 
						|
 | 
						|
        try:
 | 
						|
          sender.can_send_many(snd)
 | 
						|
        except usb1.USBErrorTimeout:
 | 
						|
          pass
 | 
						|
 | 
						|
        # Drain panda message buffer
 | 
						|
        sender.can_recv()
 | 
						|
    except Exception:
 | 
						|
      traceback.print_exc()
 | 
						|
      time.sleep(1)
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
  if jungle:
 | 
						|
    serials = PandaJungle.list()
 | 
						|
  else:
 | 
						|
    serials = Panda.list()
 | 
						|
  num_senders = len(serials)
 | 
						|
 | 
						|
  if num_senders == 0:
 | 
						|
    print("No senders found. Exiting")
 | 
						|
    sys.exit(1)
 | 
						|
  else:
 | 
						|
    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.map_async(send_thread, serials)
 | 
						|
 | 
						|
  while True:
 | 
						|
    try:
 | 
						|
      time.sleep(10)
 | 
						|
    except KeyboardInterrupt:
 | 
						|
      pool.terminate()
 | 
						|
      pool.join()
 | 
						|
      raise
 | 
						|
 |