3358 发布版本代码

This commit is contained in:
masayume 2022-06-29 20:24:24 +08:00
parent 2187375234
commit ff13d808e7
23 changed files with 888 additions and 350 deletions

View File

@ -63,12 +63,14 @@ BOOL CAboutDlg::OnInitDialog()
HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP4));
#elif defined MAKERIGHTWAY
HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP5));
#elif defined CUMTENN
HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP7));
#else
HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BMPABOUTDLG));
#endif
pStatic->ModifyStyle(0xF, SS_BITMAP | SS_CENTERIMAGE);
pStatic->SetBitmap(hBitmap);
#if defined MAKEHUAGAO || defined LANXUM || defined HANVON || defined AUGE ||defined MAKERIGHTWAY
#if defined MAKEHUAGAO || defined LANXUM || defined HANVON || defined AUGE ||defined MAKERIGHTWAY || defined CUMTENN
GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(TRUE);
#else
GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(FALSE);

View File

@ -156,7 +156,7 @@ BOOL CBasicPage::OnInitDialog()
m_cmBoxDuplex = (CComboBox*)GetDlgItem(IDC_CMBDUPLEX);
m_Edit_Dpi.SetSlideLink(this, IDC_SLIDERDPI);
m_Edit_Dpi.SetParams(100, 600, 10);
m_Edit_Dpi.SetParams(100, 300, 10);
m_Edit_Dpi.SetValue(200);
for (const CString& colorMode : color_Modes)
@ -323,7 +323,18 @@ void CBasicPage::updateCmbDuplex(BOOL insert)
GetDlgItem(IDC_CKFIXEDPAPER)->EnableWindow(false);
}
else {
GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true);
if (m_Slider_Dpi.m_iPosition >= 500) {
if (m_hdVersion.size() > 9 && m_hdVersion.substr(2, 2) == "39")
{
if ((m_hdVersion[5] == 'B' && atoi(m_hdVersion.substr(6, 4).c_str()) > 429) || (m_hdVersion[5] > 'B')) {
GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true);
}
}
}
else {
GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true);
}
GetDlgItem(IDC_CKFIXEDPAPER)->EnableWindow(true);
}
@ -336,6 +347,39 @@ void CBasicPage::OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult)
// TODO: 在此添加控件通知处理程序代码
if(pResult!=nullptr)
*pResult = 0;
if (m_Slider_Dpi.m_iPosition >= 500) {
if (m_hdVersion.size() > 9 && m_hdVersion.substr(2, 2) == "39")
{
if ((m_hdVersion[5] == 'B' && atoi(m_hdVersion.substr(6, 4).c_str()) > 429) || (m_hdVersion[5] > 'B')) {
int tmp_paperindex = m_cmBoxSS->GetCurSel();
#ifndef G300
if (!(tmp_paperindex == 19 || tmp_paperindex == 20 || tmp_paperindex == 21 || tmp_paperindex == 22 || tmp_paperindex == 1 || tmp_paperindex == 4 || tmp_paperindex == 5)) {
#else
if (!(tmp_paperindex == 8 || tmp_paperindex == 1 || tmp_paperindex == 9 || tmp_paperindex == 10)) {
#endif // G200
((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->EnableWindow(TRUE);
}
}
else
{
((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->SetCheck(FALSE);
}
}
}
else
{
int tmp_paperindex = m_cmBoxSS->GetCurSel();
#ifndef G300
if (!(tmp_paperindex == 19 || tmp_paperindex == 20 || tmp_paperindex == 21 || tmp_paperindex == 22 || tmp_paperindex == 1 || tmp_paperindex == 4 || tmp_paperindex == 5)) {
#else
if (!(tmp_paperindex == 8 || tmp_paperindex == 1 || tmp_paperindex == 9 || tmp_paperindex == 10)) {
#endif // G200
((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->EnableWindow(TRUE);
}
}
if (m_Slider_Dpi.m_iPosition >= 500) {
((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->EnableWindow(FALSE);
@ -348,8 +392,8 @@ void CBasicPage::OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult)
((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->EnableWindow(TRUE);
}
if (((m_Slider_Dpi.m_iPosition >= 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) ||
(m_Slider_Dpi.m_iPosition >= 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) &&
if (((m_Slider_Dpi.m_iPosition > 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) ||
(m_Slider_Dpi.m_iPosition > 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) &&
#ifdef G300
m_cmBoxSS->GetCount() > 9)
{
@ -367,8 +411,8 @@ void CBasicPage::OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult)
m_cmBoxSS->DeleteString(20);
#endif // G300
}
else if (((m_Slider_Dpi.m_iPosition < 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) ||
(m_Slider_Dpi.m_iPosition < 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) &&
else if (((m_Slider_Dpi.m_iPosition <= 300 && ((CButton*)GetDlgItem(IDC_RDQUALITYPRIORITY))->GetCheck()) ||
(m_Slider_Dpi.m_iPosition <= 500 && ((CButton*)GetDlgItem(IDC_RDSPEEDPRIORITY))->GetCheck())) &&
#ifdef G300
m_cmBoxSS->GetCount() <= 9)
{

View File

@ -57,8 +57,9 @@ CImageProcPage::~CImageProcPage()
{
}
void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool is_Crop)
void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool is_Crop,int dpi)
{
this->dpi = dpi;
this->twss = twss;
this->cmduplexsel = cmduplexsel;
CComboBox* m_temp = (CComboBox*)(GetDlgItem(IDC_CMBFILTER));
@ -76,8 +77,17 @@ void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool
{
GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(TRUE);
GetDlgItem(IDC_CKBACKGROUNDSMOOTH)->EnableWindow(TRUE);
GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(((CButton*)GetDlgItem(IDC_CHMULTIPUT))->GetCheck());
if (dpi >= 500) {
GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_CHMULTIPUT))->SetCheck(FALSE);
GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_CMBMULTIOUT))->SetCheck(FALSE);
}
else
{
GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(((CButton*)GetDlgItem(IDC_CHMULTIPUT))->GetCheck());
}
}
else {
GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(FALSE);
@ -356,7 +366,9 @@ void CImageProcPage::OnBnClickedCkmultioutput()
}
else
{
GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(FALSE);
GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE);
if (dpi < 500) {
GetDlgItem(IDC_CMBMULTIOUT)->EnableWindow(FALSE);
GetDlgItem(IDC_CHMULTIPUT)->EnableWindow(TRUE);
}
}
}

View File

@ -30,7 +30,7 @@ public:
BOOL m_ckbRemoveHole;
BOOL m_ckbHSVCorrect;
BOOL m_ckbDetachNoise;
void ImageProcPageUpdate(int val,int twss,int cmduplexsel, bool is_Crop);
void ImageProcPageUpdate(int val,int twss,int cmduplexsel, bool is_Crop,int dpi);
void ImageAutoDescrewUpdate(int val);
void EnableOutHoleCheckChanged(BOOL enable);
void SetOutHoleValue(int value);
@ -41,6 +41,7 @@ public:
int threshold;
int twss;
int cmduplexsel;
int dpi;
bool is_convex;
bool is_crop;
bool is_bw;

View File

@ -54,13 +54,15 @@ BOOL CTwainUI::OnInitDialog()
this->SetWindowText(TWAIN_NAME);
auto dataChangeFunction = [this]() {
m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(),m_pageBasic->m_cmBoxSS->GetCurSel(),m_pageBasic->m_cmBoxDuplex->GetCurSel(),
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel())== TwSS::USStatement)||(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None));
m_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel());
m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel());
//m_pageFeedPaper->FeedAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel());
UpdateUi();
m_pageBasic->OnNMReleasedcaptureSliderdpi(nullptr, nullptr);
if (m_pageBasic.get() && m_pageImageProc.get() && m_pageBrightness.get() && m_pageFeedPaper.get()) {
m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(),
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None), m_pageBasic->m_Slider_Dpi.m_iPosition);
m_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel());
m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel());
//m_pageFeedPaper->FeedAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel());
UpdateUi();
m_pageBasic->OnNMReleasedcaptureSliderdpi(nullptr, nullptr);
}
};
int nPageID = 0;
@ -77,10 +79,6 @@ BOOL CTwainUI::OnInitDialog()
m_tabCtrl->AddSSLPage(_T("送纸"), nPageID++, m_pageFeedPaper.get());
CString title(m_confirmtitle.c_str());
this->GetDlgItem(IDC_CONFIRM)->SetWindowText(title);
UpdateUI();
UpdateListConfig();
dataChangeFunction();
setvisable_sleepmode(false);
#ifdef G200
if (m_hardwareVersion.size() > 9 && m_hardwareVersion.substr(2,2) == "39")
{
@ -99,12 +97,17 @@ BOOL CTwainUI::OnInitDialog()
setvisable_fixedpaper(false);
setvisable_dogear(true);
setvisable_size(true);
if ((m_hardwareVersion[5] == 'B' && atoi(m_hardwareVersion.substr(6, 4).c_str()) >= 430) || (m_hardwareVersion[5] > 'B'))
m_pageBasic->m_Edit_Dpi.SetParams(100, 600, 10);
}
else {
setvisable_dogear(false);
setvisable_size(false);
setvisable_autopaper(false);
setvisable_fixedpaper(false);
((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_HIDE);
((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_HIDE);
}
#else
#ifndef ANDROIDSERIAL
@ -119,15 +122,30 @@ BOOL CTwainUI::OnInitDialog()
}
setvisable_dogear(true);
setvisable_size(true);
setvisable_fixedpaper(true);
setvisable_fixedpaper(false);
m_pageBasic->m_Edit_Dpi.SetParams(100, 600, 10);
}
else
{
setvisable_dogear(false);
if(((atoi(m_hardwareVersion.substr(4, 2).c_str()) == 22)&& (atoi(m_hardwareVersion.substr(6,4).c_str())> 401))||((atoi(m_hardwareVersion.substr(4, 2).c_str()) > 22)))
if (atoi(m_hardwareVersion.substr(4, 6).c_str()) >= 220401)
{
setvisable_size(true);
}
else
{
setvisable_size(false);
}
((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_HIDE);
((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_HIDE);
#ifdef G400
if (atoi(m_hardwareVersion.substr(4, 6).c_str()) >= 220117)
{
((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_SHOW);
((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_SHOW);
}
#endif // G400
setvisable_dogear(false);
setvisable_autopaper(false);
setvisable_fixedpaper(false);
}
@ -136,9 +154,17 @@ BOOL CTwainUI::OnInitDialog()
setvisable_size(false);
setvisable_autopaper(false);
setvisable_fixedpaper(false);
((CButton*)m_pageBasic->GetDlgItem(IDC_RDQUALITYPRIORITY))->ShowWindow(SW_HIDE);
((CButton*)m_pageBasic->GetDlgItem(IDC_RDSPEEDPRIORITY))->ShowWindow(SW_HIDE);
#endif
#endif // G200
//setvisable_fixedpaper(false);
UpdateUI();
UpdateListConfig();
dataChangeFunction();
setvisable_sleepmode(false);
return true;
}
@ -154,12 +180,14 @@ BEGIN_MESSAGE_MAP(CTwainUI, CDialogEx)
ON_BN_CLICKED(IDC_BTNRECOVERYCONFIG, &CTwainUI::OnBnClickedBtnrecoveryconfig)
ON_LBN_SELCHANGE(IDC_LSTCONFIG, &CTwainUI::OnLbnSelchangeLstconfig)
ON_WM_CLOSE()
ON_NOTIFY(NM_CLICK, IDC_TAB, &CTwainUI::OnNMClickTab)
END_MESSAGE_MAP()
void CTwainUI::OnBnClickedConfirm()
{
// TODO: 在此添加控件通知处理程序代码
OnNMClickTab(nullptr, nullptr);
CONFIGPARAMS cfg = { 0 };
UpDateScanParam(&cfg);
m_glue.m_scan(*settings);
@ -323,7 +351,7 @@ void CTwainUI::UpdateUI()
m_pageFeedPaper->UpdateData(FALSE);
m_pageBasic->updateCmbDuplex(TRUE);
m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(),
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None));
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None),m_pageBasic->m_Slider_Dpi.m_iPosition);
}
void CTwainUI::UpdateFilterCmbx()
@ -877,3 +905,15 @@ LRESULT CTwainUI::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
return CDialogEx::WindowProc(message, wParam, lParam);
}
void CTwainUI::OnNMClickTab(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加控件通知处理程序代码
//*pResult = 0;
m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(),
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None),
m_pageBasic->m_Slider_Dpi.m_iPosition);
}

