172 lines
7.6 KiB
C++
172 lines
7.6 KiB
C++
#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, 0x54, 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;
|
|
};
|
|
};
|