|  |  |  | @ -2,6 +2,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  | import os | 
			
		
	
		
			
				
					|  |  |  |  | import json | 
			
		
	
		
			
				
					|  |  |  |  | import queue | 
			
		
	
		
			
				
					|  |  |  |  | import struct | 
			
		
	
		
			
				
					|  |  |  |  | import threading | 
			
		
	
		
			
				
					|  |  |  |  | import time | 
			
		
	
		
			
				
					|  |  |  |  | from collections import OrderedDict, namedtuple | 
			
		
	
	
		
			
				
					|  |  |  | @ -59,6 +60,32 @@ def set_offroad_alert_if_changed(offroad_alert: str, show_alert: bool, extra_tex | 
			
		
	
		
			
				
					|  |  |  |  |   prev_offroad_states[offroad_alert] = (show_alert, extra_text) | 
			
		
	
		
			
				
					|  |  |  |  |   set_offroad_alert(offroad_alert, show_alert, extra_text) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def touch_thread(end_event): | 
			
		
	
		
			
				
					|  |  |  |  |   pm = messaging.PubMaster(["touch"]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   event_format = "llHHi" | 
			
		
	
		
			
				
					|  |  |  |  |   event_size = struct.calcsize(event_format) | 
			
		
	
		
			
				
					|  |  |  |  |   event_frame = [] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   with open("/dev/input/by-path/platform-894000.i2c-event", "rb") as event_file: | 
			
		
	
		
			
				
					|  |  |  |  |     while not end_event.is_set(): | 
			
		
	
		
			
				
					|  |  |  |  |       event = event_file.read(event_size) | 
			
		
	
		
			
				
					|  |  |  |  |       if event: | 
			
		
	
		
			
				
					|  |  |  |  |         (sec, usec, etype, code, value) = struct.unpack(event_format, event) | 
			
		
	
		
			
				
					|  |  |  |  |         if etype != 0 or code != 0 or value != 0: | 
			
		
	
		
			
				
					|  |  |  |  |           touch = log.Touch.new_message() | 
			
		
	
		
			
				
					|  |  |  |  |           touch.sec = sec | 
			
		
	
		
			
				
					|  |  |  |  |           touch.usec = usec | 
			
		
	
		
			
				
					|  |  |  |  |           touch.type = etype | 
			
		
	
		
			
				
					|  |  |  |  |           touch.code = code | 
			
		
	
		
			
				
					|  |  |  |  |           touch.value = value | 
			
		
	
		
			
				
					|  |  |  |  |           event_frame.append(touch) | 
			
		
	
		
			
				
					|  |  |  |  |         else: # end of frame, push new log | 
			
		
	
		
			
				
					|  |  |  |  |           msg = messaging.new_message('touch', len(event_frame), valid=True) | 
			
		
	
		
			
				
					|  |  |  |  |           msg.touch = event_frame | 
			
		
	
		
			
				
					|  |  |  |  |           pm.send('touch', msg) | 
			
		
	
		
			
				
					|  |  |  |  |           event_frame = [] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def hw_state_thread(end_event, hw_queue): | 
			
		
	
		
			
				
					|  |  |  |  |   """Handles non critical hardware state, and sends over queue""" | 
			
		
	
	
		
			
				
					|  |  |  | @ -420,6 +447,9 @@ def main(): | 
			
		
	
		
			
				
					|  |  |  |  |     threading.Thread(target=hardware_thread, args=(end_event, hw_queue)), | 
			
		
	
		
			
				
					|  |  |  |  |   ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if TICI: | 
			
		
	
		
			
				
					|  |  |  |  |     threads.append(threading.Thread(target=touch_thread, args=(end_event,))) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   for t in threads: | 
			
		
	
		
			
				
					|  |  |  |  |     t.start() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |