#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 regs(); virtual void reset(); virtual int width(); virtual int height(); virtual int color(); virtual void init_autocorrect(int colormode); virtual void setcapturecall(std::function 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 m_captureCallback; std::shared_ptr video; std::shared_ptr vdd_cis_3voff_pin; std::shared_ptr vdd_vis_5ven_pin; std::shared_ptr reset_pin; std::shared_ptr image_in_transfer_pin; std::shared_ptr initDone_pin; std::shared_ptr fpgaLoad; std::shared_ptr fpgaComm; std::shared_ptr fpga_conf_initn; std::shared_ptr 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 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; }; };