调整国产系统调用sane驱动的扫描流程,兼容双张保留功能

This commit is contained in:
yangjiaxuan 2024-01-13 14:13:40 +08:00
parent a981aaaa6b
commit d39ae45a67
3 changed files with 86 additions and 14 deletions

View File

@ -2,15 +2,24 @@
#define __HGSANEERR_H__ #define __HGSANEERR_H__
/* 一般错误 */ /* 一般错误 */
#define HGSANE_ERR_FAIL 0x00004001L #define HGSANE_ERR_FAIL 0x00004001L
/* 设备离线 */ /* 设备离线 */
#define HGSANE_ERR_DEVICEOFFLINE 0x00004002L #define HGSANE_ERR_DEVICEOFFLINE 0x00004002L
/* 保留图像 */ /* 设置UI保留图像并校验 */
#define HGSANE_ERR_IMAGE_RESERVE 0x00004003L #define HGSANE_ERR_UI_RESERVE_CHECK 0x00004003L
/* 设置UI保留图像并停止扫描 */
#define HGSANE_ERR_UI_RESERVE_STOP 0x00004004L
/* 设置UI丢弃图像并停止扫描 */
#define HGSANE_ERR_UI_DISCARD_STOP 0x00004005L
/* 保留图像*/
#define HGSANE_ERR_IMAGE_RESERVE 0x00004006L
/* 丢弃图像 */ /* 丢弃图像 */
#define HGSANE_ERR_IMAGE_DISCARD 0x00004004L #define HGSANE_ERR_IMAGE_DISCARD 0x00004007L
#endif /* __HGSANEERR_H__ */ #endif /* __HGSANEERR_H__ */

View File

@ -1009,21 +1009,39 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
p->m_scanNotify((int)SANE_EVENT_WORKING, NULL, 0); p->m_scanNotify((int)SANE_EVENT_WORKING, NULL, 0);
SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle); SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle);
if (SANE_STATUS_GOOD != stat && SCANNER_ERR_DEVICE_DOUBLE_FEEDING != stat)
// 获取设置界面选择的双张处理方式
HGUInt doubleImgStat = HGBASE_ERR_OK;
p->GetDoubleImgStatus(&doubleImgStat);
if (SANE_STATUS_GOOD != stat)
{ {
if (NULL != p->m_scanNotify) if ((SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && HGSANE_ERR_UI_RESERVE_CHECK != doubleImgStat))
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat); {
return; if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat);
if (HGSANE_ERR_UI_DISCARD_STOP == doubleImgStat)
return;
}
else if (SCANNER_ERR_DEVICE_DOUBLE_FEEDING != stat)
{
if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat);
return;
}
} }
// 双张图像处理的返回值 // 双张图像处理的返回值
HGUInt doubleImgRet = HGBASE_ERR_OK; HGUInt doubleImgRet = HGBASE_ERR_OK;
bool clickedReserveImg = false;
while (!p->m_stopThread) while (!p->m_stopThread)
{ {
SANE_Parameters params; SANE_Parameters params;
memset(&params, 0, sizeof(SANE_Parameters)); memset(&params, 0, sizeof(SANE_Parameters));
SANE_Status stat1 = saneAPI.sane_get_parameters_api(p->m_devHandle, &params); SANE_Status stat1 = saneAPI.sane_get_parameters_api(p->m_devHandle, &params);
if (SANE_STATUS_GOOD != stat1) if (SANE_STATUS_GOOD != stat1 && SCANNER_ERR_DEVICE_DOUBLE_FEEDING != stat1)
{ {
if (NULL != p->m_scanNotify) if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat1), (int)stat1); p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat1), (int)stat1);
@ -1120,15 +1138,20 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (NULL != img) if (NULL != img)
{ {
HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi); HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
if (HGBASE_ERR_OK == doubleImgRet && SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat) if (HGBASE_ERR_OK == doubleImgRet && SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat
&& HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat)
{ {
// 第一个双张图片 // 第一个双张图片
doubleImgRet = p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_DOUBLE, p->m_imageParam); doubleImgRet = p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_DOUBLE, p->m_imageParam);
if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet)
clickedReserveImg = true;
} }
else else
{ {
// 普通图片或双张图片 // 普通图片或第二个双张图片
p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam); p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam);
doubleImgRet = HGBASE_ERR_OK;
} }
HGBase_DestroyImage(img); HGBase_DestroyImage(img);
@ -1153,10 +1176,16 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (SANE_STATUS_NO_DOCS == stat) if (SANE_STATUS_NO_DOCS == stat)
{ {
if (NULL != p->m_scanNotify) if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0); {
if (clickedReserveImg)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat);
else
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
}
break; break;
} }
else if (SANE_STATUS_GOOD != stat && SCANNER_ERR_DEVICE_DOUBLE_FEEDING != stat) else if (SANE_STATUS_GOOD != stat && HGSANE_ERR_UI_RESERVE_CHECK != doubleImgStat)
{ {
if (NULL != p->m_scanNotify) if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat); p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat);
@ -1164,7 +1193,10 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
} }
if (SANE_STATUS_GOOD == stat) if (SANE_STATUS_GOOD == stat)
{
doubleImgRet = HGBASE_ERR_OK; doubleImgRet = HGBASE_ERR_OK;
clickedReserveImg = false;
}
} }
} }
} }
@ -1347,3 +1379,33 @@ HGResult HGSaneDeviceImpl::SetScanCount(HGInt scanCount)
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
HGResult HGSaneDeviceImpl::GetDoubleImgStatus(HGUInt *status)
{
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_DOUBLE_FEED_HANDLE) == 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)
{
if (0 == strcmp(value, OPTION_VALUE_SZTPCL_SCTXBJY))
*status = HGSANE_ERR_UI_RESERVE_CHECK;
else if (0 == strcmp(value, OPTION_VALUE_SZTPCL_SCTXBTZSM))
*status = HGSANE_ERR_UI_RESERVE_STOP;
else
*status = HGSANE_ERR_UI_DISCARD_STOP;
free(value);
return HGBASE_ERR_OK;
}
}
}
return HGBASE_ERR_FAIL;
}

View File

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