View File

@ -230,4 +230,6 @@ private:
std::string m_confirmtitle;
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnNMClickTab(NMHDR* pNMHDR, LRESULT* pResult);
};

View File

@ -124,7 +124,11 @@ static map<UsbSupported, string> msgs = {
{UsbSupported::USB_BULK_ERROR,"USB数据读取错误"},
{UsbSupported::V4L2_AQULRE_ERROR,"扫描仪取图失败!"},
{UsbSupported::V4L2_IMAGE_EMPTY,"扫描仪图像处理异常!"},
{UsbSupported::SLEEPING,"设备处于休眠模式,请按电源键关闭休眠!"},
#ifdef G200
{UsbSupported::SLEEPING,"设备处于休眠模式!请手动唤醒设备。"},
#else
{UsbSupported::SLEEPING,"设备处于休眠模式!正在为您唤醒设备。"},
#endif // G200
{UsbSupported::HAVE_DOGEAR,"检测到有折角,停止扫描!"},
{UsbSupported::MLTOP_TIMEOUT,"升降台抬升未到达指定位置!"},
{UsbSupported::PAPER_HOLE,"纸张疑是有孔,请使用带孔模式扫描!"},

View File

@ -231,6 +231,7 @@ std::uint32_t GScanO1003399::GetMotorFPGA()
fw.resize(scanner_read_reg(m_usb, SR_GET_MBVERSION_LENGHT));
scanner_write_reg(m_usb, SR_GET_MBVERSION,0);
m_usb->read_bulk(&fw[0], fw.size());
//read_data(&fw[0], fw.length(), 200);
}
return atoi(fw.c_str());
}
@ -296,6 +297,13 @@ void GScanO1003399::config_params(GScanCap& param)
cfg.g200params.is_fixedpaper = true; //220513 重影问题默认固定幅面采集
cfg.g200params.en_anlogic_key = true;
#ifdef G200
if ((fwversion[5] == 'A' && (atoi(fwversion.substr(6, 4).c_str()) > 1220)) || (fwversion[5] == 'B' && (atoi(fwversion.substr(6, 4).c_str()) <= 430)))
{
if (param.resolution_dst == 500)
param.resolution_dst = 501;
}
#endif // G200
config_scanparam(cfg);
config_imgprocparam({sizeof(GScanCap_3399)});
GScanCap_3399 param39{ 0 };
@ -336,6 +344,10 @@ void GScanO1003399::config_params(GScanCap& param)
param39.resolution_dst = param.is_high_imagequality ? param.resolution_dst : ( param.resolution_dst >= 500.0f ?300.0f: 200.0f);
//param39.resolution_dst = param.resolution_dst > 300 ? 300 : param.resolution_dst;
param39.resolution_native = param.is_high_imagequality? param.resolution_native : (param.resolution_dst >= 500.0f ? 300.0f : 200.0f);
if (param39.resolution_dst >= 300 && param39.resolution_dst < 500)
param39.noise = param39.noise * 1.5;
else if(param39.resolution_dst>=500)
param39.noise = param39.noise * 3;
param39.scannum = param.scannum;
param39.sharpen = param.sharpen;
param39.threshold = param.threshold;
@ -773,6 +785,8 @@ void GScanO1003399::imgproce(std::shared_ptr<std::vector<char>>& buff)
_tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\tessdata\\osd.traineddata"));
#elif defined MAKERIGHTWAY
_tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\tessdata\\osd.traineddata"));
#elif defined CUMTENN
_tcscat(szIniFile, _T("\\twain_32\\CumTennScan\\tessdata\\osd.traineddata"));
#elif defined NOLOGO
_tcscat(szIniFile, _T("\\twain_32\\Scan\\tessdata\\osd.traineddata"));
#else
@ -1045,8 +1059,8 @@ void GScanO1003399::proc(bool bcachemode)
}
buffer = imgs.Take();
}
//if (m_param.resolution_dst > 500)
// std::this_thread::sleep_for(std::chrono::milliseconds(4399));
if (m_param.resolution_dst > 500)
std::this_thread::sleep_for(std::chrono::milliseconds(4399));
imgproce(buffer);
}
}

