From 9f060c77455793b9e587c48ef21d3004b20f1ade Mon Sep 17 00:00:00 2001 From: masayume <1936714878@qq.com> Date: Thu, 16 Dec 2021 16:21:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E9=A3=9E=E7=BA=BF=E7=89=88?= =?UTF-8?q?=E6=9C=AC3399=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.txt | 14 +- huagao/CIndicatorDlg.cpp | 2 +- huagao/CTwainUI.cpp | 27 ++- huagao/CTwainUI.h | 4 +- huagao/Device/GScan.h | 3 + huagao/Device/GScanO1003399.cpp | 248 +++++++++++------------- huagao/Device/GScanO1003399.h | 2 + huagao/Device/GScanO200.cpp | 4 +- huagao/Device/GScanO400.cpp | 4 +- huagao/Device/GScanO400Android.cpp | 8 +- huagao/Device/IConfig.h | 12 +- huagao/Device/ImageMatQueue.cpp | 42 ++-- huagao/Device/ImageMatQueue.h | 1 + huagao/Device/PublicFunc.h | 5 +- huagao/Device/UsbScanEx.cpp | 1 - huagao/GscanJsonConfig.cpp | 33 +++- huagao/ImageProcess/ImageApplyHeaders.h | 1 + huagao/huagaods.cpp | 55 ++++-- huagao/huagaotwds.rc | Bin 48940 -> 50052 bytes huagao/resource.h | Bin 17502 -> 18238 bytes huagao/stdafx.h | Bin 18276 -> 18544 bytes twpp/datasource.hpp | 1 + 22 files changed, 288 insertions(+), 179 deletions(-) diff --git a/changelog.txt b/changelog.txt index 3c7c29b3..3760f235 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,7 +5,17 @@ 3.修复保存首选项不能保存高级设置参数问题 4.新增奥鸽G139型号 2021年11月20日 - 版本:3.3.5.4 + 版本:3.3.5.5 1.添加配置文件,可开关显示滚轴弹框以及打印协议设置信息 2.调整twain协议 - 3.更新穿孔算法 \ No newline at end of file + 3.更新穿孔算法 + 4.合入提升效率版本ocr +2021年12月01日 + 版本:3.3.5.6 + 1.添加连续扫描模式 + 2.增加g200 扫描仪升降台异常处理 + 3.添加图像拆分功能 + 4.修复3399对折扫描异常时的丢图问题 + 5.根据arm固件进行兼容,以A1209为分界线,根据版本显示连续扫描 + 6.屏蔽对折前旋转,奥鸽要求 + 7.修复首选项保存时亮度读取异常问题 diff --git a/huagao/CIndicatorDlg.cpp b/huagao/CIndicatorDlg.cpp index 202c43ed..5b49ad89 100644 --- a/huagao/CIndicatorDlg.cpp +++ b/huagao/CIndicatorDlg.cpp @@ -30,7 +30,7 @@ void CIndicatorDlg::DoDataExchange(CDataExchange* pDX) BOOL CIndicatorDlg::OnInitDialog() { #ifdef LANXUM - GetDlgItem(IDC_BTNSTOPSCAN)->ShowWindow(SW_HIDE); + //GetDlgItem(IDC_BTNSTOPSCAN)->ShowWindow(SW_HIDE); #endif // LANXUM return 0; } diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 2c777b3e..984c54d0 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -17,7 +17,7 @@ IMPLEMENT_DYNAMIC(CTwainUI, CDialogEx) -CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::string hardwareversion, std::string serialnum, CWnd* pParent /*=nullptr*/) +CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::string hardwareversion, std::string serialnum, std::uint32_t mbversion ,CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_TWAINUI, pParent) , m_tabCtrl(new CTabCtrlSSL()) , m_pageBrightness(new CBrightnessPage) @@ -29,6 +29,7 @@ CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::st { m_hardwareVersion = hardwareversion; m_serialnum = serialnum; + m_mbversion = mbversion; //memset(settings.get(), 0, sizeof(GScanCap)); /*m_pageImageProc->noise = caps.noise; m_pageImageProc->is_convex = caps.is_convex; @@ -92,8 +93,21 @@ BOOL CTwainUI::OnInitDialog() setvisable_sleepmode(false); #ifdef G200 setvisable_dogear(true); + if (m_hardwareVersion.size() > 9) + { + if (m_hardwareVersion[5] > 'A' || atoi(m_hardwareVersion.substr(6, 4).c_str()) > 1209) + { + if (m_mbversion >= 35211210) + setvisable_autopaper(true); + else + setvisable_autopaper(false); + } + else + setvisable_autopaper(false); + } #else setvisable_dogear(false); + setvisable_autopaper(false); #endif // G200 return true; } @@ -166,6 +180,7 @@ void CTwainUI::UpdateUI() m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型 m_pageBasic->m_enableSizeCheck = settings->en_sizecheck==1?TRUE:FALSE;//!< 尺寸检测 m_pageBasic->m_bswitchfrontback = settings->is_switchfrontback ? TRUE : FALSE; //!< 交换正反面 + ((CButton*)m_pageBasic->GetDlgItem(IDC_CKSPLIT))->SetCheck(settings->is_split); #ifdef UV m_pageBasic->m_bUV = settings->hardwarecaps.en_uv == 1 ? TRUE : FALSE; #endif @@ -236,6 +251,7 @@ void CTwainUI::UpdateUI() 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); 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); @@ -485,6 +501,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) //settings->resolution_dst = Resolutions[configItem->Resolution]; settings->resolution_dst = configItem->Resolution; settings->resolution_native = 200.0f; + settings->is_split = ((CButton*)m_pageBasic->GetDlgItem(IDC_CKSPLIT))->GetCheck(); settings->is_switchfrontback = configItem->EnSwitchFrontBack ? 1 : 0; //float value_Contrast = GetContrast(configItem->Contrast); settings->contrast = configItem->Contrast; @@ -521,6 +538,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->hardwarecaps.en_skrewdetect = configItem->EnScrewDetect; settings->hardwarecaps.skrewdetectlevel = (int)configItem->ScrewDetectLevel; settings->hardwarecaps.en_stapledetect = configItem->EnBindingDetect; + settings->hardwarecaps.is_autopaper = ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->GetCheck(); settings->hardwarecaps.en_doublefeed = configItem->EnUltrasonicDetect; settings->dogeardistance = m_pageFeedPaper->m_slider_dogear.GetPos(); settings->en_fold = configItem->EnFlod ? 1 : 0; @@ -656,6 +674,13 @@ void CTwainUI::setvisable_dogear(bool flag) ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_DogEarDetection))->SetCheck(false); } +void CTwainUI::setvisable_autopaper(bool flag) +{ + ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->ShowWindow(flag ? SW_SHOW : SW_HIDE); + if (!flag) + ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->SetCheck(false); +} + void CTwainUI::EnableID_OKorID_Cancel(bool enable) { GetDlgItem(IDC_CONFIRM)->EnableWindow(enable); diff --git a/huagao/CTwainUI.h b/huagao/CTwainUI.h index ecec415e..0300680f 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -165,7 +165,7 @@ class CTwainUI : public CDialogEx DECLARE_DYNAMIC(CTwainUI) public: - CTwainUI(TwGlue glue,GScanCap caps,std::string confirmtitle,std::string hardwareversion,std::string serialnum, CWnd* pParent = nullptr); // 标准构造函数 + CTwainUI(TwGlue glue,GScanCap caps,std::string confirmtitle,std::string hardwareversion,std::string serialnum,std::uint32_t mbversion ,CWnd* pParent = nullptr); // 标准构造函数 virtual ~CTwainUI(); void UpdateUI(); @@ -176,6 +176,7 @@ public: void setvisable_size(bool flag); void setvisable_sleepmode(bool flag); void setvisable_dogear(bool flag); + void setvisable_autopaper(bool flag); void EnableID_OKorID_Cancel(bool enable); // 对话框数据 #ifdef AFX_DESIGN_TIME @@ -184,6 +185,7 @@ public: public: std::string m_hardwareVersion; std::string m_serialnum; + std::uint32_t m_mbversion; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index 5567b77b..a1665cd3 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -89,6 +89,8 @@ typedef enum tagUsbSupported { SLEEPING = 81, //⵽۽ HAVE_DOGEAR = 82, + // + MLTOP_TIMEOUT = 83, //USB δ USB_DISCONNECTED = 200, //ûֹͣ @@ -122,6 +124,7 @@ static map msgs = { {UsbSupported::V4L2_IMAGE_EMPTY,"ɨͼ쳣"}, {UsbSupported::SLEEPING,"豸ģʽ밴Դرߣ"}, {UsbSupported::HAVE_DOGEAR,"⵽۽ǣֹͣɨ裡"}, + {UsbSupported::MLTOP_TIMEOUT,"̨̧δָλã"}, }; enum tagEventIndex diff --git a/huagao/Device/GScanO1003399.cpp b/huagao/Device/GScanO1003399.cpp index a9eaf17a..dc4dff03 100644 --- a/huagao/Device/GScanO1003399.cpp +++ b/huagao/Device/GScanO1003399.cpp @@ -127,7 +127,7 @@ int GScanO1003399::aquire_bmpdata(std::vector& bmpdata) { if ((imagecount == 0) && (!scanflag) || (sw.elapsed_s() > 30)) { - if (is_scan()) + if (is_scan() || (m_param.hardwarecaps.is_autopaper && (sw.elapsed_s() > 30))) { sw.reset(); continue; @@ -203,7 +203,14 @@ std::string GScanO1003399::GetSerialNum() std::uint32_t GScanO1003399::GetMotorFPGA() { - return std::uint32_t(); + std::string fw; + if (m_usb.get() && m_usb->is_connected()) + { + 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()); + } + return atoi(fw.c_str()); } std::uint32_t GScanO1003399::GetScanFPGA() @@ -250,7 +257,7 @@ void GScanO1003399::config_params(GScanCap& param) cfg.g200params.stable_enbale = (unsigned int)param.hardwarecaps.en_stapledetect; cfg.g200params.screw_detect_enable = (unsigned int)param.hardwarecaps.en_skrewdetect; cfg.g200params.screw_detect_level = (unsigned int)cfg.g200params.screw_detect_enable ? secrewMaps[param.hardwarecaps.skrewdetectlevel] : 0; - + cfg.g200params.is_autopaper = param.hardwarecaps.is_autopaper; cfg.g200params.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0; cfg.g200params.unused_one = cfg.g200params.sizeerror_errorratio = 0; @@ -345,7 +352,17 @@ void GScanO1003399::config_params(GScanCap& param) void GScanO1003399::Scanner_StartScan(UINT16 count) { - error_index = 0; + auto fwver = GetFWVersion(); + if (fwver[5] > 'A' || atoi(fwver.substr(6, 4).c_str()) >= 1209) + { + if (GetMotorFPGA() >= 35211210) + is_kernelsnap_211209 = true; + else + is_kernelsnap_211209 = false; + } + else + is_kernelsnap_211209 = false; + error_index = autopaperstop = 0; roller_num = this->count(); scanflag = true; while (m_paths.Size() > 0) @@ -353,10 +370,8 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) remove(m_paths.Take().c_str()); } Set_ErrorCode(0); - getimgnum = 0; - aquirenum = 0; - imagecount = 0; - keeplastimg = true; + getimgnum = aquirenum = imagecount = 0; + keeplastimg = is_kernelsnap_211209 ? false : true;//true reset(); devState = DEV_ISRUNNING; if (scanner_read_reg(m_usb, SR_GET_SLEEP_STAUTUS) != 1) @@ -373,17 +388,6 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) scanflag = false; return; } - //int val = scanner_read_reg(m_usb, SR_GET_MBSTATUS); - //if (val) - //{ - // devState = DEV_WRONG; - // HGEIntInfo info; - // info.From = MtBoard; - // info.Code = val == 0x14 ? 4 : val; - // Set_ErrorCode(codeconvter(info)); - // scanflag = false; - // return; - //} //if (!Get_Scanner_PaperOn()) //{ // devState = DEV_WRONG; @@ -400,49 +404,21 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) m_imgprocthread->join(); } m_imgprocthread.reset(new thread(&GScanO1003399::proc, this, procmode)); - //if (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131) { - // b_imgprothread = true; - // m_imgprocthread.enqueue([this] { - // while (b_imgprothread) - // { - // if (m_paths.Size() < 1) - // { - // this_thread::sleep_for(chrono::milliseconds(10)); - // continue; - // } - // auto path = m_paths.Take(); - // if (!path.empty()) - // { - // auto fd = fopen(path.c_str(), "rb+"); - // if (fd) - // { - // auto lenght = FileTools::get_file_size(path.c_str()); - // std::shared_ptr> buff(new std::vector); - // buff->resize(lenght); - // fread(buff->data(), lenght, 1, fd); - // fclose(fd); - // remove(path.c_str()); - // imgproce(buff); - // } - // else { - // FileTools::writelog(log_ERROR, "img tmp file read error file name =" + path); - // } - // } - // } - // }); - //} - //else - //{ - // b_imgprothread = false; - //} } void GScanO1003399::Stop_scan() { stop(); + if (m_param.hardwarecaps.is_autopaper) + { + autopaperstop = true; + if (!is_scan() && imagecount == 0) + scanflag = false; + } if ((devState == DEV_WRONG) || (devState == DEV_STOP)) return; devState = DEV_STOP; + } int GScanO1003399::notifyscan() @@ -543,39 +519,39 @@ void GScanO1003399::usb_run() } if ((codeconvter(info) == -1)) { - - //if ((get_ErrorCode() != PAPER_JAM) && (get_ErrorCode() != DETECT_DOUBLE_FEED) && (get_ErrorCode() != DETECT_STAPLE)) - //{ - // keeplastimg = false; - // while (im_dev_count()) - // im_rx(); - // scanflag = false; - //} - //else { - while (!scanner_read_reg(m_usb, SR_GET_IMAGEPROCESSDONE)) - this_thread::sleep_for(chrono::microseconds(30)); - if (scanner_read_reg(m_usb, SR_GET_KEEP_LAST_PAPER)) - { - this_thread::sleep_for(chrono::milliseconds(100)); - while(im_dev_count()>( m_param.is_duplex?2:1)) - im_rx(); - if (m_param.is_duplex) + while (!scanner_read_reg(m_usb, SR_GET_IMAGEPROCESSDONE)) + this_thread::sleep_for(chrono::microseconds(30)); + if (scanner_read_reg(m_usb, SR_GET_KEEP_LAST_PAPER)) + { + FileTools::writelog(log_ERROR, "keep last paper true"); + this_thread::sleep_for(chrono::milliseconds(100)); + while (im_dev_count() > ((m_param.is_duplex && !m_param.en_fold) ? 2 : 1)) + im_rx(); + if (!is_kernelsnap_211209) { + if (m_param.is_duplex && !m_param.en_fold) pop_dev_im(); pop_dev_im(); } - else - { - keeplastimg = false; - while (im_dev_count()) - im_rx(); - } - scanflag = false; - //} - + } + else + { + keeplastimg = false; + while (im_dev_count()) + im_rx(); + } if ((devState != DEV_WRONG) && (get_ErrorCode()<=0)) devState = DEV_STOP; else if ((devState != DEV_WRONG) && (get_ErrorCode() > 0)) devState = DEV_WRONG; + if (m_param.hardwarecaps.is_autopaper) { + if (devState == DEV_STOP && autopaperstop == false) + scanflag = true; + else + scanflag = false; + } + else + scanflag = false; + } @@ -644,60 +620,46 @@ bool GScanO1003399::is_dev_tx() void GScanO1003399::im_rx() { - - //m_imgthread.enqueue([this] { - //StopWatch sw; - //while (im_dev_count()){ - if (is_dev_tx()) + if (is_dev_tx()) + return; + if (keeplastimg) + { + if (m_param.is_duplex && !m_param.en_fold) { + if(im_dev_count()<3) return; - if (keeplastimg) - { - if (m_param.is_duplex) { - if(im_dev_count()<3) - return; - } - if(im_dev_count()<2) - return; - } - std::shared_ptr> buffi(new std::vector); - //auto& buffi = im_data; - int count = front_datasize(); - 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)); // - pop_dev_im(); - //vector mats; - m_param.multi_output_red? imagecount += 2: imagecount++; - UpdateScanInfo(countNReaded(), get_imgTransfered()); - if (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131) - { - auto path = cv::tempfile(); - auto fd = fopen(path.c_str(), "wb+"); - if (fd) - { - fwrite(buffi->data(), buffi->size(), 1, fd); - fclose(fd); - m_paths.Put(path); - } - else { - FileTools::writelog(log_ERROR, "img temp file save error flie name =" + path); - } - } - else { - imgs.Put(buffi); - //fu_imgpro.push(m_imgprocthread.enqueue([this] { - // imgproce(imgs.Take()); - //})); - //while (fu_imgpro.size()>1) - //{ - // fu_imgpro.front().get(); - // if(fu_imgpro.size()>0) - // fu_imgpro.pop(); - //} - } - //} - //}); + } + if(im_dev_count()<2) + return; + } + std::shared_ptr> buffi(new std::vector); + //auto& buffi = im_data; + int count = front_datasize(); + 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)); // + pop_dev_im(); + //vector mats; + //m_param.multi_output_red? imagecount += 2: imagecount++; + imagecount += 1 * (m_param.multi_output_red ? 2 : 1) * (m_param.is_split ? 2 : 1); + UpdateScanInfo(countNReaded(), get_imgTransfered()); + if (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131) + { + auto path = cv::tempfile(); + auto fd = fopen(path.c_str(), "wb+"); + if (fd) + { + fwrite(buffi->data(), buffi->size(), 1, fd); + fclose(fd); + m_paths.Put(path); + } + else { + FileTools::writelog(log_ERROR, "img temp file save error flie name =" + path); + } + } + else { + imgs.Put(buffi); + } } int GScanO1003399::read_data(void* data, int length, int timeout) @@ -787,6 +749,24 @@ void GScanO1003399::imgproce(std::shared_ptr>& buff) { CImageApplyColorRecognition(m_param.automaticcolortype == 1 ? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray : CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono).apply(mats,m_param.is_duplex); } + if (m_param.is_split) + { + CImageApplySplit m_split; + std::vector tmp; + for (auto& var : mats) + { + if (!var.empty()) + { + auto sptmp = m_split.apply(var); + for (auto& matvar : sptmp) + { + if (!matvar.empty()) + tmp.push_back(matvar); + } + } + } + mats.swap(tmp); + } for (int i = 0; i < mats.size(); i++) { if (!mats[i].empty()) { IMat2Bmp idata; @@ -852,6 +832,8 @@ int GScanO1003399::codeconvter(HGEIntInfo code) return AQUIRE_IMAGE_TIMEOUT; case 0x20000: return SIZE_ERROR; + case 0x80000: + return MLTOP_TIMEOUT; default: break; } diff --git a/huagao/Device/GScanO1003399.h b/huagao/Device/GScanO1003399.h index b6cc282a..91fb0861 100644 --- a/huagao/Device/GScanO1003399.h +++ b/huagao/Device/GScanO1003399.h @@ -75,6 +75,8 @@ private: volatile int Error_Code; volatile bool scanflag; volatile bool keeplastimg; + volatile bool autopaperstop; + volatile bool is_kernelsnap_211209; GScanCap m_param; std::shared_ptr m_usb; volatile bool b_imgprothread; diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index 3099d886..a3a8f786 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -343,12 +343,12 @@ int GScanO200::Get_Roller_num() { if (!(m_usb.get() && m_usb->is_open())) return 0; - USBCB usbcb = { GET_ROLLER_NUM ,0,4 }; + USBCB usbcb = { GET_SCANN_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) + if (usbcb.u32_CMD != GET_SCANN_NUM) { FileTools::writelog(log_ERROR, "get roller usb bulk error"); } diff --git a/huagao/Device/GScanO400.cpp b/huagao/Device/GScanO400.cpp index c74d581c..3612b48e 100644 --- a/huagao/Device/GScanO400.cpp +++ b/huagao/Device/GScanO400.cpp @@ -348,11 +348,11 @@ int GScanO400::Get_Roller_num() { if (!(m_usb.get() && m_usb->is_open())) return false; - USBCB usbcb = { GET_ROLLER_NUM ,0,4 }; + USBCB usbcb = { GET_SCANN_NUM ,0,4 }; 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) + if (usbcb.u32_CMD != GET_SCANN_NUM) { FileTools::writelog(log_ERROR, "get roller usb bulk error"); } diff --git a/huagao/Device/GScanO400Android.cpp b/huagao/Device/GScanO400Android.cpp index 72baa2cb..28b31ddd 100644 --- a/huagao/Device/GScanO400Android.cpp +++ b/huagao/Device/GScanO400Android.cpp @@ -356,11 +356,11 @@ int GScanO400Android::Get_Roller_num() { if (!(m_usb.get() && m_usb->is_open())) return false; - USBCB usbcb = { GET_ROLLER_NUM ,0,4 }; + USBCB usbcb = { GET_SCANN_NUM ,0,4 }; 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) + if (usbcb.u32_CMD != GET_SCANN_NUM) { FileTools::writelog(log_ERROR, "get roller usb bulk error"); } @@ -629,6 +629,10 @@ void GScanO400Android::usbmain() case HAVE_IMAGE: { int totalNum = usbcb.u32_Count&0x3fffffff; + if ((usbcb.u32_Count & 0xc0000000) == 0) + { + image_last = false; + } if (totalNum < 1) { image_last = false; diff --git a/huagao/Device/IConfig.h b/huagao/Device/IConfig.h index e8ea51e7..b73e7214 100644 --- a/huagao/Device/IConfig.h +++ b/huagao/Device/IConfig.h @@ -201,7 +201,14 @@ enum Scanner_Reg_Defs SR_FLAT_GRAY_MAX_BRIGHT, SR_KERNEL_VERSION_INFO_LENGTH, SR_GET_KERNEL_VERSION, - SR_GET_MBSTATUS + SR_GET_MBSTATUS, + SR_GET_IPADDR_LENGHT = 0x200, + SR_GET_MACADDR, + SR_GET_IPADDR, + SR_GET_MBVERSION_LENGHT, + SR_GET_MBVERSION, + SR_GET_USBVIDPID, + SR_SET_USBVIDPID }; enum Scanner_Cmd_Defs @@ -284,7 +291,8 @@ typedef union HG_ScanConfig unsigned int screw_detect_enable : 1; unsigned int screw_detect_level : 3;//ʮλ unsigned int iscorrect_mod : 1; - unsigned int unused_one : 5; + unsigned int is_autopaper : 1; + unsigned int unused_one : 4; unsigned int pc_correct : 1; unsigned int enable_sizecheck : 1; unsigned int enabledsp_cache : 1; diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index 93115811..31943185 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -7,6 +7,7 @@ #include #include "StopWatch.h" + using namespace cv; using namespace std; @@ -509,10 +510,10 @@ void ImageMatQueue::proc() cv::resize(mats[i], mats[i], cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 } - if (scanParam.en_fold != 0) { - cv::flip(mats[0], mats[0], 1); - cv::flip(mats[0], mats[0], 0); - } + //if (scanParam.en_fold != 0) { //对折前旋转屏蔽 20211214 奥鸽要求 + // cv::flip(mats[0], mats[0], 1); + // cv::flip(mats[0], mats[0], 0); + //} } else { @@ -602,14 +603,15 @@ void ImageMatQueue::proc() uvmats.clear(); } #endif - - FileTools::writelog(log_INFO, "图像处理耗时 " + to_string(sw.elapsed_ms())); - sw.reset(); + if (!scanParam.is_duplex && mats.size()>1) { + mats.pop_back(); + break; + } + if (scanParam.is_split) + { + splitimg(mats); + } for (int i = 0; i < mats.size(); i++) { - if (!scanParam.is_duplex && i == 1) { - mats[i].release(); - break; - } if (!mats[i].empty()) { IMat2Bmp idata; #ifdef UV @@ -634,9 +636,7 @@ void ImageMatQueue::proc() FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++)); } } - FileTools::writelog(log_INFO, "转码BMP 耗时: " + to_string(sw.elapsed_ms())); - sw.reset(); if (scanParam.multi_output_red) { for (int i = 0; i < mats.size(); i++) { if (!mats[i].empty()) { @@ -656,7 +656,6 @@ void ImageMatQueue::proc() } } } - FileTools::writelog(log_INFO, "多流输出 耗时: " + to_string(sw.elapsed_ms())); } mats.clear(); @@ -668,6 +667,21 @@ void ImageMatQueue::proc() } } +void ImageMatQueue::splitimg(std::vector& mats) { + CImageApplySplit m_split; + std::vector tmp; + for (auto& var : mats){ + if (!var.empty()){ + auto sptmp = m_split.apply(var); + for (auto& matvar : sptmp){ + if (!matvar.empty()) + tmp.push_back(matvar); + } + } + } + mats.swap(tmp); +} + G400Decode::G400Decode(std::shared_ptr> buff) { m_buffs.push_back(buff); diff --git a/huagao/Device/ImageMatQueue.h b/huagao/Device/ImageMatQueue.h index 369d6c57..b05ef32b 100644 --- a/huagao/Device/ImageMatQueue.h +++ b/huagao/Device/ImageMatQueue.h @@ -226,6 +226,7 @@ private: void EnqueueBmpBuffer(std::shared_ptr>); void PaniusCount(int count = 1); void init_cachethread(); + void splitimg(std::vector& mats); void cache_run(); //清除缓存文件 void clear_cachefiles(); diff --git a/huagao/Device/PublicFunc.h b/huagao/Device/PublicFunc.h index f79c0bf1..f7147f64 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -44,7 +44,7 @@ const std::string DB_DEVNMAX = "iDevnMax"; const std::string FLOD = "bFlod"; const std::string AUTOCROP = "bAuotCrop"; const std::string SWITCHFRONTBACK = "bSwitchFrontBack"; - +const std::string SPLIT = "bSplit"; // #include - //#ifdef ANDROIDSERIAL #if false diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index 58b63594..82acbf39 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -104,6 +104,7 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin //outJson["Config"].Add(DB_DEVNMAX, (int)(pConfigItem->DBlank_DevnMax)); outJson["Config"].Add(FLOD, (bool)(gcap.en_fold), false); outJson["Config"].Add(SWITCHFRONTBACK, (bool)(gcap.is_switchfrontback), false); + outJson["Config"].Add(SPLIT, gcap.is_split, false); #ifdef UV outJson["Config"].Add(ENUVMODEL, (bool)(gcap.hardwarecaps.en_uv), false); @@ -127,6 +128,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(SCANCOUNT, (int)(gcap.scannum)); outJson["Config"].Add(DOCORIENTATION, (int)(gcap.imageRotateDegree)); outJson["Config"].Add(AUTO_TEXT, (bool)(gcap.is_autotext),false); @@ -227,6 +229,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const //root["Config"][DB_DEVNMAX].Add(cfgArray[i].DBlank_DevnMax); root["Config"][FLOD].Add(i, (bool)cfgArray[i].en_fold); root["Config"][SWITCHFRONTBACK].Add(i,(bool)cfgArray[i].is_switchfrontback); + root["Config"][SPLIT].Add(i, cfgArray[i].is_split); #ifdef UV root["Config"][ENUVMODEL].Add(i, cfgArray[i].hardwarecaps.en_uv); #endif @@ -249,6 +252,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"][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); @@ -391,6 +395,9 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(FLOD, itmEnFlod); neb::CJsonObject itmEnSwitchFrontBack; root["Config"].Get(SWITCHFRONTBACK, itmEnSwitchFrontBack); + neb::CJsonObject itmEnSplit; + root["Config"].Get(SPLIT, itmEnSplit); + neb::CJsonObject itmdiscarbrank_value; root["Config"].Get(DISCARBLANK_VALUE, itmdiscarbrank_value); #ifdef UV @@ -433,6 +440,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(ULTRADETECT, itmUltDetect); neb::CJsonObject itmBingdingDetect; root["Config"].Get(BINDINGDETECT, itmBingdingDetect); + neb::CJsonObject itmAutoPaper; + root["Config"].Get(AUTOPAPER, itmAutoPaper); neb::CJsonObject itmScanCount; root["Config"].Get(SCANCOUNT, itmScanCount); neb::CJsonObject itmDocOrientation; @@ -508,12 +517,14 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.en_fold = b_value ? 1 : 0; itmEnSwitchFrontBack.Get(i, b_value); cfp.is_switchfrontback = b_value ? 1 : 0; + itmEnSplit.Get(i, b_value); + cfp.is_split = b_value ? 1 : 0; #ifdef UV itmEnUV.Get(i, b_value); cfp.hardwarecaps.en_uv = b_value ? 1 : 0; #endif - itmBrtnes.Get(i, i_value); - cfp.brightness = i_value; + itmBrtnes.Get(i, f_value); + cfp.brightness = f_value; itmAutoCrnt.Get(i, b_value); cfp.is_autocontrast = b_value ? 1 : 0; itmContrast.Get(i, i_value); @@ -548,6 +559,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.hardwarecaps.en_doublefeed = b_value ? 1 : 0; itmBingdingDetect.Get(i, b_value); cfp.hardwarecaps.en_stapledetect = b_value ? 1 : 0; + itmAutoPaper.Get(i, b_value); + cfp.hardwarecaps.is_autopaper = b_value ? 1 : 0; itmScanCount.Get(i, i_value); cfp.scannum = i_value; itmDocOrientation.Get(i, i_value); @@ -623,12 +636,14 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.en_fold = bvalue?1:0; root["Config"].Get(SWITCHFRONTBACK, bvalue); cfp.is_switchfrontback = bvalue?1:0; + root["Config"].Get(SPLIT, bvalue); + cfp.is_split = bvalue ? 1 : 0; #ifdef UV root["Config"].Get(ENUVMODEL, bvalue); cfp.hardwarecaps.en_uv = bvalue ? 1 : 0; #endif - root["Config"].Get(BRIGHTNESS, index); - cfp.brightness = index; + root["Config"].Get(BRIGHTNESS, fvalue); + cfp.brightness = fvalue; root["Config"].Get(AUTOCONTRAST, bvalue); cfp.is_autocontrast = bvalue?1:0; root["Config"].Get(CONTRAST, index); @@ -669,6 +684,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.hardwarecaps.en_doublefeed = bvalue?1:0; root["Config"].Get(BINDINGDETECT, bvalue); cfp.hardwarecaps.en_stapledetect = bvalue ? 1 : 0; + root["Config"].Get(AUTOPAPER, bvalue); + cfp.hardwarecaps.is_autopaper = bvalue ? 1 : 0; root["Config"].Get(SCANCOUNT, index); cfp.scannum = index; root["Config"].Get(DOCORIENTATION, index); @@ -739,6 +756,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap) js[CONFIG][DISCARBLANK_VALUE] = cap.discardblank_percent; js[CONFIG][FLOD] = cap.en_fold; js[CONFIG][SWITCHFRONTBACK] = cap.is_switchfrontback; + js[CONFIG][SPLIT] = cap.is_split; #ifdef UV js[CONFIG][ENUVMODEL] = cap.hardwarecaps.en_uv; #endif @@ -760,6 +778,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap) js[CONFIG][HSVCORRECT] = cap.hsvcorrect; js[CONFIG][ULTRADETECT] = cap.hardwarecaps.en_doublefeed; js[CONFIG][BINDINGDETECT] = cap.hardwarecaps.en_stapledetect; + js[CONFIG][AUTOPAPER] = cap.hardwarecaps.is_autopaper; js[CONFIG][SCANCOUNT] = cap.scannum; js[CONFIG][DOCORIENTATION] = cap.imageRotateDegree; js[CONFIG][AUTO_TEXT] = cap.is_autotext; @@ -798,6 +817,7 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js) cap.discardblank_percent = json_cast(js[CONFIG][DISCARBLANK_VALUE]).to_int(); cap.en_fold = json_cast(js[CONFIG][FLOD]).to_int(); cap.is_switchfrontback = json_cast(js[CONFIG][SWITCHFRONTBACK]).to_int(); + cap.is_split = json_cast(js[CONFIG][SPLIT]).to_int(); #ifdef UV cap.hardwarecaps.en_uv = json_cast(js[CONFIG][ENUVMODEL]).to_int(); #endif // UV @@ -819,6 +839,7 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js) cap.hsvcorrect = json_cast(js[CONFIG][HSVCORRECT]).to_int(); 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.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(); @@ -856,6 +877,7 @@ json GscanJsonConfig::GetDefaultJson() "discardblank_percent": 20 , "bFlod": false , "bSwitchFrontBack": false , + "bSplit": false , "bUVmodel": false, "detachnoise": false , "detachnoisevalue": 30 , @@ -874,6 +896,7 @@ json GscanJsonConfig::GetDefaultJson() "bHsvCorrect": false , "bUltrasonicDetect": true , "bBindingDetect": false , + "bautopaper": false , "ScanCount": 65535 , "bOrientation": 0 , "bAutoText": false , @@ -909,6 +932,7 @@ json GscanJsonConfig::GetDefaultJson() "discardblank_percent": 20 , "bFlod": false , "bSwitchFrontBack": false , + "bSplit": false , "detachnoise": false , "detachnoisevalue": 30 , "iBrightness": 0 , @@ -926,6 +950,7 @@ json GscanJsonConfig::GetDefaultJson() "bHsvCorrect": false , "bUltrasonicDetect": true , "bBindingDetect": false , + "bautopaper": false , "ScanCount": 65535 , "bOrientation": 0 , "bAutoText": false , diff --git a/huagao/ImageProcess/ImageApplyHeaders.h b/huagao/ImageProcess/ImageApplyHeaders.h index 4cf6caab..d27169ba 100644 --- a/huagao/ImageProcess/ImageApplyHeaders.h +++ b/huagao/ImageProcess/ImageApplyHeaders.h @@ -18,4 +18,5 @@ #include "ImageApplyDetachNoise.h" #include "ImageApplyColorRecognition.h" #include "ImageApplyUV.h" +#include "ImageApplySplit.h" #endif diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index fd13664d..9e248849 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -61,6 +61,7 @@ enum class CapTypeEx : unsigned short { TwEx_ENCODE = 0x8105, TwEx_CropModel=0x8106, TwEx_DogEarDistance = 0x8107, + TwEx_ImageSplit = 0x8108, }; enum class PaperSizeEx : unsigned short { @@ -88,7 +89,7 @@ using namespace std::placeholders; TWPP_ENTRY_MFC(HuagaoDs) static constexpr const Identity srcIdent( - Version(3, 3, Language::English, Country::China, "v3.3.5.5"), + Version(3, 3, Language::English, Country::China, "v3.3.5.6"), DataGroup::Image, #ifdef MAKEHUAGAO "HUAGO", @@ -106,6 +107,8 @@ static constexpr const Identity srcIdent( #ifdef ISG100 #ifdef LANXUM "G62S Series", + #elif defined HANVON + "HW-8190F Series", #else // ISG100 "G100 Series", #endif @@ -113,7 +116,7 @@ static constexpr const Identity srcIdent( #ifdef LANXUM "G73S Series", #elif defined HANVON - "HW-7000W Series", + "HW-9110M Series", #else // ISG100 "G200 Series", #endif @@ -124,7 +127,7 @@ static constexpr const Identity srcIdent( #elif defined HANVON "HW-7000W Series", #else // ISG100 - "G200 Series",//ݾɼ pm changed G300 Series + "G300 Series",//ݾɼ pm changed G300 Series #endif #elif defined(G400) // G200 @@ -144,6 +147,8 @@ static constexpr const Identity srcIdent( "HUAGOSCAN G100 TWAIN" #elif defined AUGE "AUGESCAN G100 TWAIN" + #elif defined HANVON + "HANVONSCAN HW-8190F TAWIN" #elif defined LANXUM //!LANXUM "LANXUMSCAN G62S TWAIN" #else // !MAKEHUAGAO @@ -153,7 +158,7 @@ static constexpr const Identity srcIdent( #ifdef MAKEHUAGAO "HUAGOSCAN G200 TWAIN" #elif defined HANVON - "HANVONSCAN HW-7000W TAWIN" + "HANVONSCAN HW-9110M TAWIN" #elif defined LANXUM //!LANXUM "LANXUMSCAN G73S TWAIN" #else // !MAKEHUAGAO @@ -165,7 +170,7 @@ static constexpr const Identity srcIdent( #ifdef UV "HUAGOSCAN G300UV TWAIN" #else - "HUAGOSCAN G200 TWAIN"// ݾɼ pm changed "HUAGOSCAN G300 TWAIN" + "HUAGOSCAN G300 TWAIN"// ݾɼ pm changed "HUAGOSCAN G300 TWAIN" #endif #elif defined HANVON @@ -270,7 +275,6 @@ struct Vid_pid #ifdef LANXUM static std::vector DeviceID{ - {0x3072,0x239}, {0x31c9,0x8200}, #ifdef G200 #ifdef ISG100 @@ -295,7 +299,15 @@ static std::vector DeviceID{ #elif defined HANVON static std::vector DeviceID{ +#ifdef G200 +#ifdef ISG100 + {0x2903,0x8000}, +#else + {0x2903,0x9000}, +#endif // ISG100 +#elif defined G400 {0x2903,0x7000}, +#endif // G200 }; #else @@ -387,15 +399,15 @@ HuagaoDs::HuagaoDs() void HuagaoDs::showmsg(std::string caption, std::string text, int retcode) { if (scanner.get()) { - //int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1); - //int readnum =scanner->get_scannum()* (m_scanparam->is_duplex ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1); - int num = scanner->get_imgnReaded() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1); + + int num = scanner->get_imgnReaded() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1) * (m_scanparam->is_split ? 2 : 1); int imgread = scanner->get_imgnReaded(); IScanner* ptr = scanner.get(); if (typeid(*ptr) == typeid(GScanO1003399)) { //readnum = readnum / 2 * (m_scanparam->en_fold ? 2 : 1); - num = scanner->get_imgnReaded() * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1); + num = scanner->get_imgnReaded() * (m_scanparam->multi_output_red ? 2 : 1) * (m_scanparam->is_split ? 2 : 1); + if(!m_scanparam->en_fold) imgread /= 2; } if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) @@ -837,7 +849,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { pid = usb.pid; if (!scanner.get()) { #ifdef G200 - if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629) + if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629 || pid == 0x130 ||pid == 0x8000 || pid == 0x9000) scanner.reset(new GScanO1003399()); else scanner.reset(new GScanO200()); @@ -1996,6 +2008,17 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } return CapSupGetAllResetEx(msg, data, m_scanparam->normalCrop, false); }; + //ͼ + m_query[(CapType)(CapTypeEx::TwEx_ImageSplit)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_ImageSplit)] = [this](Msg msg, Capability& data)->Result { + CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CropModel), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); + if (Msg::Set == msg) { + auto mech = data.currentItem(); + m_scanparam->is_split = mech; + return success(); + } + return CapSupGetAllResetEx(msg, data, m_scanparam->is_split, false); + }; #ifdef UV m_query[(CapType)(CapTypeEx::TwEx_UVModel)] = msgSupportGetAllSetReset; m_caps[(CapType)(CapTypeEx::TwEx_UVModel)] = [this](Msg msg, Capability& data)->Result { @@ -2085,7 +2108,7 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { { if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) { - int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1); + int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1) * (m_scanparam->is_split ? 2 : 1); if ((num - scanner->get_imgTransfered()) != 0) { showmsg("ʾ", msgs[LOSE_IMAGE]); @@ -2097,10 +2120,15 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { m_pendingXfers = 0; if (guiTwain.get()) { ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); + //setState(DsState::Enabled); + } + else { + //setState(DsState::Open); } } else { m_pendingXfers = 1; + //setState( DsState::XferReady ); } data.setCount(m_pendingXfers); return success(); @@ -2523,7 +2551,8 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) TwGlue glueUiOnly = { confirmFunction, cancelFunction }; std::string serialnum = scanner->GetSerialNum(); std::string hardwareversion = scanner->GetFWVersion(); - guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "ȷ" : "ɨ", hardwareversion, serialnum)); + uint32_t mbversion = scanner->GetMotorFPGA(); + guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "ȷ" : "ɨ", hardwareversion, serialnum,mbversion)); guiTwain->Create(IDD_TWAINUI, parent); CRect newRect; ::GetWindowRect(static_cast(ui.parent().raw()), &newRect); diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index bd52a839b05c1d2b84fc1da4344391bf82f7ff9a..c578dac83375c04faaaa0615e3ee26f487da839b 100644 GIT binary patch delta 1228 zcmX|BT}%{L6h6bic7Lb~byt+A;5Mm>{LIhJuv@k!6f|x$!!9c|^no>0jjYjbX=|cQ z2^bTE6=vnEh=150H8#PLk+;h+O zo$ot$7fKap$K`w9H(=|hZk&&X8cH9mBpwgCdPC3*ap;CFNYigGq#yzNAdX`_9W$}| zDvh>Pe7RfycDbQRZU?it62BF|he0=f)g7w-&Hj7j*x<@XTQdGMCXDq}3Fw3bs^)t$ zv333k7o#edo2d-OLZmjo^8qz0wiX2eWc_2l%tg(B*j^2(27f$wYX^4<7mFROvcWmOhow9 z+kcMT>17&?;!N&9eLj_UuX?R#w$FN%WO5!{%5BFJxaLj4P^fE=L1P&MON9jS3S;tO z6xYn2_V>a8Xn_bZ;Ig|&yB+xB>}Jf`P41J)U#uIw|BkX+wd96K#CmBYwkirgxX0DJ zoN7!j9^HFfQohL@vCb9vosU(odaNg>-c8>g$WGlKVe=~#JUG#`iJex(D5okX7DA(R zLap32FnEbkgKRqoGb)Kq&$7UBC+I|WyHBStPC5$t4RxfW zu}N)3=_@%Gjs^qxH1`gnYuv*v?2{roo-?#D7cuMQ*%Wgl9HP50B>bGaQ0-&R%p*)$ zq+>>aZUkhrw+AF;C_Q{eQhuKQ@+6zHflXj}90fIc2a=*UD+!C5F#4(5Si2eT1{LYJ|Yi@jW(_1WE`^!)N4m#(#S%(YPy~Ucl8{hg5 D^j22q delta 949 zcmY*Y>q}E%7=Mma+0-^K)1e=78km=9=geKsnn~VJL^gF^63h$PhY3wxE<;KsGSSq{ z9xYq4Vu9 zC{F9*^k4uB_9`=R+n0yy(D;adp9p>oeuDQi3^fTJSrHG9yv6&spS$ zZJ!!rJK~3NV@7w%C~+6*Z3aPV_1`b!L<~<`Q9WBNBXzhtU`d*6a*coJ>$Ly6wL6Bk zWkZ}mk}X(Kqrsa!N!!e zI;xr!IN&eBy7?p-8%ur&d$z)krt!5aUmfyDGt^TAMo>gJz7-r$NkmI%KF7B}2TiMi zVyMCjZvhcx<}kI4s))gb3z+M@BpE|fl?@b!3p{WWBx@R%^EG

faH`D5_1knQlyL zff4AHj&Qt#zFcsXV2bePBc+18Vtt^;@RBo&5wjDuW7j$UK_D170b=+Mgv_N{kHsbC z^lGRg3I=GSYs7S!NofUx(M02pY7toEbcXpOl$7S|UGB7Rxw)RKh?$&d2Q57*cI`-3 zgr^xIw6h5*jN-8y(R?-^Td{wsKT*m@+BIOd2I0;wca|4-Uzc#f8)KFDdcx%?AE>GR7Ivvm(&@U?nrOv+^;9GlslDhk X)P&Bj%9Al`Efwe25<*>@d8vN@H!=`N diff --git a/huagao/resource.h b/huagao/resource.h index cc1de92ee7283e520aa388c866ee1edd1e3a1df7..4e12d2248d81094ad943af522bcd429548d8db52 100644 GIT binary patch delta 178 zcmccD!MLxFaYLWr`=0LiUMRD^hsV^Fn QHH5?_KX4M6%;6FS0GtRhX8-^I delta 52 zcmV-40L%Zrjsf0?0kDn{lMWpolL!(%ll~GMv%V5g1e0nPxU$#2ZWCin1paau4KGFUPgFt|;Y=Y9$owFHV90!4j+qTZXGc#2q< z%@~v>AC%PG{6OFe8-gQ#i;dB2a-nMPW)FD{Aaiq}YBh*@tKG`S@4*nxpv!=;q0!72 WL+qhlCsYh!Cqf-uZ1YCz&D;PK`Y{Or delta 111 zcmew`f$>Qn;|3k>$v61zCO_bw1)?|W@fNW#nr>bw_@50#NwBgrn=&X(ZWL9V+@O}V z*+fBu4JNR;K`jEL=%!99-{f89T$>Bb*Dy|=U@J6P%Pw#72WP3t2VA{C{LNZ+Zd?G8 Ci6(sj diff --git a/twpp/datasource.hpp b/twpp/datasource.hpp index 900c419d..682205b7 100644 --- a/twpp/datasource.hpp +++ b/twpp/datasource.hpp @@ -948,6 +948,7 @@ namespace Twpp { setState(DsState::XferReady); } else { + //setState(data.count() ? DsState::XferReady : DsState::Enabled); setState(data.count() ? DsState::XferReady : DsState::Enabled); } }