|  |  |  | @ -4,16 +4,12 @@ import math | 
			
		
	
		
			
				
					|  |  |  |  | import datetime | 
			
		
	
		
			
				
					|  |  |  |  | from collections import Counter | 
			
		
	
		
			
				
					|  |  |  |  | from pprint import pprint | 
			
		
	
		
			
				
					|  |  |  |  | from tqdm import tqdm | 
			
		
	
		
			
				
					|  |  |  |  | from typing import List, Tuple, cast | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from cereal.services import SERVICE_LIST | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.tools.lib.route import Route | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.tools.lib.logreader import LogReader | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.tools.lib.srreader import SegmentRangeReader, ReadMode | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | if __name__ == "__main__": | 
			
		
	
		
			
				
					|  |  |  |  |   r = Route(sys.argv[1]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   cnt_valid: Counter = Counter() | 
			
		
	
		
			
				
					|  |  |  |  |   cnt_events: Counter = Counter() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -24,31 +20,29 @@ if __name__ == "__main__": | 
			
		
	
		
			
				
					|  |  |  |  |   start_time = math.inf | 
			
		
	
		
			
				
					|  |  |  |  |   end_time = -math.inf | 
			
		
	
		
			
				
					|  |  |  |  |   ignition_off = None | 
			
		
	
		
			
				
					|  |  |  |  |   for q in tqdm(r.qlog_paths()): | 
			
		
	
		
			
				
					|  |  |  |  |     if q is None: | 
			
		
	
		
			
				
					|  |  |  |  |       continue | 
			
		
	
		
			
				
					|  |  |  |  |     lr = list(LogReader(q)) | 
			
		
	
		
			
				
					|  |  |  |  |     for msg in lr: | 
			
		
	
		
			
				
					|  |  |  |  |       end_time = max(end_time, msg.logMonoTime) | 
			
		
	
		
			
				
					|  |  |  |  |       start_time = min(start_time, msg.logMonoTime) | 
			
		
	
		
			
				
					|  |  |  |  |   for msg in SegmentRangeReader(sys.argv[1], ReadMode.QLOG): | 
			
		
	
		
			
				
					|  |  |  |  |     end_time = max(end_time, msg.logMonoTime) | 
			
		
	
		
			
				
					|  |  |  |  |     start_time = min(start_time, msg.logMonoTime) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if msg.which() == 'onroadEvents': | 
			
		
	
		
			
				
					|  |  |  |  |         for e in msg.onroadEvents: | 
			
		
	
		
			
				
					|  |  |  |  |           cnt_events[e.name] += 1 | 
			
		
	
		
			
				
					|  |  |  |  |       elif msg.which() == 'controlsState': | 
			
		
	
		
			
				
					|  |  |  |  |         if len(alerts) == 0 or alerts[-1][1] != msg.controlsState.alertType: | 
			
		
	
		
			
				
					|  |  |  |  |     if msg.which() == 'onroadEvents': | 
			
		
	
		
			
				
					|  |  |  |  |       for e in msg.onroadEvents: | 
			
		
	
		
			
				
					|  |  |  |  |         cnt_events[e.name] += 1 | 
			
		
	
		
			
				
					|  |  |  |  |     elif msg.which() == 'controlsState': | 
			
		
	
		
			
				
					|  |  |  |  |       at = msg.controlsState.alertType | 
			
		
	
		
			
				
					|  |  |  |  |       if "/override" not in at or "lanechange" in at.lower(): | 
			
		
	
		
			
				
					|  |  |  |  |         if len(alerts) == 0 or alerts[-1][1] != at: | 
			
		
	
		
			
				
					|  |  |  |  |           t = (msg.logMonoTime - start_time) / 1e9 | 
			
		
	
		
			
				
					|  |  |  |  |           alerts.append((t, msg.controlsState.alertType)) | 
			
		
	
		
			
				
					|  |  |  |  |       elif msg.which() == 'pandaStates': | 
			
		
	
		
			
				
					|  |  |  |  |         if ignition_off is None: | 
			
		
	
		
			
				
					|  |  |  |  |           ign = any(ps.ignitionLine or ps.ignitionCan for ps in msg.pandaStates) | 
			
		
	
		
			
				
					|  |  |  |  |           if not ign: | 
			
		
	
		
			
				
					|  |  |  |  |             ignition_off = msg.logMonoTime | 
			
		
	
		
			
				
					|  |  |  |  |       elif msg.which() in cams: | 
			
		
	
		
			
				
					|  |  |  |  |         cnt_cameras[msg.which()] += 1 | 
			
		
	
		
			
				
					|  |  |  |  |           alerts.append((t, at)) | 
			
		
	
		
			
				
					|  |  |  |  |     elif msg.which() == 'pandaStates': | 
			
		
	
		
			
				
					|  |  |  |  |       if ignition_off is None: | 
			
		
	
		
			
				
					|  |  |  |  |         ign = any(ps.ignitionLine or ps.ignitionCan for ps in msg.pandaStates) | 
			
		
	
		
			
				
					|  |  |  |  |         if not ign: | 
			
		
	
		
			
				
					|  |  |  |  |           ignition_off = msg.logMonoTime | 
			
		
	
		
			
				
					|  |  |  |  |     elif msg.which() in cams: | 
			
		
	
		
			
				
					|  |  |  |  |       cnt_cameras[msg.which()] += 1 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if not msg.valid: | 
			
		
	
		
			
				
					|  |  |  |  |         cnt_valid[msg.which()] += 1 | 
			
		
	
		
			
				
					|  |  |  |  |     if not msg.valid: | 
			
		
	
		
			
				
					|  |  |  |  |       cnt_valid[msg.which()] += 1 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   duration = (end_time - start_time) / 1e9 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |