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