sane_user实现获取自定义信息的接口

This commit is contained in:
luoliangyi 2023-04-07 15:08:56 +08:00
parent 9fda967256
commit 88555e51eb
5 changed files with 102 additions and 21 deletions

View File

@ -25,7 +25,7 @@ typedef struct
HGChar ip[32]; HGChar ip[32];
HGChar mac[32]; HGChar mac[32];
HGUInt rollerCount; HGUInt rollerCount;
HGUInt histroyCount; HGUInt totalCount;
}HGSaneCustomInfo; }HGSaneCustomInfo;
#pragma pack(pop) #pragma pack(pop)

View File

@ -643,7 +643,46 @@ HGResult HGSaneDeviceImpl::GetName(HGChar* name, HGUInt maxLen)
HGResult HGSaneDeviceImpl::GetCustomInfo(HGSaneCustomInfo *info) HGResult HGSaneDeviceImpl::GetCustomInfo(HGSaneCustomInfo *info)
{ {
return HGBASE_ERR_NOTIMPL; if (NULL == info)
{
return HGBASE_ERR_INVALIDARG;
}
memset(info, 0, sizeof(HGSaneCustomInfo));
HGInt intValue = 0;
GetValue("dev-vid", &intValue);
info->vid = (HGUShort)intValue;
intValue = 0;
GetValue("dev-pid", &intValue);
info->pid = (HGUShort)intValue;
intValue = 0;
GetValue("roll-cnt", &intValue);
info->rollerCount = (HGUInt)intValue;
intValue = 0;
GetValue("total-cnt", &intValue);
info->totalCount = (HGUInt)intValue;
HGChar strValue[256] = {0};
GetValue("dev-model", strValue, 256);
strcpy(info->model, strValue);
strValue[0] = 0;
GetValue("dev-type", strValue, 256);
strcpy(info->type, strValue);
strValue[0] = 0;
GetValue("dev-sn", strValue, 256);
strcpy(info->sn, strValue);
strValue[0] = 0;
GetValue("dev-ver", strValue, 256);
strcpy(info->fwVer, strValue);
strValue[0] = 0;
GetValue("ip-addr", strValue, 256);
strcpy(info->ip, strValue);
strValue[0] = 0;
GetValue("mac-addr", strValue, 256);
strcpy(info->mac, strValue);
return HGBASE_ERR_OK;
} }
HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent) HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent)
@ -693,7 +732,7 @@ HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventFunc eventFunc, HGPointer eve
return HGBASE_ERR_OUTOFMEMORY; return HGBASE_ERR_OUTOFMEMORY;
} }
m_dpi = GetDpi(); GetValue("resolution", &m_dpi);
stat = m_sourceImpl->m_saneApi.sane_start_api(m_devHandle); stat = m_sourceImpl->m_saneApi.sane_start_api(m_devHandle);
if (SANE_STATUS_GOOD != stat) if (SANE_STATUS_GOOD != stat)
{ {
@ -752,7 +791,7 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
m_dpi = GetDpi(); GetValue("resolution", &m_dpi);
m_imageFunc = imageFunc; m_imageFunc = imageFunc;
m_imageParam = imageParam; m_imageParam = imageParam;
@ -764,9 +803,12 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGUInt HGSaneDeviceImpl::GetDpi() HGResult HGSaneDeviceImpl::GetValue(const HGChar *name, HGInt *value)
{ {
HGUInt dpi = 0; assert(NULL != name && 0 != *name);
assert(NULL != value);
HGResult ret = HGBASE_ERR_FAIL;
SANE_Int num_dev_options = 0; SANE_Int num_dev_options = 0;
m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); m_sourceImpl->m_saneApi.sane_control_option_api(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)
@ -777,17 +819,52 @@ HGUInt HGSaneDeviceImpl::GetDpi()
if (SANE_TYPE_INT == desp->type) if (SANE_TYPE_INT == desp->type)
{ {
SANE_Int value = 0; SANE_Int v = 0;
m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, &v, NULL);
if (0 == strcmp(desp->name, "resolution")) if (0 == strcmp(desp->name, name))
{ {
dpi = (HGUInt)value; *value = (HGInt)v;
ret = HGBASE_ERR_OK;
break; break;
} }
} }
} }
return dpi; return ret;
}
HGResult HGSaneDeviceImpl::GetValue(const HGChar *name, HGChar *value, HGUInt maxLen)
{
assert(NULL != name && 0 != *name);
assert(NULL != value);
HGResult ret = HGBASE_ERR_FAIL;
SANE_Int num_dev_options = 0;
m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i)
{
const SANE_Option_Descriptor* desp = m_sourceImpl->m_saneApi.sane_get_option_descriptor_api(m_devHandle, i);
if (nullptr == desp)
continue;
if (SANE_TYPE_STRING == desp->type)
{
char v[256] = { 0 };
m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, v, NULL);
if (0 == strcmp(desp->name, name))
{
if (maxLen > strlen(v))
{
strcpy(value, v);
ret = HGBASE_ERR_OK;
}
break;
}
}
}
return ret;
} }
void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)

View File

@ -80,7 +80,8 @@ public:
HGResult StartWithUI(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam); HGResult StartWithUI(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam);
private: private:
HGUInt GetDpi(); HGResult GetValue(const HGChar *name, HGInt *value);
HGResult GetValue(const HGChar *name, HGChar *value, HGUInt maxLen);
static void HGAPI ThreadFunc(HGThread thread, HGPointer param); static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
static void ShowScanImageCallback(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam); static void ShowScanImageCallback(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam);
@ -90,7 +91,7 @@ private:
SANE_Handle m_devHandle; SANE_Handle m_devHandle;
HGByte* m_buffer; HGByte* m_buffer;
HGInt m_bufferSize; HGInt m_bufferSize;
HGUInt m_dpi; HGInt m_dpi;
HGSane_DeviceEventFunc m_eventFunc; HGSane_DeviceEventFunc m_eventFunc;
HGPointer m_eventParam; HGPointer m_eventParam;
HGSane_DeviceImageFunc m_imageFunc; HGSane_DeviceImageFunc m_imageFunc;

View File

@ -21,7 +21,7 @@ typedef struct
HGChar ip[32]; HGChar ip[32];
HGChar mac[32]; HGChar mac[32];
HGUInt rollerCount; HGUInt rollerCount;
HGUInt histroyCount; HGUInt totalCount;
}HGTwainDeviceCustomInfo; }HGTwainDeviceCustomInfo;
#pragma pack(pop) #pragma pack(pop)

View File

@ -405,15 +405,18 @@ HGResult HGTwainDSImpl::GetDeviceCustomInfo(HGTwainDeviceCustomInfo *info)
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
HGChar value[256] = {0};
memset(info, 0, sizeof(HGTwainDeviceCustomInfo)); memset(info, 0, sizeof(HGTwainDeviceCustomInfo));
GetCap(CAP_SERIALNUMBER, value, 256); HGChar strValue[256] = {0};
strcpy(info->sn, value); GetCap(CAP_SERIALNUMBER, strValue, 256);
GetCap(0x8025, value, 256); strcpy(info->sn, strValue);
strcpy(info->fwVer, value); strValue[0] = 0;
GetCap(0x8200, value, 256); GetCap(0x8025, strValue, 256);
strcpy(info->ip, value); strcpy(info->fwVer, strValue);
strValue[0] = 0;
GetCap(0x8200, strValue, 256);
strcpy(info->ip, strValue);
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }