@ -1,3 +1,4 @@ 
			
		
	
		
		
			
				
					
					# include  "ui.hpp"  
			
		
	
		
		
			
				
					
					# include  <stdio.h> # include  <stdio.h>  
			
		
	
		
		
			
				
					
					# include  <stdlib.h> # include  <stdlib.h>  
			
		
	
		
		
			
				
					
					# include  <stdbool.h> # include  <stdbool.h>  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5,9 +6,8 @@ 
			
		
	
		
		
			
				
					
					# include  <assert.h> # include  <assert.h>  
			
		
	
		
		
			
				
					
					# include  <sys/mman.h> # include  <sys/mman.h>  
			
		
	
		
		
			
				
					
					# include  <sys/resource.h> # include  <sys/resource.h>  
			
		
	
		
		
			
				
					
					
 # include  <capnp/serialize.h>  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					# include  <czmq.h> # include  <czmq.h>  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# include  "common/util.h" # include  "common/util.h"  
			
		
	
		
		
			
				
					
					# include  "common/timing.h" # include  "common/timing.h"  
			
		
	
		
		
			
				
					
					# include  "common/swaglog.h" # include  "common/swaglog.h"  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -15,9 +15,6 @@ 
			
		
	
		
		
			
				
					
					# include  "common/visionimg.h" # include  "common/visionimg.h"  
			
		
	
		
		
			
				
					
					# include  "common/params.h" # include  "common/params.h"  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# include  "ui.hpp"  
			
		
	
		
		
			
				
					
					# include  "sound.hpp"  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  int  last_brightness  =  - 1 ; static  int  last_brightness  =  - 1 ;  
			
		
	
		
		
			
				
					
					static  void  set_brightness ( UIState  * s ,  int  brightness )  { static  void  set_brightness ( UIState  * s ,  int  brightness )  {  
			
		
	
		
		
			
				
					
					  if  ( last_brightness  ! =  brightness  & &  ( s - > awake  | |  brightness  = =  0 ) )  {    if  ( last_brightness  ! =  brightness  & &  ( s - > awake  | |  brightness  = =  0 ) )  {   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -69,35 +66,21 @@ static void set_awake(UIState *s, bool awake) { 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  update_offroad_layout_state ( UIState  * s )  { static  void  update_offroad_layout_state ( UIState  * s )  {  
			
		
	
		
		
			
				
					
					  struct  capn  rc ;    capnp : : MallocMessageBuilder  msg ;   
			
				
				
			
		
	
		
		
			
				
					
					  capn_init_malloc ( & rc ) ;    auto  event  =  msg . initRoot < cereal : : Event > ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  struct  capn_segment  * cs  =  capn_root ( & rc ) . seg ;    event . setLogMonoTime ( nanos_since_boot ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
  auto  layout  =  event . initUiLayoutState ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  cereal_UiLayoutState_ptr  layoutp  =  cereal_new_UiLayoutState ( cs ) ;    layout . setActiveApp ( s - > active_app ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  struct  cereal_UiLayoutState  layoutd  =  {    layout . setSidebarCollapsed ( s - > scene . uilayout_sidebarcollapsed ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    . activeApp  =  ( cereal_UiLayoutState_App ) s - > active_app ,    auto  words  =  capnp : : messageToFlatArray ( msg ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    . sidebarCollapsed  =  s - > scene . uilayout_sidebarcollapsed ,    auto  bytes  =  words . asBytes ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  } ;    s - > offroad_sock - > send ( ( char * ) bytes . begin ( ) ,  bytes . size ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  cereal_write_UiLayoutState ( & layoutd ,  layoutp ) ;    LOGD ( " setting active app to %d with sidebar %d " ,  ( int ) s - > active_app ,  s - > scene . uilayout_sidebarcollapsed ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  LOGD ( " setting active app to %d with sidebar %d " ,  layoutd . activeApp ,  layoutd . sidebarCollapsed ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  cereal_Event_ptr  eventp  =  cereal_new_Event ( cs ) ;   
			
		
	
		
		
			
				
					
					  struct  cereal_Event  event  =  {   
			
		
	
		
		
			
				
					
					    . logMonoTime  =  nanos_since_boot ( ) ,   
			
		
	
		
		
			
				
					
					    . which  =  cereal_Event_uiLayoutState ,   
			
		
	
		
		
			
				
					
					    . uiLayoutState  =  layoutp ,   
			
		
	
		
		
			
				
					
					  } ;   
			
		
	
		
		
			
				
					
					  cereal_write_Event ( & event ,  eventp ) ;   
			
		
	
		
		
			
				
					
					  capn_setp ( capn_root ( & rc ) ,  0 ,  eventp . p ) ;   
			
		
	
		
		
			
				
					
					  uint8_t  buf [ 4096 ] ;   
			
		
	
		
		
			
				
					
					  ssize_t  rs  =  capn_write_mem ( & rc ,  buf ,  sizeof ( buf ) ,  0 ) ;   
			
		
	
		
		
			
				
					
					  s - > offroad_sock - > send ( ( char * ) buf ,  rs ) ;   
			
		
	
		
		
			
				
					
					  capn_free ( & rc ) ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  navigate_to_settings ( UIState  * s )  { static  void  navigate_to_settings ( UIState  * s )  {  
			
		
	
		
		
			
				
					
					# ifdef QCOM # ifdef QCOM  
			
		
	
		
		
			
				
					
					  s - > active_app  =  cereal_UiLayoutState_App_settings  ;    s - > active_app  =  cereal : : UiLayoutState : : App : : SETTINGS ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  update_offroad_layout_state ( s ) ;    update_offroad_layout_state ( s ) ;   
			
		
	
		
		
			
				
					
					# else # else  
			
		
	
		
		
			
				
					
					  // computer UI doesn't have offroad settings
    // computer UI doesn't have offroad settings
   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -107,9 +90,9 @@ static void navigate_to_settings(UIState *s) { 
			
		
	
		
		
			
				
					
					static  void  navigate_to_home ( UIState  * s )  { static  void  navigate_to_home ( UIState  * s )  {  
			
		
	
		
		
			
				
					
					# ifdef QCOM # ifdef QCOM  
			
		
	
		
		
			
				
					
					  if  ( s - > started )  {    if  ( s - > started )  {   
			
		
	
		
		
			
				
					
					    s - > active_app  =  cereal_UiLayoutState_App_none  ;      s - > active_app  =  cereal : : UiLayoutState : : App : : NONE ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  }  else  {    }  else  {   
			
		
	
		
		
			
				
					
					    s - > active_app  =  cereal_UiLayoutState_App_home  ;      s - > active_app  =  cereal : : UiLayoutState : : App : : HOME ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					  update_offroad_layout_state ( s ) ;    update_offroad_layout_state ( s ) ;   
			
		
	
		
		
			
				
					
					# else # else  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -140,7 +123,7 @@ static void handle_driver_view_touch(UIState *s, int touch_x, int touch_y) { 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  handle_vision_touch ( UIState  * s ,  int  touch_x ,  int  touch_y )  { static  void  handle_vision_touch ( UIState  * s ,  int  touch_x ,  int  touch_y )  {  
			
		
	
		
		
			
				
					
					  if  ( s - > started  & &  ( touch_x  > =  s - > scene . ui_viz_rx  -  bdr_s )    if  ( s - > started  & &  ( touch_x  > =  s - > scene . ui_viz_rx  -  bdr_s )   
			
		
	
		
		
			
				
					
					    & &  ( s - > active_app  ! =  cereal_UiLayoutState_App_settings  ) )  {      & &  ( s - > active_app  ! =  cereal : : UiLayoutState : : App : : SETTINGS ) )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    if  ( ! s - > scene . frontview )  {      if  ( ! s - > scene . frontview )  {   
			
		
	
		
		
			
				
					
					      s - > scene . uilayout_sidebarcollapsed  =  ! s - > scene . uilayout_sidebarcollapsed ;        s - > scene . uilayout_sidebarcollapsed  =  ! s - > scene . uilayout_sidebarcollapsed ;   
			
		
	
		
		
			
				
					
					    }  else  {      }  else  {   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -339,19 +322,15 @@ static void ui_init_vision(UIState *s, const VisionStreamBufs back_bufs, 
			
		
	
		
		
			
				
					
					  s - > limit_set_speed_timeout  =  UI_FREQ ;    s - > limit_set_speed_timeout  =  UI_FREQ ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  PathData  read_path ( cereal_ModelData_PathData_pt r  pathp )  { static  PathData  read_path ( cereal : : ModelData : : PathData : : Reade rpathp )  {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  PathData  ret  =  { 0 } ;    PathData  ret  =  { 0 } ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  struct  cereal_ModelData_PathData  pathd ;    ret . prob  =  pathp . getProb ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  cereal_read_ModelData_PathData ( & pathd ,  pathp ) ;    ret . std  =  pathp . getStd ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  ret . prob  =  pathd . prob ;   
			
		
	
		
		
			
				
					
					  ret . std  =  pathd . std ;   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  capn_list32  polyp  =  pathd . poly ;    auto  polyp  =  pathp . getPoly ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  capn_resolve ( & polyp . p ) ;   
			
		
	
		
		
	
		
		
			
				
					
					  for  ( int  i  =  0 ;  i  <  POLYFIT_DEGREE ;  i + + )  {    for  ( int  i  =  0 ;  i  <  POLYFIT_DEGREE ;  i + + )  {   
			
		
	
		
		
			
				
					
					    ret . poly [ i ]  =  capn_to_f32 ( capn_get32 ( polyp ,  i ) ) ;      ret . poly [ i ]  =  polyp [ i ] ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  // Compute points locations
    // Compute points locations
   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -362,20 +341,16 @@ static PathData read_path(cereal_ModelData_PathData_ptr pathp) { 
			
		
	
		
		
			
				
					
					  return  ret ;    return  ret ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  ModelData  read_model ( cereal_ModelData_ptr  modelp )  { static  ModelData  read_model ( cereal : : ModelData : : Reader  model )  {  
			
				
				
			
		
	
		
		
			
				
					
					  struct  cereal_ModelData  modeld ;   
			
		
	
		
		
			
				
					
					  cereal_read_ModelData ( & modeld ,  modelp ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
	
		
		
			
				
					
					  ModelData  d  =  { 0 } ;    ModelData  d  =  { 0 } ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  d . path  =  read_path ( modeld . path  ) ;    d . path  =  read_path ( model . getPath ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  d . left_lane  =  read_path ( modeld . leftLane  ) ;    d . left_lane  =  read_path ( model . getLeftLane ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  d . right_lane  =  read_path ( modeld . rightLane  ) ;    d . right_lane  =  read_path ( model . getRightLane ( ) ) ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  struct  cereal_ModelData_LeadData  leadd ;    auto  leadd  =  model . getLead ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  cereal_read_ModelData_LeadData ( & leadd ,  modeld . lead ) ;   
			
		
	
		
		
	
		
		
			
				
					
					  d . lead  =  ( LeadData ) {    d . lead  =  ( LeadData ) {   
			
		
	
		
		
			
				
					
					      . dist  =  leadd . dist ,  . prob  =  leadd . prob ,  . std  =  leadd . std ,        . dist  =  leadd . getDist ( ) ,  . prob  =  leadd . getProb ( ) ,  . std  =  leadd . getStd ( ) ,   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  } ;    } ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  return  d ;    return  d ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -387,207 +362,150 @@ static void update_status(UIState *s, int status) { 
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
void  handle_message ( UIState  * s ,   Message *  msg )  {  
			
				
				
			
		
	
		
		
			
				
					
					void  handle_message ( UIState  * s ,  Message  *  msg )  {   auto  amsg  =  kj : : heapArray < capnp : : word > ( ( msg - > getSize ( )  /  sizeof ( capnp : : word ) )  +  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  struct  capn  ctx ;    memcpy ( amsg . begin ( ) ,  msg - > getData ( ) ,  msg - > getSize ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  capn_init_mem ( & ctx ,  ( uint8_t * ) msg - > getData ( ) ,  msg - > getSize ( ) ,  0 ) ;    capnp : : FlatArrayMessageReader  cmsg ( amsg ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
  cereal : : Event : : Reader  event  =  cmsg . getRoot < cereal : : Event > ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  cereal_Event_ptr  eventp ;    
  
			
				
				
			
		
	
		
		
			
				
					
					  eventp . p  =  capn_getp ( capn_root ( & ctx ) ,  0 ,  1 ) ;    auto  which  =  event . which ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  struct  cereal_Event  eventd ;    UIScene  & scene  =  s - > scene ;   
			
				
				
			
		
	
		
		
			
				
					
					  cereal_read_Event ( & eventd ,  eventp ) ;    if  ( which  = =  cereal : : Event : : CONTROLS_STATE  & &  s - > started )  {   
			
				
				
			
		
	
		
		
			
				
					
					
    auto  data  =  event . getControlsState ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  if  ( eventd . which  = =  cereal_Event_controlsState  & &  s - > started )  {   
			
		
	
		
		
			
				
					
					    struct  cereal_ControlsState  datad ;   
			
		
	
		
		
			
				
					
					    cereal_read_ControlsState ( & datad ,  eventd . controlsState ) ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > controls_timeout  =  1  *  UI_FREQ ;      s - > controls_timeout  =  1  *  UI_FREQ ;   
			
		
	
		
		
			
				
					
					    s - > scene . frontview  =  datad . rearViewCam ;      scene . frontview  =  data . getRearViewCam ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( ! s - > s cene. frontview ) { s - > controls_seen  =  true ; }      if  ( ! scene . frontview ) {   s - > controls_seen  =  true ;   }   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    if  ( datad . vCruise  ! =  s - >  scene . v_cruise )  {      if  ( data . getVCruise ( )  ! =  scene . v_cruise )  {   
			
				
				
			
		
	
		
		
			
				
					
					      s - > scene . v_cruise_update_ts  =  eventd . logMonoTime ;        scene . v_cruise_update_ts  =  event . getLogMonoTime ( )  ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					    s - > scene . v_cruise  =  datad . vCruise ;      scene . v_cruise  =  data . getVCruise ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . v_ego  =  datad . vEgo ;      scene . v_ego  =  data . getVEgo ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . curvature  =  datad . curvature ;      scene . curvature  =  data . getCurvature ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . engaged  =  datad . enabled ;      scene . engaged  =  data . getEnabled ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . engageable  =  datad . engageable ;      scene . engageable  =  data . getEngageable ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . gps_planner_active  =  datad . gpsPlannerActive ;      scene . gps_planner_active  =  data . getGpsPlannerActive ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . monitoring_active  =  datad . driverMonitoringOn ;      scene . monitoring_active  =  data . getDriverMonitoringOn ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . decel_for_model  =  datad . decelForModel ;      scene . decel_for_model  =  data . getDecelForModel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
    auto  alert_sound  =  data . getAlertSound ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( datad . alertSound  ! =  cereal_CarControl_HUDControl_AudibleAlert_none  & &  datad . alertSound  ! =  s - > alert_sound )  {      const  auto  sound_none  =  cereal : : CarControl : : HUDControl : : AudibleAlert : : NONE ;   
			
				
				
			
		
	
		
		
			
				
					
					      if  ( s - > alert_sound  ! =  cereal_CarControl_HUDControl_AudibleAlert_none )  {      if  ( alert_sound  ! =  s - > alert_sound ) {   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					      if  ( s - > alert_sound  ! =  sound_none ) {   
			
		
	
		
		
			
				
					
					        stop_alert_sound ( s - > alert_sound ) ;          stop_alert_sound ( s - > alert_sound ) ;   
			
		
	
		
		
			
				
					
					      }        }   
			
		
	
		
		
			
				
					
					      play_alert_sound ( datad . alertSound ) ;        if  ( alert_sound  ! =  sound_none ) {   
			
				
				
			
		
	
		
		
			
				
					
					
        play_alert_sound ( alert_sound ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      s - > alert_sound  =  datad . alertSound ;          s - > alert_type  =  data . getAlertType ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      snprintf ( s - > alert_type ,  sizeof ( s - > alert_type ) ,  " %s " ,  datad . alertType . str ) ;        }   
			
				
				
			
		
	
		
		
			
				
					
					    }  else  if  ( ( ! datad . alertSound  | |  datad . alertSound  = =  cereal_CarControl_HUDControl_AudibleAlert_none )        s - > alert_sound  =  alert_sound ;   
			
				
				
			
		
	
		
		
			
				
					
					                  & &  s - > alert_sound  ! =  cereal_CarControl_HUDControl_AudibleAlert_none )  {   
			
		
	
		
		
			
				
					
					      stop_alert_sound ( s - > alert_sound ) ;   
			
		
	
		
		
			
				
					
					      s - > alert_type [ 0 ]  =  ' \0 ' ;   
			
		
	
		
		
			
				
					
					      s - > alert_sound  =  cereal_CarControl_HUDControl_AudibleAlert_none ;   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    if  ( datad . alertText1 . str )  {   
			
		
	
		
		
			
				
					
					      snprintf ( s - > scene . alert_text1 ,  sizeof ( s - > scene . alert_text1 ) ,  " %s " ,  datad . alertText1 . str ) ;   
			
		
	
		
		
			
				
					
					    }  else  {   
			
		
	
		
		
			
				
					
					      s - > scene . alert_text1 [ 0 ]  =  ' \0 ' ;   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
			
				
					
					    if  ( datad . alertText2 . str )  {   
			
		
	
		
		
			
				
					
					      snprintf ( s - > scene . alert_text2 ,  sizeof ( s - > scene . alert_text2 ) ,  " %s " ,  datad . alertText2 . str ) ;   
			
		
	
		
		
			
				
					
					    }  else  {   
			
		
	
		
		
			
				
					
					      s - > scene . alert_text2 [ 0 ]  =  ' \0 ' ;   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > scene . alert_ts  =  eventd . logMonoTime ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > scene . alert_size  =  datad . alertSize ;   
			
		
	
		
		
			
				
					
					    if  ( datad . alertSize  = =  cereal_ControlsState_AlertSize_none )  {   
			
		
	
		
		
			
				
					
					      s - > alert_size  =  ALERTSIZE_NONE ;   
			
		
	
		
		
			
				
					
					    }  else  if  ( datad . alertSize  = =  cereal_ControlsState_AlertSize_small )  {   
			
		
	
		
		
			
				
					
					      s - > alert_size  =  ALERTSIZE_SMALL ;   
			
		
	
		
		
			
				
					
					    }  else  if  ( datad . alertSize  = =  cereal_ControlsState_AlertSize_mid )  {   
			
		
	
		
		
			
				
					
					      s - > alert_size  =  ALERTSIZE_MID ;   
			
		
	
		
		
			
				
					
					    }  else  if  ( datad . alertSize  = =  cereal_ControlsState_AlertSize_full )  {   
			
		
	
		
		
			
				
					
					      s - > alert_size  =  ALERTSIZE_FULL ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					
    scene . alert_text1  =  data . getAlertText1 ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( datad . alertStatus  = =  cereal_ControlsState_AlertStatus_userPrompt )  {      scene . alert_text2  =  data . getAlertText2 ( ) ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    scene . alert_ts  =  event . getLogMonoTime ( ) ;   
			
		
	
		
		
			
				
					
					    scene . alert_size  =  data . getAlertSize ( ) ;   
			
		
	
		
		
			
				
					
					    auto  alertStatus  =  data . getAlertStatus ( ) ;   
			
		
	
		
		
			
				
					
					    if  ( alertStatus  = =  cereal : : ControlsState : : AlertStatus : : USER_PROMPT )  {   
			
		
	
		
		
			
				
					
					      update_status ( s ,  STATUS_WARNING ) ;        update_status ( s ,  STATUS_WARNING ) ;   
			
		
	
		
		
			
				
					
					    }  else  if  ( datad . alertStatus  = =  cereal_ControlsState_AlertStatus_critical )  {      }  else  if  ( alertStatus  = =  cereal : : ControlsState : : AlertStatus : : CRITICAL )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      update_status ( s ,  STATUS_ALERT ) ;        update_status ( s ,  STATUS_ALERT ) ;   
			
		
	
		
		
			
				
					
					    }  else  if  ( datad . enabled )  {      }  else {   
			
				
				
			
		
	
		
		
			
				
					
					      update_status ( s ,  STATUS_ENGAGED ) ;        update_status ( s ,  scene . engaged  ?  STATUS_ENGAGED  :  STATUS_DISENGAGED ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    }  else  {   
			
		
	
		
		
			
				
					
					      update_status ( s ,  STATUS_DISENGAGED ) ;   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > scene . alert_blinkingrate  =  datad . alertBlinkingRate ;      scene . alert_blinkingrate  =  data . getAlertBlinkingRate ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( datad . alertBlinkingR ate>  0. )  {      if  ( scene . alert_blinkingrate  >  0. )  {   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					      if  ( s - > alert_blinked )  {        if  ( s - > alert_blinked )  {   
			
		
	
		
		
			
				
					
					        if  ( s - > alert_blinking_alpha  >  0.0  & &  s - > alert_blinking_alpha  <  1.0 )  {          if  ( s - > alert_blinking_alpha  >  0.0  & &  s - > alert_blinking_alpha  <  1.0 )  {   
			
		
	
		
		
			
				
					
					          s - > alert_blinking_alpha  + =  ( 0.05 * datad . alertBlinkingR ate) ;            s - > alert_blinking_alpha  + =  ( 0.05 * scene . alert_blinkingrate ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        }  else  {          }  else  {   
			
		
	
		
		
			
				
					
					          s - > alert_blinked  =  false ;            s - > alert_blinked  =  false ;   
			
		
	
		
		
			
				
					
					        }          }   
			
		
	
		
		
			
				
					
					      }  else  {        }  else  {   
			
		
	
		
		
			
				
					
					        if  ( s - > alert_blinking_alpha  >  0.25 )  {          if  ( s - > alert_blinking_alpha  >  0.25 )  {   
			
		
	
		
		
			
				
					
					          s - > alert_blinking_alpha  - =  ( 0.05 * datad . alertBlinkingR ate) ;            s - > alert_blinking_alpha  - =  ( 0.05 * scene . alert_blinkingrate ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        }  else  {          }  else  {   
			
		
	
		
		
			
				
					
					          s - > alert_blinking_alpha  + =  0.25 ;            s - > alert_blinking_alpha  + =  0.25 ;   
			
		
	
		
		
			
				
					
					          s - > alert_blinked  =  true ;            s - > alert_blinked  =  true ;   
			
		
	
		
		
			
				
					
					        }          }   
			
		
	
		
		
			
				
					
					      }        }   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_radarState )  {    }  else  if  ( which  = =  cereal : : Event : : RADAR_STATE )  {   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_RadarState  datad ;      auto  data  =  event . getRadarState ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_RadarState ( & datad ,  eventd . radarState ) ;      
  
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_RadarState_LeadData  leaddatad ;      auto  leaddatad  =  data . getLeadOne ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_RadarState_LeadData ( & leaddatad ,  datad . leadOne ) ;      scene . lead_status  =  leaddatad . getStatus ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_status  =  leaddatad . status ;      scene . lead_d_rel  =  leaddatad . getDRel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_d_rel  =  leaddatad . dRel ;      scene . lead_y_rel  =  leaddatad . getYRel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_y_rel  =  leaddatad . yRel ;      scene . lead_v_rel  =  leaddatad . getVRel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_v_rel  =  leaddatad . vRel ;      auto  leaddatad2  =  data . getLeadTwo ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_RadarState_LeadData ( & leaddatad ,  datad . leadTwo ) ;      scene . lead_status2  =  leaddatad2 . getStatus ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_status2  =  leaddatad . status ;      scene . lead_d_rel2  =  leaddatad2 . getDRel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_d_rel2  =  leaddatad . dRel ;      scene . lead_y_rel2  =  leaddatad2 . getYRel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_y_rel2  =  leaddatad . yRel ;      scene . lead_v_rel2  =  leaddatad2 . getVRel ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . lead_v_rel2  =  leaddatad . vRel ;   
			
		
	
		
		
			
				
					
					    s - > livempc_or_radarstate_changed  =  true ;   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_liveCalibration )  {   
			
		
	
		
		
			
				
					
					    s - > scene . world_objects_visible  =  true ;   
			
		
	
		
		
			
				
					
					    struct  cereal_LiveCalibrationData  datad ;   
			
		
	
		
		
			
				
					
					    cereal_read_LiveCalibrationData ( & datad ,  eventd . liveCalibration ) ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    capn_list32  extrinsicl  =  datad . extrinsicMatrix ;      s - > livempc_or_radarstate_changed  =  true ;   
			
				
				
			
		
	
		
		
			
				
					
					    capn_resolve ( & extrinsicl . p ) ;   // is this a bug?
    }  else  if  ( which  = =  cereal : : Event : : LIVE_CALIBRATION )  {   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    scene . world_objects_visible  =  true ;   
			
		
	
		
		
			
				
					
					    auto  extrinsicl  =  event . getLiveCalibration ( ) . getExtrinsicMatrix ( ) ;   
			
		
	
		
		
			
				
					
					    for  ( int  i  =  0 ;  i  <  3  *  4 ;  i + + )  {      for  ( int  i  =  0 ;  i  <  3  *  4 ;  i + + )  {   
			
		
	
		
		
			
				
					
					      s - > scene . extrinsic_matrix . v [ i ]  =        scene . extrinsic_matrix . v [ i ]  =  extrinsicl [ i ] ;   
			
				
				
			
		
	
		
		
			
				
					
					          capn_to_f32 ( capn_get32 ( extrinsicl ,  i ) ) ;   
			
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_model )  {    }  else  if  ( which  = =  cereal : : Event : : MODEL )  {   
			
				
				
			
		
	
		
		
			
				
					
					    s - > s cene. model  =  read_model ( eventd . model  ) ;      scene . model  =  read_model ( event . getModel ( ) ) ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    s - > model_changed  =  true ;      s - > model_changed  =  true ;   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_liveMpc )  {    }  else  if  ( which  = =  cereal : : Event : : LIVE_MPC )  {   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_LiveMpcData  datad ;      auto  data  =  event . getLiveMpc ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_LiveMpcData ( & datad ,  eventd . liveMpc ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    capn_list32  x_list  =  datad . x ;   
			
		
	
		
		
			
				
					
					    capn_resolve ( & x_list . p ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    for  ( int  i  =  0 ;  i  <  50 ;  i + + ) {   
			
		
	
		
		
			
				
					
					      s - > scene . mpc_x [ i ]  =  capn_to_f32 ( capn_get32 ( x_list ,  i ) ) ;   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    capn_list32  y_list  =  datad . y ;   
			
		
	
		
		
			
				
					
					    capn_resolve ( & y_list . p ) ;   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    auto  x_list  =  data . getX ( ) ;   
			
		
	
		
		
			
				
					
					    auto  y_list  =  data . getY ( ) ;   
			
		
	
		
		
			
				
					
					    for  ( int  i  =  0 ;  i  <  50 ;  i + + ) {      for  ( int  i  =  0 ;  i  <  50 ;  i + + ) {   
			
		
	
		
		
			
				
					
					      s - > scene . mpc_y [ i ]  =  capn_to_f32 ( capn_get32 ( y_list ,  i ) ) ;        scene . mpc_x [ i ]  =  x_list [ i ] ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      scene . mpc_y [ i ]  =  y_list [ i ] ;   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					    s - > livempc_or_radarstate_changed  =  true ;      s - > livempc_or_radarstate_changed  =  true ;   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_uiLayoutState )  {    }  else  if  ( which  = =  cereal : : Event : : UI_LAYOUT_STATE )  {   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_UiLayoutState  datad ;      auto  data  =  event . getUiLayoutState ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_UiLayoutState ( & datad ,  eventd . uiLayoutState ) ;  
 
			
				
				
			
		
	
		
		
			
				
					
					    s - > active_app  =  datad . activeApp  ;      s - > active_app  =  data . getActiveApp ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . uilayout_sidebarcollapsed  =  datad . sidebarCollapsed ;      scene . uilayout_sidebarcollapsed  =  data . getSidebarCollapsed ( )  ;   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( datad . mockEngaged  ! =  s - >  scene . uilayout_mockengaged )  {      if  ( data . getMockEngaged ( )  ! =  scene . uilayout_mockengaged )  {   
			
				
				
			
		
	
		
		
			
				
					
					      s - > scene . uilayout_mockengaged  =  datad . mockEngaged ;        scene . uilayout_mockengaged  =  data . getMockEngaged ( )  ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_liveMapData )  {    }  else  if  ( which  = =  cereal : : Event : : LIVE_MAP_DATA )  {   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_LiveMapData  datad ;      scene . map_valid  =  event . getLiveMapData ( ) . getMapValid ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_LiveMapData ( & datad ,  eventd . liveMapData ) ;    }  else  if  ( which  = =  cereal : : Event : : THERMAL )  {   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . map_valid  =  datad . mapValid ;      auto  data  =  event . getThermal ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_thermal )  {      
  
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_ThermalData  datad ;      scene . networkType  =  data . getNetworkType ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_ThermalData ( & datad ,  eventd . thermal ) ;      scene . networkStrength  =  data . getNetworkStrength ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
    scene . batteryPercent  =  data . getBatteryPercent ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . networkType  =  datad . networkType ;      scene . batteryCharging  =  data . getBatteryStatus ( )  = =  " Charging " ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . networkStrength  =  datad . networkStrength ;      scene . freeSpace  =  data . getFreeSpace ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . batteryPercent  =  datad . batteryPercent ;      scene . thermalStatus  =  data . getThermalStatus ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    snprintf ( s - > scene . batteryStatus ,  sizeof ( s - > scene . batteryStatus ) ,  " %s " ,  datad . batteryStatus . str ) ;      scene . paTemp  =  data . getPa0 ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . freeSpace  =  datad . freeSpace ;      
  
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . thermalStatus  =  datad . thermalStatus ;      s - > thermal_started  =  data . getStarted ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . paTemp  =  datad . pa0 ;    }  else  if  ( which  = =  cereal : : Event : : UBLOX_GNSS )  {   
			
				
				
			
		
	
		
		
			
				
					
					
    auto  data  =  event . getUbloxGnss ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > thermal_started  =  datad . started ;      if  ( data . which ( )  = =  cereal : : UbloxGnss : : MEASUREMENT_REPORT )  {   
			
				
				
			
		
	
		
		
			
				
					
					
      scene . satelliteCount  =  data . getMeasurementReport ( ) . getNumMeas ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_ubloxGnss )  {   
			
		
	
		
		
			
				
					
					    struct  cereal_UbloxGnss  datad ;   
			
		
	
		
		
			
				
					
					    cereal_read_UbloxGnss ( & datad ,  eventd . ubloxGnss ) ;   
			
		
	
		
		
			
				
					
					    if  ( datad . which  = =  cereal_UbloxGnss_measurementReport )  {   
			
		
	
		
		
			
				
					
					      struct  cereal_UbloxGnss_MeasurementReport  reportdatad ;   
			
		
	
		
		
			
				
					
					      cereal_read_UbloxGnss_MeasurementReport ( & reportdatad ,  datad . measurementReport ) ;   
			
		
	
		
		
			
				
					
					      s - > scene . satelliteCount  =  reportdatad . numMeas ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_health )  {    }  else  if  ( which  = =  cereal : : Event : : HEALTH )  {   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_HealthData  datad ;      scene . hwType  =  event . getHealth ( ) . getHwType ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_HealthData ( & datad ,  eventd . health ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > scene . hwType  =  datad . hwType ;   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    s - > hardware_timeout  =  5 * 30 ;  // 5 seconds at 30 fps
      s - > hardware_timeout  =  5 * 30 ;  // 5 seconds at 30 fps
   
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_driverState )  {    }  else  if  ( which  = =  cereal : : Event : : DRIVER_STATE )  {   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_DriverState  datad ;      auto  data  =  event . getDriverState ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    cereal_read_DriverState ( & datad ,  eventd . driverState ) ;      scene . face_prob  =  data . getFaceProb ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
    auto  fxy_list  =  data . getFacePosition ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . face_prob  =  datad . faceProb ;      scene . face_x  =  fxy_list [ 0 ] ;   
			
				
				
			
		
	
		
		
			
				
					
					
    scene . face_y  =  fxy_list [ 1 ] ;   
			
				
				
			
		
	
		
		
			
				
					
					    capn_list32  fxy_list  =  datad . facePosition ;    }  else  if  ( which  = =  cereal : : Event : : D_MONITORING_STATE )  {   
			
				
				
			
		
	
		
		
			
				
					
					    capn_resolve ( & fxy_list . p ) ;      auto  data  =  event . getDMonitoringState ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . face_x  =  capn_to_f32 ( capn_get32 ( fxy_list ,  0 ) ) ;      scene . is_rhd  =  data . getIsRHD ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    s - > scene . face_y  =  capn_to_f32 ( capn_get32 ( fxy_list ,  1 ) ) ;      scene . awareness_status  =  data . getAwarenessStatus ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  }  else  if  ( eventd . which  = =  cereal_Event_dMonitoringState )  {      s - > preview_started  =  data . getIsPreview ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    struct  cereal_DMonitoringState  datad ;   
			
		
	
		
		
			
				
					
					    cereal_read_DMonitoringState ( & datad ,  eventd . dMonitoringState ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > scene . is_rhd  =  datad . isRHD ;   
			
		
	
		
		
			
				
					
					    s - > scene . awareness_status  =  datad . awarenessStatus ;   
			
		
	
		
		
			
				
					
					    s - > preview_started  =  datad . isPreview ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  s - > started  =  s - > thermal_started  | |  s - > preview_started  ;    s - > started  =  s - > thermal_started  | |  s - > preview_started  ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -598,17 +516,15 @@ void handle_message(UIState *s, Message * msg) { 
			
		
	
		
		
			
				
					
					      s - > alert_sound_timeout  =  0 ;        s - > alert_sound_timeout  =  0 ;   
			
		
	
		
		
			
				
					
					      s - > vision_seen  =  false ;        s - > vision_seen  =  false ;   
			
		
	
		
		
			
				
					
					      s - > controls_seen  =  false ;        s - > controls_seen  =  false ;   
			
		
	
		
		
			
				
					
					      s - > active_app  =  cereal_UiLayoutState_App_home  ;        s - > active_app  =  cereal : : UiLayoutState : : App : : HOME ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      update_offroad_layout_state ( s ) ;        update_offroad_layout_state ( s ) ;   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }  else  if  ( s - > status  = =  STATUS_STOPPED )  {    }  else  if  ( s - > status  = =  STATUS_STOPPED )  {   
			
		
	
		
		
			
				
					
					    update_status ( s ,  STATUS_DISENGAGED ) ;      update_status ( s ,  STATUS_DISENGAGED ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    s - > active_app  =  cereal_UiLayoutState_App_none  ;      s - > active_app  =  cereal : : UiLayoutState : : App : : NONE ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    update_offroad_layout_state ( s ) ;      update_offroad_layout_state ( s ) ;   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  capn_free ( & ctx ) ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  void  check_messages ( UIState  * s )  { static  void  check_messages ( UIState  * s )  {  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -619,12 +535,11 @@ static void check_messages(UIState *s) { 
			
		
	
		
		
			
				
					
					      break ;        break ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    for  ( auto  sock  :  polls ) {      for  ( auto  sock  :  polls ) {   
			
		
	
		
		
			
				
					
					      Message  *  msg  =  sock - > receive ( ) ;        Message  * msg  =  sock - > receive ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      if  ( msg  = =  NULL )  continue ;        if  ( msg )  {   
			
				
				
			
		
	
		
		
			
				
					
					
        handle_message ( s ,  msg ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      handle_message ( s ,  msg ) ;          delete  msg ;   
			
				
				
			
		
	
		
		
			
				
					
					
      }   
			
				
				
			
		
	
		
		
			
				
					
					      delete  msg ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					} }  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -938,8 +853,6 @@ int is_leon() { 
			
		
	
		
		
			
				
					
					  return  strstr ( str ,  " letv " )  ! =  NULL ;    return  strstr ( str ,  " letv " )  ! =  NULL ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					int  main ( int  argc ,  char *  argv [ ] )  { int  main ( int  argc ,  char *  argv [ ] )  {  
			
		
	
		
		
			
				
					
					  int  err ;    int  err ;   
			
		
	
		
		
			
				
					
					  setpriority ( PRIO_PROCESS ,  0 ,  - 14 ) ;    setpriority ( PRIO_PROCESS ,  0 ,  - 14 ) ;   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1054,7 +967,7 @@ int main(int argc, char* argv[]) { 
			
		
	
		
		
			
				
					
					    if  ( s - > hardware_timeout  >  0 )  {      if  ( s - > hardware_timeout  >  0 )  {   
			
		
	
		
		
			
				
					
					      s - > hardware_timeout - - ;        s - > hardware_timeout - - ;   
			
		
	
		
		
			
				
					
					    }  else  {      }  else  {   
			
		
	
		
		
			
				
					
					      s - > scene . hwType  =  cereal_HealthData_HwType_unknown  ;        s - > scene . hwType  =  cereal : : HealthData : : HwType : : UNKNOWN ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    // Don't waste resources on drawing in case screen is off
      // Don't waste resources on drawing in case screen is off
   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -1076,17 +989,18 @@ int main(int argc, char* argv[]) { 
			
		
	
		
		
			
				
					
					    if  ( s - > controls_timeout  >  0 )  {      if  ( s - > controls_timeout  >  0 )  {   
			
		
	
		
		
			
				
					
					      s - > controls_timeout - - ;        s - > controls_timeout - - ;   
			
		
	
		
		
			
				
					
					    }  else  {      }  else  {   
			
		
	
		
		
			
				
					
					      if  ( s - > started  & &  s - > controls_seen  & &  strcmp ( s  - > scene . alert_text2 , " Controls Unresponsive " )  ! =  0 )  {        if  ( s - > started  & &  s - > controls_seen  & &  s - > scene . alert_text2  ! =   " Controls Unresponsive " )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        LOGE ( " Controls unresponsive " ) ;          LOGE ( " Controls unresponsive " ) ;   
			
		
	
		
		
			
				
					
					        s - > scene . alert_size  =  ALERTSIZE_ FULL;          s - > scene . alert_size  =  cereal : : ControlsState : : AlertSize : : FULL ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        update_status ( s ,  STATUS_ALERT ) ;          update_status ( s ,  STATUS_ALERT ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					        snprintf ( s - > scene . alert_text1 ,  sizeof ( s - > scene . alert_text1 ) ,  " %s " ,  " TAKE CONTROL IMMEDIATELY " ) ;          s - > scene . alert_text1  =  " TAKE CONTROL IMMEDIATELY " ;   
			
				
				
			
		
	
		
		
			
				
					
					        snprintf ( s - > scene . alert_text2 ,  sizeof ( s - > scene . alert_text2 ) ,  " %s " ,  " Controls Unresponsive " ) ;          s - > scene . alert_text2  =  " Controls Unresponsive " ;   
			
				
				
			
		
	
		
		
			
				
					
					        ui_draw_vision_alert ( s ,  s - > scene . alert_size ,  s - > status ,  s - > scene . alert_text1 ,  s - > scene . alert_text2 ) ;  
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					        ui_draw_vision_alert ( s ,  s - > scene . alert_size ,  s - > status ,  s - > scene . alert_text1 . c_str ( ) ,  s - > scene . alert_text2 . c_str ( ) ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					        s - > alert_sound_timeout  =  2  *  UI_FREQ ;          s - > alert_sound_timeout  =  2  *  UI_FREQ ;   
			
		
	
		
		
			
				
					
					        s - > alert_sound  =  cereal_CarControl_HUDControl_AudibleAlert_chimeWarningRepeat  ;          s - > alert_sound  =  cereal : : CarControl : : HUDControl : : AudibleAlert : : CHIME_WARNING_REPEAT ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        play_alert_sound ( s - > alert_sound ) ;          play_alert_sound ( s - > alert_sound ) ;   
			
		
	
		
		
			
				
					
					      }        }   
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -1096,9 +1010,9 @@ int main(int argc, char* argv[]) { 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    // stop playing alert sound
      // stop playing alert sound
   
			
		
	
		
		
			
				
					
					    if  ( ( ! s - > started  | |  ( s - > started  & &  s - > alert_sound_timeout  = =  0 ) )  & &      if  ( ( ! s - > started  | |  ( s - > started  & &  s - > alert_sound_timeout  = =  0 ) )  & &   
			
		
	
		
		
			
				
					
					        s - > alert_sound  ! =  cereal_CarControl_HUDControl_AudibleAlert_none  )  {          s - > alert_sound  ! =  cereal : : CarControl : : HUDControl : : AudibleAlert : : NONE )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      stop_alert_sound ( s - > alert_sound ) ;        stop_alert_sound ( s - > alert_sound ) ;   
			
		
	
		
		
			
				
					
					      s - > alert_sound  =  cereal_CarControl_HUDControl_AudibleAlert_none  ;        s - > alert_sound  =  cereal : : CarControl : : HUDControl : : AudibleAlert : : NONE ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    read_param_bool_timeout ( & s - > is_metric ,  " IsMetric " ,  & s - > is_metric_timeout ) ;      read_param_bool_timeout ( & s - > is_metric ,  " IsMetric " ,  & s - > is_metric_timeout ) ;