diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index 83c52a80..2395e63c 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -7,6 +7,10 @@ #include "JpegBuffer.h" #include "ImageMatQueue.h" #include "filetools.h" +#include "GetMemoryUsage.h" +#ifndef G200 +#include "G400ScanConfig.h" +#endif // !G200 //u32_CMD typedef enum tagUsbKeyWords : UINT32 @@ -72,7 +76,70 @@ typedef enum tagUsbKeyWords : UINT32 //下发序列号命令 SEND_SERIAL = 28, //获取序列号命令 - GET_SERIAL = 29 + GET_SERIAL = 29, + //获取滚轴数 + GET_ROLLER_NUM=0x1e, + //清零滚轴数 + CLR_ROLLER_NUM=0x1f, + //清除扫描总张数 + CLR_SCAN_NUM=0x20, + //准备更新固件 + PRE_UPGRADE=0X21, + //开始更新固件 + START_UPGRADE=0x22, + //彩色的AD参数 + RGB_ADI_PARA=0x23, + //灰度的AD参数 + ADI_PARA=0x24, + //获取CIS参数(曝光时间,ad参数) + GET_CIS_PARA=0x25, + //扫描张数 + START_COMMAND_COUNT=0x26, + //下发休眠时间 + SET_SLEEP_TIME=0x27, + //获取休眠时间 + GET_SLEEP_TIME=0x28, + //清除缓存 + CLR_CACHE=0x29, + //下发速度模式 + SET_SPEED_MODE=0x2a, + //获取扫描速度模式 + GET_SPEED_MODE=0X2b, + //设置固件版本一共8个字节 + SET_FW_VERSION=0X2c, + //获取DSP版本 + GET_DSP_VERSION=0X2d, + //采集板FPGA固件版本 + GET_SCANFPGA_VERSION=0x2e, + //电机板FPGA固件版本 + GET_MOTORFPGA_VERSION =0X2f, + //设置制造商信息 + SET_USB_INFOR_MANUFACTURE=0X30, + //获取制造商信息 + GET_USB_INFOR_MANUFACTURE=0X31, + //设置产品型号信息 + SET_USB_INFOR_MODEL_NAME=0X32, + //获取产品型号信息 + GET_USB_INFOR_MODEL_NAME=0X33, + //设置USB PID / VID信息 + SET_USB_INFOR_VIDPID=0X34, + GET_USB_INFOR_VIDPID=0X35, + //设置卡纸急停检测灵敏度 + SET_JAM_DETECT_SENSITIVE=0X36, + //获取卡纸急停检测灵敏度 + GET_JAM_DETECT_SENSITIVE=0X37, + //设置横向畸变系数 + SET_JUST_COF_H=0x38, + //读取横向畸变系数 + GET_JUST_COF_H=0x39, +#ifndef G200 + CLEAR_HWERROR = 0x40,//G400 清除硬件异常 +#endif // !G200 + //设置纵向畸变系数 + SET_JUST_COF_V = 0x41, + //读取纵向畸变系数 + GET_JUST_COF_V + } UsbKeyWords, * PUsbKeyWords; GScanO200::GScanO200() @@ -94,7 +161,7 @@ void GScanO200::open(int vid, int pid) if (!usbs.empty()) { m_usb = *usbs.begin(); - bool ret= m_usb->open(); + bool ret = m_usb->open(); if (ret) { m_usb->set_usbhotplug_callback(usbhotplug_callback, this); } @@ -133,7 +200,7 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) } else { if (m_pImages->valid()) { - bmpdata = m_pImages->popBmpdata(); + bmpdata = *(m_pImages->popBmpdata()); #ifdef LOG_NORMAL static int aquireindex = 0; FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex)); @@ -156,11 +223,25 @@ std::string GScanO200::GetFWVersion() if (m_usb.get() && m_usb->is_connected()) { 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() +#else // !G200 fwVersion = " "; - USBCB cmd= { GET_FW_VERSION,8,0,}; + USBCB cmd = { GET_FW_VERSION,8,0, }; m_usb->write_bulk(&cmd, sizeof(cmd)); m_usb->read_bulk(&fwVersion[0], 8); +#endif + } +; return fwVersion; } return ""; @@ -172,10 +253,19 @@ std::string GScanO200::GetSerialNum() { 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); +#else // !G200 SerialNum = " "; USBCB usbcb = { GET_SERIAL,12,0 }; m_usb->write_bulk(&usbcb, sizeof(usbcb)); m_usb->read_bulk(&SerialNum[0], 12); +#endif + + } return SerialNum; } @@ -190,7 +280,7 @@ bool GScanO200::is_scan() BOOL GScanO200::Get_Scanner_PaperOn() { - if (m_usb.get()&&!m_usb->is_open()) + if (m_usb.get() && !m_usb->is_open()) return false; USBCB usbcb = { GET_PAPER_STATUS ,0,0 }; @@ -202,9 +292,13 @@ BOOL GScanO200::Get_Scanner_PaperOn() void GScanO200::config_params(GScanCap& params) { - if (m_usb.get()&&m_usb->is_connected()) { - IConfig cfg; - cfg = hgConfigClass(params); + if (m_usb.get() && m_usb->is_connected()) { +#ifndef G200 + G400ScanConfig cfg = G400ScanConfig(params); +#else + hgConfigClass cfg = hgConfigClass(params); +#endif + gcap = params; UINT32 cfgdata = cfg.GetData(); USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 }; m_usb->write_bulk(&usbcb, sizeof(USBCB)); @@ -219,11 +313,12 @@ void GScanO200::Scanner_StartScan(UINT16 count) 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(); } - m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this)); - m_pImages->run(); m_pImages->setscanflags(true); + m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this)); + m_pImages->run(); } } @@ -235,6 +330,8 @@ 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; } void GScanO200::ResetScanner() @@ -254,7 +351,7 @@ bool GScanO200::Get_IsImageQueueEmpty() void GScanO200::reset() { - while (!m_pImages->empty()) + while (!m_pImages->empty()) m_pImages->clear(); } @@ -283,6 +380,19 @@ int GScanO200::get_scanned_num() return usbcb.u32_Count; } +void GScanO200::clear_hwerror() +{ +#ifndef G200 + if (m_usb.get() && !m_usb->is_connected()) + return; + + std::lock_guard lck(m_imgLocker); + USBCB usbcb = { CLEAR_HWERROR ,0,0 }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); +#endif // !G200 + +} + void GScanO200::usbhotplug_callback(bool isconnect, void* userdata) { GScanO200* This = (GScanO200*)userdata; @@ -292,9 +402,27 @@ void GScanO200::usbhotplug_callback(bool isconnect, void* userdata) void GScanO200::usbhotplug(bool isleft) { if (isleft) { - //devState = DEV_WRONG; - //Error_Code = USB_DISCONNECTED; - //m_pImages->setscanflags(false); + devState = DEV_WRONG; + Error_Code = USB_DISCONNECTED; + m_pImages->setscanflags(false); + } +} + +void GScanO200::updateHVRatio() +{ + if (m_usb.get() && !m_usb->is_connected()) + return; + if (m_bread_fixed_ratio_fromDSP) { + USBCB usbcb = { GET_JUST_COF_H ,0,0 }; + 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 }; + 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)); + m_pImages->updatefixratio(hratio, vratio); } } @@ -303,22 +431,32 @@ void GScanO200::usbmain() std::shared_ptr> imgData; devState = DEV_ISRUNNING; while (devState == DEV_ISRUNNING) { - if (m_usb.get() && !m_usb->is_connected()) { + //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; } + + if (gcap.resolution_dst == 300.0f && gcap.en_fold) { + if (m_pImages->orginimgcount() > 1) + { + this_thread::sleep_for(chrono::milliseconds(100)); + continue; + } + } + USBCB usbcb = Get_Scanner_Status(); switch (usbcb.u32_Data) { case HAVE_IMAGE: { int totalNum = usbcb.u32_Count; - m_usb->set_timeout(1500); + m_usb->set_timeout(2000); imgData = Get_Img_Data(totalNum); if (!imgData->size()) { Stop_scan(); } - - m_pImages->pushMat(std::shared_ptr(new G200Decode(imgData))); #ifdef LOG_NORMAL static int rawdataindex = 0; @@ -341,7 +479,7 @@ void GScanO200::usbmain() case DETECT_STAPLE: case PAPER_SKEW: case HARDWARE_ERROR: - case PC_SCAN_BUSY_or_ERROR: + case PC_SCAN_BUSY_or_ERROR: Set_ErrorCode(usbcb.u32_Data); m_pImages->setscanflags(false); devState = DEV_WRONG; @@ -372,7 +510,7 @@ std::shared_ptr> GScanO200::Get_Img_Data(int bufferSize) std::shared_ptr> imData(new std::vector(bufferSize)); StopWatch sw; int readed = 0; - while (readed < bufferSize && sw.elapsed_ms() < 5000){ + while (readed < bufferSize && sw.elapsed_ms() < 5000) { USBCB usbcb = { GET_IMAGE,0,(UINT32)bufferSize }; m_usb->write_bulk(&usbcb, sizeof(usbcb)); readed = m_usb->read_bulk(imData->data(), bufferSize); diff --git a/huagao/Device/GScanO200.h b/huagao/Device/GScanO200.h index f844b2b3..607bce20 100644 --- a/huagao/Device/GScanO200.h +++ b/huagao/Device/GScanO200.h @@ -32,15 +32,20 @@ public: virtual UINT32 get_ErrorCode() override; virtual void Set_ErrorCode(UINT32 value) override; virtual int get_scanned_num() override; + virtual void clear_hwerror() override; + private: static void usbhotplug_callback(bool isleft, void* userdata); void usbhotplug(bool isleft); + void updateHVRatio(); void usbmain(); USBCB Get_Scanner_Status(); std::shared_ptr> Get_Img_Data(int buffersize); void Pop_Image(); - +private: + bool m_bread_fixed_ratio_fromDSP; std::shared_ptr m_usb; std::unique_ptr m_threadUsb; + GScanCap gcap; }; diff --git a/huagao/Device/GScanVirtual.cpp b/huagao/Device/GScanVirtual.cpp index 38f6fdc6..234c3578 100644 --- a/huagao/Device/GScanVirtual.cpp +++ b/huagao/Device/GScanVirtual.cpp @@ -57,7 +57,7 @@ int GScanVirtual::aquire_bmpdata(std::vector& bmpdata) } else { if (m_pImages->valid()) { - bmpdata = m_pImages->popBmpdata(); + bmpdata = *(m_pImages->popBmpdata()); return 0; } }