HGSaneUser增加扫描事件

This commit is contained in:
luoliangyi 2023-05-23 14:37:34 +08:00
parent 3ce2281139
commit 8350e95a20
10 changed files with 104 additions and 60 deletions

View File

@ -27,5 +27,5 @@ HGSane_GetDeviceLogPath
HGSane_ClearDeviceLog HGSane_ClearDeviceLog
HGSane_StartDevice HGSane_StartDevice
HGSane_StopDevice HGSane_StopDevice
HGSane_StartDeviceWithUI HGSane_StartDevice
HGSane_StartDeviceWithSingleScan HGSane_StartDeviceWithSingleScan

View File

@ -53,8 +53,8 @@ win32 {
} }
# DEF_FILE = HGSaneUser.def # DEF_FILE = HGSaneUser.def
LIBS += -lgdi32 -lgdiplus -ldbghelp # LIBS += -lgdi32 -lgdiplus -ldbghelp
LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base -l$${OEM_PREFIX}SaneUI # LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base -l$${OEM_PREFIX}SaneUI
} }
unix { unix {

View File

@ -301,7 +301,8 @@ HGResult HGAPI HGSane_ClearDeviceLog(HGSaneDevice dev)
return saneDeviceImpl->ClearDeviceLog(); return saneDeviceImpl->ClearDeviceLog();
} }
HGResult HGAPI HGSane_StartDeviceWithUI(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam) HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{ {
if (NULL == dev) if (NULL == dev)
{ {
@ -309,10 +310,11 @@ HGResult HGAPI HGSane_StartDeviceWithUI(HGSaneDevice dev, HGWindow parent, HGSan
} }
HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev; HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev;
return saneDeviceImpl->StartWithUI(parent, imageFunc, imageParam); return saneDeviceImpl->Start(parent, eventFunc, eventParam, imageFunc, imageParam);
} }
HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam) HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{ {
if (NULL == dev) if (NULL == dev)
{ {
@ -320,5 +322,5 @@ HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow paren
} }
HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev; HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev;
return saneDeviceImpl->StartWithSingleScan(parent, imageFunc, imageParam); return saneDeviceImpl->StartWithSingleScan(parent, eventFunc, eventParam, imageFunc, imageParam);
} }

View File

@ -90,8 +90,10 @@ HGEXPORT HGResult HGAPI HGSane_GetDeviceLog(HGSaneDevice dev, const HGChar *file
HGEXPORT HGResult HGAPI HGSane_ClearDeviceLog(HGSaneDevice dev); HGEXPORT HGResult HGAPI HGSane_ClearDeviceLog(HGSaneDevice dev);
HGEXPORT HGResult HGAPI HGSane_StartDeviceWithUI(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam); HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
HGEXPORT HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam); HGEXPORT HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
#endif /* __HGSANE_H__ */ #endif /* __HGSANE_H__ */

View File

