2021.1.30 开放G100尺寸检测,增加G200、G100休眠模式

2021.2.1    修改DPI可设值为100-600范围内的任意值
2021.2.3    修改部分协议互锁
	    线程处理使用多线程
This commit is contained in:
masayume 2021-02-03 18:21:45 +08:00
parent cdae53d794
commit 0938e8467c
27 changed files with 556 additions and 387 deletions

Binary file not shown.

View File

@ -80,16 +80,16 @@ static std::vector<CString> surportStyles = {
#endif // G400
static std::vector<CString> reslutions{
_T("100"),
_T("150"),
_T("200"),
_T("240"),
_T("300"),
#ifndef LANXUM
//_T("600")
#endif // LANXUM
};
//static std::vector<CString> reslutions{
// _T("100"),
// _T("150"),
// _T("200"),
// _T("240"),
// _T("300"),
//#ifndef LANXUM
// //_T("600")
//#endif // LANXUM
//};
static std::vector<CString> duplexs
{
@ -125,6 +125,8 @@ void CBasicPage::DoDataExchange(CDataExchange* pDX)
CTabPageSSL::DoDataExchange(pDX);
DDX_Check(pDX, IDC_CKBSWITCHFRONTBACK, m_bswitchfrontback);
DDX_Check(pDX, IDC_CKBSIZEDETECT, m_enableSizeCheck);
DDX_Control(pDX, IDC_SLIDERDPI, m_Slider_Dpi);
DDX_Control(pDX, IDC_EDITDPI, m_Edit_Dpi);
}
BOOL CBasicPage::OnInitDialog()
@ -133,16 +135,17 @@ BOOL CBasicPage::OnInitDialog()
#ifndef G200
((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->ShowWindow(SW_HIDE);
#endif // !G200
#ifdef ISG100
((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->ShowWindow(SW_HIDE);
#endif // ISG100
m_cmBoxColorMode = (CComboBox*)GetDlgItem(IDC_CMBCOLORTYPE);
m_cmBoxSS = (CComboBox*)GetDlgItem(IDC_CMBSS);
m_cmBoxResultion = (CComboBox*)GetDlgItem(IDC_CMBRESLUTION);
m_cmBoxDuplex = (CComboBox*)GetDlgItem(IDC_CMBDUPLEX);
m_Edit_Dpi.SetSlideLink(this, IDC_SLIDERDPI);
m_Edit_Dpi.SetParams(100, 600, 10);
m_Edit_Dpi.SetValue(200);
for (const CString& colorMode : color_Modes)
m_cmBoxColorMode->AddString(colorMode);
@ -150,14 +153,10 @@ BOOL CBasicPage::OnInitDialog()
for (int i = 0; i < surportStyles.size(); i++)
m_cmBoxSS->InsertString(i, surportStyles[i]);
for (const CString& reslution : reslutions)
m_cmBoxResultion->AddString(reslution);
for (int i = 0; i < duplexs.size(); i++)
m_cmBoxDuplex->InsertString(i,duplexs[i]);
m_cmBoxResultion->SetCurSel(0);
m_cmBoxSS->SetCurSel(0);
m_cmBoxColorMode->SetCurSel(0);
m_cmBoxDuplex->SetCurSel(0);
@ -259,9 +258,10 @@ void CBasicPage::updateCmbDuplex(BOOL insert)
int tmp_colorindex=m_cmBoxColorMode->GetCurSel();
int tmp_paperindex = m_cmBoxSS->GetCurSel();
int tmp_duplexindex = m_cmBoxDuplex->GetCurSel();
int tmp_resindex = m_cmBoxResultion->GetCurSel();
//int tmp_resindex = m_cmBoxResultion->GetCurSel();
int tmp_resindex = m_Slider_Dpi.m_iPosition;
int totalcount = m_cmBoxDuplex->GetCount();
if (tmp_colorindex == 0 && tmp_paperindex >= 18 && tmp_resindex == 4) {
if (tmp_colorindex == 0 && tmp_paperindex >= 18 && tmp_resindex >= 300) {
m_cmBoxDuplex->DeleteString(4);
m_cmBoxDuplex->SetCurSel(1);
}
@ -271,7 +271,6 @@ void CBasicPage::updateCmbDuplex(BOOL insert)
}
}
#ifdef G200
#ifndef ISG100
if (tmp_paperindex == 16 || tmp_paperindex == 17){
(((CButton*)GetDlgItem(IDC_CKBSIZEDETECT)))->SetCheck(false);
GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(false);
@ -279,7 +278,8 @@ void CBasicPage::updateCmbDuplex(BOOL insert)
else{
GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true);
}
#endif // !ISG100
#endif // G200
}

View File

@ -1,5 +1,7 @@
#pragma once
#include "TabPageSSL.h"
#include "SmartEdit.h"
#include "Sliders.h"
#include "twglue.hpp"
#include <functional>
@ -15,8 +17,9 @@ public:
CComboBox* m_cmBoxColorMode;
CComboBox* m_cmBoxSS;
CComboBox* m_cmBoxResultion;
CComboBox* m_cmBoxDuplex;
CSmartEdit m_Edit_Dpi;
CLinkSlider m_Slider_Dpi;
afx_msg void OnBnClickedBtnabout();
afx_msg void OnCbnSelchangeCmbcolortype();
@ -48,4 +51,6 @@ public:
private:
std::string m_hdVersion;
std::string m_serialNum;
public:
afx_msg void OnCbnSelchangeCblowpowermode();
};

View File

@ -17,6 +17,18 @@ std::vector<int> g400hiden =
IDC_LBSDR,
};
static std::vector<CString> lowpowermode
{
_T("不休眠"),
_T("5分钟"),
_T("10分钟"),
_T("20分钟"),
_T("30分钟"),
_T("60分钟"),
_T("120分钟"),
_T("240分钟"),
};
// CFeedPaperPage 对话框
IMPLEMENT_DYNAMIC(CFeedPaperPage, CTabPageSSL)
@ -65,9 +77,12 @@ BOOL CFeedPaperPage::OnInitDialog()
{
GetDlgItem(g400hiden[i])->ShowWindow(FALSE);
}
((CComboBox*)GetDlgItem(IDC_CBLOWPOWERMODE))->ShowWindow(SW_HIDE);
((CStatic*)GetDlgItem(IDC_STATICLOWPM))->ShowWindow(SW_HIDE);
#endif // G200
for (int i = 0; i < lowpowermode.size(); i++)
((CComboBox*)GetDlgItem(IDC_CBLOWPOWERMODE))->InsertString(i, lowpowermode[i]);
((CComboBox*)GetDlgItem(IDC_CBLOWPOWERMODE))->SetCurSel(0);
return true;
}

View File

@ -41,7 +41,8 @@ message($ENV{windir})
link_directories(${PROJECT_SOURCE_DIR}/../3rdparty/opencv/x86/staticlib/
${PROJECT_SOURCE_DIR}/../3rdparty/libtiff/
${PROJECT_SOURCE_DIR}/../3rdparty/gpdf/x86/staticlib/
${PROJECT_SOURCE_DIR}/../3rdparty/gpdf/3rdparty/tesseract/staticlib/x86/)
${PROJECT_SOURCE_DIR}/../3rdparty/gpdf/3rdparty/tesseract/staticlib/x86/
${PROJECT_SOURCE_DIR}/../3rdparty/turbojpeg/x86/lib/)
MESSAGE(STATUS "operation system is ${CMAKE_SYSTEM}")
@ -85,6 +86,7 @@ ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
link_libraries(tesseract_textord)
link_libraries(tesseract_viewer)
link_libraries(tesseract_wordrec)
link_libraries(turbojpeg)
MESSAGE(STATUS "current platform: Windows")
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
MESSAGE(STATUS "current platform: FreeBSD")

View File

