Merge branch 'master' of http://192.168.10.5:8099/sane/code_device
This commit is contained in:
commit
bdeb6f04aa
|
@ -53,6 +53,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}
|
|||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/include
|
||||
${PROJECT_SOURCE_DIR}/../3rdparty/tiff/include
|
||||
${PROJECT_SOURCE_DIR}/../../../sdk/include
|
||||
${PROJECT_SOURCE_DIR}/../wrapper
|
||||
|
||||
)
|
||||
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../build)
|
||||
|
|
|
@ -2930,7 +2930,11 @@ int hg_scanner::set_setting(const char* name, void* data, int len)
|
|||
// setting_jsn_.at(real_n).at("title").get_to(name);
|
||||
if (type == "string")
|
||||
{
|
||||
int id = lang_get_string_id((char*)data, false);
|
||||
if (id == -1)
|
||||
setting_jsn_.at(real_n).at("cur") = (char*)data;
|
||||
else
|
||||
setting_jsn_.at(real_n).at("cur") = id;
|
||||
type = (char*)data;
|
||||
}
|
||||
else if (type == "int")
|
||||
|
@ -3046,6 +3050,49 @@ bool hg_scanner::is_online(void)
|
|||
{
|
||||
return online_;
|
||||
}
|
||||
void hg_scanner::on_language_changed(void)
|
||||
{
|
||||
// change the 'size' member of string settings ...
|
||||
for (size_t i = 1; i < jsn_children_.size(); ++i)
|
||||
{
|
||||
std::string v(jsn_children_[i]);
|
||||
|
||||
if (!setting_jsn_.contains(v.c_str()))
|
||||
continue;
|
||||
|
||||
std::string val("");
|
||||
|
||||
setting_jsn_.at(v.c_str()).at("type").get_to(val);
|
||||
if (val != "string")
|
||||
continue;
|
||||
|
||||
if (setting_jsn_.at(v.c_str()).contains("range"))
|
||||
{
|
||||
int old = 0, now = 0;
|
||||
setting_jsn_.at(v.c_str()).at("size").get_to(old);
|
||||
for (int i = 0; i < setting_jsn_.at(v.c_str()).at("range").size(); ++i)
|
||||
{
|
||||
int id = -1;
|
||||
|
||||
if (setting_jsn_.at(v.c_str()).at("range").at(i).is_number())
|
||||
{
|
||||
setting_jsn_.at(v.c_str()).at("range").at(i).get_to(id);
|
||||
val = hg_log::lang_load(id);
|
||||
}
|
||||
else
|
||||
setting_jsn_.at(v.c_str()).at("range").at(i).get_to(val);
|
||||
if (now < val.length())
|
||||
now = val.length();
|
||||
}
|
||||
now += 8;
|
||||
if (now > old)
|
||||
{
|
||||
setting_jsn_.at(v.c_str()).at("size") = now;
|
||||
VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Change size of '%s' from %d to %d\n", v.c_str(), old, now);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int hg_scanner::start(void)
|
||||
{
|
||||
user_cancel_ = false;
|
||||
|
|
|
@ -426,6 +426,8 @@ public:
|
|||
std::string name(void);
|
||||
int status(void);
|
||||
bool is_online(void);
|
||||
void on_language_changed(void);
|
||||
|
||||
public:
|
||||
virtual int start(void);
|
||||
virtual int get_image_info(SANE_Parameters* ii);
|
||||
|
|
|
@ -778,3 +778,13 @@ scanner_err hg_scanner_mgr::hg_scanner_control(scanner_handle h, unsigned long c
|
|||
else
|
||||
return (scanner_err)SCAN_PTR(h)->device_io_control(code, data, len);
|
||||
}
|
||||
|
||||
void hg_scanner_mgr::on_language_changed(void)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_dev_);
|
||||
for (auto& v: online_devices_)
|
||||
{
|
||||
if (v.scanner)
|
||||
v.scanner->on_language_changed();
|
||||
}
|
||||
}
|
|
@ -127,5 +127,7 @@ public:
|
|||
scanner_err hg_scanner_get_status(scanner_handle h, int setstutas);
|
||||
scanner_err hg_scanner_reset(scanner_handle h);
|
||||
scanner_err hg_scanner_control(scanner_handle h, unsigned long code, void* data, unsigned* len);
|
||||
|
||||
void on_language_changed(void);
|
||||
};
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ endif()
|
|||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
${PROJECT_SOURCE_DIR}/../../../build/libgdev.a
|
||||
${PROJECT_SOURCE_DIR}/../../../build/libgimgproc.a
|
||||
${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/liblang.so
|
||||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgproc.a
|
||||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgcodecs.a
|
||||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_highgui.a
|
||||
|
@ -49,6 +50,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
|
|||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libquirc.a
|
||||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libzlib.a
|
||||
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/liblibwebp.a
|
||||
|
||||
${PROJECT_SOURCE_DIR}/../../../sdk/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libusb-1.0.a #uos下放的先后顺序不对可能会导致库链接不上
|
||||
udev pthread dl m)
|
||||
|
||||
|
@ -95,6 +97,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}
|
|||
${PROJECT_SOURCE_DIR}/../3rdparty/tiff/include
|
||||
${PROJECT_SOURCE_DIR}/../ImageProcess
|
||||
${PROJECT_SOURCE_DIR}/../hgdev
|
||||
${PROJECT_SOURCE_DIR}/../wrapper
|
||||
${PROJECT_SOURCE_DIR}/../../../sdk/include
|
||||
)
|
||||
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR})
|
||||
|
|
|
@ -69,6 +69,12 @@ namespace err_map
|
|||
}
|
||||
extern "C"
|
||||
{
|
||||
static void language_changed(int cp, void* param)
|
||||
{
|
||||
reload_setting_string_from_pak(cp, nullptr);
|
||||
hg_scanner_mgr::instance()->on_language_changed();
|
||||
}
|
||||
|
||||
scanner_err hg_scanner_initialize(sane_callback callback, void* reserve)
|
||||
{
|
||||
std::string name(""),
|
||||
|
@ -98,7 +104,7 @@ extern "C"
|
|||
VLOG_MINI_1(LOG_LEVEL_FATAL, "No language package found(%d)!\n", -1);
|
||||
return SCANNER_ERR_LANG_PAK_LOST;
|
||||
}
|
||||
register_language_changed_notify(reload_setting_string_from_pak, true);
|
||||
register_language_changed_notify(language_changed, true);
|
||||
|
||||
hg_scanner_mgr::set_version(VERSION_MAJOR, VERSION_MINOR, VERSION_YEAR, GET_BUILD_VER);
|
||||
hg_scanner_mgr::set_exe_name(pe.c_str(), name.c_str());
|
||||
|
@ -108,7 +114,7 @@ extern "C"
|
|||
}
|
||||
void hg_scanner_uninitialize(void)
|
||||
{
|
||||
register_language_changed_notify(reload_setting_string_from_pak, false);
|
||||
register_language_changed_notify(language_changed, false);
|
||||
hg_scanner_mgr::clear();
|
||||
hg_log::unint();
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ link_directories(${PROJECT_NAME} PRIVATE
|
|||
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}
|
||||
)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE hgdriver
|
||||
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/liblang.so
|
||||
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libhgdriver.so
|
||||
)
|
||||
|
||||
|
|
|
@ -171,7 +171,7 @@ namespace local_utility
|
|||
return str > bgn;
|
||||
}
|
||||
|
||||
// æš‚ä¸<EFBFBD>支æŒ<EFBFBD>科å¦è®¡æ•°æ³?1.2e+10
|
||||
// 暂不支持科学计数<EFBFBD>?1.2e+10
|
||||
bool get_number(const char*& str, double& val)
|
||||
{
|
||||
const char* bgn = str;
|
||||
|
@ -381,6 +381,8 @@ hg_sane_middleware::~hg_sane_middleware()
|
|||
|
||||
void hg_sane_middleware::language_changed(int cp, void* param)
|
||||
{
|
||||
for (auto& v : hg_sane_middleware::instance()->openning_)
|
||||
hg_sane_middleware::free_device_inst(v, false);
|
||||
|
||||
}
|
||||
const SANE_Device** hg_sane_middleware::to_sane_device(ScannerInfo* hgscanner, int count)
|
||||
|
@ -555,7 +557,7 @@ SANE_Option_Descriptor* hg_sane_middleware::string_option_to_SANE_descriptor(con
|
|||
sod->unit = SANE_UNIT_NONE;
|
||||
sod->size = values.size();
|
||||
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
|
||||
| SANE_CAP_AUTOMATIC; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€?
|
||||
| SANE_CAP_AUTOMATIC; // 硬件可设置默认<EFBFBD>?
|
||||
if (values.size())
|
||||
{
|
||||
sod->constraint_type = SANE_CONSTRAINT_STRING_LIST;
|
||||
|
@ -676,7 +678,7 @@ SANE_Option_Descriptor* hg_sane_middleware::number_option_to_SANE_descriptor(con
|
|||
sod->unit = SANE_UNIT_NONE;
|
||||
sod->size = sizeof(SANE_Word);
|
||||
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
|
||||
/*| SANE_CAP_AUTOMATIC*/; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€?
|
||||
/*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认<EFBFBD>?
|
||||
|
||||
if (values.size())
|
||||
{
|
||||
|
@ -726,7 +728,7 @@ SANE_Option_Descriptor* hg_sane_middleware::number_option_to_SANE_descriptor(con
|
|||
sod->unit = SANE_UNIT_NONE;
|
||||
sod->size = sizeof(SANE_Word);
|
||||
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
|
||||
/*| SANE_CAP_AUTOMATIC*/; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€?
|
||||
/*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认<EFBFBD>?
|
||||
|
||||
if (values.size())
|
||||
{
|
||||
|
@ -1002,7 +1004,7 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st
|
|||
//if (jsn->get_value("enable", enabled) && !enabled)
|
||||
// ret->cap |= SANE_CAP_INACTIVE;
|
||||
|
||||
// å…³è<EFBFBD>”é¡?
|
||||
// 关联<EFBFBD>?
|
||||
json* depend = NULL;
|
||||
SLAVEOP so;
|
||||
if (jsn->get_value("depend_or", depend))
|
||||
|
@ -1016,7 +1018,7 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st
|
|||
if (depend)
|
||||
{
|
||||
std::vector<LPDEVINST>::iterator it = find_openning_device_in_que(h);
|
||||
if (it != openning_.end() && parse_depends(depend, so, (*it)->masters))
|
||||
if (it != openning_.end() && parse_depends(h, depend, so, (*it)->masters))
|
||||
{
|
||||
so.enable_now = (ret->cap & SANE_CAP_INACTIVE) != SANE_CAP_INACTIVE;
|
||||
so.name = name;
|
||||
|
@ -1049,14 +1051,22 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st
|
|||
|
||||
return ret;
|
||||
}
|
||||
void hg_sane_middleware::free_device_inst(LPDEVINST dev)
|
||||
void hg_sane_middleware::free_device_inst(LPDEVINST dev, bool del)
|
||||
{
|
||||
if (dev->std_opt)
|
||||
delete dev->std_opt;
|
||||
for (auto& v : dev->opts)
|
||||
local_utility::free_memory(v.desc);
|
||||
|
||||
if(del)
|
||||
delete dev;
|
||||
else
|
||||
{
|
||||
dev->opts.clear();
|
||||
dev->cur_vals.clear();
|
||||
dev->slaves.clear();
|
||||
dev->masters.clear();
|
||||
}
|
||||
}
|
||||
scanner_handle hg_sane_middleware::find_openning_device(SANE_Handle h, bool rmv, LPDEVINST* dev)
|
||||
{
|
||||
|
@ -1129,10 +1139,10 @@ SANE_Option_Descriptor* hg_sane_middleware::find_stored_descriptor(scanner_handl
|
|||
if (IS_PTR_NUMBER(option))
|
||||
{
|
||||
if (id)
|
||||
*id = (int)option;
|
||||
*id = (SANE_Int)(long long)option;
|
||||
for (const auto& v : (*it)->opts)
|
||||
{
|
||||
if (v.option_no == (int)option)
|
||||
if (v.option_no == (SANE_Int)(long long)option)
|
||||
return v.desc;
|
||||
}
|
||||
}
|
||||
|
@ -1233,7 +1243,7 @@ bool hg_sane_middleware::get_current_value(scanner_handle handle, const void* op
|
|||
std::vector<LPDEVINST>::iterator it = find_openning_device_in_que(handle);
|
||||
refresh_current_value(*it, name.c_str(), jsn);
|
||||
|
||||
jsn->get_value("title", val);
|
||||
val = hg_sane_middleware::get_string_in_json(jsn, "title");
|
||||
|
||||
if (setv == &hg_sane_middleware::set_value_to_new)
|
||||
value = *(void**)value;
|
||||
|
@ -1253,8 +1263,7 @@ void* hg_sane_middleware::get_default_value(scanner_handle handle, const void* o
|
|||
if (jsn->attach_text(&val[0]) &&
|
||||
jsn->get_value("type", val))
|
||||
{
|
||||
std::string title("");
|
||||
jsn->get_value("title", title);
|
||||
std::string title(hg_sane_middleware::get_string_in_json(jsn, "title"));
|
||||
if (val == "bool")
|
||||
{
|
||||
bool v = false;
|
||||
|
@ -1349,7 +1358,7 @@ SANE_Status hg_sane_middleware::get_devices(const SANE_Device*** device_list, SA
|
|||
|
||||
if (hgerr == SCANNER_ERR_INSUFFICIENT_MEMORY)
|
||||
{
|
||||
count += 4; // 为两次hg_scanner_enumé—´éš™å<EFBFBD>¯èƒ½æ–°å¢žçš„设备预留空é—?
|
||||
count += 4; // 为两次hg_scanner_enum间隙可能新增的设备预留空<EFBFBD>?
|
||||
dev = (ScannerInfo*)local_utility::acquire_memory(sizeof(ScannerInfo) * count, "hg_sane_middleware::get_devices");
|
||||
hgerr = hg_scanner_enum(dev, &count, local_only);
|
||||
if (hgerr != SCANNER_ERR_OK)
|
||||
|
@ -1727,7 +1736,7 @@ bool hg_sane_middleware::is_ready(void)
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// å…³è<EFBFBD>”项处ç<EFBFBD>?
|
||||
/// 关联项处<EFBFBD>?
|
||||
bool hg_sane_middleware::compare_val_equal(const char* cur_val, const char* limit_l, const char* limit_r)
|
||||
{
|
||||
return strcmp(cur_val, limit_l) == 0;
|
||||
|
@ -1896,7 +1905,7 @@ bool hg_sane_middleware::parse_master_option(const char* depend_str, MASTEROP& m
|
|||
|
||||
return ret;
|
||||
}
|
||||
bool hg_sane_middleware::parse_depends(json* jsn, SLAVEOP& so, std::vector<std::string>& master)
|
||||
bool hg_sane_middleware::parse_depends(scanner_handle h, json* jsn, SLAVEOP& so, std::vector<std::string>& master)
|
||||
{
|
||||
std::string val(""), mn("");
|
||||
bool ret = jsn->first_child(val);
|
||||
|
@ -1913,6 +1922,10 @@ bool hg_sane_middleware::parse_depends(json* jsn, SLAVEOP& so, std::vector<std::
|
|||
mo.name = mn;
|
||||
else
|
||||
mn = mo.name;
|
||||
|
||||
SANE_Option_Descriptor* m = find_stored_descriptor(h, mo.name.c_str());
|
||||
if (m && m->type == SANE_TYPE_STRING)
|
||||
mo.limit_l = from_default_language(mo.limit_l.c_str(), nullptr);
|
||||
so.master.push_back(mo);
|
||||
if (std::find(master.begin(), master.end(), mo.name) == master.end())
|
||||
{
|
||||
|
|
|
@ -89,7 +89,7 @@ typedef struct _dev_inst
|
|||
return dev == h;
|
||||
}
|
||||
|
||||
struct _dev_inst()
|
||||
_dev_inst()
|
||||
{
|
||||
dev = nullptr;
|
||||
name = "";
|
||||
|
@ -171,7 +171,7 @@ class hg_sane_middleware
|
|||
|
||||
|
||||
bool parse_master_option(const char* depend_str, MASTEROP& mo);
|
||||
bool parse_depends(json* jsn, SLAVEOP& so, std::vector<std::string>& master);
|
||||
bool parse_depends(scanner_handle h, json* jsn, SLAVEOP& so, std::vector<std::string>& master);
|
||||
|
||||
bool is_associatived(const SLAVEOP& slave, const char* master_name);
|
||||
bool set_stored_option_enabled(scanner_handle h, const void* option, bool enable, int* size = NULL);
|
||||
|
@ -185,7 +185,7 @@ class hg_sane_middleware
|
|||
std::vector<LPDEVINST>::iterator find_openning_device_in_que(const char* name);
|
||||
/// 关联项处理结束
|
||||
|
||||
static void free_device_inst(LPDEVINST dev);
|
||||
static void free_device_inst(LPDEVINST dev, bool del = true);
|
||||
scanner_handle find_openning_device(SANE_Handle h, bool rmv = false, LPDEVINST* dev = NULL);
|
||||
|
||||
protected:
|
||||
|
|
Loading…
Reference in New Issue