@ -724,7 +724,8 @@ HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent)
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam) HGResult HGSaneDeviceImpl::Start(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{ {
HGResult ret = GetValueInt32(0x8818, &m_dpi); HGResult ret = GetValueInt32(0x8818, &m_dpi);
if (HGBASE_ERR_OK != ret) if (HGBASE_ERR_OK != ret)
@ -732,10 +733,13 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
return ret; return ret;
} }
m_eventFunc = eventFunc;
m_eventParam = eventParam;
m_imageFunc = imageFunc; m_imageFunc = imageFunc;
m_imageParam = imageParam; m_imageParam = imageParam;
if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent, ShowScanImageCallback, this)) if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent,
show_scan_ui_event_func, this, show_scan_ui_image_func, this))
{ {
m_dpi = 0; m_dpi = 0;
return HGBASE_ERR_NOTSUPPORT; return HGBASE_ERR_NOTSUPPORT;
@ -744,7 +748,8 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam) HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{ {
HGChar scanMode[256] = {0}; HGChar scanMode[256] = {0};
HGResult ret = GetValueStr256(0x882E, scanMode, 256); HGResult ret = GetValueStr256(0x882E, scanMode, 256);
@ -771,10 +776,13 @@ HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGSane_DeviceIma
SetValueStr256(0x882E, newScanMode); SetValueStr256(0x882E, newScanMode);
SetValueInt32(0x882F, 1); SetValueInt32(0x882F, 1);
m_eventFunc = eventFunc;
m_eventParam = eventParam;
m_imageFunc = imageFunc; m_imageFunc = imageFunc;
m_imageParam = imageParam; m_imageParam = imageParam;
if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent, ShowScanImageCallback, this)) if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent,
show_scan_ui_event_func, this, show_scan_ui_image_func, this))
{ {
SetValueStr256(0x882E, scanMode); SetValueStr256(0x882E, scanMode);
SetValueInt32(0x882F, scanCount); SetValueInt32(0x882F, scanCount);
@ -842,34 +850,21 @@ HGResult HGSaneDeviceImpl::GetValueStr256(HGUInt optionId, HGChar *value, HGUInt
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
void HGSaneDeviceImpl::ShowScanImageCallback(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam) void HGSaneDeviceImpl::show_scan_ui_event_func(HGUInt event, HGPointer param)
{ {
HGSaneDeviceImpl* p = (HGSaneDeviceImpl*)callbackParam; HGSaneDeviceImpl* p = (HGSaneDeviceImpl*)param;
if (NULL != p->m_eventFunc)
if (NULL != p->m_imageFunc) {
{ p->m_eventFunc((HGSaneDevice)p, event, p->m_eventParam);
HGUInt imgType = 0; }
if (imageFormat->format == SANE_FRAME_GRAY) }
{
if (1 == imageFormat->depth) void HGSaneDeviceImpl::show_scan_ui_image_func(HGImage image, HGPointer param)
imgType = HGBASE_IMGTYPE_BINARY; {
else if (8 == imageFormat->depth) HGSaneDeviceImpl* p = (HGSaneDeviceImpl*)param;
imgType = HGBASE_IMGTYPE_GRAY; if (NULL != p->m_imageFunc)
} {
else if (imageFormat->format == SANE_FRAME_RGB) HGBase_SetImageDpi(image, p->m_dpi, p->m_dpi);
{ p->m_imageFunc((HGSaneDevice)p, image, p->m_imageParam);
imgType = HGBASE_IMGTYPE_RGB; }
}
HGImageInfo imgInfo = { (HGUInt)imageFormat->pixels_per_line, (HGUInt)imageFormat->lines,
imgType, (HGUInt)imageFormat->bytes_per_line, HGBASE_IMGORIGIN_TOP };
HGImage img = NULL;
HGBase_CreateImageWithData((HGByte*)imageData, &imgInfo, &img);
if (NULL != img)
{
HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
p->m_imageFunc((HGSaneDevice)p, img, p->m_imageParam);
HGBase_DestroyImage(img);
}
}
} }

View File

@ -82,15 +82,18 @@ public:
HGResult ClearDriverLog(); HGResult ClearDriverLog();
HGResult GetDeviceLog(const HGChar *fileName); HGResult GetDeviceLog(const HGChar *fileName);
HGResult ClearDeviceLog(); HGResult ClearDeviceLog();
HGResult StartWithUI(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam); HGResult Start(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGResult StartWithSingleScan(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam); HGDSImageFunc imageFunc, HGPointer imageParam);
HGResult StartWithSingleScan(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
private: private:
HGResult SetValueInt32(HGUInt optionId, HGInt value); HGResult SetValueInt32(HGUInt optionId, HGInt value);
HGResult GetValueInt32(HGUInt optionId, HGInt *value); HGResult GetValueInt32(HGUInt optionId, HGInt *value);
HGResult SetValueStr256(HGUInt optionId, const HGChar *value); HGResult SetValueStr256(HGUInt optionId, const HGChar *value);
HGResult GetValueStr256(HGUInt optionId, HGChar *value, HGUInt maxLen); HGResult GetValueStr256(HGUInt optionId, HGChar *value, HGUInt maxLen);
static void ShowScanImageCallback(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam); static void show_scan_ui_event_func(HGUInt event, HGPointer param);
static void show_scan_ui_image_func(HGImage image, HGPointer param);
private: private:
HGSaneSourceImpl* m_sourceImpl; HGSaneSourceImpl* m_sourceImpl;

View File

@ -154,7 +154,8 @@ int show_setting_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devN
} }
int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent, int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent,
show_scan_ui_image_callback callback, void *callbackParam) show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam)
{ {
if (nullptr == saneApi || nullptr == handle) if (nullptr == saneApi || nullptr == handle)
return -1; return -1;

View File

@ -3,9 +3,14 @@
#include "../base/HGDef.h" #include "../base/HGDef.h"
#include "../base/HGDll.h" #include "../base/HGDll.h"
#include "../base/HGImage.h"
#include "sane/sane_ex.h" #include "sane/sane_ex.h"
typedef void (*show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam); #define SHOW_SCAN_UI_EVENT_WORKING 1L
#define SHOW_SCAN_UI_EVENT_SCANFINISHED 2L
typedef void (*show_scan_ui_event_callback)(HGUInt event, void *eventParam);
typedef void (*show_scan_ui_image_callback)(HGImage image, void *imageParam);
HGEXPORT int show_srclist_ui(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll, HGEXPORT int show_srclist_ui(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen); SANEAPI* saneApi, char *manuName, unsigned int maxLen);
@ -13,7 +18,8 @@ HGEXPORT int show_devlist_ui(const SANEAPI* saneApi, const char **devNames, HGWi
SANE_Handle *handle, char *devName, unsigned int maxLen); SANE_Handle *handle, char *devName, unsigned int maxLen);
HGEXPORT int show_setting_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent); HGEXPORT int show_setting_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent);
HGEXPORT int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent, HGEXPORT int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent,
show_scan_ui_image_callback callback, void *callbackParam); show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam);
HGEXPORT int show_msgbox_info(const char *title, const char *text, HGWindow parent); HGEXPORT int show_msgbox_info(const char *title, const char *text, HGWindow parent);
HGEXPORT int show_msgbox_warning(const char *title, const char *text, HGWindow parent); HGEXPORT int show_msgbox_warning(const char *title, const char *text, HGWindow parent);

