rk3399_arm_lvds/capimage/MultiFrameCapture.h

172 lines
7.6 KiB
C
Raw Normal View History

2024-03-05 03:46:18 +00:00
#pragma once
#include "ICapturer.h"
#include "ThreadPool.h"
class FpgaComm;
class gVideo;
class Gpio;
class MultiFrameCapture : public ICapturer
{
public:
MultiFrameCapture();
virtual ~MultiFrameCapture();
virtual void open();
virtual void open(HGScanConfig config, FPGAConfigParam fpgaparam){};
virtual void open(HGScanConfig config, FPGAConfigParam_8478 fpgaparam);
virtual void close();
virtual void start();
virtual void stop();
virtual bool is_runing();
virtual void snap();
virtual void snap(frame_data_info info);
virtual cv::Size frame_data_size();
virtual void stopsnap();
virtual int getautosizeheight();
virtual void set_size(int width, int height);
virtual void set_sp(int sp);
virtual void *readFrame(int timeout);
virtual frame_data_info ReadMultiFrame(int state);
virtual void set_gain(int ix, int val);
virtual void set_offset(int ix, int val);
virtual void set_expo(int ix, int val);
virtual std::shared_ptr<IRegsAccess> regs();
virtual void reset();
virtual int width();
virtual int height();
virtual int color();
virtual void init_autocorrect(int colormode);
virtual void setcapturecall(std::function<void(int, std::string)> callback)
{
m_captureCallback = callback;
};
virtual void Fpga_regsAccess_reset(bool enable);
virtual uint32_t multi_frame_counts() { return frame_count; }
virtual uint32_t multi_curr_snap_index() { return curr_frame_snap_index; }
virtual void single_correct(std::uint32_t mode);
virtual cv::Mat read_one_frame() override;
cv::Mat merge_8478(cv::Mat src, bool color, uint32_t version);
void init_imagedatabuffer();
void free_imagedatabuffer();
void update_imgdatainfo(void *itemmat, frame_data_info &info, uint32_t h, uint32_t w);
void update_imgdatainfo(void *itemmat, uint32_t h, uint32_t w);
private:
void configFPGAParam(int mode, int dpi);
void configFPGAParam_digital_gain(int mode, int dpi);
void init_lutdate();
void openDevice(int dpi, int mode);
void creatcorrectconfig(int dpi, int mode);
bool saveLutImg(int dpi, int mode, bool black);
void correctcolor(int correctmode);
void fpga_reset();
void fpga_reload();
public:
// 8478 寄存器设置函数
void set_ADC_config_frequency(uint32_t freq);
void init_adc_8478();
void write_adc_8478(int bank, int addr, int val, bool A_or_B);
void write_adc_8478(int bank, int addr, int val_A, int val_B);
void write_adc_8478(std::vector<std::tuple<int,int,int,int>> maps);
uint32_t read_adc_8478(int bank, int addr, bool A_or_B);
void set_exp_8478_single(int exp_r, int exp_g, int exp_b, int sp, bool A_or_B, bool is_gray);
void set_led_off();
void set_pixel_count_8478(int val, bool is_gray);
void set_digital_offset_8478(int channel, int val_A, int val_B, int color);
void set_digital_gain_8478(int channel, uint8_t val_A, uint8_t val_B, int color);
void set_dpi_mode(bool is_600);
void set_BOS_postion(uint32_t rise, uint32_t fall);
void set_EN_postion(uint32_t rise, uint32_t fall);
void set_7864A_current_ctrl(uint32_t current);
void set_LED_PTN_8478(bool is_bw);
private:
std::function<void(int, std::string)> m_captureCallback;
std::shared_ptr<gVideo> video;
std::shared_ptr<Gpio> vdd_cis_3voff_pin;
std::shared_ptr<Gpio> vdd_vis_5ven_pin;
std::shared_ptr<Gpio> reset_pin;
std::shared_ptr<Gpio> image_in_transfer_pin;
std::shared_ptr<Gpio> initDone_pin;
std::shared_ptr<Gpio> fpgaLoad;
std::shared_ptr<FpgaComm> fpgaComm;
std::shared_ptr<Gpio> fpga_conf_initn;
std::shared_ptr<Gpio> fpga_conf_done;
ThreadPool snapthread;
uint32_t m_fpgaversion;
uint32_t frame_height;
uint32_t frame_count;
uint32_t curr_frame_snap_index;
const int FPGA_MAX_HEIGHT_SUP = 1048576;
frame_data_info pimgdata_info;
std::future<void> snap_fu;
bool bcorrecting;
bool b_stop_snap;
std::thread m_correctthread;
HGScanConfig m_config;
FPGAConfigParam_8478 m_fpgaparam;
const uint8_t bank_value[256] =
// {0x15,0x78,0x80,0x90,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //bank 0 32us
// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
// //0x40,0x40,0x40,0x05,0x46,0x23,0x54,0x62,0x35,0x46,0x23,0x00,0x03,0x04,0x05,0x01, //敦南默认值
// 0x40,0x40,0x80,0x03,0x25,0x46,0x32,0x54,0x63,0x25,0x46,0x00,0x03,0x04,0x05,0x01,
// 0x01,0x00,0x06,0x06,0x03,0x05,0x00,0x14,0x07,0x0B,0x23,0x27,0x00,0x01,0x00,0x00,
// 0x35,0x02,0x04,0x02,0x04,0x02,0x04,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x01, //bank 1
// 0x02,0x00,0x00,0x00,0x01,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// 0x55,0x00,0x41,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x01, //bank 2
// 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x06,0x00,
// 0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// 0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //bank 3
// 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,
// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,
// 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
{0x15, 0x78, 0x80, 0x90, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // bank 0 64us
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
// 0x40,0x40,0x40,0x05,0x46,0x23,0x54,0x62,0x35,0x46,0x23,0x00,0x03,0x04,0x05,0x01, //敦南默认值
0x40, 0x40, 0x80, 0x03, 0x25, 0x46, 0x32, 0x54, 0x63, 0x25, 0x46, 0x00, 0x03, 0x04, 0x05, 0x01,
0x01, 0x00, 0x06, 0x06, 0x03, 0x05, 0x00, 0x14, 0x07, 0x0B, 0x24, 0x28, 0x00, 0x01, 0x00, 0x00,
// 0x01, 0x00, 0x06, 0x06, 0x03, 0x05, 0x00, 0x14, 0x07, 0x0B, 0x25, 0x29, 0x00, 0x01, 0x00, 0x00,
0x35, 0x03, 0xdf, 0x03, 0xdf, 0x03, 0xdf, 0x00, 0x01, 0x03, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x01, // bank 1
0x03, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x55, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x03, // bank 2
0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // bank 3
0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//.colorSp_200 = 2606 , .graySp_200= 7818,.colorSp_300 = 2804 ,.graySp_300 = 8412,.colorSp_600 = 3405 ,.graySp_600 = 10215
const uint8_t bank_change[4] = {0x15, 0x35, 0x55, 0x75};
union adc_8478_param
{
struct
{
uint32_t val_l : 8; // 数据位
uint32_t addr_l : 6; // adc 寄存器地址
uint32_t r_or_w_l : 2; // 读写标志位 0x11 读 0x01 写 8458 0x10 读 0x00 写 8478
uint32_t val_h : 8;
uint32_t addr_h : 6;
uint32_t r_or_w_h : 2;
} param;
uint32_t value;
};
};