#pragma once #include "ICapturer.h" #include "ThreadPool.h" class FpgaComm; class gVideo; class Gpio; class MultiFrameCapture_8478_HL : public ICapturer { public: MultiFrameCapture_8478_HL(); virtual ~MultiFrameCapture_8478_HL(); 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; 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 set_cis_type_hl(bool is_hl); void init_adc_8478(); void write_adc_8478(int bank, int addr, int val, bool A_or_B); 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, bool A_or_B, int color); void set_digital_gain_8478(int channel, uint8_t val, bool A_or_B, int color); void set_dpi_mode(int type); 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 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_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, 0x00, 0x05, 0x03, 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, 0x54, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 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; }; };