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.
81 lines
2.0 KiB
81 lines
2.0 KiB
#!/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 # pylint: disable=import-error
|
|
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
|
|
|