mirror of http://192.168.1.51:8099/lmh188/twain3.0
292 lines
6.8 KiB
C++
292 lines
6.8 KiB
C++
#pragma once
|
||
#include <memory>
|
||
#include <vector>
|
||
#include <string>
|
||
#include <queue>
|
||
#ifdef WIN32
|
||
#include <Windows.h>
|
||
#endif
|
||
#include <time.h>
|
||
#include <mutex>
|
||
#include <atomic>
|
||
#include <thread>
|
||
#include <functional>
|
||
#include "filetools.h"
|
||
#include "PublicFunc.h"
|
||
using namespace std;
|
||
enum tagDevState
|
||
{
|
||
DEV_STOP = -1,
|
||
DEV_ISRUNNING,
|
||
DEV_WRONG
|
||
};
|
||
typedef enum tagDevState DevState, PDevState;
|
||
|
||
|
||
typedef struct tag_USBCB {
|
||
UINT32 u32_CMD;
|
||
UINT32 u32_Data;
|
||
UINT32 u32_Count;
|
||
}USBCB, * PUSBCB;
|
||
|
||
//u32_Data
|
||
typedef 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,
|
||
//摺角
|
||
DOG_EAR = 74,
|
||
//幅面检测错误
|
||
SIZE_ERROR = 75,
|
||
//取图超时
|
||
AQUIRE_IMAGE_TIMEOUT = 76,
|
||
//获取图片与扫描张数不匹配
|
||
LOSE_IMAGE = 77,
|
||
//usb读取数据错误
|
||
USB_BULK_ERROR = 78,
|
||
//v4l2取图失败
|
||
V4L2_AQULRE_ERROR = 79,
|
||
//扫描仪内部图片丢失
|
||
V4L2_IMAGE_EMPTY = 80,
|
||
//处于休眠中
|
||
SLEEPING = 81,
|
||
//检测到有折角
|
||
HAVE_DOGEAR = 82,
|
||
//
|
||
MLTOP_TIMEOUT = 83,
|
||
//
|
||
PAPER_HOLE = 84,
|
||
//USB 未连接
|
||
USB_DISCONNECTED = 200,
|
||
//用户点击停止
|
||
USER_STOP = 201,
|
||
//自动校正完成
|
||
AUTO_FLAT_FINISHED = 202,
|
||
//usb 已连接
|
||
USB_CONNECTED,
|
||
HAVE_PAPER,
|
||
DEVICE_LOCKED,
|
||
} UsbSupported, * PUsbSupported;
|
||
|
||
static map<UsbSupported, string> msgs = {
|
||
{UsbSupported::OPEN_COVER,"扫描仪开盖!请关闭扫描仪上盖!"},
|
||
{UsbSupported::NO_FEED,"无纸!请放置纸张!"},
|
||
{UsbSupported::FEED_IN_ERROR,"搓纸失败!请整理纸张!"},
|
||
{UsbSupported::PAPER_JAM,"卡纸!"},
|
||
{UsbSupported::DETECT_DOUBLE_FEED,"双张,请核对扫描张数!"},
|
||
{UsbSupported::DETECT_STAPLE,"检测到订书钉!"},
|
||
{UsbSupported::PAPER_SKEW,"纸张歪斜!请整理纸张!"},
|
||
{UsbSupported::COUNT_MODE,"计数模式,请退出计数模式!"},
|
||
{UsbSupported::HARDWARE_ERROR,"硬件异常!请重启扫描仪!"},
|
||
{UsbSupported::USB_DISCONNECTED,"USB连接异常!"},
|
||
{UsbSupported::USER_STOP,"未找到扫描仪!请检查电源或者USB连接线是否接通!"},
|
||
{UsbSupported::AUTO_FLAT_FINISHED,"设备已被其他程序占用,请关闭占用程序之后再重试!"},
|
||
{UsbSupported::DOG_EAR,"检测到折角!"},
|
||
{UsbSupported::SIZE_ERROR,"幅面检测异常!"},
|
||
{UsbSupported::AQUIRE_IMAGE_TIMEOUT,"取图超时!"},
|
||
{UsbSupported::LOSE_IMAGE,"上传图片与扫描张数不匹配!"},
|
||
{UsbSupported::USB_BULK_ERROR,"USB数据读取错误!"},
|
||
{UsbSupported::V4L2_AQULRE_ERROR,"扫描仪取图失败!"},
|
||
{UsbSupported::V4L2_IMAGE_EMPTY,"扫描仪图像处理异常!"},
|
||
#ifdef G200
|
||
{UsbSupported::SLEEPING,"设备处于休眠模式!请手动唤醒设备。"},
|
||
#else
|
||
{UsbSupported::SLEEPING,"设备处于休眠模式!正在为您唤醒设备。"},
|
||
#endif // G200
|
||
{UsbSupported::HAVE_DOGEAR,"检测到有折角,停止扫描!"},
|
||
{UsbSupported::MLTOP_TIMEOUT,"升降台抬升未到达指定位置!"},
|
||
{UsbSupported::PAPER_HOLE,"纸张疑是有孔,请使用带孔模式扫描!"},
|
||
{UsbSupported::DEVICE_LOCKED,"设备已锁定!"},
|
||
};
|
||
|
||
enum tagEventIndex
|
||
{
|
||
EVENT_IMAGE,
|
||
EVENT_NUM
|
||
};
|
||
|
||
class CImageApply;
|
||
class IUsb;
|
||
class ImageMatQueue;
|
||
typedef void(*deviceevent_callback)(int eventID, void* userdata);
|
||
|
||
class IScanner
|
||
{
|
||
public:
|
||
IScanner() {
|
||
imgreadednum = imgtransfered = roller_num = lose_image_num = 0;
|
||
}
|
||
virtual ~IScanner()
|
||
{
|
||
}
|
||
/// <summary>
|
||
/// 设置本批次扫描的样张数量
|
||
/// </summary>
|
||
/// <param name="val">样张数量</param>
|
||
void set_scannum(int val) {
|
||
scannum = val;
|
||
};
|
||
/// <summary>
|
||
/// 获取本批次扫描的样张数量
|
||
/// </summary>
|
||
/// <returns>样张数量</returns>
|
||
int get_scannum() {
|
||
return scannum;
|
||
};
|
||
/// <summary>
|
||
/// 获取PC获取的图像数量(页计数)
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
int get_imgnReaded() {
|
||
return imgreadednum;
|
||
};
|
||
/// <summary>
|
||
/// 获取图像传输张数
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
int get_imgTransfered() {
|
||
return imgtransfered;
|
||
};
|
||
/// <summary>
|
||
/// 获取丢失图像张数
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
int get_lose_image_num() {
|
||
return lose_image_num;
|
||
};
|
||
/// <summary>
|
||
/// 设置丢失图像张数
|
||
/// </summary>
|
||
/// <param name="value"></param>
|
||
void set_lose_image_num(int value) {
|
||
lose_image_num = value;
|
||
};
|
||
/// <summary>
|
||
/// 获取原始图像计数自加一
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
int countNReaded()
|
||
{
|
||
return ++imgreadednum;
|
||
};
|
||
/// <summary>
|
||
/// 已处理图像传输数量自加一
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
int countNTransfered()
|
||
{
|
||
return ++imgtransfered;
|
||
};
|
||
/// <summary>
|
||
/// 获取折角或者尺寸不符的图像索引
|
||
/// </summary>
|
||
/// <param name="aquire"></param>
|
||
/// <param name="updata"></param>
|
||
int geterrorindex() {
|
||
return error_index;
|
||
};
|
||
|
||
void UpdateScanInfo(int aquire, int updata)
|
||
{
|
||
imgreadednum = aquire;
|
||
imgtransfered = updata;
|
||
if (setindicatortext)
|
||
setindicatortext(aquire, updata);
|
||
};
|
||
|
||
void regist_indicatortext_callback(std::function<void(int, int)> indicatortext)
|
||
{
|
||
if (indicatortext)
|
||
setindicatortext = indicatortext;
|
||
};
|
||
virtual void open(int vid, int pid) = 0;
|
||
virtual void regist_deviceevent_callback(deviceevent_callback callback, void* usrdata = 0) = 0;
|
||
virtual void DogEar_callback(std::function<void(int)> fun)=0;
|
||
virtual int aquire_bmpdata(std::vector<unsigned char>& bmpdata) = 0;
|
||
virtual BOOL IsConnected() = 0;
|
||
virtual std::string GetFWVersion() = 0;
|
||
virtual std::string GetSerialNum() = 0;
|
||
virtual std::string GetMacAdder() = 0;
|
||
virtual std::uint32_t GetMotorFPGA() = 0;
|
||
virtual std::uint32_t GetScanFPGA() = 0;
|
||
virtual bool is_scan() = 0;
|
||
virtual BOOL Get_Scanner_PaperOn() = 0;
|
||
virtual int Get_Roller_num() = 0;
|
||
virtual void config_params(GScanCap& params) = 0;
|
||
virtual void Scanner_StartScan(UINT16 count) = 0;
|
||
virtual void Stop_scan() = 0;
|
||
virtual int notifyscan() = 0;
|
||
virtual void ResetScanner() = 0;
|
||
virtual bool Get_IsImageQueueEmpty() = 0;
|
||
virtual void reset() = 0;
|
||
virtual void clear_hwerror() = 0;
|
||
virtual UINT32 get_ErrorCode() = 0;
|
||
virtual void Set_ErrorCode(UINT32 value) = 0;
|
||
virtual int get_scanned_num() = 0;
|
||
virtual void set_sleep_time(int mode) = 0;
|
||
virtual bool set_scannercode(std::string str) = 0;
|
||
virtual std::string get_scannercode() = 0;
|
||
void DoEvents() {
|
||
MSG msg;
|
||
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||
DispatchMessage(&msg);
|
||
TranslateMessage(&msg);
|
||
}
|
||
}
|
||
protected:
|
||
atomic_uint32_t Error_Code;
|
||
atomic_int devState;
|
||
std::shared_ptr<ImageMatQueue> m_pImages;
|
||
std::mutex m_Locker;
|
||
std::mutex m_imgLocker;
|
||
std::string fwVersion;
|
||
std::string SerialNum;
|
||
std::string scannercode;
|
||
std::uint32_t MotorFpga;
|
||
std::uint32_t ScanFpga;
|
||
std::function<void(int, int)> setindicatortext;
|
||
int imgreadednum;
|
||
int imgtransfered;
|
||
int roller_num;
|
||
int scannum;
|
||
int lose_image_num;
|
||
int error_index;
|
||
|
||
}; |