huago-corrcet_tools/HuaGoCorrect/gscn_drv.h

375 lines
6.6 KiB
C
Raw Normal View History

2020-08-31 08:08:50 +00:00
#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
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NO_COMMAND = 0,
//<2F><>ȡdsp ״̬
GET_DSP_STATUS = 1,
//ȡͼ
GET_IMAGE = 2,
//<2F><><EFBFBD><EFBFBD>DSP<53><50>פ<EFBFBD><D7A4><EFBFBD><EFBFBD>ͼ
POP_IMAGE = 3,
//<2F><>ʼɨ<CABC><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
START_COMMAND = 4,
//ֹͣɨ<D6B9><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STOP = 5,
//<2F><>ȡɨ<C8A1><C9A8><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>ģʽ
GET_SCAN_MODE = 6,
//<2F><>ȡ<EFBFBD>̼<EFBFBD><CCBC><EFBFBD><E6B1BE>
GET_FW_VERSION = 7,
//<2F><><EFBFBD><EFBFBD>PC<50>˵<EFBFBD>״̬
SEND_STATUS_PC = 8,
//<2F>·<EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
CONFIGURED_DATA = 9,
//<2F>·<EFBFBD><C2B7>̼<EFBFBD><CCBC><EFBFBD>Ϣ
SEND_FW = 10,
//<2F><>ȡɨ<C8A1><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_CONFIG_DATA = 11,
//<2F><>ȡɨ<C8A1><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_SCANN_NUM = 12,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>״̬
GET_PAPERFEEDER_STATUS = 13,
//DSP<53><50>ʼ<EFBFBD><CABC>
INIT_HARDWARE_SYS = 14,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>״̬
GET_PAPER_STATUS = 0x0d,
//<2F>·<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷȣ<D2B6>LED R<>ع<EFBFBD>ʱ<EFBFBD>
SEND_COMPONENTS_GR = 15,
//<2F>·<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>LED G/B<>ع<EFBFBD>ʱ<EFBFBD>
SEND_COMPONENTS_GB = 16,
//<2F>·<EFBFBD>ɨ<EFBFBD><C9A8>ģʽ
SEND_SCAN_MODE = 17,
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
START_FLAT = 18,
//ֹͣƽ<D6B9><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STOP_FLAT = 19,
//<2F>·<EFBFBD>200dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_200_COLOR_FLAT_DATA = 20,
//<2F>·<EFBFBD>300dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_300_COLOR_FLAT_DATA = 21,
//<2F><>ȡ200dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_200_COLOR_FLAT_DATA = 22,
//<2F><>ȡ300dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_300_COLOR_FLAT_DATA = 23,
//<2F>·<EFBFBD>200dpi<70>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_200_GRAY_FLAT_DATA = 24,
//<2F>·<EFBFBD>300dpi<70>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_300_GRAY_FLAT_DATA = 25,
//<2F><>ȡ200DPI<50>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_200_GRAY_FLAT_DATA = 26,
//<2F><>ȡ300DPI<50>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_300_GRAY_FLAT_DATA = 27,
//<2F>·<EFBFBD><C2B7><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
SEND_SERIAL = 28,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
GET_SERIAL = 29,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_ROLLER_NUM = 30,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CLR_ROLLER_NUM = 31,
//<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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,
//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
SET_JUST_COF_H = 0x38,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
GET_JUST_COF_H = 0x39,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
SET_JUST_COF_V = 0x41,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
GET_JUST_COF_V
};
typedef enum tagUsbKeyWords UsbKeyWords, *PUsbKeyWords;
//u32_Data
enum tagUsbSupported
{
//ֹͣɨ<D6B9><C9A8>
SCAN_STOP = -2,
//<2F>
HAVE_ERROR = -1,
//<2F><><EFBFBD><EFBFBD>״̬
NORMAL = 0,
//<2F><><EFBFBD><EFBFBD>
OPEN_COVER = 1,
// <20><>ֽ
NO_FEED = 2,
// <20><>ֽʧ<D6BD><CAA7>
FEED_IN_ERROR = 4,
// <20><>ֽ
PAPER_JAM = 8,
// <20><><EFBFBD>⵽˫<E2B5BD><CBAB>
DETECT_DOUBLE_FEED = 16,
// <20><><EFBFBD><EFBFBD><E2B5BD><EFBFBD>
DETECT_STAPLE = 32,
// ֽ<><D6BD><EFBFBD><EFBFBD>б
PAPER_SKEW = 64,
// <20>Զ<EFBFBD>ģʽ
AUTO_SCAN_MODE = 65,
// <20>ֶ<EFBFBD>ģʽ
MANAUL_SCAN_MODE = 66,
// <20><><EFBFBD><EFBFBD>ģʽ
COUNT_MODE = 67,
// Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HARDWARE_ERROR = 68,
// FPGA<47><41><EFBFBD><EFBFBD>
FPGA_ERROR = 68,
// <20><>ʼ
START_SCAN = 69,
//ֹͣ
STOP_SCAN = 70,
//<2F><>ͼ
HAVE_IMAGE = 71,
// <20><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UPDATE_SCAN_PARAMETER = 72,
// PC<50><43>æ<EFBFBD><C3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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();
};