From ff13d808e7ff80278f0bdcdc2b93e57d6eb8ad33 Mon Sep 17 00:00:00 2001 From: masayume <1936714878@qq.com> Date: Wed, 29 Jun 2022 20:24:24 +0800 Subject: [PATCH] =?UTF-8?q?3358=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- huagao/CAboutDlg.cpp | 4 +- huagao/CBasicPage.cpp | 56 +- huagao/CImageProcPage.cpp | 22 +- huagao/CImageProcPage.h | 3 +- huagao/CTwainUI.cpp | 70 ++- huagao/CTwainUI.h | 2 + huagao/Device/GScan.h | 6 +- huagao/Device/GScanO1003399.cpp | 20 +- huagao/Device/GScanO200.cpp | 4 +- huagao/Device/GScanO400.cpp | 152 ++--- huagao/Device/ImageMatQueue.cpp | 589 ++++++++++++------- huagao/Device/ImageMatQueue.h | 2 + huagao/Device/PublicFunc.cpp | 2 + huagao/ImageProcess/ImageApplyDispersion.cpp | 43 ++ huagao/ImageProcess/ImageApplyDispersion.h | 35 ++ huagao/ImageProcess/ImageMulti.cpp | 98 +++ huagao/ImageProcess/ImageMulti.h | 27 + huagao/cumtenn.bmp | Bin 0 -> 58654 bytes huagao/huagaods.cpp | 103 +++- huagao/huagaotwds.rc | Bin 50744 -> 50874 bytes huagao/resource.h | Bin 19248 -> 19246 bytes huagao/rtw_logo.bmp | Bin 0 -> 74934 bytes huagao/stdafx.h | Bin 22446 -> 25538 bytes 23 files changed, 888 insertions(+), 350 deletions(-) create mode 100644 huagao/ImageProcess/ImageApplyDispersion.cpp create mode 100644 huagao/ImageProcess/ImageApplyDispersion.h create mode 100644 huagao/ImageProcess/ImageMulti.cpp create mode 100644 huagao/ImageProcess/ImageMulti.h create mode 100644 huagao/cumtenn.bmp create mode 100644 huagao/rtw_logo.bmp diff --git a/huagao/CAboutDlg.cpp b/huagao/CAboutDlg.cpp index 33e97b73..44f0d28d 100644 --- a/huagao/CAboutDlg.cpp +++ b/huagao/CAboutDlg.cpp @@ -63,12 +63,14 @@ BOOL CAboutDlg::OnInitDialog() HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP4)); #elif defined MAKERIGHTWAY HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP5)); +#elif defined CUMTENN + HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP7)); #else HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BMPABOUTDLG)); #endif pStatic->ModifyStyle(0xF, SS_BITMAP | SS_CENTERIMAGE); pStatic->SetBitmap(hBitmap); -#if defined MAKEHUAGAO || defined LANXUM || defined HANVON || defined AUGE ||defined MAKERIGHTWAY +#if defined MAKEHUAGAO || defined LANXUM || defined HANVON || defined AUGE ||defined MAKERIGHTWAY || defined CUMTENN GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(TRUE); #else GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(FALSE); diff --git a/huagao/CBasicPage.cpp b/huagao/CBasicPage.cpp index bfd7e2a2..e62cdbd8 100644 --- a/huagao/CBasicPage.cpp +++ b/huagao/CBasicPage.cpp @@ -156,7 +156,7 @@ BOOL CBasicPage::OnInitDialog() m_cmBoxDuplex = (CComboBox*)GetDlgItem(IDC_CMBDUPLEX); m_Edit_Dpi.SetSlideLink(this, IDC_SLIDERDPI); - m_Edit_Dpi.SetParams(100, 600, 10); + m_Edit_Dpi.SetParams(100, 300, 10); m_Edit_Dpi.SetValue(200); for (const CString& colorMode : color_Modes) @@ -323,7 +323,18 @@ void CBasicPage::updateCmbDuplex(BOOL insert) GetDlgItem(IDC_CKFIXEDPAPER)->EnableWindow(false); } else { - GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true); + if (m_Slider_Dpi.m_iPosition >= 500) { + if (m_hdVersion.size() > 9 && m_hdVersion.substr(2, 2) == "39") + { + if ((m_hdVersion[5] == 'B' && atoi(m_hdVersion.substr(6, 4).c_str()) > 429) || (m_hdVersion[5] > 'B')) { + GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true); + } + } + } + else { + GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true); + } + GetDlgItem(IDC_CKFIXEDPAPER)->EnableWindow(true); } @@ -336,6 +347,39 @@ void CBasicPage::OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult) // TODO: 在此添加控件通知处理程序代码 if(pResult!=nullptr) *pResult = 0; + if (m_Slider_Dpi.m_iPosition >= 500) { + if (m_hdVersion.size() > 9 && m_hdVersion.substr(2, 2) == "39") + { + if ((m_hdVersion[5] == 'B' && atoi(m_hdVersion.substr(6, 4).c_str()) > 429) || (m_hdVersion[5] > 'B')) { + int tmp_paperindex = m_cmBoxSS->GetCurSel(); +#ifndef G300 + if (!(tmp_paperindex == 19 || tmp_paperindex == 20 || tmp_paperindex == 21 || tmp_paperindex == 22 || tmp_paperindex == 1 || tmp_paperindex == 4 || tmp_paperindex == 5)) { +#else + if (!(tmp_paperindex == 8 || tmp_paperindex == 1 || tmp_paperindex == 9 || tmp_paperindex == 10)) { +#endif // G200 + ((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->EnableWindow(TRUE); + } + } + else + { + ((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->EnableWindow(FALSE); + ((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->SetCheck(FALSE); + } + } + } + else + { + int tmp_paperindex = m_cmBoxSS->GetCurSel(); +#ifndef G300 + if (!(tmp_paperindex == 19 || tmp_paperindex == 20 || tmp_paperindex == 21 || tmp_paperindex == 22 || tmp_paperindex == 1 || tmp_paperindex == 4 || tmp_paperindex == 5)) { +#else + if (!(tmp_paperindex == 8 || tmp_paperindex == 1 || tmp_paperindex == 9 || tmp_paperindex == 10)) { +#endif // G200 + ((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->EnableWindow(TRUE); + } + } + + if (m_Slider_Dpi.m_iPosition >= 500) { ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->EnableWindow(FALSE); ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->EnableWindow(FALSE); @@ -348,8 +392,8 @@ void CBasicPage::OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult) ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->EnableWindow(TRUE); } - if (((m_Slider_Dpi.m_iPosition >= 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) || - (m_Slider_Dpi.m_iPosition >= 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) && + if (((m_Slider_Dpi.m_iPosition > 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) || + (m_Slider_Dpi.m_iPosition > 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) && #ifdef G300 m_cmBoxSS->GetCount() > 9) { @@ -367,8 +411,8 @@ void CBasicPage::OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult) m_cmBoxSS->DeleteString(20); #endif // G300 } - else if (((m_Slider_Dpi.m_iPosition < 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) || - (m_Slider_Dpi.m_iPosition < 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) && + else if (((m_Slider_Dpi.m_iPosition <= 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) || + (m_Slider_Dpi.m_iPosition <= 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) && #ifdef G300 m_cmBoxSS->GetCount() <= 9) { diff --git a/huagao/CImageProcPage.cpp b/huagao/CImageProcPage.cpp index 8b6195df..487e96d7 100644 --- a/huagao/CImageProcPage.cpp +++ b/huagao/CImageProcPage.cpp @@ -57,8 +57,9 @@ CImageProcPage::~CImageProcPage() { } -void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool is_Crop) +void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool is_Crop,int dpi) { + this->dpi = dpi; this->twss = twss; this->cmduplexsel = cmduplexsel; CComboBox* m_temp = (CComboBox*)(GetDlgItem(IDC_CMBFILTER)); @@ -76,8 +77,17 @@ void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool { GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(TRUE); GetDlgItem(IDC_CKBACKGROUNDSMOOTH)->EnableWindow(TRUE); - GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE); - GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(((CButton*)GetDlgItem(IDC_CHMULTIPUT))->GetCheck()); + if (dpi >= 500) { + GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(FALSE); + ((CButton*)GetDlgItem(IDC_CHMULTIPUT))->SetCheck(FALSE); + GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(FALSE); + ((CButton*)GetDlgItem(IDC_CMBMULTIOUT))->SetCheck(FALSE); + } + else + { + GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE); + GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(((CButton*)GetDlgItem(IDC_CHMULTIPUT))->GetCheck()); + } } else { GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(FALSE); @@ -356,7 +366,9 @@ void CImageProcPage::OnBnClickedCkmultioutput() } else { - GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(FALSE); - GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE); + if (dpi < 500) { + GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(FALSE); + GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE); + } } } diff --git a/huagao/CImageProcPage.h b/huagao/CImageProcPage.h index 0153e5b7..3c216689 100644 --- a/huagao/CImageProcPage.h +++ b/huagao/CImageProcPage.h @@ -30,7 +30,7 @@ public: BOOL m_ckbRemoveHole; BOOL m_ckbHSVCorrect; BOOL m_ckbDetachNoise; - void ImageProcPageUpdate(int val,int twss,int cmduplexsel, bool is_Crop); + void ImageProcPageUpdate(int val,int twss,int cmduplexsel, bool is_Crop,int dpi); void ImageAutoDescrewUpdate(int val); void EnableOutHoleCheckChanged(BOOL enable); void SetOutHoleValue(int value); @@ -41,6 +41,7 @@ public: int threshold; int twss; int cmduplexsel; + int dpi; bool is_convex; bool is_crop; bool is_bw; diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 9e162a10..f06641d1 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -54,13 +54,15 @@ BOOL CTwainUI::OnInitDialog() this->SetWindowText(TWAIN_NAME); auto dataChangeFunction = [this]() { - m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(),m_pageBasic->m_cmBoxSS->GetCurSel(),m_pageBasic->m_cmBoxDuplex->GetCurSel(), - (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel())== TwSS::USStatement)||(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None)); - m_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel()); - m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); - //m_pageFeedPaper->FeedAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); - UpdateUi(); - m_pageBasic->OnNMReleasedcaptureSliderdpi(nullptr, nullptr); + if (m_pageBasic.get() && m_pageImageProc.get() && m_pageBrightness.get() && m_pageFeedPaper.get()) { + m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(), + (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None), m_pageBasic->m_Slider_Dpi.m_iPosition); + m_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel()); + m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); + //m_pageFeedPaper->FeedAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); + UpdateUi(); + m_pageBasic->OnNMReleasedcaptureSliderdpi(nullptr, nullptr); + } }; int nPageID = 0; @@ -77,10 +79,6 @@ 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_sleepmode(false); #ifdef G200 if (m_hardwareVersion.size() > 9 && m_hardwareVersion.substr(2,2) == "39") { @@ -99,12 +97,17 @@ BOOL CTwainUI::OnInitDialog() setvisable_fixedpaper(false); setvisable_dogear(true); setvisable_size(true); + if ((m_hardwareVersion[5] == 'B' && atoi(m_hardwareVersion.substr(6, 4).c_str()) >= 430) || (m_hardwareVersion[5] > 'B')) + m_pageBasic->m_Edit_Dpi.SetParams(100, 600, 10); } else { setvisable_dogear(false); setvisable_size(false); setvisable_autopaper(false); setvisable_fixedpaper(false); + + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_HIDE); + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_HIDE); } #else #ifndef ANDROIDSERIAL @@ -119,15 +122,30 @@ BOOL CTwainUI::OnInitDialog() } setvisable_dogear(true); setvisable_size(true); - setvisable_fixedpaper(true); + setvisable_fixedpaper(false); + m_pageBasic->m_Edit_Dpi.SetParams(100, 600, 10); } else { - setvisable_dogear(false); - if(((atoi(m_hardwareVersion.substr(4, 2).c_str()) == 22)&& (atoi(m_hardwareVersion.substr(6,4).c_str())> 401))||((atoi(m_hardwareVersion.substr(4, 2).c_str()) > 22))) + + if (atoi(m_hardwareVersion.substr(4, 6).c_str()) >= 220401) + { setvisable_size(true); + } else + { setvisable_size(false); + } + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_HIDE); + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_HIDE); +#ifdef G400 + if (atoi(m_hardwareVersion.substr(4, 6).c_str()) >= 220117) + { + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_SHOW); + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_SHOW); + } +#endif // G400 + setvisable_dogear(false); setvisable_autopaper(false); setvisable_fixedpaper(false); } @@ -136,9 +154,17 @@ BOOL CTwainUI::OnInitDialog() setvisable_size(false); setvisable_autopaper(false); setvisable_fixedpaper(false); + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_HIDE); + ((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_HIDE); #endif #endif // G200 //setvisable_fixedpaper(false); + + + UpdateUI(); + UpdateListConfig(); + dataChangeFunction(); + setvisable_sleepmode(false); return true; } @@ -154,12 +180,14 @@ BEGIN_MESSAGE_MAP(CTwainUI, CDialogEx) ON_BN_CLICKED(IDC_BTNRECOVERYCONFIG, &CTwainUI::OnBnClickedBtnrecoveryconfig) ON_LBN_SELCHANGE(IDC_LSTCONFIG, &CTwainUI::OnLbnSelchangeLstconfig) ON_WM_CLOSE() + ON_NOTIFY(NM_CLICK, IDC_TAB, &CTwainUI::OnNMClickTab) END_MESSAGE_MAP() void CTwainUI::OnBnClickedConfirm() { // TODO: 在此添加控件通知处理程序代码 + OnNMClickTab(nullptr, nullptr); CONFIGPARAMS cfg = { 0 }; UpDateScanParam(&cfg); m_glue.m_scan(*settings); @@ -323,7 +351,7 @@ void CTwainUI::UpdateUI() m_pageFeedPaper->UpdateData(FALSE); m_pageBasic->updateCmbDuplex(TRUE); m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(), - (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None)); + (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None),m_pageBasic->m_Slider_Dpi.m_iPosition); } void CTwainUI::UpdateFilterCmbx() @@ -877,3 +905,15 @@ LRESULT CTwainUI::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) return CDialogEx::WindowProc(message, wParam, lParam); } + + + +void CTwainUI::OnNMClickTab(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: 在此添加控件通知处理程序代码 + //*pResult = 0; + m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(), + (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None), + m_pageBasic->m_Slider_Dpi.m_iPosition); + +} diff --git a/huagao/CTwainUI.h b/huagao/CTwainUI.h index 027083fb..da171909 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -230,4 +230,6 @@ private: std::string m_confirmtitle; virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); +public: + afx_msg void OnNMClickTab(NMHDR* pNMHDR, LRESULT* pResult); }; diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index bca92d0d..ee46a078 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -124,7 +124,11 @@ static map msgs = { {UsbSupported::USB_BULK_ERROR,"USBݶȡ"}, {UsbSupported::V4L2_AQULRE_ERROR,"ɨȡͼʧܣ"}, {UsbSupported::V4L2_IMAGE_EMPTY,"ɨͼ쳣"}, - {UsbSupported::SLEEPING,"豸ģʽ밴Դرߣ"}, +#ifdef G200 + {UsbSupported::SLEEPING,"豸ģʽֶ豸"}, +#else + {UsbSupported::SLEEPING,"豸ģʽΪ豸"}, +#endif // G200 {UsbSupported::HAVE_DOGEAR,"⵽۽ǣֹͣɨ裡"}, {UsbSupported::MLTOP_TIMEOUT,"̨̧δָλã"}, {UsbSupported::PAPER_HOLE,"ֽпףʹôģʽɨ裡"}, diff --git a/huagao/Device/GScanO1003399.cpp b/huagao/Device/GScanO1003399.cpp index 09025aad..2ce64a70 100644 --- a/huagao/Device/GScanO1003399.cpp +++ b/huagao/Device/GScanO1003399.cpp @@ -231,6 +231,7 @@ std::uint32_t GScanO1003399::GetMotorFPGA() fw.resize(scanner_read_reg(m_usb, SR_GET_MBVERSION_LENGHT)); scanner_write_reg(m_usb, SR_GET_MBVERSION,0); m_usb->read_bulk(&fw[0], fw.size()); + //read_data(&fw[0], fw.length(), 200); } return atoi(fw.c_str()); } @@ -295,7 +296,14 @@ void GScanO1003399::config_params(GScanCap& param) //cfg.g200params.is_fixedpaper = param.en_fixedpaper; cfg.g200params.is_fixedpaper = true; //220513 重影问题默认固定幅面采集 cfg.g200params.en_anlogic_key = true; - + +#ifdef G200 + if ((fwversion[5] == 'A' && (atoi(fwversion.substr(6, 4).c_str()) > 1220)) || (fwversion[5] == 'B' && (atoi(fwversion.substr(6, 4).c_str()) <= 430))) + { + if (param.resolution_dst == 500) + param.resolution_dst = 501; + } +#endif // G200 config_scanparam(cfg); config_imgprocparam({sizeof(GScanCap_3399)}); GScanCap_3399 param39{ 0 }; @@ -336,6 +344,10 @@ void GScanO1003399::config_params(GScanCap& param) param39.resolution_dst = param.is_high_imagequality ? param.resolution_dst : ( param.resolution_dst >= 500.0f ?300.0f: 200.0f); //param39.resolution_dst = param.resolution_dst > 300 ? 300 : param.resolution_dst; param39.resolution_native = param.is_high_imagequality? param.resolution_native : (param.resolution_dst >= 500.0f ? 300.0f : 200.0f); + if (param39.resolution_dst >= 300 && param39.resolution_dst < 500) + param39.noise = param39.noise * 1.5; + else if(param39.resolution_dst>=500) + param39.noise = param39.noise * 3; param39.scannum = param.scannum; param39.sharpen = param.sharpen; param39.threshold = param.threshold; @@ -773,6 +785,8 @@ void GScanO1003399::imgproce(std::shared_ptr>& buff) _tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\tessdata\\osd.traineddata")); #elif defined MAKERIGHTWAY _tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\tessdata\\osd.traineddata")); +#elif defined CUMTENN + _tcscat(szIniFile, _T("\\twain_32\\CumTennScan\\tessdata\\osd.traineddata")); #elif defined NOLOGO _tcscat(szIniFile, _T("\\twain_32\\Scan\\tessdata\\osd.traineddata")); #else @@ -1045,8 +1059,8 @@ void GScanO1003399::proc(bool bcachemode) } buffer = imgs.Take(); } - //if (m_param.resolution_dst > 500) - // std::this_thread::sleep_for(std::chrono::milliseconds(4399)); + if (m_param.resolution_dst > 500) + std::this_thread::sleep_for(std::chrono::milliseconds(4399)); imgproce(buffer); } } diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index c1cf5b40..a1db8cd6 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -210,7 +210,7 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) if (m_pImages->empty()) { DoEvents(); std::this_thread::sleep_for(std::chrono::milliseconds(10)); - if (sw.elapsed_s() > 30.00) + if (sw.elapsed_s() > 60.00) { if (m_threadUsb && m_threadUsb->joinable()) { devState = DEV_STOP; @@ -607,7 +607,7 @@ void GScanO200::usbmain() break; } - if (sw.elapsed_ms() > 30000) + if (sw.elapsed_ms() > 60000) { m_pImages->setscanflags(false); //devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP; diff --git a/huagao/Device/GScanO400.cpp b/huagao/Device/GScanO400.cpp index 1ce20107..c7e2685f 100644 --- a/huagao/Device/GScanO400.cpp +++ b/huagao/Device/GScanO400.cpp @@ -12,135 +12,135 @@ //u32_CMD typedef enum tagUsbKeyWords : UINT32 { - //无命令 + // NO_COMMAND = 0, - //获取dsp 状态 + //ȡdsp ״̬ GET_DSP_STATUS = 1, - //取图 + //ȡͼ GET_IMAGE = 2, - //销毁DSP中驻存的图 + //DSPפͼ POP_IMAGE = 3, - //开始扫描命令 + //ʼɨ START_COMMAND = 4, - //停止扫描命令 + //ֹͣɨ STOP = 5, - //获取扫描仪扫描模式 + //ȡɨɨģʽ GET_SCAN_MODE = 6, - //获取固件版本号 + //ȡ̼汾 GET_FW_VERSION = 7, - //返回PC端的状态 + //PC˵״̬ SEND_STATUS_PC = 8, - //下发扫描配置参数 + //·ɨò CONFIGURED_DATA = 9, - //下发固件信息 + //·̼Ϣ SEND_FW = 10, - //获取扫描参数 + //ȡɨ GET_CONFIG_DATA = 11, - //获取扫描总张数 + //ȡɨ GET_SCANN_NUM = 12, - //获取有无纸的状态 + //ȡֽ״̬ GET_PAPERFEEDER_STATUS = 13, - //DSP初始化 + //DSPʼ INIT_HARDWARE_SYS = 14, - //获取有无纸的状态 + //ȡֽ״̬ GET_PAPER_STATUS = 0x0d, - //下发元器件配置参数(灰度,LED R曝光时间) + //·ԪòҶȣLED Rعʱ䣩 SEND_COMPONENTS_GR = 15, - //下发元器件配置参数(LED G/B曝光时间) + //·ԪòLED G/Bعʱ䣩 SEND_COMPONENTS_GB = 16, - //下发扫描模式 + //·ɨģʽ SEND_SCAN_MODE = 17, - //开始进行平场矫正 + //ʼƽ START_FLAT = 18, - //停止平场矫正 + //ֹͣƽ STOP_FLAT = 19, - //下发200dpi彩色平场矫正参数 + //·200dpiɫƽ SEND_200_COLOR_FLAT_DATA = 20, - //下发300dpi彩色平场矫正参数 + //·300dpiɫƽ SEND_300_COLOR_FLAT_DATA = 21, - //获取200dpi彩色平场矫正参数 + //ȡ200dpiɫƽ GET_200_COLOR_FLAT_DATA = 22, - //获取300dpi彩色平场矫正参数 + //ȡ300dpiɫƽ GET_300_COLOR_FLAT_DATA = 23, - //下发200dpi灰度平场校正参数 + //·200dpiҶƽУ SEND_200_GRAY_FLAT_DATA = 24, - //下发300dpi灰度平场校正参数 + //·300dpiҶƽУ SEND_300_GRAY_FLAT_DATA = 25, - //获取200DPI灰度平场校正参数 + //ȡ200DPIҶƽУ GET_200_GRAY_FLAT_DATA = 26, - //获取300DPI灰度平场校正参数 + //ȡ300DPIҶƽУ GET_300_GRAY_FLAT_DATA = 27, - //下发序列号命令 + //·к SEND_SERIAL = 28, - //获取序列号命令 + //ȡк GET_SERIAL = 29, - //获取滚轴数 + //ȡ GET_ROLLER_NUM = 0x1e, - //清零滚轴数 + // CLR_ROLLER_NUM = 0x1f, - //清除扫描总张数 + //ɨ CLR_SCAN_NUM = 0x20, - //准备更新固件 + //׼¹̼ PRE_UPGRADE = 0X21, - //开始更新固件 + //ʼ¹̼ START_UPGRADE = 0x22, - //彩色的AD参数 + //ɫAD RGB_ADI_PARA = 0x23, - //灰度的AD参数 + //ҶȵAD ADI_PARA = 0x24, - //获取CIS参数(曝光时间,ad参数) + //ȡ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个字节 + //ù̼汾һ8ֽ SET_FW_VERSION = 0X2c, - //获取DSP版本 + //ȡDSP汾 GET_DSP_VERSION = 0X2d, - //采集板FPGA固件版本 + //ɼFPGA̼汾 GET_SCANFPGA_VERSION = 0x2e, - //电机板FPGA固件版本 + //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信息 + //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, - CLEAR_HWERROR = 0x40,//G400 清除硬件异常 - //设置纵向畸变系数 + CLEAR_HWERROR = 0x40,//G400 Ӳ쳣 + //ϵ SET_JUST_COF_V = 0x41, - //读取纵向畸变系数 + //ȡϵ GET_JUST_COF_V = 0x42, - //设置扫描仪编码 + //ɨDZ GET_CODE_G400 = 0x59, - //读取扫描仪编码 + //ȡɨDZ SET_CODE_G400 = 0x60, - //设置扫描仪编码 + //ɨDZ SET_CODE_G200 = 0x63, - //读取扫描仪编码 + //ȡɨDZ GET_CODE_G200 = 0x64, } UsbKeyWords, * PUsbKeyWords; @@ -184,6 +184,11 @@ void GScanO400::open(int vid, int pid) m_usb = *usbs.begin(); m_usb->set_usbhotplug_callback(usbhotplug_callback, this); bool ret = m_usb->open(); + if (notifyscan() < 1) + { + Set_ErrorCode(SLEEPING); + return; + } USBCB status = { GET_DSP_STATUS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) { @@ -206,7 +211,7 @@ int GScanO400::aquire_bmpdata(std::vector& bmpdata) if (m_pImages->empty()) { DoEvents(); this_thread::sleep_for(chrono::milliseconds(1)); - if (sw.elapsed_s() > 30.00) + if (sw.elapsed_s() > 60.00) { int roller_num_new = Get_Roller_num(); if (m_threadUsb && m_threadUsb->joinable()) { @@ -215,7 +220,7 @@ int GScanO400::aquire_bmpdata(std::vector& bmpdata) m_threadUsb.reset(); FileTools::writelog(log_ERROR, "aquire_bmpdata m_threadUsb.reset()"); } - Stop_scan();//停止扫描 + Stop_scan();//ֹͣɨ ResetScanner(); set_scannum(abs(roller_num_new - roller_num)); return HARDWARE_ERROR; @@ -371,6 +376,7 @@ void GScanO400::config_params(GScanCap& params) if (params.papertype == 52 || params.papertype == 54 || params.papertype == 131 || params.papertype == 0) cfgdata = (cfgdata & 0xffffffe0) + 18; } +#ifdef G400 if (atoi(fw.substr(4, 6).c_str()) >= 220117) { int dpi = 1; @@ -406,6 +412,7 @@ void GScanO400::config_params(GScanCap& params) } } else +#endif // G400 params.resolution_native = 200.0f; gcap = params; USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 }; @@ -493,7 +500,8 @@ int GScanO400::notifyscan() m_usb->read_bulk(¬ify, sizeof(notify)); if ((notify.u32_Data != 0x10 && GetFWVersion().length() < 10) || notify.u32_Data == 0x100) { - ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("扫描仪处于休眠状态,请按电源键唤醒! 提示 "), NULL, SW_HIDE); + std::string text = msgs[UsbSupported::SLEEPING]; + ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text).c_str()), NULL, SW_HIDE); return -1; } return 1; @@ -587,6 +595,7 @@ std::string GScanO400::get_scannercode() { if (!(m_usb.get() && m_usb->is_connected())) return NULL; + //return "12345678901234567890123456789012"; USBCB usb{ GET_CODE_G400,0,32 }; m_usb->write_bulk(&usb, sizeof(USBCB)); std::this_thread::sleep_for(std::chrono::milliseconds(20)); @@ -653,7 +662,7 @@ void GScanO400::usbmain() this_thread::sleep_for(chrono::milliseconds(200)); break; } - if (sw.elapsed_ms() > 30000) + if (sw.elapsed_ms() > 60000) { m_pImages->setscanflags(false); Set_ErrorCode(AQUIRE_IMAGE_TIMEOUT); @@ -702,7 +711,7 @@ void GScanO400::usbmain() UpdateScanInfo(countNReaded(), get_imgTransfered()); #endif Pop_Image(); - FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_imgnReaded()) + "份文件。耗时 " + to_string(sw.elapsed_ms())); + FileTools::writelog(log_INFO, "ɨǽ" + to_string(get_imgnReaded()) + "ļʱ " + to_string(sw.elapsed_ms())); sw.reset(); break; } @@ -779,8 +788,9 @@ std::shared_ptr> GScanO400::Get_Img_Data(int bufferSize) 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); //数据接收量必须小于等于管道内数据量,否则会接收失败 + startindex += m_usb->read_bulk(imData->data() + startindex, (bufferSize - startindex) < totalength ? (bufferSize - startindex) : totalength); //ݽСڵڹܵʧ std::this_thread::sleep_for(std::chrono::microseconds(10)); + FileTools::writelog(log_ERROR, "usb read buffer "+to_string(startindex)); } if (sw.elapsed_ms() > 5000) { diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index 5e448d1a..96eadb4d 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -7,6 +7,7 @@ #include #include "StopWatch.h" #include "ImageProcess/ImageMulti.h" +#include using namespace cv; @@ -164,7 +165,7 @@ void ImageMatQueue::setparam(const GScanCap& param) m_iaList.clear(); - if (scanParam.fillhole.is_fillhole) { + if (scanParam.fillhole.is_fillhole && scanParam.resolution_dst < 500) { float ratio = scanParam.fillhole.fillholeratio / 100.0; m_iaList.push_back(shared_ptr(new CImageApplyOutHole(200, ratio, 50))); } //确保能够获取正反两面图 @@ -335,6 +336,8 @@ void ImageMatQueue::setparam(const GScanCap& param) _tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\tessdata\\osd.traineddata")); #elif defined NOLOGO _tcscat(szIniFile, _T("\\twain_32\\Scan\\tessdata\\osd.traineddata")); +#elif defined CUMTENN + _tcscat(szIniFile, _T("\\twain_32\\CumTennScan\\tessdata\\osd.traineddata")); #else _tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\tessdata\\osd.traineddata")); #endif // @@ -396,6 +399,7 @@ void ImageMatQueue::cache_run() auto buffs = m_rawBuffs.Take()->getImageBuffs(); buffs.size() == 2 ? info.scannerType = ScannerSerial::G200Serial : info.scannerType = ScannerSerial::G400Serial; + for (auto& buf : buffs) { StopWatch sw; @@ -530,222 +534,93 @@ void ImageMatQueue::proc() FileTools::writelog(log_ERROR, msg); continue; } - - ImreadModes rmc; - if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect) - rmc = IMREAD_COLOR; - else - rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE; - - std::vector mats; - std::vector uvmats; - StopWatch sw; - if (info.scannerType == ScannerSerial::G200Serial) - { - auto back = m_imgCacheinfo.Take(); - if (!isFileExist(back.path)) - { - msg = "error while reading g200 back image " + back.path + " ,file not exist"; - FileTools::writelog(log_ERROR, msg); - } - sw.reset(); - cv::Mat imgfront = imread(info.path, rmc); - msg = "reading image front time elapsed_ms:" + std::to_string(sw.elapsed_ms()); - FileTools::writelog(log_DEBUG, msg); - sw.reset(); - cv::Mat imgback = imread(back.path, rmc); - msg = "reading image back time elapsed_ms:" + std::to_string(sw.elapsed_ms()); - FileTools::writelog(log_DEBUG, msg); - sw.reset(); - if (!imgfront.empty() && !imgback.empty()) - { - if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { - cv::flip(imgback, imgback, 0); - cv::flip(imgback, imgback, 1); - } - mats.push_back(scanParam.is_switchfrontback ? imgback : imgfront); - mats.push_back(scanParam.is_switchfrontback ? imgfront : imgback); - remove(info.path.c_str()); - remove(back.path.c_str()); - } - else - { - msg = "get empty mat! empty "; - msg += (imgfront.empty() ? " front image" : " back image"); - FileTools::writelog(log_ERROR, msg); - } - - for (size_t i = 0; i < mats.size(); i++) - { - if (!mats[i].empty()) - cv::resize(mats[i], mats[i], cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 - } - - //if (scanParam.en_fold != 0) { //对折前旋转屏蔽 20211214 奥鸽要求 - // cv::flip(mats[0], mats[0], 1); - // cv::flip(mats[0], mats[0], 0); - //} - } - else - { - auto mat = imread(info.path, rmc); - //cv::imwrite("D:\\img"+to_string(indeximg++)+".jpg", mat); - //auto mat = imread(info.path, IMREAD_COLOR); - //if (rmc == IMREAD_GRAYSCALE) - // cvtColor(mat, mat, CV_RGB2GRAY); - if (!mat.empty()) - { - Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows-10));//避免图像尾部出现无效数据丢弃10行数据 - Mat back = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows-10));//避免图像尾部出现无效数据丢弃10行数据 - if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { - cv::flip(front, front, 0); - cv::flip(front, front, 1); - } -#ifdef UV - mats.push_back(scanParam.is_switchfrontback ? front : back); - mats.push_back(scanParam.is_switchfrontback ? back : front); -#else - - - mats.push_back(scanParam.is_switchfrontback ? front : back); - mats.push_back(scanParam.is_switchfrontback ? back : front); -#endif - front.release(); - back.release(); - remove(info.path.c_str()); - } - else - { - msg = "g400 get empty mat! empty "; - FileTools::writelog(log_ERROR, msg); - } -#ifdef UV - if (scanParam.hardwarecaps.en_uv)//EN UV - { - auto uvinfo = m_imgCacheinfo.Take(); - auto matuv = imread(uvinfo.path, IMREAD_COLOR); - if (!matuv.empty()) - { - Mat front = matuv(Rect(0, 0, mat.cols / 2, mat.rows)); - Mat back = matuv(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows)); - if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { - cv::flip(front, front, 0); - cv::flip(front, front, 1); - } - uvmats.push_back(scanParam.is_switchfrontback ? front : back); - uvmats.push_back(scanParam.is_switchfrontback ? back : front); - front.release(); - back.release(); - remove(uvinfo.path.c_str()); - } - } -#endif - }//g400 serials - FileTools::writelog(log_DEBUG, " start image process "); - std::vector rects; - std::vector angleResults; - bool isDesaskew = false; - sw.reset(); - for (int j = 0; j < m_iaList.size(); j++) { - m_iaList[j]->apply(mats, scanParam.is_duplex); - CImageApply* ptr = m_iaList[j].get(); - if (typeid(*ptr) == typeid(CImageApplyAutoCrop)) - { - rects = dynamic_cast(ptr)->rotatedROIs(); - isDesaskew = dynamic_cast(ptr)->isDesaskew(); - } - else if (typeid(*ptr) == typeid(CImageApplyRotation)) - angleResults = dynamic_cast(ptr)->angleResults(); - } - -#ifdef UV - if (!uvmats.empty()) - { - //拼接原图和UV图 - for (int j = 0; j < mats.size(); j++) - { - if (!scanParam.is_duplex && j == 1) { - mats[j].release(); - break; - } - if (!mats[j].empty()) - { - cv::Mat mergeOrgin_UV = ImageApplyUV::Apply(mats[j], uvmats[j], rects[j], isDesaskew, angleResults.size() > 0 ? angleResults[j] : 0, scanParam.pixtype); - if (!mergeOrgin_UV.empty()) - mats[j] = mergeOrgin_UV; - } - } - rects.clear(); - uvmats.clear(); - } -#endif - FileTools::writelog(log_DEBUG, " image process finish"); - if (!scanParam.is_duplex && mats.size()>1) { - mats.pop_back(); - } - if (scanParam.is_split) - { - splitimg(mats); - } - for (int i = 0; i < mats.size(); i++) { - if (!mats[i].empty()) { - IMat2Bmp idata; -#ifdef UV - if (scanParam.pixtype == 1 && mats[i].channels() == 3)//gray - cv::cvtColor(mats[i], mats[i], COLOR_BGR2GRAY); -#else - if (scanParam.pixtype == 1 && scanParam.hsvcorrect) - if (mats[i].channels() == 3) - cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY); -#endif - if (scanParam.en_multi_output) { - MultiOut(mats[i]); - } - else - { - idata = (scanParam.pixtype == 0 || (((scanParam.automaticcolortype == 0) && (scanParam.automaticcolor == true)) && (mats[i].channels() == 1))) ? - (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst); - if (!scanParam.multi_output_red) - mats[i].release(); - //cv::imwrite("D:\\img\\" + to_string(indeximg++) + ".jpg", mats[i]); - auto data = idata.getBmpDataBuffer(); - EnqueueBmpBuffer(data); - data.reset(); - } - } - else - { - FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++)); - } - } - - if (scanParam.multi_output_red) { - for (int i = 0; i < mats.size(); i++) { - if (!mats[i].empty()) { - ImageMultiOutput m_mlt; - Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2); - mats[i].release(); - if (!ret.empty()) { - if (!scanParam.is_duplex && i == 1) { - ret.release(); - break; - } - Mat2Bmp mb(ret, scanParam.resolution_dst); - auto data = mb.getBmpDataBuffer(); - ret.release(); - EnqueueBmpBuffer(data); - data.reset(); - } - } - } - } - - mats.clear(); -#ifdef UV - PaniusCount(scanParam.hardwarecaps.en_uv ? 2 : 1); -#else - PaniusCount(); -#endif + //if(scanParam.resolution_dst < 500) + duplex_process(info); + //else { + // ImreadModes rmc; + // if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect) + // rmc = IMREAD_COLOR; + // else + // rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE; + // StopWatch sw; + // cv::Mat imgfront; + // cv::Mat imgback; + // if (info.scannerType == G200Serial) + // { + // auto back = m_imgCacheinfo.Take(); + // if (!isFileExist(back.path)) + // { + // msg = "error while reading g200 back image " + back.path + " ,file not exist"; + // FileTools::writelog(log_ERROR, msg); + // } + // imgfront = imread(info.path, rmc); + // msg = "reading image front time elapsed_ms:" + std::to_string(sw.elapsed_ms()); + // FileTools::writelog(log_DEBUG, msg); + // sw.reset(); + // imgback = imread(back.path, rmc); + // msg = "reading image back time elapsed_ms:" + std::to_string(sw.elapsed_ms()); + // FileTools::writelog(log_DEBUG, msg); + // sw.reset(); + // if (!imgfront.empty() && !imgback.empty()) + // { + // if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + // cv::flip(imgback, imgback, 0); + // cv::flip(imgback, imgback, 1); + // } + // cv::resize(imgback, imgback, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 + // cv::resize(imgfront, imgfront, cv::Size(), fx, fy); + // remove(info.path.c_str()); + // remove(back.path.c_str()); + // } + // else + // { + // msg = "get empty mat! empty "; + // msg += (imgfront.empty() ? " front image" : " back image"); + // FileTools::writelog(log_ERROR, msg); + // } + // } + // else + // { + // auto mat = imread(info.path, rmc); + // if (!mat.empty()) + // { + // imgfront = mat(Rect(0, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据 + // imgback = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据 + // if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + // cv::flip(imgfront, imgfront, 0); + // cv::flip(imgfront, imgfront, 1); + // } + // mat.release(); + // remove(info.path.c_str()); + // } + // else + // { + // msg = "g400 get empty mat! empty "; + // FileTools::writelog(log_ERROR, msg); + // } + // } + // if (!imgfront.empty() && !imgback.empty()) { + // if (scanParam.is_duplex) + // { + // single_process(scanParam.is_switchfrontback ? imgback : imgfront); + // imgfront.release(); + // std::this_thread::sleep_for(std::chrono::milliseconds(4399)); + // //::SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1); + // //::EmptyWorkingSet(GetCurrentProcess()); + // single_process(scanParam.is_switchfrontback ? imgfront : imgback); + // std::this_thread::sleep_for(std::chrono::milliseconds(4399)); + // imgback.release(); + // } + // else + // { + // imgback.release(); + // single_process(imgfront); + // std::this_thread::sleep_for(std::chrono::milliseconds(4399)); + // imgfront.release(); + // } + // } + // PaniusCount(); + //} } } @@ -768,6 +643,286 @@ void ImageMatQueue::splitimg(std::vector& mats) { mats.swap(tmp); } +void ImageMatQueue::duplex_process(CacheInfo info) +{ + std::string msg; + ImreadModes rmc; + if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect) + rmc = IMREAD_COLOR; + else + rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE; + + std::vector mats; + std::vector uvmats; + StopWatch sw; + if (info.scannerType == ScannerSerial::G200Serial) + { + auto back = m_imgCacheinfo.Take(); + if (!isFileExist(back.path)) + { + msg = "error while reading g200 back image " + back.path + " ,file not exist"; + FileTools::writelog(log_ERROR, msg); + } + sw.reset(); + cv::Mat imgfront = imread(info.path, rmc); + msg = "reading image front time elapsed_ms:" + std::to_string(sw.elapsed_ms()); + FileTools::writelog(log_DEBUG, msg); + sw.reset(); + cv::Mat imgback = imread(back.path, rmc); + msg = "reading image back time elapsed_ms:" + std::to_string(sw.elapsed_ms()); + FileTools::writelog(log_DEBUG, msg); + sw.reset(); + if (!imgfront.empty() && !imgback.empty()) + { + if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + cv::flip(imgback, imgback, 0); + cv::flip(imgback, imgback, 1); + } + mats.push_back(scanParam.is_switchfrontback ? imgback : imgfront); + mats.push_back(scanParam.is_switchfrontback ? imgfront : imgback); + remove(info.path.c_str()); + remove(back.path.c_str()); + } + else + { + msg = "get empty mat! empty "; + msg += (imgfront.empty() ? " front image" : " back image"); + FileTools::writelog(log_ERROR, msg); + } + + for (size_t i = 0; i < mats.size(); i++) + { + if (!mats[i].empty()) + cv::resize(mats[i], mats[i], cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 + } + + //if (scanParam.en_fold != 0) { //对折前旋转屏蔽 20211214 奥鸽要求 + // cv::flip(mats[0], mats[0], 1); + // cv::flip(mats[0], mats[0], 0); + //} + } + else + { + auto mat = imread(info.path, rmc); + if (!mat.empty()) + { + Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据 + Mat back = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据 + if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + cv::flip(front, front, 0); + cv::flip(front, front, 1); + } +#ifdef UV + mats.push_back(scanParam.is_switchfrontback ? front : back); + mats.push_back(scanParam.is_switchfrontback ? back : front); +#else + + + mats.push_back(scanParam.is_switchfrontback ? front : back); + mats.push_back(scanParam.is_switchfrontback ? back : front); +#endif + front.release(); + back.release(); + remove(info.path.c_str()); + } + else + { + msg = "g400 get empty mat! empty "; + FileTools::writelog(log_ERROR, msg); + } +#ifdef UV + if (scanParam.hardwarecaps.en_uv)//EN UV + { + auto uvinfo = m_imgCacheinfo.Take(); + auto matuv = imread(uvinfo.path, IMREAD_COLOR); + if (!matuv.empty()) + { + Mat front = matuv(Rect(0, 0, mat.cols / 2, mat.rows)); + Mat back = matuv(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows)); + if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + cv::flip(front, front, 0); + cv::flip(front, front, 1); + } + uvmats.push_back(scanParam.is_switchfrontback ? front : back); + uvmats.push_back(scanParam.is_switchfrontback ? back : front); + front.release(); + back.release(); + remove(uvinfo.path.c_str()); + } + } +#endif + }//g400 serials + FileTools::writelog(log_DEBUG, " start image process "); + std::vector rects; + std::vector angleResults; + bool isDesaskew = false; + sw.reset(); + for (int j = 0; j < m_iaList.size(); j++) { + m_iaList[j]->apply(mats, scanParam.is_duplex); + CImageApply* ptr = m_iaList[j].get(); + if (typeid(*ptr) == typeid(CImageApplyAutoCrop)) + { + rects = dynamic_cast(ptr)->rotatedROIs(); + isDesaskew = dynamic_cast(ptr)->isDesaskew(); + } + else if (typeid(*ptr) == typeid(CImageApplyRotation)) + angleResults = dynamic_cast(ptr)->angleResults(); + } + +#ifdef UV + if (!uvmats.empty()) + { + //拼接原图和UV图 + for (int j = 0; j < mats.size(); j++) + { + if (!scanParam.is_duplex && j == 1) { + mats[j].release(); + break; + } + if (!mats[j].empty()) + { + cv::Mat mergeOrgin_UV = ImageApplyUV::Apply(mats[j], uvmats[j], rects[j], isDesaskew, angleResults.size() > 0 ? angleResults[j] : 0, scanParam.pixtype); + if (!mergeOrgin_UV.empty()) + mats[j] = mergeOrgin_UV; + } + } + rects.clear(); + uvmats.clear(); + } +#endif + FileTools::writelog(log_DEBUG, " image process finish"); + if (!scanParam.is_duplex && mats.size() > 1) { + mats.pop_back(); + } + if (scanParam.is_split) + { + splitimg(mats); + } + for (int i = 0; i < mats.size(); i++) { + if (!mats[i].empty()) { + IMat2Bmp idata; +#ifdef UV + if (scanParam.pixtype == 1 && mats[i].channels() == 3)//gray + cv::cvtColor(mats[i], mats[i], COLOR_BGR2GRAY); +#else + if (scanParam.pixtype == 1 && scanParam.hsvcorrect) + if (mats[i].channels() == 3) + cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY); +#endif + if (scanParam.en_multi_output) { + MultiOut(mats[i]); + } + else + { + idata = (scanParam.pixtype == 0 || (((scanParam.automaticcolortype == 0) && (scanParam.automaticcolor == true)) && (mats[i].channels() == 1))) ? + (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst); + if (!scanParam.multi_output_red) + mats[i].release(); + //cv::imwrite("D:\\img\\" + to_string(indeximg++) + ".jpg", mats[i]); + auto data = idata.getBmpDataBuffer(); + EnqueueBmpBuffer(data); + data.reset(); + } + } + else + { + FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++)); + } + } + + if (scanParam.multi_output_red) { + for (int i = 0; i < mats.size(); i++) { + if (!mats[i].empty()) { + ImageMultiOutput m_mlt; + Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2); + mats[i].release(); + if (!ret.empty()) { + if (!scanParam.is_duplex && i == 1) { + ret.release(); + break; + } + Mat2Bmp mb(ret, scanParam.resolution_dst); + auto data = mb.getBmpDataBuffer(); + ret.release(); + EnqueueBmpBuffer(data); + data.reset(); + } + } + } + } + + mats.clear(); +#ifdef UV + PaniusCount(scanParam.hardwarecaps.en_uv ? 2 : 1); +#else + PaniusCount(); +#endif +} + +void ImageMatQueue::single_process(cv::Mat& mat) +{ + FileTools::writelog(log_DEBUG, " start image process "); + StopWatch sw; + for (int j = 0; j < m_iaList.size(); j++) { + m_iaList[j]->apply(mat, false); + } + FileTools::writelog(log_DEBUG, " image process finish"); + std::vector mats; + mats.push_back(mat); + if (scanParam.is_split) + { + splitimg(mats); + } + for (int i = 0; i < mats.size(); i++) { + if (!mats[i].empty()) { + IMat2Bmp idata; + if (scanParam.pixtype == 1 && scanParam.hsvcorrect) + if (mats[i].channels() == 3) + cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY); + if (scanParam.en_multi_output) { + MultiOut(mats[i]); + } + else + { + idata = (scanParam.pixtype == 0 || (((scanParam.automaticcolortype == 0) && (scanParam.automaticcolor == true)) && (mats[i].channels() == 1))) ? + (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst); + if (!scanParam.multi_output_red) + mats[i].release(); + //cv::imwrite("D:\\img\\" + to_string(indeximg++) + ".jpg", mats[i]); + auto data = idata.getBmpDataBuffer(); + EnqueueBmpBuffer(data); + data.reset(); + } + } + else + { + FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++)); + } + } + + if (scanParam.multi_output_red) { + for (int i = 0; i < mats.size(); i++) { + if (!mats[i].empty()) { + ImageMultiOutput m_mlt; + Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2); + mats[i].release(); + if (!ret.empty()) { + if (!scanParam.is_duplex && i == 1) { + ret.release(); + break; + } + Mat2Bmp mb(ret, scanParam.resolution_dst); + auto data = mb.getBmpDataBuffer(); + ret.release(); + EnqueueBmpBuffer(data); + data.reset(); + } + } + } + } + mats.clear(); +} + G400Decode::G400Decode(std::shared_ptr> buff) { m_buffs.push_back(buff); diff --git a/huagao/Device/ImageMatQueue.h b/huagao/Device/ImageMatQueue.h index bbed177d..b402b838 100644 --- a/huagao/Device/ImageMatQueue.h +++ b/huagao/Device/ImageMatQueue.h @@ -227,6 +227,8 @@ private: void PaniusCount(int count = 1); void init_cachethread(); void splitimg(std::vector& mats); + void duplex_process(CacheInfo info); + void single_process(cv::Mat& mat); void cache_run(); void MultiOut(cv::Mat & pDid); //清除缓存文件 diff --git a/huagao/Device/PublicFunc.cpp b/huagao/Device/PublicFunc.cpp index 65567415..fb7b5e67 100644 --- a/huagao/Device/PublicFunc.cpp +++ b/huagao/Device/PublicFunc.cpp @@ -467,6 +467,8 @@ CString GetHidedlgPath() _tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\hidedlg.exe")); #elif defined LANXUM _tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\hidedlg.exe")); +#elif defined CUMTENN + _tcscat(szIniFile, _T("\\twain_32\\CumTennScan\\hidedlg.exe")); #elif defined MAKERIGHTWAY _tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\hidedlg.exe")); #elif defined NOLOGO diff --git a/huagao/ImageProcess/ImageApplyDispersion.cpp b/huagao/ImageProcess/ImageApplyDispersion.cpp new file mode 100644 index 00000000..1e334244 --- /dev/null +++ b/huagao/ImageProcess/ImageApplyDispersion.cpp @@ -0,0 +1,43 @@ +#include "ImageApplyDispersion.h" + +CImageApplyDispersion::CImageApplyDispersion(): + m_kernal_b(3, 1, CV_32FC1) + , m_kernal_g(3, 1, CV_32FC1) + , m_kernal_r(3, 1, CV_32FC1) +{ + m_kernal_b.at(0, 0) = 0.15f; + m_kernal_b.at(1, 0) = 1.15f; + m_kernal_b.at(2, 0) = -0.3f; + + m_kernal_g.at(0, 0) = 0.806f; + m_kernal_g.at(1, 0) = 0.484f; + m_kernal_g.at(2, 0) = -0.3f; + + m_kernal_r.at(0, 0) = 0.484f; + m_kernal_r.at(1, 0) = 0.806f; + m_kernal_r.at(2, 0) = -0.3f; +} + +CImageApplyDispersion::~CImageApplyDispersion() +{ +} + +void CImageApplyDispersion::apply(cv::Mat& pDib, int side) +{ + (void)side; + + if (pDib.channels() != 3) return; + + cv::Mat bgr[3]; + cv::split(pDib, bgr); + + cv::filter2D(bgr[0], bgr[0], bgr[0].depth(), m_kernal_b); + cv::filter2D(bgr[1], bgr[1], bgr[1].depth(), m_kernal_g); + cv::filter2D(bgr[2], bgr[2], bgr[2].depth(), m_kernal_r); + + cv::merge(bgr, 3, pDib); +} + +void CImageApplyDispersion::apply(std::vector& mats, bool isTwoSide) +{ +} diff --git a/huagao/ImageProcess/ImageApplyDispersion.h b/huagao/ImageProcess/ImageApplyDispersion.h new file mode 100644 index 00000000..6c52bebb --- /dev/null +++ b/huagao/ImageProcess/ImageApplyDispersion.h @@ -0,0 +1,35 @@ +/* + * ==================================================== + + * ܣɫɢ + * ߣά + * ʱ䣺2021/09/24 + * ޸ʱ䣺2021/11/12 v1.1.0 ع㷨 + * 2022/04/21 v1.2.0 ع㷨 + * 汾ţv1.2.0 + + * ==================================================== + */ + +#ifndef IMAGE_APPLY_DISPERSION_COLOR_H +#define IMAGE_APPLY_DISPERSION_COLOR_H + +#include "ImageApply.h" + +class CImageApplyDispersion : public CImageApply +{ +public: + CImageApplyDispersion(); + + virtual ~CImageApplyDispersion(); + + virtual void apply(cv::Mat& pDib, int side); + + virtual void apply(std::vector& mats, bool isTwoSide); + +private: + cv::Mat m_kernal_b; + cv::Mat m_kernal_g; + cv::Mat m_kernal_r; +}; +#endif diff --git a/huagao/ImageProcess/ImageMulti.cpp b/huagao/ImageProcess/ImageMulti.cpp new file mode 100644 index 00000000..99cc37ef --- /dev/null +++ b/huagao/ImageProcess/ImageMulti.cpp @@ -0,0 +1,98 @@ +#include "ImageMulti.h" +#include "ImageApplyHeaders.h" + +IMageMulti::IMageMulti(int multiType,int thre) +{ + m_multiType = multiType; + m_thre = thre; +} + +IMageMulti::~IMageMulti(void) +{ +} + +std::vector IMageMulti::apply(cv::Mat& pDib) +{ + std::vector retMats; + if (pDib.empty()) + return retMats; + retMats.push_back(pDib); + switch (m_multiType) + { + case ALL: + { + if (pDib.channels() == 3){ + cv::Mat dst; + cv::cvtColor(pDib, dst,cv::COLOR_BGR2GRAY); + retMats.push_back(dst); + } + cv::Mat dstThre; + cv::cvtColor(pDib, dstThre,cv::COLOR_BGR2GRAY); + //cv::threshold(dstThre, dstThre, m_thre, 255, cv::THRESH_BINARY); + CImageApplyBWBinaray bw(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY); + bw.apply(dstThre, 0); + //cv::adaptiveThreshold(dstThre,dstThre,255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY,25,5); + if (!dstThre.empty()) + { + retMats.push_back(dstThre); + } + } + break; + case COLORGRAY: + { + if (pDib.channels() == 3) { + cv::Mat dstGray; + cv::cvtColor(pDib, dstGray, cv::COLOR_BGR2GRAY); + retMats.push_back(dstGray); + } + } + break; + case COLORBW: + { + if (pDib.channels() == 3) { + cv::Mat dstGray; + cv::cvtColor(pDib, dstGray, cv::COLOR_BGR2GRAY); + CImageApplyBWBinaray bw(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY); + bw.apply(dstGray, 0); +// cv::Mat dstBW; +// cv::adaptiveThreshold(dstGray,dstBW,255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY,25,5); + retMats.push_back(dstGray); + } + } + break; + case GRAYBW://pDib should be GreyImage(channels() == 1) + { + cv::Mat dst = pDib.clone(); + CImageApplyBWBinaray bw(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY); + bw.apply(dst, 0); +// cv::Mat dstBW; +// cv::adaptiveThreshold(pDib,dstBW,255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY,25,5); + if (!dst.empty()) + { + retMats.push_back(dst); + } + } + break; + default: + break; + } + return retMats; +} + +std::vector IMageMulti::apply(cv::Mat& pDib, int multitype) +{ + m_multiType = multitype; + return apply(pDib); +} + +std::vector IMageMulti::apply(std::vector& pDib, int multitype) +{ + std::vector m_rets; + m_multiType = multitype; + for (auto& node : pDib) + { + auto nodes = apply(node); + m_rets.insert(m_rets.end(), nodes.begin(), nodes.end()); + } + return m_rets; +} diff --git a/huagao/ImageProcess/ImageMulti.h b/huagao/ImageProcess/ImageMulti.h new file mode 100644 index 00000000..e4df724b --- /dev/null +++ b/huagao/ImageProcess/ImageMulti.h @@ -0,0 +1,27 @@ +#ifndef IMAGE_MULTI_H +#define IMAGE_MULTI_H +#include +#include +class IMageMulti +{ +public: + enum MultiOutput + { + NONE=-1, + ALL, + COLORGRAY, + COLORBW, + GRAYBW + }; +public: + IMageMulti(int multiType = 0,int thre = 128); + ~IMageMulti(); + std::vector apply(cv::Mat& pDib); + std::vector apply(cv::Mat& pDib, int multitype); + std::vector apply(std::vector& pDib, int multitype); +private: + int m_multiType; + int m_thre; +}; + +#endif // !IMAGE_MULTI_H \ No newline at end of file diff --git a/huagao/cumtenn.bmp b/huagao/cumtenn.bmp new file mode 100644 index 0000000000000000000000000000000000000000..09d04b2f9eab7c7ca070d38922fdb457b10979b3 GIT binary patch literal 58654 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 DeviceID{ {0x31c9,0x8420}, #elif defined G400 {0x31c9,0x8520}, - + {0x31c9,0x8529}, #endif // ISG100 }; @@ -344,11 +354,35 @@ static std::vector DeviceID{ #endif // ISG100 #elif defined G400 {0x2903,0x7000}, + #ifdef ANDROIDSERIAL + {0x2903,0x7002}, + #else + {0x2903,0x7039}, + #endif // ANDROIDSERIAL #elif defined G300 {0x2903,0x1000}, + #ifdef ANDROIDSERIAL + {0x2903,0x1002}, + #endif // ANDROIDSERIAL + #endif // G200 }; +#elif defined CUMTENN +static std::vector DeviceID{ +#ifdef G200 +#ifdef ISG100 + {0x3072,0x138}, +#else + {0x3072,0x238}, +#endif // ISG100 +#elif defined G300 + {0x3072,0x0303}, +#elif defined G400 + {0x3072,0x0403}, +#endif +}; + #else static std::vector DeviceID{ {0x64B,0x7823}, @@ -396,6 +430,11 @@ static std::unique_ptr scanner(new GScanVirtual()); long __stdcall callback(EXCEPTION_POINTERS* ex) { + if (scanner.get()) + { + if (scanner->IsConnected()) + scanner->Stop_scan(); + } HANDLE handle = CreateFile((FileTools::get_errorlog_path_w()+L"error.dmp").c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(!handle) return EXCEPTION_EXECUTE_HANDLER; @@ -937,12 +976,14 @@ Result HuagaoDs::identityOpenDs(const Identity&) { pid = usb.pid; if (!scanner.get()) { #ifdef G200 - if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629 || pid == 0x130 ||pid == 0x8000 || pid == 0x9000) + if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629 || pid == 0x130 ||pid == 0x8000 || pid == 0x9000 || + pid == 0x138 || pid == 0x238) scanner.reset(new GScanO1003399()); else scanner.reset(new GScanO200()); #else - if (pid == 0x339 || pid == 0x439) + + if (pid == 0x339 || pid == 0x439 || pid == 0x7039 || pid == 0x8529) scanner.reset(new GScanO1003399()); else #ifdef ANDROIDSERIAL @@ -976,7 +1017,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) { CloseHandle(hMutex); hMutex = NULL; } - showmsg("ʾ", msgs[(UsbSupported)81]); return seqError(); } if (!scanner->IsConnected()) { @@ -2302,8 +2342,10 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { int index = scanner->geterrorindex(); if (ret == 82 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽۽ǣֹͣɨ裡", ret); - else if(ret==75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) + else if (ret == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽ߴ粻ֹͣɨ裡", ret); + else if (ret == 81 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) + showmsg("ʾ", "豸ģʽֶ豸", ret); else showmsg("ʾ", msgs[(UsbSupported)ret], ret); FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]); @@ -2385,13 +2427,7 @@ 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 -// while (!scanner->Get_Scanner_PaperOn()) -// { -// if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) -// return seqError(); -// } -//#endif // !G200 + if (!scanner->IsConnected()) scanner->open(vid, pid); @@ -2400,6 +2436,15 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { MessageBox(NULL, L"USB쳣,USB´ɨ", L"ʾ", MB_OK | MB_SYSTEMMODAL); return seqError(); } +#ifndef G200 + if (typeid(*scanner.get()) != typeid(GScanO1003399)) { + while (!scanner->Get_Scanner_PaperOn()) + { + if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) + return seqError(); + } + } +#endif // !G200 this_thread::sleep_for(chrono::milliseconds(100)); //ɨǰӳ ֹusbеϢδȡ ɨ auto ret = startScan(); //if (ret.status().condition() == Twpp::CC::NoMedia) @@ -2573,7 +2618,7 @@ Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { // it does not get easier than that if we already have BMP data = ImageNativeXfer(bmpSize()); std::copy(bmpBegin(), bmpEnd(), data.data().data()); - bmpData.reset(new std::vector); + //bmpData.reset(new std::vector); //FileTools::write_log("ϴͼƬ ===> Twain transfered num of " + to_string(++xtfer) + " images"); FileTools::writelog(log_INFO, "ϴͼƬ ===> Twain transfered num of " + to_string(++xtfer) + " images"); return { ReturnCode::XferDone, ConditionCode::Success }; @@ -2712,20 +2757,18 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) if (!scanner->IsConnected()) return checkDeviceOnline(); } -//#ifndef G200 -// while (!scanner->Get_Scanner_PaperOn()) -// { -// if (scanner->get_ErrorCode() == SLEEPING) { -// showmsg("ʾ", msgs[(UsbSupported)81]); -// scanner->Set_ErrorCode(0); -// return seqError(); -// } -// if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) { -// m_pendingXfers = 0; -// return seqError(); -// } -// } -//#endif // !G200 + +#ifndef G200 + if (typeid(*scanner.get()) != typeid(GScanO1003399)) { + while (!scanner->Get_Scanner_PaperOn()) + { + if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) { + m_pendingXfers = 0; + return seqError(); + } + } + } +#endif // !G200 m_pendingXfers = 1; m_scanparam.reset(new GScanCap(caps)); saveGscanCapSetting(); @@ -2871,12 +2914,14 @@ Twpp::Result HuagaoDs::startScan() scanner->ResetScanner(); scanner->reset(); FileTools::writelog(log_INFO, "start scan"); + #ifdef G200 + scanner->clear_hwerror(); +#else #ifndef ANDROIDSERIAL if (scanner->notifyscan() < 1) return seqError(); #endif // !ANDROIDSERIAL - scanner->clear_hwerror(); #endif // #ifdef G200 @@ -2988,6 +3033,8 @@ Twpp::Result HuagaoDs::startScan() showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽۽ǣֹͣɨ裡", retCode); else if (retCode == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽ߴ粻ֹͣɨ裡", retCode); + else if (retCode == 81 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) + showmsg("ʾ", "豸ģʽֶ豸", retCode); else showmsg("ʾ", msgs[(UsbSupported)retCode], retCode); FileTools::writelog(log_ERROR, msgs[(UsbSupported)retCode]); diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index 3ed68c79f0cf6b46fbf49ce2a81dcd63d9bf3567..e6504eaa0b946170bc8fec95d8767696d0d07032 100644 GIT binary patch delta 38 ucmdnd!@R4PdBdIUlWn$&Fq%&e-0I7l%uvdZ%TU6Q%8760@ooOfr+kF&487 GN+bb!iw^++ delta 49 zcmZ2Cjd24I&0v}A$I7>fb%hY8BZCWrCxbtO;p9R#!_95tc}9~{c*G`e@D$lB=Ow@h E0EJ-=r2qf` diff --git a/huagao/rtw_logo.bmp b/huagao/rtw_logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ab0cab9fef2cd2bc62dbaa003890e14edc6ff23e GIT binary patch literal 74934 zcmeI537izg^~ZYw&1qs3gD9{w%gXM~4!Ap`$v;M;F&fQf%=u3|5>4V2jq#44>>95m zDv2iMZ!jK-ir~xuB8PGa#sd|0b^)(M5Qrik5jEn)<^I2~XR4>BcY3C~r)PJ?+0Uo8 zYU+6Ps`~x9s$RXSKKL7R>T3-7`wXrTw+wd_uEq%QKl3+ojA4jVe?vPGBSMRA{;>Mp zU;Sa}M15Vyoum7s8?j>6r~LF=LqqExk>=Qprsmj8({F06EkvieId-b#5l1*RWXPD0 zk#Arm8k?fxo0?j`P@rrL@rN`w$NwH_jz8WUjXz60Yj95x_W@#CIr^PsL^PFM-eJ;N{=&Ik8Zg zNTlVcNHqS>OupFDP0`o|LPPq6GAY#tX}h9b$fv&3R9?bY>v@PjL#09gTs=(>htsJ` z!=1_J!|B8owdpBMdRl)8hr3cI)ODsdtA(xdYF7CsC>}h2J&{)(^VK=PgMD6!=^0mRdNp>S}Sw;+3Vjv5so47T2| z=WA|m*_V6+h<`? zl@s5T#b|u1_)Wkw)HpcWc%lO zV^RB{a{8kbei|BLV|1B99{!~2D~6w@XzNdPoIqoGeKam(%pjSoG5`6dk}>i71AdyC zV*jIf#%Jzk&NsV}<8{KfYIh{sdX4Zbd2w@8JJkG(x#dw-oV+h0@e!)5?&~;|KBj!V zp6(VuwH=ACArEVuWR&q}8|n9lI}^taS$>PmyDR_K-CaYymx!D?@zq!HS?pY4z+<@` zQ3^ji*V&pZydH`~c2{*4!A}jc*Qu3Tq1HF5ENh!DsdVxC1%9Hf$10w{#r?GXkMf)F zHs)-yoHzf7PiOPJ*wh^VxmAX~k_@9p?Y$>)*0|Et-1>t|$^8HHfr-Ox`DaMYd!BCb zBUD9yAagckGF?J0UqXH+ggR1Id-Ayo;FpP=)P(+to#Zwd6KQ2$U;Ax!G5qj8JXmDM zk`LDTdOc3~iGVR(exP%jUQWXO5kDaW5_3T zx=#2(->{!5C%(*!^l}pJkN9D|cDv#m%wHM~M~7JN5A=swzH@kqwElv2M65E=_}igS z=)-2dXj~s#Ed7kiYxf(QTYo6!^gmzt(FoLbOo<^glW_0iimloI9qveuN8hlgR@{3K z9D>=uQ&+#6v%%9lq4d=M_1>uBCG7Y?US{yzZo$6?XRY&jpPp`~u|?Io`>~=(L^iL%zfH@{NsqkJ8IY*cE=* zg8_?k3pq`$&GiWs%hg{GLPlRvd^bkpUpD!S#;=n&k#W%jD4FIR^D^n8Qy4_t3#uIL z`ihjRtBZe)eU%pON^O9*0}3)8K%^Z%^3K$qdUoQA z3?T=nsA|i>PgB#FsI0@0*-r4Wq`tm&H=#>7xBo+(di_pe;j3Ky&<~T30I>q=q@*BSIRQ(|BPq^NrI9kt|p)Ir|Vd;(Z3I_jk#!hwVc1JTKauiLs{|BScl3_|9%|&nK+d6#%S#8DouRKO;P38 z^L+@K_p0AKi|Kmaa>7G9?)qq5NAl#{$9~oQz<@Fx{e>->$4i8Ee92H zq+O}%5cw{5{9z9E;~c&CdiYWEq#Ek_r%DrF`a=3msO#Pl&7wf2o=DokD(bo*CM}(MY>y?AhnL+kE(o~64`gI*kelO2W8;Lh6Mh<^t@~)tyBmGn zL6YCipN=1J+H3YZd1D1@b)8pi(9T1q)fgoEsSoQmabl-twYNDYdIs|^V+)tD^AWtL zwNa$G_17xD%;Qvk@#$wvKS7x_j8(F(8$iG4c0PG_a(el)!tBK}7dsj~!xLbms1B`E zdLQBHJ@|TfXvgh?%jyRYg+1VBy?W-#R?-PS@;>FA{kE0Ax%EP~EcF?Fut8P)BEtzg zzoyL_`h)uVF~dk3sHdZ!|CTB%c7kH}r_#a4e3d5Hka*(mQ*n%Ym#Dl_j+hs9W5lC@FQu+#X>7T_Ag>vCh?{I`VK$34j^`ADL(adbRm`vuJn`AJxCsO zcIRvTuz0u3+DF-*z9(~2MGL#2ldZhW;TU@?yB}GPg3XOqdZhI%Rjy(_`#E)8Q;*`E z{$zi`Ng-a~G1V9LvUdE)Tt%L#ta;eWIFfhf1pT?m`&H@6is1)6-Pe#MYtAF{k4DxQ zLYFnxfzUowY~c8P4D*_k)xKjn_%Y{8&|}{BBjtFX-=t&?e~awvs5J4-wFq-0+W8-q z51xA1OB9pQa5OrEvN?Ml+OG0PB71*Ey?bO#7CpB0yE*<}(IsT_%6_$+?=W?a9-#OWxs*N;UcCJ2V+U>cvtHKRH?p0JApaYjUED|Iqs%>u2mEJ^19r!_wg?nw9d!hFkWJ&}F~U+n7=HfgARCldjj*mFf%V4lw6w%+ryh ztJ(Md8!|tIXOmzJ^EceZvOh6&X#ArEc&IVwBWBt7`TD$H&uiKvvyTL=zY1O4BpI9d zeF=4*nB5aJ^~H=iKae$pIGN|^bo8*;G^l*SgQUrxzsx^Xyc=Ka&fq(2<&DPAQFBSX zzEWZ6d`HosKYQ4U(9VOIlU+x<@4#JY*Xe_cQ&oBT<%>@BF}L1N;7;l_6XRKk`bX2-?!kv?9v5~nAtjOL_rE&Bw=betKbepR5KR7+m13wB!j7baH zjfo4#8_m7Z8=NWnEc>eWRZPdwmDfk2bG+k9pm~xfdD-S9*;! zWbQ2=V=THD9KBU8j-at#&N6Ke4^Z?7=G{$lf0OCF>riE#KWcQm5q(}nbjS2dAzhPW zcTwg@*5jw;T+25dGZ#*f`UaW0<&1rdb+i(F=+ z{nwM&r6s_owf9+!rineyZ>zmzl^0AOE>5?PQ)z{KDGwiyQ~yf#cO2I#^3FkTH;%k_ zir!MU5%P?mERHC*4IIsyKi+69#9Lr-avwrE^?mH>N}iX{$13J*tLwNMGB7^+0U;;+ zWX?`Rczxx%iDS7NhZ$-CSwsNqM&Bgc=qZC-i!iG!b_;nJGoc{|Pon*f^MQ6w-$PeNAam=K1t@d z=@&oNyspjI0*3xR_X4A$Hp}LDhjeNpV~X3m;5LJyYkJ$J&EEe({;n8)kU9Ii+=*}G zvyAblIDSkS)$9Ta@PI9PY@&%BbALJZ(vUIcU956$N4Kvr&pBjq)Wenly4+C|o1tSO zQ+Ip=_gd|(>doBMn183Ei640fWbaG}06$9a{pS1&jrK+DhO#MAYy|4prV|G<&aBkO znqpz_wx+f-X`bs1l#zgl$=smWds43^2>i%AMfT*8gWP#EWHD>otXEes>=QrPHBNj7 z>fK=0Epw)5d^O>G`v}g%7Oa>^*-IwBWlKxA8{8bt9Q7;EvTV*JUOD*P#=h>gs*k0e z%-5ziHpb%MYf=u2*)lS}%-j>keG3IJmZeSF{laHp_)+t^@y2Rs%KTfMfs$$h{gX4W zU`FogaWxi6K5W8o40TO6&rk)*Oqs-Z{_Q-+7sNgQ`^v-Ab1pd9z$lGisW8zm3 zKXM;klDU!G`z2=&^3ET~p1#fpbE6K$V*y{*PnMmhSuQ(XnQIyD`bDnqrET_mOyyks z0t8G$k8fe_Dgx_U0z=k+4b^e5~o{@H$PR_Ju z&!4LaXmcc#ABQh2*krwK3LuLyo}y1F;TmLc&yL(cJ4Q~Mw zdACVL7`74Rd92ap!4`fNo4DU*^fH~cW>jNm-u1S=*XMxG%UENshqSScwoRxgeiV+{j3o=k z8J_KGwXP^0Hqr*FodUg`ev)+c> zEoM#;$=Wk*M%6r|qLoLI1Y?EEbJXp{bo$|LWBUcyf|#d6)A%kH{FK=Tl+wuh;i*R9WGL z_loRES`^NviG)L&!Uf4MHZW;k;m&wAf0 zntt%p7~MPXjvAy_<=J&WvJjrjy!E+Q3x)1Ib>U~b$wYpA6zIjG| zs~rn2G{$D-I%k8On|Dtv2)%BhS2=!;qS7hD7T!H>DF z($*oe9-^-W?+4IdcHP@ka;{0{XQWy8%F~~mlgs}eUdY^2&D~$6um{}}ot`CY`+;K9 zhTd!%INGf3i&hFdYQJbJHbB?R`GrxLbv$b#Fm$Cy3@r~mJUQglSG^H$$B&#ZlX^#u z8r_Ht@1?&RmHkd7)<2>*)9Vr}z}qUB`{czt+waJE%@e@hjr#lB-iLnh0}VN|owKW8 zj8Wqxb*41_HnYZTRCR)b<5ilpNA?R;n)rIU%9r(@BDtiU-aY3V^_*F_1{}T7D>!04 zhwZ|H^V$s=6D#ruhR&5aS}|Qhep+%}s4LM@5oTNvb;6Gnwd>!Ifp?LYKjTm2IqUk? zXC*$XQ_|yCNqn}l`x}}C@x%OW zrcOiFI3};`$xudgnK>Pr*b|uX=6ztxRhsZTDr@g1_eaR@TpBvI-1k$2)@C)A_WF$H zo@0CrdxA51VLTFBRO^l=uY8uu&p0ICB6hD+=uE!J-0qN4bc0MUg&%pw#hiNn;up(j zPqU9d1=_^=yrqTr_Y-;@l@7yaLHvM+NqXI^T~0zjV1Dyak1rX{errhXGRe!!H@leo zjn(5A^TrkE7uQjOBQP|Mv1mgD$D{W|r(UTudf9V%t}#?6-#uEE*xz+0m6@>^eq^rE z*ccyO$YsAZyu$Xp|57M#p}5>Urg#I8=RExzpfP%8u?d;9xwbIBRhSMzva7xc{<^|_n?}`v#%%nKb$={#o5JAL9SNo<&ldy z&iV6csdcv4_UmP`dxmDS3gJgQrc7@(f=9Rw_+f-?TIMzZj(sOz^><;je~RzSY!(4;ZwfRE7Yq29AqBa7f?5ZIkAV~`hz z+~?VxA;+BS&e0%!rr0^D`jyYzDsR3e{JKC~=-An99+j2-MJagIFKkDJwaPd)l~ zghY?9NYM|{m$eb=mfy1ee>YGZWyZEsgXC4w3U?*HhhDDOcgB0%N5|anPpW)Ce!s(y zyvIe}lsw58rrPR^A2}PByN6npE#GH-WjmiBys$5Hu}&L)uM=6vKRf60b=+WaaxN{G zZ`d%g>CV~lf;%}AVcJWWcedo8&3mg5KdOJq_2*q+>;sOv0>x09u?d>4?w0V%KRP-2 z#&{2$IK^SNy{$H#G~d%+>vG61=lK^Smn%(||ExrZwl)(VyS2B*AK?>O)AVey*N8Ir z-{B=se}FvB%e1R^@k5`r=i!HaQh4#Me`CyPY#cpWr$zYLOq(+QsY~pqOno@*=e}^~ zyN&g7e#2su!+h>{U}#H#INE@1#3;W!IhD(vA9~pdFAni9OF1W+<;2_dZ!%9;^w0$y z!aMegN;&-=9=VHKml>7jjGxGky*d8a-zDt-aCf*r{4ihrl4`5?j6Yqf&&8+Bf6~)M z*QcjfD$IQdhk&0T_g*^_XBs``!sYUBe#h0rzK~#wdE6c4)?28&9Y22e>khwYgiKk#>} zU;OZ1`hnh7oQ^5nY0(?|jKT zE|g9by4$5-6>cL-;Rm@vM{VkgMPD3@<6ByG{$!4#%Z!^aa%G+)u+vh%!NmXRbl|_( zT?eXILB9unkZBpKSJ{-WI}w`F@VU(LN28W(_}tpSWhU4h@JzhUvnbKjT)YZZ^?n|Hq~doDNLSd0Bb zpnI93Qv(m)zvorPcTwu<>OQIV!o`<0fi4S;qgxMD>9UWA+~m*SkTKb>QI5I1bw*6+ zu%_NhT)j#+_jYXhq(bvI5dyGsm&FUV{Y1&VoeuizjM(%Ver)<{i%&mT@KdG_@gqIW z9PaXRF@#O{ahazU+<)^Nw}<^88L!xb&0BAJ;l}(1qs^vTmj&e2vbUCV|2^>&zg@3S z^j3N0P5eZ5$bfCEE3=Q;kMMI*jKFTBx6fS88}}-HqODhHyln}GO`SsV@dvvzFl>GY!tOJk zJ*3eSJ;!tQJo<0)JD&MOKlnL4Z&~4Je1*;zbJ9mGdUDrKW}Su|MC@u6-xSTA*Yoq- zgDAtDa6?$ftoMx})-gsoSELBV$38l`}r&*vm0~%?^qeMaS#;Ai)}#TW_EPS2X&{cY~jD zc-t=V6OG-M8)HQ061z?MNX`H;my`QU} z!yP{(mQ1p2)q>{9Ej_ufiRVAga_H;i?lZULOXXwzb(BS$dgR=5sWK{^@$+!KEWeLe zX?^L-J4f_5mSYb~@gw$Aau$l;f$dQ!+Cll~p?78+@q6xJ)2#E2PX)z`&8W%?SWD~!1%M&*BB({R0IA_%J9zAK7Q~MPA5())y`^qwFfHE1FV4( zzVO4jaqPUCg5;_0(J7-?&v>|FBy)Z!+>xxvS=k`lR;9Il_5ky@NxtwSwmj`dpzDrd z=|sIR{P4Zi?epnWTh-rt03G(-zVO4@)CYoI|13$g_`***`RD%L&sF}mza9`BHuqJn z@rfU?%L?>Qz6R|m>Sl~}b0T=an05cu9h#RkYl6`r#A(O;W*OD8Y#R8ci^ zwFd&|0mhxneU3fyO|H`eU?GnLbGJMFj6a-54g5?+9%I!X)gG|*fY`u+o!5NgXH(GM zJ{kPrjGe&GYrgQ)nK;nayz0+t4^*rNx;amR?sIWqr#nuWBp)N6cR01R8vp+80d&^q_+9siy+Y9YK4QOy4j}ChKS|$rVZ6VeVwL;8=mF&a48|RQ z=eXJP;Xaa!gXSB(!7=`@lj`OkgtnmhsnV1AcJJ(y7;7%Vq?Q(wa z-kI2qv!^fk!4KuO4)2&gvYh&>Wve| z4Elz@oU|kF-9}9)o&19zdjk_Y znQubw<4C`nQ0)O9JuvY^V+Y2XLvhnM-?KS8@ACJJAl5rz?^ez^eB1{s&PBSrYr^TN zm-)qx;D`I?&9lDFl~hxzJ>aefI=~FJocn{7t8i<|oTn+Qy#%eJMc3_)3zxYb=g!`A z^7?YHL)o=^J~eGumo-+iReK<>2kvS&J_<%Y$M_<;v}uH22?#T?xAQhSx<4!!YXmNz zaz_ZVe}7rnNhjYK(b0R~Ma}E@>W_Zi19G>Ne1k;3UqAa?V|Q!>#;|@l40i%D{Ttj= z+>^+7dGj*0uF-uk2<zKWQ!WK7YOT>beg>1zQ}1o;gB}~WPEC6Z!ZI~w_F@B`ih6~zxYf&M0N@;u|qeB1=an4^Neub{^xY5!LwZt_S3NsOS`w3tX4%x5wJs2gtgHJ(xDejkMU&IE^1( z;{|`vyT7h$>b`#2tCp+wK)>pNj)^-A>qv|SFDKV^PMyp*6kiN(oXOsyW8xxUg?~6U|m=8Xxv!V=Mx!E=Hu4j zynn|Edm1-bQF*9iD|Ir~q|O}PIeCwgd{;A6d%)HMyx$)cS;f7AT&?0g+{t_RzO3#F zy>Id+z7KUR=@UYo$;-*}YwiggPrh;d{*^f5&Sy`A->EjrUPAsW@c&4e8(7OvHfg1k z4Jw!YWlVJ7REpNBgq)!MqF`m@>to_e5e$&`JuKRziV z^QjavC+9C;#%=0t`L@e@0KaKNay2fAJ3Ew~@;?T4Z=O1+nz`BoUVDJ^FfzXyzH~~o zcIh2o4W&~jBFn!9Pcoj&0c)N7eh#;>uQ4X|<6gx*2|u$LuP&%sZjJGhxL%mPx# literal 0 HcmV?d00001 diff --git a/huagao/stdafx.h b/huagao/stdafx.h index f56eca2de41f0e8df8a8569d8e42dfc712f38dc4..35c0091da40ca28479ef30f21132e7599f81c960 100644 GIT binary patch delta 550 zcmZ3tp7GFe#tlWBlMiu<@H#VuGWartFt{@KG5BrHc@B>lHw!Kpn>;~+g=2Y+L1|Um--gLPa<`N?!%6~~;yA-vLiY#z&yI))?+Bg{9xR{szSn{Q zr1^XB