zynq_7010/MultiFrameCapture.h

160 lines
4.8 KiB
C++

#include "ICapturer.h"
#include <thread>
#include "autoevent.hpp"
#include "CorrectParam.h"
#include "IPreproc.h"
//#define TEST_SIMCAP
class FpgaComm;
class gVideo;
class Gpio;
class GpioOut;
#define WIDTH 5184
#define HEIGHT 650 //只能为3的倍数
#define DPI_600 0
#define DPI_300 1
#define COLOR 1
#define GRAY 0
typedef struct hg_tag_SIZE
{
long cx;
long cy;
}CSSIZE;
typedef CSSIZE SIZE;
class MultiFrameCapture : public ICapturer
{
private:
int frame_height = 60;
int m_total_height = 0;
int readframe_timeout = 100;
unsigned int frame_count;
std::shared_ptr<GpioOut> reset_pin; //fpga 逻辑复位以及固件重载初始化。 7010 7/15没有 以防固件跑飞了保证能够不重启就能解决
std::shared_ptr<Gpio> fpgaLoad;
std::shared_ptr<Gpio> fpga_conf_initn;
BlockingQueue<V4L2_DATAINFO_Ex> m_frameinfos;
bool b_snap_run;
bool b_stop_snap;
bool stop_snap_ = false ;
bool b_end_snap;
bool b_imgproc;
bool is_size_error;
int snaped_index;
bool bScanning;
std::atomic<int> iImageremain;
FPGAConfigParam m_fpgaparam;
std::mutex m_mtx_snap;
std::mutex m_mtx_snapdone;
std::condition_variable m_cv_snap;
std::condition_variable m_cv_snapdone;
std::shared_ptr<std::thread> m_snap_thread;
std::shared_ptr<std::thread> m_imgproc_thread;
//std::vector<cv::Mat> m_frames;
std::vector<std::shared_ptr<IPreproc>> m_preproclist;
std::thread m_correctThread;
ScannerGlue m_glue;
int offsetStep[12];
int expStep[2][3];
double radio = 1;
#ifdef TEST_SIMCAP
unsigned char* m_test_pimg;
unsigned int m_test_pimg_len;
#endif
CamZ_Reg_4 reg_;
private:
void reset_fpga();
void reload_fpga();
void configFPGAParam(int mode,int dpi);
int color();
int width();
void snaprun();
void updatesnapstatus(int papertype);
void procimage();
void formatStep();
bool saveLutImg(int dpi, int mode, bool black);
void creatcorrectconfig(int dpi,int mode);
void correctcolor(int correctmode);
void openDevice(int dpi,int mode);
//void myFloodFill(cv::Mat& image, bool isTwoSide);
private:
unsigned int resolution_; // 分辨率 //0:600dpi 1:300dpi
unsigned int cis_width_; // CIS 图像宽
unsigned int cis_height_; // CIS 图像高
unsigned int pixels_height_; // opencv需要生成的高
unsigned int pixels_width_ ; // opencv需要生成的宽
unsigned int paper_size_; // 纸张大小
unsigned int color_mode_; // 颜色模式
unsigned int is_correct_; // 是否校正
unsigned int is_double_paper_; // 是否启动双张检测
cv::Mat lut;
std::map<PaperSize, SIZE> paper_map_
{
{PaperSize::G400_A3,SIZE{297,420}},
{PaperSize::G400_A4,SIZE{210,297}},
{PaperSize::G400_A5,SIZE{148,210}},
{PaperSize::G400_A6,SIZE{105,148}},
{PaperSize::G400_B4,SIZE{250,353}},
{PaperSize::G400_B5,SIZE{176,250}},
{PaperSize::G400_B6,SIZE{125,176}},
// {PaperSize::G400_DOUBLELETTER,},
{PaperSize::G400_LEGAL,SIZE{216,356}},
{PaperSize::G400_LETTER,SIZE{216,279}},
//{PaperSize::G400_LONGLETTER},
{PaperSize::G400_MAXSIZE,SIZE{210,297 * 2}},
{PaperSize::G400_AUTO,SIZE{210,(long)(297 * 1.5)}},
{PaperSize::G400_MAXAUTO,SIZE{210,(long)(297 * 1.5)}},
};
SIZE GetPaperSize(PaperSize paper, int dpi);
uint32_t compute_frame(int paper_size,int dpi); //计算固定幅面需要采集的帧数
public:
MultiFrameCapture(ScannerGlue glue, std::shared_ptr<FpgaComm> fpga, CISVendor vendor);
virtual ~MultiFrameCapture();
virtual void SetParent(void *scanner) override;
virtual void open() override;
virtual void snap() override;
virtual void stopsnap(bool autosize) override;
virtual void close() override;
virtual int read(int addr) override;
virtual void *readFrameTest(int timeout);
virtual void UpdateScanParam(HG_ScanConfiguration config) override;
virtual void createCorrect(int correctmode) override;
virtual void setFPGATriggerMode(bool autotrigger, int delay) override;
virtual void setFanMode(int mode) override;
virtual void fpgaReload() override;
virtual bool capturerImage() override;
virtual void waitsnapdone(int state) override;
virtual bool IsImageQueueEmpty() override;
virtual void resetimageremain() override;
virtual std::atomic_int &getimageremain() override;
virtual void clearimages() override;
virtual void setScanFlag(bool brun) override;
};