375 lines
6.6 KiB
C
375 lines
6.6 KiB
C
|
#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();
|
|||
|
};
|