View File

@ -5,7 +5,8 @@
#include <QCloseEvent> #include <QCloseEvent>
Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev, const char *devName, Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev, const char *devName,
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent) : show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::Dialog_Device_Scan) ui(new Ui::Dialog_Device_Scan)
{ {
@ -13,8 +14,10 @@ Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev,
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI)); memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
m_saneDev = dev; m_saneDev = dev;
m_callback = callback; m_eventCallback = eventCallback;
m_callbackParam = callbackParam; m_eventParam = eventParam;
m_imageCallback = imageCallback;
m_imageParam = imageParam;
m_buffer = NULL; m_buffer = NULL;
m_bufferSize = 0; m_bufferSize = 0;
m_stopThread = HGFALSE; m_stopThread = HGFALSE;
@ -23,10 +26,6 @@ Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev,
setWindowTitle(QString::fromStdString(devName)); setWindowTitle(QString::fromStdString(devName));
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
qRegisterMetaType<SANE_Parameters>("SANE_Parameters");
qRegisterMetaType<SANE_Byte *>("SANE_Byte *");
connect(this, &Dialog_Device_Scan::eventFunc, this, &Dialog_Device_Scan::on_eventFunc, Qt::QueuedConnection);
ui->pushButton_Continue->setEnabled(true); ui->pushButton_Continue->setEnabled(true);
ui->pushButton_Cancel->setEnabled(false); ui->pushButton_Cancel->setEnabled(false);
ui->pushButton_Complete->setEnabled(true); ui->pushButton_Complete->setEnabled(true);
@ -116,6 +115,11 @@ void HGAPI Dialog_Device_Scan::ThreadFunc(HGThread thread, HGPointer param)
return; return;
} }
if (nullptr != p->m_eventCallback)
{
p->m_eventCallback(SHOW_SCAN_UI_EVENT_WORKING, p->m_eventParam);
}
while (!p->m_stopThread) while (!p->m_stopThread)
{ {
SANE_Parameters params; SANE_Parameters params;
@ -164,7 +168,35 @@ void HGAPI Dialog_Device_Scan::ThreadFunc(HGThread thread, HGPointer param)
break; break;
} }
if (nullptr != p->m_callback) if (nullptr != p->m_imageCallback)
p->m_callback(&params, p->m_buffer, p->m_callbackParam); {
HGUInt imgType = 0;
if (params.format == SANE_FRAME_GRAY)
{
if (1 == params.depth)
imgType = HGBASE_IMGTYPE_BINARY;
else if (8 == params.depth)
imgType = HGBASE_IMGTYPE_GRAY;
}
else if (params.format == SANE_FRAME_RGB)
{
imgType = HGBASE_IMGTYPE_RGB;
}
HGImageInfo imgInfo = { (HGUInt)params.pixels_per_line, (HGUInt)params.lines,
imgType, (HGUInt)params.bytes_per_line, HGBASE_IMGORIGIN_TOP };
HGImage img = NULL;
HGBase_CreateImageWithData((HGByte*)p->m_buffer, &imgInfo, &img);
if (NULL != img)
{
p->m_imageCallback(img, p->m_imageParam);
HGBase_DestroyImage(img);
}
}
}
if (nullptr != p->m_eventCallback)
{
p->m_eventCallback(SHOW_SCAN_UI_EVENT_SCANFINISHED, p->m_eventParam);
} }
} }

View File

@ -16,7 +16,8 @@ class Dialog_Device_Scan : public QDialog
public: public:
Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev, const char *devName, Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev, const char *devName,
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent = nullptr); show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam, QWidget *parent = nullptr);
~Dialog_Device_Scan(); ~Dialog_Device_Scan();
signals: signals:
@ -38,8 +39,10 @@ private:
Ui::Dialog_Device_Scan *ui; Ui::Dialog_Device_Scan *ui;
SANEAPI m_saneAPI; SANEAPI m_saneAPI;
SANE_Handle m_saneDev; SANE_Handle m_saneDev;
show_scan_ui_image_callback m_callback; show_scan_ui_event_callback m_eventCallback;
void *m_callbackParam; void *m_eventParam;
show_scan_ui_image_callback m_imageCallback;
void *m_imageParam;
HGByte* m_buffer; HGByte* m_buffer;
HGInt m_bufferSize; HGInt m_bufferSize;
volatile HGBool m_stopThread; volatile HGBool m_stopThread;