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