|
|
|
@ -19,6 +19,10 @@ from collections import namedtuple |
|
|
|
|
|
|
|
|
|
ProcessConfig = namedtuple('ProcessConfig', ['proc_name', 'pub_sub', 'ignore', 'init_callback', 'should_recv_callback']) |
|
|
|
|
|
|
|
|
|
def wait_for_event(evt): |
|
|
|
|
if not evt.wait(15): |
|
|
|
|
raise Exception("Timeout reached. Thread likely crashed.") |
|
|
|
|
|
|
|
|
|
class FakeSocket: |
|
|
|
|
def __init__(self, wait=True): |
|
|
|
|
self.data = [] |
|
|
|
@ -32,13 +36,13 @@ class FakeSocket: |
|
|
|
|
|
|
|
|
|
if self.wait: |
|
|
|
|
self.recv_called.set() |
|
|
|
|
self.recv_ready.wait() |
|
|
|
|
wait_for_event(self.recv_ready) |
|
|
|
|
self.recv_ready.clear() |
|
|
|
|
return self.data.pop() |
|
|
|
|
|
|
|
|
|
def send(self, data): |
|
|
|
|
if self.wait: |
|
|
|
|
self.recv_called.wait() |
|
|
|
|
wait_for_event(self.recv_called) |
|
|
|
|
self.recv_called.clear() |
|
|
|
|
|
|
|
|
|
self.data.append(data) |
|
|
|
@ -47,7 +51,7 @@ class FakeSocket: |
|
|
|
|
self.recv_ready.set() |
|
|
|
|
|
|
|
|
|
def wait_for_recv(self): |
|
|
|
|
self.recv_called.wait() |
|
|
|
|
wait_for_event(self.recv_called) |
|
|
|
|
|
|
|
|
|
class DumbSocket: |
|
|
|
|
def __init__(self, s=None): |
|
|
|
@ -75,23 +79,23 @@ class FakeSubMaster(messaging.SubMaster): |
|
|
|
|
# hack to know when fingerprinting is done |
|
|
|
|
if self.wait_on_getitem: |
|
|
|
|
self.update_called.set() |
|
|
|
|
self.update_ready.wait() |
|
|
|
|
wait_for_event(self.update_ready) |
|
|
|
|
self.update_ready.clear() |
|
|
|
|
return self.data[s] |
|
|
|
|
|
|
|
|
|
def update(self, timeout=-1): |
|
|
|
|
self.update_called.set() |
|
|
|
|
self.update_ready.wait() |
|
|
|
|
wait_for_event(self.update_ready) |
|
|
|
|
self.update_ready.clear() |
|
|
|
|
|
|
|
|
|
def update_msgs(self, cur_time, msgs): |
|
|
|
|
self.update_called.wait() |
|
|
|
|
wait_for_event(self.update_called) |
|
|
|
|
self.update_called.clear() |
|
|
|
|
super(FakeSubMaster, self).update_msgs(cur_time, msgs) |
|
|
|
|
self.update_ready.set() |
|
|
|
|
|
|
|
|
|
def wait_for_update(self): |
|
|
|
|
self.update_called.wait() |
|
|
|
|
wait_for_event(self.update_called) |
|
|
|
|
|
|
|
|
|
class FakePubMaster(messaging.PubMaster): |
|
|
|
|
def __init__(self, services): |
|
|
|
@ -116,11 +120,11 @@ class FakePubMaster(messaging.PubMaster): |
|
|
|
|
else: |
|
|
|
|
self.data[s] = dat.as_reader() |
|
|
|
|
self.send_called.set() |
|
|
|
|
self.get_called.wait() |
|
|
|
|
wait_for_event(self.get_called) |
|
|
|
|
self.get_called.clear() |
|
|
|
|
|
|
|
|
|
def wait_for_msg(self): |
|
|
|
|
self.send_called.wait() |
|
|
|
|
wait_for_event(self.send_called) |
|
|
|
|
self.send_called.clear() |
|
|
|
|
dat = self.data[self.last_updated] |
|
|
|
|
self.get_called.set() |
|
|
|
@ -132,14 +136,14 @@ def fingerprint(msgs, fsm, can_sock): |
|
|
|
|
|
|
|
|
|
# populate fake socket with data for fingerprinting |
|
|
|
|
canmsgs = [msg for msg in msgs if msg.which() == "can"] |
|
|
|
|
can_sock.recv_called.wait() |
|
|
|
|
wait_for_event(can_sock.recv_called) |
|
|
|
|
can_sock.recv_called.clear() |
|
|
|
|
can_sock.data = [msg.as_builder().to_bytes() for msg in canmsgs[:300]] |
|
|
|
|
can_sock.recv_ready.set() |
|
|
|
|
can_sock.wait = False |
|
|
|
|
|
|
|
|
|
# we know fingerprinting is done when controlsd sets sm['pathPlan'].sensorValid |
|
|
|
|
fsm.update_called.wait() |
|
|
|
|
wait_for_event(fsm.update_called) |
|
|
|
|
fsm.update_called.clear() |
|
|
|
|
|
|
|
|
|
fsm.wait_on_getitem = False |
|
|
|
|