|  |  |  | @ -53,12 +53,16 @@ class Controls: | 
			
		
	
		
			
				
					|  |  |  |  |       self.pm = messaging.PubMaster(['sendcan', 'controlsState', 'carState', | 
			
		
	
		
			
				
					|  |  |  |  |                                      'carControl', 'carEvents', 'carParams']) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     self.camera_packets = ["roadCameraState", "driverCameraState"] | 
			
		
	
		
			
				
					|  |  |  |  |     if TICI: | 
			
		
	
		
			
				
					|  |  |  |  |       self.camera_packets.append("wideRoadCameraState") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     self.sm = sm | 
			
		
	
		
			
				
					|  |  |  |  |     if self.sm is None: | 
			
		
	
		
			
				
					|  |  |  |  |       ignore = ['driverCameraState', 'managerState'] if SIMULATION else None | 
			
		
	
		
			
				
					|  |  |  |  |       self.sm = messaging.SubMaster(['deviceState', 'pandaState', 'modelV2', 'liveCalibration', | 
			
		
	
		
			
				
					|  |  |  |  |                                      'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman', | 
			
		
	
		
			
				
					|  |  |  |  |                                      'roadCameraState', 'driverCameraState', 'managerState', 'liveParameters', 'radarState'], | 
			
		
	
		
			
				
					|  |  |  |  |                                      'managerState', 'liveParameters', 'radarState'] + self.camera_packets, | 
			
		
	
		
			
				
					|  |  |  |  |                                      ignore_alive=ignore, ignore_avg_freq=['radarState', 'longitudinalPlan']) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     self.can_sock = can_sock | 
			
		
	
	
		
			
				
					|  |  |  | @ -66,6 +70,9 @@ class Controls: | 
			
		
	
		
			
				
					|  |  |  |  |       can_timeout = None if os.environ.get('NO_CAN_TIMEOUT', False) else 100 | 
			
		
	
		
			
				
					|  |  |  |  |       self.can_sock = messaging.sub_sock('can', timeout=can_timeout) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if TICI: | 
			
		
	
		
			
				
					|  |  |  |  |       self.log_sock = messaging.sub_sock('androidLog') | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     # wait for one pandaState and one CAN packet | 
			
		
	
		
			
				
					|  |  |  |  |     print("Waiting for CAN messages...") | 
			
		
	
		
			
				
					|  |  |  |  |     get_one_can(self.can_sock) | 
			
		
	
	
		
			
				
					|  |  |  | @ -249,6 +256,21 @@ class Controls: | 
			
		
	
		
			
				
					|  |  |  |  |     if self.sm['longitudinalPlan'].fcw: | 
			
		
	
		
			
				
					|  |  |  |  |       self.events.add(EventName.fcw) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if TICI and self.enable_lte_onroad: | 
			
		
	
		
			
				
					|  |  |  |  |       logs = messaging.drain_sock(self.log_sock, wait_for_one=False) | 
			
		
	
		
			
				
					|  |  |  |  |       messages = [] | 
			
		
	
		
			
				
					|  |  |  |  |       for m in logs: | 
			
		
	
		
			
				
					|  |  |  |  |         try: | 
			
		
	
		
			
				
					|  |  |  |  |           messages.append(m.androidLog.message) | 
			
		
	
		
			
				
					|  |  |  |  |         except UnicodeDecodeError: | 
			
		
	
		
			
				
					|  |  |  |  |           pass | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       for err in ["ERROR_CRC", "ERROR_ECC", "ERROR_STREAM_UNDERFLOW", "APPLY FAILED"]: | 
			
		
	
		
			
				
					|  |  |  |  |         err_cnt = sum(err in m for m in messages) | 
			
		
	
		
			
				
					|  |  |  |  |         if err_cnt: | 
			
		
	
		
			
				
					|  |  |  |  |           self.events.add(EventName.cameraError) | 
			
		
	
		
			
				
					|  |  |  |  |           break | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     # TODO: fix simulator | 
			
		
	
		
			
				
					|  |  |  |  |     if not SIMULATION: | 
			
		
	
		
			
				
					|  |  |  |  |       if not NOSENSOR: | 
			
		
	
	
		
			
				
					|  |  |  | @ -256,7 +278,7 @@ class Controls: | 
			
		
	
		
			
				
					|  |  |  |  |           (not TICI or self.enable_lte_onroad): | 
			
		
	
		
			
				
					|  |  |  |  |           # Not show in first 1 km to allow for driving out of garage. This event shows after 5 minutes | 
			
		
	
		
			
				
					|  |  |  |  |           self.events.add(EventName.noGps) | 
			
		
	
		
			
				
					|  |  |  |  |       if not self.sm.all_alive(['roadCameraState', 'driverCameraState']): | 
			
		
	
		
			
				
					|  |  |  |  |       if not self.sm.all_alive(self.camera_packets): | 
			
		
	
		
			
				
					|  |  |  |  |         self.events.add(EventName.cameraMalfunction) | 
			
		
	
		
			
				
					|  |  |  |  |       if self.sm['modelV2'].frameDropPerc > 20: | 
			
		
	
		
			
				
					|  |  |  |  |         self.events.add(EventName.modeldLagging) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |