|  |  |  | @ -184,33 +184,34 @@ void ui_update_params(UIState *s) { | 
			
		
	
		
			
				
					|  |  |  |  |   s->scene.is_metric = Params().getBool("IsMetric"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void update_status(UIState *s) { | 
			
		
	
		
			
				
					|  |  |  |  |   if (s->scene.started && s->sm->updated("controlsState")) { | 
			
		
	
		
			
				
					|  |  |  |  |     auto controls_state = (*s->sm)["controlsState"].getControlsState(); | 
			
		
	
		
			
				
					|  |  |  |  | void UIState::updateStatus() { | 
			
		
	
		
			
				
					|  |  |  |  |   if (scene.started && sm->updated("controlsState")) { | 
			
		
	
		
			
				
					|  |  |  |  |     auto controls_state = (*sm)["controlsState"].getControlsState(); | 
			
		
	
		
			
				
					|  |  |  |  |     auto alert_status = controls_state.getAlertStatus(); | 
			
		
	
		
			
				
					|  |  |  |  |     if (alert_status == cereal::ControlsState::AlertStatus::USER_PROMPT) { | 
			
		
	
		
			
				
					|  |  |  |  |       s->status = STATUS_WARNING; | 
			
		
	
		
			
				
					|  |  |  |  |       status = STATUS_WARNING; | 
			
		
	
		
			
				
					|  |  |  |  |     } else if (alert_status == cereal::ControlsState::AlertStatus::CRITICAL) { | 
			
		
	
		
			
				
					|  |  |  |  |       s->status = STATUS_ALERT; | 
			
		
	
		
			
				
					|  |  |  |  |       status = STATUS_ALERT; | 
			
		
	
		
			
				
					|  |  |  |  |     } else { | 
			
		
	
		
			
				
					|  |  |  |  |       s->status = controls_state.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED; | 
			
		
	
		
			
				
					|  |  |  |  |       status = controls_state.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   // Handle onroad/offroad transition
 | 
			
		
	
		
			
				
					|  |  |  |  |   static bool started_prev = false; | 
			
		
	
		
			
				
					|  |  |  |  |   if (s->scene.started != started_prev) { | 
			
		
	
		
			
				
					|  |  |  |  |     if (s->scene.started) { | 
			
		
	
		
			
				
					|  |  |  |  |       s->status = STATUS_DISENGAGED; | 
			
		
	
		
			
				
					|  |  |  |  |       s->scene.started_frame = s->sm->frame; | 
			
		
	
		
			
				
					|  |  |  |  |       s->scene.end_to_end = Params().getBool("EndToEndToggle"); | 
			
		
	
		
			
				
					|  |  |  |  |       s->wide_camera = Hardware::TICI() ? Params().getBool("EnableWideCamera") : false; | 
			
		
	
		
			
				
					|  |  |  |  |   if (scene.started != started_prev) { | 
			
		
	
		
			
				
					|  |  |  |  |     if (scene.started) { | 
			
		
	
		
			
				
					|  |  |  |  |       status = STATUS_DISENGAGED; | 
			
		
	
		
			
				
					|  |  |  |  |       scene.started_frame = sm->frame; | 
			
		
	
		
			
				
					|  |  |  |  |       scene.end_to_end = Params().getBool("EndToEndToggle"); | 
			
		
	
		
			
				
					|  |  |  |  |       wide_camera = Hardware::TICI() ? Params().getBool("EnableWideCamera") : false; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     started_prev = scene.started; | 
			
		
	
		
			
				
					|  |  |  |  |     emit offroadTransition(!scene.started); | 
			
		
	
		
			
				
					|  |  |  |  |   } else if (sm->frame == 1) { | 
			
		
	
		
			
				
					|  |  |  |  |     emit offroadTransition(!scene.started); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   started_prev = s->scene.started; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | UIState::UIState(QObject *parent) : QObject(parent) { | 
			
		
	
		
			
				
					|  |  |  |  |   sm = std::make_unique<SubMaster, const std::initializer_list<const char *>>({ | 
			
		
	
		
			
				
					|  |  |  |  |     "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", "roadCameraState", | 
			
		
	
	
		
			
				
					|  |  |  | @ -230,12 +231,7 @@ UIState::UIState(QObject *parent) : QObject(parent) { | 
			
		
	
		
			
				
					|  |  |  |  | void UIState::update() { | 
			
		
	
		
			
				
					|  |  |  |  |   update_sockets(this); | 
			
		
	
		
			
				
					|  |  |  |  |   update_state(this); | 
			
		
	
		
			
				
					|  |  |  |  |   update_status(this); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if (scene.started != started_prev || sm->frame == 1) { | 
			
		
	
		
			
				
					|  |  |  |  |     started_prev = scene.started; | 
			
		
	
		
			
				
					|  |  |  |  |     emit offroadTransition(!scene.started); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   updateStatus(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if (sm->frame % UI_FREQ == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |     watchdog_kick(); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |