sane调整双张扫描流程,保留后自动扫描

This commit is contained in:
yangjiaxuan 2023-10-27 18:10:53 +08:00
parent 0a802db95e
commit dd1cd32e98
6 changed files with 32 additions and 41 deletions

View File

@ -216,8 +216,6 @@ DeviceUser::DeviceUser(QWidget *wnd, HGSaneSource source, const QString &passwor
m_source = source;
m_saneDev = nullptr;
m_password = password;
m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
m_abnormalImageResult = HGBASE_ERR_OK;
}
DeviceUser::~DeviceUser()
@ -368,40 +366,30 @@ void HGAPI DeviceUser::DeviceEventFunc(HGSaneDevice dev, HGUInt event, HGPointer
if (HGSANE_EVENT_TYPE_SCANFINISHED == event)
{
emit p->scanFinishEvent();
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
p->m_abnormalImageResult = HGBASE_ERR_OK;
}
else if (HGSANE_EVENT_TYPE_WORKING == event)
{
emit p->scanWorkingEvent();
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
p->m_abnormalImageResult = HGBASE_ERR_OK;
}
}
HGUInt HGAPI DeviceUser::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGUInt type, HGPointer param)
{
DeviceUser* p = (DeviceUser*)param;
if (HGSANE_IMAGE_TYPE_DOUBLE == type && HGSANE_IMAGE_STATUS_NO_STATUS == p->m_abnormlImageStatus)
if (type != HGSANE_IMAGE_TYPE_DOUBLE)
{
emit p->abnormalImage(image, &p->m_abnormalImageResult);
emit p->newImage(image);
return HGBASE_ERR_OK;
}
if (HGBASE_ERR_OK == p->m_abnormalImageResult || HGSANE_IMAGE_STATUS_RESERVE == p->m_abnormlImageStatus)
HGUInt imgRet = HGBASE_ERR_OK;
emit p->abnormalImage(image, &imgRet);
if (HGSANE_ERR_IMAGE_RESERVE == imgRet)
{
if (HGSANE_IMAGE_TYPE_DOUBLE == type)
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_RESERVE;
emit p->newImage(image);
}
else
{
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_DISCARD;
return HGBASE_ERR_FAIL;
}
return HGBASE_ERR_OK;
return imgRet;
}
#endif

View File

@ -133,9 +133,6 @@ private:
HGSaneSource m_source;
HGSaneDevice m_saneDev;
QString m_password;
HGUInt m_abnormlImageStatus;
HGUInt m_abnormalImageResult;
};
#endif

View File

@ -29,12 +29,12 @@ HGUInt Dialog_AbnormalImage::getResult()
void Dialog_AbnormalImage::on_pushButton_reserve_clicked()
{
m_result = HGBASE_ERR_OK;
m_result = HGSANE_ERR_IMAGE_RESERVE;
close();
}
void Dialog_AbnormalImage::on_pushButton_discard_clicked()
{
m_result = HGBASE_ERR_FAIL;
m_result = HGSANE_ERR_IMAGE_DISCARD;
close();
}

View File

@ -42,10 +42,6 @@ typedef struct
#define HGSANE_IMAGE_TYPE_NORMAL 0L
#define HGSANE_IMAGE_TYPE_DOUBLE 1L
#define HGSANE_IMAGE_STATUS_NO_STATUS 0L
#define HGSANE_IMAGE_STATUS_RESERVE 1L
#define HGSANE_IMAGE_STATUS_DISCARD 2L
/* Sane回调
*/
typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt event, HGPointer param);

View File

@ -7,7 +7,10 @@
/* 设备离线 */
#define HGSANE_ERR_DEVICEOFFLINE 0x00004002L
/* 停止扫描 */
#define HGSANE_ERR_STOPSCAN 0x00004003L
/* 保留图像 */
#define HGSANE_ERR_IMAGE_RESERVE 0x00004003L
/* 丢弃图像 */
#define HGSANE_ERR_IMAGE_DISCARD 0x00004004L
#endif /* __HGSANEERR_H__ */

View File

@ -1015,6 +1015,8 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
return;
}
// 双张图像处理的返回值
HGUInt doubleImgRet = HGBASE_ERR_OK;
while (!p->m_stopThread)
{
SANE_Parameters params;
@ -1095,7 +1097,6 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_IMAGE_OK, NULL, 0);
bool stopScan = false;
if (nullptr != p->m_imageFunc)
{
HGUInt imgType = 0;
@ -1118,9 +1119,16 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (NULL != img)
{
HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
HGUInt type = (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat1)
? HGSANE_IMAGE_TYPE_DOUBLE : HGSANE_IMAGE_TYPE_NORMAL;
HGUInt imgRet = p->m_imageFunc((HGSaneDevice)p, img, type, p->m_imageParam);
if (HGBASE_ERR_OK == doubleImgRet && SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat1)
{
// 第一个双张图片
doubleImgRet = p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_DOUBLE, p->m_imageParam);
}
else
{
// 普通图片或非双张图片
p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam);
}
HGBase_DestroyImage(img);
}
@ -1130,13 +1138,12 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
buffer = NULL;
bufferSize = 0;
// if (stopScan)
// {
// saneAPI.sane_cancel_api(p->m_devHandle);
// if (NULL != p->m_scanNotify)
// p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
// break;
// }
if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet)
{
if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
break;
}
if (!p->m_cancelScan)
{