From d39ae45a67e79d8932c134c75af45abcb5919188 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Sat, 13 Jan 2024 14:13:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=9B=BD=E4=BA=A7=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=B0=83=E7=94=A8sane=E9=A9=B1=E5=8A=A8=E7=9A=84?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=8F=8C=E5=BC=A0=E4=BF=9D=E7=95=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/sane_user/HGSaneErr.h | 19 ++++++-- modules/sane_user/HGSaneImpl.cpp | 80 ++++++++++++++++++++++++++++---- modules/sane_user/HGSaneImpl.hpp | 1 + 3 files changed, 86 insertions(+), 14 deletions(-) diff --git a/modules/sane_user/HGSaneErr.h b/modules/sane_user/HGSaneErr.h index 9ed54aa2..bb8cebeb 100644 --- a/modules/sane_user/HGSaneErr.h +++ b/modules/sane_user/HGSaneErr.h @@ -2,15 +2,24 @@ #define __HGSANEERR_H__ /* 一般错误 */ -#define HGSANE_ERR_FAIL 0x00004001L +#define HGSANE_ERR_FAIL 0x00004001L /* 设备离线 */ -#define HGSANE_ERR_DEVICEOFFLINE 0x00004002L +#define HGSANE_ERR_DEVICEOFFLINE 0x00004002L -/* 保留图像 */ -#define HGSANE_ERR_IMAGE_RESERVE 0x00004003L +/* 设置UI保留图像并校验 */ +#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__ */ diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index dd2f0988..6bc9b933 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -1009,21 +1009,39 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) p->m_scanNotify((int)SANE_EVENT_WORKING, NULL, 0); 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) - p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat), (int)stat); - return; + if ((SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && HGSANE_ERR_UI_RESERVE_CHECK != doubleImgStat)) + { + 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; + bool clickedReserveImg = false; + while (!p->m_stopThread) { SANE_Parameters params; memset(¶ms, 0, sizeof(SANE_Parameters)); SANE_Status stat1 = saneAPI.sane_get_parameters_api(p->m_devHandle, ¶ms); - if (SANE_STATUS_GOOD != stat1) + if (SANE_STATUS_GOOD != stat1 && SCANNER_ERR_DEVICE_DOUBLE_FEEDING != stat1) { if (NULL != p->m_scanNotify) 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) { 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); + + if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet) + clickedReserveImg = true; } else { - // 普通图片或非双张图片 + // 普通图片或第二个双张图片 p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam); + doubleImgRet = HGBASE_ERR_OK; } HGBase_DestroyImage(img); @@ -1153,10 +1176,16 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) if (SANE_STATUS_NO_DOCS == stat) { 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; } - 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) 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) + { doubleImgRet = HGBASE_ERR_OK; + clickedReserveImg = false; + } } } } @@ -1347,3 +1379,33 @@ HGResult HGSaneDeviceImpl::SetScanCount(HGInt scanCount) 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; +} diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index 2902c5d8..f22626fd 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -104,6 +104,7 @@ private: HGResult GetScanCount(HGInt *scanCount); HGResult SetScanMode(const HGChar *scanMode); HGResult SetScanCount(HGInt scanCount); + HGResult GetDoubleImgStatus(HGUInt *status); private: HGSaneSourceImpl* m_sourceImpl;