rk3399_arm_lvds/capimage/MultiFrameCapture_8458Color.h

223 lines
8.4 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_8458Color : public ICapturer
{
public:
MultiFrameCapture_8458Color();
virtual ~MultiFrameCapture_8458Color();
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;
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 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();
void init_adc_8458();
void write_adc_8458(int bank,int addr,int val,bool A_or_B);
uint32_t read_adc_8458(int bank,int addr,bool A_or_B);
void set_exp_8458_double(int exp,int sp,bool A_or_B);
void set_exp_8458_single(int exp,int sp,bool A_or_B);
void set_pixel_count_8458(int val);
void set_analog_gain_8458(int r1,int r2,int g1,int g2,int b1,int b2,bool A_or_B);
void set_analog_offset_8458(int type,int val,bool A_or_B);
void set_digital_offset_8458(int type,int val,bool A_or_B);
void set_digital_gain_8458(int type,int val,bool A_or_B);
void set_ADC_config_frequency(uint32_t freq);
void set_led_off();
void set_dpi_mode(bool is_600);
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 m_fpgaparam;
const uint8_t bank_value_b[192] =
{0x01,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //300*600 dpi
,0x44,0x64,0x46,0x00,0x64,0x00,0x64,0x00,0x64,0x00
,0xc8,0x00,0x64,0x00,0xc8,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xA1,0x01
,0x44,0x43,0x45,0x09,0x02,0x02,0x02,0x00,0x2A,0x14
,0x34,0x05,0x00,0x01,0x13,0xc4,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00
,0x41,0x00,0x50,0x09,0xe2,0x0a,0x32,0x13,0xc3,0x00
//,0x41,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,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
,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00
,0x02,0x00,0x03,0x02,0x00,0x60,0x00,0x6d,0x00,0x60
//,0x02,0x00,0x03,0x02,0x00,0x5c,0x00,0x5D,0x00,0x60
,0x07,0x8C,0x0A,0x5F,0x00,0x03,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};
const uint8_t bank_value[192] =
// {0x01,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //300*300 dpi
// ,0x44,0x64,0x46,0x00,0x64,0x00,0x64,0x00,0x64,0x00
// ,0xc8,0x00,0x64,0x00,0xc8,0x00,0x00,0x00,0x00,0x00
// ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xA1,0x01
// ,0x44,0x43,0x45,0x09,0x02,0x02,0x02,0x00,0x2A,0x14
// ,0x34,0x05,0x00,0x01,0x13,0xc4,0x00,0x00,0x00,0x00
// ,0x00,0x00,0x00,0x00
// ,0x41,0x00,0x50,0x09,0xe2,0x0a,0x32,0x13,0xc3,0x00
// //,0x41,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,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
// ,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
// ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00
// ,0x02,0x00,0x03,0x04,0x00,0x60,0x00,0x6D,0x00,0x60
// ,0x07,0x8C,0x0A,0x5F,0x00,0x03,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};
// {0x01,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //300*600 dpi
// ,0x44,0x64,0x46,0x00,0x64,0x00,0x64,0x00,0x64,0x00
// ,0xc8,0x00,0x64,0x00,0xc8,0x00,0x00,0x00,0x00,0x00
// ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xA1,0x01
// ,0x44,0x43,0x45,0x09,0x02,0x02,0x02,0x00,0x2A,0x14
// ,0x34,0x05,0x00,0x01,0x13,0xc4,0x00,0x00,0x00,0x00
// ,0x00,0x00,0x00,0x00
// ,0x41,0x00,0x50,0x09,0xe2,0x0a,0x32,0x13,0xc3,0x00
// //,0x41,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,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
// ,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
// ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00
// ,0x02,0x00,0x03,0x02,0x00,0x60,0x00,0x6D,0x00,0x60
// //,0x02,0x00,0x03,0x02,0x00,0x61,0x00,0x66,0x00,0x60
// //,0x02,0x00,0x03,0x02,0x00,0x5c,0x00,0x5D,0x00,0x60
// ,0x07,0x8c,0x0A,0x5F,0x00,0x03,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};
{0x01,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //600*600 dpi
,0x44,0x64,0x46,0x00,0x64,0x00,0x64,0x00,0x64,0x00
,0xc8,0x00,0x64,0x00,0xc8,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xA1,0x01
,0x44,0x43,0x45,0x09,0x02,0x02,0x02,0x00,0x2A,0x14
,0x34,0x05,0x00,0x01,0x13,0xc4,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00
,0x41,0x00,0x50,0x09,0xe2,0x0a,0x32,0x13,0xc3,0x00
//,0x41,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,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
,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00
,0x01,0x00,0x01,0x02,0x00,0x60,0x00,0x6D,0x00,0x60
//,0x02,0x00,0x03,0x02,0x00,0x5c,0x00,0x5D,0x00,0x60
,0x07,0x8C,0x0A,0x5F,0x00,0x03,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};
const uint8_t bank_change[3] = {0x01,0x41,0x81};
union adc_8458_param
{
struct
{
uint32_t val_l : 8; //数据位
uint32_t addr_l : 6; //adc 寄存器地址
uint32_t r_or_w_l :2; //读写标志位 0x11 读 0x01 写
uint32_t val_h : 8;
uint32_t addr_h : 6;
uint32_t r_or_w_h :2;
}param;
uint32_t value;
};
};