# pragma once 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <fcntl.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <memory> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <thread> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cereal/messaging/messaging.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cereal/visionipc/visionipc_server.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "common/queue.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  int  YUV_BUFFER_COUNT  =  20 ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								enum  CameraType  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  RoadCam  =  0 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  DriverCam , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  WideRoadCam 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// for debugging
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  bool  env_disable_road  =  getenv ( " DISABLE_ROAD " )  ! =  NULL ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  bool  env_disable_wide_road  =  getenv ( " DISABLE_WIDE_ROAD " )  ! =  NULL ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  bool  env_disable_driver  =  getenv ( " DISABLE_DRIVER " )  ! =  NULL ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  bool  env_debug_frames  =  getenv ( " DEBUG_FRAMES " )  ! =  NULL ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  bool  env_log_raw_frames  =  getenv ( " LOG_RAW_FRAMES " )  ! =  NULL ; 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  bool  env_ctrl_exp_from_params  =  getenv ( " CTRL_EXP_FROM_PARAMS " )  ! =  NULL ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								typedef  struct  FrameMetadata  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint32_t  frame_id ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  uint32_t  request_id ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // Timestamps
   
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  uint64_t  timestamp_sof ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint64_t  timestamp_eof ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // Exposure
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  unsigned  int  integ_lines ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  high_conversion_gain ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  float  gain ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  float  measured_grey_fraction ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  float  target_grey_fraction ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  float  processing_time ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  FrameMetadata ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  MultiCameraState ; 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  CameraState ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  Debayer ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  CameraBuf  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								private : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  VisionIpcServer  * vipc_server ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  Debayer  * debayer  =  nullptr ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  VisionStreamType  stream_type ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  cur_buf_idx ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  SafeQueue < int >  safe_queue ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  frame_buf_count ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cl_command_queue  q ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  FrameMetadata  cur_frame_data ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  VisionBuf  * cur_yuv_buf ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  VisionBuf  * cur_camera_buf ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : unique_ptr < VisionBuf [ ] >  camera_bufs ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : unique_ptr < FrameMetadata [ ] >  camera_bufs_metadata ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  int  rgb_width ,  rgb_height ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  CameraBuf ( )  =  default ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ~ CameraBuf ( ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  void  init ( cl_device_id  device_id ,  cl_context  context ,  CameraState  * s ,  VisionIpcServer  *  v ,  int  frame_cnt ,  VisionStreamType  type ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  acquire ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  queue ( size_t  buf_idx ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								typedef  void  ( * process_thread_cb ) ( MultiCameraState  * s ,  CameraState  * c ,  int  cnt ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  fill_frame_data ( cereal : : FrameData : : Builder  & framed ,  const  FrameMetadata  & frame_data ,  CameraState  * c ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								kj : : Array < uint8_t >  get_raw_frame_image ( const  CameraBuf  * b ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								float  set_exposure_target ( const  CameraBuf  * b ,  int  x_start ,  int  x_end ,  int  x_skip ,  int  y_start ,  int  y_end ,  int  y_skip ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								std : : thread  start_process_thread ( MultiCameraState  * cameras ,  CameraState  * cs ,  process_thread_cb  callback ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  cameras_init ( VisionIpcServer  * v ,  MultiCameraState  * s ,  cl_device_id  device_id ,  cl_context  ctx ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  cameras_open ( MultiCameraState  * s ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  cameras_run ( MultiCameraState  * s ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  cameras_close ( MultiCameraState  * s ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  camerad_thread ( ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  open_v4l_by_name_and_index ( const  char  name [ ] ,  int  index  =  0 ,  int  flags  =  O_RDWR  |  O_NONBLOCK ) ;