View File

@ -210,7 +210,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
if (m_pImages->empty()) {
DoEvents();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
if (sw.elapsed_s() > 30.00)
if (sw.elapsed_s() > 60.00)
{
if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP;
@ -607,7 +607,7 @@ void GScanO200::usbmain()
break;
}
if (sw.elapsed_ms() > 30000)
if (sw.elapsed_ms() > 60000)
{
m_pImages->setscanflags(false);
//devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP;

View File

@ -12,135 +12,135 @@
//u32_CMD
typedef enum tagUsbKeyWords : UINT32
{
//无命令
//无命令
NO_COMMAND = 0,
//获取dsp 状态
//获取dsp 状态
GET_DSP_STATUS = 1,
//取图
//取图
GET_IMAGE = 2,
//销毁DSP中驻存的图
//销毁DSP中驻存的图
POP_IMAGE = 3,
//开始扫描命令
//开始扫描命令
START_COMMAND = 4,
//停止扫描命令
//停止扫描命令
STOP = 5,
//获取扫描仪扫描模式
//获取扫描仪扫描模式
GET_SCAN_MODE = 6,
//获取固件版本号
//获取固件版本号
GET_FW_VERSION = 7,
//返回PC端的状态
//返回PC端的状态
SEND_STATUS_PC = 8,
//下发扫描配置参数
//下发扫描配置参数
CONFIGURED_DATA = 9,
//下发固件信息
//下发固件信息
SEND_FW = 10,
//获取扫描参数
//获取扫描参数
GET_CONFIG_DATA = 11,
//获取扫描总张数
//获取扫描总张数
GET_SCANN_NUM = 12,
//获取有无纸的状态
//获取有无纸的状态
GET_PAPERFEEDER_STATUS = 13,
//DSP初始化
//DSP初始化
INIT_HARDWARE_SYS = 14,
//获取有无纸的状态
//获取有无纸的状态
GET_PAPER_STATUS = 0x0d,
//下发元器件配置参数灰度LED R曝光时间
//下发元器件配置参数灰度LED R曝光时间
SEND_COMPONENTS_GR = 15,
//下发元器件配置参数LED G/B曝光时间
//下发元器件配置参数LED G/B曝光时间
SEND_COMPONENTS_GB = 16,
//下发扫描模式
//下发扫描模式
SEND_SCAN_MODE = 17,
//开始进行平场矫正
//开始进行平场矫正
START_FLAT = 18,
//停止平场矫正
//停止平场矫正
STOP_FLAT = 19,
//下发200dpi彩色平场矫正参数
//下发200dpi彩色平场矫正参数
SEND_200_COLOR_FLAT_DATA = 20,
//下发300dpi彩色平场矫正参数
//下发300dpi彩色平场矫正参数
SEND_300_COLOR_FLAT_DATA = 21,
//获取200dpi彩色平场矫正参数
//获取200dpi彩色平场矫正参数
GET_200_COLOR_FLAT_DATA = 22,
//获取300dpi彩色平场矫正参数
//获取300dpi彩色平场矫正参数
GET_300_COLOR_FLAT_DATA = 23,
//下发200dpi灰度平场校正参数
//下发200dpi灰度平场校正参数
SEND_200_GRAY_FLAT_DATA = 24,
//下发300dpi灰度平场校正参数
//下发300dpi灰度平场校正参数
SEND_300_GRAY_FLAT_DATA = 25,
//获取200DPI灰度平场校正参数
//获取200DPI灰度平场校正参数
GET_200_GRAY_FLAT_DATA = 26,
//获取300DPI灰度平场校正参数
//获取300DPI灰度平场校正参数
GET_300_GRAY_FLAT_DATA = 27,
//下发序列号命令
//下发序列号命令
SEND_SERIAL = 28,
//获取序列号命令
//获取序列号命令
GET_SERIAL = 29,
//获取滚轴数
//获取滚轴数
GET_ROLLER_NUM = 0x1e,
//清零滚轴数
//清零滚轴数
CLR_ROLLER_NUM = 0x1f,
//清除扫描总张数
//清除扫描总张数
CLR_SCAN_NUM = 0x20,
//准备更新固件
//准备更新固件
PRE_UPGRADE = 0X21,
//开始更新固件
//开始更新固件
START_UPGRADE = 0x22,
//彩色的AD参数
//彩色的AD参数
RGB_ADI_PARA = 0x23,
//灰度的AD参数
//灰度的AD参数
ADI_PARA = 0x24,
//获取CIS参数曝光时间ad参数)
//获取CIS参数曝光时间ad参数)
GET_CIS_PARA = 0x25,
//扫描张数
//扫描张数
START_COMMAND_COUNT = 0x26,
//下发休眠时间
//下发休眠时间
SET_SLEEP_TIME = 0x27,
//获取休眠时间
//获取休眠时间
GET_SLEEP_TIME = 0x28,
//清除缓存
//清除缓存
CLR_CACHE = 0x29,
//下发速度模式
//下发速度模式
SET_SPEED_MODE = 0x2a,
//获取扫描速度模式
//获取扫描速度模式
GET_SPEED_MODE = 0X2b,
//设置固件版本一共8个字节
//设置固件版本一共8个字节
SET_FW_VERSION = 0X2c,
//获取DSP版本
//获取DSP版本
GET_DSP_VERSION = 0X2d,
//采集板FPGA固件版本
//采集板FPGA固件版本
GET_SCANFPGA_VERSION = 0x2e,
//电机板FPGA固件版本
//电机板FPGA固件版本
GET_MOTORFPGA_VERSION = 0X2f,
//设置制造商信息
//设置制造商信息
SET_USB_INFOR_MANUFACTURE = 0X30,
//获取制造商信息
//获取制造商信息
GET_USB_INFOR_MANUFACTURE = 0X31,
//设置产品型号信息
//设置产品型号信息
SET_USB_INFOR_MODEL_NAME = 0X32,
//获取产品型号信息
//获取产品型号信息
GET_USB_INFOR_MODEL_NAME = 0X33,
//设置USB PID / VID信息
//设置USB PID / VID信息
SET_USB_INFOR_VIDPID = 0X34,
GET_USB_INFOR_VIDPID = 0X35,
//设置卡纸急停检测灵敏度
//设置卡纸急停检测灵敏度
SET_JAM_DETECT_SENSITIVE = 0X36,
//获取卡纸急停检测灵敏度
//获取卡纸急停检测灵敏度
GET_JAM_DETECT_SENSITIVE = 0X37,
//设置横向畸变系数
//设置横向畸变系数
SET_JUST_COF_H = 0x38,
//读取横向畸变系数
//读取横向畸变系数
GET_JUST_COF_H = 0x39,
CLEAR_HWERROR = 0x40,//G400 清除硬件异常
//设置纵向畸变系数
CLEAR_HWERROR = 0x40,//G400 清除硬件异常
//设置纵向畸变系数
SET_JUST_COF_V = 0x41,
//读取纵向畸变系数
//读取纵向畸变系数
GET_JUST_COF_V = 0x42,
//设置扫描仪编码
//设置扫描仪编码
GET_CODE_G400 = 0x59,
//读取扫描仪编码
//读取扫描仪编码
SET_CODE_G400 = 0x60,
//设置扫描仪编码
//设置扫描仪编码
SET_CODE_G200 = 0x63,
//读取扫描仪编码
//读取扫描仪编码
GET_CODE_G200 = 0x64,
} UsbKeyWords, * PUsbKeyWords;
@ -184,6 +184,11 @@ void GScanO400::open(int vid, int pid)
m_usb = *usbs.begin();
m_usb->set_usbhotplug_callback(usbhotplug_callback, this);
bool ret = m_usb->open();
if (notifyscan() < 1)
{
Set_ErrorCode(SLEEPING);
return;
}
USBCB status = { GET_DSP_STATUS ,0,0 };
if (m_usb.get() && m_usb->is_connected())
{
@ -206,7 +211,7 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
if (m_pImages->empty()) {
DoEvents();
this_thread::sleep_for(chrono::milliseconds(1));
if (sw.elapsed_s() > 30.00)
if (sw.elapsed_s() > 60.00)
{
int roller_num_new = Get_Roller_num();
if (m_threadUsb && m_threadUsb->joinable()) {
@ -215,7 +220,7 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
m_threadUsb.reset();
FileTools::writelog(log_ERROR, "aquire_bmpdata m_threadUsb.reset()");
}
Stop_scan();//停止扫描
Stop_scan();//停止扫描
ResetScanner();
set_scannum(abs(roller_num_new - roller_num));
return HARDWARE_ERROR;
@ -371,6 +376,7 @@ void GScanO400::config_params(GScanCap& params)
if (params.papertype == 52 || params.papertype == 54 || params.papertype == 131 || params.papertype == 0)
cfgdata = (cfgdata & 0xffffffe0) + 18;
}
#ifdef G400
if (atoi(fw.substr(4, 6).c_str()) >= 220117)
{
int dpi = 1;
@ -406,6 +412,7 @@ void GScanO400::config_params(GScanCap& params)
}
}
else
#endif // G400
params.resolution_native = 200.0f;
gcap = params;
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
@ -493,7 +500,8 @@ int GScanO400::notifyscan()
m_usb->read_bulk(&notify, sizeof(notify));
if ((notify.u32_Data != 0x10 && GetFWVersion().length() < 10) || notify.u32_Data == 0x100)
{
ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("扫描仪处于休眠状态,请按电源键唤醒! 提示 "), NULL, SW_HIDE);
std::string text = msgs[UsbSupported::SLEEPING];
ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text).c_str()), NULL, SW_HIDE);
return -1;
}
return 1;
@ -587,6 +595,7 @@ std::string GScanO400::get_scannercode()
{
if (!(m_usb.get() && m_usb->is_connected()))
return NULL;
//return "12345678901234567890123456789012";
USBCB usb{ GET_CODE_G400,0,32 };
m_usb->write_bulk(&usb, sizeof(USBCB));
std::this_thread::sleep_for(std::chrono::milliseconds(20));
@ -653,7 +662,7 @@ void GScanO400::usbmain()
this_thread::sleep_for(chrono::milliseconds(200));
break;
}
if (sw.elapsed_ms() > 30000)
if (sw.elapsed_ms() > 60000)
{
m_pImages->setscanflags(false);
Set_ErrorCode(AQUIRE_IMAGE_TIMEOUT);
@ -702,7 +711,7 @@ void GScanO400::usbmain()
UpdateScanInfo(countNReaded(), get_imgTransfered());
#endif
Pop_Image();
FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_imgnReaded()) + "份文件。耗时 " + to_string(sw.elapsed_ms()));
FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_imgnReaded()) + "份文件。耗时 " + to_string(sw.elapsed_ms()));
sw.reset();
break;
}
@ -779,8 +788,9 @@ std::shared_ptr<std::vector<char>> GScanO400::Get_Img_Data(int bufferSize)
std::this_thread::sleep_for(std::chrono::microseconds(20));
while (startindex < bufferSize)
{
startindex += m_usb->read_bulk(imData->data() + startindex, (bufferSize - startindex) < totalength ? (bufferSize - startindex) : totalength); //数据接收量必须小于等于管道内数据量,否则会接收失败
startindex += m_usb->read_bulk(imData->data() + startindex, (bufferSize - startindex) < totalength ? (bufferSize - startindex) : totalength); //数据接收量必须小于等于管道内数据量,否则会接收失败
std::this_thread::sleep_for(std::chrono::microseconds(10));
FileTools::writelog(log_ERROR, "usb read buffer "+to_string(startindex));
}
if (sw.elapsed_ms() > 5000)
{

View File

@ -7,6 +7,7 @@
#include <math.h>
#include "StopWatch.h"
#include "ImageProcess/ImageMulti.h"
#include <Psapi.h>
using namespace cv;
@ -164,7 +165,7 @@ void ImageMatQueue::setparam(const GScanCap& param)
m_iaList.clear();
if (scanParam.fillhole.is_fillhole) {
if (scanParam.fillhole.is_fillhole && scanParam.resolution_dst < 500) {
float ratio = scanParam.fillhole.fillholeratio / 100.0;
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyOutHole(200, ratio, 50)));
} //确保能够获取正反两面图
@ -335,6 +336,8 @@ void ImageMatQueue::setparam(const GScanCap& param)
_tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\tessdata\\osd.traineddata"));
#elif defined NOLOGO
_tcscat(szIniFile, _T("\\twain_32\\Scan\\tessdata\\osd.traineddata"));
#elif defined CUMTENN
_tcscat(szIniFile, _T("\\twain_32\\CumTennScan\\tessdata\\osd.traineddata"));
#else
_tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\tessdata\\osd.traineddata"));
#endif //
@ -396,6 +399,7 @@ void ImageMatQueue::cache_run()
auto buffs = m_rawBuffs.Take()->getImageBuffs();
buffs.size() == 2 ? info.scannerType = ScannerSerial::G200Serial : info.scannerType = ScannerSerial::G400Serial;
for (auto& buf : buffs)
{
StopWatch sw;
@ -530,222 +534,93 @@ void ImageMatQueue::proc()
FileTools::writelog(log_ERROR, msg);
continue;
}
ImreadModes rmc;
if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect)
rmc = IMREAD_COLOR;
else
rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE;
std::vector<cv::Mat> mats;
std::vector<Mat> uvmats;
StopWatch sw;
if (info.scannerType == ScannerSerial::G200Serial)
{
auto back = m_imgCacheinfo.Take();
if (!isFileExist(back.path))
{
msg = "error while reading g200 back image " + back.path + " ,file not exist";
FileTools::writelog(log_ERROR, msg);
}
sw.reset();
cv::Mat imgfront = imread(info.path, rmc);
msg = "reading image front time elapsed_ms:" + std::to_string(sw.elapsed_ms());
FileTools::writelog(log_DEBUG, msg);
sw.reset();
cv::Mat imgback = imread(back.path, rmc);
msg = "reading image back time elapsed_ms:" + std::to_string(sw.elapsed_ms());
FileTools::writelog(log_DEBUG, msg);
sw.reset();
if (!imgfront.empty() && !imgback.empty())
{
if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
cv::flip(imgback, imgback, 0);
cv::flip(imgback, imgback, 1);
}
mats.push_back(scanParam.is_switchfrontback ? imgback : imgfront);
mats.push_back(scanParam.is_switchfrontback ? imgfront : imgback);
remove(info.path.c_str());
remove(back.path.c_str());
}
else
{
msg = "get empty mat! empty ";
msg += (imgfront.empty() ? " front image" : " back image");
FileTools::writelog(log_ERROR, msg);
}
for (size_t i = 0; i < mats.size(); i++)
{
if (!mats[i].empty())
cv::resize(mats[i], mats[i], cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
}
//if (scanParam.en_fold != 0) { //对折前旋转屏蔽 20211214 奥鸽要求
// cv::flip(mats[0], mats[0], 1);
// cv::flip(mats[0], mats[0], 0);
//}
}
else
{
auto mat = imread(info.path, rmc);
//cv::imwrite("D:\\img"+to_string(indeximg++)+".jpg", mat);
//auto mat = imread(info.path, IMREAD_COLOR);
//if (rmc == IMREAD_GRAYSCALE)
// cvtColor(mat, mat, CV_RGB2GRAY);
if (!mat.empty())
{
Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows-10));//避免图像尾部出现无效数据丢弃10行数据
Mat back = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows-10));//避免图像尾部出现无效数据丢弃10行数据
if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
cv::flip(front, front, 0);
cv::flip(front, front, 1);
}
#ifdef UV
mats.push_back(scanParam.is_switchfrontback ? front : back);
mats.push_back(scanParam.is_switchfrontback ? back : front);
#else
mats.push_back(scanParam.is_switchfrontback ? front : back);
mats.push_back(scanParam.is_switchfrontback ? back : front);
#endif
front.release();
back.release();
remove(info.path.c_str());
}
else
{
msg = "g400 get empty mat! empty ";
FileTools::writelog(log_ERROR, msg);
}
#ifdef UV
if (scanParam.hardwarecaps.en_uv)//EN UV
{
auto uvinfo = m_imgCacheinfo.Take();
auto matuv = imread(uvinfo.path, IMREAD_COLOR);
if (!matuv.empty())
{
Mat front = matuv(Rect(0, 0, mat.cols / 2, mat.rows));
Mat back = matuv(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows));
if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
cv::flip(front, front, 0);
cv::flip(front, front, 1);
}
uvmats.push_back(scanParam.is_switchfrontback ? front : back);
uvmats.push_back(scanParam.is_switchfrontback ? back : front);
front.release();
back.release();
remove(uvinfo.path.c_str());
}
}
#endif
}//g400 serials
FileTools::writelog(log_DEBUG, " start image process ");
std::vector<cv::RotatedRect> rects;
std::vector<int> angleResults;
bool isDesaskew = false;
sw.reset();
for (int j = 0; j < m_iaList.size(); j++) {
m_iaList[j]->apply(mats, scanParam.is_duplex);
CImageApply* ptr = m_iaList[j].get();
if (typeid(*ptr) == typeid(CImageApplyAutoCrop))
{
rects = dynamic_cast<CImageApplyAutoCrop*>(ptr)->rotatedROIs();
isDesaskew = dynamic_cast<CImageApplyAutoCrop*>(ptr)->isDesaskew();
}
else if (typeid(*ptr) == typeid(CImageApplyRotation))
angleResults = dynamic_cast<CImageApplyRotation*>(ptr)->angleResults();
}
#ifdef UV
if (!uvmats.empty())
{
//拼接原图和UV图
for (int j = 0; j < mats.size(); j++)
{
if (!scanParam.is_duplex && j == 1) {
mats[j].release();
break;
}
if (!mats[j].empty())
{
cv::Mat mergeOrgin_UV = ImageApplyUV::Apply(mats[j], uvmats[j], rects[j], isDesaskew, angleResults.size() > 0 ? angleResults[j] : 0, scanParam.pixtype);
if (!mergeOrgin_UV.empty())
mats[j] = mergeOrgin_UV;
}
}
rects.clear();
uvmats.clear();
}
#endif
FileTools::writelog(log_DEBUG, " image process finish");
if (!scanParam.is_duplex && mats.size()>1) {
mats.pop_back();
}
if (scanParam.is_split)
{
splitimg(mats);
}
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
IMat2Bmp idata;
#ifdef UV
if (scanParam.pixtype == 1 && mats[i].channels() == 3)//gray
cv::cvtColor(mats[i], mats[i], COLOR_BGR2GRAY);
#else
if (scanParam.pixtype == 1 && scanParam.hsvcorrect)
if (mats[i].channels() == 3)
cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY);
#endif
if (scanParam.en_multi_output) {
MultiOut(mats[i]);
}
else
{
idata = (scanParam.pixtype == 0 || (((scanParam.automaticcolortype == 0) && (scanParam.automaticcolor == true)) && (mats[i].channels() == 1))) ?
(IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst);
if (!scanParam.multi_output_red)
mats[i].release();
//cv::imwrite("D:\\img\\" + to_string(indeximg++) + ".jpg", mats[i]);
auto data = idata.getBmpDataBuffer();
EnqueueBmpBuffer(data);
data.reset();
}
}
else
{
FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++));
}
}
if (scanParam.multi_output_red) {
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
ImageMultiOutput m_mlt;
Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2);
mats[i].release();
if (!ret.empty()) {
if (!scanParam.is_duplex && i == 1) {
ret.release();
break;
}
Mat2Bmp mb(ret, scanParam.resolution_dst);
auto data = mb.getBmpDataBuffer();
ret.release();
EnqueueBmpBuffer(data);
data.reset();
}
}
}
}
mats.clear();
#ifdef UV
PaniusCount(scanParam.hardwarecaps.en_uv ? 2 : 1);
#else
PaniusCount();
#endif
//if(scanParam.resolution_dst < 500)
duplex_process(info);
//else {
// ImreadModes rmc;
// if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect)
// rmc = IMREAD_COLOR;
// else
// rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE;
// StopWatch sw;
// cv::Mat imgfront;
// cv::Mat imgback;
// if (info.scannerType == G200Serial)
// {
// auto back = m_imgCacheinfo.Take();
// if (!isFileExist(back.path))
// {
// msg = "error while reading g200 back image " + back.path + " ,file not exist";
// FileTools::writelog(log_ERROR, msg);
// }
// imgfront = imread(info.path, rmc);
// msg = "reading image front time elapsed_ms:" + std::to_string(sw.elapsed_ms());
// FileTools::writelog(log_DEBUG, msg);
// sw.reset();
// imgback = imread(back.path, rmc);
// msg = "reading image back time elapsed_ms:" + std::to_string(sw.elapsed_ms());
// FileTools::writelog(log_DEBUG, msg);
// sw.reset();
// if (!imgfront.empty() && !imgback.empty())
// {
// if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
// cv::flip(imgback, imgback, 0);
// cv::flip(imgback, imgback, 1);
// }
// cv::resize(imgback, imgback, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
// cv::resize(imgfront, imgfront, cv::Size(), fx, fy);
// remove(info.path.c_str());
// remove(back.path.c_str());
// }
// else
// {
// msg = "get empty mat! empty ";
// msg += (imgfront.empty() ? " front image" : " back image");
// FileTools::writelog(log_ERROR, msg);
// }
// }
// else
// {
// auto mat = imread(info.path, rmc);
// if (!mat.empty())
// {
// imgfront = mat(Rect(0, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据
// imgback = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据
// if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
// cv::flip(imgfront, imgfront, 0);
// cv::flip(imgfront, imgfront, 1);
// }
// mat.release();
// remove(info.path.c_str());
// }
// else
// {
// msg = "g400 get empty mat! empty ";
// FileTools::writelog(log_ERROR, msg);
// }
// }
// if (!imgfront.empty() && !imgback.empty()) {
// if (scanParam.is_duplex)
// {
// single_process(scanParam.is_switchfrontback ? imgback : imgfront);
// imgfront.release();
// std::this_thread::sleep_for(std::chrono::milliseconds(4399));
// //::SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
// //::EmptyWorkingSet(GetCurrentProcess());
// single_process(scanParam.is_switchfrontback ? imgfront : imgback);
// std::this_thread::sleep_for(std::chrono::milliseconds(4399));
// imgback.release();
// }
// else
// {
// imgback.release();
// single_process(imgfront);
// std::this_thread::sleep_for(std::chrono::milliseconds(4399));
// imgfront.release();
// }
// }
// PaniusCount();
//}
}
}
@ -768,6 +643,286 @@ void ImageMatQueue::splitimg(std::vector<cv::Mat>& mats) {
mats.swap(tmp);
}
void ImageMatQueue::duplex_process(CacheInfo info)
{
std::string msg;
ImreadModes rmc;
if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect)
rmc = IMREAD_COLOR;
else
rmc = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE;
std::vector<cv::Mat> mats;
std::vector<Mat> uvmats;
StopWatch sw;
if (info.scannerType == ScannerSerial::G200Serial)
{
auto back = m_imgCacheinfo.Take();
if (!isFileExist(back.path))
{
msg = "error while reading g200 back image " + back.path + " ,file not exist";
FileTools::writelog(log_ERROR, msg);
}
sw.reset();
cv::Mat imgfront = imread(info.path, rmc);
msg = "reading image front time elapsed_ms:" + std::to_string(sw.elapsed_ms());
FileTools::writelog(log_DEBUG, msg);
sw.reset();
cv::Mat imgback = imread(back.path, rmc);
msg = "reading image back time elapsed_ms:" + std::to_string(sw.elapsed_ms());
FileTools::writelog(log_DEBUG, msg);
sw.reset();
if (!imgfront.empty() && !imgback.empty())
{
if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
cv::flip(imgback, imgback, 0);
cv::flip(imgback, imgback, 1);
}
mats.push_back(scanParam.is_switchfrontback ? imgback : imgfront);
mats.push_back(scanParam.is_switchfrontback ? imgfront : imgback);
remove(info.path.c_str());
remove(back.path.c_str());
}
else
{
msg = "get empty mat! empty ";
msg += (imgfront.empty() ? " front image" : " back image");
FileTools::writelog(log_ERROR, msg);
}
for (size_t i = 0; i < mats.size(); i++)
{
if (!mats[i].empty())
cv::resize(mats[i], mats[i], cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
}
//if (scanParam.en_fold != 0) { //对折前旋转屏蔽 20211214 奥鸽要求
// cv::flip(mats[0], mats[0], 1);
// cv::flip(mats[0], mats[0], 0);
//}
}
else
{
auto mat = imread(info.path, rmc);
if (!mat.empty())
{
Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据
Mat back = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows - 10));//避免图像尾部出现无效数据丢弃10行数据
if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
cv::flip(front, front, 0);
cv::flip(front, front, 1);
}
#ifdef UV
mats.push_back(scanParam.is_switchfrontback ? front : back);
mats.push_back(scanParam.is_switchfrontback ? back : front);
#else
mats.push_back(scanParam.is_switchfrontback ? front : back);
mats.push_back(scanParam.is_switchfrontback ? back : front);
#endif
front.release();
back.release();
remove(info.path.c_str());
}
else
{
msg = "g400 get empty mat! empty ";
FileTools::writelog(log_ERROR, msg);
}
#ifdef UV
if (scanParam.hardwarecaps.en_uv)//EN UV
{
auto uvinfo = m_imgCacheinfo.Take();
auto matuv = imread(uvinfo.path, IMREAD_COLOR);
if (!matuv.empty())
{
Mat front = matuv(Rect(0, 0, mat.cols / 2, mat.rows));
Mat back = matuv(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows));
if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) {
cv::flip(front, front, 0);
cv::flip(front, front, 1);
}
uvmats.push_back(scanParam.is_switchfrontback ? front : back);
uvmats.push_back(scanParam.is_switchfrontback ? back : front);
front.release();
back.release();
remove(uvinfo.path.c_str());
}
}
#endif
}//g400 serials
FileTools::writelog(log_DEBUG, " start image process ");
std::vector<cv::RotatedRect> rects;
std::vector<int> angleResults;
bool isDesaskew = false;
sw.reset();
for (int j = 0; j < m_iaList.size(); j++) {
m_iaList[j]->apply(mats, scanParam.is_duplex);
CImageApply* ptr = m_iaList[j].get();
if (typeid(*ptr) == typeid(CImageApplyAutoCrop))
{
rects = dynamic_cast<CImageApplyAutoCrop*>(ptr)->rotatedROIs();
isDesaskew = dynamic_cast<CImageApplyAutoCrop*>(ptr)->isDesaskew();
}
else if (typeid(*ptr) == typeid(CImageApplyRotation))
angleResults = dynamic_cast<CImageApplyRotation*>(ptr)->angleResults();
}
#ifdef UV
if (!uvmats.empty())
{
//拼接原图和UV图
for (int j = 0; j < mats.size(); j++)
{
if (!scanParam.is_duplex && j == 1) {
mats[j].release();
break;
}
if (!mats[j].empty())
{
cv::Mat mergeOrgin_UV = ImageApplyUV::Apply(mats[j], uvmats[j], rects[j], isDesaskew, angleResults.size() > 0 ? angleResults[j] : 0, scanParam.pixtype);
if (!mergeOrgin_UV.empty())
mats[j] = mergeOrgin_UV;
}
}
rects.clear();
uvmats.clear();
}
#endif
FileTools::writelog(log_DEBUG, " image process finish");
if (!scanParam.is_duplex && mats.size() > 1) {
mats.pop_back();
}
if (scanParam.is_split)
{
splitimg(mats);
}
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
IMat2Bmp idata;
#ifdef UV
if (scanParam.pixtype == 1 && mats[i].channels() == 3)//gray
cv::cvtColor(mats[i], mats[i], COLOR_BGR2GRAY);
#else
if (scanParam.pixtype == 1 && scanParam.hsvcorrect)
if (mats[i].channels() == 3)
cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY);
#endif
if (scanParam.en_multi_output) {
MultiOut(mats[i]);
}
else
{
idata = (scanParam.pixtype == 0 || (((scanParam.automaticcolortype == 0) && (scanParam.automaticcolor == true)) && (mats[i].channels() == 1))) ?
(IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst);
if (!scanParam.multi_output_red)
mats[i].release();
//cv::imwrite("D:\\img\\" + to_string(indeximg++) + ".jpg", mats[i]);
auto data = idata.getBmpDataBuffer();
EnqueueBmpBuffer(data);
data.reset();
}
}
else
{
FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++));
}
}
if (scanParam.multi_output_red) {
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
ImageMultiOutput m_mlt;
Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2);
mats[i].release();
if (!ret.empty()) {
if (!scanParam.is_duplex && i == 1) {
ret.release();
break;
}
Mat2Bmp mb(ret, scanParam.resolution_dst);
auto data = mb.getBmpDataBuffer();
ret.release();
EnqueueBmpBuffer(data);
data.reset();
}
}
}
}
mats.clear();
#ifdef UV
PaniusCount(scanParam.hardwarecaps.en_uv ? 2 : 1);
#else
PaniusCount();
#endif
}
void ImageMatQueue::single_process(cv::Mat& mat)
{
FileTools::writelog(log_DEBUG, " start image process ");
StopWatch sw;
for (int j = 0; j < m_iaList.size(); j++) {
m_iaList[j]->apply(mat, false);
}
FileTools::writelog(log_DEBUG, " image process finish");
std::vector<cv::Mat> mats;
mats.push_back(mat);
if (scanParam.is_split)
{
splitimg(mats);
}
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
IMat2Bmp idata;
if (scanParam.pixtype == 1 && scanParam.hsvcorrect)
if (mats[i].channels() == 3)
cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY);
if (scanParam.en_multi_output) {
MultiOut(mats[i]);
}
else
{
idata = (scanParam.pixtype == 0 || (((scanParam.automaticcolortype == 0) && (scanParam.automaticcolor == true)) && (mats[i].channels() == 1))) ?
(IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst);
if (!scanParam.multi_output_red)
mats[i].release();
//cv::imwrite("D:\\img\\" + to_string(indeximg++) + ".jpg", mats[i]);
auto data = idata.getBmpDataBuffer();
EnqueueBmpBuffer(data);
data.reset();
}
}
else
{
FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++));
}
}
if (scanParam.multi_output_red) {
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
ImageMultiOutput m_mlt;
Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2);
mats[i].release();
if (!ret.empty()) {
if (!scanParam.is_duplex && i == 1) {
ret.release();
break;
}
Mat2Bmp mb(ret, scanParam.resolution_dst);
auto data = mb.getBmpDataBuffer();
ret.release();
EnqueueBmpBuffer(data);
data.reset();
}
}
}
}
mats.clear();
}
G400Decode::G400Decode(std::shared_ptr<std::vector<char>> buff)
{
m_buffs.push_back(buff);

View File

@ -227,6 +227,8 @@ private:
void PaniusCount(int count = 1);
void init_cachethread();
void splitimg(std::vector<cv::Mat>& mats);
void duplex_process(CacheInfo info);
void single_process(cv::Mat& mat);
void cache_run();
void MultiOut(cv::Mat & pDid);
//清除缓存文件

View File

@ -467,6 +467,8 @@ CString GetHidedlgPath()
_tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\hidedlg.exe"));
#elif defined LANXUM
_tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\hidedlg.exe"));
#elif defined CUMTENN
_tcscat(szIniFile, _T("\\twain_32\\CumTennScan\\hidedlg.exe"));
#elif defined MAKERIGHTWAY
_tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\hidedlg.exe"));
#elif defined NOLOGO

View File

@ -0,0 +1,43 @@
#include "ImageApplyDispersion.h"
CImageApplyDispersion::CImageApplyDispersion():
m_kernal_b(3, 1, CV_32FC1)
, m_kernal_g(3, 1, CV_32FC1)
, m_kernal_r(3, 1, CV_32FC1)
{
m_kernal_b.at<float>(0, 0) = 0.15f;
m_kernal_b.at<float>(1, 0) = 1.15f;
m_kernal_b.at<float>(2, 0) = -0.3f;
m_kernal_g.at<float>(0, 0) = 0.806f;
m_kernal_g.at<float>(1, 0) = 0.484f;
m_kernal_g.at<float>(2, 0) = -0.3f;
m_kernal_r.at<float>(0, 0) = 0.484f;
m_kernal_r.at<float>(1, 0) = 0.806f;
m_kernal_r.at<float>(2, 0) = -0.3f;
}
CImageApplyDispersion::~CImageApplyDispersion()
{
}
void CImageApplyDispersion::apply(cv::Mat& pDib, int side)
{
(void)side;
if (pDib.channels() != 3) return;
cv::Mat bgr[3];
cv::split(pDib, bgr);
cv::filter2D(bgr[0], bgr[0], bgr[0].depth(), m_kernal_b);
cv::filter2D(bgr[1], bgr[1], bgr[1].depth(), m_kernal_g);
cv::filter2D(bgr[2], bgr[2], bgr[2].depth(), m_kernal_r);
cv::merge(bgr, 3, pDib);
}
void CImageApplyDispersion::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
{
}

View File

@ -0,0 +1,35 @@
/*
* ====================================================
*
*
* 2021/09/24
* 2021/11/12 v1.1.0
* 2022/04/21 v1.2.0
* v1.2.0
* ====================================================
*/
#ifndef IMAGE_APPLY_DISPERSION_COLOR_H
#define IMAGE_APPLY_DISPERSION_COLOR_H
#include "ImageApply.h"
class CImageApplyDispersion : public CImageApply
{
public:
CImageApplyDispersion();
virtual ~CImageApplyDispersion();
virtual void apply(cv::Mat& pDib, int side);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
private:
cv::Mat m_kernal_b;
cv::Mat m_kernal_g;
cv::Mat m_kernal_r;
};
#endif

View File

@ -0,0 +1,98 @@
#include "ImageMulti.h"
#include "ImageApplyHeaders.h"
IMageMulti::IMageMulti(int multiType,int thre)
{
m_multiType = multiType;
m_thre = thre;
}
IMageMulti::~IMageMulti(void)
{
}
std::vector<cv::Mat> IMageMulti::apply(cv::Mat& pDib)
{
std::vector<cv::Mat> retMats;
if (pDib.empty())
return retMats;
retMats.push_back(pDib);
switch (m_multiType)
{
case ALL:
{
if (pDib.channels() == 3){
cv::Mat dst;
cv::cvtColor(pDib, dst,cv::COLOR_BGR2GRAY);
retMats.push_back(dst);
}
cv::Mat dstThre;
cv::cvtColor(pDib, dstThre,cv::COLOR_BGR2GRAY);
//cv::threshold(dstThre, dstThre, m_thre, 255, cv::THRESH_BINARY);
CImageApplyBWBinaray bw(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY);
bw.apply(dstThre, 0);
//cv::adaptiveThreshold(dstThre,dstThre,255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY,25,5);
if (!dstThre.empty())
{
retMats.push_back(dstThre);
}
}
break;
case COLORGRAY:
{
if (pDib.channels() == 3) {
cv::Mat dstGray;
cv::cvtColor(pDib, dstGray, cv::COLOR_BGR2GRAY);
retMats.push_back(dstGray);
}
}
break;
case COLORBW:
{
if (pDib.channels() == 3) {
cv::Mat dstGray;
cv::cvtColor(pDib, dstGray, cv::COLOR_BGR2GRAY);
CImageApplyBWBinaray bw(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY);
bw.apply(dstGray, 0);
// cv::Mat dstBW;
// cv::adaptiveThreshold(dstGray,dstBW,255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY,25,5);
retMats.push_back(dstGray);
}
}
break;
case GRAYBW://pDib should be GreyImage(channels() == 1)
{
cv::Mat dst = pDib.clone();
CImageApplyBWBinaray bw(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY);
bw.apply(dst, 0);
// cv::Mat dstBW;
// cv::adaptiveThreshold(pDib,dstBW,255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY,25,5);
if (!dst.empty())
{
retMats.push_back(dst);
}
}
break;
default:
break;
}
return retMats;
}
std::vector<cv::Mat> IMageMulti::apply(cv::Mat& pDib, int multitype)
{
m_multiType = multitype;
return apply(pDib);
}
std::vector<cv::Mat> IMageMulti::apply(std::vector<cv::Mat>& pDib, int multitype)
{
std::vector<cv::Mat> m_rets;
m_multiType = multitype;
for (auto& node : pDib)
{
auto nodes = apply(node);
m_rets.insert(m_rets.end(), nodes.begin(), nodes.end());
}
return m_rets;
}

View File

@ -0,0 +1,27 @@
#ifndef IMAGE_MULTI_H
#define IMAGE_MULTI_H
#include <vector>
#include <opencv2/opencv.hpp>
class IMageMulti
{
public:
enum MultiOutput
{
NONE=-1,
ALL,
COLORGRAY,
COLORBW,
GRAYBW
};
public:
IMageMulti(int multiType = 0,int thre = 128);
~IMageMulti();
std::vector<cv::Mat> apply(cv::Mat& pDib);
std::vector<cv::Mat> apply(cv::Mat& pDib, int multitype);
std::vector<cv::Mat> apply(std::vector<cv::Mat>& pDib, int multitype);
private:
int m_multiType;
int m_thre;
};
#endif // !IMAGE_MULTI_H

BIN
huagao/cumtenn.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@ -108,6 +108,8 @@ static constexpr const Identity srcIdent(
"AUGE",
#elif defined LANXUM
"LANXUM",
#elif defined CUMTENN
"CUMTENN",
#elif defined MAKERIGHTWAY
"RIGHTWAY",
#elif defined NOLOGO
@ -130,6 +132,8 @@ static constexpr const Identity srcIdent(
"G73S Series",
#elif defined HANVON
"HW-9000",
#elif defined CUMTENN
"CTS A3",
#else // ISG100
"G200 Series",
#endif
@ -137,6 +141,8 @@ static constexpr const Identity srcIdent(
#elif defined(G300) // G200
#ifdef LANXUM
"G42S Series",
#elif defined CUMTENN
"CTS A4",
#elif defined HANVON
#ifdef ANDROIDSERIAL
"HW-1000",
@ -182,6 +188,8 @@ static constexpr const Identity srcIdent(
"HUAGOSCAN G200 TWAIN"
#elif defined NOLOGO
"Scan G200 TWAIN"
#elif defined CUMTENN
"CUMTENN CTS A3 TWAIN"
#elif defined HANVON
"Hanvon HW-9000 TAWIN"
#elif defined LANXUM //!LANXUM
@ -207,6 +215,8 @@ static constexpr const Identity srcIdent(
#endif // ANDROIDSERIES
#elif defined NOLOGO
"Scan G300 TWAIN"
#elif defined CUMTENN
"CUMTENN CTS A4 TWAIN"
#elif defined LANXUM //!LANXUM
"LANXUMSCAN G42S TWAIN"
#else // !MAKEHUAGAO
@ -325,7 +335,7 @@ static std::vector<Vid_pid> DeviceID{
{0x31c9,0x8420},
#elif defined G400
{0x31c9,0x8520},
{0x31c9,0x8529},
#endif // ISG100
};
@ -344,11 +354,35 @@ static std::vector<Vid_pid> DeviceID{
#endif // ISG100
#elif defined G400
{0x2903,0x7000},
#ifdef ANDROIDSERIAL
{0x2903,0x7002},
#else
{0x2903,0x7039},
#endif // ANDROIDSERIAL
#elif defined G300
{0x2903,0x1000},
#ifdef ANDROIDSERIAL
{0x2903,0x1002},
#endif // ANDROIDSERIAL
#endif // G200
};
#elif defined CUMTENN
static std::vector<Vid_pid> DeviceID{
#ifdef G200
#ifdef ISG100
{0x3072,0x138},
#else
{0x3072,0x238},
#endif // ISG100
#elif defined G300
{0x3072,0x0303},
#elif defined G400
{0x3072,0x0403},
#endif
};
#else
static std::vector<Vid_pid> DeviceID{
{0x64B,0x7823},
@ -396,6 +430,11 @@ static std::unique_ptr<IScanner> scanner(new GScanVirtual());
long __stdcall callback(EXCEPTION_POINTERS* ex)
{
if (scanner.get())
{
if (scanner->IsConnected())
scanner->Stop_scan();
}
HANDLE handle = CreateFile((FileTools::get_errorlog_path_w()+L"error.dmp").c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(!handle)
return EXCEPTION_EXECUTE_HANDLER;
@ -937,12 +976,14 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
pid = usb.pid;
if (!scanner.get()) {
#ifdef G200
if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629 || pid == 0x130 ||pid == 0x8000 || pid == 0x9000)
if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629 || pid == 0x130 ||pid == 0x8000 || pid == 0x9000 ||
pid == 0x138 || pid == 0x238)
scanner.reset(new GScanO1003399());
else
scanner.reset(new GScanO200());
#else
if (pid == 0x339 || pid == 0x439)
if (pid == 0x339 || pid == 0x439 || pid == 0x7039 || pid == 0x8529)
scanner.reset(new GScanO1003399());
else
#ifdef ANDROIDSERIAL
@ -976,7 +1017,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
CloseHandle(hMutex);
hMutex = NULL;
}
showmsg("提示", msgs[(UsbSupported)81]);
return seqError();
}
if (!scanner->IsConnected()) {
@ -2302,8 +2342,10 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
int index = scanner->geterrorindex();
if (ret == 82 && ((typeid(*scanner.get()) == typeid(GScanO1003399))))
showmsg("提示", "在第" + to_string(index) + "页检测到折角,停止扫描!", ret);
else if(ret==75 && ((typeid(*scanner.get()) == typeid(GScanO1003399))))
else if (ret == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399))))
showmsg("提示", "在第" + to_string(index) + "页检测到尺寸不符,停止扫描!", ret);
else if (ret == 81 && ((typeid(*scanner.get()) == typeid(GScanO1003399))))
showmsg("提示", "设备处于休眠模式!请手动唤醒设备。", ret);
else
showmsg("提示", msgs[(UsbSupported)ret], ret);
FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]);
@ -2385,13 +2427,7 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
if (!ui.showUi()) {
// this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state
// with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step
//#ifndef G200
// while (!scanner->Get_Scanner_PaperOn())
// {
// if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO)
// return seqError();
// }
//#endif // !G200
if (!scanner->IsConnected())
scanner->open(vid, pid);
@ -2400,6 +2436,15 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
MessageBox(NULL, L"USB连接异常,请连接USB后重新打开扫描软件", L"提示", MB_OK | MB_SYSTEMMODAL);
return seqError();
}
#ifndef G200
if (typeid(*scanner.get()) != typeid(GScanO1003399)) {
while (!scanner->Get_Scanner_PaperOn())
{
if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO)
return seqError();
}
}
#endif // !G200
this_thread::sleep_for(chrono::milliseconds(100)); //扫描前增加延迟 防止usb缓存中的消息未读取清空 误报扫描错误
auto ret = startScan();
//if (ret.status().condition() == Twpp::CC::NoMedia)
@ -2573,7 +2618,7 @@ Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) {
// it does not get easier than that if we already have BMP
data = ImageNativeXfer(bmpSize());
std::copy(bmpBegin(), bmpEnd(), data.data<char>().data());
bmpData.reset(new std::vector<unsigned char>);
//bmpData.reset(new std::vector<unsigned char>);
//FileTools::write_log("正在上传图片 ===> Twain transfered num of " + to_string(++xtfer) + " images");
FileTools::writelog(log_INFO, "正在上传图片 ===> Twain transfered num of " + to_string(++xtfer) + " images");
return { ReturnCode::XferDone, ConditionCode::Success };
@ -2712,20 +2757,18 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly)
if (!scanner->IsConnected())
return checkDeviceOnline();
}
//#ifndef G200
// while (!scanner->Get_Scanner_PaperOn())
// {
// if (scanner->get_ErrorCode() == SLEEPING) {
// showmsg("提示", msgs[(UsbSupported)81]);
// scanner->Set_ErrorCode(0);
// return seqError();
// }
// if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO) {
// m_pendingXfers = 0;
// return seqError();
// }
// }
//#endif // !G200
#ifndef G200
if (typeid(*scanner.get()) != typeid(GScanO1003399)) {
while (!scanner->Get_Scanner_PaperOn())
{
if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO) {
m_pendingXfers = 0;
return seqError();
}
}
}
#endif // !G200
m_pendingXfers = 1;
m_scanparam.reset(new GScanCap(caps));
saveGscanCapSetting();
@ -2871,12 +2914,14 @@ Twpp::Result HuagaoDs::startScan()
scanner->ResetScanner();
scanner->reset();
FileTools::writelog(log_INFO, "start scan");
#ifdef G200
scanner->clear_hwerror();
#else
#ifndef ANDROIDSERIAL
if (scanner->notifyscan() < 1)
return seqError();
#endif // !ANDROIDSERIAL
scanner->clear_hwerror();
#endif //
#ifdef G200
@ -2988,6 +3033,8 @@ Twpp::Result HuagaoDs::startScan()
showmsg("提示", "在第" + to_string(index) + "页检测到折角,停止扫描!", retCode);
else if (retCode == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399))))
showmsg("提示", "在第" + to_string(index) + "页检测到尺寸不符,停止扫描!", retCode);
else if (retCode == 81 && ((typeid(*scanner.get()) == typeid(GScanO1003399))))
showmsg("提示", "设备处于休眠模式!请手动唤醒设备。", retCode);
else
showmsg("提示", msgs[(UsbSupported)retCode], retCode);
FileTools::writelog(log_ERROR, msgs[(UsbSupported)retCode]);

Binary file not shown.

Binary file not shown.

BIN
huagao/rtw_logo.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.