mirror of http://192.168.1.51:8099/lmh188/twain3.0
2021.1.30 开放G100尺寸检测,增加G200、G100休眠模式
2021.2.1 修改DPI可设值为100-600范围内的任意值 2021.2.3 修改部分协议互锁 线程处理使用多线程
This commit is contained in:
parent
cdae53d794
commit
0938e8467c
Binary file not shown.
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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": ""
|
||||
}
|
||||
|
|
|
@ -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.
BIN
huagao/stdafx.h
BIN
huagao/stdafx.h
Binary file not shown.
Loading…
Reference in New Issue