# include  "selfdrive/ui/qt/onroad/buttons.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <QPainter> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "selfdrive/ui/qt/util.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  drawIcon ( QPainter  & p ,  const  QPoint  & center ,  const  QPixmap  & img ,  const  QBrush  & bg ,  float  opacity )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . setRenderHint ( QPainter : : Antialiasing ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . setOpacity ( 1.0 ) ;   // bg dictates opacity of ellipse
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . setPen ( Qt : : NoPen ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . setBrush ( bg ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . drawEllipse ( center ,  btn_size  /  2 ,  btn_size  /  2 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . setOpacity ( opacity ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . drawPixmap ( center  -  QPoint ( img . width ( )  /  2 ,  img . height ( )  /  2 ) ,  img ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p . setOpacity ( 1.0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// ExperimentalButton
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ExperimentalButton : : ExperimentalButton ( QWidget  * parent )  :  experimental_mode ( false ) ,  engageable ( false ) ,  QPushButton ( parent )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  setFixedSize ( btn_size ,  btn_size ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  engage_img  =  loadPixmap ( " ../assets/icons/chffr_wheel.png " ,  { img_size ,  img_size } ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  experimental_img  =  loadPixmap ( " ../assets/icons/experimental.svg " ,  { img_size ,  img_size } ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QObject : : connect ( this ,  & QPushButton : : clicked ,  this ,  & ExperimentalButton : : changeMode ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ExperimentalButton : : changeMode ( )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  const  auto  cp  =  ( * uiState ( ) - > sm ) [ " carParams " ] . getCarParams ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  can_change  =  hasLongitudinalControl ( cp )  & &  params . getBool ( " ExperimentalModeConfirmed " ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( can_change )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    params . putBool ( " ExperimentalMode " ,  ! experimental_mode ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ExperimentalButton : : updateState ( const  UIState  & s )  { 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  const  auto  cs  =  ( * s . sm ) [ " selfdriveState " ] . getSelfdriveState ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  eng  =  cs . getEngageable ( )  | |  cs . getEnabled ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( ( cs . getExperimentalMode ( )  ! =  experimental_mode )  | |  ( eng  ! =  engageable ) )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    engageable  =  eng ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    experimental_mode  =  cs . getExperimentalMode ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    update ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ExperimentalButton : : paintEvent ( QPaintEvent  * event )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QPainter  p ( this ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  QPixmap  img  =  experimental_mode  ?  experimental_img  :  engage_img ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  drawIcon ( p ,  QPoint ( btn_size  /  2 ,  btn_size  /  2 ) ,  img ,  QColor ( 0 ,  0 ,  0 ,  166 ) ,  ( isDown ( )  | |  ! engageable )  ?  0.6  :  1.0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}