@ -30,12 +30,12 @@ CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::st
m_hardwareVersion = hardwareversion;
m_serialnum = serialnum;
//memset(settings.get(), 0, sizeof(GScanCap));
m_pageImageProc->noise = caps.noise;
/*m_pageImageProc->noise = caps.noise;
m_pageImageProc->is_convex = caps.is_convex;
m_pageImageProc->threshold = caps.AutoCrop_threshold;
m_pageImageProc->indent = caps.indent;
m_pageImageProc->detachnoise = caps.detachnoise.detachnoise;
m_pageImageProc->is_detachnoise = caps.detachnoise.is_detachnoise;
m_pageImageProc->is_detachnoise = caps.detachnoise.is_detachnoise;*/
}
@ -119,11 +119,7 @@ void CTwainUI::OnBnClickedBtndefault()
GscanJsonConfig js;
GScanCap cf = js.GetDefaultGscancapValue();
settings.reset(new GScanCap(cf));
m_pageImageProc->noise = 40;
m_pageImageProc->threshold = 40;
m_pageImageProc->indent = 5;
m_pageImageProc->is_convex = true;
m_pageBasic->discardblank_percent = 20;
UpdateUI();
}
@ -154,7 +150,9 @@ void CTwainUI::UpdateUI()
{
//!< basic page
m_pageBasic->m_cmBoxColorMode->SetCurSel(settings->automaticcolor ? 3 : get_map_key_by_value(colorModes, settings->pixtype));//!< 颜色模式
m_pageBasic->m_cmBoxResultion->SetCurSel(get_map_key_by_value(resolutions, settings->resolution_dst));//!< 分辨率
//m_pageBasic->m_cmBoxResultion->SetCurSel(get_map_key_by_value(resolutions, settings->resolution_dst));//!< 分辨率
//m_pageBasic->m_Slider_Dpi.SetPos(settings->resolution_dst);
m_pageBasic->m_Edit_Dpi.SetValue((int)settings->resolution_dst);
m_pageBasic->m_cmBoxDuplex->SetCurSel(getCmbDuplexIndex());//!< 单双面
m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型
m_pageBasic->m_enableSizeCheck = settings->en_sizecheck==1?TRUE:FALSE;//!< 尺寸检测
@ -165,6 +163,7 @@ void CTwainUI::UpdateUI()
else
m_pageBasic->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(false);
//!< Page Breghtness
m_pageBrightness->m_cbAutoContrast = settings->is_autocontrast==TRUE?TRUE:FALSE; //!< 自动亮度对比度
int brt = GetMappingBrightnessValue(settings->brightness);
m_pageBrightness->m_Edit_Brightness.SetValue(brt); //!< 亮度
@ -175,6 +174,12 @@ void CTwainUI::UpdateUI()
//!< Page Proc
//!
m_pageImageProc->noise = settings->noise;
m_pageImageProc->threshold = settings->AutoCrop_threshold;
m_pageImageProc->indent = settings->indent;
m_pageImageProc->is_convex = settings->is_convex;
m_pageBasic->discardblank_percent = settings->discardblank_percent;
m_pageImageProc->m_ckbFillBlack = settings->fillbackground==TRUE ? TRUE : FALSE;//填充黑框
m_pageImageProc->m_ckbAutoDeskrew = settings->autodescrew ? TRUE : FALSE;//自动纠偏
UpdateFilterCmbx();
@ -210,7 +215,7 @@ void CTwainUI::UpdateUI()
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);
((CComboBox*)m_pageFeedPaper->GetDlgItem(IDC_CBLOWPOWERMODE))->SetCurSel(settings->hardwarecaps.lowpowermode);
if (settings->scannum == 65535)//连续扫描
{
m_pageFeedPaper->m_radioGroupScanMode = 0;
@ -274,19 +279,19 @@ int CTwainUI::getCmbDuplexIndex()
return ret;
}
int CTwainUI::getResolutionIndex(int resolution)
{
int result = 0;
for (size_t i = 0; i < SUPPORTRESNUMS; i++)
{
if (Resolutions[i] == resolution)
{
result = i;
break;
}
}
return result;
}
//int CTwainUI::getResolutionIndex(int resolution)
//{
// int result = 0;
// for (size_t i = 0; i < SUPPORTRESNUMS; i++)
// {
// if (Resolutions[i] == resolution)
// {
// result = i;
// break;
// }
// }
// return result;
//}
int CTwainUI::getPaparSizeIndex(int papersize, int orentation)
{
@ -383,11 +388,12 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
m_pageBasic->UpdateData();
configItem->Pixtype = m_pageBasic->m_cmBoxColorMode->GetCurSel() == 3 ? 0 : m_pageBasic->m_cmBoxColorMode->GetCurSel();//!< 颜色模式 index
configItem->EnSizeCheck = m_pageBasic->m_enableSizeCheck;
configItem->Resolution = m_pageBasic->m_cmBoxResultion->GetCurSel();//!< 分辨率 index
//configItem->Resolution = m_pageBasic->m_cmBoxResultion->GetCurSel();//!< 分辨率 index
configItem->Resolution = m_pageBasic->m_Slider_Dpi.m_iPosition;
configItem->Duplex = m_pageBasic->m_cmBoxDuplex->GetCurSel();//!< 单双面
configItem->PaperSize = m_pageBasic->m_cmBoxSS->GetCurSel();//!< 纸张类型 index
configItem->EnSwitchFrontBack = m_pageBasic->m_bswitchfrontback == TRUE ? true : false;
configItem->LowPowerMode = ((CComboBox*)m_pageFeedPaper->GetDlgItem(IDC_CBLOWPOWERMODE))->GetCurSel();//!<休眠模式
PaperStatus page = paperStatusMap[configItem->PaperSize];
configItem->EnAutoCrop = page.Paper == TwSS::None;
configItem->EnDiscardBlank = configItem->Duplex == 2;//自动跳骨空白页通用
@ -445,7 +451,8 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->paperAlign = (PaperAlign)paper.Orentate;
settings->en_sizecheck = configItem->EnSizeCheck;
settings->resolution_dst = Resolutions[configItem->Resolution];
//settings->resolution_dst = Resolutions[configItem->Resolution];
settings->resolution_dst = configItem->Resolution;
settings->resolution_native = 200.0f;
settings->is_switchfrontback = configItem->EnSwitchFrontBack ? 1 : 0;
//float value_Contrast = GetContrast(configItem->Contrast);
@ -475,6 +482,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->is_autotext = configItem->Orentation == 4;
settings->is_backrotate180 =configItem->EnBackRotate180;
settings->is_dogeardetection = m_pageFeedPaper->dogear.GetCheck();
settings->hardwarecaps.lowpowermode = (LowPowerMode)configItem->LowPowerMode;
settings->hardwarecaps.en_skrewdetect = configItem->EnScrewDetect;
settings->hardwarecaps.skrewdetectlevel = (int)configItem->ScrewDetectLevel;
settings->hardwarecaps.en_stapledetect = configItem->EnBindingDetect;

View File

@ -16,7 +16,7 @@ class CBrightnessPage;
/*配置文件默认索引号*/
#define SUPPORTRESNUMS 6
static int Resolutions[SUPPORTRESNUMS] = {100,150,200,240,300,600};
//static int Resolutions[SUPPORTRESNUMS] = {100,150,200,240,300,600};
#define TWPT_BW 0
#define TWPT_GRAY 1
@ -95,14 +95,14 @@ static std::map<int, int> filterMaps = {
};
//<index,res>
static std::map<int, float> resolutions = {
{0,100.0f},
{1,150.0f},
{2,200.0f},
{3,240.0f},
{4,300.0f},
{5,600.0f}
};
//static std::map<int, float> resolutions = {
// {0,100.0f},
// {1,150.0f},
// {2,200.0f},
// {3,240.0f},
// {4,300.0f},
// {5,600.0f}
//};
static std::map<int, unsigned short> colorModes = {
{0,TWPT_RGB},
@ -204,7 +204,7 @@ private:
TwGlue m_glue;
std::vector<CONFIGINFO> cfi;
int getResolutionIndex(int resolution);
//int getResolutionIndex(int resolution);
int getPaparSizeIndex(int papersize, int orentation);
TwSS getcombox_ss(int index);
int getColorModelIndex(int pixtype);

View File

@ -121,6 +121,7 @@ public:
virtual UINT32 get_ErrorCode() = 0;
virtual void Set_ErrorCode(UINT32 value) = 0;
virtual int get_scanned_num() = 0;
virtual void set_sleep_time(int mode) = 0;
void DoEvents() {
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {

View File

@ -166,6 +166,6 @@ void GScan200::image_call(void* fdata, int fsize, void* bdata, int bsize)
std::vector<cv::Mat> mats;
mats.push_back(fmat.clone());
mats.push_back(bmat.clone());
// m_pImages.pushMat(JpegBuffer(mats, pixType, 0));
//m_pImages.pushMat(JpegBuffer(mats, pixType, 0));
}
}

View File

@ -178,8 +178,9 @@ void GScanO200::open(int vid, int pid)
auto usbs = UsbScan_List::find_vid_pid(vid, pid);
if (!usbs.empty())
{
{
m_usb = *usbs.begin();
m_usb->set_usbhotplug_callback(usbhotplug_callback, this);
bool ret = m_usb->open();
USBCB status = { GET_DSP_STATUS ,0,0 };
if (m_usb.get() && m_usb->is_connected())
@ -187,9 +188,6 @@ void GScanO200::open(int vid, int pid)
if (m_usb.get() && m_usb->is_connected())
m_usb->read_bulk(&status, sizeof(status));
if (ret) {
m_usb->set_usbhotplug_callback(usbhotplug_callback, this);
}
}
if (this->IsConnected())
GetFWVersion();
@ -303,7 +301,7 @@ bool GScanO200::is_scan()
BOOL GScanO200::Get_Scanner_PaperOn()
{
if (m_usb.get() && !m_usb->is_open())
if (!(m_usb.get() && m_usb->is_open()))
return false;
USBCB usbcb = { GET_PAPER_STATUS ,0,0 };
@ -334,7 +332,10 @@ void GScanO200::config_params(GScanCap& params)
+ "\nscrew_detect_level:" + to_string((cfgdata>>11) & 0x7)
+ "\nunused_one:" + to_string((cfgdata>>14) & 0x3F)
+ "\npc_correct:" + to_string((cfgdata>>20) & 0x1)
+ "\nunused_two:" + to_string((cfgdata>>21) & 0x7ff));
+"\nenable_sizecheck:"+to_string((cfgdata>>21)&0x1)
+ "\nenabledsp_cache:" + to_string((cfgdata >> 22) & 0x1)
+ "\nlowpowermode:" + to_string((cfgdata >> 23) & 0x7)
+ "\nunused_two:" + to_string((cfgdata>>26) & 0x3f));
m_usb->write_bulk(&usbcb, sizeof(USBCB));
this_thread::sleep_for(std::chrono::milliseconds(200));
m_pImages->setparam(params);
@ -417,7 +418,7 @@ void GScanO200::Stop_scan()
void GScanO200::ResetScanner()
{
if (m_usb.get() && !m_usb->is_connected())
if (!(m_usb.get() && m_usb->is_connected()))
return;
std::lock_guard<std::mutex> lck(m_imgLocker);
@ -467,6 +468,18 @@ void GScanO200::clear_hwerror()
;
}
void GScanO200::set_sleep_time(int mode)
{
if (!(m_usb.get() && m_usb->is_connected()))
return ;
USBCB usbcb = { SET_SLEEP_TIME ,mode&0x7,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
usbcb = { GET_SLEEP_TIME ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
}
void GScanO200::usbhotplug_callback(bool isconnect, void* userdata)
{
@ -482,7 +495,6 @@ void GScanO200::usbhotplug(bool isleft)
m_pImages->setscanflags(false);
if (m_usb.get())
m_usb.reset();
if (huagods)
dev_callback(USB_DISCONNECTED, huagods);
}
@ -490,7 +502,7 @@ void GScanO200::usbhotplug(bool isleft)
void GScanO200::updateHVRatio()
{
if (m_usb.get() && !m_usb->is_connected())
if (!(m_usb.get() && m_usb->is_connected()))
return;
if (m_bread_fixed_ratio_fromDSP) {
USBCB usbcb = { GET_JUST_COF_H ,0,0 };
@ -515,7 +527,7 @@ void GScanO200::usbmain()
{
StopWatch sw;
while (devState == DEV_ISRUNNING) {
if ((m_usb.get() && !m_usb->is_connected())) {
if (!(m_usb.get() && m_usb->is_connected())) {
this_thread::sleep_for(chrono::milliseconds(200));
break;
}
@ -598,7 +610,7 @@ void GScanO200::usbmain()
///////////////////////////////////////////////////////////////////////////
USBCB GScanO200::Get_Scanner_Status()
{
if (m_usb.get() && !m_usb->is_connected()) {
if (!(m_usb.get() && m_usb->is_connected())) {
return { NO_COMMAND ,PC_SCAN_BUSY_or_ERROR ,0 };
}
@ -614,7 +626,7 @@ USBCB GScanO200::Get_Scanner_Status()
std::shared_ptr<std::vector<char>> GScanO200::Get_Img_Data(int bufferSize)
{
if (m_usb.get() && !m_usb->is_connected())
if (!(m_usb.get() && m_usb->is_connected()))
return std::shared_ptr<std::vector<char>>(new std::vector<char>());
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
@ -649,7 +661,7 @@ std::shared_ptr<std::vector<char>> GScanO200::Get_Img_Data(int bufferSize)
///////////////////////////////////////////////////////////////////////////
void GScanO200::Pop_Image()
{
if (m_usb.get() && !m_usb->is_open())
if (!(m_usb.get() && m_usb->is_open()))
return;
USBCB usbcb = { POP_IMAGE ,0,0 };

View File

@ -28,6 +28,7 @@ public:
virtual void Set_ErrorCode(UINT32 value) override;
virtual int get_scanned_num() override;
virtual void clear_hwerror() override;
virtual void set_sleep_time(int mode) override;
virtual void DogEar_callback(std::function<void(int)> fun) override;
private:

View File

@ -183,6 +183,7 @@ void GScanO400::open(int vid, int pid)
if (!usbs.empty())
{
m_usb = *usbs.begin();
m_usb->set_usbhotplug_callback(usbhotplug_callback, this);
bool ret = m_usb->open();
USBCB status = { GET_DSP_STATUS ,0,0 };
if (m_usb.get() && m_usb->is_connected())
@ -190,9 +191,7 @@ void GScanO400::open(int vid, int pid)
if (m_usb.get() && m_usb->is_connected())
m_usb->read_bulk(&status, sizeof(status));
if (ret) {
m_usb->set_usbhotplug_callback(usbhotplug_callback, this);
}
}
}
@ -266,7 +265,8 @@ std::string GScanO400::GetFWVersion()
fwVersion.resize(10);
USBCB cmd = { GET_FW_VERSION,fwVersion.size(),0, };
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], fwVersion.size());
if(m_usb.get()&&m_usb->is_connected())
m_usb->read_bulk(&fwVersion[0], fwVersion.size());
}
return fwVersion;
}
@ -283,7 +283,8 @@ std::string GScanO400::GetSerialNum()
SerialNum.resize(14);
USBCB usbcb = { GET_SERIAL,SerialNum.size(),0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], SerialNum.size());
if(m_usb.get()&&m_usb->is_connected())
m_usb->read_bulk(&SerialNum[0], SerialNum.size());
}
return SerialNum;
}
@ -298,15 +299,20 @@ bool GScanO400::is_scan()
BOOL GScanO400::Get_Scanner_PaperOn()
{
if (m_usb.get() && !m_usb->is_open())
if (!(m_usb.get() && m_usb->is_open()))
return false;
USBCB usbcb = { GET_PAPER_STATUS ,0,0 };
usbcb.u32_Data = 1;
std::lock_guard<std::mutex> lck(m_imgLocker);
m_usb->write_bulk(&usbcb, sizeof(usbcb));
if (0 == m_usb->read_bulk(&usbcb, sizeof(usbcb)))
{
if (m_usb.get() && m_usb->is_connected()) {
if (0 == m_usb->read_bulk(&usbcb, sizeof(usbcb)))
{
Set_ErrorCode(USB_DISCONNECTED);
return true;
}
}
else{
Set_ErrorCode(USB_DISCONNECTED);
return true;
}
@ -325,11 +331,11 @@ void GScanO400::config_params(GScanCap& params)
+ "\ndpi:" + to_string((cfgdata>>6) & 0x3)
+ "\ndouble_feed_enbale:" + to_string((cfgdata>>8) & 0x1)
+ "\nstable_enbale:" + to_string((cfgdata>>9) & 0x1)
+ "\nscrew_detect_enable:" + to_string((cfgdata>>10) & 0x1)
+ "\nscrew_detect_level:" + to_string((cfgdata>>11) & 0x7)
+ "\nunused_one:" + to_string((cfgdata>>14) & 0x3F)
+ "\npc_correct:" + to_string((cfgdata>>20) & 0x1)
+ "\nunused_two:" + to_string((cfgdata>>21) & 0x7ff));
+ "\nenableLed:" + to_string((cfgdata>>10) & 0x1)
+ "\nreversed1:" + to_string((cfgdata>>11) & 0x3F)
+ "\nisCorrect:" + to_string((cfgdata>>17) & 0x1)
+ "\ndstHeight:" + to_string((cfgdata>>18) & 0xFF)
+ "\nreversed2:" + to_string((cfgdata>>26) & 0x3F));
m_usb->write_bulk(&usbcb, sizeof(USBCB));
this_thread::sleep_for(std::chrono::milliseconds(200));
m_pImages->setparam(params);
@ -412,7 +418,7 @@ void GScanO400::Stop_scan()
void GScanO400::ResetScanner()
{
if (m_usb.get() && !m_usb->is_connected())
if (!(m_usb.get() && m_usb->is_connected()))
return;
std::lock_guard<std::mutex> lck(m_imgLocker);
@ -465,6 +471,11 @@ void GScanO400::clear_hwerror()
m_usb->write_bulk(&usbcb, sizeof(usbcb));
}
void GScanO400::set_sleep_time(int mode)
{
return ;
}
void GScanO400::usbhotplug_callback(bool isconnect, void* userdata)
{
@ -480,7 +491,6 @@ void GScanO400::usbhotplug(bool isleft)
m_pImages->setscanflags(false);
if (m_usb.get())
m_usb.reset();
if (huagods)
dev_callback(USB_DISCONNECTED, huagods);
}
@ -488,7 +498,7 @@ void GScanO400::usbhotplug(bool isleft)
void GScanO400::updateHVRatio()
{
if (m_usb.get() && !m_usb->is_connected())
if (!(m_usb.get() && m_usb->is_connected()))
return;
if (m_bread_fixed_ratio_fromDSP) {
USBCB usbcb = { GET_JUST_COF_H ,0,0 };
@ -512,7 +522,7 @@ void GScanO400::usbmain()
{
StopWatch sw;
while (devState == DEV_ISRUNNING) {
if ((m_usb.get() && !m_usb->is_connected())) {
if (!(m_usb.get() && m_usb->is_connected())) {
this_thread::sleep_for(chrono::milliseconds(200));
break;
}
@ -597,7 +607,7 @@ void GScanO400::usbmain()
///////////////////////////////////////////////////////////////////////////
USBCB GScanO400::Get_Scanner_Status()
{
if (m_usb.get() && !m_usb->is_connected()) {
if (!(m_usb.get() && m_usb->is_connected())) {
return { NO_COMMAND ,PC_SCAN_BUSY_or_ERROR ,0 };
}
@ -613,7 +623,7 @@ USBCB GScanO400::Get_Scanner_Status()
std::shared_ptr<std::vector<char>> GScanO400::Get_Img_Data(int bufferSize)
{
if (m_usb.get() && !m_usb->is_connected())
if (!(m_usb.get() && m_usb->is_connected()))
return std::shared_ptr<std::vector<char>>(new std::vector<char>());
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
@ -648,7 +658,7 @@ std::shared_ptr<std::vector<char>> GScanO400::Get_Img_Data(int bufferSize)
///////////////////////////////////////////////////////////////////////////
void GScanO400::Pop_Image()
{
if (m_usb.get() && !m_usb->is_open())
if (!(m_usb.get() && m_usb->is_open()))
return;
USBCB usbcb = { POP_IMAGE ,0,0 };

View File

@ -28,6 +28,7 @@ public:
virtual void Set_ErrorCode(UINT32 value) override;
virtual int get_scanned_num() override;
virtual void clear_hwerror() override;
virtual void set_sleep_time(int mode) override;
virtual void DogEar_callback(std::function<void(int)> fun) override;
private:

View File

@ -112,7 +112,8 @@ typedef union Config_Param {
unsigned int pc_correct : 1;
unsigned int enable_sizecheck : 1;
unsigned int enabledsp_cache : 1;
unsigned int sizeerror_errorratio : 9;
unsigned int lowpowermode : 3;
unsigned int sizeerror_errorratio : 6;
};
} ConfigParam;

View File

@ -6,6 +6,7 @@
#include "filetools.h"
#include <math.h>
#include "StopWatch.h"
#include "JpegBuffer.h"
using namespace cv;
using namespace std;
@ -49,6 +50,7 @@ ImageMatQueue::ImageMatQueue(void)
,DogEar_index(0)
,is_DogEar(false)
{
atm_orgin_image_remains = 0;
m_dogear.reset(new CImageApplyDogEarDetection(40,1.0,200));
}
@ -100,6 +102,7 @@ ImageMatQueue::~ImageMatQueue(void)
m_threadProc->join();
m_threadProc.reset();
}
}
static int paperIndex = 0;
@ -322,6 +325,10 @@ bool ImageMatQueue::queuesempty()
static int index = 0;
void ImageMatQueue::proc()
{
SYSTEM_INFO sys;
GetSystemInfo(&sys);
std::unique_ptr<ThreadPool> m_threadpool;
m_threadpool.reset(new ThreadPool(sys.dwNumberOfProcessors < 4 ? 1 : sys.dwNumberOfProcessors / 2));
while (bRun) {
while (m_imagedata.Size() > 0) {
this_thread::sleep_for(chrono::milliseconds(1));
@ -333,124 +340,141 @@ void ImageMatQueue::proc()
continue;
}
auto buffs = m_rawBuffs.Take()->getImageBuffs();
auto& buffs = m_rawBuffs.Take()->getImageBuffs();
if (!m_rawBuffs.IsShutDown() && !buffs.empty()) {
vector<cv::Mat> mats;
for (auto& buf : buffs) {
ImreadModes rm;
m_threadpool->enqueue(&ImageMatQueue::imageproceing, this, buffs);
//imageproceing(buffs);
}
}
m_threadpool.reset();
}
if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect)
rm = IMREAD_COLOR;
else
rm = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE;
try
{
//StopWatch sw;
cv::Mat mat = cv::imdecode(*buf, rm);
//double epl= sw.elapsed_ms();
//FileTools::write_log("1.txt", to_string(epl)+" img index"+to_string(++index));
buf.reset();
if (mat.empty()) {
writelog("decode image data error");
}
void ImageMatQueue::imageproceing(std::vector<std::shared_ptr<std::vector<char>>>& buffs)
{
//std::ostringstream oss;
//oss << std::this_thread::get_id();
//std::string stid = oss.str();
//writelog(stid);
vector<cv::Mat> mats;
for (auto& buf : buffs) {
ImreadModes rmc;
//int rm;
if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect) {
rmc = IMREAD_COLOR;
//rm = 1;
}
else {
rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE;
//rm = scanParam.pixtype == 2 ? 1 : 6;
}
try
{
//StopWatch sw;
cv::Mat mat = cv::imdecode(*buf, rmc);
//cv::Mat jmat(1, buf->size(), CV_8UC1,buf->data());
//cv::Mat mat=JpegBuffer(jmat,rm , 0).getMat(rm);
//jmat.release();
//double epl= sw.elapsed_ms();
buf.reset();
if (mat.empty()) {
writelog("decode image data error");
}
#ifdef G200
cv::resize(mat, mat, cv::Size(), fx,fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
mats.push_back(mat);
mat.release();
cv::resize(mat, mat, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
mats.push_back(mat);
mat.release();
#else // G200
//resize(mat, mat, cv::Size(), 1.001, 1.0070);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
//cv::imwrite("D:\\org"+to_string(++index)+".jpg", mat);
Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows));
Mat back = mat(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);
}
//FileTools::write_log("scanParam.imageRotateDegree-" + to_string(scanParam.imageRotateDegree));
mats.push_back(back);
mats.push_back(front);
//resize(mat, mat, cv::Size(), 1.001, 1.0070);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
//cv::imwrite("D:\\org"+to_string(++index)+".jpg", mat);
Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows));
Mat back = mat(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);
}
//FileTools::write_log("scanParam.imageRotateDegree-" + to_string(scanParam.imageRotateDegree));
mats.push_back(back);
mats.push_back(front);
#endif
}
catch (const std::exception& e)
{
writelog(e.what());
}
}
buffs.clear();
DogEar_index++;
StopWatch sw;
sw.reset();
if (ischeck_dogear)
{
m_dogear->apply(mats[0], 0);
if (m_dogear->getResult())
{
DogEarDetection_callback(DogEar_index);
m_rawBuffs.Clear();
atm_orgin_image_remains = 0;
is_DogEar = true;
continue;
}
}
//FileTools::write_log("1.txt", " dogear time " + to_string(sw.elapsed_ms()));
if (scanParam.is_switchfrontback)
swap(mats[0], mats[1]);
}
catch (const std::exception& e)
{
writelog(e.what());
}
}
buffs.clear();
//DogEar_index++; //暂时屏蔽
//StopWatch sw;
//sw.reset();
//if (ischeck_dogear)
//{
// m_dogear->apply(mats[0], 0);
// if (m_dogear->getResult())
// {
// DogEarDetection_callback(DogEar_index);
// m_rawBuffs.Clear();
// atm_orgin_image_remains = 0;
// is_DogEar = true;
// return;
// }
//}
//FileTools::write_log("1.txt", " dogear time " + to_string(sw.elapsed_ms()));
if (scanParam.is_switchfrontback)
swap(mats[0], mats[1]);
for (int j = 0; j < m_iaList.size(); j++) {
m_iaList[j]->apply(mats, scanParam.is_duplex);
}
static int index = 0;
for (int i = 0; i < mats.size(); i++) {
if (!scanParam.is_duplex && i == 1) {
mats[i].release();
break;
}
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);
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();
for (int j = 0; j < m_iaList.size(); j++) {
m_iaList[j]->apply(mats, scanParam.is_duplex);
}
static int index = 0;
for (int i = 0; i < mats.size(); i++) {
if (!scanParam.is_duplex && i == 1) {
mats[i].release();
break;
}
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);
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();
auto data = idata.getBmpDataBuffer();
//FILE* fd=fopen("D:\\0.bmp","w+");
//fwrite(data->data(), data->size(),1 , fd);
//fclose(fd);
auto data = idata.getBmpDataBuffer();
//FILE* fd=fopen("D:\\0.bmp","w+");
//fwrite(data->data(), data->size(),1 , fd);
//fclose(fd);
EnqueueBmpBuffer(data);
data.reset();
}
else
{
writelog("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();
}
else
{
writelog("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();
PaniusCount();
}
}
mats.clear();
PaniusCount();
}
G400Decode::G400Decode(std::shared_ptr<std::vector<char>> buff)

View File

@ -6,6 +6,7 @@
#include "PublicFunc.h"
#include "BlockingQueue.h"
#include <memory>
#include "threadpool.hpp"
#include "PaperSize.h"
#include "filetools.h"
@ -174,6 +175,7 @@ public:
std::function<void(bool)> Getimagenumber;
private:
void proc();
void imageproceing(std::vector<std::shared_ptr<std::vector<char>>>& buffs);
void EnqueueBmpBuffer(std::shared_ptr<std::vector<unsigned char>>);
void PaniusCount();
BlockingQueue<std::shared_ptr<std::vector<unsigned char>>>m_imagedata;

View File

@ -17,158 +17,186 @@ namespace Device {
void PaperSize::InitPaperMap()
{
//!< 自适应
dpiDct[{None, 50.0f}] = CSize(594, 898);
dpiDct[{None, 75.0f}] = CSize(892, 1347);
dpiDct[{None, 100.0f}] = CSize(1189, 1795);
dpiDct[{None, 150.0f}] = CSize(1784, 2693);
dpiDct[{None, 200.0f}] = CSize(2338, 3307);
dpiDct[{None, 240.0f}] = CSize(2854, 4308);
dpiDct[{None, 300.0f}] = CSize(3567, 5385);
dpiDct[{None, 400.0f}] = CSize(4756, 7180);
dpiDct[{None, 600.0f}] = CSize(7134, 10770);
////!< 自适应
//dpiDct[{None, 50.0f}] = CSize(594, 898);
//dpiDct[{None, 75.0f}] = CSize(892, 1347);
//dpiDct[{None, 100.0f}] = CSize(1189, 1795);
//dpiDct[{None, 150.0f}] = CSize(1784, 2693);
//dpiDct[{None, 200.0f}] = CSize(2338, 3307);
//dpiDct[{None, 240.0f}] = CSize(2854, 4308);
//dpiDct[{None, 300.0f}] = CSize(3567, 5385);
//dpiDct[{None, 400.0f}] = CSize(4756, 7180);
//dpiDct[{None, 600.0f}] = CSize(7134, 10770);
//A3
dpiDct[{A3, 50.0f}] = CSize(585, 827);
dpiDct[{A3, 75.0f}] = CSize(877, 1240);
dpiDct[{A3, 100.0f}] = CSize(1169, 1653);
dpiDct[{A3, 150.0f}] = CSize(1753, 2480);
dpiDct[{A3, 200.0f}] = CSize(2338, 3307);
dpiDct[{A3, 240.0f}] = CSize(2806, 3968);
dpiDct[{A3, 300.0f}] = CSize(3507, 4960);
dpiDct[{A3, 400.0f}] = CSize(4677, 6614);
dpiDct[{A3, 600.0f}] = CSize(7015, 9921);
//add lyc 2019 12 18
//A4
dpiDct[{A4, 50.0f}] = CSize(413, 585);
dpiDct[{A4, 75.0f}] = CSize(620, 877);
dpiDct[{A4, 100.0f}] = CSize(826, 1169);
dpiDct[{A4, 150.0f}] = CSize(1240, 1753);
dpiDct[{A4, 200.0f}] = CSize(1653, 2338);
dpiDct[{A4, 240.0f}] = CSize(1984, 2806);
dpiDct[{A4, 300.0f}] = CSize(2480, 3507);
dpiDct[{A4, 400.0f}] = CSize(3307, 4677);
dpiDct[{A4, 600.0f}] = CSize(4960, 7015);
//add lyc 2019 12 18 A5
dpiDct[{A5, 50.0f}] = CSize(291, 413);
dpiDct[{A5, 75.0f}] = CSize(437, 620);
dpiDct[{A5, 100.0f}] = CSize(582, 826);
dpiDct[{A5, 150.0f}] = CSize(874, 1240);
dpiDct[{A5, 200.0f}] = CSize(1165, 1653);
dpiDct[{A5, 240.0f}] = CSize(1398, 1984);
dpiDct[{A5, 300.0f}] = CSize(1748, 2480);
dpiDct[{A5, 400.0f}] = CSize(2330, 3307);
dpiDct[{A5, 600.0f}] = CSize(3496, 4960);
////A3
//dpiDct[{A3, 50.0f}] = CSize(585, 827);
//dpiDct[{A3, 75.0f}] = CSize(877, 1240);
//dpiDct[{A3, 100.0f}] = CSize(1169, 1653);
//dpiDct[{A3, 150.0f}] = CSize(1753, 2480);
//dpiDct[{A3, 200.0f}] = CSize(2338, 3307);
//dpiDct[{A3, 240.0f}] = CSize(2806, 3968);
//dpiDct[{A3, 300.0f}] = CSize(3507, 4960);
//dpiDct[{A3, 400.0f}] = CSize(4677, 6614);
//dpiDct[{A3, 600.0f}] = CSize(7015, 9921);
////add lyc 2019 12 18
////A4
//dpiDct[{A4, 50.0f}] = CSize(413, 585);
//dpiDct[{A4, 75.0f}] = CSize(620, 877);
//dpiDct[{A4, 100.0f}] = CSize(826, 1169);
//dpiDct[{A4, 150.0f}] = CSize(1240, 1753);
//dpiDct[{A4, 200.0f}] = CSize(1653, 2338);
//dpiDct[{A4, 240.0f}] = CSize(1984, 2806);
//dpiDct[{A4, 300.0f}] = CSize(2480, 3507);
//dpiDct[{A4, 400.0f}] = CSize(3307, 4677);
//dpiDct[{A4, 600.0f}] = CSize(4960, 7015);
////add lyc 2019 12 18 A5
//dpiDct[{A5, 50.0f}] = CSize(291, 413);
//dpiDct[{A5, 75.0f}] = CSize(437, 620);
//dpiDct[{A5, 100.0f}] = CSize(582, 826);
//dpiDct[{A5, 150.0f}] = CSize(874, 1240);
//dpiDct[{A5, 200.0f}] = CSize(1165, 1653);
//dpiDct[{A5, 240.0f}] = CSize(1398, 1984);
//dpiDct[{A5, 300.0f}] = CSize(1748, 2480);
//dpiDct[{A5, 400.0f}] = CSize(2330, 3307);
//dpiDct[{A5, 600.0f}] = CSize(3496, 4960);
//add lyc 2019 12 18 A6
dpiDct[{A6, 50.0f}] = CSize(207, 291);
dpiDct[{A6, 75.0f}] = CSize(310, 437);
dpiDct[{A6, 100.0f}] = CSize(413, 582);
dpiDct[{A6, 150.0f}] = CSize(620, 874);
dpiDct[{A6, 200.0f}] = CSize(826, 1165);
dpiDct[{A6, 240.0f}] = CSize(992, 1398);
dpiDct[{A6, 300.0f}] = CSize(1240, 1748);
dpiDct[{A6, 400.0f}] = CSize(1653, 2330);
dpiDct[{A6, 600.0f}] = CSize(2480, 3496);
////add lyc 2019 12 18 A6
//dpiDct[{A6, 50.0f}] = CSize(207, 291);
//dpiDct[{A6, 75.0f}] = CSize(310, 437);
//dpiDct[{A6, 100.0f}] = CSize(413, 582);
//dpiDct[{A6, 150.0f}] = CSize(620, 874);
//dpiDct[{A6, 200.0f}] = CSize(826, 1165);
//dpiDct[{A6, 240.0f}] = CSize(992, 1398);
//dpiDct[{A6, 300.0f}] = CSize(1240, 1748);
//dpiDct[{A6, 400.0f}] = CSize(1653, 2330);
//dpiDct[{A6, 600.0f}] = CSize(2480, 3496);
dpiDct[{USStatement, 50.0f}] = CSize(585, 827 * 1.5);
dpiDct[{USStatement, 75.0f}] = CSize(877, 1240 * 1.5);
dpiDct[{USStatement, 100.0f}] = CSize(1169, 1653 * 1.5);
dpiDct[{USStatement, 150.0f}] = CSize(1753, 2480 * 1.5);
dpiDct[{USStatement, 200.0f}] = CSize(2338, 3307 * 1.5);
dpiDct[{USStatement, 240.0f}] = CSize(2806, 3968 * 1.5);
dpiDct[{USStatement, 300.0f}] == CSize(3507, 4960 * 1.5);
dpiDct[{USStatement, 400.0f}] = CSize(4677, 6614 * 1.5);
dpiDct[{USStatement, 600.0f}] = CSize(7015, 9921 * 1.5);
//add lyc 2019 12 18 长文稿2倍A3
dpiDct[{MaxSize, 50.0f}] = CSize(585, 1653);
dpiDct[{MaxSize, 75.0f}] = CSize(877, 2480);
dpiDct[{MaxSize, 100.0f}] = CSize(1169, 1653 * 2);
dpiDct[{MaxSize, 150.0f}] = CSize(1753, 2480 * 2);
dpiDct[{MaxSize, 200.0f}] = CSize(2338, 3307 * 2);
dpiDct[{MaxSize, 240.0f}] = CSize(2806, 3968 * 2);
dpiDct[{MaxSize, 300.0f}] = CSize(3507, 4960 * 2);
dpiDct[{MaxSize, 400.0f}] = CSize(4677, 6614 * 2);
dpiDct[{MaxSize, 600.0f}] = CSize(7015, 9921 * 2);
//add lyc 2019 12 18 B4
dpiDct[{B4, 50.0f}] = CSize(506, 717);
dpiDct[{B4, 75.0f}] = CSize(759, 1075);
dpiDct[{B4, 100.0f}] = CSize(1011, 1433);
dpiDct[{B4, 150.0f}] = CSize(1517, 2149);
dpiDct[{B4, 200.0f}] = CSize(2023, 2866);
dpiDct[{B4, 240.0f}] = CSize(2428, 3439);
dpiDct[{B4, 300.0f}] = CSize(3035, 4299);
dpiDct[{B4, 400.0f}] = CSize(4047, 5732);
dpiDct[{B4, 600.0f}] = CSize(6070, 8598);
//add lyc 2019 12 18 B5
dpiDct[{B5, 50.0f}] = CSize(358, 506);
dpiDct[{B5, 75.0f}] = CSize(537, 759);
dpiDct[{B5, 100.0f}] = CSize(716, 1011);
dpiDct[{B5, 150.0f}] = CSize(1074, 1517);
dpiDct[{B5, 200.0f}] = CSize(1433, 2023);
dpiDct[{B5, 240.0f}] = CSize(1719, 2428);
dpiDct[{B5, 300.0f}] = CSize(2149, 3035);
dpiDct[{B5, 400.0f}] = CSize(2866, 4047);
dpiDct[{B5, 600.0f}] = CSize(4299, 6070);
//add lyc 2019 12 18 B6
dpiDct[{B6, 50.0f}] = CSize(252, 358);
dpiDct[{B6, 75.0f}] = CSize(378, 537);
dpiDct[{B6, 100.0f}] = CSize(503, 716);
dpiDct[{B6, 150.0f}] = CSize(755, 1074);
dpiDct[{B6, 200.0f}] = CSize(1007, 1433);
dpiDct[{B6, 240.0f}] = CSize(1209, 1719);
dpiDct[{B6, 300.0f}] = CSize(1511, 2149);
dpiDct[{B6, 400.0f}] = CSize(2015, 2866);
dpiDct[{B6, 600.0f}] = CSize(3023, 4299);
//dpiDct[{USStatement, 50.0f}] = CSize(585, 827 * 1.5);
//dpiDct[{USStatement, 75.0f}] = CSize(877, 1240 * 1.5);
//dpiDct[{USStatement, 100.0f}] = CSize(1169, 1653 * 1.5);
//dpiDct[{USStatement, 150.0f}] = CSize(1753, 2480 * 1.5);
//dpiDct[{USStatement, 200.0f}] = CSize(2338, 3307 * 1.5);
//dpiDct[{USStatement, 240.0f}] = CSize(2806, 3968 * 1.5);
//dpiDct[{USStatement, 300.0f}] == CSize(3507, 4960 * 1.5);
//dpiDct[{USStatement, 400.0f}] = CSize(4677, 6614 * 1.5);
//dpiDct[{USStatement, 600.0f}] = CSize(7015, 9921 * 1.5);
////add lyc 2019 12 18 长文稿2倍A3
//dpiDct[{MaxSize, 50.0f}] = CSize(585, 1653);
//dpiDct[{MaxSize, 75.0f}] = CSize(877, 2480);
//dpiDct[{MaxSize, 100.0f}] = CSize(1169, 1653 * 2);
//dpiDct[{MaxSize, 150.0f}] = CSize(1753, 2480 * 2);
//dpiDct[{MaxSize, 200.0f}] = CSize(2338, 3307 * 2);
//dpiDct[{MaxSize, 240.0f}] = CSize(2806, 3968 * 2);
//dpiDct[{MaxSize, 300.0f}] = CSize(3507, 4960 * 2);
//dpiDct[{MaxSize, 400.0f}] = CSize(4677, 6614 * 2);
//dpiDct[{MaxSize, 600.0f}] = CSize(7015, 9921 * 2);
////add lyc 2019 12 18 B4
//dpiDct[{B4, 50.0f}] = CSize(506, 717);
//dpiDct[{B4, 75.0f}] = CSize(759, 1075);
//dpiDct[{B4, 100.0f}] = CSize(1011, 1433);
//dpiDct[{B4, 150.0f}] = CSize(1517, 2149);
//dpiDct[{B4, 200.0f}] = CSize(2023, 2866);
//dpiDct[{B4, 240.0f}] = CSize(2428, 3439);
//dpiDct[{B4, 300.0f}] = CSize(3035, 4299);
//dpiDct[{B4, 400.0f}] = CSize(4047, 5732);
//dpiDct[{B4, 600.0f}] = CSize(6070, 8598);
////add lyc 2019 12 18 B5
//dpiDct[{B5, 50.0f}] = CSize(358, 506);
//dpiDct[{B5, 75.0f}] = CSize(537, 759);
//dpiDct[{B5, 100.0f}] = CSize(716, 1011);
//dpiDct[{B5, 150.0f}] = CSize(1074, 1517);
//dpiDct[{B5, 200.0f}] = CSize(1433, 2023);
//dpiDct[{B5, 240.0f}] = CSize(1719, 2428);
//dpiDct[{B5, 300.0f}] = CSize(2149, 3035);
//dpiDct[{B5, 400.0f}] = CSize(2866, 4047);
//dpiDct[{B5, 600.0f}] = CSize(4299, 6070);
////add lyc 2019 12 18 B6
//dpiDct[{B6, 50.0f}] = CSize(252, 358);
//dpiDct[{B6, 75.0f}] = CSize(378, 537);
//dpiDct[{B6, 100.0f}] = CSize(503, 716);
//dpiDct[{B6, 150.0f}] = CSize(755, 1074);
//dpiDct[{B6, 200.0f}] = CSize(1007, 1433);
//dpiDct[{B6, 240.0f}] = CSize(1209, 1719);
//dpiDct[{B6, 300.0f}] = CSize(1511, 2149);
//dpiDct[{B6, 400.0f}] = CSize(2015, 2866);
//dpiDct[{B6, 600.0f}] = CSize(3023, 4299);
//add lyc 2019 12 18 DOUBLE LETTER
dpiDct[{USLedger, 50.0f}] = CSize(550, 850);
dpiDct[{USLedger, 75.0f}] = CSize(825, 1275);
dpiDct[{USLedger, 100.0f}] = CSize(1100, 1700);
dpiDct[{USLedger, 150.0f}] = CSize(1650, 2550);
dpiDct[{USLedger, 200.0f}] = CSize(2200, 3400);
dpiDct[{USLedger, 240.0f}] = CSize(2640, 4080);
dpiDct[{USLedger, 300.0f}] = CSize(3300, 5100);
dpiDct[{USLedger, 400.0f}] = CSize(4400, 6800);
dpiDct[{USLedger, 600.0f}] = CSize(6600, 10200);
//add lyc 2019 12 18 LETTER
dpiDct[{USLetter, 50.0f}] = CSize(425, 550);
dpiDct[{USLetter, 75.0f}] = CSize(638, 825);
dpiDct[{USLetter, 100.0f}] = CSize(850, 1100);
dpiDct[{USLetter, 150.0f}] = CSize(1275, 1650);
dpiDct[{USLetter, 200.0f}] = CSize(1700, 2200);
dpiDct[{USLetter, 240.0f}] = CSize(2040, 2640);
dpiDct[{USLetter, 300.0f}] = CSize(2550, 3300);
dpiDct[{USLetter, 400.0f}] = CSize(3400, 4400);
dpiDct[{USLetter, 600.0f}] = CSize(5100, 6600);
////add lyc 2019 12 18 DOUBLE LETTER
//dpiDct[{USLedger, 50.0f}] = CSize(550, 850);
//dpiDct[{USLedger, 75.0f}] = CSize(825, 1275);
//dpiDct[{USLedger, 100.0f}] = CSize(1100, 1700);
//dpiDct[{USLedger, 150.0f}] = CSize(1650, 2550);
//dpiDct[{USLedger, 200.0f}] = CSize(2200, 3400);
//dpiDct[{USLedger, 240.0f}] = CSize(2640, 4080);
//dpiDct[{USLedger, 300.0f}] = CSize(3300, 5100);
//dpiDct[{USLedger, 400.0f}] = CSize(4400, 6800);
//dpiDct[{USLedger, 600.0f}] = CSize(6600, 10200);
////add lyc 2019 12 18 LETTER
//dpiDct[{USLetter, 50.0f}] = CSize(425, 550);
//dpiDct[{USLetter, 75.0f}] = CSize(638, 825);
//dpiDct[{USLetter, 100.0f}] = CSize(850, 1100);
//dpiDct[{USLetter, 150.0f}] = CSize(1275, 1650);
//dpiDct[{USLetter, 200.0f}] = CSize(1700, 2200);
//dpiDct[{USLetter, 240.0f}] = CSize(2040, 2640);
//dpiDct[{USLetter, 300.0f}] = CSize(2550, 3300);
//dpiDct[{USLetter, 400.0f}] = CSize(3400, 4400);
//dpiDct[{USLetter, 600.0f}] = CSize(5100, 6600);
//add lyc 2019 12 18 LETTER
dpiDct[{USLegal, 50.0f}] = CSize(425, 700);
dpiDct[{USLegal, 75.0f}] = CSize(638, 1050);
dpiDct[{USLegal, 100.0f}] = CSize(850, 1400);
dpiDct[{USLegal, 150.0f}] = CSize(1275, 2100);
dpiDct[{USLegal, 200.0f}] = CSize(1700, 2800);
dpiDct[{USLegal, 240.0f}] = CSize(2040, 3360);
dpiDct[{USLegal, 300.0f}] = CSize(2550, 4200);
dpiDct[{USLegal, 400.0f}] = CSize(3400, 5600);
dpiDct[{USLegal, 600.0f}] = CSize(5100, 8400);
////add lyc 2019 12 18 LETTER
//dpiDct[{USLegal, 50.0f}] = CSize(425, 700);
//dpiDct[{USLegal, 75.0f}] = CSize(638, 1050);
//dpiDct[{USLegal, 100.0f}] = CSize(850, 1400);
//dpiDct[{USLegal, 150.0f}] = CSize(1275, 2100);
//dpiDct[{USLegal, 200.0f}] = CSize(1700, 2800);
//dpiDct[{USLegal, 240.0f}] = CSize(2040, 3360);
//dpiDct[{USLegal, 300.0f}] = CSize(2550, 4200);
//dpiDct[{USLegal, 400.0f}] = CSize(3400, 5600);
//dpiDct[{USLegal, 600.0f}] = CSize(5100, 8400);
papersize.insert({ A3,CSize(297,420) });
papersize.insert({ A4,CSize(210,297) });
papersize.insert({ A5,CSize(148,210) });
papersize.insert({ A6,CSize(105,148) });
papersize.insert({ B4,CSize(250,353) });
papersize.insert({ B5,CSize(176,250) });
papersize.insert({ B6,CSize(125,176) });
papersize.insert({ MaxSize,CSize(297,420 * 2) });
papersize.insert({ USStatement,CSize(297,420 * 1.5) });
papersize.insert({ USLetter,CSize(216,279) });
papersize.insert({ USLegal,CSize(216,356) });
papersize.insert({ USLedger,CSize(297,432) });
papersize.insert({ None,CSize(297,420) });
}
CSize PaperSize::GetPaperSize(DWORD paperType, float dpi,int orentation)
{
auto iter = dpiDct.find({(TwSS)paperType, dpi});
if (iter != dpiDct.end()) {
if (orentation == 0)//不需要旋转
return iter->second;
else if(orentation == 3)//旋转九十度
{
CSize size;
size.cx = iter->second.cy;
size.cy = iter->second.cx;
return size;
if (papersize.find((TwSS)paperType) != papersize.end() && (dpi > 99 && dpi < 601)) {
CSize resize(2338,3307);
if (orentation == 0){
resize.cx = papersize[(TwSS)paperType].cx * dpi / 25.4;
resize.cy = papersize[(TwSS)paperType].cy * dpi / 25.4;
return resize;
}
else{
resize.cy = papersize[(TwSS)paperType].cx * dpi / 25.4;
resize.cx = papersize[(TwSS)paperType].cy * dpi / 25.4;
return resize;
}
}
return CSize(2338, 3307);
//auto iter = dpiDct.find({(TwSS)paperType, dpi});
//if (iter != dpiDct.end()) {
// if (orentation == 0)//不需要旋转
// return iter->second;
// else if(orentation == 3)//旋转九十度
// {
// CSize size;
// size.cx = iter->second.cy;
// size.cy = iter->second.cx;
// return size;
// }
//}
//return CSize(2338, 3307);
}
}

View File

@ -73,7 +73,8 @@ namespace Device {
~PaperSize();
private:
void InitPaperMap();
std::map<std::pair<TwSS, float>, CSize> dpiDct;
//std::map<std::pair<TwSS, float>, CSize> dpiDct;
std::map<TwSS, CSize> papersize;
public:
CSize GetPaperSize(DWORD paperType, float dpi, int orentation);
};

View File

@ -77,6 +77,7 @@ const std::string ISCONVEX = "isConvex";
const std::string INDENT = "Indent";
const std::string AUTOCROP_THRESHOLD = "AutoCrop_Threshold";
const std::string NOISE = "Noise";
const std::string LOWPOWERMODE = "ilowpowermode";
/******************
@ -97,6 +98,7 @@ typedef struct tagCONFIGPARAMS
int DBlank_DevnMax;
bool EnFlod;
bool EnSwitchFrontBack;
byte LowPowerMode;
/*亮度对比度选项卡参数*/
float Brightness;
bool EnAutoContrast;
@ -121,7 +123,6 @@ typedef struct tagCONFIGPARAMS
bool EnBackRotate180;
bool EnScrewDetect;
int ScrewDetectLevel;
/*保存信息*/
std::string Caption;
std::string SavePath;
@ -145,6 +146,18 @@ typedef struct tagDetachNoise
int detachnoise;
}DetachNoise;
enum LowPowerMode :byte {
Min_None = 0,
Min_5,
Min_10,
Min_20,
Min_30,
Min_60,
Min_120,
Min_240
};
typedef struct tagHARDWAREPARAMS
{
byte capturepixtype;
@ -152,6 +165,7 @@ typedef struct tagHARDWAREPARAMS
byte en_stapledetect;
byte en_skrewdetect;
byte skrewdetectlevel;
LowPowerMode lowpowermode;
}HardwareCaps;
typedef struct Scan_Rect {
@ -168,6 +182,8 @@ enum PaperAlign :byte {
};
typedef enum Enchace_Color :short {
Enhance_None=0,
Enhance_Red,

View File

@ -164,10 +164,10 @@ int UsbScanEx::read_bulk(void* data, int len)
int error_code = GetLastError();
switch (error_code)
{
case ERROR_IO_PENDING:
GetOverlappedResult(h_pipe, lp_overlap, &pdw_ret, TRUE);
return pdw_ret;
case ERROR_IO_PENDING: {
if (0 != GetOverlappedResult(h_pipe, lp_overlap, &pdw_ret, TRUE))
return pdw_ret;
}
case ERROR_FILE_NOT_FOUND:
case ERROR_ACCESS_DENIED:
m_b_is_connected = false;
@ -202,10 +202,10 @@ int UsbScanEx::write_bulk(void* data, int len)
int errorcode = GetLastError();
switch (errorcode)
{
case ERROR_IO_PENDING:
GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE);
return dw_size;
case ERROR_IO_PENDING: {
if (0 != GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE))
return dw_size;
}
case ERROR_FILE_NOT_FOUND:
case ERROR_ACCESS_DENIED:
m_b_is_connected = false;

View File

@ -16,7 +16,7 @@ private:
private:
std::map<unsigned short, unsigned int> paperTypes;
std::map<unsigned short, unsigned int> pixType;
std::map<float, unsigned int> resolutions;
//std::map<float, unsigned int> resolutions;
MotorSetting ms;
};

View File

@ -22,6 +22,7 @@ hgConfigClass::hgConfigClass(GScanCap param)
#ifdef G200
m_param.pc_correct = 0;
#endif
m_param.lowpowermode = (byte)param.hardwarecaps.lowpowermode;
m_param.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
m_param.unused_one = m_param.sizeerror_errorratio = 0;
m_param.enabledsp_cache = param.resolution_dst >= 240.0f?1:0;

View File

@ -72,6 +72,7 @@ GScanCap GscanJsonConfig::GetDefaultGscancapValue()
gcap.indent = 5;
gcap.is_dogeardetection = FALSE;
gcap.scannum = -1;//ĬÈÏÁ¬ÐøɨÃè
gcap.hardwarecaps.lowpowermode = (LowPowerMode)4;
//gcap.scanrect = { 0 };
return gcap;
@ -732,6 +733,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap)
js[CONFIG][ISCONVEX] = cap.is_convex;
js[CONFIG][ITEMCAPTION] = cap.Caption;
js[CONFIG][SAVEPATH] = cap.SavePath;
js[CONFIG][LOWPOWERMODE] = cap.hardwarecaps.lowpowermode;
return js;
}
@ -782,6 +784,7 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js)
cap.noise = json_cast(js[CONFIG][NOISE]).to_int();
cap.indent = json_cast(js[CONFIG][INDENT]).to_int();
cap.AutoCrop_threshold = json_cast(js[CONFIG][AUTOCROP_THRESHOLD]).to_int();
cap.hardwarecaps.lowpowermode = (LowPowerMode)json_cast(js[CONFIG][LOWPOWERMODE]).to_int();
cap.is_convex = json_cast(js[CONFIG][ISCONVEX]).to_int();
cap.Caption = json_cast(js[CONFIG][ITEMCAPTION]).to_string();
cap.SavePath = json_cast(js[CONFIG][SAVEPATH]).to_string();
@ -833,6 +836,7 @@ json GscanJsonConfig::GetDefaultJson()
"Indent": 5 ,
"AutoCrop_Threshold": 40 ,
"isConvex": true ,
"ilowpowermode": 4,
"Caption": "" ,
"SavePath": ""
}

View File

@ -55,7 +55,8 @@ enum class CapTypeEx : unsigned short {
TwEx_CroporDesaskewThreshold=0x8100,
TwEx_IDetachNoise = 0x8101,
TwEx_IDetachNoiseValue = 0x8102,
TwEx_SizeDetect
TwEx_SizeDetect=0x8103,
TwEx_LowPowerMode=0x8104
};
using namespace Twpp;
@ -679,9 +680,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
{
if (usb.vid == 0x064b && usb.pid == 0x7823){
if (!scanner.get()) {
#ifdef G100
scanner.reset(new GScanO200());
#endif //
#ifdef G200
scanner.reset(new GScanO200());
#endif // G200
@ -695,11 +693,13 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
break;
}
}
#ifdef G100
if(usb.vid == 0x3072 && usb.pid == 0x100)
#endif //
#ifdef G200
#ifdef ISG100
if(usb.vid == 0x3072 && usb.pid == 0x100)
#else //
if (usb.vid == 0x3072 && usb.pid == 0x200)
#endif
#endif // G200
#ifdef G300
if (usb.vid == 0x3072 && usb.pid == 0x300)
@ -709,7 +709,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
#endif // G400
{
pid = usb.pid; vid = usb.vid;
if(pid<=200&& (!scanner.get()))
if(pid<=0x200&& (!scanner.get()))
scanner.reset(new GScanO200());
else
scanner.reset(new GScanO400());
@ -717,11 +717,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
}
}
}
if (vid ==0|| pid == 0)
{
MessageBox(NULL, L"未找到扫描仪,请连接扫描仪!",L"警告",MB_OK);
return seqError();
}
m_haveError = false;
updataGscanCap();
bmpData->resize(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
@ -731,8 +727,14 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
bmInfo.biBitCount = m_scanparam->pixtype == 2 ? 24 : (m_scanparam->pixtype == 1 ? 8 : 1);
m_iBitdepth = m_scanparam->pixtype == 2 ? 24 : (m_scanparam->pixtype == 1 ? 8 : 1);
#ifdef LANXUM
scanner->open(0x31c9, 0x8200);
//scanner->open(0x31c9, 0x8200);
scanner->open(0x3072, 0x300);
#else
if (vid == 0 || pid == 0)
{
MessageBox(NULL, L"未找到扫描仪,请连接扫描仪!", L"警告", MB_OK);
return seqError();
}
scanner->open(vid, pid);
#endif
@ -942,17 +944,28 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
m_query[CapType::IXResolution] = msgSupportGetAllSetReset;
m_caps[CapType::IXResolution] = [this](Msg msg, Capability& data) {
if (Msg::Set == msg) {
auto res = data.currentItem<Fix32>();
if(std::distance(resList.begin(), std::find(resList.begin(), resList.end(), res))==resList.size())
switch (msg) {
case Msg::Get:
data = Capability::createRange<CapType::IXResolution>(Fix32(100.0f), Fix32(600.0f), Fix32(1.0f), Fix32(m_scanparam->resolution_dst), Fix32(200.0));
return success();
case Msg::GetCurrent:
data = Capability::createOneValue<CapType::IXResolution>(Fix32(m_scanparam->resolution_dst));
return success();
case Msg::GetDefault:
case Msg::Reset:
m_scanparam->resolution_dst = 200.0f;
data = Capability::createOneValue<CapType::IXResolution>(Fix32(200.0f));
return success();
case Msg::Set: {
auto mech = data.currentItem<CapType::IXResolution>();
if (mech < 100.0f || mech > 600.0f)
return badValue();
else{
m_scanparam->resolution_dst = (float)res;
return success();
}
m_scanparam->resolution_dst = (float)mech;
return success();
}
default:
return capBadOperation();
}
return CapSupGetAllReset<float, Fix32, CapType::IXResolution>(msg, data, { Fix32(100.0),Fix32(150.0),Fix32(200.0),Fix32(240.0),Fix32(300.0),Fix32(600.0) }, m_scanparam->resolution_dst,200.0,
std::distance(resList.begin(), std::find(resList.begin(), resList.end(), m_scanparam->resolution_dst)) == resList.size() ? 2 : std::distance(resList.begin(), std::find(resList.begin(), resList.end(), m_scanparam->resolution_dst)), 2);
};
m_query[CapType::IYResolution] = msgSupportGetAllSetReset;
@ -1115,9 +1128,10 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
if (Msg::Set == msg) {
auto mech = data.currentItem<CapType::DuplexEnabled>();
m_scanparam->is_duplex = mech;
m_scanparam->is_autodiscradblank_normal = m_scanparam->is_autodiscradblank_vince = m_scanparam->en_fold = 0;
if (!mech)
m_scanparam->is_backrotate180 = 0;//µ¥Ãæ±³ÃæÐýת180¡ã²»¿ÉÓÃ
else
m_scanparam->is_autodiscradblank_normal = m_scanparam->is_autodiscradblank_vince = m_scanparam->en_fold = 0;
return success();
}
return CapSupGetAllReset<byte, Bool, CapType::DuplexEnabled>(msg, data, m_scanparam->is_duplex, Bool(true));
@ -1266,9 +1280,11 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
if ((mech != DiscardBlankPages::Auto) || (mech != DiscardBlankPages::Disabled))
return badValue();
m_scanparam->is_autodiscradblank_normal = (Int32)mech == (Int32)DiscardBlankPages::Auto;
m_scanparam->is_duplex = 1;
m_scanparam->en_fold = 0;
m_scanparam->is_autodiscradblank_vince = 0;
if (mech == DiscardBlankPages::Auto) {
m_scanparam->is_duplex = 1;
m_scanparam->en_fold = 0;
m_scanparam->is_autodiscradblank_vince = 0;
}
return success();
}
DiscardBlankPages autodiscradblank;
@ -1286,8 +1302,10 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
if (Msg::Set == msg) {
auto mech = data.currentItem<Bool>();
m_scanparam->is_autodiscradblank_vince = mech;
m_scanparam->is_duplex = 1;
m_scanparam->en_fold = 0;
if (mech) {
m_scanparam->is_duplex = 1;
m_scanparam->en_fold = 0;
}
if (mech)
m_scanparam->is_autodiscradblank_normal = 0;
return success();
@ -1681,6 +1699,21 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
}
return CapSupGetAllResetEx<byte, Bool, CapType::DoubleFeedDetection>(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE);
};
#ifdef G200
//低功耗模式
m_query[(CapType)(CapTypeEx::TwEx_LowPowerMode)] = msgSupportGetAllSetReset;
m_caps[(CapType)(CapTypeEx::TwEx_LowPowerMode)] = [this](Msg msg, Capability& data)->Result {
if (Msg::Set == msg) {
auto mech = data.currentItem<byte>();
m_scanparam->hardwarecaps.lowpowermode = (LowPowerMode)mech;
return success();
}
return CapSupGetAllResetEx<LowPowerMode, byte, (CapType)CapTypeEx::TwEx_LowPowerMode>(msg, data,
{ LowPowerMode::Min_None,LowPowerMode::Min_5,LowPowerMode::Min_10,LowPowerMode::Min_20, LowPowerMode::Min_30, LowPowerMode::Min_60, LowPowerMode::Min_120, LowPowerMode::Min_240 },
m_scanparam->hardwarecaps.lowpowermode, LowPowerMode::Min_30,(byte)m_scanparam->hardwarecaps.lowpowermode, 4);
};
#endif // LANXUM
return success();
}
@ -1792,7 +1825,7 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
m_memXferYOff = 0;
scanner->ResetMsgFiter();
setState(DsState::Enabled);
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
@ -1804,7 +1837,7 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
}
#endif // !G200
setState(DsState::Enabled);
auto ret = startScan();
//if (ret.status().condition() == Twpp::CC::NoMedia)
// return ret;
@ -1814,12 +1847,16 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
else {
m_pendingXfers = 0;
//setState(DsState::Open);
return seqError();
}
auto notified = notifyXferReady();
return success();
}
return showTwainUI(ui);
if (showTwainUI(ui) != success())
{
setState(DsState::Open);
}
return success();
}
Result HuagaoDs::userInterfaceEnableUiOnly(const Identity&, UserInterface& ui) {

Binary file not shown.

Binary file not shown.

Binary file not shown.