#pragma once #include #include #include #include #ifdef WIN32 #include #endif #include #include #include #include #include #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 } UsbSupported, * PUsbSupported; static map 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,"纸张疑是有孔,请使用带孔模式扫描!"}, }; 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() { } /// /// 设置本批次扫描的样张数量 /// /// 样张数量 void set_scannum(int val) { scannum = val; }; /// /// 获取本批次扫描的样张数量 /// /// 样张数量 int get_scannum() { return scannum; }; /// /// 获取PC获取的图像数量(页计数) /// /// int get_imgnReaded() { return imgreadednum; }; /// /// 获取图像传输张数 /// /// int get_imgTransfered() { return imgtransfered; }; /// /// 获取丢失图像张数 /// /// int get_lose_image_num() { return lose_image_num; }; /// /// 设置丢失图像张数 /// /// void set_lose_image_num(int value) { lose_image_num = value; }; /// /// 获取原始图像计数自加一 /// /// int countNReaded() { return ++imgreadednum; }; /// /// 已处理图像传输数量自加一 /// /// int countNTransfered() { return ++imgtransfered; }; /// /// 获取折角或者尺寸不符的图像索引 /// /// /// 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 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 fun)=0; virtual int aquire_bmpdata(std::vector& 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 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 setindicatortext; int imgreadednum; int imgtransfered; int roller_num; int scannum; int lose_image_num; int error_index; };