parent
480ebebc50
commit
935b9ceb05
1 changed files with 84 additions and 0 deletions
@ -0,0 +1,84 @@ |
|||||||
|
#!/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 |
||||||
|
|
Loading…
Reference in new issue