#pragma once #include #include #include "system/camerad/cameras/camera_common.h" #include "system/camerad/cameras/camera_util.h" #include "system/camerad/sensors/sensor.h" #include "common/params.h" #include "common/util.h" #define FRAME_BUF_COUNT 4 struct CameraConfig { int camera_num; VisionStreamType stream_type; float focal_len; // millimeters const char *publish_name; cereal::FrameData::Builder (cereal::Event::Builder::*init_camera_state)(); bool enabled; }; const CameraConfig WIDE_ROAD_CAMERA_CONFIG = { .camera_num = 0, .stream_type = VISION_STREAM_WIDE_ROAD, .focal_len = 1.71, .publish_name = "wideRoadCameraState", .init_camera_state = &cereal::Event::Builder::initWideRoadCameraState, .enabled = !getenv("DISABLE_WIDE_ROAD"), }; const CameraConfig ROAD_CAMERA_CONFIG = { .camera_num = 1, .stream_type = VISION_STREAM_ROAD, .focal_len = 8.0, .publish_name = "roadCameraState", .init_camera_state = &cereal::Event::Builder::initRoadCameraState, .enabled = !getenv("DISABLE_ROAD"), }; const CameraConfig DRIVER_CAMERA_CONFIG = { .camera_num = 2, .stream_type = VISION_STREAM_DRIVER, .focal_len = 1.71, .publish_name = "driverCameraState", .init_camera_state = &cereal::Event::Builder::initDriverCameraState, .enabled = !getenv("DISABLE_DRIVER"), }; class CameraState { public: MultiCameraState *multi_cam_state = nullptr; std::unique_ptr ci; bool enabled = true; VisionStreamType stream_type; const char *publish_name = nullptr; cereal::FrameData::Builder (cereal::Event::Builder::*init_camera_state)() = nullptr; float focal_len = 0; std::mutex exp_lock; int exposure_time = 5; bool dc_gain_enabled = false; int dc_gain_weight = 0; int gain_idx = 0; float analog_gain_frac = 0; float cur_ev[3] = {}; float best_ev_score = 0; int new_exp_g = 0; int new_exp_t = 0; Rect ae_xywh = {}; float measured_grey_fraction = 0; float target_grey_fraction = 0.3; unique_fd sensor_fd; unique_fd csiphy_fd; int camera_num = 0; float fl_pix = 0; CameraState(MultiCameraState *multi_camera_state, const CameraConfig &config); void handle_camera_event(void *evdat); void update_exposure_score(float desired_ev, int exp_t, int exp_g_idx, float exp_gain); void set_camera_exposure(float grey_frac); void sensors_start(); void camera_open(); void set_exposure_rect(); void sensor_set_parameters(); void camera_map_bufs(); void camera_init(VisionIpcServer *v, cl_device_id device_id, cl_context ctx); void camera_close(); void run(); int32_t session_handle = -1; int32_t sensor_dev_handle = -1; int32_t isp_dev_handle = -1; int32_t csiphy_dev_handle = -1; int32_t link_handle = -1; int buf0_handle = 0; int buf_handle[FRAME_BUF_COUNT] = {}; int sync_objs[FRAME_BUF_COUNT] = {}; uint64_t request_ids[FRAME_BUF_COUNT] = {}; uint64_t request_id_last = 0; uint64_t frame_id_last = 0; uint64_t idx_offset = 0; bool skipped = true; CameraBuf buf; MemoryManager mm; void config_isp(int io_mem_handle, int fence, int request_id, int buf0_mem_handle, int buf0_offset); void enqueue_req_multi(uint64_t start, int n, bool dp); void enqueue_buffer(int i, bool dp); int clear_req_queue(); int sensors_init(); void sensors_poke(int request_id); void sensors_i2c(const struct i2c_random_wr_payload* dat, int len, int op_code, bool data_word); private: bool openSensor(); void configISP(); void configCSIPHY(); void linkDevices(); // for debugging Params params; }; class MultiCameraState { public: MultiCameraState(); unique_fd video0_fd; unique_fd cam_sync_fd; unique_fd isp_fd; int device_iommu = -1; int cdm_iommu = -1; CameraState road_cam; CameraState wide_road_cam; CameraState driver_cam; PubMaster *pm; };