From 75d3cb941b9f7acfdbc000b1696b0a6f072b862d Mon Sep 17 00:00:00 2001 From: masayume <1936714878@qq.com> Date: Mon, 21 Jun 2021 19:38:36 +0800 Subject: [PATCH] =?UTF-8?q?2021.5.20=09=E5=AF=B9=E6=8E=A5=E6=B2=B3?= =?UTF-8?q?=E5=8D=97=E5=A4=A9=E4=B8=80=E9=98=85=E5=8D=B7=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9DeviceOnline=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1enum=E4=BF=AE=E6=94=B9=E4=B8=BAonevalue?= =?UTF-8?q?=EF=BC=8C=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=94=B9=E4=B8=BAbool=2020?= =?UTF-8?q?21.5.22=09=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=BC=A0=E5=BC=A0?= =?UTF-8?q?=E6=95=B0=E6=A0=B8=E5=AF=B9=20=09=E4=BF=AE=E5=A4=8D=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=8C=87=E7=A4=BA=E5=99=A8=E5=85=B3=E9=97=AD=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=81=9C=E6=AD=A2=E6=89=AB=E6=8F=8F=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20=09=E5=BE=AE=E8=B0=83=E7=95=8C=E9=9D=A2UI=202021.5.24=09?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=AB=E6=8F=8F=E4=BB=AAdsp=E5=9B=BA?= =?UTF-8?q?=E4=BB=B6=E4=B8=8E=E7=94=B5=E6=9C=BA=E6=9D=BF=E5=9B=BA=E4=BB=B6?= =?UTF-8?q?=E6=A0=B8=E9=AA=8C=E6=98=AF=E5=90=A6=E9=99=90=E5=88=B6=E5=8F=96?= =?UTF-8?q?=E5=9B=BE=202021.5.25=09=E6=9B=B4=E6=96=B0=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E7=AE=97=E6=B3=95=20=09=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=8F=96=E5=9B=BE=E4=B8=BA=E4=BF=9D=E5=AD=98=E8=87=B3=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E5=86=8D=E8=AF=BB=E5=8F=96=E8=BF=9B=E8=A1=8C=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E5=A4=84=E7=90=86=202021.5.27=09=E5=86=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=88=B0=E5=AE=89=E5=8D=93=E8=AE=BE=E5=A4=87usb?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8D=E4=B8=80=E8=87=B4=E6=97=B6=E5=86=8D?= =?UTF-8?q?=E8=AF=BB=E5=8F=96512=E5=AD=97=E8=8A=82=E6=B8=85=E7=A9=BAusb?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E5=8C=BA=E5=90=8E=E5=8F=AF=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E8=AF=BB=E5=8F=96usb=E6=95=B0=E6=8D=AE=202021.5.28=09=E9=92=88?= =?UTF-8?q?=E5=AF=B9usb=E6=AD=A3=E5=B8=B8=E8=AF=BB=E5=8F=96=E5=90=8E?= =?UTF-8?q?=E8=A7=A3=E7=A0=81=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=86=8D=E8=AF=BB=E5=8F=96=E6=95=B0=E6=8D=AE=E5=90=8E=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E7=A7=BB=E4=BD=8D12=E4=BD=8D=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E4=B8=8A=E6=AC=A1=E4=B8=BA=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=A7=BB=E9=99=A4=20=09=E9=92=88=E5=AF=B9?= =?UTF-8?q?=E5=AE=89=E5=8D=93=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BF=AE=E6=94=B9scano400=202021.6.08=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=87=E4=BB=B6=E8=AF=BB=E5=86=99=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E4=B8=BACFile=202021.6.09=09=E4=BF=AE=E6=94=B9G400\G300?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=B0=BA=E5=AF=B8=E6=89=AB=E6=8F=8F=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E5=8F=82=E6=95=B0=EF=BC=8C=E7=94=B116=E6=94=B9?= =?UTF-8?q?=E4=B8=BA17=202021.6.10=09=E4=BF=AE=E5=A4=8D=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E6=89=AB=E6=8F=8F=E5=87=BA=E5=9B=BE=E9=97=AE?= =?UTF-8?q?=E9=A2=98=202021.6.16=09=E6=B7=BB=E5=8A=A0=E6=97=A0=E5=B1=8F?= =?UTF-8?q?=E4=BC=91=E7=9C=A0=E5=94=A4=E9=86=92=E5=8A=9F=E8=83=BD=20=09?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=AD=E6=96=87=E9=A6=96=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98=202021.6?= =?UTF-8?q?.18=09=E5=B1=8F=E8=94=BD=E5=B0=BA=E5=AF=B8=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=B1=8F=E8=94=BDG100=20G200?= =?UTF-8?q?=E4=BC=91=E7=9C=A0=E5=8A=9F=E8=83=BD=202021.6.19=09=E8=B0=83?= =?UTF-8?q?=E6=95=B4GetOverlappedResult=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E6=94=BE=E5=9C=A8getlasterror=E4=B9=8B=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E6=94=BE=E5=9C=A8=E4=B9=8B=E5=89=8Dusb=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E6=97=B6=E9=98=BB=E5=A1=9EGetOverlappedResult=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E8=A7=A6=E5=8F=91=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0?= =?UTF-8?q?=202021.6.20=09=E4=BF=AE=E6=94=B9G100/G200=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=96=B9=E5=BC=8F=E4=B8=BA=E5=B0=8F=E4=BA=8E?= =?UTF-8?q?240dpi=E5=A4=9A=E9=A1=B5=E7=BC=93=E5=AD=98=EF=BC=8C=E5=90=A6?= =?UTF-8?q?=E5=88=99=E5=8D=95=E9=A1=B5=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- huagao/CBrightnessPage.cpp | 2 +- huagao/CIndicatorDlg.cpp | 13 +- huagao/CIndicatorDlg.h | 4 +- huagao/CTwainUI.cpp | 20 +- huagao/CTwainUI.h | 3 +- huagao/Device/G400ScanConfig.cpp | 1 + huagao/Device/GScan.h | 18 +- huagao/Device/GScanO200.cpp | 147 +++++++++---- huagao/Device/GScanO200.h | 4 + huagao/Device/GScanO400.cpp | 234 +++++++++++++++------ huagao/Device/GScanO400.h | 4 + huagao/Device/IConfig.h | 1 + huagao/Device/ImageMatQueue.cpp | 111 +++++++++- huagao/Device/ImageMatQueue.h | 4 + huagao/Device/PublicFunc.cpp | 18 ++ huagao/Device/PublicFunc.h | 3 +- huagao/Device/UsbScanEx.cpp | 25 ++- huagao/Device/filetools.h | 52 +++++ huagao/Device/scn_config.cpp | 2 +- huagao/GscanJsonConfig.cpp | 13 +- huagao/ImageProcess/ImageApplyAutoCrop.cpp | 2 +- huagao/ImageProcess/ImageApplyChannel.cpp | 27 ++- huagao/huagaods.cpp | 110 +++++++--- huagao/huagaods.hpp | 2 +- huagao/huagaotwds.rc | Bin 42966 -> 42966 bytes huagao/stdafx.h | Bin 12044 -> 12040 bytes 26 files changed, 637 insertions(+), 183 deletions(-) diff --git a/huagao/CBrightnessPage.cpp b/huagao/CBrightnessPage.cpp index 146d2ca3..6fdf2bb1 100644 --- a/huagao/CBrightnessPage.cpp +++ b/huagao/CBrightnessPage.cpp @@ -44,7 +44,7 @@ BOOL CBrightnessPage::OnInitDialog() m_Edit_Brightness.SetValue(128); m_Edit_Contrast.SetSlideLink(this, IDC_SLIDER_CONTRAST); - m_Edit_Contrast.SetParams(1, 7, 6); + m_Edit_Contrast.SetParams(1, 7, 1); m_Edit_Contrast.SetValue(4); // setup third slider-edit box - floating point diff --git a/huagao/CIndicatorDlg.cpp b/huagao/CIndicatorDlg.cpp index 64ebbc1a..4611dada 100644 --- a/huagao/CIndicatorDlg.cpp +++ b/huagao/CIndicatorDlg.cpp @@ -38,6 +38,7 @@ BOOL CIndicatorDlg::OnInitDialog() BEGIN_MESSAGE_MAP(CIndicatorDlg, CDialogEx) ON_BN_CLICKED(IDC_BTNSTOPSCAN, &CIndicatorDlg::OnBnClickedBtnstopscan) + ON_WM_CLOSE() END_MESSAGE_MAP() @@ -47,7 +48,7 @@ END_MESSAGE_MAP() void CIndicatorDlg::setindicatortext(int aquire, int updata) { wchar_t text[260] = { 0 }; - _stprintf(text, L"扫描中,已扫描%d份文件,已上传%d张图片。", aquire,updata); + _stprintf(text, L"扫描\t\t\t\t%d\n上传\t\t\t\t%d", aquire,updata); GetDlgItem(IDC_STATIC)->SetWindowTextW(text); } @@ -57,3 +58,13 @@ void CIndicatorDlg::OnBnClickedBtnstopscan() if (m_stop) m_stop(); } + + +void CIndicatorDlg::OnClose() +{ + // TODO: 在此添加消息处理程序代码和/或调用默认值 + + if (m_stop) + m_stop(); + CDialogEx::OnClose(); +} diff --git a/huagao/CIndicatorDlg.h b/huagao/CIndicatorDlg.h index b98f1979..4a61b5f3 100644 --- a/huagao/CIndicatorDlg.h +++ b/huagao/CIndicatorDlg.h @@ -16,13 +16,13 @@ public: #ifdef AFX_DESIGN_TIME enum { IDD = IDD_INDICATOR }; #endif - protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() - afx_msg void OnBnClickedBtnstopscan(); std::function m_stop; +public: + afx_msg void OnClose(); }; diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 057ac251..1286d72b 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -82,10 +82,13 @@ BOOL CTwainUI::OnInitDialog() m_tabCtrl->AddSSLPage(_T("送纸"), nPageID++, m_pageFeedPaper.get()); CString title(m_confirmtitle.c_str()); this->GetDlgItem(IDC_CONFIRM)->SetWindowText(title); - UpdateUI(); UpdateListConfig(); dataChangeFunction(); + setvisable_size(false); +#ifdef G200 + setvisable_sleepmode(false); +#endif // G200 return true; } @@ -589,6 +592,21 @@ void CTwainUI::UpdateUi() m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(m_pageBasic->m_cmBoxColorMode->GetCurSel() == 0); } +void CTwainUI::setvisable_size(bool flag) +{ + m_pageBasic->GetDlgItem(IDC_CKBSIZEDETECT)->ShowWindow(flag?SW_SHOW:SW_HIDE); + if(!flag) + ((CButton*)m_pageBasic->GetDlgItem(IDC_CKBSIZEDETECT))->SetCheck(false); +} + +void CTwainUI::setvisable_sleepmode(bool flag) +{ + m_pageFeedPaper->GetDlgItem(IDC_STATICLOWPM)->ShowWindow(flag ? SW_SHOW : SW_HIDE); + m_pageFeedPaper->GetDlgItem(IDC_CBLOWPOWERMODE)->ShowWindow(flag ? SW_SHOW : SW_HIDE); + if (!flag) + ((CComboBox*)m_pageFeedPaper->GetDlgItem(IDC_CBLOWPOWERMODE))->SetCurSel(0); +} + void CTwainUI::EnableID_OKorID_Cancel(bool enable) { GetDlgItem(IDC_CONFIRM)->EnableWindow(enable); diff --git a/huagao/CTwainUI.h b/huagao/CTwainUI.h index f1ef380c..feb1e336 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -173,7 +173,8 @@ public: void UpdateListConfig(); void GetGScanCap(GScanCap& cap); void UpdateUi(); - + void setvisable_size(bool flag); + void setvisable_sleepmode(bool flag); void EnableID_OKorID_Cancel(bool enable); // 对话框数据 #ifdef AFX_DESIGN_TIME diff --git a/huagao/Device/G400ScanConfig.cpp b/huagao/Device/G400ScanConfig.cpp index 3eba6db6..064cf288 100644 --- a/huagao/Device/G400ScanConfig.cpp +++ b/huagao/Device/G400ScanConfig.cpp @@ -2,6 +2,7 @@ G400ScanConfig::G400ScanConfig(GScanCap& gcap) { + cfg = { 0 }; cfg.params.doubleFeeded = gcap.hardwarecaps.en_doublefeed == 0 ? 0 : 1; cfg.params.dpi = G400_DPI::G400_D200;//gcap.resolution_dst <= 200.0f ? G400_DPI::G400_D200 : (gcap.resolution_dst <= 300.0f ? G400_DPI::G400_D300 : G400_DPI::G400_D600); cfg.params.enableLed = 1; diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index 25ff8028..38339ffe 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -76,6 +76,8 @@ typedef enum tagUsbSupported { AQUIRE_IMAGE_TIMEOUT=76, //ȡͼƬɨƥ LOSE_IMAGE=77, + //usbȡݴ + USB_BULK_ERROR=78, //USB δ USB_DISCONNECTED = 200, //ûֹͣ @@ -92,7 +94,7 @@ static map msgs = { {UsbSupported::NO_FEED,"ֽ!ֽ!"}, {UsbSupported::FEED_IN_ERROR,"ֽʧ!ֽţ"}, {UsbSupported::PAPER_JAM,"ֽ!"}, - {UsbSupported::DETECT_DOUBLE_FEED,"˫"}, + {UsbSupported::DETECT_DOUBLE_FEED,"˫ţ˶ɨԾ"}, {UsbSupported::DETECT_STAPLE,"⵽!"}, {UsbSupported::PAPER_SKEW,"ֽб!ֽ!"}, {UsbSupported::COUNT_MODE,"ģʽ˳ģʽ!"}, @@ -103,7 +105,8 @@ static map msgs = { {UsbSupported::DOG_EAR,"⵽۽!"}, {UsbSupported::SIZE_ERROR,"쳣!"}, {UsbSupported::AQUIRE_IMAGE_TIMEOUT,"ȡͼʱ"}, - {UsbSupported::LOSE_IMAGE,"ϴͼƬɨƥ䣡"} + {UsbSupported::LOSE_IMAGE,"ϴͼƬɨƥ䣡"}, + {UsbSupported::USB_BULK_ERROR,"USBݶȡ"} }; enum tagEventIndex @@ -120,7 +123,9 @@ typedef void(*deviceevent_callback)(int eventID, void* userdata); class IScanner { public: - IScanner() { bFilterMsg = false; aquire_image_count = updata_image_count = updata_image_count = roller_num = lose_image_num= 0; } + IScanner() { + bFilterMsg = false; aquire_image_count = updata_image_count = updata_image_count = roller_num = lose_image_num = 0; is_AndroidOrLinux = false; + } virtual ~IScanner() { bFilterMsg = true; } void ResetMsgFiter() { bFilterMsg = true; } int get_aquire_image_count() { return aquire_image_count; }; @@ -136,12 +141,15 @@ public: virtual BOOL IsConnected() = 0; virtual std::string GetFWVersion() = 0; virtual std::string GetSerialNum() = 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; @@ -169,6 +177,8 @@ protected: std::string fwVersion; std::string SerialNum; std::string scannercode; + std::uint32_t MotorFpga; + std::uint32_t ScanFpga; std::function setindicatortext; int aquire_image_count; int updata_image_count; @@ -176,4 +186,6 @@ protected: int pixType; int lose_image_num; bool bFilterMsg; + bool is_AndroidOrLinux; + }; \ No newline at end of file diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index 7a419161..c25a52b4 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -145,7 +145,8 @@ typedef enum tagUsbKeyWords : UINT32 GScanO200::GScanO200() : huagods(NULL), image_num(0), - m_bread_fixed_ratio_fromDSP(false) + m_bread_fixed_ratio_fromDSP(false), + is_orginimgcount(true) { m_pImages.reset(new ImageMatQueue()); m_pImages->Getimagenumber = std::bind(&GScanO200::Getimagenumber,this, std::placeholders::_1); @@ -217,7 +218,7 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) { if (m_pImages->empty()) { DoEvents(); - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); if (sw.elapsed_s() > 30.00) { if (m_threadUsb && m_threadUsb->joinable()) { @@ -228,6 +229,9 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) } Stop_scan();//ֹͣɨ ResetScanner(); + auto rollernew = Get_Roller_num(); + if (get_aquire_image_count() != (rollernew - roller_num)) + set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count())); return HARDWARE_ERROR; } @@ -245,7 +249,7 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) //writelog("aquireed image " + to_string(++aqimgindex)); //FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "aquired procced image "+ to_string(++aqimgindex)); - + set_aquire_image_count(get_aquire_image_count(), get_updata_image_count() + 1); #ifdef LOG_NORMAL static int aquireindex = 0; FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex)); @@ -275,7 +279,7 @@ std::string GScanO200::GetFWVersion() 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"); + FileTools::writelog(log_ERROR,m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio"); updateHVRatio(); } return fwVersion; @@ -301,6 +305,34 @@ std::string GScanO200::GetSerialNum() return ""; } +std::uint32_t GScanO200::GetMotorFPGA() +{ + if (m_usb.get() && m_usb->is_connected()) + { + std::lock_guard lck(m_imgLocker); + USBCB usbcb = { GET_MOTORFPGA_VERSION,0,sizeof(MotorFpga) }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + m_usb->read_bulk(&usbcb, sizeof(usbcb)); + MotorFpga = usbcb.u32_Data; + return MotorFpga; + } + return 0; +} + +std::uint32_t GScanO200::GetScanFPGA() +{ + if (m_usb.get() && m_usb->is_connected()) + { + std::lock_guard lck(m_imgLocker); + USBCB usbcb = { GET_SCANFPGA_VERSION,0,4 }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + m_usb->read_bulk(&usbcb, sizeof(usbcb)); + ScanFpga = usbcb.u32_Data; + return ScanFpga; + } + return 0; +} + bool GScanO200::is_scan() { //std::lock_guard lck(m_imgLocker); @@ -327,12 +359,17 @@ BOOL GScanO200::Get_Scanner_PaperOn() int GScanO200::Get_Roller_num() { if (!(m_usb.get() && m_usb->is_open())) - return false; + return 0; USBCB usbcb = { GET_ROLLER_NUM ,0,4 }; std::lock_guard lck(m_imgLocker); m_usb->write_bulk(&usbcb, sizeof(usbcb)); std::this_thread::sleep_for(std::chrono::milliseconds(50)); m_usb->read_bulk(&usbcb, sizeof(usbcb)); + if (usbcb.u32_CMD != GET_ROLLER_NUM) + { + FileTools::writelog(log_ERROR, "get roller usb bulk error"); + } + FileTools::writelog(log_INFO, "get roller num " + to_string(usbcb.u32_Data)); return usbcb.u32_Data; } @@ -343,20 +380,7 @@ void GScanO200::config_params(GScanCap& params) gcap = params; UINT32 cfgdata = cfg.GetData(); USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 }; - //FileTools::write_log("ʼ·Ӳ ===>\n\tUSB config_params:" + to_string(cfgdata) + "\n\tpaper:" + to_string(cfgdata & 0x1f) - // + "\n\tcolor:" + to_string((cfgdata >> 5) & 0x1) - // + "\n\tdpi:" + to_string((cfgdata >> 6) & 0x3) - // + "\n\tdouble_feed_enbale:" + to_string((cfgdata >> 8) & 0x1) - // + "\n\tstable_enbale:" + to_string((cfgdata >> 9) & 0x1) - // + "\n\tscrew_detect_enable:" + to_string((cfgdata >> 10) & 0x1) - // + "\n\tscrew_detect_level:" + to_string((cfgdata >> 11) & 0x7) - // + "\n\tunused_one:" + to_string((cfgdata >> 14) & 0x3F) - // + "\n\tpc_correct:" + to_string((cfgdata >> 20) & 0x1) - // + "\n\tenable_sizecheck:" + to_string((cfgdata >> 21) & 0x1) - // + "\n\tenabledsp_cache:" + to_string((cfgdata >> 22) & 0x1) - // + "\n\tlowpowermode:" + to_string((cfgdata >> 23) & 0x7) - // + "\n\tunused_two:" + to_string((cfgdata >> 26) & 0x3f)); - FileTools::writelog(log_INFO, "config hardware param"); + FileTools::writelog(log_INFO, "config hardware param"+to_string(cfgdata)); m_usb->write_bulk(&usbcb, sizeof(USBCB)); this_thread::sleep_for(std::chrono::milliseconds(200)); m_pImages->setparam(params); @@ -365,12 +389,20 @@ void GScanO200::config_params(GScanCap& params) void GScanO200::Scanner_StartScan(UINT16 count) { - + if (fwVersion.size() > 1) + { + if ((atoi(fwVersion.substr(2, 6).c_str()) > 211132) && ((MotorFpga >= 25210514)&&(MotorFpga<100000000))) + is_orginimgcount = true; + else + is_orginimgcount = false; + } + roller_num = Get_Roller_num(); std::lock_guard lck(m_imgLocker); if (m_threadUsb && m_threadUsb->joinable()) { devState = DEV_STOP; m_threadUsb->join(); } + USBCB status = { GET_DSP_STATUS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) m_usb->write_bulk(&status, sizeof(status)); @@ -420,7 +452,7 @@ void GScanO200::Scanner_StartScan(UINT16 count) USBCB usbcb = { START_COMMAND,(UINT32)count ,0 }; if (m_usb.get() && m_usb->is_connected()) m_usb->write_bulk(&usbcb, sizeof(usbcb)); - this_thread::sleep_for(std::chrono::milliseconds(200)); + this_thread::sleep_for(std::chrono::milliseconds(500)); if (m_usb.get() && m_usb->is_connected()) { m_pImages->setscanflags(true); @@ -429,6 +461,11 @@ void GScanO200::Scanner_StartScan(UINT16 count) } } +int GScanO200::notifyscan() +{ + return -1; +} + void GScanO200::Stop_scan() { std::lock_guard lck(m_imgLocker); @@ -442,11 +479,17 @@ void GScanO200::ResetScanner() { if (!(m_usb.get() && m_usb->is_connected())) return; - roller_num = Get_Roller_num(); std::lock_guard lck(m_imgLocker); USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) m_usb->write_bulk(&usbcb, sizeof(usbcb)); + while (!m_pImages->m_imagepath.empty()) + { + string path = m_pImages->m_imagepath.front(); + if (isFileExist(path)) + remove(path.c_str()); + m_pImages->m_imagepath.pop(); + } } bool GScanO200::Get_IsImageQueueEmpty() @@ -581,7 +624,6 @@ void GScanO200::usbmain() break; } - if (sw.elapsed_ms() > 30000) { m_pImages->setscanflags(false); @@ -591,21 +633,21 @@ void GScanO200::usbmain() FileTools::writelog(log_ERROR, "USBmain aquire image timeout"); return; } - if(gcap.resolution_dst>200.0f) - { - if (m_pImages->orginimgcount() > 2) - { - this_thread::sleep_for(chrono::milliseconds(10)); - continue; - } - } - else { - if (m_pImages->orginimgcount() > 10) - { - this_thread::sleep_for(chrono::milliseconds(10)); - continue; - } - } + //if(gcap.resolution_dst>200.0f) + //{ + // if (m_pImages->orginimgcount() > 2) + // { + // this_thread::sleep_for(chrono::milliseconds(10)); + // continue; + // } + //} + //else { + // if ((m_pImages->orginimgcount() > 15)&&(is_orginimgcount)) + // { + // this_thread::sleep_for(chrono::milliseconds(10)); + // continue; + // } + //} USBCB usbcb = Get_Scanner_Status(); switch (usbcb.u32_Data) { @@ -619,9 +661,21 @@ void GScanO200::usbmain() FileTools::writelog(log_ERROR,"imgData->size() error send stop scan"); break; } - if(!m_pImages->get_isDogEar()) - m_pImages->pushMat(std::shared_ptr(new G200Decode(imgData))); m_usb->set_timeout(200); + //if(!m_pImages->get_isDogEar()) + // m_pImages->pushMat(std::shared_ptr(new G200Decode(imgData))); + //string path = cv::tempfile(); + m_pImages->m_data.push(imgData); + //string path = FileTools::get_appdata_path() + "image"+to_string(get_aquire_image_count())+".tmp"; + //if (!access(path.c_str(), 0)) + // remove(path.c_str()); + //FILE* fd = fopen(path.c_str(), "wb+"); + //if (fd) + //{ + // fwrite(imgData->data(), imgData->size(), 1, fd); + // fclose(fd); + // m_pImages->m_imagepath.push(path); + //} Pop_Image(); set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count()); FileTools::writelog(log_INFO, "ɨǽ"+to_string(get_aquire_image_count())+"ļ"); @@ -654,10 +708,15 @@ void GScanO200::usbmain() case PAPER_SKEW: case HARDWARE_ERROR: case PC_SCAN_BUSY_or_ERROR: - case SIZE_ERROR: { + case SIZE_ERROR: + case USB_BULK_ERROR: + { + if (usbcb.u32_Data == USB_BULK_ERROR) + Stop_scan(); Set_ErrorCode(usbcb.u32_Data); m_pImages->setscanflags(false); devState = DEV_WRONG; + std::this_thread::sleep_for(std::chrono::milliseconds(1500)); auto rollernew = Get_Roller_num(); if (get_aquire_image_count() != (rollernew - roller_num)) set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count())); @@ -693,7 +752,11 @@ USBCB GScanO200::Get_Scanner_Status() if (m_usb.get() && m_usb->is_connected()) m_usb->read_bulk(&usbcb, sizeof(usbcb)); - + if (usbcb.u32_CMD != GET_DSP_STATUS) + { + FileTools::writelog(log_ERROR, "get dsp status usb bulk error"); + return { NO_COMMAND,USB_BULK_ERROR,0 }; + } return usbcb; } diff --git a/huagao/Device/GScanO200.h b/huagao/Device/GScanO200.h index 801c775b..e7bf363b 100644 --- a/huagao/Device/GScanO200.h +++ b/huagao/Device/GScanO200.h @@ -15,11 +15,14 @@ public: virtual BOOL IsConnected() override; virtual std::string GetFWVersion() override; virtual std::string GetSerialNum() override; + virtual std::uint32_t GetMotorFPGA() override; + virtual std::uint32_t GetScanFPGA() override; virtual bool is_scan() override; virtual BOOL Get_Scanner_PaperOn() override; virtual int Get_Roller_num() override; virtual void config_params(GScanCap& params) override; virtual void Scanner_StartScan(UINT16 count) override; + virtual int notifyscan() override; virtual void Stop_scan() override; virtual void ResetScanner() override; virtual bool Get_IsImageQueueEmpty() override; @@ -45,6 +48,7 @@ private: void Pop_Image(); private: bool m_bread_fixed_ratio_fromDSP; + bool is_orginimgcount; std::shared_ptr m_usb; std::unique_ptr m_threadUsb; GScanCap gcap; diff --git a/huagao/Device/GScanO400.cpp b/huagao/Device/GScanO400.cpp index d2c7c7ba..1fa7de8b 100644 --- a/huagao/Device/GScanO400.cpp +++ b/huagao/Device/GScanO400.cpp @@ -195,11 +195,13 @@ void GScanO400::open(int vid, int pid) bool ret = m_usb->open(); USBCB status = { GET_DSP_STATUS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) - m_usb->write_bulk(&status, sizeof(status)); - - if (m_usb.get() && m_usb->is_connected()) - m_usb->read_bulk(&status, sizeof(status)); - + { + //m_usb->write_bulk(&status, sizeof(status)); + //m_usb->read_bulk(&status, sizeof(status)); + //std::this_thread::sleep_for(std::chrono::milliseconds(20)); + notifyscan(); + GetFWVersion(); + } } } @@ -226,7 +228,7 @@ int GScanO400::aquire_bmpdata(std::vector& bmpdata) devState = DEV_STOP; m_threadUsb->join(); m_threadUsb.reset(); - //writelog("aquire_bmpdata m_threadUsb.reset();"); + FileTools::writelog(log_ERROR,"aquire_bmpdata m_threadUsb.reset()"); } Stop_scan();//ֹͣɨ ResetScanner(); @@ -243,15 +245,7 @@ int GScanO400::aquire_bmpdata(std::vector& bmpdata) else { if (m_pImages->valid()) { bmpdata = *(m_pImages->popBmpdata()); - //static int aqimgindex = 0; - //writelog("aquireed image " + to_string(++aqimgindex)); - //FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "aquired procced image "+ to_string(++aqimgindex)); - - -#ifdef LOG_NORMAL - static int aquireindex = 0; - FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex)); -#endif // LOG + set_aquire_image_count(get_aquire_image_count(), get_updata_image_count() + 1); return 0; } DoEvents(); @@ -276,6 +270,10 @@ std::string GScanO400::GetFWVersion() if(m_usb.get()&&m_usb->is_connected()) m_usb->read_bulk(&fwVersion[0], fwVersion.size()); } + if (fwVersion.substr(0, 2) == "G3" || fwVersion.substr(0, 2) == "G4") + is_AndroidOrLinux = false; + else + is_AndroidOrLinux = true; return fwVersion; } return ""; @@ -299,6 +297,35 @@ std::string GScanO400::GetSerialNum() return ""; } +std::uint32_t GScanO400::GetMotorFPGA() +{ + if (m_usb.get() && m_usb->is_connected()) + { + std::lock_guard lck(m_imgLocker); + USBCB usbcb = { GET_MOTORFPGA_VERSION,0,sizeof(MotorFpga) }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + m_usb->read_bulk(&usbcb, sizeof(usbcb)); + MotorFpga = usbcb.u32_Data; + return MotorFpga; + } + return 0; +} + +std::uint32_t GScanO400::GetScanFPGA() +{ + if (m_usb.get() && m_usb->is_connected()) + { + std::lock_guard lck(m_imgLocker); + USBCB usbcb = { GET_SCANFPGA_VERSION,0,4 }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + m_usb->read_bulk(&usbcb, sizeof(usbcb)); + ScanFpga = usbcb.u32_Data; + return ScanFpga; + } + return 0; +} + + bool GScanO400::is_scan() { //std::lock_guard lck(m_imgLocker); @@ -339,6 +366,11 @@ int GScanO400::Get_Roller_num() std::lock_guard lck(m_imgLocker); m_usb->write_bulk(&usbcb, sizeof(usbcb)); m_usb->read_bulk(&usbcb, sizeof(usbcb)); + if (usbcb.u32_CMD != GET_ROLLER_NUM) + { + FileTools::writelog(log_ERROR, "get roller usb bulk error"); + } + FileTools::writelog(log_INFO, "get roller num " + to_string(usbcb.u32_Data)); return usbcb.u32_Data; } @@ -350,17 +382,7 @@ void GScanO400::config_params(GScanCap& params) gcap = params; UINT32 cfgdata = cfg.GetData(); USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 }; - //FileTools::write_log("ʼ·Ӳ ===> \n\tUSB config_params:"+to_string(cfgdata)+"\n\tpaper:"+to_string(cfgdata&0x1f) - // + "\n\tcolor:" + to_string((cfgdata>>5) & 0x1) - // + "\n\tdpi:" + to_string((cfgdata>>6) & 0x3) - // + "\n\tdouble_feed_enbale:" + to_string((cfgdata>>8) & 0x1) - // + "\n\tstable_enbale:" + to_string((cfgdata>>9) & 0x1) - // + "\n\tenableLed:" + to_string((cfgdata>>10) & 0x1) - // + "\n\treversed1:" + to_string((cfgdata>>11) & 0x3F) - // + "\n\tisCorrect:" + to_string((cfgdata>>17) & 0x1) - // + "\n\tdstHeight:" + to_string((cfgdata>>18) & 0xFF) - // + "\n\treversed2:" + to_string((cfgdata>>26) & 0x3F)); - FileTools::writelog(log_INFO, "config hardware param"); + FileTools::writelog(log_INFO, "config hardware param"+to_string(cfgdata)); m_usb->write_bulk(&usbcb, sizeof(USBCB)); this_thread::sleep_for(std::chrono::milliseconds(200)); m_pImages->setparam(params); @@ -369,7 +391,8 @@ void GScanO400::config_params(GScanCap& params) void GScanO400::Scanner_StartScan(UINT16 count) { - + scanfalg = false; + roller_num = Get_Roller_num(); std::lock_guard lck(m_imgLocker); if (m_threadUsb && m_threadUsb->joinable()) { devState = DEV_STOP; @@ -433,12 +456,41 @@ void GScanO400::Scanner_StartScan(UINT16 count) } } +int GScanO400::notifyscan() +{ + if (is_AndroidOrLinux) + return 2; + if (!m_usb.get() && !m_usb->is_connected()) + return -1; + USBCB notify = { 0x100,0,0 }; + m_usb->write_bulk(¬ify, sizeof(notify)); + m_usb->read_bulk(¬ify, sizeof(notify)); + if (notify.u32_Data == 0x100) + { + ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("ɨǴ״̬ڻѣ ʾ "), NULL, SW_HIDE); + auto now = std::chrono::system_clock::now(); + while (std::chrono::system_clock::now() < now + std::chrono::milliseconds(8000)) + { + DoEvents(); + } + ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("ɨǻɣ ʾ "), NULL, SW_HIDE); + return 1; + } + else if (notify.u32_Data == 0x10) + return 0; + return -1; +} + void GScanO400::Stop_scan() { std::lock_guard lck(m_imgLocker); USBCB usbcb = { STOP ,0,0 }; if (m_usb.get() && m_usb->is_connected()) + { m_usb->write_bulk(&usbcb, sizeof(usbcb)); + scanfalg = true; + FileTools::writelog(log_INFO, "user stop scan"); + } } @@ -446,7 +498,7 @@ void GScanO400::ResetScanner() { if (!(m_usb.get() && m_usb->is_connected())) return; - roller_num = Get_Roller_num(); + std::lock_guard lck(m_imgLocker); USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) @@ -462,7 +514,13 @@ void GScanO400::reset() { while (!m_pImages->empty()) m_pImages->clear(); - + while (!m_pImages->m_imagepath.empty()) + { + string path = m_pImages->m_imagepath.front(); + if (isFileExist(path)) + remove(path.c_str()); + m_pImages->m_imagepath.pop(); + } } void GScanO400::setdecodepixtype(int twpixtype) @@ -589,46 +647,68 @@ void GScanO400::usbmain() FileTools::writelog(log_ERROR, "USBmain aquire image timeout"); return; } - if(gcap.resolution_dst>200.0f) - { - if (m_pImages->orginimgcount() > 2) - { - this_thread::sleep_for(chrono::milliseconds(10)); - continue; - } - } - else { - if (m_pImages->orginimgcount() > 10) { - this_thread::sleep_for(chrono::milliseconds(10)); - continue; - } - } - + //if(gcap.resolution_dst>200.0f) + //{ + // if (m_pImages->orginimgcount() > 2) + // { + // this_thread::sleep_for(chrono::milliseconds(10)); + // continue; + // } + //} + //else { + // if (m_pImages->orginimgcount() > 10) { + // this_thread::sleep_for(chrono::milliseconds(10)); + // continue; + // } + //} USBCB usbcb = Get_Scanner_Status(); switch (usbcb.u32_Data) { case HAVE_IMAGE: { int totalNum = usbcb.u32_Count; + //if(is_AndroidOrLinux) + // m_usb->read_bulk(error_buf->data(), 512); + std::this_thread::sleep_for(std::chrono::milliseconds(20)); m_usb->set_timeout(2000); imgData = Get_Img_Data(totalNum); + m_usb->set_timeout(200); if (!imgData->size()) { Stop_scan(); FileTools::writelog(log_ERROR,"imgData->size() error"); break; } - if(!m_pImages->get_isDogEar()) - m_pImages->pushMat(std::shared_ptr(new G400Decode(imgData))); - m_usb->set_timeout(200); + FileTools::writelog(log_INFO, " get image data size " + to_string(totalNum)); + if (imgData->size() != totalNum) + { + FileTools::writelog(log_ERROR," get image data size error totalnum " + to_string(totalNum) + " imgdata size " + to_string(imgData->size())); + } + //if(!m_pImages->get_isDogEar()) + //m_pImages->pushMat(std::shared_ptr(new G400Decode(imgData))); + m_pImages->m_data.push(imgData); + //string path = FileTools::get_appdata_path() + "image"+to_string(get_aquire_image_count())+".tmp"; + //if (!access(path.c_str(), 0)) + // remove(path.c_str()); + //FILE* fd = fopen(path.c_str(), "wb+"); + //if (fd) + //{ + // if ((*imgData)[0] != -1 && (*imgData)[1] != -40 && (*imgData)[2] != -1 && (*imgData)[3] != -32) + // fwrite(imgData->data() + 12, imgData->size() - 12, 1, fd); + // else + // fwrite(imgData->data(), imgData->size(), 1, fd); + // fclose(fd); + // m_pImages->m_imagepath.push(path); + //} set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count()); - FileTools::writelog(log_INFO, "ɨǽ" + to_string(get_aquire_image_count()) + "ļ"); - Pop_Image(); + if(!is_AndroidOrLinux) + Pop_Image(); + FileTools::writelog(log_INFO, "ɨǽ" + to_string(get_aquire_image_count()) + "ļʱ "+to_string(sw.elapsed_ms())); sw.reset(); break; } case STOP_SCAN: { m_pImages->setscanflags(false); - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + std::this_thread::sleep_for(std::chrono::milliseconds(1500)); auto rollernew = Get_Roller_num(); if (get_aquire_image_count() != (rollernew - roller_num)) { @@ -653,17 +733,28 @@ void GScanO400::usbmain() case HARDWARE_ERROR: case PC_SCAN_BUSY_or_ERROR: case SIZE_ERROR: + case USB_BULK_ERROR: if (!haveError) { - haveError = true; - devState = DEV_WRONG; - m_pImages->setscanflags(false); - Set_ErrorCode(usbcb.u32_Data); - auto rollernew = Get_Roller_num(); - if (get_aquire_image_count() != (rollernew - roller_num)) - set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count())); + //if (is_AndroidOrLinux) + //{ + haveError = true; + Set_ErrorCode(usbcb.u32_Data); + //} + //else + //{ + // haveError = true; + // devState = DEV_WRONG; + // m_pImages->setscanflags(false); + // Set_ErrorCode(usbcb.u32_Data); + // std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + // auto rollernew = Get_Roller_num(); + // if (get_aquire_image_count() != (rollernew - roller_num)) + // set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count())); + //} if (huagods) dev_callback(usbcb.u32_Data, huagods); + } break; case NORMAL: @@ -690,13 +781,23 @@ USBCB GScanO400::Get_Scanner_Status() if (!(m_usb.get() && m_usb->is_connected())) { return { NO_COMMAND ,PC_SCAN_BUSY_or_ERROR ,0 }; } - USBCB usbcb = { GET_DSP_STATUS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) m_usb->write_bulk(&usbcb, sizeof(usbcb)); if (m_usb.get() && m_usb->is_connected()) m_usb->read_bulk(&usbcb, sizeof(usbcb)); - + if (usbcb.u32_CMD != GET_DSP_STATUS) + { + std::this_thread::sleep_for(std::chrono::microseconds(50)); + if (m_usb.get() && m_usb->is_connected()) + m_usb->read_bulk(&usbcb, 512); + if (m_usb.get() && m_usb->is_connected()) + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + if (m_usb.get() && m_usb->is_connected()) + m_usb->read_bulk(&usbcb, 512); + FileTools::writelog(log_ERROR, "get dsp status error"); + return { NO_COMMAND,USB_BULK_ERROR,0 }; + } return usbcb; } @@ -708,7 +809,7 @@ std::shared_ptr> GScanO400::Get_Img_Data(int bufferSize) return std::shared_ptr>(new std::vector()); std::shared_ptr> imData(new std::vector(bufferSize)); - StopWatch sw; + /*StopWatch sw; int readed = 0; USBCB usbcb = { GET_IMAGE,0,bufferSize }; m_usb->write_bulk(&usbcb, sizeof(usbcb)); @@ -727,8 +828,19 @@ std::shared_ptr> GScanO400::Get_Img_Data(int bufferSize) int tt = m_usb->read_bulk(imData->data() + startindex, dstlength); startindex += dstlength; + }*/ + StopWatch sw; + int readed = 0; + USBCB usbcb = { GET_IMAGE,0,bufferSize }; + m_usb->write_bulk(&usbcb, sizeof(usbcb)); + int totalength = 1024 * 1024; + int startindex = 0; + std::this_thread::sleep_for(std::chrono::microseconds(20)); + while (startindex < bufferSize) + { + startindex += m_usb->read_bulk(imData->data() + startindex, (bufferSize - startindex) < totalength ? (bufferSize - startindex) : totalength); //ݽСڵڹܵʧ + std::this_thread::sleep_for(std::chrono::microseconds(10)); } - if (sw.elapsed_ms() > 5000) { FileTools::writelog(log_ERROR,"Usb read data timeout\n"); diff --git a/huagao/Device/GScanO400.h b/huagao/Device/GScanO400.h index 08ced645..681fcb0e 100644 --- a/huagao/Device/GScanO400.h +++ b/huagao/Device/GScanO400.h @@ -15,11 +15,14 @@ public: virtual BOOL IsConnected() override; virtual std::string GetFWVersion() override; virtual std::string GetSerialNum() override; + virtual std::uint32_t GetMotorFPGA() override; + virtual std::uint32_t GetScanFPGA() override; virtual bool is_scan() override; virtual BOOL Get_Scanner_PaperOn() override; virtual int Get_Roller_num() override; virtual void config_params(GScanCap& params) override; virtual void Scanner_StartScan(UINT16 count) override; + virtual int notifyscan() override; virtual void Stop_scan() override; virtual void ResetScanner() override; virtual bool Get_IsImageQueueEmpty() override; @@ -49,6 +52,7 @@ private: std::unique_ptr m_threadUsb; GScanCap gcap; volatile int image_num; + volatile bool scanfalg; void* huagods; deviceevent_callback dev_callback; }; diff --git a/huagao/Device/IConfig.h b/huagao/Device/IConfig.h index 35b747ce..90e019c2 100644 --- a/huagao/Device/IConfig.h +++ b/huagao/Device/IConfig.h @@ -74,6 +74,7 @@ static std::map SupPaperTyps = { {{TwSS::None,PaperAlign::Rot0},G400_A3}, #endif {{TwSS::MaxSize,PaperAlign::Rot0},G400_LONGLETTER}, + {{TwSS::USStatement,PaperAlign::Rot0},G400_LONGLETTER}, {{TwSS::Trigeminy,PaperAlign::Rot0},G400_LONGLETTER}, #endif }; diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index 1bf6f896..8aa62980 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -321,7 +321,8 @@ void ImageMatQueue::PaniusCount() bool ImageMatQueue::empty() { - return atm_orgin_image_remains <= 0 && m_imagedata.Size() == 0 && !is_scanning; + //return atm_orgin_image_remains <= 0 && m_imagedata.Size() == 0 && !is_scanning; + return m_imagepath.empty()&&(m_imagedata.Size()==0 )&& !is_scanning&&m_data.empty(); } bool ImageMatQueue::queuesempty() @@ -335,18 +336,106 @@ void ImageMatQueue::proc() //int dwnumber = std::thread::thread::hardware_concurrency(); //std::unique_ptr m_threadpool; //m_threadpool.reset(new ThreadPool(dwnumber < 4 ? 1 : dwnumber / 2)); + std::ios::sync_with_stdio(false); while (bRun) { while (m_imagedata.Size() > 0) { this_thread::sleep_for(chrono::milliseconds(1)); } - if (m_rawBuffs.Size() == 0) + //if (m_rawBuffs.Size() == 0) + //{ + // this_thread::sleep_for(chrono::milliseconds(1)); + // continue; + //} + //if (m_imagepath.empty()) + //{ + // this_thread::sleep_for(chrono::milliseconds(1)); + // continue; + //} + if (m_data.empty()) { this_thread::sleep_for(chrono::milliseconds(1)); continue; } - auto& buffs = m_rawBuffs.Take()->getImageBuffs(); + if (m_data.size() > 0) + { + string path = FileTools::get_appdata_path() + "image" + to_string(index++) + ".tmp"; + if (!access(path.c_str(), 0)) + remove(path.c_str()); + auto buff = m_data.front(); + //if (!fw.get()) + // fw.reset(new fstream()); + //fw->open(path, std::ios::binary | std::ios::out); + //if (fw->is_open()) + //{ + // if ((*buff)[0] != -1 && (*buff)[1] != -40 && (*buff)[2] != -1 && (*buff)[3] != -32) + // { + // fw->write(buff->data() + 12, buff->size() - 12); + // FileTools::writelog(log_ERROR, "usb data error -image data"); + // } + // else + // fw->write(buff->data(), buff->size()); + // fw->flush(); + // fw->close(); + // m_imagepath.push(path); + // buff.reset(); m_data.pop(); + // fw.reset(); + //} + + CFile frb; + if (frb.Open(CString(path.c_str()), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary)) + { + if ((*buff)[0] != -1 && (*buff)[1] != -40 && (*buff)[2] != -1 && (*buff)[3] != -32) + { + frb.Write(buff->data() + 12, buff->size() - 12); + FileTools::writelog(log_ERROR, "usb data error -image data"); + } + else + frb.Write(buff->data(), buff->size()); + frb.Flush(); + frb.Close(); + m_imagepath.push(path); + buff.reset(); m_data.pop(); + } + } + + std::string path = m_imagepath.front(); + long lenght= FileTools::get_file_size(path.c_str()); + std::shared_ptr> buf(new std::vector); + buf->resize(lenght); + StopWatch sw; + if (!access(path.c_str(),0)) + { + //if (!fr.get()) + // fr.reset(new fstream()); + //fr->open(path, std::ios::binary | std::ios::in); + //if (fr->is_open()) + //{ + // fr->read(buf->data(), lenght); + // fr->close(); + // fr.reset(); + // remove(path.c_str()); + //} + CFile fwb; + if (fwb.Open(CString(path.c_str()), CFile::modeRead |CFile::typeBinary)) + { + fwb.Read(buf->data(), lenght); + fwb.Close(); + remove(path.c_str()); + } + } + else + FileTools::writelog(log_ERROR, "open file error filename:" + path); + FileTools::writelog(log_INFO, " ȡͼƬݺʱ " + to_string(sw.elapsed_ms())+" data size "+to_string(lenght)); + sw.reset(); +#ifdef G200 + auto& buffs = G200Decode(buf).getImageBuffs(); +#else + auto& buffs = G400Decode(buf).getImageBuffs(); +#endif // G200 + + //auto& buffs = m_rawBuffs.Take()->getImageBuffs(); if (!m_rawBuffs.IsShutDown() && !buffs.empty()) { //m_threadpool->enqueue(&ImageMatQueue::imageproceing, this, buffs); //try { @@ -356,8 +445,10 @@ void ImageMatQueue::proc() //{ // FileTools::writelog(log_ERROR, " image proc error " + std::string(e.what())); //} - imageproceing(buffs); + imageproceing(buffs); + } + m_imagepath.pop(); } //m_threadpool.reset(); } @@ -379,10 +470,10 @@ void ImageMatQueue::imageproceing(std::vector> try { cv::Mat mat = cv::imdecode(*buf, rmc); - buf.reset(); if (mat.empty()) { FileTools::writelog(log_ERROR,"decode image data error"); } + buf.reset(); #ifdef G200 cv::resize(mat, mat, cv::Size(), fx, fy);//ܻСƥ ϵ׶ mats.push_back(mat); @@ -405,6 +496,12 @@ void ImageMatQueue::imageproceing(std::vector> } } buffs.clear(); + if (mats[0].empty() || mats[1].empty()) + { + mats.clear(); + PaniusCount(); + return; + } //DogEar_index++; //ʱ 2021.3.18 //StopWatch sw; //sw.reset(); @@ -421,17 +518,17 @@ void ImageMatQueue::imageproceing(std::vector> // } //} //FileTools::write_log("1.txt", " dogear time " + to_string(sw.elapsed_ms())); - static int index = 0; if (scanParam.is_switchfrontback) swap(mats[0], mats[1]); if (scanParam.en_fold != 0) { cv::flip(mats[0], mats[0], 1); cv::flip(mats[0], mats[0], 0); } + StopWatch sw; for (int j = 0; j < m_iaList.size(); j++) { m_iaList[j]->apply(mats, scanParam.is_duplex); } - + FileTools::writelog(log_INFO, "ͼʱ " + to_string(sw.elapsed_ms())); for (int i = 0; i < mats.size(); i++) { if (!scanParam.is_duplex && i == 1) { mats[i].release(); diff --git a/huagao/Device/ImageMatQueue.h b/huagao/Device/ImageMatQueue.h index 2ef31541..f585e6b2 100644 --- a/huagao/Device/ImageMatQueue.h +++ b/huagao/Device/ImageMatQueue.h @@ -174,6 +174,8 @@ public: void updatefixratio(float& hratio, float& vratio); std::function DogEarDetection_callback; std::function Getimagenumber; + std::queue m_imagepath; + std::queue>> m_data; private: void proc(); void imageproceing(std::vector>>& buffs); @@ -187,6 +189,8 @@ private: volatile bool bRun; volatile int atm_orgin_image_remains; volatile bool is_scanning; + std::unique_ptr fw; + std::unique_ptr fr; GScanCap scanParam; Device::PaperSize papersize; std::shared_ptr m_dogear; diff --git a/huagao/Device/PublicFunc.cpp b/huagao/Device/PublicFunc.cpp index 9ba54cc8..66dd63e4 100644 --- a/huagao/Device/PublicFunc.cpp +++ b/huagao/Device/PublicFunc.cpp @@ -388,6 +388,7 @@ std::string TCHAR2STRING(TCHAR* STR) char* chRtn = new char[iLen * sizeof(char)]; WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL); std::string str(chRtn); + delete[]chRtn; return str; } @@ -426,6 +427,23 @@ std::string StringToUtf(std::string strValue) return retStr; } +char* GBKToUTF8(const char* chGBK) +{ + DWORD dWideBufSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)chGBK, -1, NULL, 0); + wchar_t* pWideBuf = new wchar_t[dWideBufSize]; + wmemset(pWideBuf, 0, dWideBufSize); + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)chGBK, -1, pWideBuf, dWideBufSize); + + DWORD dUTF8BufSize = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pWideBuf, -1, NULL, 0, NULL, NULL); + + char* pUTF8Buf = new char[dUTF8BufSize]; + memset(pUTF8Buf, 0, dUTF8BufSize); + WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pWideBuf, -1, pUTF8Buf, dUTF8BufSize, NULL, NULL); + + delete[]pWideBuf; + return pUTF8Buf; +} + int GetContrastLevel(float contrast) { int ret = 4; if (contrast >= -1000.0f && contrast < -666.0f) { ret = 1; } diff --git a/huagao/Device/PublicFunc.h b/huagao/Device/PublicFunc.h index 512371a3..901c1470 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -278,7 +278,7 @@ enum G400_PaperSize { G400_LEGAL, G400_LETTER, G400_LETTERR, - G400_LONGLETTER + G400_LONGLETTER=17, }; enum G400_DPI { @@ -311,6 +311,7 @@ HBITMAP SetButtonStaticBkBmp(HINSTANCE hInst, HWND hWin, UINT id, UINT iamge_id) void writelog(std::string msg); std::string TCHAR2STRING(TCHAR* STR); float GetContrast(int level); +char* GBKToUTF8(const char* chGBK); int GetMappingBrightnessValue(float in); int GetMappingContrastValue(float in); int GetContrastLevel(float contrast); diff --git a/huagao/Device/UsbScanEx.cpp b/huagao/Device/UsbScanEx.cpp index acbacd53..42ac63b8 100644 --- a/huagao/Device/UsbScanEx.cpp +++ b/huagao/Device/UsbScanEx.cpp @@ -2,7 +2,7 @@ #include "UsbScanEx.h" #include #include -#include "filetools.h" +//#include "filetools.h" UsbScanEx::UsbScanEx(int index) { @@ -80,7 +80,7 @@ bool UsbScanEx::open() CloseHandle(m_h_dev); m_h_dev = INVALID_HANDLE_VALUE; } - FileTools::writelog(log_lv::log_INFO,"USB Open!"); + //FileTools::writelog(log_lv::log_INFO,"USB Open!"); return m_h_dev; } @@ -133,7 +133,7 @@ bool UsbScanEx::close() } } m_b_is_connected = FALSE; - FileTools::writelog(log_lv::log_INFO,"USB Close!"); + //FileTools::writelog(log_lv::log_INFO,"USB Close!"); return b_ret; } @@ -156,8 +156,9 @@ int UsbScanEx::read_bulk(void* data, int len) if (m_h_dev != NULL) { b_ret = ReadFile(h_pipe, data, len, &pdw_ret, lp_overlap); - + //b_ret = GetOverlappedResult(h_pipe, lp_overlap, &pdw_ret, TRUE); if (b_ret) { + FlushFileBuffers(h_pipe); return pdw_ret; } else { @@ -170,13 +171,13 @@ int UsbScanEx::read_bulk(void* data, int len) case ERROR_FILE_NOT_FOUND: case ERROR_ACCESS_DENIED: m_b_is_connected = false; - FileTools::writelog(log_lv::log_WARN, "errorcode =" + std::to_string(error_code)); + //FileTools::writelog(log_lv::log_WARN, "errorcode =" + std::to_string(error_code)); if (hotplug_call) { hotplug_call(true, usrdata); } break; default: - FileTools::writelog(log_INFO,"Usb read_bulk error code : " + std::to_string(error_code)); + //FileTools::writelog(log_INFO,"Usb read_bulk error code : " + std::to_string(error_code)); break; } } @@ -194,12 +195,15 @@ int UsbScanEx::write_bulk(void* data, int len) if (m_h_dev == INVALID_HANDLE_VALUE) return TRUE; b_ret = WriteFile(h_pipe, p_data, dw_size, &dw_size, lp_overlap); + //b_ret = GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE); if (b_ret) { + FlushFileBuffers(h_pipe); return dw_size; } else { - int errorcode = GetLastError(); - switch (errorcode) + //int errorcode = GetLastError(); + //switch (errorcode) + switch (GetLastError()) { case ERROR_IO_PENDING: GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE); @@ -207,13 +211,13 @@ int UsbScanEx::write_bulk(void* data, int len) case ERROR_FILE_NOT_FOUND: case ERROR_ACCESS_DENIED: m_b_is_connected = false; - FileTools::writelog(log_lv::log_WARN,"errorcode ="+ std::to_string(errorcode)); + //FileTools::writelog(log_lv::log_WARN,"errorcode ="+ std::to_string(errorcode)); if (hotplug_call) { hotplug_call(true, usrdata); } break; default: - FileTools::writelog(log_INFO,"Usb write_bulk error code: " + std::to_string(errorcode)); + //FileTools::writelog(log_INFO,"Usb write_bulk error code: " + std::to_string(errorcode)); break; } } @@ -280,7 +284,6 @@ int UsbScanEx::read_int(void* data, int len) case ERROR_FILE_NOT_FOUND: m_b_is_connected = false; - FileTools::writelog(log_lv::log_ERROR,"USB connection error: ERROR_FILE_NOT_FOUND"); if (hotplug_call) { hotplug_call(true, usrdata); } diff --git a/huagao/Device/filetools.h b/huagao/Device/filetools.h index 22275c4b..c9a8d12f 100644 --- a/huagao/Device/filetools.h +++ b/huagao/Device/filetools.h @@ -2,7 +2,9 @@ #include #include #include +#include #include +#include #include #include "PublicFunc.h" @@ -117,6 +119,56 @@ public: _tcscat(szIniFile, TWAIN_LOG_NAME); writelog(std::wstring(szIniFile), log_lv::log_ERROR, log); } + + static std::string get_appdata_path() + { + TCHAR szIniFile[MAX_PATH] = { 0 }; + SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_LOCAL_APPDATA, TRUE); + _tcscat(szIniFile, HUAGAO_SCAN); + _tcscat(szIniFile, L"\\temp\\"); + std::string path= TCHAR2STRING(szIniFile); + if (!isFolderExist(path.data())) + createDirectory(path.data()); + return path; + } + + static void deletedir(CString szPath) + { + CFileFind ff; + if (szPath.Right(1) != "\\") + szPath += "\\"; + szPath += "*.*"; + BOOL res = ff.FindFile(szPath); + while (res) + { + res = ff.FindNextFile(); + auto x = ff.GetFilePath(); + if (!ff.IsDots() && !ff.IsDirectory())//ļʱֱɾ + DeleteFile(ff.GetFilePath()); + else if (ff.IsDots()) + continue; + else if (ff.IsDirectory()) + { + szPath = ff.GetFilePath(); + deletedir(szPath.GetBuffer());//Ŀ¼ʱݹ飬ɾĿ¼µļ + RemoveDirectory(szPath);//Ŀ¼ΪպɾĿ¼ + } + } + RemoveDirectory(szPath);//ɾĿ¼ + } + + static unsigned long get_file_size(const char* path) + { + unsigned long filesize = -1; + struct stat statbuff; + if (stat(path, &statbuff) < 0) { + return filesize; + } + else { + filesize = statbuff.st_size; + } + return filesize; + } private: static void getFiles(std::string path, std::vector& files) { diff --git a/huagao/Device/scn_config.cpp b/huagao/Device/scn_config.cpp index f2e234bd..6370f0ca 100644 --- a/huagao/Device/scn_config.cpp +++ b/huagao/Device/scn_config.cpp @@ -25,7 +25,7 @@ hgConfigClass::hgConfigClass(GScanCap param) m_param.lowpowermode = (byte)param.hardwarecaps.lowpowermode; m_param.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0; m_param.unused_one = m_param.sizeerror_errorratio = 0; - m_param.enabledsp_cache = param.resolution_dst >= 240.0f?1:0; + param.resolution_dst >= 240.0f ? 1 : 0; } bool hgConfigClass::ContainspaperTypesKey(PaperStatus key) diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index 84b7f01f..930dcb6a 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -681,17 +681,18 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str void GscanJsonConfig::SaveGscancapJson(GScanCap cap, std::string path) { + cap.SavePath = cap.Caption = ""; json js = GscancapToJson(cap); std::ofstream of; try { - of.open(path, std::ios::out); - of.write(js.dump().c_str(), js.dump().size()); + of.open(path, std::ios::out|std::ios::binary); + of.write(js.dump().data(), js.dump().size()); of.close(); } - catch (...) { + catch (std::exception &e) { if (of.is_open()) of.close(); - FileTools::writelog(log_ERROR, "save json error"); + FileTools::writelog(log_ERROR, "save json error :"+std::string(e.what())); } } @@ -742,7 +743,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap) js[CONFIG][AUTOCROP_THRESHOLD] = cap.AutoCrop_threshold; js[CONFIG][ISCONVEX] = cap.is_convex; js[CONFIG][ITEMCAPTION] = cap.Caption; - js[CONFIG][SAVEPATH] = cap.SavePath; + js[CONFIG][SAVEPATH] = cap.SavePath.c_str(); js[CONFIG][LOWPOWERMODE] = cap.hardwarecaps.lowpowermode; return js; } @@ -856,7 +857,7 @@ json GscanJsonConfig::GetDefaultJson() json GscanJsonConfig::Readjson(std::string path) { std::ifstream f; - f.open(path, std::ios::in); + f.open(path, std::ios::in|std::ios::binary); json js; try { if(f.is_open()){ diff --git a/huagao/ImageProcess/ImageApplyAutoCrop.cpp b/huagao/ImageProcess/ImageApplyAutoCrop.cpp index 8df60464..ec433521 100644 --- a/huagao/ImageProcess/ImageApplyAutoCrop.cpp +++ b/huagao/ImageProcess/ImageApplyAutoCrop.cpp @@ -8,7 +8,7 @@ CImageApplyAutoCrop::CImageApplyAutoCrop() , m_isConvexHull(true) , m_isFillColor(false) , m_threshold(40) - , m_noise(2) + , m_noise(8) , m_indent(5) { } diff --git a/huagao/ImageProcess/ImageApplyChannel.cpp b/huagao/ImageProcess/ImageApplyChannel.cpp index 6cb01173..bc0ff8e6 100644 --- a/huagao/ImageProcess/ImageApplyChannel.cpp +++ b/huagao/ImageProcess/ImageApplyChannel.cpp @@ -73,31 +73,30 @@ void CImageApplyChannel::apply(std::vector& mats, bool isTwoSide) void CImageApplyChannel::except_channel(const cv::Mat & src, cv::Mat & dst, int channel) { - int rows = static_cast(src.total()); - cv::Mat src_temp(rows, 3, CV_8UC1, src.data); - cv::Mat dst_temp(rows, 1, CV_8UC1, dst.data); - - cv::Mat temp1, temp2; + cv::Mat mv[3]; + cv::split(src, mv); + cv::Mat mask, mask1, mask2; switch (channel) { case 0: - temp1 = src_temp(cv::Rect(1, 0, 1, rows)); - temp2 = src_temp(cv::Rect(2, 0, 1, rows)); - cv::addWeighted(temp1, 0.587, temp2, 0.299, 0, dst_temp); + mask1 = mv[0] - mv[1]; + mask2 = mv[0] - mv[2]; break; case 1: - temp1 = src_temp(cv::Rect(0, 0, 1, rows)); - temp2 = src_temp(cv::Rect(2, 0, 1, rows)); - cv::addWeighted(temp1, 0.114, temp2, 0.299, 0, dst_temp); + mask1 = mv[1] - mv[0]; + mask2 = mv[1] - mv[2]; break; case 2: - temp1 = src_temp(cv::Rect(0, 0, 1, rows)); - temp2 = src_temp(cv::Rect(1, 0, 1, rows)); - cv::addWeighted(temp1, 0.114, temp2, 0.587, 0, dst_temp); + mask1 = mv[2] - mv[1]; + mask2 = mv[2] - mv[0]; break; default: break; } + cv::min(mask1, mask2, mask); + + cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY); + dst -= mask; } void CImageApplyChannel::colourless(const cv::Mat &src, cv::Mat &dst, uchar threshold) diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index 9d55c516..502d1b7d 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -87,7 +87,7 @@ using namespace std::placeholders; TWPP_ENTRY_MFC(HuagaoDs) static constexpr const Identity srcIdent( - Version(3, 3, Language::English, Country::China, "v3.3.4.3"), + Version(3, 3, Language::English, Country::China, "v3.3.5.0"), DataGroup::Image, #ifdef MAKEHUAGAO "HUAGO", @@ -337,24 +337,36 @@ HuagaoDs::HuagaoDs() //})); } -void HuagaoDs::showmsg(std::string caption, std::string text) +void HuagaoDs::showmsg(std::string caption, std::string text, int retcode) { if (scanner.get()) { - if (scanner->get_lose_image_num() != 0) - { - text += "ֽɨ" + to_string(scanner->get_lose_image_num()) + "ݣ"; + int losemun = scanner->get_lose_image_num(); + int num = 0; + if ((retcode == 64 || retcode == 8 || retcode == 16) && losemun > 0) + losemun--; + if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) + { + if (m_scanparam->is_duplex && m_scanparam->en_fold && m_scanparam->multi_output_red) + num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count(); + else if (m_scanparam->is_duplex && m_scanparam->en_fold) + num = scanner->get_aquire_image_count() - scanner->get_updata_image_count(); + else if (m_scanparam->is_duplex && m_scanparam->multi_output_red) + num = scanner->get_aquire_image_count() * 4 - scanner->get_updata_image_count(); + else if ((!m_scanparam->is_duplex) && m_scanparam->multi_output_red) + num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count(); + else if (!m_scanparam->is_duplex) + num = scanner->get_aquire_image_count() - scanner->get_updata_image_count(); + else + num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count(); + } + if ((losemun != 0) || (num != 0)) { + text += "ֽ"+to_string(scanner->get_lose_image_num()+scanner->get_aquire_image_count())+ + "ɨ"+to_string(scanner->get_aquire_image_count()) +"ϴ"+to_string(scanner->get_updata_image_count())+ + "ɨ"+to_string(losemun) + "ļϴ"+to_string(num)+"ļ"; scanner->set_lose_image_num(0); } } ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text+" "+caption).c_str()), NULL, SW_HIDE); - //if (!msgbox.get()) - //{ - // msgbox.reset(new Cmsgbox()); - // msgbox->Create(IDD_DIAMSGBOX); - //} - //msgbox->setwindowstext(CString(caption.c_str()), CString(text.c_str())); - //::SetWindowPos(msgbox->GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - //ShowWindow(msgbox->GetSafeHwnd(), SW_SHOWNORMAL); } HuagaoDs::~HuagaoDs() @@ -767,7 +779,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) { showmsg("", msgs[(UsbSupported)202]); return { ReturnCode::Failure, ConditionCode::CapBadOperation }; } - auto usblist= UsbScan_List::find_all_usb(); if (!usblist.empty()) { @@ -824,7 +835,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) { scanner->regist_deviceevent_callback(DeviceEvent_callback, this); scanner->DogEar_callback(std::bind(&HuagaoDs::dogear_callback, this, std::placeholders::_1)); } - //MessageBox(NULL, L"2", L"", 0); // init caps // there are caps a minimal source must support @@ -1802,12 +1812,33 @@ Result HuagaoDs::identityOpenDs(const Identity&) { //˫ż ٷ׼ Э޸Ϊbool Уʹboolͣʹñ׼twainЭ m_query[CapType::DoubleFeedDetection] = msgSupportGetAllSetReset; m_caps[CapType::DoubleFeedDetection] = [this](Msg msg, Capability& data)->Result { - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.en_doublefeed = mech ? 1 : 0; + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration(CapType::DoubleFeedDetection, { 0 }, m_scanparam->hardwarecaps.en_doublefeed ? 0 : 1, 0); + return { ReturnCode::Success, ConditionCode::Success }; + case Msg::GetCurrent: + data = Capability::createOneValue(CapType::DoubleFeedDetection, (UInt16)m_scanparam->hardwarecaps.en_doublefeed ? 0 : 1); + return { ReturnCode::Success, ConditionCode::Success }; + case Msg::Reset: + case Msg::GetDefault: + m_scanparam->hardwarecaps.en_doublefeed = 1; + data = Capability::createOneValue(CapType::DoubleFeedDetection, 0); + return { ReturnCode::Success, ConditionCode::Success }; + case Msg::Set: { + auto mech = data.currentItem(); + m_scanparam->hardwarecaps.en_doublefeed = mech ? 0 : 1; return success(); } - return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE); + + default: + return { ReturnCode::Failure, ConditionCode::CapBadOperation }; + } + /*if (Msg::Set == msg) { + auto mech = data.currentItem(); + m_scanparam->hardwarecaps.en_doublefeed = mech ? 0 : 1; + return success(); + } + return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE);*/ }; #ifdef G200 @@ -1868,19 +1899,38 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { scanner->Set_ErrorCode(0); if (guiIndicator->GetSafeHwnd()) guiIndicator->ShowWindow(SW_HIDE); - //if (guiIndicator.get()) - // guiIndicator.reset(); - //guiIndicator->ShowWindow(SW_HIDE); if (ret != -1) { - //CString str; - //str.Format(_T("%d"), ret); - //ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), str, NULL, SW_HIDE); - showmsg("", msgs[(UsbSupported)ret]); + showmsg("", msgs[(UsbSupported)ret],ret); FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]); #ifndef G200 scanner->clear_hwerror(); #endif // G200 } + else + { + if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) + { + int num = 0; + if (m_scanparam->is_duplex && m_scanparam->en_fold && m_scanparam->multi_output_red) + num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count(); + else if (m_scanparam->is_duplex && m_scanparam->en_fold) + num = scanner->get_aquire_image_count() - scanner->get_updata_image_count(); + else if (m_scanparam->is_duplex && m_scanparam->multi_output_red) + num = scanner->get_aquire_image_count() * 4 - scanner->get_updata_image_count(); + else if ((!m_scanparam->is_duplex) && m_scanparam->multi_output_red) + num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count(); + else if (!m_scanparam->is_duplex) + num = scanner->get_aquire_image_count() - scanner->get_updata_image_count(); + else + num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count(); + if (num != 0) + { + showmsg("", msgs[LOSE_IMAGE]); + FileTools::writelog(log_ERROR, msgs[LOSE_IMAGE]); + } + + } + } m_pendingXfers = 0; if (guiTwain.get()) { ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); @@ -1888,7 +1938,6 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { } else { m_pendingXfers = 1; - scanner->set_aquire_image_count(scanner->get_aquire_image_count(), scanner->get_updata_image_count()+1); } data.setCount(m_pendingXfers); return success(); @@ -1938,13 +1987,13 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { if (!ui.showUi()) { // this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state // with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step -#ifndef G200 +//#ifndef G200 while (!scanner->Get_Scanner_PaperOn()) { if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) return seqError(); } -#endif // !G200 +//#endif // !G200 auto ret = startScan(); @@ -2306,6 +2355,7 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) if (newRect.top <= 0 || newRect.left <= 0) newRect.top = newRect.left = 20; SetWindowPos(guiTwain->m_hWnd, HWND_TOPMOST, newRect.left + 20, newRect.top + 100, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOACTIVATE); + //SetWindowPos(guiTwain->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); guiTwain->ShowWindow(SW_SHOWNORMAL); return success(); } @@ -2421,7 +2471,9 @@ Twpp::Result HuagaoDs::startScan() //FileTools::write_log("D:\\1.txt",info); FileTools::writelog(log_INFO,"start scan"); #ifndef G200 + scanner->notifyscan(); scanner->clear_hwerror(); + #endif // scanner->config_params(*m_scanparam); diff --git a/huagao/huagaods.hpp b/huagao/huagaods.hpp index dae809b6..7696b307 100644 --- a/huagao/huagaods.hpp +++ b/huagao/huagaods.hpp @@ -94,7 +94,7 @@ private://method void dogear_callback(int indexpaper); void updataGscanCap(); Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data); - void showmsg(std::string caption, std::string text); + void showmsg(std::string caption, std::string text, int retcode=0); private://field std::unordered_map> m_caps; diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index fe447f2577ec3188be6f01c912088202454ea753..1210243d129c0a99098dc66a061aca16e16acc0f 100644 GIT binary patch delta 84 zcmcb1p6S|orVW15{6-8q42BG5K&ZoD%3wA*(ad!7BxyUx$@fH*CVz@i69!3`gB6(o i73we;F&Isr$gjUSDz?RV@{OrtlNGw9HuFt9AqD{5UKkVr delta 80 zcmcb1p6S|orVW15{KgDA42BGr3}!&ul)-FrqM7ODNz!(XlQ%RfP5u<4CTtFr0AWK0 f69xkyZNy+Sc_P35=BU^fxkR%fn&0Vy1-@@P9s)!QwBW-0|uqZj{KUFw8SRwxtX&fn&0Ys>mizBi6}AqKh_P;WJSH0Cv|1zyJUM