From 89b46cc387a8f291e074b62ae145a19e36257c6d Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Fri, 6 May 2022 13:37:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E5=8F=8Agamma=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 3 +- hgdriver/hgdev/ImageMatQueue.cpp | 2 +- hgdriver/hgdev/common_setting.h | 4 +- hgdriver/hgdev/hg_scanner.cpp | 267 +++++++++++++++++++++++++++++- hgdriver/hgdev/hg_scanner.h | 34 +++- hgdriver/hgdev/hg_scanner_200.cpp | 172 ++++++++++--------- hgdriver/hgdev/hg_scanner_200.h | 20 ++- hgdriver/hgdev/image_process.cpp | 12 +- hgsane/sane_hg_mdw.cpp | 33 ++-- 9 files changed, 440 insertions(+), 107 deletions(-) diff --git a/build.sh b/build.sh index f03d290..0c31efa 100755 --- a/build.sh +++ b/build.sh @@ -9,9 +9,10 @@ elif [ "$sys" == "kylin" ];then sed -i "s/uos/$1/g" hgdriver/wrapper/CMakeLists.txt fi +cd ../ mkdir build cd build -cmake .. +cmake ../code_device make if [ $? -ne 0 ];then diff --git a/hgdriver/hgdev/ImageMatQueue.cpp b/hgdriver/hgdev/ImageMatQueue.cpp index 9aa8577..8278f0d 100644 --- a/hgdriver/hgdev/ImageMatQueue.cpp +++ b/hgdriver/hgdev/ImageMatQueue.cpp @@ -58,6 +58,6 @@ G400Decode::G400Decode(std::shared_ptr> buff,bool i) memcpy(buf->data(), buff->data(), bytes); m_buffs.push_back(buf);*/ m_buffs.push_back(buff); - printf("G400 :buff->size()=%d\r\n",buff->size()); + // printf("G400 :buff->size()=%d\r\n",buff->size()); } diff --git a/hgdriver/hgdev/common_setting.h b/hgdriver/hgdev/common_setting.h index fe47447..6bf8711 100644 --- a/hgdriver/hgdev/common_setting.h +++ b/hgdriver/hgdev/common_setting.h @@ -622,7 +622,9 @@ enum tagUsbKeyWords START_COMMAND_COUNT = 38, SET_SLEEP_TIME = 39, GET_SLEEP_TIME = 40, - CLR_HARDWARE_CACHE = 41 + CLR_HARDWARE_CACHE = 41, + + CHECK_IS_SLEEP = 0x100, }; //G100 G200 3399设备协议 - OVER diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index 3f49f94..32376ca 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -24,6 +24,11 @@ hg_scanner::hg_scanner(ScannerSerial serial , notify_setting_result_(false), user_cancel_(false), cb_mem_(true), test_1_paper_(false) , setting_count_(0),img_type_(""), online_(false) { + paper_size_mm_.cx = 210; + paper_size_mm_.cy = 297; + for (int i = 0; i < sizeof(custom_gamma_val_); ++i) + custom_gamma_val_[i] = i; + HG_VLOG_MINI_2(HG_LOG_LEVEL_DEBUG_INFO, "%s(%s) constructed\n", name_.c_str(), hg_log::format_ptr(this).c_str()); image_prc_param_.value = 0; @@ -446,6 +451,15 @@ int hg_scanner::restore(int setting_no) std::string val(""); sprintf(key, "%d", setting_no); + setting_jsn_.at(key).at("name").get_to(val); + if (val == KNOWN_OPT_NAME_CUSTOM_GAMMA) + { + for (size_t i = 0; i < sizeof(custom_gamma_val_); ++i) + custom_gamma_val_[i] = i; + + return HG_ERR_OK; + } + setting_jsn_.at(key).at("type").get_to(val); if (val == "string") { @@ -489,6 +503,16 @@ bool hg_scanner::get_default_value(void* buf, json* jsn) { std::string type(""); + jsn->at("name").get_to(type); + if (type == KNOWN_OPT_NAME_CUSTOM_GAMMA) + { + SANE_Int* gma = (SANE_Int*)buf; + for (size_t i = 0; i < sizeof(custom_gamma_val_); ++i) + gma[i] = i & 0x0ff; + + return true; + } + jsn->at("type").get_to(type); if (type == "bool") { @@ -659,6 +683,75 @@ void hg_scanner::working_done(void*) test_1_paper_ = false; } +void hg_scanner::reset_custom_area_range(int paper) +{ + if (paper == PAPER_A3) + { + paper_size_mm_.cx = 297; + paper_size_mm_.cy = 420; + } + else if (paper == PAPER_A4) + { + paper_size_mm_.cx = 210; + paper_size_mm_.cy = 297; + } + else if (paper == PAPER_A4_LATERAL) + { + paper_size_mm_.cx = 297; + paper_size_mm_.cy = 210; + } + else if (paper == PAPER_A5) + { + paper_size_mm_.cx = 148; + paper_size_mm_.cy = 210; + } + else if (paper == PAPER_A5_LATERAL) + { + paper_size_mm_.cx = 210; + paper_size_mm_.cy = 148; + } + else if (paper == PAPER_A6) + { + paper_size_mm_.cx = 105; + paper_size_mm_.cy = 148; + } + else if (paper == PAPER_A6_LATERAL) + { + paper_size_mm_.cx = 148; + paper_size_mm_.cy = 105; + } + else if (paper == PAPER_B4) + { + paper_size_mm_.cx = 250; + paper_size_mm_.cy = 353; + } + else if (paper == PAPER_B5) + { + paper_size_mm_.cx = 176; + paper_size_mm_.cy = 250; + } + else if (paper == PAPER_B6) + { + paper_size_mm_.cx = 125; + paper_size_mm_.cy = 176; + } + else if (paper == PAPER_B5_LATERAL) + { + paper_size_mm_.cx = 250; + paper_size_mm_.cy = 176; + } + else if (paper == PAPER_B6_LATERAL) + { + paper_size_mm_.cx = 176; + paper_size_mm_.cy = 125; + } + else + { + paper_size_mm_.cx = 2338; + paper_size_mm_.cy = 3307; + } +} + int hg_scanner::setting_restore(void* data) { // restore ... @@ -856,7 +949,9 @@ int hg_scanner::setting_paper(void* data) HG_VLOG_MINI_3(HG_LOG_LEVEL_DEBUG_INFO, "Change paper from %s to %s = %s\n", paper_string(old).c_str(), (char*)data, hg_scanner::strerr((hg_err)ret).c_str()); if(ret == HG_ERR_NOT_EXACT) - strcpy((char*)data, paper.c_str()); + strcpy((char*)data, paper.c_str()); + if(old != image_prc_param_.bits.paper) + reset_custom_area_range(image_prc_param_.bits.paper); return ret; } @@ -1248,6 +1343,69 @@ int hg_scanner::setting_skew_check_level(void* data) return ret; } +int hg_scanner::setting_is_custom_gamma(void* data) +{ + SANE_Bool* v = (SANE_Bool*)data; + + custom_gamma_ = *v == SANE_TRUE; + + return HG_ERR_OK; +} +int hg_scanner::setting_custom_gamma_data(void* data) +{ + SANE_Int* v = (SANE_Int*)data; + int len = 256; + + if (image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS || + image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH) + { + len = 3 * 256; + } + for (int i = 0; i < len; ++i) + custom_gamma_val_[i] = v[i]; + + return HG_ERR_OK; +} +int hg_scanner::setting_is_custom_area(void* data) +{ + SANE_Bool* v = (SANE_Bool*)data; + + custom_area_ = *v == SANE_TRUE; + + return HG_ERR_OK; +} +int hg_scanner::setting_custom_area_left(void* data) +{ + SANE_Fixed* v = (SANE_Fixed*)data; + + custom_area_lt_x_ = SANE_UNFIX(*v); + + return HG_ERR_OK; +} +int hg_scanner::setting_custom_area_top(void* data) +{ + SANE_Fixed* v = (SANE_Fixed*)data; + + custom_area_lt_y_ = SANE_UNFIX(*v); + + return HG_ERR_OK; +} +int hg_scanner::setting_custom_area_right(void* data) +{ + SANE_Fixed* v = (SANE_Fixed*)data; + + custom_area_br_x_ = SANE_UNFIX(*v); + + return HG_ERR_OK; +} +int hg_scanner::setting_custom_area_bottom(void* data) +{ + SANE_Fixed* v = (SANE_Fixed*)data; + + custom_area_br_y_ = SANE_UNFIX(*v); + + return HG_ERR_OK; +} int hg_scanner::on_color_mode_changed(int& color_mode) { @@ -1313,6 +1471,9 @@ void hg_scanner::init_settings(const char* json_setting_text) std::string val(""); sprintf(key, "%d", sn); + setting_jsn_.at(key).at("name").get_to(val); + if (val == KNOWN_OPT_NAME_CUSTOM_GAMMA) + continue; setting_jsn_.at(key).at("type").get_to(val); if (val == "string") { @@ -1576,6 +1737,11 @@ int hg_scanner::set_setting(int setting_no, void* data, int len) , &hg_scanner::setting_noise_optimize_range , &hg_scanner::setting_paper , &hg_scanner::setting_paper_check + , &hg_scanner::setting_is_custom_area + , &hg_scanner::setting_custom_area_left + , &hg_scanner::setting_custom_area_right + , &hg_scanner::setting_custom_area_top + , &hg_scanner::setting_custom_area_bottom , &hg_scanner::setting_page , &hg_scanner::setting_page_omit_empty , &hg_scanner::setting_resolution @@ -1584,9 +1750,11 @@ int hg_scanner::set_setting(int setting_no, void* data, int len) , &hg_scanner::setting_automatic_skew , &hg_scanner::setting_rid_hole , &hg_scanner::setting_rid_hoe_range + , &hg_scanner::setting_is_custom_gamma // 2022-05-05 , &hg_scanner::setting_bright , &hg_scanner::setting_contrast , &hg_scanner::setting_gamma + , &hg_scanner::setting_custom_gamma_data , &hg_scanner::setting_sharpen , &hg_scanner::setting_dark_sample , &hg_scanner::setting_erase_black_frame @@ -1608,8 +1776,7 @@ int hg_scanner::set_setting(int setting_no, void* data, int len) , &hg_scanner::setting_fractate_check , &hg_scanner::setting_fractate_check_level , &hg_scanner::setting_skew_check - , &hg_scanner::setting_skew_check_level - + , &hg_scanner::setting_skew_check_level }; bool hit = false; @@ -1702,19 +1869,88 @@ int hg_scanner::get_setting(int setting_no, char* json_txt_buf, int* len) return HG_ERR_OUT_OF_RANGE; char sn[20]; - std::string text(""); + std::string text(""), name(""), tag(""); + int add = 0; + bool is_gamma = false, is_area_x = false, is_area_y = false; sprintf(sn, "%d", setting_no); if (!setting_jsn_.contains(sn)) HG_VLOG_MINI_2(HG_LOG_LEVEL_FATAL, "!!!option(%d - %s) is not found.\n", setting_no, sn); text = setting_jsn_.at(sn).dump(); - if (*len <= text.length()) + setting_jsn_.at(sn).at("name").get_to(name); + if (name == KNOWN_OPT_NAME_CUSTOM_GAMMA) { - *len = text.length() + 8; + is_gamma = true; + add = 4 * sizeof(custom_gamma_val_); + } + else if (name == KNOWN_OPT_NAME_CUSTOM_AREA_LEFT || name == KNOWN_OPT_NAME_CUSTOM_AREA_RIGHT) + { + is_area_x = true; + add = 20; + } + else if (name == KNOWN_OPT_NAME_CUSTOM_AREA_TOP || name == KNOWN_OPT_NAME_CUSTOM_AREA_BOTTOM) + { + is_area_y = true; + add = 20; + } + if (*len <= text.length() + add) + { + *len = text.length() + 8 + add; return HG_ERR_INSUFFICIENT_MEMORY; } + if (is_gamma) + { + name = ""; + add = 256; + if (image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS || + image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH) + { + add = 3 * 256; + } + sprintf(sn, "[%u", custom_gamma_val_[0]); + name += sn; + for (int i = 1; i < add; ++i) + { + sprintf(sn, ",%u", custom_gamma_val_[i]); + name += sn; + } + name += "]"; + tag = "\"cur\":"; + } + else if (is_area_x) + { + sprintf(sn, "%u.0", paper_size_mm_.cx); + name = sn; + tag = "\"max\":"; + } + else if (is_area_y) + { + sprintf(sn, "%u.0", paper_size_mm_.cy); + name = sn; + tag = "\"max\":"; + } + if (!tag.empty()) + { + size_t pos = text.find(tag), end = pos; + if (pos != std::string::npos) + { + pos += tag.length(); + end = pos; + while (end < text.length()) + { + if (text[end] == ',' || text[end] == '}' || text[end] == ']' || text[end] == '\r' || text[end] == '\n') + break; + end++; + } + if (end > pos) + text.replace(pos, end - pos, name); + else + text.insert(end, name); + } + } + strcpy(json_txt_buf, text.c_str()); *len = text.length(); @@ -1958,6 +2194,25 @@ int hg_scanner::device_io_control(unsigned long code, void* data, unsigned* len) } return set_sleep_time(sleeptime); } + else if (code == IO_CTRL_CODE_GET_CUSTOM_GAMMA) + { + SANE_Int* v = (SANE_Int*)data; + int count = *len; + for (int i = 0; i < count && i < sizeof(custom_gamma_val_); ++i) + v[i] = custom_gamma_val_[i]; + + return HG_ERR_OK; + } + else if (code == IO_CTRL_CODE_GET_CUSTOM_GAMMA) + { + SANE_Int* v = (SANE_Int*)data; + int count = *len; + for (int i = 0; i < count && i < sizeof(custom_gamma_val_); ++i) + custom_gamma_val_[i] = v[i]; + + return HG_ERR_OK; + } + return HG_ERR_DEVICE_NOT_SUPPORT; } std::string hg_scanner::get_firmware_version(void) diff --git a/hgdriver/hgdev/hg_scanner.h b/hgdriver/hgdev/hg_scanner.h index 02f62cd..fe88ed7 100644 --- a/hgdriver/hgdev/hg_scanner.h +++ b/hgdriver/hgdev/hg_scanner.h @@ -19,6 +19,8 @@ #include "common_setting.h" #include "image_process.h" #include "StopWatch.h" +#include "PaperSize.h" + #ifdef WIN32 #else #include @@ -38,6 +40,11 @@ enum HG_BASE_SETTING_INDEX_NOISE_OPTIMIZE_SIZE, // 噪点优化尺寸 HG_BASE_SETTING_INDEX_PAPER, // 纸张尺寸 HG_BASE_SETTING_INDEX_PAPER_SIZE_CHECK, // 尺寸检测 + HG_BASE_SETTING_INDEX_IS_CUSTOM_AREA, // 是否启用自定义区域 + HG_BASE_SETTING_INDEX_CUSTOM_AREA_LEFT, // 自定义区域左侧(mm) + HG_BASE_SETTING_INDEX_CUSTOM_AREA_RIGHT, // 自定义区域右侧(mm) + HG_BASE_SETTING_INDEX_CUSTOM_AREA_TOP, // 自定义区域上侧(mm) + HG_BASE_SETTING_INDEX_CUSTOM_AREA_BOTTOM, // 自定义区域下侧(mm) HG_BASE_SETTING_INDEX_PAGE, // 扫描页面 HG_BASE_SETTING_INDEX_PAGE_OMIT_EMPTY_LEVEL, // 跳过空白页灵敏度 HG_BASE_SETTING_INDEX_RESOLUTION, // 分辨率 @@ -46,9 +53,11 @@ enum HG_BASE_SETTING_INDEX_AUTO_CORRECT, // 自动纠偏 HG_BASE_SETTING_INDEX_RID_HOLE, // 穿孔移除 HG_BASE_SETTING_INDEX_RID_HOLE_RANGE, // 穿孔搜索范围 + HG_BASE_SETTING_INDEX_IS_CUSTOM_GAMMA, // 是否启用自定义伽玛 HG_BASE_SETTING_INDEX_BRIGHT, // 亮度 HG_BASE_SETTING_INDEX_CONTRAST, // 对比度 HG_BASE_SETTING_INDEX_GAMMA, // 伽玛 + HG_BASE_SETTING_INDEX_CUSTOM_GAMMA_DATA, // 自定义伽玛数据 HG_BASE_SETTING_INDEX_SHARPEN, // 锐化与模糊 HG_BASE_SETTING_INDEX_DARK_SAMPLE, // 深色样张 HG_BASE_SETTING_INDEX_ERASE_BLACK_FRAME, // 消除黑框 @@ -103,6 +112,8 @@ class hg_scanner void working_begin(void*); void working_done(void*); + void reset_custom_area_range(int paper); + // 设置接口 protected: @@ -161,7 +172,14 @@ protected: int setting_fractate_check_level(void* data); int setting_skew_check(void* data); int setting_skew_check_level(void* data); - + int setting_is_custom_gamma(void* data); + int setting_custom_gamma_data(void* data); + int setting_is_custom_area(void* data); + int setting_custom_area_left(void* data); + int setting_custom_area_top(void* data); + int setting_custom_area_right(void* data); + int setting_custom_area_bottom(void* data); + virtual int on_color_mode_changed(int& color_mode); // COLOR_MODE_xxx virtual int on_paper_changed(int& paper); // PAPER_xxx @@ -231,6 +249,20 @@ protected: int save_usb_data(std::shared_ptr> data); int save_final_image(hg_imgproc::LPIMGHEAD head, void* buf); + + //////////////////////////////////////////////////////////////// + // 新增自定义伽玛曲线及扫描区域属性 - 2022-05-05 + bool custom_gamma_; // 为true时,应用custom_gamma_val_阵列调整图像色彩;为false时,保持原来的处理方式 + uint8_t custom_gamma_val_[3 * 256]; // 当为RGB或者彩色时,为三组256字节的数据;当为黑白或灰度时,只有一组256字节 + bool custom_area_; // 是否启用自定义区域,为true时才使用下列4个数据;为false时保持原来的处理方式 + double custom_area_lt_x_; // 自定义区域左上角x坐标 + double custom_area_lt_y_; // 自定义区域左上角y坐标 + double custom_area_br_x_; // 自定义区域右下角x坐标 + double custom_area_br_y_; // 自定义区域右下角y坐标 + SIZE paper_size_mm_; // 当前纸张尺寸(mm) + // 新增自定义伽玛曲线及扫描区域属性 - END + //////////////////////////////////////////////////////////////// + public: void set_ui_callback(sane_callback cb, bool enable_async_io); int reset_io(usb_io* io); diff --git a/hgdriver/hgdev/hg_scanner_200.cpp b/hgdriver/hgdev/hg_scanner_200.cpp index 0fac0f4..b6f1a26 100644 --- a/hgdriver/hgdev/hg_scanner_200.cpp +++ b/hgdriver/hgdev/hg_scanner_200.cpp @@ -6,7 +6,7 @@ #endif -static std::string jsontext("{\"device_type\":\"G100\",\"option_count\":47,\"1\":{\"category\":\"base\",\"name\":\"cfg-1\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"2\":{\"category\":\"advanced\",\"name\":\"cfg-2\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"3\":{\"category\":\"base\",\"name\":\"grp-1\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\"},\"4\":{\"category\":\"base\",\"name\":\"cfg-4\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u8bbe\\u7f6e\\u989c\\u8272\\u4f4d\\u6df1\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":24,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"5\":{\"category\":\"base\",\"name\":\"cfg-5\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\",\"desc\":\"\\u9664\\u53bb\\u56fe\\u50cf\\u5f69\\u8272\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":20,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_or\":[\"4==256\\u7ea7\\u7070\\u5ea6\",\"4==\\u9ed1\\u767d\"]},\"6\":{\"category\":\"base\",\"name\":\"cfg-6\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u591a\\u901a\\u9053\\u8f93\\u51fa\\u4e2d\\uff0c\\u53bb\\u9664\\u7ea2\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"7\":{\"category\":\"base\",\"name\":\"cfg-7\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u7b54\\u9898\\u5361\\u626b\\u63cf\\u4e2d\\u53bb\\u9664\\u7ea2\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"8\":{\"category\":\"base\",\"name\":\"cfg-8\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u5f69\\u8272\\u56fe\\u50cf\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"9\":{\"category\":\"base\",\"name\":\"cfg-9\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u8bbe\\u5b9a\\u80cc\\u666f\\u8272\\u5f69\\u7684\\u6d6e\\u52a8\\u8303\\u56f4\\uff0c\\u5728\\u8be5\\u8303\\u56f4\\u5185\\u7684\\u90fd\\u5f53\\u4f5c\\u80cc\\u666f\\u79fb\\u9664\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":40},\"depend_or\":[\"8==true\"]},\"10\":{\"category\":\"base\",\"name\":\"cfg-10\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==\\u9ed1\\u767d\"]},\"11\":{\"category\":\"base\",\"name\":\"cfg-11\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":10,\"max\":50},\"depend_or\":[\"10==true\"]},\"12\":{\"category\":\"base\",\"name\":\"cfg-12\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u7eb8\\u5f20\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":44,\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"13\":{\"category\":\"base\",\"name\":\"cfg-13\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":40,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"14\":{\"category\":\"base\",\"name\":\"cfg-14\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u7075\\u654f\\u5ea6\\u8d8a\\u9ad8\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":50,\"default\":50,\"size\":4,\"range\":{\"min\":1,\"max\":100},\"depend_or\":[\"13==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"13==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"15\":{\"category\":\"base\",\"name\":\"cfg-15\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":300}},\"16\":{\"category\":\"base\",\"name\":\"cfg-16\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"13!=\\u5355\\u9762\"]},\"17\":{\"category\":\"base\",\"name\":\"cfg-17\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"13!=\\u5bf9\\u6298\"]},\"18\":{\"category\":\"base\",\"name\":\"cfg-18\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"13!=\\u5bf9\\u6298\"]},\"19\":{\"category\":\"base\",\"name\":\"cfg-19\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u7eb8\\u5f20\\u4e2d\\u7684\\u7a7f\\u5b54\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"20\":{\"category\":\"base\",\"name\":\"cfg-20\",\"title\":\" \\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":0.500000},\"depend_or\":[\"19==true\"]},\"21\":{\"category\":\"base\",\"name\":\"grp-2\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\"},\"22\":{\"category\":\"base\",\"name\":\"cfg-22\",\"title\":\"\\u4eae\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u7247\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255}},\"23\":{\"category\":\"base\",\"name\":\"cfg-23\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u7247\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7}},\"24\":{\"category\":\"base\",\"name\":\"cfg-24\",\"title\":\"\\u4f3d\\u739b\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u7247\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000}},\"25\":{\"category\":\"base\",\"name\":\"grp-3\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\"},\"26\":{\"category\":\"base\",\"name\":\"cfg-26\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":20,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"]},\"27\":{\"category\":\"base\",\"name\":\"cfg-27\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"28\":{\"category\":\"base\",\"name\":\"cfg-28\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"13!=\\u5bf9\\u6298\",\"27!=true\",\"12!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"12!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"18!=true\"]},\"29\":{\"category\":\"advanced\",\"name\":\"cfg-29\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u9608\\u503c\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50},\"depend_or\":[\"27==true\",\"12==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"18==true\"]},\"30\":{\"category\":\"advanced\",\"name\":\"cfg-30\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20},\"depend_or\":[\"27==true\",\"12==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"18==true\"]},\"31\":{\"category\":\"advanced\",\"name\":\"cfg-31\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":5,\"max\":30},\"depend_or\":[\"27==true\",\"12==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"18==true\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\"]},\"32\":{\"category\":\"advanced\",\"name\":\"cfg-32\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"27==true\"]},\"33\":{\"category\":\"base\",\"name\":\"cfg-33\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"34\":{\"category\":\"base\",\"name\":\"cfg-34\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":12,\"range\":[\"\\u8f83\\u5f31\",\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\",\"\\u8f83\\u5f3a\"],\"depend_or\":[\"33==true\"]},\"35\":{\"category\":\"base\",\"name\":\"cfg-35\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"36\":{\"category\":\"base\",\"name\":\"cfg-36\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"37\":{\"category\":\"base\",\"name\":\"cfg-37\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"38\":{\"category\":\"base\",\"name\":\"grp-4\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\"},\"39\":{\"category\":\"base\",\"name\":\"cfg-39\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\\u9001\\u7eb8\\u72b6\\u6001\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"40\":{\"category\":\"base\",\"name\":\"cfg-40\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u4e0a\\u662f\\u5426\\u6709\\u9489\\u4e66\\u9489\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"41\":{\"category\":\"base\",\"name\":\"cfg-41\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u626b\\u63cf\\u7eb8\\u5f20\\u6570\\u91cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":24,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"42\":{\"category\":\"base\",\"name\":\"cfg-42\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":1,\"default\":1,\"size\":4,\"depend_or\":[\"41==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"43\":{\"category\":\"base\",\"name\":\"cfg-43\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":16,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\"]},\"44\":{\"category\":\"base\",\"name\":\"cfg-44\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"13!=\\u5355\\u9762\",\"13!=\\u5bf9\\u6298\",\"43!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"45\":{\"category\":\"base\",\"name\":\"cfg-45\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u7eb8\\u5f20\\u6b6a\\u659c\\u68c0\\u6d4b\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"46\":{\"category\":\"base\",\"name\":\"cfg-46\",\"title\":\" \\u6b6a\\u659c\\u68c0\\u6d4b\\u590d\\u6742\\u5ea6\",\"desc\":\"\\u7eb8\\u5f20\\u6b6a\\u659c\\u68c0\\u6d4b\\u590d\\u6742\\u5ea6\",\"type\":\"int\",\"cur\":3,\"default\":3,\"size\":4,\"range\":{\"min\":1,\"max\":5},\"depend_or\":[\"45==true\"]}}"); +static std::string jsontext("{\"device_type\":\"G100\",\"option_count\":53,\"1\":{\"category\":\"base\",\"name\":\"cfg-1\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"2\":{\"category\":\"advanced\",\"name\":\"cfg-2\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"3\":{\"category\":\"base\",\"name\":\"grp-1\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\"},\"4\":{\"category\":\"base\",\"name\":\"cfg-4\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u8bbe\\u7f6e\\u989c\\u8272\\u4f4d\\u6df1\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"5\":{\"category\":\"base\",\"name\":\"cfg-5\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\",\"desc\":\"\\u9664\\u53bb\\u56fe\\u50cf\\u5f69\\u8272\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_or\":[\"4==256\\u7ea7\\u7070\\u5ea6\",\"4==\\u9ed1\\u767d\"]},\"6\":{\"category\":\"base\",\"name\":\"cfg-6\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u591a\\u901a\\u9053\\u8f93\\u51fa\\u4e2d\\uff0c\\u53bb\\u9664\\u7ea2\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"7\":{\"category\":\"base\",\"name\":\"cfg-7\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u7b54\\u9898\\u5361\\u626b\\u63cf\\u4e2d\\u53bb\\u9664\\u7ea2\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"8\":{\"category\":\"base\",\"name\":\"cfg-8\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u5f69\\u8272\\u56fe\\u50cf\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"9\":{\"category\":\"base\",\"name\":\"cfg-9\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u8bbe\\u5b9a\\u80cc\\u666f\\u8272\\u5f69\\u7684\\u6d6e\\u52a8\\u8303\\u56f4\\uff0c\\u5728\\u8be5\\u8303\\u56f4\\u5185\\u7684\\u90fd\\u5f53\\u4f5c\\u80cc\\u666f\\u79fb\\u9664\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":40},\"depend_or\":[\"8==true\"]},\"10\":{\"category\":\"base\",\"name\":\"cfg-10\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==\\u9ed1\\u767d\"]},\"11\":{\"category\":\"base\",\"name\":\"cfg-11\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":10,\"max\":50},\"depend_or\":[\"10==true\"]},\"12\":{\"category\":\"base\",\"name\":\"cfg-12\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u7eb8\\u5f20\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"13\":{\"category\":\"base\",\"name\":\"cfg-13\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"14\":{\"category\":\"base\",\"name\":\"tl-x\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000},\"depend_and\":[\"13==true\"]},\"15\":{\"category\":\"base\",\"name\":\"br-x\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000},\"depend_and\":[\"13==true\"]},\"16\":{\"category\":\"base\",\"name\":\"tl-y\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000},\"depend_and\":[\"13==true\"]},\"17\":{\"category\":\"base\",\"name\":\"br-y\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000},\"depend_and\":[\"13==true\"]},\"18\":{\"category\":\"base\",\"name\":\"cfg-18\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":40,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"19\":{\"category\":\"base\",\"name\":\"cfg-19\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u7075\\u654f\\u5ea6\\u8d8a\\u9ad8\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":50,\"default\":50,\"size\":4,\"range\":{\"min\":1,\"max\":100},\"depend_or\":[\"18==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"18==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"20\":{\"category\":\"base\",\"name\":\"cfg-20\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":300}},\"21\":{\"category\":\"base\",\"name\":\"cfg-21\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"18!=\\u5355\\u9762\"]},\"22\":{\"category\":\"base\",\"name\":\"cfg-22\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"18!=\\u5bf9\\u6298\"]},\"23\":{\"category\":\"base\",\"name\":\"cfg-23\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"18!=\\u5bf9\\u6298\"]},\"24\":{\"category\":\"base\",\"name\":\"cfg-24\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u7eb8\\u5f20\\u4e2d\\u7684\\u7a7f\\u5b54\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"25\":{\"category\":\"base\",\"name\":\"cfg-25\",\"title\":\" \\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":0.500000},\"depend_or\":[\"24==true\"]},\"26\":{\"category\":\"base\",\"name\":\"grp-2\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\"},\"27\":{\"category\":\"base\",\"name\":\"cfg-27\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u901a\\u8fc7\\u8272\\u8c03\\u66f2\\u7ebf\\u6765\\u8bbe\\u7f6e\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"28\":{\"category\":\"base\",\"name\":\"cfg-28\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u7247\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255},\"depend_and\":[\"27==false\"]},\"29\":{\"category\":\"base\",\"name\":\"cfg-29\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u7247\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7},\"depend_and\":[\"27==false\"]},\"30\":{\"category\":\"base\",\"name\":\"cfg-30\",\"title\":\"\\u4f3d\\u739b\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u7247\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000},\"depend_and\":[\"27==false\"]},\"31\":{\"category\":\"base\",\"name\":\"grp-3\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\"},\"32\":{\"category\":\"base\",\"name\":\"cfg-32\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"]},\"33\":{\"category\":\"base\",\"name\":\"cfg-33\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"34\":{\"category\":\"base\",\"name\":\"cfg-34\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"18!=\\u5bf9\\u6298\",\"33!=true\",\"12!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"12!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"23!=true\"]},\"35\":{\"category\":\"advanced\",\"name\":\"cfg-35\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u9608\\u503c\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50},\"depend_or\":[\"33==true\",\"12==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"23==true\"]},\"36\":{\"category\":\"advanced\",\"name\":\"cfg-36\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20},\"depend_or\":[\"33==true\",\"12==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"23==true\"]},\"37\":{\"category\":\"advanced\",\"name\":\"cfg-37\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":5,\"max\":30},\"depend_or\":[\"33==true\",\"12==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"23==true\",\"12==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\"]},\"38\":{\"category\":\"advanced\",\"name\":\"cfg-38\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"33==true\"]},\"39\":{\"category\":\"base\",\"name\":\"cfg-39\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"40\":{\"category\":\"base\",\"name\":\"cfg-40\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u8f83\\u5f31\",\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\",\"\\u8f83\\u5f3a\"],\"depend_or\":[\"39==true\"]},\"41\":{\"category\":\"base\",\"name\":\"cfg-41\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"42\":{\"category\":\"base\",\"name\":\"cfg-42\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"43\":{\"category\":\"base\",\"name\":\"cfg-43\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"44\":{\"category\":\"base\",\"name\":\"grp-4\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\"},\"45\":{\"category\":\"base\",\"name\":\"cfg-45\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\\u9001\\u7eb8\\u72b6\\u6001\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"46\":{\"category\":\"base\",\"name\":\"cfg-46\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u4e0a\\u662f\\u5426\\u6709\\u9489\\u4e66\\u9489\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"47\":{\"category\":\"base\",\"name\":\"cfg-47\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u626b\\u63cf\\u7eb8\\u5f20\\u6570\\u91cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"48\":{\"category\":\"base\",\"name\":\"cfg-48\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":1,\"default\":1,\"size\":4,\"depend_or\":[\"47==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"49\":{\"category\":\"base\",\"name\":\"cfg-49\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"50\":{\"category\":\"base\",\"name\":\"cfg-50\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"18!=\\u5355\\u9762\",\"18!=\\u5bf9\\u6298\",\"49!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"51\":{\"category\":\"base\",\"name\":\"cfg-51\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u7eb8\\u5f20\\u6b6a\\u659c\\u68c0\\u6d4b\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"52\":{\"category\":\"base\",\"name\":\"cfg-52\",\"title\":\" \\u6b6a\\u659c\\u68c0\\u6d4b\\u590d\\u6742\\u5ea6\",\"desc\":\"\\u7eb8\\u5f20\\u6b6a\\u659c\\u68c0\\u6d4b\\u590d\\u6742\\u5ea6\",\"type\":\"int\",\"cur\":3,\"default\":3,\"size\":4,\"range\":{\"min\":1,\"max\":5},\"depend_or\":[\"51==true\"]}}"); namespace settingsdsp_200 { hg_err device_status_to_hg_err(int usbdata, bool *fatal) @@ -147,6 +147,11 @@ enum hg_239_setting_item HG_239_SETTING_NOISE, // 黑白图像噪点优化 HG_239_SETTING_NOISE_SIZE, // 噪点优化尺寸 HG_239_SETTING_PAPER_SIZE, // 纸张尺寸 + HG_200_SETTING_CUSTOM_AREA, // 自定义扫描区域 + HG_200_SETTING_CUSTOM_AREA_LEFT, // 扫描区域左侧(mm) + HG_200_SETTING_CUSTOM_AREA_RIGHT, // 扫描区域右侧(mm) + HG_200_SETTING_CUSTOM_AREA_TOP, // 扫描区域上侧(mm) + HG_200_SETTING_CUSTOM_AREA_BOTTOM, // 扫描区域下侧(mm) //HG_239_SETTING_PAPER_SIZE_CHECK, // 尺寸检测 HG_239_SETTING_PAGE, // 扫描页面 HG_239_SETTING_SKIP_NILL, // 跳过空白页灵敏度 @@ -158,10 +163,11 @@ enum hg_239_setting_item HG_239_SETTING_HOLE_SEARCH, // 穿孔搜索范围 HG__239_SETTING_GROUP_2, - + HG_200_SETTING_CUSTOM_GAMMA, // 启用色调曲线 HG_239_SETTING_LIGHT, // 亮度 HG_239_SETTING_CONTRAST, // 对比度 HG_239_SETTING_GAMMA, // 伽玛 +// HG_200_SETTING_CUSTOM_GAMMA_DATA, // 自定义伽玛 数据为SANE_Int[3 * 256] HG__239_SETTING_GROUP_3, @@ -200,8 +206,13 @@ enum hg_239_setting_item -hg_scanner_200::hg_scanner_200(const char* dev_name,int pid, usb_io* io) : hg_scanner(G100Serial, dev_name, io),pid_(pid) +hg_scanner_200::hg_scanner_200(const char* dev_name,int pid, usb_io* io) : hg_scanner(G100Serial, dev_name, io), pid_(pid) + , buf_read_img_len_(512 * 1024), buf_read_img_(nullptr), io_read_img_(0) { +#ifdef WIN32 + buf_read_img_ = new char[buf_read_img_len_]; +#endif + string fw = get_firmware_version(); HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO, "get_firmware_version is: %s\n",fw.c_str()); // initdevice(); @@ -214,32 +225,35 @@ hg_scanner_200::hg_scanner_200(const char* dev_name,int pid, usb_io* io) : hg_sc printf_devconfig(); } hg_scanner_200::~hg_scanner_200() -{} +{ + if (buf_read_img_) + delete[] buf_read_img_; +} void hg_scanner_200::discard_prev(void) { - USBCB usb = { 0 }; - int ret = get_scanner_status(usb), + int ret = get_scanner_status(), imgs = 0, packets = 0, normal = 0; while (ret == HG_ERR_OK) { - if (usb.u32_Data == HAVE_IMAGE) + if (buf_statu_.data.u32_Data == HAVE_IMAGE) { pop_image(); imgs++; normal = 0; packets++; } - else if (usb.u32_Data == NORMAL) + else if (buf_statu_.data.u32_Data == NORMAL) { if(normal++ > 10) break; } else packets++; + ret = get_scanner_status(); } if (imgs || packets) HG_VLOG_MINI_2(HG_LOG_LEVEL_DEBUG_INFO, "discard prev-scanning %d packets and %d images.\n", packets, imgs); @@ -261,6 +275,11 @@ void hg_scanner_200::init_setting_map(int* setting_map, int count) setting_map[HG_BASE_SETTING_INDEX_NOISE_OPTIMIZE_SIZE] = HG_239_SETTING_NOISE_SIZE; setting_map[HG_BASE_SETTING_INDEX_PAPER] = HG_239_SETTING_PAPER_SIZE; //setting_map[HG_BASE_SETTING_INDEX_PAPER_SIZE_CHECK] = HG_239_SETTING_PAPER_SIZE_CHECK; + setting_map[HG_BASE_SETTING_INDEX_IS_CUSTOM_AREA] = HG_200_SETTING_CUSTOM_AREA; + setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_LEFT] = HG_200_SETTING_CUSTOM_AREA_LEFT; + setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_RIGHT] = HG_200_SETTING_CUSTOM_AREA_RIGHT; + setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_TOP] = HG_200_SETTING_CUSTOM_AREA_TOP; + setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_BOTTOM] = HG_200_SETTING_CUSTOM_AREA_BOTTOM; setting_map[HG_BASE_SETTING_INDEX_PAGE] = HG_239_SETTING_PAGE; setting_map[HG_BASE_SETTING_INDEX_PAGE_OMIT_EMPTY_LEVEL] = HG_239_SETTING_SKIP_NILL; setting_map[HG_BASE_SETTING_INDEX_RESOLUTION] = HG_239_SETTING_RESOLUTION; @@ -270,9 +289,11 @@ void hg_scanner_200::init_setting_map(int* setting_map, int count) setting_map[HG_BASE_SETTING_INDEX_RID_HOLE] = HG_239_SETTING_ERASE_HOLE; setting_map[HG_BASE_SETTING_INDEX_RID_HOLE_RANGE] = HG_239_SETTING_HOLE_SEARCH; + setting_map[HG_BASE_SETTING_INDEX_IS_CUSTOM_GAMMA] = HG_200_SETTING_CUSTOM_GAMMA; setting_map[HG_BASE_SETTING_INDEX_BRIGHT] = HG_239_SETTING_LIGHT; setting_map[HG_BASE_SETTING_INDEX_CONTRAST] = HG_239_SETTING_CONTRAST; setting_map[HG_BASE_SETTING_INDEX_GAMMA] = HG_239_SETTING_GAMMA; + setting_map[HG_BASE_SETTING_INDEX_CUSTOM_GAMMA_DATA] = HG_239_SETTING_END + 1; // HG_200_SETTING_CUSTOM_GAMMA_DATA; setting_map[HG_BASE_SETTING_INDEX_SHARPEN] = HG_239_SETTING_SHARP; setting_map[HG_BASE_SETTING_INDEX_DARK_SAMPLE] = HG_239_SETTING_SAMPLE; @@ -322,8 +343,7 @@ void hg_scanner_200::thread_handle_usb_read(void) break; } - USBCB usb = {0}; - ret = get_scanner_status(usb); + ret = get_scanner_status(); if (ret == HG_ERR_DEVICE_NOT_FOUND) { @@ -331,9 +351,9 @@ void hg_scanner_200::thread_handle_usb_read(void) status_ = ret; break; } - else if (usb.u32_Data == HAVE_IMAGE) + else if (buf_statu_.data.u32_Data == HAVE_IMAGE) { - ret = get_img_data(usb.u32_Count); + ret = get_img_data(buf_statu_.data.u32_Count); io_->set_timeout(200); pop_image(); sw.reset(); @@ -352,10 +372,10 @@ void hg_scanner_200::thread_handle_usb_read(void) { // if the error occurs at the 2nd paper, then the first normal paper maybe lost, we delay 2 seconds here ... std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - get_scanner_status(usb); - if (usb.u32_Data == HAVE_IMAGE) + get_scanner_status(); + if (buf_statu_.data.u32_Data == HAVE_IMAGE) { - get_img_data(usb.u32_Count); + get_img_data(buf_statu_.data.u32_Count); io_->set_timeout(200); pop_image(); sw.reset(); @@ -463,21 +483,6 @@ int hg_scanner_200::writeusb(USBCB &usb) return ret; } -int hg_scanner_200::readusb(USBCB &usb) -{ - std::lock_guard lock(io_lock_); - - int ret = HG_ERR_OK; - int len = sizeof(USBCB); - - ret = io_->read_bulk(&usb,&len); - if (ret) - { - status_ = ret; - } - - return ret; -} int hg_scanner_200::pop_image() { int ret = HG_ERR_OK; @@ -487,35 +492,43 @@ int hg_scanner_200::pop_image() return ret; } -int hg_scanner_200::get_scanner_status(USBCB &usb) +int hg_scanner_200::get_scanner_status(void) { int ret = HG_ERR_OK; - usb = {GET_DSP_STATUS, 0, 0}; + buf_statu_ = {GET_DSP_STATUS, 0, 0}; - ret = writeusb(usb); + ret = writeusb(buf_statu_.data); if (ret != HG_ERR_OK) return ret; + buf_statu_.len = sizeof(buf_statu_.data); io_->set_timeout(500); - - ret = readusb(usb); + { + std::lock_guard lock(io_lock_); + ret = io_->read_bulk(&buf_statu_.data, &buf_statu_.len); + } if (ret != HG_ERR_OK) { status_ = ret; return ret; } - return settingsdsp_200::device_status_to_hg_err(usb.u32_Data, nullptr); + return settingsdsp_200::device_status_to_hg_err(buf_statu_.data.u32_Data, nullptr); } int hg_scanner_200::get_img_data(unsigned int bytes) { - int total = bytes, - ret = HG_ERR_OK, - index = 0, - block = total; + int total = bytes, + ret = HG_ERR_OK; std::shared_ptr> imagedata(new std::vector(total)); +#ifdef WIN32 + char* buf = buf_read_img_; +#else + char* buf = imagedata->data(); +#endif + char* dst = imagedata->data(); + USBCB usb{GET_IMAGE, 0, total}; ret = writeusb(usb); if (ret != HG_ERR_OK) @@ -523,22 +536,27 @@ int hg_scanner_200::get_img_data(unsigned int bytes) status_ = ret; return ret; } - io_->set_timeout(500); + io_->set_timeout(2000); while (total > 0) { - block = 512 * 1024; + io_read_img_ = buf_read_img_len_; - if (total < block) - block = total; + if (total < io_read_img_) + io_read_img_ = total; - ret = io_->read_bulk(imagedata->data() + index,&block); - io_->set_timeout(500); //不能删除可能会导致IO超时 + ret = io_->read_bulk(buf, &io_read_img_); + if (ret != HG_ERR_OK) break; - index += block; - total -= block; +#ifdef WIN32 + memcpy(dst, buf, io_read_img_); + dst += io_read_img_; +#else + buf += io_read_img_; +#endif + total -= io_read_img_; } if (ret == HG_ERR_OK) { @@ -1106,36 +1124,36 @@ void hg_scanner_200::printf_devconfig(HGSCANCONF_DSP *d) } std::string hg_scanner_200::get_firmware_version() { - char buf[20] = { 0 }; int ret = HG_ERR_OK, len = 8; //协议定义长度为8 300 400 =10 USBCB cmd = {GET_FW_VERSION, len, 0,}; + memset(buf_mini_str_, 0, sizeof(buf_mini_str_)); ret = writeusb(cmd); if(ret == HG_ERR_OK) { std::lock_guard lock(io_lock_); - ret = io_->read_bulk(buf, &len); + ret = io_->read_bulk(buf_mini_str_, &len); } - return buf; + return buf_mini_str_; } std::string hg_scanner_200::get_serial_num() { - char buf[20] = { 0 }; int ret = HG_ERR_OK, len = 12; //协议定义长度为8 300 400 =10 USBCB cmd = {GET_SERIAL, len, 0,}; + memset(buf_mini_str_, 0, sizeof(buf_mini_str_)); ret = writeusb(cmd); if (ret == HG_ERR_OK) { std::lock_guard lock(io_lock_); - ret = io_->read_bulk(buf, &len); + ret = io_->read_bulk(buf_mini_str_, &len); } - return buf; + return buf_mini_str_; } @@ -1211,16 +1229,19 @@ int hg_scanner_200::get_sleep_time(SANE_Power* getime) { return ret; } - len = sizeof(usbcb); - ret = io_->read_bulk(&usbcb,&len); - printf("usbcb.u32_Data = %d\r\n",usbcb.u32_Data); + buf_sleep_.data = usbcb; + buf_sleep_.len = sizeof(buf_sleep_.data); + { + std::lock_guard lock(io_lock_); + ret = io_->read_bulk(&buf_sleep_.data, &buf_sleep_.len); + } if (ret == HG_ERR_OK) { if (getime) { - *getime = (SANE_Power)usbcb.u32_Data; + *getime = (SANE_Power)buf_sleep_.data.u32_Data; } - if (usbcb.u32_Data) + if (buf_sleep_.data.u32_Data) { return HG_ERR_DEVICE_SLEEPING; } @@ -1261,22 +1282,19 @@ int hg_scanner_200::get_scanner_paperon(SANE_Bool* paperon) ret = writeusb(usbcb); io_->set_timeout(500); + buf_paper_on_.data = usbcb; + buf_paper_on_.len = sizeof(buf_paper_on_.data); if (ret == HG_ERR_OK) { - ret = io_->read_bulk(&usbcb,&len); + std::lock_guard lock(io_lock_); + ret = io_->read_bulk(&buf_paper_on_.data, &buf_paper_on_.len); + if (ret == HG_ERR_OK && buf_paper_on_.data.u32_Data == 0) + ret = HG_ERR_DEVICE_NO_PAPER; } - if (ret != HG_ERR_OK) - { - return ret; - } - if (usbcb.u32_Data == 0) - ret = HG_ERR_DEVICE_NO_PAPER; - else - ret = HG_ERR_OK; + if (paperon) - { - *paperon = usbcb.u32_Data; - } + *paperon = buf_paper_on_.data.u32_Data; + return ret; } int hg_scanner_200::set_scan_when_paper_on(void) @@ -1300,25 +1318,27 @@ int hg_scanner_200::get_scan_is_sleep() int ret = HG_ERR_OK, len = 0; - USBCB usbcb = {0x100, 0, 0}; - len = sizeof(USBCB); + USBCB usbcb = { CHECK_IS_SLEEP, 0, 0}; + buf_is_sleep_.data = usbcb; + buf_is_sleep_.len = len = sizeof(USBCB); ret = writeusb(usbcb); io_->set_timeout(200); if (ret == HG_ERR_OK) { - ret = io_->read_bulk(&usbcb,&len); + std::lock_guard lock(io_lock_); + ret = io_->read_bulk(&buf_is_sleep_.data, &buf_is_sleep_.len); } if (ret != HG_ERR_OK) { return ret; } - if (usbcb.u32_Data == 0x10) + if (buf_is_sleep_.data.u32_Data == 0x10) { return HG_ERR_OK; } - else if (usbcb.u32_Data == 0x100) + else if (buf_is_sleep_.data.u32_Data == 0x100) { return HG_ERR_DEVICE_SLEEPING; } diff --git a/hgdriver/hgdev/hg_scanner_200.h b/hgdriver/hgdev/hg_scanner_200.h index d1bcbba..e09d1c5 100644 --- a/hgdriver/hgdev/hg_scanner_200.h +++ b/hgdriver/hgdev/hg_scanner_200.h @@ -15,6 +15,23 @@ class hg_scanner_200 : public hg_scanner { + // reading buffers ... (for overlapped IO maybe rewrite the buffer after the timeout) + typedef struct _usb_block + { + USBCB data; + int len; + }USBBLOCK; + const int buf_read_img_len_; + char *buf_read_img_; + int io_read_img_; + + char buf_mini_str_[20]; + + USBBLOCK buf_sleep_; + USBBLOCK buf_paper_on_; + USBBLOCK buf_is_sleep_; + USBBLOCK buf_statu_; + void discard_prev(void); protected: @@ -44,9 +61,8 @@ public: private: int initdevice(); int writeusb(USBCB &usb); - int readusb(USBCB &usb); int pop_image(); - int get_scanner_status(USBCB &usb); + int get_scanner_status(void); int get_img_data(unsigned int bytes); int writedown_device_configuration(bool type =false,HGSCANCONF_DSP *d = NULL); void writedown_image_configuration(void); diff --git a/hgdriver/hgdev/image_process.cpp b/hgdriver/hgdev/image_process.cpp index 1d1cb20..8983176 100644 --- a/hgdriver/hgdev/image_process.cpp +++ b/hgdriver/hgdev/image_process.cpp @@ -29,7 +29,7 @@ using namespace std; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // functional ... //////////////////////////////////////////////////////////////////////////////// -// NEW,flow ... +// NEWflow ... static int num=0; namespace hg_imgproc @@ -127,7 +127,7 @@ namespace hg_imgproc if(buffs.empty()) return -1; -/////cmake当中进行定义 mips64 //在mips64下使用reset会导致崩溃 +/////cmake当中进行定义 mips64 //在mips64下使用reset会导致崩? //#ifndef mips64 //printf("\n buffer_ reset"); buffer_.reset(new std::vector()); @@ -481,7 +481,7 @@ namespace hg_imgproc } return ret; } - //防止渗透 + //防止渗? int antiInflow(int permeate_lv) { int ret = HG_ERR_OK; @@ -549,7 +549,7 @@ namespace hg_imgproc #endif return ret; } - //除网纹 + //除网? int textureRemove() { int ret = HG_ERR_OK; @@ -623,7 +623,7 @@ namespace hg_imgproc std::vector mats(mats_); mats_.clear(); - double threshold = 40; //默认值 + double threshold = 40; //默认? int edge = 150; CImageApplyDiscardBlank(threshold,edge,img_conf_.discardblank_percent); @@ -639,7 +639,7 @@ namespace hg_imgproc } return ret; } - //答题卡出红 + //答题卡出? int answerSheetFilterRed() { int ret = HG_ERR_OK; diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index 5736cb1..cea8186 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -1394,18 +1394,9 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, json* js double lower = .0f, upper = .0f; bool db_val = false; - if (jsn->get_value("name", val)) - { - name = local_utility::utf8_2_ansi(val.c_str()); - } - if (jsn->get_value("title", val)) - { - title = local_utility::utf8_2_ansi(val.c_str()); - } - if (jsn->get_value("desc", val)) - { - desc = local_utility::utf8_2_ansi(val.c_str()); - } + jsn->get_value("name", name); + jsn->get_value("title", title); + jsn->get_value("desc", desc); if (!jsn->get_value("type", val)) return NULL; @@ -1536,6 +1527,11 @@ SANE_Option_Descriptor* hg_sane_middleware::from_json(scanner_handle h, json* js hg_log::log(HG_LOG_LEVEL_DEBUG_INFO, "set \345\210\206\350\276\250\347\216\207 unit to DPI\n"); ret->unit = SANE_UNIT_DPI; } + else if (strcmp(ret->name, KNOWN_OPT_NAME_CUSTOM_AREA_LEFT) == 0 || + strcmp(ret->name, KNOWN_OPT_NAME_CUSTOM_AREA_RIGHT) == 0 || + strcmp(ret->name, KNOWN_OPT_NAME_CUSTOM_AREA_TOP) == 0 || + strcmp(ret->name, KNOWN_OPT_NAME_CUSTOM_AREA_BOTTOM) == 0) + ret->unit = SANE_UNIT_MM; //bool enabled = true; //if (jsn->get_value("enable", enabled) && !enabled) @@ -1657,9 +1653,20 @@ bool hg_sane_middleware::get_current_value(scanner_handle handle, int option, vo jsn->get_value("type", val)) { SANE_Value_Type t = SANE_TYPE_STRING; + std::string name(""); + jsn->get_value("name", name); ret = true; - if (val == "int") + if (name == KNOWN_OPT_NAME_CUSTOM_GAMMA) + { + SANE_Int* v = (SANE_Int*)value; + std::vector vs; + + jsn->get_as_array("cur", vs); + for (int i = 0; i < 3 * 256 && i < vs.size(); ++i) + v[i] = atoi(vs[i].c_str()); + } + else if (val == "int") { int v = 0; jsn->get_value("cur", v);