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