HGScannerLib增加获取设备操作码接口

This commit is contained in:
luoliangyi 2023-03-14 15:50:14 +08:00
parent 7253734973
commit 90faa2ef5e
7 changed files with 76 additions and 34 deletions

View File

@ -27,4 +27,5 @@ HGLib_DeviceRestart
HGLib_DeviceShutDown HGLib_DeviceShutDown
HGLib_StartDeviceScan HGLib_StartDeviceScan
HGLib_StopDeviceScan HGLib_StopDeviceScan
HGLib_StopDeviceScanAsyn HGLib_StopDeviceScanAsyn
HGLib_GetDeviceOperateCode

View File

@ -227,6 +227,7 @@ HGLibDeviceImpl::HGLibDeviceImpl()
m_eventParam = NULL; m_eventParam = NULL;
m_imageFunc = NULL; m_imageFunc = NULL;
m_imageParam = NULL; m_imageParam = NULL;
m_statusCode = SANE_STATUS_GOOD;
} }
HGLibDeviceImpl::~HGLibDeviceImpl() HGLibDeviceImpl::~HGLibDeviceImpl()
@ -384,11 +385,11 @@ HGBool HGLibDeviceImpl::GetSN(HGChar* sn, HGUInt maxLen)
std::string serialNum; std::string serialNum;
unsigned int serialNumLen = 0; unsigned int serialNumLen = 0;
if (SANE_STATUS_NO_MEM == sane_io_control(m_devHandle, IO_CTRL_CODE_GET_SERIAL, NULL, &serialNumLen) m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_SERIAL, NULL, &serialNumLen);
&& serialNumLen) if (SANE_STATUS_NO_MEM == m_statusCode && serialNumLen)
{ {
serialNum.resize(serialNumLen); serialNum.resize(serialNumLen);
sane_io_control(m_devHandle, IO_CTRL_CODE_GET_SERIAL, &serialNum[0], &serialNumLen); m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_SERIAL, &serialNum[0], &serialNumLen);
} }
if (serialNum.empty() || maxLen < serialNum.size() + 1) if (serialNum.empty() || maxLen < serialNum.size() + 1)
@ -411,11 +412,11 @@ HGBool HGLibDeviceImpl::GetFWVersion(HGChar* fwVersion, HGUInt maxLen)
std::string versionNum; std::string versionNum;
unsigned int versionNumLen = 0; unsigned int versionNumLen = 0;
if (SANE_STATUS_NO_MEM == sane_io_control(m_devHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, NULL, &versionNumLen) m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, NULL, &versionNumLen);
&& versionNumLen) if (SANE_STATUS_NO_MEM == m_statusCode && versionNumLen)
{ {
versionNum.resize(versionNumLen); versionNum.resize(versionNumLen);
sane_io_control(m_devHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, &versionNum[0], &versionNumLen); m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, &versionNum[0], &versionNumLen);
} }
if (versionNum.empty() || maxLen < versionNum.size() + 1) if (versionNum.empty() || maxLen < versionNum.size() + 1)
@ -439,7 +440,7 @@ HGBool HGLibDeviceImpl::SetParam(HGUInt option, const HGVoid* data)
HGBool ret = HGFALSE; HGBool ret = HGFALSE;
SANE_Int num_dev_options = 0; SANE_Int num_dev_options = 0;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); m_statusCode = sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i) for (int i = 1; i < num_dev_options; ++i)
{ {
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i);
@ -457,26 +458,30 @@ HGBool HGLibDeviceImpl::SetParam(HGUInt option, const HGVoid* data)
SANE_Char* value = (SANE_Char*)GetOptionEnumValue(*(HGUInt*)data); SANE_Char* value = (SANE_Char*)GetOptionEnumValue(*(HGUInt*)data);
if (NULL != value) if (NULL != value)
{ {
if (SANE_STATUS_GOOD == sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, value, NULL)) m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, value, NULL);
if (SANE_STATUS_GOOD == m_statusCode)
ret = HGTRUE; ret = HGTRUE;
} }
} }
else if (SANE_TYPE_INT == desp->type) else if (SANE_TYPE_INT == desp->type)
{ {
SANE_Int value = (SANE_Int)(*(HGInt*)data); SANE_Int value = (SANE_Int)(*(HGInt*)data);
if (SANE_STATUS_GOOD == sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, &value, NULL)) m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, &value, NULL);
if (SANE_STATUS_GOOD == m_statusCode)
ret = HGTRUE; ret = HGTRUE;
} }
else if (SANE_TYPE_FIXED == desp->type) else if (SANE_TYPE_FIXED == desp->type)
{ {
SANE_Fixed value = SANE_FIX(*(HGDouble*)data); SANE_Fixed value = SANE_FIX(*(HGDouble*)data);
if (SANE_STATUS_GOOD == sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, &value, NULL)) m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, &value, NULL);
if (SANE_STATUS_GOOD == m_statusCode)
ret = HGTRUE; ret = HGTRUE;
} }
else if (SANE_TYPE_BOOL == desp->type) else if (SANE_TYPE_BOOL == desp->type)
{ {
SANE_Bool value = (SANE_Bool)(*(HGBool*)data); SANE_Bool value = (SANE_Bool)(*(HGBool*)data);
if (SANE_STATUS_GOOD == sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, &value, NULL)) m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, &value, NULL);
if (SANE_STATUS_GOOD == m_statusCode)
ret = HGTRUE; ret = HGTRUE;
} }
@ -496,7 +501,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
std::vector<DeviceParamsGroup> devParams; std::vector<DeviceParamsGroup> devParams;
SANE_Int num_dev_options = 0; SANE_Int num_dev_options = 0;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); m_statusCode = sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i) for (int i = 1; i < num_dev_options; ++i)
{ {
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i);
@ -516,7 +521,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_STRING == desp->type) else if (SANE_TYPE_STRING == desp->type)
{ {
char value[256] = { 0 }; char value[256] = { 0 };
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, value, NULL);
DeviceParam devParam; DeviceParam devParam;
devParam.option = name; devParam.option = name;
@ -539,7 +544,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_INT == desp->type) else if (SANE_TYPE_INT == desp->type)
{ {
SANE_Int value = 0; SANE_Int value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceParam devParam; DeviceParam devParam;
devParam.option = name; devParam.option = name;
@ -568,7 +573,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_FIXED == desp->type) else if (SANE_TYPE_FIXED == desp->type)
{ {
SANE_Word value = 0; SANE_Word value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceParam devParam; DeviceParam devParam;
devParam.option = name; devParam.option = name;
@ -597,7 +602,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_BOOL == desp->type) else if (SANE_TYPE_BOOL == desp->type)
{ {
SANE_Bool value = 0; SANE_Bool value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceParam devParam; DeviceParam devParam;
devParam.option = name; devParam.option = name;
@ -702,7 +707,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
HGLibDeviceParam* param = NULL; HGLibDeviceParam* param = NULL;
SANE_Int num_dev_options = 0; SANE_Int num_dev_options = 0;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); m_statusCode = sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i) for (int i = 1; i < num_dev_options; ++i)
{ {
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i);
@ -721,7 +726,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
if (SANE_TYPE_STRING == desp->type) if (SANE_TYPE_STRING == desp->type)
{ {
char value[256] = { 0 }; char value[256] = { 0 };
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, value, NULL);
devParam.valueType = HGLIB_OPTION_VALUETYPE_ENUM; devParam.valueType = HGLIB_OPTION_VALUETYPE_ENUM;
devParam.stringValue = value; devParam.stringValue = value;
@ -739,7 +744,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
else if (SANE_TYPE_INT == desp->type) else if (SANE_TYPE_INT == desp->type)
{ {
SANE_Int value = 0; SANE_Int value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
devParam.valueType = HGLIB_OPTION_VALUETYPE_INT; devParam.valueType = HGLIB_OPTION_VALUETYPE_INT;
devParam.intValue = (int)value; devParam.intValue = (int)value;
@ -763,7 +768,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
else if (SANE_TYPE_FIXED == desp->type) else if (SANE_TYPE_FIXED == desp->type)
{ {
SANE_Word value = 0; SANE_Word value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
devParam.valueType = HGLIB_OPTION_VALUETYPE_DOUBLE; devParam.valueType = HGLIB_OPTION_VALUETYPE_DOUBLE;
devParam.doubleValue = SANE_UNFIX(value); devParam.doubleValue = SANE_UNFIX(value);
@ -787,7 +792,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
else if (SANE_TYPE_BOOL == desp->type) else if (SANE_TYPE_BOOL == desp->type)
{ {
SANE_Bool value = 0; SANE_Bool value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
devParam.valueType = HGLIB_OPTION_VALUETYPE_BOOL; devParam.valueType = HGLIB_OPTION_VALUETYPE_BOOL;
devParam.boolValue = (bool)value; devParam.boolValue = (bool)value;
@ -916,7 +921,7 @@ HGBool HGLibDeviceImpl::ResetParam()
HGBool ret = HGFALSE; HGBool ret = HGFALSE;
SANE_Int num_dev_options = 0; SANE_Int num_dev_options = 0;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); m_statusCode = sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i) for (int i = 1; i < num_dev_options; ++i)
{ {
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i);
@ -929,7 +934,8 @@ HGBool HGLibDeviceImpl::ResetParam()
if (0 == strcmp(SANE_STD_OPT_NAME_RESTORE, name) && SANE_TYPE_BUTTON == desp->type) if (0 == strcmp(SANE_STD_OPT_NAME_RESTORE, name) && SANE_TYPE_BUTTON == desp->type)
{ {
if (SANE_STATUS_GOOD == sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, NULL, NULL)) m_statusCode = sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, NULL, NULL);
if (SANE_STATUS_GOOD == m_statusCode)
ret = HGTRUE; ret = HGTRUE;
break; break;
} }
@ -942,8 +948,8 @@ HGBool HGLibDeviceImpl::IsPaperOn()
{ {
SANE_Bool isOn = SANE_FALSE; SANE_Bool isOn = SANE_FALSE;
unsigned int len = sizeof(SANE_Bool); unsigned int len = sizeof(SANE_Bool);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len); m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len);
if (SANE_STATUS_GOOD == status && isOn) if (SANE_STATUS_GOOD == m_statusCode && isOn)
return HGTRUE; return HGTRUE;
return HGFALSE; return HGFALSE;
} }
@ -952,8 +958,8 @@ HGInt HGLibDeviceImpl::GetStatus()
{ {
SANE_Bool isOn = SANE_FALSE; SANE_Bool isOn = SANE_FALSE;
unsigned int len = sizeof(SANE_Bool); unsigned int len = sizeof(SANE_Bool);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len); m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len);
if (SANE_STATUS_GOOD == status) if (SANE_STATUS_GOOD == m_statusCode)
return isOn ? 1 : 0; return isOn ? 1 : 0;
return -1; return -1;
} }
@ -962,8 +968,8 @@ HGBool HGLibDeviceImpl::Restart()
{ {
SANE_Power stat = SANE_POWER_RESTART; SANE_Power stat = SANE_POWER_RESTART;
unsigned int len = sizeof(SANE_Power); unsigned int len = sizeof(SANE_Power);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len); m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len);
if (SANE_STATUS_GOOD == status) if (SANE_STATUS_GOOD == m_statusCode)
return HGTRUE; return HGTRUE;
return HGFALSE; return HGFALSE;
} }
@ -972,8 +978,8 @@ HGBool HGLibDeviceImpl::ShutDown()
{ {
SANE_Power stat = SANE_POWER_SHUTDOWN; SANE_Power stat = SANE_POWER_SHUTDOWN;
unsigned int len = sizeof(SANE_Power); unsigned int len = sizeof(SANE_Power);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len); m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len);
if (SANE_STATUS_GOOD == status) if (SANE_STATUS_GOOD == m_statusCode)
return HGTRUE; return HGTRUE;
return HGFALSE; return HGFALSE;
} }
@ -1001,8 +1007,8 @@ HGBool HGLibDeviceImpl::StartScan(HGLibDeviceScanEventFunc eventFunc, HGPointer
m_imageParam = imageParam; m_imageParam = imageParam;
m_scanning = HGTRUE; m_scanning = HGTRUE;
SANE_Status status = sane_start(m_devHandle); m_statusCode = sane_start(m_devHandle);
if (SANE_STATUS_GOOD != status) if (SANE_STATUS_GOOD != m_statusCode)
{ {
m_scanning = HGFALSE; m_scanning = HGFALSE;
m_eventFunc = NULL; m_eventFunc = NULL;
@ -1062,6 +1068,11 @@ HGBool HGLibDeviceImpl::StopScanAsyn()
return ret; return ret;
} }
HGInt HGLibDeviceImpl::GetOperateCode()
{
return m_statusCode;
}
const char* HGLibDeviceImpl::GetGroupName(HGUInt group) const char* HGLibDeviceImpl::GetGroupName(HGUInt group)
{ {
if (group > HGLIB_GROUP_NAME_PAPERFEEDING) if (group > HGLIB_GROUP_NAME_PAPERFEEDING)

View File

@ -39,6 +39,7 @@ public:
HGLibDeviceScanImageFunc imageFunc, HGPointer imageParam); HGLibDeviceScanImageFunc imageFunc, HGPointer imageParam);
HGBool StopScan(); HGBool StopScan();
HGBool StopScanAsyn(); HGBool StopScanAsyn();
HGInt GetOperateCode();
private: private:
static const char* GetGroupName(HGUInt group); static const char* GetGroupName(HGUInt group);
@ -65,6 +66,7 @@ private:
HGPointer m_eventParam; HGPointer m_eventParam;
HGLibDeviceScanImageFunc m_imageFunc; HGLibDeviceScanImageFunc m_imageFunc;
HGPointer m_imageParam; HGPointer m_imageParam;
HGInt m_statusCode;
}; };
#endif /* __HGLIBDEVICEIMPL_HPP__ */ #endif /* __HGLIBDEVICEIMPL_HPP__ */

