twain3.0/huagao/Device/GScan.h

292 lines
6.8 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 <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;
};