This commit is contained in:
yangjiaxuan 2023-03-15 16:07:40 +08:00
commit 5250561016
9 changed files with 110 additions and 36 deletions

View File

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

View File

@ -2,6 +2,7 @@
CImageApply::CImageApply(void)
{
cv::setUseOptimized(false);
}
CImageApply::~CImageApply(void)

View File

@ -49,13 +49,23 @@ static int indexPatch=0;
std::mutex m_mutex;
static HG_CACHEIMGFORMAT m_cacheimgformat = HG_CJPG;
static std::string m_default_prefix = "1000";
static std::map< HG_CACHEIMGFORMAT, std::string> m_mapcaches = {
{HG_CJPG,".jpg"},
{HG_CPNG,".png"},
{HG_CBMP,".bmp"},
{HG_CTIFF,".tiff"}
};
#include <regex>
//// 使用正则表达式判断文件名是否有效(不含非法字符)
//inline bool IsValidFileName(const std::string& strFileName)
//{
// // Windows下文件名中不能包含\/:*?"<>|这些字符
// std::regex regExpress("[\\/:*?\"<>|]");
// bool bValid = !std::regex_search(strFileName, regExpress);
// return bValid;
//}
int writeimage(const char* filename, std::vector<unsigned char>& imagedata) {
FILE* fp = NULL;
@ -124,6 +134,7 @@ void onReceivedImage(HG_IMG* img, void* obj)
else
{
path = WChar2Ansi(outapth);
path += m_default_prefix;
path += filename;
}
#else
@ -137,7 +148,7 @@ void onReceivedImage(HG_IMG* img, void* obj)
dstdirPath = "/tmp";
}
}
path = dstdirPath + "/" + filename;
path = dstdirPath + "/" + m_default_prefix + filename;
#endif
//std::vector<int> quality;
//quality.push_back(CV_IMWRITE_JPEG_QUALITY);
@ -710,3 +721,23 @@ Java_com_huagao_scanner_DeviceManager_resetPatchIndex(JNIEnv * env, jobject thiz
indexPatch = 0;
LOG("JAVA--- clean indexPatch:%d\n", indexPatch);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_huagao_scanner_DeviceManager_setPrefix(JNIEnv * env, jobject thiz, jstring prefix)
{
char* cName = const_cast<char*>(env->GetStringUTFChars(prefix, 0));
if (cName)
{
auto len = strlen(cName);
LOG("JAVA--- setPrefix prefix_len = %d prefix = %s \n", len, cName);
if (len > 0)
{
m_default_prefix.resize(len);
memcpy((void*)m_default_prefix.data(), cName, len);
LOG("JAVA--- setPrefix m_default_prefix = %d prefix = %s \n", m_default_prefix.length(), m_default_prefix.c_str());
}
env->ReleaseStringUTFChars(prefix, cName);
}
}

View File

@ -227,6 +227,7 @@ HGLibDeviceImpl::HGLibDeviceImpl()
m_eventParam = NULL;
m_imageFunc = NULL;
m_imageParam = NULL;
m_statusCode = SANE_STATUS_GOOD;
}
HGLibDeviceImpl::~HGLibDeviceImpl()
@ -384,11 +385,11 @@ HGBool HGLibDeviceImpl::GetSN(HGChar* sn, HGUInt maxLen)
std::string serialNum;
unsigned int serialNumLen = 0;
if (SANE_STATUS_NO_MEM == sane_io_control(m_devHandle, IO_CTRL_CODE_GET_SERIAL, NULL, &serialNumLen)
&& serialNumLen)
m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_SERIAL, NULL, &serialNumLen);
if (SANE_STATUS_NO_MEM == m_statusCode && 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)
@ -411,11 +412,11 @@ HGBool HGLibDeviceImpl::GetFWVersion(HGChar* fwVersion, HGUInt maxLen)
std::string versionNum;
unsigned int versionNumLen = 0;
if (SANE_STATUS_NO_MEM == sane_io_control(m_devHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, NULL, &versionNumLen)
&& versionNumLen)
m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, NULL, &versionNumLen);
if (SANE_STATUS_NO_MEM == m_statusCode && 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)
@ -439,7 +440,7 @@ HGBool HGLibDeviceImpl::SetParam(HGUInt option, const HGVoid* data)
HGBool ret = HGFALSE;
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)
{
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);
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;
}
}
else if (SANE_TYPE_INT == desp->type)
{
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;
}
else if (SANE_TYPE_FIXED == desp->type)
{
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;
}
else if (SANE_TYPE_BOOL == desp->type)
{
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;
}
@ -496,7 +501,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
std::vector<DeviceParamsGroup> devParams;
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)
{
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)
{
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;
devParam.option = name;
@ -539,7 +544,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_INT == desp->type)
{
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;
devParam.option = name;
@ -568,7 +573,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_FIXED == desp->type)
{
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;
devParam.option = name;
@ -597,7 +602,7 @@ HGLibDeviceParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
else if (SANE_TYPE_BOOL == desp->type)
{
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;
devParam.option = name;
@ -702,7 +707,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
HGLibDeviceParam* param = NULL;
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)
{
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)
{
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.stringValue = value;
@ -739,7 +744,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
else if (SANE_TYPE_INT == desp->type)
{
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.intValue = (int)value;
@ -763,7 +768,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
else if (SANE_TYPE_FIXED == desp->type)
{
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.doubleValue = SANE_UNFIX(value);
@ -787,7 +792,7 @@ HGLibDeviceParam* HGLibDeviceImpl::GetParam(HGUInt option)
else if (SANE_TYPE_BOOL == desp->type)
{
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.boolValue = (bool)value;
@ -916,7 +921,7 @@ HGBool HGLibDeviceImpl::ResetParam()
HGBool ret = HGFALSE;
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)
{
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 (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;
break;
}
@ -942,8 +948,8 @@ HGBool HGLibDeviceImpl::IsPaperOn()
{
SANE_Bool isOn = SANE_FALSE;
unsigned int len = sizeof(SANE_Bool);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len);
if (SANE_STATUS_GOOD == status && isOn)
m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len);
if (SANE_STATUS_GOOD == m_statusCode && isOn)
return HGTRUE;
return HGFALSE;
}
@ -952,8 +958,8 @@ HGInt HGLibDeviceImpl::GetStatus()
{
SANE_Bool isOn = SANE_FALSE;
unsigned int len = sizeof(SANE_Bool);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len);
if (SANE_STATUS_GOOD == status)
m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_GET_PAPER_ON, &isOn, &len);
if (SANE_STATUS_GOOD == m_statusCode)
return isOn ? 1 : 0;
return -1;
}
@ -962,8 +968,8 @@ HGBool HGLibDeviceImpl::Restart()
{
SANE_Power stat = SANE_POWER_RESTART;
unsigned int len = sizeof(SANE_Power);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len);
if (SANE_STATUS_GOOD == status)
m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len);
if (SANE_STATUS_GOOD == m_statusCode)
return HGTRUE;
return HGFALSE;
}
@ -972,8 +978,8 @@ HGBool HGLibDeviceImpl::ShutDown()
{
SANE_Power stat = SANE_POWER_SHUTDOWN;
unsigned int len = sizeof(SANE_Power);
SANE_Status status = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len);
if (SANE_STATUS_GOOD == status)
m_statusCode = sane_io_control(m_devHandle, IO_CTRL_CODE_SET_POWER_LEVEL, &stat, &len);
if (SANE_STATUS_GOOD == m_statusCode)
return HGTRUE;
return HGFALSE;
}
@ -1001,8 +1007,8 @@ HGBool HGLibDeviceImpl::StartScan(HGLibDeviceScanEventFunc eventFunc, HGPointer
m_imageParam = imageParam;
m_scanning = HGTRUE;
SANE_Status status = sane_start(m_devHandle);
if (SANE_STATUS_GOOD != status)
m_statusCode = sane_start(m_devHandle);
if (SANE_STATUS_GOOD != m_statusCode)
{
m_scanning = HGFALSE;
m_eventFunc = NULL;
@ -1062,6 +1068,11 @@ HGBool HGLibDeviceImpl::StopScanAsyn()
return ret;
}
HGInt HGLibDeviceImpl::GetOperateCode()
{
return m_statusCode;
}
const char* HGLibDeviceImpl::GetGroupName(HGUInt group)
{
if (group > HGLIB_GROUP_NAME_PAPERFEEDING)

View File

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

View File

@ -318,3 +318,14 @@ HGBool HGAPI HGLib_StopDeviceScanAsyn(HGLibDevice device)
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
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_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_REMOVE 2L
@ -546,4 +560,7 @@ HGEXPORT HGBool HGAPI HGLib_StopDeviceScan(HGLibDevice device);
/* 停止扫描-异步 */
HGEXPORT HGBool HGAPI HGLib_StopDeviceScanAsyn(HGLibDevice device);
/* 获取设备操作码(在调用设备操作函数以后) */
HGEXPORT HGInt HGAPI HGLib_GetDeviceOperateCode(HGLibDevice device);
#endif /* __HGSCANNERLIB_H__ */