解决国产系统开启单张和扫描指定张数时,图像数量和走纸次数不匹配的问题;BUG-905

This commit is contained in:
yangjiaxuan 2024-02-23 13:56:45 +08:00
parent 3f4aaa7c78
commit 8371fae5e1
2 changed files with 39 additions and 1 deletions

View File

@ -1040,6 +1040,13 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
int scanCount = -1; int scanCount = -1;
p->GetScanCount(&scanCount); p->GetScanCount(&scanCount);
//获取扫描页面类型,双张或单张
HGChar scanPage[256] = { 0 };
p->GetScanPage(scanPage, 256);
bool isDuplex = true;
if (0 == strcmp(OPTION_VALUE_SMYM_DM, scanPage))
isDuplex = false;
while (!p->m_stopThread) while (!p->m_stopThread)
{ {
SANE_Parameters params; SANE_Parameters params;
@ -1179,7 +1186,8 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (clickedReserveImg) if (clickedReserveImg)
imageCount = 0; imageCount = 0;
if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet || (imageCount == scanCount * 2 && !clickedReserveImg)) //图像数量和扫描张数对应时正常结束扫描,双张保留则继续扫描 if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet ||
((isDuplex ? imageCount == scanCount * 2 : imageCount == scanCount) && !clickedReserveImg)) //图像数量和扫描张数对应时正常结束扫描,双张保留则继续扫描
{ {
saneAPI.sane_cancel_api(p->m_devHandle); saneAPI.sane_cancel_api(p->m_devHandle);
if (NULL != p->m_scanNotify) if (NULL != p->m_scanNotify)
@ -1431,3 +1439,32 @@ HGResult HGSaneDeviceImpl::GetDoubleImgStatus(HGUInt *status)
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
HGResult HGSaneDeviceImpl::GetScanPage(HGChar *scanPage, HGUInt maxLen)
{
if (NULL == scanPage || 0 == maxLen)
{
return HGBASE_ERR_INVALIDARG;
}
SANE_Int dev_options = 0;
SANE_Int method = 0;
m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, 0, SANE_ACTION_GET_VALUE, &dev_options, nullptr);
for (int i = 1; i < dev_options; ++i)
{
const SANE_Option_Descriptor* opt = m_sourceImpl->m_saneApi.sane_get_option_descriptor_api(m_devHandle, i);
if (strcmp(opt->name, SANE_STD_OPT_NAME_PAGE) == 0)
{
char *value = (char*)malloc(opt->size * 2 + 4);
SANE_Status ret = m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, value, &method);
if (ret == SANE_STATUS_GOOD)
{
strcpy(scanPage, value);
free(value);
return HGBASE_ERR_OK;
}
}
}
return HGBASE_ERR_FAIL;
}

View File

@ -105,6 +105,7 @@ private:
HGResult SetScanMode(const HGChar *scanMode); HGResult SetScanMode(const HGChar *scanMode);
HGResult SetScanCount(HGInt scanCount); HGResult SetScanCount(HGInt scanCount);
HGResult GetDoubleImgStatus(HGUInt *status); HGResult GetDoubleImgStatus(HGUInt *status);
HGResult GetScanPage(HGChar *scanPage, HGUInt maxLen);
private: private:
HGSaneSourceImpl* m_sourceImpl; HGSaneSourceImpl* m_sourceImpl;