diff --git a/hgdriver/hgdev/char_const.h b/hgdriver/hgdev/char_const.h index 268b864..14523f1 100644 --- a/hgdriver/hgdev/char_const.h +++ b/hgdriver/hgdev/char_const.h @@ -18,7 +18,7 @@ #define BRAND_TITLE_VERSION "\347\211\210\346\234\254" // #define BRAND_TITLE_COPYRIGHT "版权" #define BRAND_TITLE_COPYRIGHT "\347\211\210\346\235\203" - #define BRAND_COPYRIGHT "1998-2022 HANVONSCAN。\344\277\235\347\225\231\346\211\200\346\234\211\346\235\203\345\210\251" + #define BRAND_COPYRIGHT "1998-2022 HANVONSCAN\343\200\202\344\277\235\347\225\231\346\211\200\346\234\211\346\235\203\345\210\251" // #define BRAND_TITE_MANUFACTOR "制造商/开发商" #define BRAND_TITE_MANUFACTOR "\345\210\266\351\200\240\345\225\206/\345\274\200\345\217\221\345\225\206" // #define BRAND_TITLE_URL "公司网址" @@ -47,7 +47,7 @@ #define BRAND_TITLE_VERSION "\347\211\210\346\234\254" // #define BRAND_TITLE_COPYRIGHT "版权" #define BRAND_TITLE_COPYRIGHT "\347\211\210\346\235\203" - #define BRAND_COPYRIGHT "2010-2022 LANXUM。\344\277\235\347\225\231\346\211\200\346\234\211\346\235\203\345\210\251" + #define BRAND_COPYRIGHT "2010-2022 LANXUM\343\200\202\344\277\235\347\225\231\346\211\200\346\234\211\346\235\203\345\210\251" // #define BRAND_TITE_MANUFACTOR "制造商/开发商" #define BRAND_TITE_MANUFACTOR "\345\210\266\351\200\240\345\225\206/\345\274\200\345\217\221\345\225\206" // #define BRAND_TITLE_URL "公司网址" @@ -75,7 +75,7 @@ #define BRAND_TITLE_VERSION "\347\211\210\346\234\254" // #define BRAND_TITLE_COPYRIGHT "版权" #define BRAND_TITLE_COPYRIGHT "\347\211\210\346\235\203" - #define BRAND_COPYRIGHT "2017 HuaGoScan。\344\277\235\347\225\231\346\211\200\346\234\211\346\235\203\345\210\251" + #define BRAND_COPYRIGHT "2017 HuaGoScan\343\200\202\344\277\235\347\225\231\346\211\200\346\234\211\346\235\203\345\210\251" // #define BRAND_TITE_MANUFACTOR "制造商/开发商" #define BRAND_TITE_MANUFACTOR "\345\210\266\351\200\240\345\225\206/\345\274\200\345\217\221\345\225\206" // #define BRAND_TITLE_URL "公司网址" @@ -132,7 +132,9 @@ #define SCANNER_NAME_HG_G339 "\345\215\216\351\253\230\346\211\253\346\217\217\344\273\252\342\200\224G339" // #define SCANNER_NAME_HG_G439 "华高扫描仪—G439" #define SCANNER_NAME_HG_G439 "\345\215\216\351\253\230\346\211\253\346\217\217\344\273\252\342\200\224G439" - +// #define SCANNER_NAME_HG_G402 "华高扫描仪—G402" +#define SCANNER_NAME_HG_G402 "\345\215\216\351\253\230\346\211\253\346\217\217\344\273\252\342\200\224G402" + // #define SCANNER_NAME_LSC_G42S "立思辰扫描仪—G42S" #define SCANNER_NAME_LSC_G42S "\347\253\213\346\200\235\350\276\260\346\211\253\346\217\217\344\273\252\342\200\224G42S" // #define SCANNER_NAME_LSC_G52S "立思辰扫描仪—G52S" @@ -150,4 +152,6 @@ #define SCANNER_NAME_HW_1060A "\346\261\211\347\216\213\346\211\253\346\217\217\344\273\252HW1060A" // #define SCANNER_NAME_HW_9110F "汉王扫描仪—HW9110F" #define SCANNER_NAME_HW_9110F "\346\261\211\347\216\213\346\211\253\346\217\217\344\273\252HW9110F" +// #define SCANNER_NAME_HW_7039F "汉王扫描仪—HW7039F" +#define SCANNER_NAME_HW_7039F "\346\261\211\347\216\213\346\211\253\346\217\217\344\273\252HW7039F" diff --git a/hgdriver/hgdev/hg_scanner_402.cpp b/hgdriver/hgdev/hg_scanner_402.cpp new file mode 100644 index 0000000..d38bd2c --- /dev/null +++ b/hgdriver/hgdev/hg_scanner_402.cpp @@ -0,0 +1,1738 @@ +#include "hg_scanner_402.h" +#include "../wrapper/hg_log.h" +#include "filetools.h" + +#ifdef WIN32 +#include "scanner_manager.h" +#endif + +#include + +//#define SAVE_TO_FILE + +#define USB_REQ_GET_FPGA_REGS 0x40 +#define USB_REQ_SET_FPGA_REGS 0x41 +#define USB_REQ_GET_MOTOR_REGS 0x42 +#define USB_REQ_SET_MOTOR_REGS 0x43 + +#define USB_REQ_GET_DEV_STATUS 0x60 +#define USB_REQ_GET_DEV_CONFIGURATION 0x61 +#define USB_REQ_SET_DEV_CONFIGURATION 0x62 +#define USB_REQ_GET_DEV_REGS 0x63 +#define USB_REQ_SET_DEV_REGS 0x64 + + +static std::string jsontext("{\"device_type\":\"G239\",\"option_count\":61,\"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\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"5\":{\"category\":\"base\",\"name\":\"cfg-5\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"4==true\"]},\"6\":{\"category\":\"base\",\"name\":\"mode\",\"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\"],\"depend_or\":[\"4!=true\"]},\"7\":{\"category\":\"base\",\"name\":\"cfg-7\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":0,\"max\":255},\"depend_or\":[\"6==\\u9ed1\\u767d\"]},\"8\":{\"category\":\"base\",\"name\":\"cfg-8\",\"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_and\":[\"4!=true\",\"6!=24\\u4f4d\\u5f69\\u8272\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"9\":{\"category\":\"base\",\"name\":\"cfg-9\",\"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_and\":[\"4!=true\",\"6!=256\\u7ea7\\u7070\\u5ea6\",\"6!=\\u9ed1\\u767d\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"10\":{\"category\":\"base\",\"name\":\"cfg-10\",\"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_and\":[\"4!=true\",\"6!=256\\u7ea7\\u7070\\u5ea6\",\"6!=\\u9ed1\\u767d\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"11\":{\"category\":\"base\",\"name\":\"cfg-11\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u5f69\\u8272\\u56fe\\u50cf\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"4!=true\",\"6!=256\\u7ea7\\u7070\\u5ea6\",\"6!=\\u9ed1\\u767d\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"12\":{\"category\":\"base\",\"name\":\"cfg-12\",\"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\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128},\"depend_or\":[\"11==true\"]},\"13\":{\"category\":\"base\",\"name\":\"cfg-13\",\"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\"],\"depend_and\":[\"4!=true\",\"6!=\\u9ed1\\u767d\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"14\":{\"category\":\"base\",\"name\":\"cfg-14\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"4!=true\",\"6!=\\u9ed1\\u767d\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"15\":{\"category\":\"base\",\"name\":\"cfg-15\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"4!=true\",\"6!=\\u9ed1\\u767d\",\"6!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"16\":{\"category\":\"base\",\"name\":\"cfg-16\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"6==\\u9ed1\\u767d\"]},\"17\":{\"category\":\"base\",\"name\":\"cfg-17\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"6==\\u9ed1\\u767d\"]},\"18\":{\"category\":\"base\",\"name\":\"cfg-18\",\"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\":[\"17==true\"]},\"19\":{\"category\":\"base\",\"name\":\"pagesize\",\"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\"]},\"20\":{\"category\":\"base\",\"name\":\"cfg-20\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"19!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"19!=\\u4e09\\u8054\\u8bd5\\u5377\",\"19!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"19!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"21\":{\"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\":[\"20==true\"]},\"22\":{\"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\":[\"20==true\"]},\"23\":{\"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\":[\"20==true\"]},\"24\":{\"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\":[\"20==true\"]},\"25\":{\"category\":\"base\",\"name\":\"cfg-25\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"19!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"19!=\\u4e09\\u8054\\u8bd5\\u5377\",\"19!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"19!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"26\":{\"category\":\"base\",\"name\":\"source\",\"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\"]},\"27\":{\"category\":\"base\",\"name\":\"cfg-27\",\"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\":[\"26==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"26==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"28\":{\"category\":\"base\",\"name\":\"resolution\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":[100,150,200,240,300,600]},\"29\":{\"category\":\"base\",\"name\":\"cfg-29\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u901f\\u5ea6\\u4f18\\u5148\",\"default\":\"\\u901f\\u5ea6\\u4f18\\u5148\",\"size\":24,\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend_or\":[\"28==300\",\"28==600\"]},\"30\":{\"category\":\"base\",\"name\":\"cfg-30\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"26!=\\u5355\\u9762\"]},\"31\":{\"category\":\"base\",\"name\":\"cfg-31\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"26!=\\u5bf9\\u6298\",\"26!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"26!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"]},\"32\":{\"category\":\"base\",\"name\":\"cfg-32\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"26!=\\u5bf9\\u6298\"]},\"33\":{\"category\":\"base\",\"name\":\"grp-2\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\"},\"34\":{\"category\":\"base\",\"name\":\"cfg-34\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"35\":{\"category\":\"base\",\"name\":\"brightness\",\"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\":[\"34==false\"]},\"36\":{\"category\":\"base\",\"name\":\"contrast\",\"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\":[\"34==false\"]},\"37\":{\"category\":\"base\",\"name\":\"cfg-37\",\"title\":\"\\u4f3d\\u9a6c\\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\":[\"34==false\"]},\"38\":{\"category\":\"base\",\"name\":\"grp-3\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\"},\"39\":{\"category\":\"base\",\"name\":\"cfg-39\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"40\":{\"category\":\"base\",\"name\":\"cfg-40\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"26!=\\u5bf9\\u6298\",\"39!=true\",\"19!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"19!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"19!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"32!=true\"]},\"41\":{\"category\":\"advanced\",\"name\":\"cfg-41\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u9608\\u503c\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50},\"depend_or\":[\"39==true\",\"19==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"19==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"19==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"32==true\"]},\"42\":{\"category\":\"advanced\",\"name\":\"cfg-42\",\"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\":[\"39==true\",\"19==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"19==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"19==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"32==true\"]},\"43\":{\"category\":\"advanced\",\"name\":\"cfg-43\",\"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\":[\"39==true\",\"19==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"19==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"32==true\",\"19==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\"]},\"44\":{\"category\":\"advanced\",\"name\":\"cfg-44\",\"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\":[\"39==true\"]},\"45\":{\"category\":\"base\",\"name\":\"cfg-45\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"46\":{\"category\":\"base\",\"name\":\"cfg-46\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"45==true\"]},\"47\":{\"category\":\"base\",\"name\":\"cfg-47\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u7eb8\\u5f20\\u4e2d\\u7684\\u7a7f\\u5b54\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"48\":{\"category\":\"base\",\"name\":\"cfg-48\",\"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\":[\"47==true\"]},\"49\":{\"category\":\"base\",\"name\":\"cfg-49\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"39==true\"]},\"50\":{\"category\":\"base\",\"name\":\"grp-4\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\"},\"51\":{\"category\":\"base\",\"name\":\"ultrasonic Disable|Enable\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\\u9001\\u7eb8\\u72b6\\u6001\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"52\":{\"category\":\"base\",\"name\":\"cfg-52\",\"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},\"53\":{\"category\":\"base\",\"name\":\"cfg-53\",\"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\"]},\"54\":{\"category\":\"base\",\"name\":\"cfg-54\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":1,\"default\":1,\"size\":4,\"depend_or\":[\"53==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"55\":{\"category\":\"base\",\"name\":\"cfg-55\",\"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\"]},\"56\":{\"category\":\"base\",\"name\":\"cfg-56\",\"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\":[\"26!=\\u5355\\u9762\",\"26!=\\u5bf9\\u6298\",\"55!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"57\":{\"category\":\"base\",\"name\":\"cfg-57\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u7eb8\\u5f20\\u6298\\u89d2\\u68c0\\u6d4b\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"58\":{\"category\":\"base\",\"name\":\"cfg-58\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u4ee3\\u8868\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"type\":\"int\",\"cur\":70,\"default\":70,\"size\":4,\"range\":{\"min\":0,\"max\":100},\"depend_or\":[\"57==true\"]},\"59\":{\"category\":\"base\",\"name\":\"cfg-59\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u7eb8\\u5f20\\u6b6a\\u659c\\u68c0\\u6d4b\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"60\":{\"category\":\"base\",\"name\":\"cfg-60\",\"title\":\"\\u6b6a\\u659c\\u5bb9\\u5fcd\\u5ea6\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u4ee3\\u8868\\u80fd\\u68c0\\u6d4b\\u5230\\u7eb8\\u5f20\\u7684\\u6b6a\\u659c\\u89d2\\u5ea6\\u8d8a\\u5c0f\",\"type\":\"int\",\"cur\":3,\"default\":3,\"size\":4,\"range\":{\"min\":1,\"max\":5},\"depend_or\":[\"59==true\"]}}"); +enum hg_239_setting_item +{ + HG_239_SETTING_RESTORE = 1, // 恢复默认设置 + HG_239_SETTING_HELP, // 帮助 + + HG__239_SETTING_GROUP_1, + + HG_239_SETTING_COLOR_MODE, // 颜色模式 + + HG_239_SETTING_ERASE_COLOR, // 除色 + HG_239_SETTING_ERASE_MULTI_RED, // 多流输出除红 + HG_239_SETTING_ERASE_ANSWER_RED, // 答题卡除红 + HG_239_SETTING_ERASE_BACKGROUND, // 移除背景 + HG_239_SETTING_ERASE_BKG_RANGE, // 移除背景范围 + HG_239_SETTING_NOISE, // 黑白图像噪点优化 + HG_239_SETTING_NOISE_SIZE, // 噪点优化尺寸 + HG_239_SETTING_PAPER_SIZE, // 纸张尺寸 + + HG_239_SETTING_CUSTOM_AREA, // 自定义扫描区域 + HG_239_SETTING_CUSTOM_AREA_LEFT, // 扫描区域左侧(mm) + HG_239_SETTING_CUSTOM_AREA_RIGHT, // 扫描区域右侧(mm) + HG_239_SETTING_CUSTOM_AREA_TOP, // 扫描区域上侧(mm) + HG_239_SETTING_CUSTOM_AREA_BOTTOM, // 扫描区域下侧(mm) + + HG_239_SETTING_PAPER_SIZE_CHECK, // 尺寸检测 + HG_239_SETTING_PAGE, // 扫描页面 + HG_239_SETTING_SKIP_NILL, // 跳过空白页灵敏度 + HG_239_SETTING_RESOLUTION, // 分辨率 + HG_239_SETTING_IMG_QUALITY, // 画质 + HG_239_SETTING_REVERSE, // 交换正反面 + HG_239_SETTING_SPLIT, // 图像拆分 + HG_239_SETTING_CORRECT, // 自动纠偏 + HG_239_SETTING_ERASE_HOLE, // 穿孔移除 + HG_239_SETTING_HOLE_SEARCH, // 穿孔搜索范围 + + HG__239_SETTING_GROUP_2, + + HG_239_SETTING_CUSTOM_GAMMA, // 启用色调曲线 + HG_239_SETTING_LIGHT, // 亮度 + HG_239_SETTING_CONTRAST, // 对比度 + HG_239_SETTING_GAMMA, // 伽玛 + + HG__239_SETTING_GROUP_3, + + HG_239_SETTING_SHARP, // 锐化与模糊 + HG_239_SETTING_ERASE_BLACK_BORDER, // 消除黑框 + HG_239_SETTING_SAMPLE, // 深色样张 + HG_239_SETTING_THRESHOLD, // 阈值 + HG_239_SETTING_ANTI_NOISE, // 背景抗噪等级 + HG_239_SETTING_MARGIN, // 边缘缩进 + HG_239_SETTING_FILLING, // 背景填充方式 + HG_239_SETTING_PERMEATE, // 防止渗透 + HG_239_SETTING_PERMEATE_lv, // 防止渗透等级 + HG_239_SETTING_REMOVE_MORR, // 去除摩尔纹 + HG_239_SETTING_ERROR_EXTENTION, // 错误扩散 + HG_239_SETTING_REMOVE_TXTTURE, // 除网纹 + + HG__239_SETTING_GROUP_4, + + HG_239_SETTING_ULTRASONIC, // 超声波检测 + HG_239_SETTING_STAPLE, // 装订检测 + HG_239_SETTING_SCAN_METHOD, // 连续扫描或扫描指定张数 + HG_239_SETTING_SCAN_COUNT, // 扫描指定数量 + HG_239_SETTING_DIRECTION, // 文稿方向 删除文稿自动识别 + HG_239_SETTING_ROTATE, // 背面旋转180° + HG_239_SETTING_FRACTATE, // 折角检测 + HG_239_SETTING_FRACTATE_COMPLEX, // 折角检测复杂度 + HG_239_SETTING_SCREW, // 歪斜检测 + HG_239_SETTING_SCREW_COMPLEX, // 歪斜检测复杂度 + + + HG_239_SETTING_END, + + //暂时屏蔽 + HG_239_SETTING_MULTI_OUT = 500, // 多流输出 +}; +enum Scanner_Reg_Defs +{ + SR_CMD, + SR_STATUS, + SR_SCAN_COUNT, + SR_OS, + SR_SENSORS, + SR_MOTOR, + SR_IM_TYPE, + SR_IM_COUNT, + SR_IM_TX, + SR_IM_FRONT_SIZE, + SR_IM_CLEAR, + SR_IM_TXING, + SR_IM_POP, + SR_IM_ABORT, + SR_COUNT, + SR_CONFIG_SCAN_PARAM, + SR_GET_FWVERSION, + SR_SET_FWERSION, + SR_GET_SERIALNUM, + SR_SET_SERIALNUM, + SR_CONFIF_IMGPROCPARAM, + SC_AUTOCORRECT, + SC_GET_CORRECT_PARAM, + SC_SET_CORRECT_PARAM, + SR_GET_H_RATIO, + SR_SET_H_RATIO, + SR_GET_V_RATIO, + SR_SET_V_RATIO, + SR_GET_SERIAL_LEN, + SR_GET_GRAY_SP, + SR_GET_COLOR_SP, + SR_SET_GRAY_SP, + SR_SET_COLOR_SP, + SR_SET_SLEEPTIME, + SR_GET_SLEEPTIME, + SR_GET_SLEEP_STAUTUS, + SR_GET_IMAGEPROCESSDONE, + SR_GET_KEEP_LAST_PAPER, + SR_GET_PAPERON, + SR_SET_SPEEDMODE, + SR_GET_SPEEDMODE, + SR_GET_CUO_ERROR = 0x50, + SR_GET_DOU_ERROR, + SR_GET_JAM_ERROR, + SR_GET_SCANN_NUM, + SR_CLR_ROLLER_NUM, + SR_GET_ROLLER_NUM, + SR_UPDATA_START = 0x100, + SR_UPDATA_STAUTUS = 0x101, + SR_UPDATA_MD5_RELUST = 0x102, + SR_UPDATA_RECOVERY = 0x103, + SR_UPDATA_REBOOT = 0x104, + SR_POWEROFF = 0x105, + SR_REBOOT = 0x106, + SR_FLAT_CLR_MAX_BRIGHT, + SR_FLAT_GRAY_MAX_BRIGHT, + SR_KERNEL_VERSION_INFO_LENGTH, + SR_GET_KERNEL_VERSION, + SR_GET_MBSTATUS, + SR_GET_IPADDR_LENGHT = 0x200, + SR_GET_MACADDR, + SR_GET_IPADDR, + SR_GET_MBVERSION_LENGHT, + SR_GET_MBVERSION, + SR_GET_USBVIDPID, + SR_SET_USBVIDPID +}; +enum Scanner_Cmd_Defs +{ + SC_START, + SC_STOP, + SC_CLEAR, + SC_COUNT +}; +enum HGType +{ + MtBoard = 1, + FPGA, + V4L2, + IMG, + AutoCorrect, + STOPSCAN, +}; +struct HGEIntInfo +{ + HGType From; + unsigned int Code; + unsigned int Img_Index; +}; +namespace settings402 +{ + // device status to scanner_err + scanner_err device_status_to_hg_err(HGEIntInfo* ds) + { + scanner_err code = SCANNER_ERR_OK; + + if (ds->From == HGType::FPGA) + code = SCANNER_ERR_OK; + else if (ds->From == HGType::MtBoard) + { + switch (ds->Code) + { + case 0x00002: + code = SCANNER_ERR_DEVICE_NO_PAPER; + break; + case 0x00004: + code = SCANNER_ERR_DEVICE_COVER_OPENNED; + break; + case 0x00008: + code = SCANNER_ERR_DEVICE_FEEDING_PAPER; + break; + case 0x00010: + code = SCANNER_ERR_DEVICE_PAPER_JAMMED; + break; + case 0x00020: + code = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; + break; + case 0x00040: + code = SCANNER_ERR_DEVICE_STAPLE_ON; + break; + case 0x00080: + code = SCANNER_ERR_DEVICE_PAPER_SKEW; + break; + case 0x10000: + case 0x80000: + code = SCANNER_ERR_TIMEOUT; + break; + case 0x20000: + code = SCANNER_ERR_DEVICE_SIZE_CHECK; + break; + default: + break; + } + } + else if (ds->From == HGType::IMG) + { + if (ds->Code == 1) + code = SCANNER_ERR_DEVICE_DOGEAR; + else if (ds->Code == 2) + code = SCANNER_ERR_DEVICE_SIZE_CHECK; + } + else if (ds->From == HGType::V4L2) + { + if (ds->Code == 0) + code = SCANNER_ERR_DEVICE_SCANN_ERROR; + else if (ds->Code == 1) + code = SCANNER_ERR_DEVICE_NO_IMAGE; + } + else if (ds->From == HGType::STOPSCAN) + code = SCANNER_ERR_DEVICE_STOPPED; + + return code; + } + + // resolution + static struct + { + float resolution; + int dev_value; + }resolution_map[] = + { + {100.0f, 1}, + {150.0f, 1}, + {200.0f, 1}, + {240.0f, 1}, + {300.0f, 0}, + {600.0f, 1} //临时版本发1 原来发2 + }; + bool is_equal(float l, float r) + { + return fabs(l - r) < .000001f; + } + int match_best_resolution(int resolution, bool* exact) + { + int rsl = resolution, + ind = 0; + bool good = true, *r = exact ? exact : &good; + + if (rsl <= resolution_map[0].resolution) + { + ind = 0; + } + else if (rsl >= resolution_map[ARRAY_SIZE(resolution_map) - 1].resolution) + { + ind = ARRAY_SIZE(resolution_map) - 1; + } + else + { + for (int i = 1; i < ARRAY_SIZE(resolution_map); ++i) + { + if (is_equal(rsl, resolution_map[i].resolution)) + { + ind = i; + break; + } + if (rsl < resolution_map[i].resolution) + { + float dif_l = rsl - resolution_map[i - 1].resolution, + dif_r = resolution_map[i].resolution - rsl; + + if (dif_l > dif_r) + ind = i; + else + ind = i - 1; + break; + } + } + } + + *r = is_equal(rsl, resolution_map[ind].resolution); + + return ind; + } +enum PaperSize_ +{ + G400_A3 = 0, + G400_A4, + G400_A4R, + G400_A5, + G400_A5R, + G400_A6, + G400_A6R, + G400_B4, + G400_B5, + G400_B5R, + G400_B6, + G400_B6R, + G400_DOUBLELETTER, + G400_LEGAL, + G400_LETTER, + G400_LETTERR, + G400_LONGLETTER = 16, + G400_MAXSIZE = 16, + G400_AUTO = 16, + G400_MAXAUTO = 16 +}; + // paper + static struct + { + int paper; + TwSS type; + int dev_value; + }paper_map[] = + { + {PAPER_A3, TwSS::A3, PaperSize_::G400_A3}, + {PAPER_8K, TwSS::K8, 0}, + {PAPER_A4, TwSS::A4, PaperSize_::G400_A4}, + {PAPER_A4_LATERAL, TwSS::A4, PaperSize_::G400_A4R}, + {PAPER_16K, TwSS::K16, 0}, + {PAPER_16K_LATERAL, TwSS::K16, 0}, + {PAPER_A5, TwSS::A5, PaperSize_::G400_A5}, + {PAPER_A5_LATERAL, TwSS::A5, PaperSize_::G400_A5R}, + {PAPER_A6, TwSS::A6, PaperSize_::G400_A6}, + {PAPER_A6_LATERAL, TwSS::A6, PaperSize_::G400_A6R}, + {PAPER_B4, TwSS::B4, PaperSize_::G400_B4}, + {PAPER_B5, TwSS::B5, PaperSize_::G400_B5}, + {PAPER_B5_LATERAL, TwSS::B5, PaperSize_::G400_B5R}, + {PAPER_B6, TwSS::B6, PaperSize_::G400_B6}, + {PAPER_B6_LATERAL, TwSS::B6, PaperSize_::G400_B6R}, + {PAPER_LETTER, TwSS::USLetter, PaperSize_::G400_LETTER}, + {PAPER_LETTER_LATERAL, TwSS::USLetter, PaperSize_::G400_LETTERR}, + {PAPER_DOUBLE_LETTER, TwSS::USLedger, PaperSize_::G400_DOUBLELETTER}, + {PAPER_LEGAL, TwSS::USLegal, PaperSize_::G400_LEGAL}, + {PAPER_AUTO_MATCH, TwSS::None, 0}, + {PAPER_MAX_SIZE_CLIP, TwSS::USStatement, PaperSize_::G400_MAXAUTO}, + {PAPER_MAX_SIZE, TwSS::MaxSize, PaperSize_::G400_MAXSIZE}, + {PAPER_TRIGEMINY, TwSS::Trigeminy, 16} + }; + int match_best_paper(int& paper, bool* exact, TwSS* type) + { + int ind = 0; + bool good = true, * r = exact ? exact : &good; + + for (int i = 0; i < ARRAY_SIZE(paper_map); ++i) + { + if (paper == paper_map[i].paper) + { + ind = i; + break; + } + } + + if (paper == paper_map[ind].paper) + *r = true; + else + *r = false; + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Paper '%s' index = %d, device value = %d\n", paper_string(paper).c_str(), ind, paper_map[ind].dev_value); + paper = paper_map[ind].paper; + if (type) + *type = paper_map[ind].type; + + return ind; + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// class ... +hg_scanner_402::hg_scanner_402(const char* dev_name, int pid,usb_io* io) : hg_scanner(G20039Serial, dev_name, io) + , rewrite_conf_(false), reset_(false),pid_(pid) +{ + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "hg_scanner_402(%s) constructing ...\n", hg_log::format_ptr(this).c_str()); + dev_conf_.value = 0; +#ifndef MAPPING_FUNCTION_IN_BASE + init_setting_map(setting_map_, ARRAY_SIZE(setting_map_)); +#endif + init_settings(jsontext.c_str()); + writedown_device_configuration(); // initialize the hardware settings + init_version(); +} +hg_scanner_402::~hg_scanner_402() +{ + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "hg_scanner_402(%s) destroyed.\n", hg_log::format_ptr(this).c_str()); +} + +int hg_scanner_402::read_register(int addr, int* val) +{ + std::lock_guard lock(io_lock_); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + int l = sizeof(*val), + ret = io_->control_io(0x0c0, USB_REQ_GET_DEV_REGS, addr, 0, val, &l); + + if (ret) + status_ = ret; + + return ret; +} +int hg_scanner_402::write_register(int addr, int val) +{ + std::lock_guard lock(io_lock_); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + int l = sizeof(val), + ret = io_->control_io(0x040, USB_REQ_SET_DEV_REGS, addr, 0, &val, &l); + + if (ret) + status_ = ret; + + return ret; +} +int hg_scanner_402::write_command(int cmd) +{ + return write_register(0, cmd); +} +std::string hg_scanner_402::control_fetch(int addr, int val, int size) +{ + int l = sizeof(val), + ret = 0; + std::string data(""); + + ret = write_register(addr, val); + if (ret == SCANNER_ERR_OK) + { + std::lock_guard lock(io_lock_); + + l = size + 1; + data.resize(size + 2); + bzero(&data[0], size + 2); + ret = io_->read_bulk(&data[0], &l); + if (ret) + { + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "control_fetch(%d, %d) - read_bulk = %s\n", addr, val, hg_scanner_err_name(ret)); + data.clear(); + } + } + else + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "control_fetch(%d, %d) = %s\n", addr, val, hg_scanner_err_name(ret)); + + return data; +} + +std::string hg_scanner_402::get_fpga(void) +{ + int val = 0, + ret = read_register(SR_GET_MBVERSION_LENGHT, &val); + std::string fpga(""); + + if (ret == SCANNER_ERR_OK) + { + fpga.resize(val + 2); + bzero(&fpga[0], val + 2); + + return control_fetch(SR_GET_MBVERSION, 0, val); + } + + return fpga; +} +int hg_scanner_402::clr_roller_num(void) +{ + int val = 0, + ret = read_register(SR_CLR_ROLLER_NUM, &val); + + if (ret == SCANNER_ERR_OK) + return val; + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "clr_roller_num = %s\n", hg_scanner_err_name(ret)); + return -1; + } +} +int hg_scanner_402::get_sleep_time(void) +{ + int val = 0, + ret = read_register(SR_GET_SLEEPTIME, &val); + + if (ret == SCANNER_ERR_OK) + return val; + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get_sleep_time = %s\n", hg_scanner_err_name(ret)); + return -1; + } +} +int hg_scanner_402::get_scan_mode(void) +{ + int val = 0, + ret = read_register(SR_OS, &val); + + if (ret) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get scan mode error: %s\n", hg_scanner_err_name(ret)); + status_ = ret; + + return -1; + } + else + return val; +} +int hg_scanner_402::get_status(void) +{ + int val = 0, + ret = read_register(SR_STATUS, &val); + + if (ret) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get status error: %s\n", hg_scanner_err_name(ret)); + status_ = ret; + + return -1; + } + else + return val; +} +bool hg_scanner_402::is_dev_tx(void) +{ + int val = 0, + ret = read_register(SR_STATUS, &val); + + if (ret) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "is_dev_tx() error: %s\n", hg_scanner_err_name(ret)); + status_ = ret; + + return false; + } + else + return val; +} +bool hg_scanner_402::is_dev_image_process_done(void) +{ + int val = 0, + ret = read_register(SR_GET_IMAGEPROCESSDONE, &val); + + if (ret) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "is_dev_image_process_done() error: %s\n", hg_scanner_err_name(ret)); + status_ = ret; + + return true; + } + else + return val; +} +bool hg_scanner_402::is_dev_image_keep_last_paper(void) +{ + + int val = 0, + ret = read_register(SR_GET_KEEP_LAST_PAPER, &val); + + if (ret) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "is_dev_image_keep_last_paper() error: %s\n", hg_scanner_err_name(ret)); + status_ = ret; + + return true; + } + else + return val; +} +int hg_scanner_402::get_scanned_count(void) +{ + int val = 0, + ret = read_register(SR_GET_SCANN_NUM, &val); + + if (ret == SCANNER_ERR_OK) + return val; + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get_scanned_count = %s\n", hg_scanner_err_name(ret)); + return -1; + } +} +int hg_scanner_402::get_image_count(void) +{ + int val = 0, + ret = read_register(SR_IM_COUNT, &val); + + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "get_image_count() = %d, error: %s\n", val, hg_scanner_err_name(ret)); + + if (ret == SCANNER_ERR_OK) + return val; + else + return -1; +} +int hg_scanner_402::get_front_data_size(void) +{ + int val = 0, + ret = read_register(SR_IM_FRONT_SIZE, &val); + + if (ret == SCANNER_ERR_OK) + return val; + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get_front_data_size = %s\n", hg_scanner_err_name(ret)); + return -1; + } +} +void hg_scanner_402::init_version(void) +{ + std::string fv(get_firmware_version()), + sn(get_serial_num()); + + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, " HG3399 firmware version: %s\n", fv.c_str()); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, " HG3399 serial number: %s\n", sn.c_str()); + //VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, " HG3399 IP: %s\n", get_ip().c_str()); + + if (fv.length() >= 10 && (fv[5] > 'A' || atoi(fv.substr(6, 4).c_str()) >= 1209)) + { + is_kernelsnap_211209_ = atoi(get_fpga().c_str()) >= 35211210; + } + else + is_kernelsnap_211209_ = false; +} +void hg_scanner_402::image_process(std::shared_ptr& buff) +{ + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Process image with %u bytes content ...\n", buff->size()); + + hg_imgproc::IMGPRCPARAM param; + hg_imgproc::HIMGPRC handle = NULL; + hg_imgproc::IMGHEAD ih; + int err = SCANNER_ERR_OK, + index = 0; + void* buf = NULL; + + bzero(¶m, sizeof(param)); + + param.bits = 8; + param.black_white = img_conf_.pixtype == COLOR_MODE_BLACK_WHITE; + param.channels = img_conf_.pixtype == COLOR_MODE_24_BITS ? 3 : 1; + param.color_mode = img_conf_.pixtype; + param.double_side = img_conf_.is_duplex; + param.dpi = img_conf_.resolution_dst; + + + handle = hg_imgproc::init(&img_conf_,¶m,pid_); + err = hg_imgproc::load_buffer(handle, buff); + err = hg_imgproc::decode(handle,pid_); + + if(image_prc_param_.bits.erase_bakground && !user_cancel_) + { + err = hg_imgproc::fadeback(handle,img_conf_.fadebackrange,img_conf_.is_duplex); + } + + if (image_prc_param_.bits.rid_red && img_conf_.pixtype == COLOR_MODE_24_BITS) + err = hg_imgproc::multi_out_red(handle); + + if (image_prc_param_.bits.split && !user_cancel_) + { + int colormode=1; + if(img_conf_.filter == RID_COLOR_NONE) + colormode=img_conf_.pixtype; + + err = hg_imgproc::split(handle,img_conf_.multiOutput,img_conf_.splitImage,img_conf_.multi_output_red,colormode,img_conf_.is_duplex,1); + VLOG_MINI_5(LOG_LEVEL_DEBUG_INFO, "img split-> multiOutput is:%d splitImage is:%d multi_output_red is:%d pixtype is:%d is_duplex:%d\r\n" + ,img_conf_.multiOutput + ,img_conf_.splitImage + ,img_conf_.multi_output_red + ,img_conf_.pixtype + ,img_conf_.is_duplex); + } + + if (!image_prc_param_.bits.split || !image_prc_param_.bits.rid_red || !is_multiout) + { + if(img_conf_.automaticcolor) + { + hg_imgproc::auto_matic_color(handle,img_conf_.automaticcolortype); + } + } + if (img_conf_.is_autotext) + { + printf("文本方向自动识别\r\n"); + hg_imgproc::ocr_auto_txtdirect(handle); + } + if (is_quality_ == IMG_SPEED && resolution_ >= 300) + { + err = hg_imgproc::quality(handle,resolution_); + } + //多流输出最后处理 + if (is_multiout) + { + int multi_out = image_prc_param_.bits.multi_out; + err = hg_imgproc::multi_out(handle,multi_out); + } + hg_imgproc::final(handle); + + while (hg_imgproc::get_final_data(handle, &ih, &buf, index++) == SCANNER_ERR_OK && !user_cancel_) + { + VLOG_MINI_5(LOG_LEVEL_DEBUG_INFO, "Final picture %d (%d * %d * %d) with %u bytes!\n", index + , ih.width, ih.height, ih.bits * ih.channels, ih.total_bytes); + + if(!img_type_.empty()) + { + std::vectorbmpdata; + + hg_imgproc::imgtypechange(handle,img_type_,buf,bmpdata); + //cv::imencode(img_type_,*((cv::Mat*)buf),bmpdata); + if(bmpdata.empty()) + { + status_ = SCANNER_ERR_NO_DATA; + return ; + } + buf = bmpdata.data(); + ih.total_bytes = bmpdata.size(); + + VLOG_MINI_6(LOG_LEVEL_DEBUG_INFO, "Set img type is:%s Final picture %d (%d * %d * %d) with %u bytes!\n",img_type_.c_str() ,index + , ih.width, ih.height, ih.bits * ih.channels, ih.total_bytes); + } + save_final_image(&ih, buf); + } + + hg_imgproc::release(handle); +} + +int hg_scanner_402::get_device_sleep_stautus(void) +{ + int ret =read_register(SR_GET_SLEEP_STAUTUS,0); + return ret; +} + +int hg_scanner_402::get_device_paperon_stautus(void) +{ + int ret =read_register(SR_GET_PAPERON,0); + return ret; +} +// int hg_scanner_402::writedown_device_configuration() +// { +// int ret = SCANNER_ERR_OK; + + +// ret = write_register(SR_CONFIG_SCAN_PARAM, dev_conf_.value); +// VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "Writedown scanner configuration(0x%x) = %s\n", dev_conf_.value, hg_scanner_err_name(ret)); + +// return ret; +// } + +int hg_scanner_402::writedown_device_configuration(HGSCANCONF *dev_conf) +{ + int ret = SCANNER_ERR_OK; + + if(!dev_conf) + dev_conf = &dev_conf_; + + ret = write_register(SR_CONFIG_SCAN_PARAM, dev_conf->value); + + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "Writedown scanner configuration(0x%x) = %s\n", dev_conf->value, hg_scanner_err_name(ret)); + return ret; +} + +int hg_scanner_402::writedown_image_configuration(void) +{ + int ret = write_register(SR_CONFIF_IMGPROCPARAM, sizeof(SCANCONF)); + if (ret != SCANNER_ERR_OK) + return ret; + + SCANCONF ic; + int len = sizeof(ic); + + bzero(&ic, len); + + ic.papertype = paper_size_; + +if (is_lateral(image_prc_param_.bits.paper)) + ic.paperAlign = Rot270; +// else if (image_prc_param_.bits.text_direction == TEXT_DIRECTION_AUTO) +// ic.paperAlign = AutoTextOrientation; +else + ic.paperAlign = Rot0; + + ic.en_sizecheck = dev_conf_.g200params.enable_sizecheck; + +if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO) + ic.imageRotateDegree = (float)image_prc_param_.bits.text_direction; +else + ic.imageRotateDegree = 0; + + ic.imageRotateDegree *= 90.0f; + + ic.is_duplex = (image_prc_param_.bits.page == PAGE_DOUBLE + || image_prc_param_.bits.page == PAGE_OMIT_EMPTY + || image_prc_param_.bits.page == PAGE_OMIT_EMPTY_RECEIPT + || image_prc_param_.bits.page ==PAGE_FOLIO); + + ic.en_fold = (image_prc_param_.bits.page == PAGE_FOLIO); + ic.pixtype = image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH ? 2 : image_prc_param_.bits.color_mode; + ic.automaticcolor = is_auto_matic_color; + + ic.automaticcolortype = 1;// ic.pixtype; //存疑 +if (resolution_ >= 300) +{ + if(is_quality_ == IMG_SPEED) + { + ic.resolution_dst = 200; + } + else if(is_quality_ ==IMG_QUALITY) + { + ic.resolution_dst = resolution_; + } +} +else +{ + ic.resolution_dst = resolution_; +} + + ic.resolution_native = 200.0f; + ic.gamma = (float)gamma_; + ic.contrast = (contrast_ - 4) * 333.0; + ic.brightness = (bright_ - 128) * (2000.0 / 254.0); + ic.threshold = threshold_; + ic.is_autocontrast = 0; //无参数 + ic.is_autocrop = (ic.papertype == TwSS::None || ic.papertype ==TwSS::USStatement); + ic.is_autodiscradblank_normal = image_prc_param_.bits.page == PAGE_OMIT_EMPTY; + ic.discardblank_percent = omit_empty_level_ >= 70 ? 70 : omit_empty_level_; + ic.is_autodiscradblank_vince = image_prc_param_.bits.page == PAGE_OMIT_EMPTY_RECEIPT; + ic.is_switchfrontback = image_prc_param_.bits.exchange; + ic.autodescrew = image_prc_param_.bits.automatic_skew; + //ic.multi_output_red = image_prc_param_.bits.rid_red; //必须屏蔽,否则超时,未知错误不可描述。 + ic.hsvcorrect = image_prc_param_.bits.rid_answer_red; + ic.sharpen = image_prc_param_.bits.sharpen; + ic.enhance_color = image_prc_param_.bits.rid_color; + ic.fillbackground = image_prc_param_.bits.erase_black_frame; + ic.is_convex = (image_prc_param_.bits.fill_background == FILL_BKG_CONVEX_POLYGON); + ic.noise = image_prc_param_.bits.noise_optimize; + ic.indent = margin_; + ic.AutoCrop_threshold = threshold_; + if (test_1_paper_) + { + LOG_INFO(LOG_LEVEL_DEBUG_INFO, "scanning mode: testing ONE paper ...\n"); + ic.scannum = ic.is_duplex ? 2 : 1; + } + else + { + ic.scannum = (ic.is_duplex ? scan_count_ * 2 : scan_count_); + } + ic.is_backrotate180 = image_prc_param_.bits.rotate_back_180; + ic.is_dogeardetection = image_prc_param_.bits.fractate_check; + ic.hardwarecaps.en_skrewdetect = dev_conf_.g200params.screw_detect_enable; + ic.hardwarecaps.en_doublefeed = dev_conf_.g200params.ultrasonic_enable; + ic.hardwarecaps.en_stapledetect = dev_conf_.g200params.staple_enbale; + ic.hardwarecaps.skrewdetectlevel = dev_conf_.g200params.screw_detect_level; + // ic.hardwarecaps.is_autopaper = dev_conf_.g200params.is_autopaper; + ic.hardwarecaps.capturepixtype = 0; //暂无参数 获取图像类型 + ic.hardwarecaps.lowpowermode = LowPowerMode::Min_None; //暂无参数 设置休眠时间 两个参数3399未使用 + ic.fillhole.is_fillhole = image_prc_param_.bits.rid_hole; + ic.fillhole.fillholeratio = rid_hole_range_; + ic.detachnoise.is_detachnoise = image_prc_param_.bits.noise_optimize; + ic.detachnoise.detachnoise = noise_range_; + ic.is_autotext = image_prc_param_.bits.text_direction == TEXT_DIRECTION_AUTO ? 1 :0; + ic.isfillcolor = is_color_fill; + ic.refuseInflow = image_prc_param_.bits.is_permeate; + ic.colorCorrection = 0; + ic.removeMorr = image_prc_param_.bits.remove_morr; + ic.errorExtention = image_prc_param_.bits.error_extention ;// + ic.textureRemove = image_prc_param_.bits.remove_txtture;// + ic.splitImage = image_prc_param_.bits.split; +{ + ic.cropRect.enable = custom_area_; + int height = (custom_area_br_y_ *ic.resolution_dst) /25.4 - (custom_area_lt_y_ *ic.resolution_dst /25.4); + int width = (custom_area_br_x_ *ic.resolution_dst) /25.4 - (custom_area_lt_x_ *ic.resolution_dst /25.4); + ic.cropRect.height = height; + ic.cropRect.width = width; + ic.cropRect.x = custom_area_lt_x_ *ic.resolution_dst /25.4; + ic.cropRect.y = custom_area_lt_y_ *ic.resolution_dst /25.4; +} + ic.multiOutput = (MultiOutput)image_prc_param_.bits.multi_out; + ic.normalCrop = image_prc_param_.bits.dark_sample; + ic.dogeardistabce = fractate_level_; + ic.fadeback = image_prc_param_.bits.erase_bakground; + ic.fadebackrange = erase_bkg_range_; + + int filter_clr[] = { 3, 0, 1, 2, 5, 6, 7 }; + if(image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS || image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH) + ic.filter = 3; + else + { + ic.filter = filter_clr[image_prc_param_.bits.rid_color]; + // if(ic.filter != 3) + // ic.pixtype = 2; + + ic.hsvcorrect = 0; + ic.multi_output_red = 0; + ic.multiOutput = MultiOutput::Unused; + + } + //多留输出的处理 + if (image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW && is_multiout) + { + ic.pixtype = 1; + } + else if ((image_prc_param_.bits.multi_out == MULTI_OUT_ALL ||image_prc_param_.bits.multi_out == MULTI_COLOR_AND_GRAY||image_prc_param_.bits.multi_out == MULTI_COLOR_AND_BW) && is_multiout) + { + ic.pixtype = 2; + + } + if (is_multiout) + { + ic.hsvcorrect = 0; + ic.multi_output_red = 0; + ic.fadeback = false; + ic.sharpen = 0; + ic.removeMorr = 0; + ic.textureRemove = 0; + + ic.errorExtention = 0; + ic.detachnoise.is_detachnoise = 0; + } + if (ic.pixtype == 0) + { + ic.hsvcorrect = 0; + ic.multi_output_red = 0; + ic.fadeback = false; + ic.sharpen = 0; + ic.removeMorr = 0; + ic.textureRemove = 0; + } + + //自定义裁切 + if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH + ||image_prc_param_.bits.paper == PAPER_MAX_SIZE + ||image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP + ||image_prc_param_.bits.paper == PAPER_TRIGEMINY + ) + { + ic.cropRect.enable = false; + } + + { + std::lock_guard lock(io_lock_); + + ret = io_->write_bulk(&ic, &len); + + this_thread::sleep_for(chrono::milliseconds(500)); + io_->set_timeout(2000);//必要延时 + } + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Write-down 0x%x bytes image process parameters\n", len); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.pixtype=%d", ic.pixtype); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.papertype=%d", ic.papertype); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.AutoCrop_threshold=%d", ic.AutoCrop_threshold); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.autodescrew=%d", ic.autodescrew); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.automaticcolor=%d", ic.automaticcolor); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.brightness=%f", ic.brightness); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.contrast=%f", ic.contrast); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.en_fold=%d", ic.en_fold); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.en_sizecheck=%d", ic.en_sizecheck); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.enhance_color=%d", ic.enhance_color); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.fillbackground=%d", ic.fillbackground); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.filter=%d", ic.filter); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.gamma=%f", ic.gamma); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.hardwarecaps.capturepixtype=%d", ic.hardwarecaps.capturepixtype); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.hardwarecaps.en_doublefeed=%d", ic.hardwarecaps.en_doublefeed); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.hsvcorrect=%d", ic.hsvcorrect); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.imageRotateDegree=%f", ic.imageRotateDegree); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.indent=%d", 5); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_autocontrast=%d", ic.is_autocontrast); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_autocrop=%d", ic.is_autocrop); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_autodiscradblank_normal=%d", ic.is_autodiscradblank_normal); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_autodiscradblank_vince=%d", ic.is_autodiscradblank_vince); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_autotext=%d", ic.is_autotext); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_backrotate180=%d", ic.is_backrotate180); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_convex=%d", ic.is_convex); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_duplex=%d", ic.is_duplex); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_switchfrontback=%d", ic.is_switchfrontback); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.is_dogeardetection=%d", ic.is_dogeardetection); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.fillhole.multi_output_red=%d", ic.multi_output_red); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.noise=%d", 8); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.pixtype=%d", ic.pixtype); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.resolution_dst=%f", ic.resolution_dst); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.resolution_native=%f", ic.resolution_native); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.scannum=%d", ic.scannum); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.sharpen=%d", ic.sharpen); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.discardblank_percent=%d", ic.discardblank_percent); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.is_detachnoise=%d", ic.detachnoise.is_detachnoise); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.detachnoise=%d\r ", ic.detachnoise.detachnoise); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.refuseInflow=%d\r ", ic.refuseInflow); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.refuseInflow=%d\r ", ic.refuseInflow); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.removeMorr=%d\r ", ic.removeMorr); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.errorExtention=%d\r ", ic.errorExtention); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.textureRemove=%d\r\n ", ic.refuseInflow); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.fillhole.is_fillhole=%d\r\n ", ic.fillhole.is_fillhole); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.ic.fillhole.fillholeratio=%d\r\n ", ic.fillhole.fillholeratio); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.fadeback=%d\r\n ",ic.fadeback); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.enable=%d\r ", ic.cropRect.enable); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.width=%d\r\n ", ic.cropRect.width); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.height=%d\r\n ", ic.cropRect.height); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.x=%f\r\n ", ic.cropRect.x); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.y=%d\r\n ",ic.cropRect.y); + + img_conf_ = ic; + return ret; +} + +int hg_scanner_402::pop_first_image(void) +{ + int ret = write_register(SR_IM_POP, 1); + + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "popup first image = %s\n", hg_scanner_err_name(ret)); + + return ret; +} + +int hg_scanner_402::read_one_image_from_usb(void) +{ + int r = 0, + total = get_front_data_size(), + off = 0, + ret = SCANNER_ERR_OK; + + if (!waiting_for_memory_enough(total)) + { + status_ = SCANNER_ERR_INSUFFICIENT_MEMORY; + + return status_; + } + if (user_cancel_) + return SCANNER_ERR_USER_CANCELED; + + if (total == -1) + ret = status_; + else + { + std::shared_ptr buf(aquire_memory(total)); + if (!buf.get()) + return SCANNER_ERR_INSUFFICIENT_MEMORY; + + // write reading command + ret = write_register(SR_IM_TX, 1); + + if (ret == SCANNER_ERR_OK) + { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + r = total; + { + std::lock_guard lock(io_lock_); + + unsigned int size = r; + void* buff = buf->data(off, &size); + int block = 0; + if (!buff) + { + VLOG_MINI_3(LOG_LEVEL_FATAL, "memory(0x%08x + %u) fatal when read USB image %d !!!\n", off, r, usb_img_index_); + ret = SCANNER_ERR_INSUFFICIENT_MEMORY; + } + else + { + r = size; + while (r > 0) + { + block = 512 * 1024; + + if (r < block) + block = r; + + unsigned int size = block; + void* buff = buf->data(off, &size); + if (!buf) + { + //VLOG_MINI_3(LOG_LEVEL_FATAL, "memory(0x%08x + %u) fatal when read USB image %d !!!\n", index, block, usb_img_index_); + ret = SCANNER_ERR_INSUFFICIENT_MEMORY; + break; + } + block = size; + ret = io_->read_bulk(buff, &block); + if (ret != SCANNER_ERR_OK) + break; + + off += block; + r -= block; + } + } + } + if (ret == SCANNER_ERR_OK) + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Read image from USB = %s\n", hg_scanner_err_name(ret)); + ret = save_usb_data(buf); + if (ret == SCANNER_ERR_OK) + { + pop_first_image(); + //if(image_prc_param_.bits.page == PAGE_SINGLE) + // pop_first_image(); + } + } + else + { + char msg[128]; + sprintf(msg, "Read image data from USB err: %s\n", hg_scanner_err_name(ret)); + LOG_INFO(LOG_LEVEL_DEBUG_INFO, msg); + notify_ui_working_status(msg); + notify_ui_working_status(STATU_DESC_SCANNER_ERR_TIMEOUT, SANE_EVENT_ERROR); + } + } + } + + return ret; +} +void hg_scanner_402::discard_all_images(void) +{ + char buf[64]; + HGEIntInfo* info = (HGEIntInfo*)buf; + int size = sizeof(buf), + oto = 0, + pre_img = 0, + pre_int = 0, + ret = SCANNER_ERR_OK; + + { + std::lock_guard lock(io_lock_); + oto = io_->get_timeout(); + io_->set_timeout(100); + ret = io_->read_interrupt(buf, &size); + } + while (ret == SCANNER_ERR_OK) + { + pre_int++; + if (info->From == IMG) + { + while (get_image_count() > 0) + { + pop_first_image(); + pre_img++; + } + } + + size = sizeof(buf); + { + std::lock_guard lock(io_lock_); + ret = io_->read_interrupt(buf, &size); + } + } + { + std::lock_guard lock(io_lock_); + io_->set_timeout(oto); + } + if (pre_int) + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "prev-connection has left %d interrupt packet(s) && %d image(s).\n", pre_int, pre_img); +} + +//color_mode =-1 除色选项 +int hg_scanner_402::on_color_mode_changed(int& color_mode) +{ + int ret = SCANNER_ERR_OK; + + if ((((color_mode == COLOR_MODE_24_BITS || color_mode == COLOR_MODE_AUTO_MATCH) && !dev_conf_.g200params.color) || + ((color_mode != COLOR_MODE_24_BITS && color_mode != COLOR_MODE_AUTO_MATCH) && dev_conf_.g200params.color)) && color_mode != -1) + { + dev_conf_.g200params.color ^= 1; + ret = writedown_device_configuration(); + if(ret) + dev_conf_.g200params.color ^= 1; + } + if(color_mode == COLOR_MODE_AUTO_MATCH) + { + dev_conf_.g200params.color = 1; + } + + HGSCANCONF d = dev_conf_; + + if (image_prc_param_.bits.rid_color != RID_COLOR_NONE + &&(image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) + ) + { + d.g200params.color = 1; + ret = writedown_device_configuration(&d); + } + + if(image_prc_param_.bits.rid_color != RID_COLOR_NONE + && (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) + && color_mode == -1) + { + d.g200params.color = 1; + } + else if (image_prc_param_.bits.rid_color == RID_COLOR_NONE + && (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) + && color_mode == -1) + { + d.g200params.color = 0; + } + if(color_mode == -1) + ret = writedown_device_configuration(&d); + + return ret; +} +int hg_scanner_402::on_paper_changed(int& paper) +{ + bool exact = true; + int ind = settings402::match_best_paper(paper, &exact, &paper_size_), + ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT; + + if (dev_conf_.g200params.paper != settings402::paper_map[ind].dev_value) + { + int old = dev_conf_.g200params.paper; + + dev_conf_.g200params.paper = settings402::paper_map[ind].dev_value; + ret = writedown_device_configuration(); + if (ret) + { + dev_conf_.g200params.paper = old; + for (int i = 0; i < ARRAY_SIZE(settings402::paper_map); ++i) + { + if (settings402::paper_map[i].dev_value == old) + { + paper = settings402::paper_map[i].paper; + break; + } + } + } + else if (!exact) + ret = SCANNER_ERR_NOT_EXACT; + } + + return ret; +} +int hg_scanner_402::on_paper_check_changed(bool& check) +{ + int ret = SCANNER_ERR_OK; + + if (dev_conf_.g200params.enable_sizecheck ^ check) + { + dev_conf_.g200params.enable_sizecheck = check; + ret = writedown_device_configuration(); + + if (ret) + { + dev_conf_.g200params.enable_sizecheck = !check; + check = dev_conf_.g200params.enable_sizecheck; + } + } + if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH + ||image_prc_param_.bits.paper == PAPER_MAX_SIZE + ||image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP + ||image_prc_param_.bits.paper == PAPER_TRIGEMINY + ||image_prc_param_.bits.paper == PAPER_16K + ||image_prc_param_.bits.paper == PAPER_8K + ||image_prc_param_.bits.paper == PAPER_16K_LATERAL + ) + { + HGSCANCONF *d = &dev_conf_; + d->g200params.enable_sizecheck = false; + ret = writedown_device_configuration(d); + } + + + return ret; +} +int hg_scanner_402::on_resolution_changed(int& dpi) +{ + bool exact = true; + int ind = settings402::match_best_resolution(dpi, &exact), + ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT; + + if (dev_conf_.g200params.dpi != settings402::resolution_map[ind].dev_value) + { + int old = dev_conf_.g200params.dpi; + dev_conf_.g200params.dpi = settings402::resolution_map[ind].dev_value; + dev_conf_.g200params.dpi = 1; + ret = writedown_device_configuration(); + if (ret) + { + dev_conf_.g200params.dpi = old; + } + else if (!exact) + ret = SCANNER_ERR_NOT_EXACT; + } + + if (ret == SCANNER_ERR_NOT_EXACT) + dpi = settings402::resolution_map[ind].resolution; + + + + return ret; +} + +int hg_scanner_402::on_ultrasonic_check_changed(bool& check) +{ + int ret = SCANNER_ERR_OK; + + if (dev_conf_.g200params.ultrasonic_enable ^ check) + { + dev_conf_.g200params.ultrasonic_enable = check; + ret = writedown_device_configuration(); + if (ret) + { + dev_conf_.g200params.ultrasonic_enable = !check; + check = dev_conf_.g200params.ultrasonic_enable; + } + } + + return ret; +} +int hg_scanner_402::on_staple_check_changed(bool& check) +{ + int ret = SCANNER_ERR_OK; + + if (dev_conf_.g200params.staple_enbale ^ check) + { + dev_conf_.g200params.staple_enbale = check; + ret = writedown_device_configuration(); + if (ret) + { + dev_conf_.g200params.staple_enbale = !check; + check = dev_conf_.g200params.staple_enbale; + } + } + + return ret; +} +int hg_scanner_402::on_skew_check_changed(bool& check) +{ + int ret = SCANNER_ERR_OK; + + if (dev_conf_.g200params.screw_detect_enable ^ check) + { + dev_conf_.g200params.screw_detect_enable = check; + ret = writedown_device_configuration(); + if (ret) + { + dev_conf_.g200params.screw_detect_enable = !check; + check = dev_conf_.g200params.screw_detect_enable; + } + } + + return ret; +} +int hg_scanner_402::on_skew_check_level_changed(int& check) +{ + int ret = SCANNER_ERR_OK, + val = check, + old = dev_conf_.g200params.screw_detect_level; + HGSCANCONF cf; + + cf.g200params.screw_detect_level = -1; + + if (val < 0) + { + val = 0; + ret = SCANNER_ERR_NOT_EXACT; + } + else if (val > cf.g200params.screw_detect_level) + { + val = cf.g200params.screw_detect_level; + ret = SCANNER_ERR_NOT_EXACT; + } + if (val != dev_conf_.g200params.screw_detect_level) + { + dev_conf_.g200params.screw_detect_level = val; + ret = writedown_device_configuration(); + if (ret) + check = dev_conf_.g200params.screw_detect_level = old; + } + if (ret == SCANNER_ERR_OK && val != check) + { + check = val; + ret = SCANNER_ERR_NOT_EXACT; + } + + return ret; +} + +void hg_scanner_402::on_device_reconnected(void) +{ + int ret = writedown_device_configuration(); + init_version(); + + rewrite_conf_ = ret != SCANNER_ERR_OK; + if (reset_) + { + reset_ = false; + start(); + } +} +int hg_scanner_402::on_scanner_closing(bool force) +{ + return SCANNER_ERR_OK; +} + +void hg_scanner_402::thread_handle_usb_read(void) +{ + char buf[32] = { 0 }; + HGEIntInfo* info = (HGEIntInfo*)buf; + int size = sizeof(buf), + ret = SCANNER_ERR_OK, + to_cnt = 0, + count = 0; + bool go = true; + + //status_ = SCANNER_ERR_DEVICE_BUSY; + while (run_ && go) + { + if (user_cancel_) + { + break; + } + size = sizeof(buf); + { + std::lock_guard lock(io_lock_); + + ret = io_->read_interrupt(buf, &size); + io_->set_timeout(1000); + } + VLOG_MINI_4(LOG_LEVEL_DEBUG_INFO, "read-INT = %s: From(%d), Code(%d), Index(%d)\n", hg_scanner_err_name(ret), + info->From, info->Code, info->Img_Index); + if (ret != SCANNER_ERR_OK) + { + if (ret == SCANNER_ERR_TIMEOUT) + { + if (to_cnt++ < 30) + { + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + if ((get_status() & 0x03) == 0) + { + status_ = SCANNER_ERR_OK; + break; + } + continue; + } + } + status_ = ret; + break; + } + + to_cnt = 0; + if (size == sizeof(buf)) + { + switch (info->From) + { + case IMG: + if (get_image_count() > 0) + { + read_one_image_from_usb(); + } + break; + case V4L2: + VLOG_MINI_1(LOG_LEVEL_FATAL, "V4L2 error: %d\n", info->Code); + { + bool cancel = user_cancel_; + stop(); + user_cancel_ = cancel; + go = false; + } + break; + default: + break; + } + } + else + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "read %d bytes, sizeof(buf) = %d\n", size, sizeof(buf)); + + this_thread::sleep_for(chrono::milliseconds(10)); + } + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "USB thread exit with code: %s, status = %s\n", hg_scanner_err_name(ret), hg_scanner_err_name(status_)); +} + +int hg_scanner_402::start(void) +{ + bool handled = false; + int ret = try_third_app_handle_start(handled), + val = 0; + + user_cancel_ = false; + + // for third-sane-app invoking, added on 2022-05-19 + if (handled) + return ret; + + user_cancel_ = false; + cb_mem_ = true; + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "scanner status: 0x%x\n", get_status()); + notify_ui_working_status(STATU_DESC_PREPARE_START); + + reset(); + get_roller_num(); + notify_ui_working_status(STATU_DESC_REWRITE_CONFIGURATION); + writedown_device_configuration(); + ret = read_register(/*SR_GET_ANDROID_STATE*/0x1001, &val); + if (val) + { + if (val == 1) + ret = status_ = SCANNER_ERR_DEVICE_COVER_OPENNED; + else if (val == 2) + ret = status_ = SCANNER_ERR_DEVICE_PAPER_JAMMED; + else if (val == 3) + ret = status_ = SCANNER_ERR_DEVICE_NO_PAPER; + else + ret = status_ = SCANNER_ERR_IO; + + return ret; + } + write_register(0x1000, scan_count_); + ret = write_command(SC_START); + VLOG_MINI_1(LOG_LEVEL_WARNING, "start result: %s\n", hg_scanner_err_name(ret)); + + io_->set_timeout(1000); + if (ret == SCANNER_ERR_OK) + { + //status_ = SCANNER_ERR_DEVICE_BUSY; + wait_usb_.notify(); + this_thread::sleep_for(chrono::milliseconds(100)); + ret = try_third_app_after_start(ret); + } + else + { + status_ = ret; + VLOG_MINI_3(LOG_LEVEL_WARNING, "(%s)[Thread %s]Send start command = %s\n", hg_log::current_time().c_str(), hg_log::format_current_thread_id().c_str(), hg_scanner_err_name(ret)); + } + + return ret; +} +int hg_scanner_402::stop(void) +{ + int ret = SCANNER_ERR_OK; + + user_cancel_ = true; + ret = write_command(SC_STOP); + io_->set_timeout(500); + final_imgs_.clear(); + + return status_; +} +int hg_scanner_402::reset(void) +{ + final_imgs_.clear(); + discard_all_images(); + + return status_; +} +int hg_scanner_402::device_io_control(unsigned long code, void* data, unsigned* len) +{ + int ret = SCANNER_ERR_OUT_OF_RANGE; + + if (HG_CONTROL_CODE_OPTION_ENABLE == code) + { + OPTEN* opten = (OPTEN*)data; + + ret = SCANNER_ERR_OK; + if (opten->opt_num == HG_239_SETTING_CORRECT && !opten->enabled) // for BUG-20 modified by Gongbing on 2022-03-12 + { + bool enable = true; + setting_automatic_skew(opten->opt_num, &enable); + } + } + else if (IO_CTRL_CODE_TEST_SINGLE == code) + { + test_1_paper_ = true; + ret = start(); + } + else + ret = hg_scanner::device_io_control(code, data, len); + + return ret; +} +std::string hg_scanner_402::get_firmware_version(void) +{ + return control_fetch(SR_GET_FWVERSION, 0, 512); +} +std::string hg_scanner_402::get_serial_num(void) +{ + return control_fetch(SR_GET_SERIALNUM, 0, 512); +} +std::string hg_scanner_402::get_ip(void) +{ + return control_fetch(SR_GET_IPADDR, 0, 512); +} +int hg_scanner_402::get_roller_num(void) +{ + int val = 0, + ret = read_register(SR_GET_ROLLER_NUM, &val); + + if (ret == SCANNER_ERR_OK) + return val; + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get_roller_num = %s\n", hg_scanner_err_name(ret)); + return -1; + } +} +int hg_scanner_402::clear_roller_num(void) +{ + int val = 0, + ret = read_register(SR_CLR_ROLLER_NUM, &val); + + return ret; +} + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int hg_scanner_402::set_leaflet_scan(void) +{ + int ret = SCANNER_ERR_OK; + test_1_paper_ = true; + + ret = start(); + return ret; +} +int hg_scanner_402::get_abuot_info(void) +{ + + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::restore_default_setting(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::set_final_image_format(SANE_FinalImgFormat* fmt) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} + +int hg_scanner_402::get_compression_format(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::set_compression_format(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::set_auto_color_type(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} + +int hg_scanner_402::get_device_code(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::get_sleep_time(SANE_Power* getime) +{ + int val = 0, + ret = read_register(SR_GET_SLEEPTIME, &val); + + if (ret == SCANNER_ERR_OK) + *getime = (SANE_Power)val; + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get_sleep_time = %s\n", hg_scanner_err_name(ret)); + return -1; + } +} + +int hg_scanner_402::set_sleep_time(int setsleepime) +{ + int ret = write_register(SR_SET_SLEEPTIME, setsleepime); + + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "set sleep time to %d = %s\n", setsleepime, hg_scanner_err_name(ret)); + + return ret; +} +int hg_scanner_402::get_dogear_distance(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::set_dogear_distance(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::get_scanner_paperon(SANE_Bool* paperon) +{ + int val = 0, + ret = read_register(SR_GET_PAPERON, &val); + + if (ret == SCANNER_ERR_OK) + { + if (!val) + { + ret = SCANNER_ERR_DEVICE_NO_PAPER; + if (paperon) + { + *paperon = true; + } + } + else + { + ret = SCANNER_ERR_OK; + if (paperon) + { + *paperon = false; + } + } + } + else + { + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "get_scanner_paperon = %s\n", hg_scanner_err_name(ret)); + return -1; + } + return ret; +} +int hg_scanner_402::set_scan_when_paper_on(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::get_scan_when_paper_on(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::get_scan_with_hole(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::set_scan_with_hole(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} +int hg_scanner_402::get_scan_is_sleep() +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} diff --git a/hgdriver/hgdev/hg_scanner_402.h b/hgdriver/hgdev/hg_scanner_402.h new file mode 100644 index 0000000..41b2045 --- /dev/null +++ b/hgdriver/hgdev/hg_scanner_402.h @@ -0,0 +1,117 @@ +#pragma once + +// hg_scanner is the base class of kinds of scanners +// +// created on 2022-01-30 +// +#include +#include +#include +#include +#include + +#include "hg_scanner.h" + +#ifdef OEM_HANWANG +#define hg_scanner_402 hw_scanner_402 +#elif defined(OEM_LISICHENG) +#define hg_scanner_402 lsc_scanner_402 +#endif + +class hg_scanner_402 : public hg_scanner +{ + //BlockingQueue>> final_imgs_; // JPG ... +// image_data final_imgs_; // JPG .. + + int pid_; + HGSCANCONF dev_conf_; + bool rewrite_conf_; + bool reset_; + bool is_kernelsnap_211209_; + + int read_register(int addr, int* val); + int write_register(int addr, int val); + int write_command(int cmd); + std::string control_fetch(int addr, int val, int size); + + std::string get_fpga(void); + int clr_roller_num(void); + int get_sleep_time(void); + int get_scan_mode(void); + int get_status(void); + bool is_dev_tx(void); + bool is_dev_image_process_done(void); + bool is_dev_image_keep_last_paper(void); + int get_scanned_count(void); + int get_image_count(void); + int get_front_data_size(void); + void init_version(void); + int get_device_sleep_stautus(void); + int get_device_paperon_stautus(void); + + int writedown_device_configuration(HGSCANCONF *dev_conf = NULL); + int writedown_image_configuration(void); + int pop_first_image(void); + + int read_one_image_from_usb(void); + void discard_all_images(void); + +protected: + int on_color_mode_changed(int& color_mode) override; + virtual int on_paper_changed(int& paper) override; + virtual int on_paper_check_changed(bool& check) override; + virtual int on_resolution_changed(int& dpi) override; + + virtual int on_ultrasonic_check_changed(bool& check) override; + virtual int on_staple_check_changed(bool& check) override; + virtual int on_skew_check_changed(bool& check) override; + virtual int on_skew_check_level_changed(int& check) override; + + virtual void on_device_reconnected(void) override; + virtual int on_scanner_closing(bool force) override; + virtual void thread_handle_usb_read(void) override; + virtual void image_process(std::shared_ptr& buff) override; + +public: + hg_scanner_402(const char* dev_name, int pid,usb_io* io); + ~hg_scanner_402(); + +public: + virtual int start(void) override; + //virtual int get_image_info(IMG_PARAM* ii) override; + //virtual int read_image_data(unsigned char* buf, int* len) override; + virtual int stop(void) override; + virtual int reset(void) override; + virtual int device_io_control(unsigned long code, void* data, unsigned* len) override; + +public: + virtual int set_leaflet_scan(void);//单张扫描 + virtual int get_abuot_info(void);//获取软件关于信息 (基类实现) + virtual int restore_default_setting(void);//恢复默认设置 (基类实现) + virtual int set_final_image_format(SANE_FinalImgFormat* fmt); // 设置图像处理最终输出(final())的图像数据格式 (基类实现) *** + virtual int get_compression_format(void);//获取支持的压缩格式 ***功能不支持 + + virtual int get_roller_num(void); //获取滚轮张数 ***完成 + virtual int clear_roller_num(void); // 清除滚轴计数 ***完成 + + virtual int set_compression_format(void);//设置图像数据最终输出的压缩格式 ***功能不支持 + virtual int set_auto_color_type(void);// 设置自动匹配颜色模式 (基类实现) ***完成 + + virtual std::string get_firmware_version(void); + virtual std::string get_serial_num(void); + virtual std::string get_ip(void); + + virtual int get_device_code(void);//获取设备编码 + virtual int get_sleep_time(SANE_Power* getime);//获取功耗模式(休眠) + virtual int set_sleep_time(int setsleepime);//设置功耗模式(休眠) + + virtual int get_dogear_distance(void);//获取折角检测最小距离阈值 + virtual int set_dogear_distance(void);// 设置折角检测最小距离阈值 + virtual int get_scanner_paperon(SANE_Bool* paperon = NULL);//获取设备有无纸张 + virtual int set_scan_when_paper_on(void);//获取是否为检测到进纸盘上有纸即开始扫描 + virtual int get_scan_when_paper_on(void);//设置是否为检测到进纸盘上有纸即开始扫描 + virtual int get_scan_with_hole(void);// 获取是否为带孔扫描 + virtual int set_scan_with_hole(void);// 设置是否为带孔扫描 + + virtual int get_scan_is_sleep(void);//获取设备是否休眠当中 +}; diff --git a/hgdriver/hgdev/scanner_manager.cpp b/hgdriver/hgdev/scanner_manager.cpp index a1ed3f8..9c3c0af 100644 --- a/hgdriver/hgdev/scanner_manager.cpp +++ b/hgdriver/hgdev/scanner_manager.cpp @@ -12,6 +12,7 @@ #include "hg_scanner_239.h" #include "hg_scanner_300.h" #include "hg_scanner_400.h" +#include "hg_scanner_402.h" /// /// supporting devices : @@ -22,30 +23,36 @@ static struct std::string name; // product name std::string type; // product type std::string rsc; // USB resource, version-addr. e.g. "USB2.0-1" + hg_scanner* (* create_scanner)(const char*, usb_io*, scanner_handle*); } g_supporting_devices[] = { #ifdef OEM_LISICHENG - {0x31c9, 0x8420, SCANNER_NAME_LSC_G42S, "G426xF", ""} - , {0x31c9, 0x8520, SCANNER_NAME_LSC_G52S, "G52x0F", ""} - , {0x31c9, 0x8620, SCANNER_NAME_LSC_G62S, "G6290U", ""} - , {0x31c9, 0x8629, SCANNER_NAME_LSC_G62S, "G6290U", ""} - , {0x31c9, 0x8730, SCANNER_NAME_LSC_G73S, "G73x0U", ""} - , {0x31c9, 0x8739, SCANNER_NAME_LSC_G73S, "G73x0U", ""}, + {0x31c9, 0x8420, SCANNER_NAME_LSC_G42S, "G426xF", "", &hg_scanner_mgr::create_scanner_g300} + , {0x31c9, 0x8520, SCANNER_NAME_LSC_G52S, "G52x0F", "", &hg_scanner_mgr::create_scanner_g400} + , {0x31c9, 0x8620, SCANNER_NAME_LSC_G62S, "G6290U", "", &hg_scanner_mgr::create_scanner_g100} + , {0x31c9, 0x8629, SCANNER_NAME_LSC_G62S, "G6290U", "", &hg_scanner_mgr::create_scanner_g239} + , {0x31c9, 0x8730, SCANNER_NAME_LSC_G73S, "G73x0U", "", &hg_scanner_mgr::create_scanner_g100} + , {0x31c9, 0x8739, SCANNER_NAME_LSC_G73S, "G73x0U", "", &hg_scanner_mgr::create_scanner_g239} + , {0x31c9, 0x8529, SCANNER_NAME_LSC_G52S, "G52x0F", "", &hg_scanner_mgr::create_scanner_g239} + , {0x31c9, 0x8429, SCANNER_NAME_LSC_G42S, "G42x0F", "", &hg_scanner_mgr::create_scanner_empty} + #elif defined(OEM_HANWANG) - {0x2903, 0x7000, SCANNER_NAME_HW_7000, "HW-74x0WA", ""} - , {0x2903, 0x1000, SCANNER_NAME_HW_1060A, "HW-1060A", ""} - , {0x2903, 0x8000, SCANNER_NAME_HW_8090F, "HW-8090F", ""} - , {0x2903, 0x9000, SCANNER_NAME_HW_9110F, "HW-9110F", ""}, + {0x2903, 0x7000, SCANNER_NAME_HW_7000, "HW-74x0WA", "", &hg_scanner_mgr::create_scanner_g400} + , {0x2903, 0x1000, SCANNER_NAME_HW_1060A, "HW-1060A", "", &hg_scanner_mgr::create_scanner_g300} + , {0x2903, 0x8000, SCANNER_NAME_HW_8090F, "HW-8090F", "", &hg_scanner_mgr::create_scanner_g239} + , {0x2903, 0x9000, SCANNER_NAME_HW_9110F, "HW-9110F", "", &hg_scanner_mgr::create_scanner_g239} + , {0x2903, 0x7039, SCANNER_NAME_HW_7039F, "HW-7039F", "", &hg_scanner_mgr::create_scanner_g239} #else - {0x3072, 0x100, SCANNER_NAME_HG_G100, "GScanO200", ""} - , {0x3072, 0x200, SCANNER_NAME_HG_G200, "GScanO200", ""} - , {0x3072, 0x300, SCANNER_NAME_HG_G300, "GScanO400", ""} - , {0x3072, 0x400, SCANNER_NAME_HG_G400, "GScanO400", ""} - , {0x3072, 0x139, SCANNER_NAME_HG_G139, "GScanO1003399", ""} - , {0x3072, 0x239, SCANNER_NAME_HG_G239, "GScanO1003399", ""} - , {0x3072, 0x339, SCANNER_NAME_HG_G339, "GScanO1003399", ""} - , {0x3072, 0x439, SCANNER_NAME_HG_G439, "GScanO1003399", ""} - , {0x064B, 0x7823, SCANNER_NAME_HG_G200, "GScanO200", ""} + {0x3072, 0x100, SCANNER_NAME_HG_G100, "GScanO200", "", &hg_scanner_mgr::create_scanner_g100} + , {0x3072, 0x200, SCANNER_NAME_HG_G200, "GScanO200", "", &hg_scanner_mgr::create_scanner_g100} + , {0x3072, 0x300, SCANNER_NAME_HG_G300, "GScanO400", "", &hg_scanner_mgr::create_scanner_g300} + , {0x3072, 0x400, SCANNER_NAME_HG_G400, "GScanO400", "", &hg_scanner_mgr::create_scanner_g400} + , {0x3072, 0x139, SCANNER_NAME_HG_G139, "GScanO1003399", "", &hg_scanner_mgr::create_scanner_g239} + , {0x3072, 0x239, SCANNER_NAME_HG_G239, "GScanO1003399", "", &hg_scanner_mgr::create_scanner_g239} + , {0x3072, 0x339, SCANNER_NAME_HG_G339, "GScanO1003399", "", &hg_scanner_mgr::create_scanner_empty} + , {0x3072, 0x439, SCANNER_NAME_HG_G439, "GScanO1003399", "", &hg_scanner_mgr::create_scanner_g239} + , {0x064B, 0x7823, SCANNER_NAME_HG_G200, "GScanO200", "", &hg_scanner_mgr::create_scanner_empty} + , {0x3072, 0x402, SCANNER_NAME_HG_G402, "GScanO4003399", "", &hg_scanner_mgr::create_scanner_g402} #endif }; static std::string g_vendor = COMPANY_NAME; @@ -123,6 +130,59 @@ void hg_scanner_mgr::set_version(int hh, int hl, int lh, int ll) hg_scanner_mgr::ver_patch_ = ll; } +hg_scanner* hg_scanner_mgr::create_scanner_empty(const char* name, usb_io* io, scanner_handle* h) +{ + if (h) + *h = nullptr; + + return nullptr; +} +hg_scanner* hg_scanner_mgr::create_scanner_g100(const char* name, usb_io* io, scanner_handle* h) +{ + hg_scanner_200* s = new hg_scanner_200(name, 0x100, io); + + if (h) + *h = s; + + return dynamic_cast(s); +} +hg_scanner* hg_scanner_mgr::create_scanner_g239(const char* name, usb_io* io, scanner_handle* h) +{ + hg_scanner_239* s = new hg_scanner_239(name, 0x239, io); + + if (h) + *h = s; + + return dynamic_cast(s); +} +hg_scanner* hg_scanner_mgr::create_scanner_g300(const char* name, usb_io* io, scanner_handle* h) +{ + hg_scanner_300* s = new hg_scanner_300(name, 0x300, io); + + if (h) + *h = s; + + return dynamic_cast(s); +} +hg_scanner* hg_scanner_mgr::create_scanner_g400(const char* name, usb_io* io, scanner_handle* h) +{ + hg_scanner_400* s = new hg_scanner_400(name, 0x400, io); + + if (h) + *h = s; + + return dynamic_cast(s); +} +hg_scanner* hg_scanner_mgr::create_scanner_g402(const char* name, usb_io* io, scanner_handle* h) +{ + hg_scanner_402* s = new hg_scanner_402(name, 0x400, io); + + if (h) + *h = s; + + return dynamic_cast(s); +} + void hg_scanner_mgr::usb_event_handle(usb_event ev, libusb_device* device, int vid, int pid, int usb_ver_h, int usb_ver_l, bool* retry, void* user) // usb_ver_h.usb_ver_l { hg_scanner_mgr* obj = (hg_scanner_mgr*)user; @@ -463,50 +523,54 @@ scanner_err hg_scanner_mgr::hg_scanner_open(scanner_handle* h, const char* name, ret = (scanner_err)usb_manager::instance()->open(it->dev, &io, &msg); if (ret == SCANNER_ERR_OK) { - hg_scanner* scanner = NULL; - if (g_supporting_devices[it->ind].pid == 0x100 || - g_supporting_devices[it->ind].pid == 0x200 || - g_supporting_devices[it->ind].pid == 0x8620|| - g_supporting_devices[it->ind].pid == 0x8730 ) + hg_scanner* scanner = g_supporting_devices[it->ind].create_scanner(g_supporting_devices[it->ind].name.c_str(), io, h); + if (!scanner) { - hg_scanner_200* s200 = new hg_scanner_200(g_supporting_devices[it->ind].name.c_str(), 0x100, io); + if (g_supporting_devices[it->ind].pid == 0x100 || + g_supporting_devices[it->ind].pid == 0x200 || + g_supporting_devices[it->ind].pid == 0x8620 || + g_supporting_devices[it->ind].pid == 0x8730) + { + hg_scanner_200* s200 = new hg_scanner_200(g_supporting_devices[it->ind].name.c_str(), 0x100, io); - scanner = dynamic_cast(s200); - *h = (scanner_handle)s200; - } - else if (g_supporting_devices[it->ind].pid == 0x239 || - g_supporting_devices[it->ind].pid == 0x139 || - g_supporting_devices[it->ind].pid == 0x8000|| - g_supporting_devices[it->ind].pid == 0x9000|| - g_supporting_devices[it->ind].pid == 0x8739|| - g_supporting_devices[it->ind].pid == 0x8629 ) - { - hg_scanner_239* s239 = new hg_scanner_239(g_supporting_devices[it->ind].name.c_str(),0x239, io); + scanner = dynamic_cast(s200); + *h = (scanner_handle)s200; + } + else if (g_supporting_devices[it->ind].pid == 0x239 || + g_supporting_devices[it->ind].pid == 0x139 || + g_supporting_devices[it->ind].pid == 0x8000 || + g_supporting_devices[it->ind].pid == 0x9000 || + g_supporting_devices[it->ind].pid == 0x8739 || + g_supporting_devices[it->ind].pid == 0x8629 || + g_supporting_devices[it->ind].pid == 0x0439 || + g_supporting_devices[it->ind].pid == 0x7039 || + g_supporting_devices[it->ind].pid == 0x8529) + { + hg_scanner_239* s239 = new hg_scanner_239(g_supporting_devices[it->ind].name.c_str(), 0x239, io); - scanner = dynamic_cast(s239); - *h = (scanner_handle)s239; - } - else if (g_supporting_devices[it->ind].pid == 0x400 || - g_supporting_devices[it->ind].pid == 0x7000|| - g_supporting_devices[it->ind].pid == 0x8520) - { - hg_scanner_400* s400 = new hg_scanner_400(g_supporting_devices[it->ind].name.c_str(), 0x400, io); - scanner = dynamic_cast(s400); - *h = (scanner_handle)s400; - } - else if (g_supporting_devices[it->ind].pid == 0x300 || - g_supporting_devices[it->ind].pid == 0x1000|| - g_supporting_devices[it->ind].pid == 0x8420) - { - hg_scanner_300* s300 = new hg_scanner_300(g_supporting_devices[it->ind].name.c_str(),0x300, io); - scanner = dynamic_cast(s300); - *h = (scanner_handle)s300; + scanner = dynamic_cast(s239); + *h = (scanner_handle)s239; + } + else if (g_supporting_devices[it->ind].pid == 0x400 || + g_supporting_devices[it->ind].pid == 0x7000 || + g_supporting_devices[it->ind].pid == 0x8520) + { + hg_scanner_400* s400 = new hg_scanner_400(g_supporting_devices[it->ind].name.c_str(), 0x400, io); + scanner = dynamic_cast(s400); + *h = (scanner_handle)s400; + } + else if (g_supporting_devices[it->ind].pid == 0x300 || + g_supporting_devices[it->ind].pid == 0x1000 || + g_supporting_devices[it->ind].pid == 0x8420) + { + hg_scanner_300* s300 = new hg_scanner_300(g_supporting_devices[it->ind].name.c_str(), 0x300, io); + scanner = dynamic_cast(s300); + *h = (scanner_handle)s300; + } } if (scanner) - { scanner->set_ui_callback(&hg_scanner_mgr::ui_default_callback, hg_scanner_mgr::async_io_enabled_); - } std::lock_guard lock(mutex_dev_); std::vector::iterator ptr = std::find(online_devices_.begin(), online_devices_.end(), name); diff --git a/hgdriver/hgdev/scanner_manager.h b/hgdriver/hgdev/scanner_manager.h index 6b53253..eb59141 100644 --- a/hgdriver/hgdev/scanner_manager.h +++ b/hgdriver/hgdev/scanner_manager.h @@ -88,6 +88,13 @@ public: static void clear(void); static void set_version(int hh, int hl, int lh, int ll); + static hg_scanner* create_scanner_empty(const char* name, usb_io* io, scanner_handle* h); + static hg_scanner* create_scanner_g100(const char* name, usb_io* io, scanner_handle* h); + static hg_scanner* create_scanner_g239(const char* name, usb_io* io, scanner_handle* h); + static hg_scanner* create_scanner_g300(const char* name, usb_io* io, scanner_handle* h); + static hg_scanner* create_scanner_g400(const char* name, usb_io* io, scanner_handle* h); + static hg_scanner* create_scanner_g402(const char* name, usb_io* io, scanner_handle* h); + public: scanner_err hg_scanner_enum(ScannerInfo* scanner_list, long* count, bool local_only); scanner_err hg_scanner_open(scanner_handle* h, const char* name, bool shared, const char* user, const char* pwd, const char* check, char* rsc);