From 169dab7d5ccf349d8fbe56b4e084e441d7dd7c20 Mon Sep 17 00:00:00 2001 From: lovelyyoung <1002639516@qq.com> Date: Sat, 20 Jun 2020 11:13:18 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E6=B8=85=E9=99=A4=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8E=A5=E5=8F=A3=EF=BC=9B=202.=E6=95=B4=E5=90=88IGsc?= =?UTF-8?q?an=E5=92=8CGscan=E6=8E=A5=E5=8F=A3=E4=B8=BAIScanner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=8E=BB=E6=8E=89=E4=B8=8D=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E7=9A=84=E5=A4=9A=E7=BB=A7=E6=89=BF=EF=BC=9B=203.=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=BC=80=E5=A7=8B=E6=89=AB=E6=8F=8F=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- huagao/Device/GScan.cpp | 52 +++++----- huagao/Device/GScan.h | 115 +++++++++------------ huagao/Device/GScan200.cpp | 9 +- huagao/Device/GScan200.h | 6 +- huagao/Device/GScanO200.cpp | 184 +++++++++++++++++++++------------ huagao/Device/GScanO200.h | 2 +- huagao/Device/GScanVirtual.cpp | 8 +- huagao/Device/GScanVirtual.h | 3 +- 8 files changed, 210 insertions(+), 169 deletions(-) diff --git a/huagao/Device/GScan.cpp b/huagao/Device/GScan.cpp index d0263462..6ab784df 100644 --- a/huagao/Device/GScan.cpp +++ b/huagao/Device/GScan.cpp @@ -1,40 +1,36 @@ #include "stdafx.h" #include "GScan.h" -#include "stdio.h" +#include #include #include "ImageProcess/ImageApplyHeaders.h" #include "ImageMatQueue.h" -GScan::GScan() - :pixType(0) - , m_pImages(new ImageMatQueue()) -{ - devState = DEV_STOP; - Error_Code = 0; -} +//GScan::GScan() +// :pixType(0) +// , m_pImages(new ImageMatQueue()) +//{ +// devState = DEV_STOP; +// Error_Code = 0; +//} -GScan::~GScan() -{ -} +//void DoEvents() +//{ +// MSG msg; +// if (PeekMessage(&msg , NULL, 0, 0, PM_REMOVE)) { +// DispatchMessage(&msg); +// TranslateMessage(&msg); +// } +//} -void DoEvents() -{ - MSG msg; - if (PeekMessage(&msg , NULL, 0, 0, PM_REMOVE)) { - DispatchMessage(&msg); - TranslateMessage(&msg); - } -} - -void GScan::trim(std::string &s) -{ - int index = 0; - if (!s.empty()) { - while ((index = s.find(' ', index)) != string::npos) - s.erase(index, 1); - } -} +//void GScan::trim(std::string &s) +//{ +// int index = 0; +// if (!s.empty()) { +// while ((index = s.find(' ', index)) != string::npos) +// s.erase(index, 1); +// } +//} diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index ba458e57..3b04ee8f 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -9,76 +9,14 @@ #include #include "PublicFunc.h" - enum tagDevState { DEV_STOP = -1, DEV_ISRUNNING, DEV_WRONG }; - typedef enum tagDevState DevState, PDevState; -enum tagEventIndex -{ - EVENT_IMAGE, - EVENT_NUM -}; - -class DiscardBlank; -class CImageApply; - -class IGScan -{ -public: - virtual ~IGScan()=0 {}; - - virtual void open(int vid, int pid) = 0;; - virtual int aquire_bmpdata(std::vector& bmpdata) = 0; - virtual BOOL IsConnected() = 0; - virtual std::string GetFWVersion() = 0; - virtual std::string GetSerialNum() = 0; - virtual bool is_scan() = 0; - virtual BOOL Get_Scanner_PaperOn() = 0; - virtual void config_params(GScanCap& params) = 0; - virtual void Scanner_StartScan(UINT16 count) = 0; - virtual void Stop_scan() = 0; - virtual void ResetScanner() =0; - virtual bool Get_IsImageQueueEmpty() = 0; - virtual void reset() = 0; - virtual void clear_hwerror() = 0; - - virtual void setdecodepixtype(int twpixtype)= 0; - virtual UINT32 get_ErrorCode() = 0; - virtual void Set_ErrorCode(UINT32 value) = 0; - virtual int get_scanned_num() = 0; -}; - -class IUsb; -class ImageMatQueue; - -class GScan -{ -public: - GScan(); - virtual ~GScan(); - -protected: - volatile UINT32 Error_Code; - - - void trim(std::string &s); - volatile int devState; - std::shared_ptr m_pImages; - - std::mutex m_Locker; - std::mutex m_imgLocker; - std::string fwVersion; - std::string SerialNum; - int pixType; -}; - - //u32_Data typedef enum tagUsbSupported { @@ -124,8 +62,57 @@ typedef enum tagUsbSupported { PC_SCAN_BUSY_or_ERROR = 73, //USB 未连接 USB_DISCONNECTED = 200 -} UsbSupported, * PUsbSupported; +} UsbSupported, *PUsbSupported; +enum tagEventIndex +{ + EVENT_IMAGE, + EVENT_NUM +}; -void DoEvents(); \ No newline at end of file +class DiscardBlank; +class CImageApply; +class IUsb; +class ImageMatQueue; + +class IScanner +{ +public: + virtual ~IScanner(){}; + + virtual void open(int vid, int pid) = 0;; + virtual int aquire_bmpdata(std::vector& bmpdata) = 0; + virtual BOOL IsConnected() = 0; + virtual std::string GetFWVersion() = 0; + virtual std::string GetSerialNum() = 0; + virtual bool is_scan() = 0; + virtual BOOL Get_Scanner_PaperOn() = 0; + virtual void config_params(GScanCap& params) = 0; + virtual void Scanner_StartScan(UINT16 count) = 0; + virtual void Stop_scan() = 0; + virtual void ResetScanner() =0; + virtual bool Get_IsImageQueueEmpty() = 0; + virtual void reset() = 0; + virtual void clear_hwerror() = 0; + virtual void setdecodepixtype(int twpixtype)= 0; + virtual UINT32 get_ErrorCode() = 0; + virtual void Set_ErrorCode(UINT32 value) = 0; + virtual int get_scanned_num() = 0; + void DoEvents() { + MSG msg; + if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + DispatchMessage(&msg); + TranslateMessage(&msg); + } + } +protected: + volatile UINT32 Error_Code; + volatile int devState; + std::shared_ptr m_pImages; + std::mutex m_Locker; + std::mutex m_imgLocker; + std::string fwVersion; + std::string SerialNum; + int pixType; +}; \ No newline at end of file diff --git a/huagao/Device/GScan200.cpp b/huagao/Device/GScan200.cpp index 632e7ac0..894f92a9 100644 --- a/huagao/Device/GScan200.cpp +++ b/huagao/Device/GScan200.cpp @@ -103,6 +103,10 @@ void GScan200::reset() } } +void GScan200::clear_hwerror() +{ +} + void GScan200::setdecodepixtype(int twpixtype) { pixType = (twpixtype == 0) ? 1 : 0; @@ -125,11 +129,6 @@ int GScan200::get_scanned_num() return scanned_count; } -void GScan200::set_scan_status(bool isscan) -{ - -} - void GScan200::image_call_s(void* fdata, int fsize, void* bdata, int bsize, void* userdata) { GScan200* This = (GScan200*)userdata; diff --git a/huagao/Device/GScan200.h b/huagao/Device/GScan200.h index dd528bac..12aa2adb 100644 --- a/huagao/Device/GScan200.h +++ b/huagao/Device/GScan200.h @@ -5,7 +5,7 @@ class IGDevice; -class GScan200 : public IGScan, GScan +class GScan200 : public IScanner { public: GScan200(); @@ -23,11 +23,11 @@ public: virtual void ResetScanner() override; virtual bool Get_IsImageQueueEmpty() override; virtual void reset() override; + virtual void clear_hwerror() override; virtual void setdecodepixtype(int twpixtype) override; virtual UINT32 get_ErrorCode() override; virtual void Set_ErrorCode(UINT32 value) override; - virtual int get_scanned_num() override; - void set_scan_status(bool isscan); + virtual int get_scanned_num() override; private: static void image_call_s(void *fdata, int fsize, void *bdata, int bsize, void *userdata); static void event_call_g200(int error_value, void* userdata); diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index 2395e63c..63159158 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -78,72 +78,74 @@ typedef enum tagUsbKeyWords : UINT32 //获取序列号命令 GET_SERIAL = 29, //获取滚轴数 - GET_ROLLER_NUM=0x1e, + GET_ROLLER_NUM = 0x1e, //清零滚轴数 - CLR_ROLLER_NUM=0x1f, + CLR_ROLLER_NUM = 0x1f, //清除扫描总张数 - CLR_SCAN_NUM=0x20, + CLR_SCAN_NUM = 0x20, //准备更新固件 - PRE_UPGRADE=0X21, + PRE_UPGRADE = 0X21, //开始更新固件 - START_UPGRADE=0x22, + START_UPGRADE = 0x22, //彩色的AD参数 - RGB_ADI_PARA=0x23, + RGB_ADI_PARA = 0x23, //灰度的AD参数 - ADI_PARA=0x24, + ADI_PARA = 0x24, //获取CIS参数(曝光时间,ad参数) - GET_CIS_PARA=0x25, + GET_CIS_PARA = 0x25, //扫描张数 - START_COMMAND_COUNT=0x26, + START_COMMAND_COUNT = 0x26, //下发休眠时间 - SET_SLEEP_TIME=0x27, + SET_SLEEP_TIME = 0x27, //获取休眠时间 - GET_SLEEP_TIME=0x28, + GET_SLEEP_TIME = 0x28, //清除缓存 - CLR_CACHE=0x29, + CLR_CACHE = 0x29, //下发速度模式 - SET_SPEED_MODE=0x2a, + SET_SPEED_MODE = 0x2a, //获取扫描速度模式 - GET_SPEED_MODE=0X2b, + GET_SPEED_MODE = 0X2b, //设置固件版本一共8个字节 - SET_FW_VERSION=0X2c, + SET_FW_VERSION = 0X2c, //获取DSP版本 - GET_DSP_VERSION=0X2d, + GET_DSP_VERSION = 0X2d, //采集板FPGA固件版本 - GET_SCANFPGA_VERSION=0x2e, + GET_SCANFPGA_VERSION = 0x2e, //电机板FPGA固件版本 - GET_MOTORFPGA_VERSION =0X2f, + GET_MOTORFPGA_VERSION = 0X2f, //设置制造商信息 - SET_USB_INFOR_MANUFACTURE=0X30, + SET_USB_INFOR_MANUFACTURE = 0X30, //获取制造商信息 - GET_USB_INFOR_MANUFACTURE=0X31, + GET_USB_INFOR_MANUFACTURE = 0X31, //设置产品型号信息 - SET_USB_INFOR_MODEL_NAME=0X32, + SET_USB_INFOR_MODEL_NAME = 0X32, //获取产品型号信息 - GET_USB_INFOR_MODEL_NAME=0X33, + GET_USB_INFOR_MODEL_NAME = 0X33, //设置USB PID / VID信息 - SET_USB_INFOR_VIDPID=0X34, - GET_USB_INFOR_VIDPID=0X35, + SET_USB_INFOR_VIDPID = 0X34, + GET_USB_INFOR_VIDPID = 0X35, //设置卡纸急停检测灵敏度 - SET_JAM_DETECT_SENSITIVE=0X36, + SET_JAM_DETECT_SENSITIVE = 0X36, //获取卡纸急停检测灵敏度 - GET_JAM_DETECT_SENSITIVE=0X37, + GET_JAM_DETECT_SENSITIVE = 0X37, //设置横向畸变系数 - SET_JUST_COF_H=0x38, + SET_JUST_COF_H = 0x38, //读取横向畸变系数 - GET_JUST_COF_H=0x39, + GET_JUST_COF_H = 0x39, #ifndef G200 CLEAR_HWERROR = 0x40,//G400 清除硬件异常 #endif // !G200 - //设置纵向畸变系数 + //设置纵向畸变系数 SET_JUST_COF_V = 0x41, //读取纵向畸变系数 GET_JUST_COF_V -} UsbKeyWords, * PUsbKeyWords; +} UsbKeyWords, *PUsbKeyWords; -GScanO200::GScanO200() +GScanO200::GScanO200(): + m_bread_fixed_ratio_fromDSP(false) { + m_pImages.reset(new ImageMatQueue()); } GScanO200::~GScanO200() @@ -201,6 +203,11 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) else { if (m_pImages->valid()) { bmpdata = *(m_pImages->popBmpdata()); + //static int aqimgindex = 0; + //FileTools::write_log("1.txt", "aquireed image " + to_string(++aqimgindex)); + //FileTools::write_log("E:\\Users\\huago\\Desktop\\1.txt", "aquired image "+ to_string(++aqimgindex)); + + #ifdef LOG_NORMAL static int aquireindex = 0; FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex)); @@ -224,24 +231,22 @@ std::string GScanO200::GetFWVersion() lock_guard< mutex> lock(m_imgLocker); if (fwVersion.empty()) { #ifndef G200 - fwVersion = " "; - USBCB cmd = { GET_FW_VERSION,10,0, }; - m_usb->write_bulk(&cmd, sizeof(cmd)); - m_usb->read_bulk(&fwVersion[0], 10); - //std::string ver=fwVersion.substr((fwVersion.length() - 2), 2); - //int verValue = atoi(ver.c_str()); - //m_bread_fixed_ratio_fromDSP = verValue >= 15; - //writelog(m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio"); - //updateHVRatio() + fwVersion.resize(10); #else // !G200 - fwVersion = " "; - USBCB cmd = { GET_FW_VERSION,8,0, }; - m_usb->write_bulk(&cmd, sizeof(cmd)); - m_usb->read_bulk(&fwVersion[0], 8); + fwVersion.resize(8); #endif - + USBCB cmd = { GET_FW_VERSION,fwVersion.size(),0, }; + m_usb->write_bulk(&cmd, sizeof(cmd)); + m_usb->read_bulk(&fwVersion[0], fwVersion.size()); +#ifdef G200 + std::string ver = fwVersion.substr((fwVersion.length() - 2), 2); + int verValue = atoi(ver.c_str()); + m_bread_fixed_ratio_fromDSP = verValue >= 15; + writelog(m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio"); + updateHVRatio(); +#endif // G200 } -; + ; return fwVersion; } return ""; @@ -249,22 +254,19 @@ std::string GScanO200::GetFWVersion() std::string GScanO200::GetSerialNum() { + //return "G20018000298"; if (m_usb.get() && m_usb->is_connected()) { std::lock_guard lck(m_imgLocker); if (SerialNum.empty()) { #ifndef G200 - SerialNum = " "; - USBCB usbcb = { GET_SERIAL,14,0 }; - m_usb->write_bulk(&usbcb, sizeof(usbcb)); - m_usb->read_bulk(&SerialNum[0], 14); + SerialNum.resize(14); #else // !G200 - SerialNum = " "; - USBCB usbcb = { GET_SERIAL,12,0 }; - m_usb->write_bulk(&usbcb, sizeof(usbcb)); - m_usb->read_bulk(&SerialNum[0], 12); + SerialNum.resize(12); #endif - + USBCB usbcb = { GET_SERIAL,SerialNum.size(),0 }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + m_usb->read_bulk(&SerialNum[0], SerialNum.size()); } return SerialNum; @@ -310,12 +312,52 @@ void GScanO200::Scanner_StartScan(UINT16 count) { if (m_usb.get() && m_usb->is_connected()) { std::lock_guard lck(m_imgLocker); - USBCB usbcb = { START_COMMAND,(UINT32)count ,0 }; - m_usb->write_bulk(&usbcb, sizeof(usbcb)); if (m_threadUsb && m_threadUsb->joinable()) { devState = DEV_STOP; m_threadUsb->join(); } +#ifndef G200 + USBCB paperstatus = { GET_PAPER_STATUS ,0,0 }; + m_usb->write_bulk(&paperstatus, sizeof(paperstatus)); + m_usb->read_bulk(&paperstatus, sizeof(paperstatus)); + if (paperstatus.u32_Data == 0) { + m_pImages->setscanflags(false); + devState = DEV_WRONG; + Set_ErrorCode(NO_FEED); + return; + } +#endif // !G200 + + + USBCB status = { GET_DSP_STATUS ,0,0 }; + m_usb->write_bulk(&status, sizeof(status)); + m_usb->read_bulk(&status, sizeof(status)); + + switch (status.u32_Data) + { + case COUNT_MODE: + case NO_FEED: + case OPEN_COVER: + case FEED_IN_ERROR: + case PAPER_JAM: + case DETECT_DOUBLE_FEED: + case DETECT_STAPLE: + case PAPER_SKEW: + case HARDWARE_ERROR: + case PC_SCAN_BUSY_or_ERROR: + m_pImages->setscanflags(false); + devState = DEV_WRONG; + Set_ErrorCode(status.u32_Data); + return; + default: + break; + } + + if (gcap.is_duplex) + count = count == 65535 ? 65535 : count / 2; + USBCB usbcb = { START_COMMAND,(UINT32)count ,0 }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + m_pImages->setscanflags(true); m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this)); m_pImages->run(); @@ -330,8 +372,10 @@ void GScanO200::Stop_scan() std::lock_guard lck(m_imgLocker); USBCB usbcb = { STOP ,0,0 }; m_usb->write_bulk(&usbcb, sizeof(usbcb)); - m_pImages->setscanflags(false); - devState = DEV_STOP; +#ifdef G200 + //m_pImages->setscanflags(false); + //devState = DEV_STOP; +#endif // G200 } void GScanO200::ResetScanner() @@ -353,6 +397,7 @@ void GScanO200::reset() { while (!m_pImages->empty()) m_pImages->clear(); + } void GScanO200::setdecodepixtype(int twpixtype) @@ -417,11 +462,11 @@ void GScanO200::updateHVRatio() m_usb->write_bulk(&usbcb, sizeof(usbcb)); m_usb->read_bulk(&usbcb, sizeof(usbcb)); float hratio = *((float*)(&usbcb.u32_Data)); - usbcb= { GET_JUST_COF_V ,0,0 }; + usbcb = { GET_JUST_COF_V ,0,0 }; m_usb->write_bulk(&usbcb, sizeof(usbcb)); m_usb->read_bulk(&usbcb, sizeof(usbcb)); float vratio = *((float*)(&usbcb.u32_Data)); - writelog("fx: " + to_string(hratio) + " fy :" + to_string(vratio)); + //writelog("fx: " + to_string(hratio) + " fy :" + to_string(vratio)); m_pImages->updatefixratio(hratio, vratio); } } @@ -430,10 +475,8 @@ void GScanO200::usbmain() { std::shared_ptr> imgData; devState = DEV_ISRUNNING; + bool haveError = false; while (devState == DEV_ISRUNNING) { - //int mmused = GetMemoryUsage::CurrentProcessMemoryInfo();//当前进程内存使用量 - - //bool need_loop = (m_pImages->getdpi() > 240.0) && mmused >500;//进程内存占用率大于600MB if ((m_usb.get() && !m_usb->is_connected())) { this_thread::sleep_for(chrono::milliseconds(200)); continue; @@ -468,7 +511,9 @@ void GScanO200::usbmain() } case STOP_SCAN: m_pImages->setscanflags(false); - devState = DEV_STOP; + devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP; + //m_pImages->setscanflags(false); + //devState = DEV_STOP; break; case COUNT_MODE: case NO_FEED: @@ -480,9 +525,18 @@ void GScanO200::usbmain() case PAPER_SKEW: case HARDWARE_ERROR: case PC_SCAN_BUSY_or_ERROR: +#ifdef G200 Set_ErrorCode(usbcb.u32_Data); m_pImages->setscanflags(false); devState = DEV_WRONG; +#else + if (!haveError) + { + haveError = true; + Set_ErrorCode(usbcb.u32_Data); + } + +#endif break; case NORMAL: break; diff --git a/huagao/Device/GScanO200.h b/huagao/Device/GScanO200.h index 607bce20..a68df294 100644 --- a/huagao/Device/GScanO200.h +++ b/huagao/Device/GScanO200.h @@ -9,7 +9,7 @@ typedef struct tag_USBCB { }USBCB, * PUSBCB; -class GScanO200 : public IGScan, GScan +class GScanO200 : public IScanner { public: GScanO200(); diff --git a/huagao/Device/GScanVirtual.cpp b/huagao/Device/GScanVirtual.cpp index 234c3578..b3692c6c 100644 --- a/huagao/Device/GScanVirtual.cpp +++ b/huagao/Device/GScanVirtual.cpp @@ -34,7 +34,7 @@ int GScanVirtual::aquire_bmpdata(std::vector& bmpdata) while (true) { if (Get_IsImageQueueEmpty() && is_scan()) { - DoEvents(); + //DoEvents(); this_thread::sleep_for(chrono::milliseconds(1)); if (sw.elapsed_s() > 15.00) { @@ -44,7 +44,7 @@ int GScanVirtual::aquire_bmpdata(std::vector& bmpdata) m_threadUsb.reset(); } Stop_scan();//停止扫描 - ResetScanner(); + //ResetScanner(); return HARDWARE_ERROR; } @@ -120,6 +120,10 @@ void GScanVirtual::Stop_scan() fs.close(); } +void GScanVirtual::clear_hwerror() +{ +} + void GScanVirtual::ResetScanner() { diff --git a/huagao/Device/GScanVirtual.h b/huagao/Device/GScanVirtual.h index ccf27475..559f3fdf 100644 --- a/huagao/Device/GScanVirtual.h +++ b/huagao/Device/GScanVirtual.h @@ -3,7 +3,7 @@ #include -class GScanVirtual : public IGScan, GScan +class GScanVirtual : public IScanner { public: GScanVirtual(); @@ -19,6 +19,7 @@ public: virtual void config_params(GScanCap& params) override; virtual void Scanner_StartScan(UINT16 count) override; virtual void Stop_scan() override; + virtual void clear_hwerror() override; virtual void ResetScanner() override; virtual bool Get_IsImageQueueEmpty() override; virtual void reset() override;