# pragma once
# include <fcntl.h>
# include <memory>
# include <thread>
# include "cereal/messaging/messaging.h"
# include "cereal/visionipc/visionipc_server.h"
# include "common/queue.h"
# include "common/util.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 ImgProc ;
class CameraBuf {
private :
VisionIpcServer * vipc_server ;
ImgProc * imgproc = 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 , Rect ae_xywh , int x_skip , 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 ) ;