@ -57,7 +57,7 @@ void ui_init(UIState *s) { 
			
		
	
		
		
			
				
					
					  s - > sm  =  new  SubMaster ( { " modelV2 " ,  " controlsState " ,  " uiLayoutState " ,  " liveCalibration " ,  " radarState " ,  " deviceState " ,  " roadCameraState " ,  " liveLocationKalman " ,    s - > sm  =  new  SubMaster ( { " modelV2 " ,  " controlsState " ,  " uiLayoutState " ,  " liveCalibration " ,  " radarState " ,  " deviceState " ,  " roadCameraState " ,  " liveLocationKalman " ,   
			
		
	
		
		
			
				
					
					                         " pandaState " ,  " carParams " ,  " driverState " ,  " driverMonitoringState " ,  " sensorEvents " ,  " carState " ,  " ubloxGnss " } ) ;                           " pandaState " ,  " carParams " ,  " driverState " ,  " driverMonitoringState " ,  " sensorEvents " ,  " carState " ,  " ubloxGnss " } ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  s - > started  =  false ;    s - > scene . s tarted  =  false ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  s - > status  =  STATUS_OFFROAD ;    s - > status  =  STATUS_OFFROAD ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  s - > fb  =  std : : make_unique < FrameBuffer > ( " ui " ,  0 ,  true ,  & s - > fb_w ,  & s - > fb_h ) ;    s - > fb  =  std : : make_unique < FrameBuffer > ( " ui " ,  0 ,  true ,  & s - > fb_w ,  & s - > fb_h ) ;   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -137,7 +137,7 @@ static void update_sockets(UIState *s) { 
			
		
	
		
		
			
				
					
					  if  ( sm . update ( 0 )  = =  0 )  return ;    if  ( sm . update ( 0 )  = =  0 )  return ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  UIScene  & scene  =  s - > scene ;    UIScene  & scene  =  s - > scene ;   
			
		
	
		
		
			
				
					
					  if  ( s - > started  & &  sm . updated ( " controlsState " ) )  {    if  ( scene .  started  & &  sm . updated ( " controlsState " ) )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    scene . controls_state  =  sm [ " controlsState " ] . getControlsState ( ) ;      scene . controls_state  =  sm [ " controlsState " ] . getControlsState ( ) ;   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  if  ( sm . updated ( " carState " ) )  {    if  ( sm . updated ( " carState " ) )  {   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -180,7 +180,7 @@ static void update_sockets(UIState *s) { 
			
		
	
		
		
			
				
					
					  if  ( sm . updated ( " pandaState " ) )  {    if  ( sm . updated ( " pandaState " ) )  {   
			
		
	
		
		
			
				
					
					    auto  pandaState  =  sm [ " pandaState " ] . getPandaState ( ) ;      auto  pandaState  =  sm [ " pandaState " ] . getPandaState ( ) ;   
			
		
	
		
		
			
				
					
					    scene . pandaType  =  pandaState . getPandaType ( ) ;      scene . pandaType  =  pandaState . getPandaType ( ) ;   
			
		
	
		
		
			
				
					
					    s - > ignition  =  pandaState . getIgnitionLine ( )  | |  pandaState . getIgnitionCan ( ) ;      scene .  ignition  =  pandaState . getIgnitionLine ( )  | |  pandaState . getIgnitionCan ( ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  }  else  if  ( ( s - > sm - > frame  -  s - > sm - > rcv_frame ( " pandaState " ) )  >  5 * UI_FREQ )  {    }  else  if  ( ( s - > sm - > frame  -  s - > sm - > rcv_frame ( " pandaState " ) )  >  5 * UI_FREQ )  {   
			
		
	
		
		
			
				
					
					    scene . pandaType  =  cereal : : PandaState : : PandaType : : UNKNOWN ;      scene . pandaType  =  cereal : : PandaState : : PandaType : : UNKNOWN ;   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -194,14 +194,14 @@ static void update_sockets(UIState *s) { 
			
		
	
		
		
			
				
					
					    scene . gpsOK  =  sm [ " liveLocationKalman " ] . getLiveLocationKalman ( ) . getGpsOK ( ) ;      scene . gpsOK  =  sm [ " liveLocationKalman " ] . getLiveLocationKalman ( ) . getGpsOK ( ) ;   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  if  ( sm . updated ( " carParams " ) )  {    if  ( sm . updated ( " carParams " ) )  {   
			
		
	
		
		
			
				
					
					    s - > longitudinal_control  =  sm [ " carParams " ] . getCarParams ( ) . getOpenpilotLongitudinalControl ( ) ;      scene .  longitudinal_control  =  sm [ " carParams " ] . getCarParams ( ) . getOpenpilotLongitudinalControl ( ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  if  ( sm . updated ( " driverState " ) )  {    if  ( sm . updated ( " driverState " ) )  {   
			
		
	
		
		
			
				
					
					    scene . driver_state  =  sm [ " driverState " ] . getDriverState ( ) ;      scene . driver_state  =  sm [ " driverState " ] . getDriverState ( ) ;   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  if  ( sm . updated ( " driverMonitoringState " ) )  {    if  ( sm . updated ( " driverMonitoringState " ) )  {   
			
		
	
		
		
			
				
					
					    scene . dmonitoring_state  =  sm [ " driverMonitoringState " ] . getDriverMonitoringState ( ) ;      scene . dmonitoring_state  =  sm [ " driverMonitoringState " ] . getDriverMonitoringState ( ) ;   
			
		
	
		
		
			
				
					
					    if ( ! scene . driver_view  & &  ! s - > ignition )  {      if ( ! scene . driver_view  & &  ! scene .  ignition )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      read_param ( & scene . driver_view ,  " IsDriverViewEnabled " ) ;        read_param ( & scene . driver_view ,  " IsDriverViewEnabled " ) ;   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }  else  if  ( ( sm . frame  -  sm . rcv_frame ( " driverMonitoringState " ) )  >  UI_FREQ / 2 )  {    }  else  if  ( ( sm . frame  -  sm . rcv_frame ( " driverMonitoringState " ) )  >  UI_FREQ / 2 )  {   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -210,15 +210,15 @@ static void update_sockets(UIState *s) { 
			
		
	
		
		
			
				
					
					  if  ( sm . updated ( " sensorEvents " ) )  {    if  ( sm . updated ( " sensorEvents " ) )  {   
			
		
	
		
		
			
				
					
					    for  ( auto  sensor  :  sm [ " sensorEvents " ] . getSensorEvents ( ) )  {      for  ( auto  sensor  :  sm [ " sensorEvents " ] . getSensorEvents ( ) )  {   
			
		
	
		
		
			
				
					
					      if  ( sensor . which ( )  = =  cereal : : SensorEventData : : LIGHT )  {        if  ( sensor . which ( )  = =  cereal : : SensorEventData : : LIGHT )  {   
			
		
	
		
		
			
				
					
					        s - > light_sensor  =  sensor . getLight ( ) ;          scene .  light_sensor  =  sensor . getLight ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      }  else  if  ( ! s - > started  & &  sensor . which ( )  = =  cereal : : SensorEventData : : ACCELERATION )  {        }  else  if  ( ! scene .  started  & &  sensor . which ( )  = =  cereal : : SensorEventData : : ACCELERATION )  {   
			
				
				
			
		
	
		
		
			
				
					
					        s - > accel_sensor  =  sensor . getAcceleration ( ) . getV ( ) [ 2 ] ;          scene .  accel_sensor  =  sensor . getAcceleration ( ) . getV ( ) [ 2 ] ;   
			
				
				
			
		
	
		
		
			
				
					
					      }  else  if  ( ! s - > started  & &  sensor . which ( )  = =  cereal : : SensorEventData : : GYRO_UNCALIBRATED )  {        }  else  if  ( ! scene .  started  & &  sensor . which ( )  = =  cereal : : SensorEventData : : GYRO_UNCALIBRATED )  {   
			
				
				
			
		
	
		
		
			
				
					
					        s - > gyro_sensor  =  sensor . getGyroUncalibrated ( ) . getV ( ) [ 1 ] ;          scene .  gyro_sensor  =  sensor . getGyroUncalibrated ( ) . getV ( ) [ 1 ] ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					      }        }   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  s - > started  =  scene . deviceState . getStarted ( )  | |  scene . driver_view ;    scene .  started  =  scene . deviceState . getStarted ( )  | |  scene . driver_view ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  update_alert ( UIState  * s )  { static  void  update_alert ( UIState  * s )  {  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -240,9 +240,9 @@ static void update_alert(UIState *s) { 
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  // Handle controls timeout
    // Handle controls timeout
   
			
		
	
		
		
			
				
					
					  if  ( scene . deviceState . getStarted ( )  & &  ( s - > sm - > frame  -  s - > started_frame )  >  10  *  UI_FREQ )  {    if  ( scene . deviceState . getStarted ( )  & &  ( s - > sm - > frame  -  scene .  started_frame )  >  10  *  UI_FREQ )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    const  uint64_t  cs_frame  =  s - > sm - > rcv_frame ( " controlsState " ) ;      const  uint64_t  cs_frame  =  s - > sm - > rcv_frame ( " controlsState " ) ;   
			
		
	
		
		
			
				
					
					    if  ( cs_frame  <  s - > started_frame )  {      if  ( cs_frame  <  scene .  started_frame )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      // car is started, but controlsState hasn't been seen at all
        // car is started, but controlsState hasn't been seen at all
   
			
		
	
		
		
			
				
					
					      scene . alert_text1  =  " openpilot Unavailable " ;        scene . alert_text1  =  " openpilot Unavailable " ;   
			
		
	
		
		
			
				
					
					      scene . alert_text2  =  " Waiting for controls to start " ;        scene . alert_text2  =  " Waiting for controls to start " ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -264,20 +264,21 @@ static void update_alert(UIState *s) { 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  update_params ( UIState  * s )  { static  void  update_params ( UIState  * s )  {  
			
		
	
		
		
			
				
					
					  const  uint64_t  frame  =  s - > sm - > frame ;    const  uint64_t  frame  =  s - > sm - > frame ;   
			
		
	
		
		
			
				
					
					  UIScene  & scene  =  s - > scene ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  if  ( frame  %  ( 5 * UI_FREQ )  = =  0 )  {    if  ( frame  %  ( 5 * UI_FREQ )  = =  0 )  {   
			
		
	
		
		
			
				
					
					    read_param ( & s - > is_metric ,  " IsMetric " ) ;      read_param ( & scene .  is_metric ,  " IsMetric " ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  }  else  if  ( frame  %  ( 6 * UI_FREQ )  = =  0 )  {    }  else  if  ( frame  %  ( 6 * UI_FREQ )  = =  0 )  {   
			
		
	
		
		
			
				
					
					    s - > s cene. athenaStatus  =  NET_DISCONNECTED ;      scene . athenaStatus  =  NET_DISCONNECTED ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    uint64_t  last_ping  =  0 ;      uint64_t  last_ping  =  0 ;   
			
		
	
		
		
			
				
					
					    if  ( read_param ( & last_ping ,  " LastAthenaPingTime " )  = =  0 )  {      if  ( read_param ( & last_ping ,  " LastAthenaPingTime " )  = =  0 )  {   
			
		
	
		
		
			
				
					
					      s - > s cene. athenaStatus  =  nanos_since_boot ( )  -  last_ping  <  70e9  ?  NET_CONNECTED  :  NET_ERROR ;        scene . athenaStatus  =  nanos_since_boot ( )  -  last_ping  <  70e9  ?  NET_CONNECTED  :  NET_ERROR ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  update_vision ( UIState  * s )  { static  void  update_vision ( UIState  * s )  {  
			
		
	
		
		
			
				
					
					  if  ( ! s - > vipc_client - > connected  & &  s - > started )  {    if  ( ! s - > vipc_client - > connected  & &  s - > scene . s tarted )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    if  ( s - > vipc_client - > connect ( false ) ) {      if  ( s - > vipc_client - > connect ( false ) ) {   
			
		
	
		
		
			
				
					
					      ui_init_vision ( s ) ;        ui_init_vision ( s ) ;   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -296,7 +297,7 @@ static void update_vision(UIState *s) { 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  update_status ( UIState  * s )  { static  void  update_status ( UIState  * s )  {  
			
		
	
		
		
			
				
					
					  if  ( s - > started  & &  s - > sm - > updated ( " controlsState " ) )  {    if  ( s - > scene . s tarted  & &  s - > sm - > updated ( " controlsState " ) )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    auto  alert_status  =  s - > scene . controls_state . getAlertStatus ( ) ;      auto  alert_status  =  s - > scene . controls_state . getAlertStatus ( ) ;   
			
		
	
		
		
			
				
					
					    if  ( alert_status  = =  cereal : : ControlsState : : AlertStatus : : USER_PROMPT )  {      if  ( alert_status  = =  cereal : : ControlsState : : AlertStatus : : USER_PROMPT )  {   
			
		
	
		
		
			
				
					
					      s - > status  =  STATUS_WARNING ;        s - > status  =  STATUS_WARNING ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -309,10 +310,10 @@ static void update_status(UIState *s) { 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  // Handle onroad/offroad transition
    // Handle onroad/offroad transition
   
			
		
	
		
		
			
				
					
					  static  bool  started_prev  =  false ;    static  bool  started_prev  =  false ;   
			
		
	
		
		
			
				
					
					  if  ( s - > started  ! =  started_prev )  {    if  ( s - > scene . s tarted  ! =  started_prev )  {   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( s - > started )  {      if  ( s - > scene . s tarted )  {   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					      s - > status  =  STATUS_DISENGAGED ;        s - > status  =  STATUS_DISENGAGED ;   
			
		
	
		
		
			
				
					
					      s - > started_frame  =  s - > sm - > frame ;        s - > scene . s tarted_frame  =  s - > sm - > frame ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      read_param ( & s - > scene . is_rhd ,  " IsRHD " ) ;        read_param ( & s - > scene . is_rhd ,  " IsRHD " ) ;   
			
		
	
		
		
			
				
					
					      s - > active_app  =  cereal : : UiLayoutState : : App : : NONE ;        s - > active_app  =  cereal : : UiLayoutState : : App : : NONE ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -327,7 +328,7 @@ static void update_status(UIState *s) { 
			
		
	
		
		
			
				
					
					      s - > vipc_client - > connected  =  false ;        s - > vipc_client - > connected  =  false ;   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  started_prev  =  s - > started ;    started_prev  =  s - > scene . s tarted ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  ui_update ( UIState  * s )  { void  ui_update ( UIState  * s )  {