This commit is contained in:
13038267101 2023-01-29 15:41:16 +08:00
commit bdeb6f04aa
10 changed files with 109 additions and 24 deletions

View File

@ -53,6 +53,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/include ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/include
${PROJECT_SOURCE_DIR}/../3rdparty/tiff/include ${PROJECT_SOURCE_DIR}/../3rdparty/tiff/include
${PROJECT_SOURCE_DIR}/../../../sdk/include ${PROJECT_SOURCE_DIR}/../../../sdk/include
${PROJECT_SOURCE_DIR}/../wrapper
) )
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../build) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../build)

View File

@ -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); // setting_jsn_.at(real_n).at("title").get_to(name);
if (type == "string") if (type == "string")
{ {
int id = lang_get_string_id((char*)data, false);
if (id == -1)
setting_jsn_.at(real_n).at("cur") = (char*)data; setting_jsn_.at(real_n).at("cur") = (char*)data;
else
setting_jsn_.at(real_n).at("cur") = id;
type = (char*)data; type = (char*)data;
} }
else if (type == "int") else if (type == "int")
@ -3046,6 +3050,49 @@ bool hg_scanner::is_online(void)
{ {
return online_; 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) int hg_scanner::start(void)
{ {
user_cancel_ = false; user_cancel_ = false;

View File

@ -426,6 +426,8 @@ public:
std::string name(void); std::string name(void);
int status(void); int status(void);
bool is_online(void); bool is_online(void);
void on_language_changed(void);
public: public:
virtual int start(void); virtual int start(void);
virtual int get_image_info(SANE_Parameters* ii); virtual int get_image_info(SANE_Parameters* ii);

View File

@ -778,3 +778,13 @@ scanner_err hg_scanner_mgr::hg_scanner_control(scanner_handle h, unsigned long c
else else
return (scanner_err)SCAN_PTR(h)->device_io_control(code, data, len); 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();
}
}

View File

@ -127,5 +127,7 @@ public:
scanner_err hg_scanner_get_status(scanner_handle h, int setstutas); scanner_err hg_scanner_get_status(scanner_handle h, int setstutas);
scanner_err hg_scanner_reset(scanner_handle h); scanner_err hg_scanner_reset(scanner_handle h);
scanner_err hg_scanner_control(scanner_handle h, unsigned long code, void* data, unsigned* len); scanner_err hg_scanner_control(scanner_handle h, unsigned long code, void* data, unsigned* len);
void on_language_changed(void);
}; };

View File

@ -36,6 +36,7 @@ endif()
target_link_libraries(${PROJECT_NAME} PRIVATE target_link_libraries(${PROJECT_NAME} PRIVATE
${PROJECT_SOURCE_DIR}/../../../build/libgdev.a ${PROJECT_SOURCE_DIR}/../../../build/libgdev.a
${PROJECT_SOURCE_DIR}/../../../build/libgimgproc.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_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_imgcodecs.a
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_highgui.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}/libquirc.a
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libzlib.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}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/liblibwebp.a
${PROJECT_SOURCE_DIR}/../../../sdk/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libusb-1.0.a #uos ${PROJECT_SOURCE_DIR}/../../../sdk/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libusb-1.0.a #uos
udev pthread dl m) 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}/../3rdparty/tiff/include
${PROJECT_SOURCE_DIR}/../ImageProcess ${PROJECT_SOURCE_DIR}/../ImageProcess
${PROJECT_SOURCE_DIR}/../hgdev ${PROJECT_SOURCE_DIR}/../hgdev
${PROJECT_SOURCE_DIR}/../wrapper
${PROJECT_SOURCE_DIR}/../../../sdk/include ${PROJECT_SOURCE_DIR}/../../../sdk/include
) )
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR}) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR})

View File

@ -69,6 +69,12 @@ namespace err_map
} }
extern "C" 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) scanner_err hg_scanner_initialize(sane_callback callback, void* reserve)
{ {
std::string name(""), std::string name(""),
@ -98,7 +104,7 @@ extern "C"
VLOG_MINI_1(LOG_LEVEL_FATAL, "No language package found(%d)!\n", -1); VLOG_MINI_1(LOG_LEVEL_FATAL, "No language package found(%d)!\n", -1);
return SCANNER_ERR_LANG_PAK_LOST; 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_version(VERSION_MAJOR, VERSION_MINOR, VERSION_YEAR, GET_BUILD_VER);
hg_scanner_mgr::set_exe_name(pe.c_str(), name.c_str()); hg_scanner_mgr::set_exe_name(pe.c_str(), name.c_str());
@ -108,7 +114,7 @@ extern "C"
} }
void hg_scanner_uninitialize(void) 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_scanner_mgr::clear();
hg_log::unint(); hg_log::unint();
} }

View File

@ -18,6 +18,7 @@ link_directories(${PROJECT_NAME} PRIVATE
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR} ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}
) )
target_link_libraries(${PROJECT_NAME} PRIVATE hgdriver 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 ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libhgdriver.so
) )

View File

