huago-corrcet_tools/HuaGoCorrect/gscn_drv.h

375 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "scn_usb.h"
#include <memory>
#include <vector>
#include <string>
#include <queue>
#include <Windows.h>
#include "MutexEx.h"
#include "opencv2/core/core.hpp"
#include <opencv2\highgui\highgui.hpp>
#include "jpeglib.h"
#include <time.h>
#include <thread>
#include <mutex>
#include "ImageMatQueue.h"
#include <map>
#include "PublicFunc.h"
#include "HuaGoCorrect.h"
using namespace cv;
typedef struct tag_USBCB {
UINT32 u32_CMD;
UINT32 u32_Data;
UINT32 u32_Count;
}USBCB, *PUSBCB;
typedef struct tag_USBCBA4
{
UINT u32_Command; /* command to execute */
UINT u32_Data; /* generic data field */
UINT u32_Count; /* number of bytes to transfer */
byte buffer[512]; //=new byte[1024];
}USBCBA4, *PUSBCBA4;
//u32_CMD
enum tagUsbKeyWords :UINT32
{
//无命令
NO_COMMAND = 0,
//获取dsp 状态
GET_DSP_STATUS = 1,
//取图
GET_IMAGE = 2,
//销毁DSP中驻存的图
POP_IMAGE = 3,
//开始扫描命令
START_COMMAND = 4,
//停止扫描命令
STOP = 5,
//获取扫描仪扫描模式
GET_SCAN_MODE = 6,
//获取固件版本号
GET_FW_VERSION = 7,
//返回PC端的状态
SEND_STATUS_PC = 8,
//下发扫描配置参数
CONFIGURED_DATA = 9,
//下发固件信息
SEND_FW = 10,
//获取扫描参数
GET_CONFIG_DATA = 11,
//获取扫描总张数
GET_SCANN_NUM = 12,
//获取有无纸的状态
GET_PAPERFEEDER_STATUS = 13,
//DSP初始化
INIT_HARDWARE_SYS = 14,
//获取有无纸的状态
GET_PAPER_STATUS = 0x0d,
//下发元器件配置参数灰度LED R曝光时间
SEND_COMPONENTS_GR = 15,
//下发元器件配置参数LED G/B曝光时间
SEND_COMPONENTS_GB = 16,
//下发扫描模式
SEND_SCAN_MODE = 17,
//开始进行平场矫正
START_FLAT = 18,
//停止平场矫正
STOP_FLAT = 19,
//下发200dpi彩色平场矫正参数
SEND_200_COLOR_FLAT_DATA = 20,
//下发300dpi彩色平场矫正参数
SEND_300_COLOR_FLAT_DATA = 21,
//获取200dpi彩色平场矫正参数
GET_200_COLOR_FLAT_DATA = 22,
//获取300dpi彩色平场矫正参数
GET_300_COLOR_FLAT_DATA = 23,
//下发200dpi灰度平场校正参数
SEND_200_GRAY_FLAT_DATA = 24,
//下发300dpi灰度平场校正参数
SEND_300_GRAY_FLAT_DATA = 25,
//获取200DPI灰度平场校正参数
GET_200_GRAY_FLAT_DATA = 26,
//获取300DPI灰度平场校正参数
GET_300_GRAY_FLAT_DATA = 27,
//下发序列号命令
SEND_SERIAL = 28,
//获取序列号命令
GET_SERIAL = 29,
//获取滚轮张数
GET_ROLLER_NUM = 30,
//清零滚轮张数
CLR_ROLLER_NUM = 31,
//清零扫描总张数
CLR_SCAN_NUM = 32,
PRE_UPGRADE =33,
START_UPGRADE = 34,
RGB_ADI_PARA =35,
ADI_PARA =36,
GET_CIS_PARA =37,
SEND_COLOR_FLAT = 41,
SEND_COLORCORRECT_FLAT=42,
SEND_GRAY_FLAT=43,
SEND_GRAYCORRECT_FLAT=44,
GET_FLAT_DATA=45,
//设置横向畸变系数
SET_JUST_COF_H = 0x38,
//读取横向畸变系数
GET_JUST_COF_H = 0x39,
//设置纵向畸变系数
SET_JUST_COF_V = 0x41,
//读取纵向畸变系数
GET_JUST_COF_V
};
typedef enum tagUsbKeyWords UsbKeyWords, *PUsbKeyWords;
//u32_Data
enum tagUsbSupported
{
//停止扫描
SCAN_STOP = -2,
//异常
HAVE_ERROR = -1,
//正常状态
NORMAL = 0,
//开盖
OPEN_COVER = 1,
// 无纸
NO_FEED = 2,
// 搓纸失败
FEED_IN_ERROR = 4,
// 卡纸
PAPER_JAM = 8,
// 检测到双张
DETECT_DOUBLE_FEED = 16,
// 检测到订书钉
DETECT_STAPLE = 32,
// 纸张倾斜
PAPER_SKEW = 64,
// 自动模式
AUTO_SCAN_MODE = 65,
// 手动模式
MANAUL_SCAN_MODE = 66,
// 计数模式
COUNT_MODE = 67,
// 硬件错误
HARDWARE_ERROR = 68,
// FPGA崩溃
FPGA_ERROR = 68,
// 开始
START_SCAN = 69,
//停止
STOP_SCAN = 70,
//有图
HAVE_IMAGE = 71,
// 更新扫描参数
UPDATE_SCAN_PARAMETER = 72,
// PC繁忙或出错
PC_SCAN_BUSY_or_ERROR = 73
};
typedef enum tagUsbSupported UsbSupported, *PUsbSupported;
enum tagDevState
{
DEV_STOP = -1,
DEV_ISRUNNING,
DEV_WRONG
};
typedef enum tagDevState DevState, PDevState;
enum tagEventIndex
{
EVENT_IMAGE,
EVENT_NUM
};
enum tagDEVMODEL
{
G100=0,
G200,
G300,
G400,
G500
};
class twainImage
{
public:
twainImage(){}
~twainImage()
{
release();
}
twainImage(cv::Mat image,int side=-1)
{
this->m_image=image;
this->m_side=side;
this->m_width=image.cols;
this->m_height=image.rows;
}
bool empty()
{
return m_image.empty();
}
int GetWidth()
{
return m_image.cols;
}
int GetHeight()
{
return m_image.rows;
}
void release()
{
if (!m_image.empty())
{
m_image.release();
}
}
public:
cv::Mat m_image;
int m_side;
private:
int m_height;
int m_width;
};
class GScn_Drv
{
public:
GScn_Drv();
~GScn_Drv();
void save_config(bool saveOrigin, bool saveFixedOrigin);
void open(int vid, int pid,int index);
void open(int vid);
void close();
int aquire_image(cv::Mat& image,int num);
int aquire_image(cv::Mat& image);
BOOL IsConnected();
void Get_Scanner_Correct_Ratio(float & hrz, float & vtc);
std::string GetFWVersion();
byte* GetSerialNum();
bool is_scan();
USBCB Get_Scanner_Status();
BOOL Get_Scanner_PaperOn();
void Config_Scanner(PUSBCB pUSBCB);
//void setlist(std::vector<std::shared_ptr<CImageApply>> list);
void Scanner_StartScan(UINT16 count);
void Set_Scanner_Correct_Ratio(float hrz, float vtc);
void Stop_scan();
void ResetScanner();
bool Get_IsImageQueueEmpty();
void reset();
INT get_decompress_pix_type();
void set_decompress_pix_type(int pixtype);
void enableDiscardBlank(bool bVal);
void SetIsDuplex(BOOL value);
void SetRotate(int rotateType);
void SetBackRotate(bool enBackRoate);
std::vector<string> GetSerials(int vid,int pid);
void ActiveteUSB();
void SetSerialNum(byte *pvalue);
int GetScanNum();
void ClrRollerNum();
void ClrScanNum();
bool SendrAdPara(UINT para);
bool SendrRgbAdPara(UINT para);
bool SenGRPara(UINT para);
bool SenGBPara(UINT para);
void SendColorCorrentFlat(byte buffer[],int size);
void SendColorFlat(byte buffer[],int size);
void SendGrayCorrectFlat(byte buffer[],int size);
void SendGrayFlat(byte buffer[],int size);
byte* GetFlatData();
byte* GetCisPara();
bool FlatA4();
bool FlatA3(UINT para);
void DevStateChange();
int getMatSum();
void SetPath(CString csFilePath)
{
csPath = csFilePath;
}
CString GetPath()
{
return csPath;
}
void setlist(std::vector<std::shared_ptr<CImageApply> >list)
{
m_pImages.setlist(list);
}
bool FlatA4Conrrect();
ImageMatQueue m_pImages;
//HWND h;
int device_id;
bool isusbopened() { return m_usb.is_connected(); }
private:
cscn_usb m_usb;
volatile int devState;
volatile BOOL isDuplex;
std::mutex m_Locker;
std::mutex m_imgLocker;
int pixType;
int m_rotate;
bool backRotate;
BOOL canUseDiscardBlank;
std::thread m_threadUsb;
std::map<int,string> ntcMsg;
std::map<string,int> devType;
std::vector<string> vcSerials;
int selectDeviceIndex;
int m_scannerType;
CString csPath;
private:
void run();
cv::Mat popMat(int num);
void pushMat(JpegBuffer& data);
void InitMSGMap();
void InitScannerDiviceMap();
cv::Mat Get_Img_Data(int buffersize);
DWORD usbmain();
void Pop_Image();
};