View File

@ -318,3 +318,14 @@ HGBool HGAPI HGLib_StopDeviceScanAsyn(HGLibDevice device)
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device; HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->StopScanAsyn(); return deviceImpl->StopScanAsyn();
} }
HGInt HGAPI HGLib_GetDeviceOperateCode(HGLibDevice device)
{
if (NULL == device)
{
return 0;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->GetOperateCode();
}

View File

@ -29,6 +29,20 @@ HG_DECLARE_HANDLE(HGLibDevice);
#define HGLIB_TIFFCOMPRESSION_LZW 3L #define HGLIB_TIFFCOMPRESSION_LZW 3L
#define HGLIB_TIFFCOMPRESSION_JPEG 4L #define HGLIB_TIFFCOMPRESSION_JPEG 4L
/* 设备操作码 */
#define HGLIB_DEV_OPERATECODE_GOOD 0L
#define HGLIB_DEV_OPERATECODE_UNSUPPORTED 1L
#define HGLIB_DEV_OPERATECODE_CANCELLED 2L
#define HGLIB_DEV_OPERATECODE_BUSY 3L
#define HGLIB_DEV_OPERATECODE_INVAL 4L
#define HGLIB_DEV_OPERATECODE_EOF 5L
#define HGLIB_DEV_OPERATECODE_JAMMED 6L
#define HGLIB_DEV_OPERATECODE_NO_DOCS 7L
#define HGLIB_DEV_OPERATECODE_COVER_OPEN 8L
#define HGLIB_DEV_OPERATECODE_IO_ERROR 9L
#define HGLIB_DEV_OPERATECODE_NO_MEM 10L
#define HGLIB_DEV_OPERATECODE_ACCESS_DENIED 11L
/* 设备热拔插事件 */ /* 设备热拔插事件 */
#define HGLIB_DEVHOTPLUG_EVENT_ARRIVE 1L #define HGLIB_DEVHOTPLUG_EVENT_ARRIVE 1L
#define HGLIB_DEVHOTPLUG_EVENT_REMOVE 2L #define HGLIB_DEVHOTPLUG_EVENT_REMOVE 2L
@ -546,4 +560,7 @@ HGEXPORT HGBool HGAPI HGLib_StopDeviceScan(HGLibDevice device);
/* 停止扫描-异步 */ /* 停止扫描-异步 */
HGEXPORT HGBool HGAPI HGLib_StopDeviceScanAsyn(HGLibDevice device); HGEXPORT HGBool HGAPI HGLib_StopDeviceScanAsyn(HGLibDevice device);
/* 获取设备操作码(在调用设备操作函数以后) */
HGEXPORT HGInt HGAPI HGLib_GetDeviceOperateCode(HGLibDevice device);
#endif /* __HGSCANNERLIB_H__ */ #endif /* __HGSCANNERLIB_H__ */