parent
							
								
									dc63a6ff6a
								
							
						
					
					
						commit
						e6478c6b35
					
				
				 2 changed files with 81 additions and 83 deletions
			
			
		@ -1,83 +0,0 @@ | 
				
			|||||||
#!/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 | 
					 | 
				
			||||||
@ -0,0 +1,81 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import os | 
				
			||||||
 | 
					import time | 
				
			||||||
 | 
					from multiprocessing import Process | 
				
			||||||
 | 
					from tqdm import tqdm | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					os.environ['FILEREADER_CACHE'] = '1' | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from common.realtime import config_realtime_process, Ratekeeper | 
				
			||||||
 | 
					from selfdrive.boardd.boardd import can_capnp_to_can_list | 
				
			||||||
 | 
					from tools.lib.logreader import LogReader | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from panda import Panda | 
				
			||||||
 | 
					try: | 
				
			||||||
 | 
					  from panda_jungle import PandaJungle | 
				
			||||||
 | 
					except Exception: | 
				
			||||||
 | 
					  PandaJungle = None # type: ignore | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ROUTE = "77611a1fac303767/2020-03-24--09-50-38" | 
				
			||||||
 | 
					NUM_SEGS = 10 # route has 82 segments available | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print("Loading log...") | 
				
			||||||
 | 
					CAN_MSGS = [] | 
				
			||||||
 | 
					for i in tqdm(list(range(1, NUM_SEGS))): | 
				
			||||||
 | 
					  log_url = f"https://commadataci.blob.core.windows.net/openpilotci/{ROUTE}/{i}/rlog.bz2" | 
				
			||||||
 | 
					  lr = LogReader(log_url) | 
				
			||||||
 | 
					  CAN_MSGS += [can_capnp_to_can_list(m.can) for m in lr if m.which() == 'can'] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def send_thread(sender, core): | 
				
			||||||
 | 
					  config_realtime_process(core, 55) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if "Jungle" in str(type(sender)): | 
				
			||||||
 | 
					    sender.set_ignition(False) | 
				
			||||||
 | 
					    time.sleep(3) | 
				
			||||||
 | 
					    sender.set_ignition(True) | 
				
			||||||
 | 
					  else: | 
				
			||||||
 | 
					    sender.set_safety_mode(Panda.SAFETY_ALLOUTPUT) | 
				
			||||||
 | 
					  sender.set_can_loopback(False) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  log_idx = 0 | 
				
			||||||
 | 
					  rk = Ratekeeper(100) | 
				
			||||||
 | 
					  while True: | 
				
			||||||
 | 
					    snd = CAN_MSGS[log_idx] | 
				
			||||||
 | 
					    log_idx = (log_idx + 1) % len(CAN_MSGS) | 
				
			||||||
 | 
					    snd = list(filter(lambda x: x[-1] <= 2, snd)) | 
				
			||||||
 | 
					    sender.can_send_many(snd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Drain panda message buffer | 
				
			||||||
 | 
					    sender.can_recv() | 
				
			||||||
 | 
					    rk.keep_time() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def connect(): | 
				
			||||||
 | 
					  serials = {} | 
				
			||||||
 | 
					  while True: | 
				
			||||||
 | 
					    # look for new devices | 
				
			||||||
 | 
					    for p in [Panda, PandaJungle]: | 
				
			||||||
 | 
					      if p is None: | 
				
			||||||
 | 
					        continue | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      for s in p.list(): | 
				
			||||||
 | 
					        if s not in serials: | 
				
			||||||
 | 
					          print("starting send thread for", s) | 
				
			||||||
 | 
					          serials[s] = Process(target=send_thread, args=(p(s), 3)) | 
				
			||||||
 | 
					          serials[s].start() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # try to join all send procs | 
				
			||||||
 | 
					    cur_serials = serials.copy() | 
				
			||||||
 | 
					    for s, p in cur_serials.items(): | 
				
			||||||
 | 
					      p.join(0.01) | 
				
			||||||
 | 
					      if p.exitcode is not None: | 
				
			||||||
 | 
					        del serials[s] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    time.sleep(1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					  while True: | 
				
			||||||
 | 
					    try: | 
				
			||||||
 | 
					      connect() | 
				
			||||||
 | 
					    except Exception: | 
				
			||||||
 | 
					      pass | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue