openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
2.8 KiB

#ifndef CAMERA_H
#define CAMERA_H
#include <stdint.h>
#include <stdbool.h>
#include <pthread.h>
#include "msmb_isp.h"
#include "msmb_ispif.h"
#include "msmb_camera.h"
#include "msm_cam_sensor.h"
#include "common/mat.h"
#include "common/visionbuf.h"
#include "common/buffering.h"
#include "camera_common.h"
#define FRAME_BUF_COUNT 4
#define METADATA_BUF_COUNT 4
#define DEVICE_OP3 0
#define DEVICE_OP3T 1
#define DEVICE_LP3 2
#define NUM_FOCUS 8
#ifdef __cplusplus
extern "C" {
#endif
typedef struct CameraState CameraState;
typedef int (*camera_apply_exposure_func)(CameraState *s, int gain, int integ_lines, int frame_length);
typedef struct StreamState {
struct msm_isp_buf_request buf_request;
struct msm_vfe_axi_stream_request_cmd stream_req;
struct msm_isp_qbuf_info qbuf_info[FRAME_BUF_COUNT];
VisionBuf *bufs;
} StreamState;
typedef struct CameraState {
int camera_num;
int camera_id;
CameraInfo ci;
int frame_size;
int device;
void* ops_sock;
uint32_t pixel_clock;
uint32_t line_length_pclk;
unsigned int max_gain;
// PLL to sync cameras in time
// assumes at least 1 FPS
bool using_pll;
int phase_actual;
int phase_request;
int64_t global_time_offset;
int csid_fd;
int csiphy_fd;
int sensor_fd;
int isp_fd;
int eeprom_fd;
// rear only
int ois_fd, actuator_fd;
uint16_t infinity_dac;
struct msm_vfe_axi_stream_cfg_cmd stream_cfg;
size_t eeprom_size;
uint8_t *eeprom;
// uint32_t camera_bufs_ids[FRAME_BUF_COUNT];
FrameMetadata camera_bufs_metadata[FRAME_BUF_COUNT];
TBuffer camera_tb;
pthread_mutex_t frame_info_lock;
FrameMetadata frame_metadata[METADATA_BUF_COUNT];
int frame_metadata_idx;
float cur_exposure_frac;
float cur_gain_frac;
int cur_gain;
int cur_frame_length;
int cur_integ_lines;
float digital_gain;
StreamState ss[3];
uint64_t last_t;
camera_apply_exposure_func apply_exposure;
int16_t focus[NUM_FOCUS];
uint8_t confidence[NUM_FOCUS];
float focus_err;
uint16_t cur_step_pos;
uint16_t cur_lens_pos;
uint64_t last_sag_ts;
float last_sag_acc_z;
float lens_true_pos;
int fps;
mat3 transform;
} CameraState;
typedef struct DualCameraState {
int device;
int ispif_fd;
CameraState rear;
CameraState front;
} DualCameraState;
void cameras_init(DualCameraState *s);
void cameras_open(DualCameraState *s, VisionBuf *camera_bufs_rear, VisionBuf *camera_bufs_focus, VisionBuf *camera_bufs_stats, VisionBuf *camera_bufs_front);
void cameras_run(DualCameraState *s);
void cameras_close(DualCameraState *s);
void camera_autoexposure(CameraState *s, float grey_frac);
void actuator_move(CameraState *s, uint16_t target);
int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size_t size, int data_type);
#ifdef __cplusplus
} // extern "C"
#endif
#endif