From dfa2da91d054cb82b1091b4f775478fe5712ac22 Mon Sep 17 00:00:00 2001 From: masayume <1936714878@qq.com> Date: Thu, 20 Oct 2022 10:40:25 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=B0=83=E6=95=B4usb=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=EF=BC=8C=E5=8A=A0=E9=95=BFreadbulk=E8=B6=85=E6=97=B6=E6=97=B6?= =?UTF-8?q?=E9=97=B4=202.=E5=B1=8F=E8=94=BD3288=20=E8=87=AA=E9=80=82?= =?UTF-8?q?=E5=BA=94=E5=B9=85=E9=9D=A2=E5=8A=9F=E8=83=BD=203.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=98=BE=E7=A4=BAUI=E6=97=B6=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=8D=8F=E8=AE=AEreset=E5=81=9C=E6=AD=A2=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E6=97=B6=E6=8C=89=E9=92=AE=E6=9C=AA=E6=AD=A3=E5=B8=B8=E5=A4=8D?= =?UTF-8?q?=E4=BD=8D=E9=97=AE=E9=A2=98=204.=E6=9B=B4=E6=96=B0=E9=99=A4?= =?UTF-8?q?=E7=A9=BF=E5=AD=94=E4=BB=A5=E5=8F=8A=E8=B7=B3=E8=BF=87=E7=A9=BA?= =?UTF-8?q?=E7=99=BD=E9=A1=B5=E7=AE=97=E6=B3=95=205.=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=BE=85=E7=BA=B8=E6=89=AB=E6=8F=8F=E8=B6=85=E6=97=B6=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=20--=2022.10.20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.txt | 3 +- huagao/CFeedPaperPage.cpp | 22 ++++++++++-- huagao/CSaveConfigDlg.cpp | 7 ++++ huagao/CSaveConfigDlg.h | 2 +- huagao/CTwainUI.cpp | 43 +++++++++++++++------- huagao/Device/GScan.h | 4 ++- huagao/Device/GScanO1003399.cpp | 61 +++++++++++++++++++++++++------- huagao/Device/GScanO1003399.h | 2 ++ huagao/Device/IConfig.h | 6 ++++ huagao/Device/PublicFunc.h | 2 ++ huagao/GscanJsonConfig.cpp | 12 +++++++ huagao/HUAGO-LOGO-for UI.bmp | Bin 98456 -> 40854 bytes huagao/huagaotwds.rc | Bin 54242 -> 54578 bytes huagao/resource.h | Bin 20900 -> 21084 bytes 14 files changed, 135 insertions(+), 29 deletions(-) diff --git a/changelog.txt b/changelog.txt index 88bd9c0d..c32d18d3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -63,4 +63,5 @@ 1.调整usb通信,加长readbulk超时时间 2.屏蔽3288 自适应幅面功能 3.修复显示UI时通过协议reset停止扫描时按钮未正常复位问题 - 4.更新除穿孔以及跳过空白页算法 \ No newline at end of file + 4.更新除穿孔以及跳过空白页算法 + 5.新增待纸扫描超时设置 -- 22.10.20 \ No newline at end of file diff --git a/huagao/CFeedPaperPage.cpp b/huagao/CFeedPaperPage.cpp index 98bc1024..593bc637 100644 --- a/huagao/CFeedPaperPage.cpp +++ b/huagao/CFeedPaperPage.cpp @@ -29,6 +29,14 @@ static std::vector lowpowermode _T("240分钟"), }; +static std::vector autopapertimeout +{ + _T("10秒"), + _T("15秒"), + _T("30秒"), + _T("60秒"), +}; + // CFeedPaperPage 对话框 IMPLEMENT_DYNAMIC(CFeedPaperPage, CTabPageSSL) @@ -89,6 +97,11 @@ BOOL CFeedPaperPage::OnInitDialog() for (int i = 0; i < lowpowermode.size(); i++) ((CComboBox*)GetDlgItem(IDC_CBLOWPOWERMODE))->InsertString(i, lowpowermode[i]); ((CComboBox*)GetDlgItem(IDC_CBLOWPOWERMODE))->SetCurSel(0); + + for (int i = 0; i < autopapertimeout.size(); i++) + ((CComboBox*)GetDlgItem(IDC_CMBAUTOPAPER))->InsertString(i, autopapertimeout[i]); + ((CComboBox*)GetDlgItem(IDC_CMBAUTOPAPER))->SetCurSel(0); + return true; } @@ -212,8 +225,13 @@ void CFeedPaperPage::OnBnClickedCkautopaper() ((CButton*)GetDlgItem(IDC_RDSPECIFYSCANNUM))->SetCheck(FALSE); GetDlgItem(IDC_RDSPECIFYSCANNUM)->EnableWindow(FALSE); m_editNum.EnableWindow(m_radioGroupScanMode); + GetDlgItem(IDC_CMBAUTOPAPER)->EnableWindow(TRUE); + GetDlgItem(IDC_STATICAUTOPAPER)->EnableWindow(TRUE); } - else + else { + ((CComboBox*)GetDlgItem(IDC_CMBAUTOPAPER))->SetCurSel(0); GetDlgItem(IDC_RDSPECIFYSCANNUM)->EnableWindow(TRUE); - + GetDlgItem(IDC_CMBAUTOPAPER)->EnableWindow(FALSE); + GetDlgItem(IDC_STATICAUTOPAPER)->EnableWindow(FALSE); + } } diff --git a/huagao/CSaveConfigDlg.cpp b/huagao/CSaveConfigDlg.cpp index 3442f161..7391d2f9 100644 --- a/huagao/CSaveConfigDlg.cpp +++ b/huagao/CSaveConfigDlg.cpp @@ -26,6 +26,13 @@ void CSaveConfigDlg::DoDataExchange(CDataExchange* pDX) CDialog::DoDataExchange(pDX); } +BOOL CSaveConfigDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + GetDlgItem(IDC_EDITSAVENAME)->SetFocus(); + return FALSE; +} + BEGIN_MESSAGE_MAP(CSaveConfigDlg, CDialog) ON_BN_CLICKED(IDOK, &CSaveConfigDlg::OnBnClickedOk) diff --git a/huagao/CSaveConfigDlg.h b/huagao/CSaveConfigDlg.h index d88cc03d..4294082d 100644 --- a/huagao/CSaveConfigDlg.h +++ b/huagao/CSaveConfigDlg.h @@ -17,7 +17,7 @@ public: protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ - + virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedOk(); diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 351752c4..71a44572 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -236,7 +236,7 @@ void CTwainUI::UpdateUI() m_pageBasic->m_Edit_Dpi.SetValue((int)settings->resolution_dst); m_pageBasic->m_cmBoxDuplex->SetCurSel(getCmbDuplexIndex());//!< 单双面 m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型 - m_pageBasic->m_enableSizeCheck = settings->en_sizecheck==1?TRUE:FALSE;//!< 尺寸检测 + m_pageBasic->m_enableSizeCheck = settings->en_sizecheck == 1 ? TRUE : FALSE;//!< 尺寸检测 m_pageBasic->m_bswitchfrontback = settings->is_switchfrontback ? TRUE : FALSE; //!< 交换正反面 ((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->SetCheck(settings->is_high_imagequality); ((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->SetCheck(!settings->is_high_imagequality); @@ -246,13 +246,13 @@ void CTwainUI::UpdateUI() m_pageBasic->m_bUV = settings->hardwarecaps.en_uv == 1 ? TRUE : FALSE; #endif m_pageBasic->UpdateData(FALSE); - if(getCmbDuplexIndex()==2|| getCmbDuplexIndex()==3) + if (getCmbDuplexIndex() == 2 || getCmbDuplexIndex() == 3) m_pageBasic->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(true); else m_pageBasic->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(false); //!< Page Breghtness - m_pageBrightness->m_cbAutoContrast = settings->is_autocontrast==TRUE?TRUE:FALSE; //!< 自动亮度对比度 + m_pageBrightness->m_cbAutoContrast = settings->is_autocontrast == TRUE ? TRUE : FALSE; //!< 自动亮度对比度 int brt = GetMappingBrightnessValue(settings->brightness); m_pageBrightness->m_Edit_Brightness.SetValue(brt); //!< 亮度 int crt = GetContrastLevel(settings->contrast); @@ -269,7 +269,7 @@ void CTwainUI::UpdateUI() m_pageBasic->discardblank_percent = settings->discardblank_percent; ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKCROPMODEL))->SetCheck(settings->normalCrop); - m_pageImageProc->m_ckbFillBlack = settings->fillbackground==TRUE ? TRUE : FALSE;//填充黑框 + m_pageImageProc->m_ckbFillBlack = settings->fillbackground == TRUE ? TRUE : FALSE;//填充黑框 m_pageImageProc->m_ckbAutoDeskrew = settings->autodescrew ? TRUE : FALSE;//自动纠偏 UpdateFilterCmbx(); if (settings->fillbackground || settings->autodescrew || settings->is_autocrop) { @@ -280,8 +280,8 @@ void CTwainUI::UpdateUI() } m_pageImageProc->m_cmBoxSharpen.SetCurSel(settings->sharpen); //UpdateSharpenCmbx(); - m_pageImageProc->m_ckbRemoveHole = settings->fillhole.is_fillhole==TRUE?TRUE:FALSE;//除穿孔可用性 - m_pageImageProc->m_edit_hole.SetValue(settings->fillhole.fillholeratio/ 100.0);//穿孔搜索范围比例系数 + m_pageImageProc->m_ckbRemoveHole = settings->fillhole.is_fillhole == TRUE ? TRUE : FALSE;//除穿孔可用性 + m_pageImageProc->m_edit_hole.SetValue(settings->fillhole.fillholeratio / 100.0);//穿孔搜索范围比例系数 m_pageImageProc->m_edit_hole.EnableWindow(settings->fillhole.is_fillhole == TRUE ? TRUE : FALSE); m_pageImageProc->GetDlgItem(IDC_BTNHOLE)->EnableWindow(settings->fillhole.is_fillhole == TRUE ? TRUE : FALSE); m_pageImageProc->m_fillhole_up = settings->fillholeratio_up; @@ -303,10 +303,10 @@ void CTwainUI::UpdateUI() m_pageImageProc->m_ckbDetachNoise = settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE;//黑白降噪是否启用 ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(m_pageImageProc->m_ckbDetachNoise); ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(settings->pixtype != 2); - ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHMULTIPUT))->SetCheck(settings->pixtype != 2 ? FALSE:settings->en_multi_output); // 多流输出 + ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHMULTIPUT))->SetCheck(settings->pixtype != 2 ? FALSE : settings->en_multi_output); // 多流输出 m_pageImageProc->GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(settings->pixtype != 2); - ((CComboBox*)m_pageImageProc->GetDlgItem(IDC_CMBMULTIOUT))->SetCurSel(settings->pixtype != 2 ? 0 : (settings->en_multi_output?(settings->multioutput<0?0:settings->multioutput):0)); + ((CComboBox*)m_pageImageProc->GetDlgItem(IDC_CMBMULTIOUT))->SetCurSel(settings->pixtype != 2 ? 0 : (settings->en_multi_output ? (settings->multioutput < 0 ? 0 : settings->multioutput) : 0)); m_pageImageProc->GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(settings->pixtype != 2 ? FALSE : settings->en_multi_output); m_pageImageProc->m_edit_detachnoise.SetValue(settings->detachnoise.detachnoise); m_pageImageProc->m_slider_detachnoise.EnableWindow(settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE); @@ -321,7 +321,7 @@ void CTwainUI::UpdateUI() m_pageImageProc->UpdateData(FALSE); m_pageFeedPaper->dogear.SetCheck(settings->is_dogeardetection); //!< Page feed paper - if (settings->is_duplex || settings->is_autodiscradblank_normal ||settings->is_autodiscradblank_vince) + if (settings->is_duplex || settings->is_autodiscradblank_normal || settings->is_autodiscradblank_vince) { m_pageFeedPaper->m_cbRotation = settings->is_backrotate180 == TRUE ? TRUE : FALSE;//背面旋转180 m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(settings->is_autotext ? FALSE : TRUE); @@ -331,10 +331,14 @@ void CTwainUI::UpdateUI() m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(FALSE); m_pageFeedPaper->m_cbRotation = FALSE; } - m_pageFeedPaper->m_cbStaple = settings->hardwarecaps.en_stapledetect==TRUE ? TRUE : FALSE;//装订检测 - m_pageFeedPaper->m_cbDoublePaper = settings->hardwarecaps.en_doublefeed==TRUE ? TRUE : FALSE;//双张检测 - m_pageFeedPaper->m_cbSkew = settings->hardwarecaps.en_skrewdetect==TRUE ? TRUE : FALSE;//歪斜检测 + m_pageFeedPaper->m_cbStaple = settings->hardwarecaps.en_stapledetect == TRUE ? TRUE : FALSE;//装订检测 + m_pageFeedPaper->m_cbDoublePaper = settings->hardwarecaps.en_doublefeed == TRUE ? TRUE : FALSE;//双张检测 + m_pageFeedPaper->m_cbSkew = settings->hardwarecaps.en_skrewdetect == TRUE ? TRUE : FALSE;//歪斜检测 ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->SetCheck(settings->hardwarecaps.is_autopaper); + auto tmp_init_autopaper_timeout = {10,15,30,60}; + auto tmp_autopaper_cmbindex = std::distance(tmp_init_autopaper_timeout.begin(), + std::find(tmp_init_autopaper_timeout.begin(), tmp_init_autopaper_timeout.end(), settings->autopaper_timeout)); + ((CComboBox*)m_pageFeedPaper->GetDlgItem(IDC_CMBAUTOPAPER))->SetCurSel(tmp_autopaper_cmbindex == tmp_init_autopaper_timeout.size() ? 0 : tmp_autopaper_cmbindex); m_pageFeedPaper->m_cmBoxOrentation.SetCurSel(settings->is_autotext?4:getRotateCmbIndex(settings->imageRotateDegree));//旋转方向; m_pageFeedPaper->m_sldSkrewDetecttion.SetPos(m_pageFeedPaper->m_cbSkew?settings->hardwarecaps.skrewdetectlevel:3);//歪斜检测等级 m_pageFeedPaper->m_sldSkrewDetecttion.EnableWindow(m_pageFeedPaper->m_cbSkew); @@ -356,6 +360,16 @@ void CTwainUI::UpdateUI() csCount.Format(_T("%d"), settings->is_duplex==TRUE?tempcount/2: tempcount); m_pageFeedPaper->GetDlgItem(IDC_EDSCANNUM)->SetWindowText(csCount); } + if (settings->hardwarecaps.is_autopaper) + { + m_pageFeedPaper->GetDlgItem(IDC_CMBAUTOPAPER)->EnableWindow(TRUE); + m_pageFeedPaper->GetDlgItem(IDC_STATICAUTOPAPER)->EnableWindow(TRUE); + } + else + { + m_pageFeedPaper->GetDlgItem(IDC_CMBAUTOPAPER)->EnableWindow(FALSE); + m_pageFeedPaper->GetDlgItem(IDC_STATICAUTOPAPER)->EnableWindow(FALSE); + } m_pageFeedPaper->UpdateData(FALSE); m_pageBasic->updateCmbDuplex(TRUE); @@ -624,6 +638,9 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->hardwarecaps.skrewdetectlevel = (int)configItem->ScrewDetectLevel; settings->hardwarecaps.en_stapledetect = configItem->EnBindingDetect; settings->hardwarecaps.is_autopaper = ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->GetCheck(); + CString tmp_autopaper_timeout; + m_pageFeedPaper->GetDlgItem(IDC_CMBAUTOPAPER)->GetWindowTextW(tmp_autopaper_timeout); + settings->autopaper_timeout = _wtoi(tmp_autopaper_timeout); settings->hardwarecaps.en_doublefeed = configItem->EnUltrasonicDetect; settings->dogeardistance = m_pageFeedPaper->m_slider_dogear.GetPos(); settings->en_fold = configItem->EnFlod ? 1 : 0; @@ -774,6 +791,8 @@ void CTwainUI::setvisable_dogear(bool flag) void CTwainUI::setvisable_autopaper(bool flag) { ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->ShowWindow(flag ? SW_SHOW : SW_HIDE); + m_pageFeedPaper->GetDlgItem(IDC_STATICAUTOPAPER)->ShowWindow(flag ? SW_SHOW : SW_HIDE); + m_pageFeedPaper->GetDlgItem(IDC_CMBAUTOPAPER)->ShowWindow(flag ? SW_SHOW : SW_HIDE); if (!flag) ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->SetCheck(false); } diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index ee46a078..f76d3064 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -101,7 +101,8 @@ typedef enum tagUsbSupported { AUTO_FLAT_FINISHED = 202, //usb USB_CONNECTED, - HAVE_PAPER + HAVE_PAPER, + DEVICE_LOCKED, } UsbSupported, * PUsbSupported; static map msgs = { @@ -132,6 +133,7 @@ static map msgs = { {UsbSupported::HAVE_DOGEAR,"⵽۽ǣֹͣɨ裡"}, {UsbSupported::MLTOP_TIMEOUT,"̨̧δָλã"}, {UsbSupported::PAPER_HOLE,"ֽпףʹôģʽɨ裡"}, + {UsbSupported::DEVICE_LOCKED,"豸"}, }; enum tagEventIndex diff --git a/huagao/Device/GScanO1003399.cpp b/huagao/Device/GScanO1003399.cpp index de4be307..42f33ca3 100644 --- a/huagao/Device/GScanO1003399.cpp +++ b/huagao/Device/GScanO1003399.cpp @@ -61,7 +61,9 @@ GScanO1003399::~GScanO1003399() scanflag = false; b_imgprothread = false; imgs.ShutDown(); - + m_autopaper_timeout = false; + if (m_autopaper_ft.valid()) + m_autopaper_ft.get(); while (m_paths.Size() > 0) { remove(m_paths.Take().c_str()); @@ -434,6 +436,7 @@ void GScanO1003399::Stop_scan() stop(); if (m_param.hardwarecaps.is_autopaper) { + m_autopaper_timeout = false; autopaperstop = true; if (!is_scan() && imagecount == 0) scanflag = false; @@ -517,10 +520,15 @@ void GScanO1003399::usb_run() HGEIntInfo info = *(HGEIntInfo*)&buff; switch (info.From) { - case IMG: - if (is_runing() && (im_dev_count()>0)) + case IMG: + { + if (m_param.hardwarecaps.is_autopaper) { + m_autopaper_timeout = false; + } + if (is_runing() && (im_dev_count() > 0)) im_rx(); - break; + break; + } case MtBoard: FileTools::writelog(log_ERROR, "Got MotorBoard error code = " + to_string(info.Code)); break; @@ -576,10 +584,26 @@ void GScanO1003399::usb_run() } else scanflag = false; - + if (m_param.hardwarecaps.is_autopaper) { + if ((devState != DEV_WRONG) && (!autopaperstop)) + { + m_autopaper_ft = std::async(std::launch::async, [this] { + m_autopaper_timeout = true; + StopWatch sw; + while (sw.elapsed_s() < m_param.autopaper_timeout) + { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + if (m_autopaper_timeout == false) + return; + } + if ((m_autopaper_timeout == false) || scanner_read_reg(m_usb, SR_STATUS)) + return; + else + Stop_scan(); + }); + } + } } - - this_thread::sleep_for(chrono::microseconds(10)); } @@ -588,6 +612,7 @@ void GScanO1003399::usb_run() void GScanO1003399::start() { + scanner_cmd(m_usb, SC_START); } @@ -660,10 +685,18 @@ void GScanO1003399::im_rx() std::shared_ptr> buffi(new std::vector); //auto& buffi = im_data; int count = front_datasize(); + int recv_count = 0; buffi->resize(count); rx_cmd(); - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - count = read_data(buffi->data(), count, count / (0.005 * 1024 * 1024)); // + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + recv_count = read_data(buffi->data(), count, count / (0.005 * 1024 * 1024)); // + if (count != recv_count) + { + FileTools::writelog(log_INFO, "SR_IM_ABORT "); + scanner_write_reg(m_usb, SR_IM_ABORT, 0); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + return; + } pop_dev_im(); //vector mats; //m_param.multi_output_red? imagecount += 2: imagecount++; @@ -693,10 +726,10 @@ int GScanO1003399::read_data(void* data, int length, int timeout) { if (!m_usb.get() && !m_usb->is_connected()) { - FileTools::writelog(log_INFO, "if (!m_usb.get() && !m_usb->is_connected())"); + FileTools::writelog(log_INFO, "!m_usb->is_connected"); return 0; } - timeout = std::max(1000, timeout); + timeout = std::max(1500, timeout); int readed = 0; int reading = 0; @@ -956,6 +989,8 @@ int GScanO1003399::codeconvter(HGEIntInfo code) return DETECT_STAPLE; case 0x00080: return PAPER_SKEW; + case 0x00100: + return DEVICE_LOCKED; case 0x10000: return AQUIRE_IMAGE_TIMEOUT; case 0x20000: @@ -998,8 +1033,10 @@ int GScanO1003399::codeconvter(HGEIntInfo code) { switch (code.Code) { - case 0: + case 0: + { return -1; + } case 1: if (m_param.hardwarecaps.is_autopaper) { diff --git a/huagao/Device/GScanO1003399.h b/huagao/Device/GScanO1003399.h index 8e2df037..673fddb6 100644 --- a/huagao/Device/GScanO1003399.h +++ b/huagao/Device/GScanO1003399.h @@ -104,6 +104,8 @@ private: volatile bool keeplastimg; volatile bool autopaperstop; volatile bool is_kernelsnap_211209; + volatile bool m_autopaper_timeout; + std::future m_autopaper_ft; GScanCap m_param; std::shared_ptr m_usb; volatile bool b_imgprothread; diff --git a/huagao/Device/IConfig.h b/huagao/Device/IConfig.h index 0bbbdb25..f9dc1c81 100644 --- a/huagao/Device/IConfig.h +++ b/huagao/Device/IConfig.h @@ -199,6 +199,12 @@ enum Scanner_Reg_Defs SR_SET_AUTOMATICCONTROLFEEDMODE_THRESHOLD, SR_GET_TRAYPOSITION, SR_SET_TRAYPOSITION, + SR_GET_LOCK_STATES, + SR_SET_LOCK_STATES, + SR_GET_TOKEN, + SR_SET_TOKEN, + SR_GET_TOKEN_LENGHT, + SR_DECODE_TOKEN, SR_GET_CUO_ERROR = 0x50, SR_GET_DOU_ERROR, SR_GET_JAM_ERROR, diff --git a/huagao/Device/PublicFunc.h b/huagao/Device/PublicFunc.h index 6a2d0b7d..0846e6b9 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -85,6 +85,7 @@ const std::string HSVCORRECT = "bHsvCorrect"; const std::string ULTRADETECT = "bUltrasonicDetect"; const std::string BINDINGDETECT = "bBindingDetect"; const std::string AUTOPAPER = "bautopaper"; +const std::string AUTOPAPERTIMEOUT = "iautopapertimeout"; const std::string SCANCOUNT = "ScanCount"; const std::string DOCORIENTATION = "bOrientation"; const std::string AUTO_TEXT = "bAutoText"; @@ -298,6 +299,7 @@ struct GScanCap bool en_fillholeratio_down; bool en_fillholeratio_left; bool en_fillholeratio_right; + int autopaper_timeout; std::string Caption; std::string SavePath; }; diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index a8c6b18e..5afb1cb0 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -144,6 +144,7 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin outJson["Config"].Add(ULTRADETECT, (bool)(gcap.hardwarecaps.en_doublefeed), false); outJson["Config"].Add(BINDINGDETECT, (bool)(gcap.hardwarecaps.en_stapledetect), false); outJson["Config"].Add(AUTOPAPER, (bool)(gcap.hardwarecaps.is_autopaper), false); + outJson["Config"].Add(AUTOPAPERTIMEOUT, (int)(gcap.autopaper_timeout)); outJson["Config"].Add(SCANCOUNT, (int)(gcap.scannum)); outJson["Config"].Add(DOCORIENTATION, (int)(gcap.imageRotateDegree)); outJson["Config"].Add(AUTO_TEXT, (bool)(gcap.is_autotext),false); @@ -293,6 +294,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"][ULTRADETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_doublefeed); root["Config"][BINDINGDETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_stapledetect); root["Config"][AUTOPAPER].Add(i, (bool)cfgArray[i].hardwarecaps.is_autopaper); + root["Config"][AUTOPAPERTIMEOUT].Add((int)cfgArray[i].autopaper_timeout); root["Config"][SCANCOUNT].Add((int)cfgArray[i].scannum); root["Config"][DOCORIENTATION].Add((int)cfgArray[i].imageRotateDegree); root["Config"][AUTO_TEXT].Add(i, (bool)cfgArray[i].is_autotext); @@ -513,6 +515,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(BINDINGDETECT, itmBingdingDetect); neb::CJsonObject itmAutoPaper; root["Config"].Get(AUTOPAPER, itmAutoPaper); + neb::CJsonObject itmAutoPaperTimeOut; + root["Config"].Get(AUTOPAPERTIMEOUT, itmAutoPaperTimeOut); neb::CJsonObject itmScanCount; root["Config"].Get(SCANCOUNT, itmScanCount); neb::CJsonObject itmDocOrientation; @@ -661,6 +665,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.hardwarecaps.en_stapledetect = b_value ? 1 : 0; itmAutoPaper.Get(i, b_value); cfp.hardwarecaps.is_autopaper = b_value ? 1 : 0; + itmAutoPaperTimeOut.Get(i, i_value); + cfp.autopaper_timeout = i_value; itmScanCount.Get(i, i_value); cfp.scannum = i_value; itmDocOrientation.Get(i, i_value); @@ -814,6 +820,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.hardwarecaps.en_stapledetect = bvalue ? 1 : 0; root["Config"].Get(AUTOPAPER, bvalue); cfp.hardwarecaps.is_autopaper = bvalue ? 1 : 0; + root["Config"].Get(AUTOPAPERTIMEOUT, index); + cfp.autopaper_timeout = index; root["Config"].Get(SCANCOUNT, index); cfp.scannum = index; root["Config"].Get(DOCORIENTATION, index); @@ -921,6 +929,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap) js[CONFIG][ULTRADETECT] = cap.hardwarecaps.en_doublefeed; js[CONFIG][BINDINGDETECT] = cap.hardwarecaps.en_stapledetect; js[CONFIG][AUTOPAPER] = cap.hardwarecaps.is_autopaper; + js[CONFIG][AUTOPAPERTIMEOUT] = cap.autopaper_timeout; js[CONFIG][SCANCOUNT] = cap.scannum; js[CONFIG][DOCORIENTATION] = cap.imageRotateDegree; js[CONFIG][AUTO_TEXT] = cap.is_autotext; @@ -997,6 +1006,7 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js) cap.hardwarecaps.en_doublefeed = json_cast(js[CONFIG][ULTRADETECT]).to_int(); cap.hardwarecaps.en_stapledetect = json_cast(js[CONFIG][BINDINGDETECT]).to_int(); cap.hardwarecaps.is_autopaper = json_cast(js[CONFIG][AUTOPAPER]).to_int(); + cap.autopaper_timeout = json_cast(js[CONFIG][AUTOPAPERTIMEOUT]).to_int(); cap.scannum = json_cast(js[CONFIG][SCANCOUNT]).to_int(); cap.imageRotateDegree = json_cast(js[CONFIG][DOCORIENTATION]).to_int(); cap.is_autotext = json_cast(js[CONFIG][AUTO_TEXT]).to_int(); @@ -1068,6 +1078,7 @@ json GscanJsonConfig::GetDefaultJson() "bUltrasonicDetect": true , "bBindingDetect": false , "bautopaper": false , + "iautopapertimeout" : 15 , "ScanCount": 65535 , "bOrientation": 0 , "bAutoText": false , @@ -1136,6 +1147,7 @@ json GscanJsonConfig::GetDefaultJson() "bUltrasonicDetect": true , "bBindingDetect": false , "bautopaper": false , + "iautopapertimeout" : 15 , "ScanCount": 65535 , "bOrientation": 0 , "bAutoText": false , diff --git a/huagao/HUAGO-LOGO-for UI.bmp b/huagao/HUAGO-LOGO-for UI.bmp index 090f5676c27101a092e161911865d50aaa519e55..d04d9f79aa3a90c12653d4e2aba2363b62b376f2 100644 GIT binary patch literal 40854 zcmeHO3DjQ08IDpR617H1L>f(O;gD)Xi3D|2Y)7iC)RL1TmRf5~ZJ}xx#F`3%h7wzX z*!`#wBxoWCLWnGgh%F0}_IcXxJ$=oYnfJZ-`@ZzA{{J~oX70?pJoC=n_s*UBWry9b zx}n*>{<`7c4S_DpG;7uo0i45}-J{XZwZZYc zA3)Y9=QC%++jlGM&{yb3uD?bf*Anfm2Yd$10i<8b`DkN4X$g3J9|c+Z=9t7ztQ6by zP5B(G*b28kh8_B707Tv@w}tGJ4x2IVFFn~x=QEzY`sLx&%7=Ni^}vHF&f zxf|6figU(!{;UEK6Za?=CI4>wwG^8ZY|hY;P7=r#TVy3H(utGRu$Ql zPibdf<8v)%PxsL_q1$5hSUkn2F8era@p-RxV)d0E!)JAjOVKv&JGeg!{XFfkzez+d zw3EA*XNSdkgN&cu(D#;utK}or&m5Q=gYH`&vSVw^<$Q;K=C$*HH)`nnOW4{2(Bt#g z{{+1yHRQs%84vUVG>0(`AKL^vTHjOWK0UQIbUXJBwD)5}zDT}0$*`sUv)&l<6?5a< zg5wCs6<%{c+a1vJceumHz(7aqd+H4iA6%0$TWh2JS%-c&)}q%}CH#k+j;kXV?iq8> z2Ied7MT(BiBhNe-jx}|?9b`YL6A$6~4D8EV^*sMCF2FxFuG<{r;XYh+Yn887fK9&l z$+$gbW6M|E2Ypy@44!dPW)ZLvAaQ3tSP10wnJ+}XXxSdRiw*nq-7n%}N2hL%ySLAi zuZB9t;q{l3+a(eUiTiTst5^O$J>ysW%Xw0cf35mH1s~qe^gSEM+2x*7I2J8ehOTFC zz-N`%u2sG|*%()B%#AHy-B)4^v2mr^`0SFnv%J;e@23?VzLR@F+lM%8b1kk2Xij|p zOYyHqyOpmlU&?%X2Jz6bVg1oM@sW8B{qg#gI{8e^r_S4#I(+X58S?b5Ps&mLmq3bx zwDURNwjxiRTI4IP`I&(D@Rp4!UwL9D<09|Jfsp{u#peOiXO)LSmT@PzE-ZPTMbf^+ z%2QIF^K99^5;DSt<)#ju&?foZ1DpZ$2N=iS07n2knEM_=di)c`|R+hP54fLzW2 zP6I9hitdT{zSSDgaS7}6A-=yseKIf_7zXe==yd?|+82PxS>-6mhJJW`Kmi-t$D7c* z8{ixa2AKD60mcFI0WB+aj%6!A^XQh46&;p*PvDyKtWA-jy!C!T+qVIlPc8D*K-kp$ zy>;Pk$#)JoYyP_4$H9YnM(aqu!J$i@JnIx4T^{e$e=*R1%c*C@s7!y)fD5^K?R*T` ze!wz;4ILBKCjmK|seIKQdY+ssw$IA&;PaW!6_K^dzhrE2Oe+A~^DvjJ3WQ_U*T3T|jdP>*UXOe&#Q+&F9KyKq$-W=arnuFRgN~fK#>k ziesNqay*SCUwQWxCj_wz=XMWg9JW<<203+Vy*?%=4jjj!1$c0O5sp1|T{d5F@8=zJ zFDIXi3fS!Fw3!;WZtv~%%e|@A8|~C%oNfln{6>N~@_HaQUeC87?_3p;;~r7RgY|0j z)k(0C;=q09SDF6ClCO@*aFnsV1(`5*vFl+DTc;~q8#&~KLoLhW6bFuj?=&9!HwAjJ z80fY#`HK64+`7>`e_fEz?apzIC}>xYIaVL%@Heb#gGPY{+RqmVMQ}DGlusAc$#*(kbW;n`R`~ou8oU)(iIqw?wUJh*S zXUGeOT9w>m=&^X;lbF}Eo~K?WUyXLgqk9QHT)0Okwa%n zMLzUbkLz6>d}_5mX{RAEwzB!E1?RCGcJ-*iQ){EvV zt{Kn0%KeI$Lnz1Rs5M^p^ZR0`TjY8*=#O;zqCYt&=;_oM0J$Q3s+G0w6MkEL65!cr zY<+U=HUQRIXDm`D6{t!u7`vJ)Tp>d`epv^p60p0eDt^DZqCX z%XavEkl&~@-&8$zwjo@sa#{G8?(p*fWGq`@KYv%s?=JT^?1y9PUGaC6Lzio4^@@DR zpjSB-CKXT~M_fCOc z=$rEr#>{ga=BuAO?Hpk63HgQBV;p|CoN1?GJI-_*+Fb z#it(a8##C#YVg|6VdL72jWYS_M8oF>6@MPvpBc8od9C((Y2+*JFLFHj?W;{CMtWVn zZ0Ow)(b4)(82aSYHLzjLk&J_DRr}KQeI0(qPFRNd%4=)K3?I!cRUhWy{2pY!m+`~B z)RDj}ARJfGYyFMyE{DD0kV%cLp6!nr+!_pCp0VYgjn;Z)K53;mSbHnJ3rV~@w!e${ ziuYh{y~g%ej2Yj#a(a9RNbQq7&pz%`Wp1SOoaKBCy>%kGw88aI&HWnYtAk-L7X#_r zD#1s_WtD>+em;WC3JE{^pnbl>hVadm4+cIwd)12r9c#R`>hJFubEgEic4+^`(4Ugf z75<)_qVtt?Pw92!vE7uf{*yyEpUe%pwS7=xK2I_9XmdbBm-ChL$3CvHwh>*fA)ZNF z`nmqH`KnujkF0B}yvV^jm9IuRbaP|YeLUv~xmtS|>XUz{w=}N#e3}F3F@$xl#Tb`E z3_aR8HK8l^JUK=36-&-x$WN|E2fjSEoATAS=l1SQd>QA5f*8v@jx+SQH;bKxZfxku z+-?%_ySGzUY{W{Q&&wEC?(4MKE6~$6JoTXtKYSnL?^CqB2ON5_afWR?Gu=P1Eq**_ z_17hI#YR2LYmFF;PjI{6&|{1`Cv;^zo}9v*O8J367hpf%`#+zFgGzvVtI)3ZyuB}UWejCXK3iks z)NK<3AJ+QUx~ckeu*taP&czs)l)kiw=dfjBP*#U$hr%OOZVnl3zdf$GPfy9SozDWT z6RUf2is)!>=Bo~U`mn}bi~da=TsWRHtK>7);YZ&;D?|QchfZwXnD@xH zBjAbAu?|0TAwy0cd-afc$>12y&ryavVi>sAWKCRd|(D287eCW%v&0OWlSKTVM zS4WuwefI-m>qWOU_I$;03^v9w7X3QbFBPl?$nzd;r)-EVtNfYM7x!tFt$Ow6et*drycTeK)EE=z zyhWfB<8I}Yw_$_dh9(0t7hxH46F-)1Z@x->ZxBCHde+qcLcZEE6Kjb*&z(4K&%O7@ zimb#bEDv`0qu>1uJE7gO*Q1<#x|HNI$Z20c?@xE?@Y uc`Q~0vq!j{+9>;%p)P%?axP@n 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 NtEI_RU4IJ;`yXq%C_w-K diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index e7c0a3f4f662125d0c274d06171dcf9e450730c9..daebd817d07a5f30a5f0a8dc68703ccfecbabc07 100644 GIT binary patch delta 152 zcmaE~oO#nK<_%rGj7F2!Ti9+s;j17z`GGmdWWK4&Jn=i~T6@2xeoOr_)oSuXSxHq# zhERqO27iVC21g)vWe8%>VK8JcW-tfSra;n^!DupLq44B?qB`2xRa*kpfOMGvNizlm bAZgBEGFdUoesYbt(PXnzVw?XZJt+VH$0aEJ delta 31 ncmdnAiuuuU<_%rG%!Ul6lQ&veZ$9CxAUfGbNo=!U%98>B$v6y9 diff --git a/huagao/resource.h b/huagao/resource.h index 944d604828e191adc4ecc30ce1f5c23d86ac82b6..1ccf0b72df0d9a9063464447146bb57655528fbe 100644 GIT binary patch delta 89 zcmZ3onDNdM#trLaCfiB#Ocs;%o4mlBh1HkAiNSxeJ+tm+JK0HGlNTuPOnxD#GdVz= rZE};j0y9v0@^e9BFkehpYO(?k$L1^Q0h*JISj8qc1c*%b3k(AQ67d`T delta 59 zcmV-B0L1^?qyeO(0kEzd2S@-#07C#vlQ9_^lRyU;lZ+gEli(U2vw|H?3X@O;1hb4N RP$`qv8y1t^P!y8}QdUtW6W9O%