@ -171,7 +171,7 @@ namespace local_utility
return str > bgn; return str > bgn;
} }
// æšä¸<EFBFBD>支æŒ<EFBFBD>ç§å­¦è®¡æ•°æ³?1.2e+10 // 暂不支持科学计数<EFBFBD>?1.2e+10
bool get_number(const char*& str, double& val) bool get_number(const char*& str, double& val)
{ {
const char* bgn = str; const char* bgn = str;
@ -381,6 +381,8 @@ hg_sane_middleware::~hg_sane_middleware()
void hg_sane_middleware::language_changed(int cp, void* param) 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) 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->unit = SANE_UNIT_NONE;
sod->size = values.size(); sod->size = values.size();
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
| SANE_CAP_AUTOMATIC; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€? | SANE_CAP_AUTOMATIC; // 硬件可设置默认<EFBFBD>?
if (values.size()) if (values.size())
{ {
sod->constraint_type = SANE_CONSTRAINT_STRING_LIST; 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->unit = SANE_UNIT_NONE;
sod->size = sizeof(SANE_Word); sod->size = sizeof(SANE_Word);
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
/*| SANE_CAP_AUTOMATIC*/; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€? /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认<EFBFBD>?
if (values.size()) 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->unit = SANE_UNIT_NONE;
sod->size = sizeof(SANE_Word); sod->size = sizeof(SANE_Word);
sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项 sod->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT // 软件可设置选项
/*| SANE_CAP_AUTOMATIC*/; // 硬件å<EFBFBD>¯è®¾ç½®é»˜è®¤å€? /*| SANE_CAP_AUTOMATIC*/; // 硬件可设置默认<EFBFBD>?
if (values.size()) 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) //if (jsn->get_value("enable", enabled) && !enabled)
// ret->cap |= SANE_CAP_INACTIVE; // ret->cap |= SANE_CAP_INACTIVE;
// å…³è<EFBFBD>”é¡? // 关联<EFBFBD>?
json* depend = NULL; json* depend = NULL;
SLAVEOP so; SLAVEOP so;
if (jsn->get_value("depend_or", depend)) 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) if (depend)
{ {
std::vector<LPDEVINST>::iterator it = find_openning_device_in_que(h); 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.enable_now = (ret->cap & SANE_CAP_INACTIVE) != SANE_CAP_INACTIVE;
so.name = name; so.name = name;
@ -1049,14 +1051,22 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, const st
return ret; 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) if (dev->std_opt)
delete dev->std_opt; delete dev->std_opt;
for (auto& v : dev->opts) for (auto& v : dev->opts)
local_utility::free_memory(v.desc); local_utility::free_memory(v.desc);
if(del)
delete dev; 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) 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 (IS_PTR_NUMBER(option))
{ {
if (id) if (id)
*id = (int)option; *id = (SANE_Int)(long long)option;
for (const auto& v : (*it)->opts) for (const auto& v : (*it)->opts)
{ {
if (v.option_no == (int)option) if (v.option_no == (SANE_Int)(long long)option)
return v.desc; 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); std::vector<LPDEVINST>::iterator it = find_openning_device_in_que(handle);
refresh_current_value(*it, name.c_str(), jsn); 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) if (setv == &hg_sane_middleware::set_value_to_new)
value = *(void**)value; 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]) && if (jsn->attach_text(&val[0]) &&
jsn->get_value("type", val)) jsn->get_value("type", val))
{ {
std::string title(""); std::string title(hg_sane_middleware::get_string_in_json(jsn, "title"));
jsn->get_value("title", title);
if (val == "bool") if (val == "bool")
{ {
bool v = false; 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) 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"); dev = (ScannerInfo*)local_utility::acquire_memory(sizeof(ScannerInfo) * count, "hg_sane_middleware::get_devices");
hgerr = hg_scanner_enum(dev, &count, local_only); hgerr = hg_scanner_enum(dev, &count, local_only);
if (hgerr != SCANNER_ERR_OK) if (hgerr != SCANNER_ERR_OK)
@ -1727,7 +1736,7 @@ bool hg_sane_middleware::is_ready(void)
} }
/// <summary> /// <summary>
/// å…³è<EFBFBD>”项处ç<EFBFBD>? /// 关联项处<EFBFBD>?
bool hg_sane_middleware::compare_val_equal(const char* cur_val, const char* limit_l, const char* limit_r) 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; 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; 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(""); std::string val(""), mn("");
bool ret = jsn->first_child(val); 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; mo.name = mn;
else else
mn = mo.name; 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); so.master.push_back(mo);
if (std::find(master.begin(), master.end(), mo.name) == master.end()) if (std::find(master.begin(), master.end(), mo.name) == master.end())
{ {

View File

@ -89,7 +89,7 @@ typedef struct _dev_inst
return dev == h; return dev == h;
} }
struct _dev_inst() _dev_inst()
{ {
dev = nullptr; dev = nullptr;
name = ""; name = "";
@ -171,7 +171,7 @@ class hg_sane_middleware
bool parse_master_option(const char* depend_str, MASTEROP& mo); 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 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); 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); 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); scanner_handle find_openning_device(SANE_Handle h, bool rmv = false, LPDEVINST* dev = NULL);
protected: protected: