#include "hardware.h" #include "./cis/FpgaComm.h" #include "./cis/gvideoisp1.h" #include "./motor/motorboard.h" #include #include #include #include #include ///////////////////////////////////////////////////////////////////////////////////////////////////////// // scanner_hw // #define TEST_1 #ifdef TEST_1 static std::string device_opt_json[] = { "{\"cis-mode\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"CIS\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u955c\\u5934\\u8272\\u5f69\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"type\":\"string\",\"ui-pos\":10,\"auth\":0,\"bind\":true,\"size\":12,\"default\":{\"(mode.enabled&&(mode==256\\u7ea7\\u7070\\u5ea6||mode==\\u9ed1\\u767d)) || (multiout-type.enabled&&multiout-type==\\u7070\\u5ea6+\\u9ed1\\u767d)\":\"\\u7070\\u5ea6\",\"default\":\"\\u5f69\\u8272\"},\"range\":[\"\\u5f69\\u8272\",\"\\u7070\\u5ea6\"]},\"cis-dpi\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"CIS\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u955c\\u5934\\u5de5\\u4f5c\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"ui-pos\":11,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"resolution>=400\":600,\"default\":300},\"range\":[300,600]},\"y-dpi\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u8d70\\u7eb8\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8d70\\u7eb8\\u65b9\\u5411\\u7684\\u56fe\\u50cf\\u91c7\\u96c6\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"ui-pos\":13,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"resolution>200 && resolution<400\":300,\"resolution>=400\":600,\"default\":200},\"range\":[200,300,600]},\"cis-led\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"CIS\\u706f\",\"desc\":\"CIS\\u5de5\\u4f5c\\u65f6\\uff0c\\u662f\\u5426\\u6253\\u5f00\\u80cc\\u666f\\u706f\",\"type\":\"bool\",\"ui-pos\":12,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"fix-id\":34831,\"ui-pos\":30,\"auth\":0,\"size\":44,\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"16\\u5f00\",\"A5\",\"A6\",\"B4\",\"B5\",\"B6\",\"Letter\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",{\"resolution<500\":\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"},{\"resolution<500\":\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\"},{\"resolution<500\":\"\\u4e09\\u8054\\u8bd5\\u5377\"}]},\"lateral\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u6a2a\\u5411\",\"desc\":\"\\u6a2a\\u5411\\u653e\\u7f6e\\u7eb8\\u5f20\",\"type\":\"bool\",\"fix-id\":34924,\"ui-pos\":31,\"auth\":0,\"affect\":6,\"visible\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper==A4 || paper==16\\u5f00 || paper==A5 || paper==A6 || paper==B5 || paper==B6 || paper==Letter\"},\"paper-w\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5bbd\\u5ea6\",\"desc\":\"\\u4ee5\\u6beb\\u7c73\\u4e3a\\u5355\\u4f4d\\u7684\\u7eb8\\u5f20\\u5bbd\",\"type\":\"float\",\"fix-id\":34922,\"ui-pos\":32,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"visible\":0,\"size\":8,\"auto\":false,\"ownread\":true,\"cur\":210.000000,\"default\":210.000000},\"paper-h\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u9ad8\\u5ea6\",\"desc\":\"\\u4ee5\\u6beb\\u7c73\\u4e3a\\u5355\\u4f4d\\u7684\\u7eb8\\u5f20\\u9ad8\",\"type\":\"float\",\"fix-id\":34923,\"ui-pos\":33,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"visible\":0,\"size\":8,\"auto\":false,\"ownread\":true,\"cur\":297.000000,\"default\":297.000000},\"is-wait-scan\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\",\"desc\":\"\\u542f\\u7528\\u540e\\uff0c\\u6587\\u7a3f\\u653e\\u5165\\u626b\\u63cf\\u4eea\\u65f6\\u5c06\\u81ea\\u52a8\\u542f\\u52a8\\u626b\\u63cf\",\"type\":\"bool\",\"fix-id\":34873,\"ui-pos\":12,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"wait-scan-exit\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\\u9000\\u51fa\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u7ed3\\u675f\\u5f85\\u7eb8\\u626b\\u63cf\\u7684\\u65f6\\u95f4\",\"type\":\"string\",\"fix-id\":34920,\"ui-pos\":13,\"auth\":0,\"size\":16,\"cur\":\"60s\",\"default\":\"60s\",\"range\":[\"15s\",\"30s\",\"60s\",\"2min\",\"4min\",\"8min\"],\"depend\":\"is-wait-scan==true\"},\"scan-mode\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"fix-id\":34862,\"ui-pos\":15,\"auth\":0,\"size\":24,\"cur\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\",\"default\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\",\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"],\"depend\":\"is-wait-scan==false\"},\"scan-count\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"fix-id\":34863,\"ui-pos\":16,\"auth\":0,\"size\":4,\"default\":{\"default\":1},\"depend\":\"scan-mode.enabled&&scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"},\"is-auto-strength\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u81ea\\u52a8\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u81ea\\u52a8\\u4fee\\u6b63\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"bool\",\"fix-id\":34876,\"ui-pos\":27,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"feed-strength-value\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u8fdb\\u7eb8\\u5931\\u8d25\\u7387\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u503c\\u65f6\\u626b\\u63cf\\u4eea\\u5c06\\u8c03\\u6574\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"float\",\"fix-id\":34877,\"ui-pos\":28,\"auth\":0,\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.100000,\"max\":0.900000,\"step\":0.080000},\"depend\":\"is-auto-strength==true\"},\"feed-strength\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"string\",\"fix-id\":34874,\"ui-pos\":30,\"auth\":0,\"size\":12,\"cur\":\"\\u4e00\\u822c\",\"default\":\"\\u4e00\\u822c\",\"range\":[\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\"],\"depend\":\"is-auto-strength!=true\"},\"time-to-sleep\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u4f11\\u7720\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u4f11\\u7720\\u65f6\\u95f4\",\"type\":\"string\",\"fix-id\":34875,\"ui-pos\":33,\"auth\":0,\"size\":16,\"cur\":\"\\u4e0d\\u4f11\\u7720\",\"default\":\"\\u4e0d\\u4f11\\u7720\",\"range\":[\"\\u4e0d\\u4f11\\u7720\",\"\\u4e94\\u5206\\u949f\",\"\\u5341\\u5206\\u949f\",\"\\u534a\\u5c0f\\u65f6\",\"\\u4e00\\u5c0f\\u65f6\",\"\\u4e24\\u5c0f\\u65f6\",\"\\u56db\\u5c0f\\u65f6\"]},\"baud\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u6ce2\\u7279\\u7387\",\"desc\":\"CIS\\u63a7\\u5236\\u901a\\u4fe1\\u901f\\u7387\",\"type\":\"int\",\"ui-pos\":20,\"auth\":0,\"size\":4,\"cur\":921600,\"default\":921600,\"range\":[110,300,600,1200,2400,4800,9600,19200,38400,57600,115200,500000,921600,1500000]},\"act-after\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u5ef6\\u8fdf\\u54cd\\u5e94\",\"desc\":\"\\u91c7\\u96c6\\u5934\\u63a5\\u53d7\\u547d\\u4ee4\\u540e\\u7684\\u52a8\\u4f5c\\u5ef6\\u8fdf\\u65f6\\u95f4\",\"type\":\"int\",\"ui-pos\":21,\"auth\":0,\"unit\":\"microsec\",\"size\":4,\"cur\":1000,\"default\":1000},\"frame-h\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u5e27\\u9ad8\\u5ea6\",\"desc\":\"\\u91c7\\u96c6\\u5934\\u6bcf\\u4e00\\u5e27\\u7684\\u91c7\\u96c6\\u9ad8\\u5ea6\",\"type\":\"int\",\"ui-pos\":22,\"auth\":0,\"size\":4,\"cur\":12,\"default\":12},\"sample\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u91c7\\u6837\\u9891\\u7387\",\"desc\":\"\\u91c7\\u6837\\u9891\\u7387\",\"type\":\"int\",\"ui-pos\":23,\"auth\":0,\"size\":4,\"cur\":201,\"default\":201},\"paper-on\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u7eb8\\u5f20\\u5c31\\u7eea\",\"desc\":\"\\u7eb8\\u5f20\\u5df2\\u7ecf\\u5728\\u8fdb\\u7eb8\\u53f0\\u4e0a\\u653e\\u7f6e\\u597d\",\"type\":\"bool\",\"fix-id\":34912,\"ui-pos\":10,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"ownread\":true,\"cur\":false,\"default\":false},\"double-chk\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u6709\\u4e24\\u5f20\\u6216\\u8005\\u591a\\u5f20\\u7eb8\\u540c\\u65f6\\u6413\\u8fdb\",\"type\":\"string\",\"ui-pos\":18,\"auth\":0,\"size\":16,\"cur\":\"\\u8d85\\u58f0\\u6ce2\",\"default\":\"\\u8d85\\u58f0\\u6ce2\",\"range\":[\"\\u8d85\\u58f0\\u6ce2\",\"\\u7981\\u7528\"]},\"is-staple\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u6709\\u8ba2\\u4e66\\u9489\\u5b58\\u5728\",\"type\":\"bool\",\"fix-id\":34861,\"ui-pos\":20,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"motor-speed\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u8d70\\u7eb8\\u901f\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u8d70\\u7eb8\\u7535\\u673a\\u7684\\u901f\\u5ea6\\uff0c\\u5f20\\/\\u5206\\uff08PPM\\uff09\",\"type\":\"int\",\"ui-pos\":25,\"auth\":0,\"size\":4,\"cur\":100,\"default\":100,\"range\":[{\"dev-model!=G200\":70},{\"dev-model!=G200\":80},{\"dev-model!=G200\":90},100,{\"dev-model==G200\":110},{\"dev-model==G200\":120},{\"dev-model==G200\":130}]},\"is-check-askew\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u8fdb\\u7eb8\\u662f\\u5426\\u6b6a\\u659c\",\"type\":\"bool\",\"fix-id\":34868,\"ui-pos\":22,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u5bb9\\u5fcd\\u5ea6\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u5bb9\\u5fcd\\u5f97\\u9001\\u5165\\u6587\\u7a3f\\u6b6a\\u659c\\u89d2\\u5ea6\\u8d8a\\u5c0f\",\"type\":\"int\",\"fix-id\":34869,\"ui-pos\":23,\"auth\":0,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend\":\"is-check-askew==true\"},\"motor-ver\":{\"cat\":\"none\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u7535\\u673a\\u9a71\\u52a8\\u7248\\u672c\",\"desc\":\"\\u7535\\u673a\\u677f\\u9a71\\u52a8\\u7a0b\\u5e8f\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"fix-id\":34909,\"ui-pos\":16,\"auth\":0,\"readonly\":true,\"size\":24,\"a", "uto\":false,\"cur\":\"\",\"default\":\"\"},\"fpga-ver\":{\"cat\":\"none\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"CIS\\u63a7\\u5236\\u5668\\u7248\\u672c\",\"desc\":\"\\u955c\\u5934\\u53c2\\u6570\\u63a7\\u5236\\u9a71\\u52a8\\u7a0b\\u5e8f\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"ui-pos\":17,\"auth\":0,\"readonly\":true,\"size\":24,\"auto\":false,\"cur\":\"\",\"default\":\"\"},\"cis-len\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u955c\\u5934\\u957f\",\"desc\":\"\\u56fe\\u50cf\\u91c7\\u96c6\\u955c\\u5934\\u7684\\u957f\\u5ea6\\uff0c\\u5355\\u4f4d\\u4e3a\\u6beb\\u7c73\\uff08mm\\uff09\",\"type\":\"int\",\"ui-pos\":30,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":3888,\"default\":3888},\"stretch-h\":{\"cat\":\"base\",\"group\":\"CIS\",\"title\":\"\\u6c34\\u5e73\\u62c9\\u4f38\\u7387\",\"desc\":\"\\u4e3a\\u62b5\\u6297\\u5f62\\u53d8\\uff0c\\u5728\\u6c34\\u5e73\\u65b9\\u5411\\u7684\\u62c9\\u4f38\\u7387\",\"type\":\"float\",\"ui-pos\":40,\"auth\":0,\"size\":8,\"auto\":false,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":1.000000,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":1.000000,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":1.000000,\"default\":1.000000},\"range\":{\"min\":0.500000,\"max\":2.000000,\"step\":0.100000}},\"stretch-v\":{\"cat\":\"base\",\"group\":\"CIS\",\"title\":\"\\u5782\\u76f4\\u62c9\\u4f38\\u7387\",\"desc\":\"\\u4e3a\\u62b5\\u6297\\u5f62\\u53d8\\uff0c\\u5728\\u5782\\u76f4\\u65b9\\u5411\\u7684\\u62c9\\u4f38\\u7387\",\"type\":\"float\",\"ui-pos\":41,\"auth\":0,\"size\":8,\"auto\":false,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":1.000000,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":1.000000,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":1.000000,\"default\":1.000000},\"range\":{\"min\":0.500000,\"max\":2.000000,\"step\":0.100000}},\"cis-sp\":{\"cat\":\"base\",\"group\":\"CIS\",\"title\":\"\\u901f\\u73871\",\"desc\":\"FPGA\\u6700\\u4f73\\u901f\\u7387\",\"type\":\"int\",\"ui-pos\":42,\"auth\":0,\"bind\":true,\"size\":4,\"auto\":false,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":2637,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":1531,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":4595,\"default\":816}},\"expo-fr\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u6b63\\u9762\\u7ea2\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u6b63\\u9762\\u7ea2\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":70,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":336,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":622,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":673,\"default\":313},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-fg\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u6b63\\u9762\\u7eff\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u6b63\\u9762\\u7eff\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":71,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":336,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":611,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":673,\"default\":306},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-fb\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u6b63\\u9762\\u84dd\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u6b63\\u9762\\u84dd\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":72,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":336,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":590,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":673,\"default\":297},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-br\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u80cc\\u9762\\u7ea2\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u80cc\\u9762\\u7ea2\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":73,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":410,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":713,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":811,\"default\":360},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-bg\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u80cc\\u9762\\u7eff\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u80cc\\u9762\\u7eff\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":74,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":410,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":758,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":811,\"default\":380},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-bb\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u80cc\\u9762\\u84dd\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u80cc\\u9762\\u84dd\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":75,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":410,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":722,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":811,\"default\":361},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"gain-f-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":90,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":91,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":92,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":93,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":94,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":95,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":120,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":121,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":122,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":123,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-5\":{\"cat\":\"none\",\"group\":\"CIS\"", ",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":124,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":125,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":160,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":116,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":115,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":116,\"default\":113},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":161,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":121,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":119,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":121,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":162,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":119,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":118,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":121,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":163,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":128,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":126,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":129,\"default\":124},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":164,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":129,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":127,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":130,\"default\":126},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":165,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":127,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":125,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":127,\"default\":125},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":200,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":110,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":109,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":112,\"default\":109},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":201,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":120,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":120,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":121,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":202,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":115,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":114,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":116,\"default\":114},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":203,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":117,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":117,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":120,\"default\":117},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":204,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":118,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":117,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":119,\"default\":116},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":205,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":121,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":120,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":123,\"default\":119},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"phase-f\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u76f8\\u4f4d\",\"desc\":\"CIS\\u6b63\\u9762\\u5206\\u6bb5\\u4e4b\\u95f4\\u7684\\u76f8\\u4f4d\\u5dee\",\"type\":\"int\",\"ui-pos\":26,\"auth\":0,\"size\":4,\"cur\":66,\"default\":66,\"range\":{\"min\":0,\"max\":256,\"step\":1}},\"phase-b\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u76f8\\u4f4d\",\"desc\":\"CIS\\u80cc\\u9762\\u5206\\u6bb5\\u4e4b\\u95f4\\u7684\\u76f8\\u4f4d\\u5dee\",\"type\":\"int\",\"ui-pos\":27,\"auth\":0,\"size\":4,\"cur\":67,\"default\":67,\"range\":{\"min\":0,\"max\":256,\"step\":1}}}" }; #else static std::string device_opt_json[] = { "{\"cis-mode\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"CIS\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u955c\\u5934\\u8272\\u5f69\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"type\":\"string\",\"ui-pos\":10,\"auth\":0,\"bind\":true,\"size\":12,\"default\":{\"(mode.enabled&&(mode==256\\u7ea7\\u7070\\u5ea6||mode==\\u9ed1\\u767d)) || (multiout-type.enabled&&multiout-type==\\u7070\\u5ea6+\\u9ed1\\u767d)\":\"\\u7070\\u5ea6\",\"default\":\"\\u5f69\\u8272\"},\"range\":[\"\\u5f69\\u8272\",\"\\u7070\\u5ea6\"]},\"cis-dpi\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"CIS\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u955c\\u5934\\u5de5\\u4f5c\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"ui-pos\":11,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"resolution>=400\":600,\"default\":300},\"range\":[300,600]},\"y-dpi\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u8d70\\u7eb8\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8d70\\u7eb8\\u65b9\\u5411\\u7684\\u56fe\\u50cf\\u91c7\\u96c6\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"ui-pos\":13,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"resolution>200 && resolution<400\":300,\"resolution>=400\":600,\"default\":200},\"range\":[200,300,600]},\"cis-led\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"CIS\\u706f\",\"desc\":\"CIS\\u5de5\\u4f5c\\u65f6\\uff0c\\u662f\\u5426\\u6253\\u5f00\\u80cc\\u666f\\u706f\",\"type\":\"bool\",\"ui-pos\":12,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"fix-id\":34831,\"ui-pos\":30,\"auth\":0,\"size\":44,\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"16\\u5f00\",\"A5\",\"A6\",\"B4\",\"B5\",\"B6\",\"Letter\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",{\"resolution<500\":\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"},{\"resolution<500\":\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\"},{\"resolution<500\":\"\\u4e09\\u8054\\u8bd5\\u5377\"}]},\"lateral\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u6a2a\\u5411\",\"desc\":\"\\u6a2a\\u5411\\u653e\\u7f6e\\u7eb8\\u5f20\",\"type\":\"bool\",\"fix-id\":34924,\"ui-pos\":31,\"auth\":0,\"affect\":6,\"visible\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper==A4 || paper==16\\u5f00 || paper==A5 || paper==A6 || paper==B5 || paper==B6 || paper==Letter\"},\"paper-w\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5bbd\\u5ea6\",\"desc\":\"\\u4ee5\\u6beb\\u7c73\\u4e3a\\u5355\\u4f4d\\u7684\\u7eb8\\u5f20\\u5bbd\",\"type\":\"float\",\"fix-id\":34922,\"ui-pos\":32,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"visible\":0,\"size\":8,\"auto\":false,\"ownread\":true,\"cur\":210.000000,\"default\":210.000000},\"paper-h\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u9ad8\\u5ea6\",\"desc\":\"\\u4ee5\\u6beb\\u7c73\\u4e3a\\u5355\\u4f4d\\u7684\\u7eb8\\u5f20\\u9ad8\",\"type\":\"float\",\"fix-id\":34923,\"ui-pos\":33,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"visible\":0,\"size\":8,\"auto\":false,\"ownread\":true,\"cur\":297.000000,\"default\":297.000000},\"is-wait-scan\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\",\"desc\":\"\\u542f\\u7528\\u540e\\uff0c\\u6587\\u7a3f\\u653e\\u5165\\u626b\\u63cf\\u4eea\\u65f6\\u5c06\\u81ea\\u52a8\\u542f\\u52a8\\u626b\\u63cf\",\"type\":\"bool\",\"fix-id\":34873,\"ui-pos\":12,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"wait-scan-exit\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\\u9000\\u51fa\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u7ed3\\u675f\\u5f85\\u7eb8\\u626b\\u63cf\\u7684\\u65f6\\u95f4\",\"type\":\"string\",\"fix-id\":34920,\"ui-pos\":13,\"auth\":0,\"size\":16,\"cur\":\"60s\",\"default\":\"60s\",\"range\":[\"15s\",\"30s\",\"60s\",\"2min\",\"4min\",\"8min\"],\"depend\":\"is-wait-scan==true\"},\"scan-mode\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"fix-id\":34862,\"ui-pos\":15,\"auth\":0,\"size\":24,\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"],\"depend\":\"is-wait-scan==false\"},\"scan-count\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"fix-id\":34863,\"ui-pos\":16,\"auth\":0,\"size\":4,\"cur\":-1,\"default\":-1,\"depend\":\"scan-mode.enabled&&scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"},\"is-auto-strength\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u81ea\\u52a8\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u81ea\\u52a8\\u4fee\\u6b63\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"bool\",\"fix-id\":34876,\"ui-pos\":27,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"feed-strength-value\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u8fdb\\u7eb8\\u5931\\u8d25\\u7387\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u503c\\u65f6\\u626b\\u63cf\\u4eea\\u5c06\\u8c03\\u6574\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"float\",\"fix-id\":34877,\"ui-pos\":28,\"auth\":0,\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.100000,\"max\":0.900000,\"step\":0.080000},\"depend\":\"is-auto-strength==true\"},\"feed-strength\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"string\",\"fix-id\":34874,\"ui-pos\":30,\"auth\":0,\"size\":12,\"cur\":\"\\u4e00\\u822c\",\"default\":\"\\u4e00\\u822c\",\"range\":[\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\"],\"depend\":\"is-auto-strength!=true\"},\"time-to-sleep\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u4f11\\u7720\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u4f11\\u7720\\u65f6\\u95f4\",\"type\":\"string\",\"fix-id\":34875,\"ui-pos\":33,\"auth\":0,\"size\":16,\"cur\":\"\\u4e0d\\u4f11\\u7720\",\"default\":\"\\u4e0d\\u4f11\\u7720\",\"range\":[\"\\u4e0d\\u4f11\\u7720\",\"\\u4e94\\u5206\\u949f\",\"\\u5341\\u5206\\u949f\",\"\\u534a\\u5c0f\\u65f6\",\"\\u4e00\\u5c0f\\u65f6\",\"\\u4e24\\u5c0f\\u65f6\",\"\\u56db\\u5c0f\\u65f6\"]},\"baud\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u6ce2\\u7279\\u7387\",\"desc\":\"CIS\\u63a7\\u5236\\u901a\\u4fe1\\u901f\\u7387\",\"type\":\"int\",\"ui-pos\":20,\"auth\":0,\"size\":4,\"cur\":921600,\"default\":921600,\"range\":[110,300,600,1200,2400,4800,9600,19200,38400,57600,115200,500000,921600,1500000]},\"act-after\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u5ef6\\u8fdf\\u54cd\\u5e94\",\"desc\":\"\\u91c7\\u96c6\\u5934\\u63a5\\u53d7\\u547d\\u4ee4\\u540e\\u7684\\u52a8\\u4f5c\\u5ef6\\u8fdf\\u65f6\\u95f4\",\"type\":\"int\",\"ui-pos\":21,\"auth\":0,\"unit\":\"microsec\",\"size\":4,\"cur\":1000,\"default\":1000},\"frame-h\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u5e27\\u9ad8\\u5ea6\",\"desc\":\"\\u91c7\\u96c6\\u5934\\u6bcf\\u4e00\\u5e27\\u7684\\u91c7\\u96c6\\u9ad8\\u5ea6\",\"type\":\"int\",\"ui-pos\":22,\"auth\":0,\"size\":4,\"cur\":12,\"default\":12},\"sample\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u91c7\\u6837\\u9891\\u7387\",\"desc\":\"\\u91c7\\u6837\\u9891\\u7387\",\"type\":\"int\",\"ui-pos\":23,\"auth\":0,\"size\":4,\"cur\":201,\"default\":201},\"paper-on\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u7eb8\\u5f20\\u5c31\\u7eea\",\"desc\":\"\\u7eb8\\u5f20\\u5df2\\u7ecf\\u5728\\u8fdb\\u7eb8\\u53f0\\u4e0a\\u653e\\u7f6e\\u597d\",\"type\":\"bool\",\"fix-id\":34912,\"ui-pos\":10,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"ownread\":true,\"cur\":false,\"default\":false},\"double-chk\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u6709\\u4e24\\u5f20\\u6216\\u8005\\u591a\\u5f20\\u7eb8\\u540c\\u65f6\\u6413\\u8fdb\",\"type\":\"string\",\"ui-pos\":18,\"auth\":0,\"size\":16,\"cur\":\"\\u8d85\\u58f0\\u6ce2\",\"default\":\"\\u8d85\\u58f0\\u6ce2\",\"range\":[\"\\u8d85\\u58f0\\u6ce2\",\"\\u7981\\u7528\"]},\"is-staple\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u6709\\u8ba2\\u4e66\\u9489\\u5b58\\u5728\",\"type\":\"bool\",\"fix-id\":34861,\"ui-pos\":20,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"motor-speed\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u8d70\\u7eb8\\u901f\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u8d70\\u7eb8\\u7535\\u673a\\u7684\\u901f\\u5ea6\\uff0c\\u5f20\\/\\u5206\\uff08PPM\\uff09\",\"type\":\"int\",\"ui-pos\":25,\"auth\":0,\"size\":4,\"cur\":100,\"default\":100,\"range\":[{\"dev-model!=G200\":70},{\"dev-model!=G200\":80},{\"dev-model!=G200\":90},100,{\"dev-model==G200\":110},{\"dev-model==G200\":120},{\"dev-model==G200\":130}]},\"is-check-askew\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u8fdb\\u7eb8\\u662f\\u5426\\u6b6a\\u659c\",\"type\":\"bool\",\"fix-id\":34868,\"ui-pos\":22,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"none\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u5bb9\\u5fcd\\u5ea6\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u5bb9\\u5fcd\\u5f97\\u9001\\u5165\\u6587\\u7a3f\\u6b6a\\u659c\\u89d2\\u5ea6\\u8d8a\\u5c0f\",\"type\":\"int\",\"fix-id\":34869,\"ui-pos\":23,\"auth\":0,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend\":\"is-check-askew==true\"},\"motor-ver\":{\"cat\":\"none\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u7535\\u673a\\u9a71\\u52a8\\u7248\\u672c\",\"desc\":\"\\u7535\\u673a\\u677f\\u9a71\\u52a8\\u7a0b\\u5e8f\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"fix-id\":34909,\"ui-pos\":16,\"auth\":0,\"readonly\":true,\"size\":24,\"auto\":false,\"cur\":\"\",\"def", "ault\":\"\"},\"fpga-ver\":{\"cat\":\"none\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"CIS\\u63a7\\u5236\\u5668\\u7248\\u672c\",\"desc\":\"\\u955c\\u5934\\u53c2\\u6570\\u63a7\\u5236\\u9a71\\u52a8\\u7a0b\\u5e8f\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"ui-pos\":17,\"auth\":0,\"readonly\":true,\"size\":24,\"auto\":false,\"cur\":\"\",\"default\":\"\"},\"cis-len\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u955c\\u5934\\u957f\",\"desc\":\"\\u56fe\\u50cf\\u91c7\\u96c6\\u955c\\u5934\\u7684\\u957f\\u5ea6\\uff0c\\u5355\\u4f4d\\u4e3a\\u6beb\\u7c73\\uff08mm\\uff09\",\"type\":\"int\",\"ui-pos\":30,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":3888,\"default\":3888},\"stretch-h\":{\"cat\":\"base\",\"group\":\"CIS\",\"title\":\"\\u6c34\\u5e73\\u62c9\\u4f38\\u7387\",\"desc\":\"\\u4e3a\\u62b5\\u6297\\u5f62\\u53d8\\uff0c\\u5728\\u6c34\\u5e73\\u65b9\\u5411\\u7684\\u62c9\\u4f38\\u7387\",\"type\":\"float\",\"ui-pos\":40,\"auth\":0,\"size\":8,\"auto\":false,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":1.000000,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":1.000000,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":1.000000,\"default\":1.000000},\"range\":{\"min\":0.500000,\"max\":2.000000,\"step\":0.100000}},\"stretch-v\":{\"cat\":\"base\",\"group\":\"CIS\",\"title\":\"\\u5782\\u76f4\\u62c9\\u4f38\\u7387\",\"desc\":\"\\u4e3a\\u62b5\\u6297\\u5f62\\u53d8\\uff0c\\u5728\\u5782\\u76f4\\u65b9\\u5411\\u7684\\u62c9\\u4f38\\u7387\",\"type\":\"float\",\"ui-pos\":41,\"auth\":0,\"size\":8,\"auto\":false,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":1.000000,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":1.000000,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":1.000000,\"default\":1.000000},\"range\":{\"min\":0.500000,\"max\":2.000000,\"step\":0.100000}},\"cis-sp\":{\"cat\":\"base\",\"group\":\"CIS\",\"title\":\"\\u901f\\u73871\",\"desc\":\"FPGA\\u6700\\u4f73\\u901f\\u7387\",\"type\":\"int\",\"ui-pos\":42,\"auth\":0,\"bind\":true,\"size\":4,\"auto\":false,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":2637,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":1531,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":4595,\"default\":816}},\"expo-fr\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u6b63\\u9762\\u7ea2\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u6b63\\u9762\\u7ea2\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":70,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":336,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":622,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":673,\"default\":313},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-fg\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u6b63\\u9762\\u7eff\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u6b63\\u9762\\u7eff\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":71,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":336,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":611,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":673,\"default\":306},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-fb\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u6b63\\u9762\\u84dd\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u6b63\\u9762\\u84dd\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":72,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":336,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":590,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":673,\"default\":297},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-br\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u80cc\\u9762\\u7ea2\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u80cc\\u9762\\u7ea2\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":73,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":410,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":713,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":811,\"default\":360},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-bg\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u80cc\\u9762\\u7eff\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u80cc\\u9762\\u7eff\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":74,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":410,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":758,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":811,\"default\":380},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"expo-bb\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u66dd\\u5149\\u5ea6\\uff08\\u80cc\\u9762\\u84dd\\u8272\\u901a\\u9053\\uff09\",\"desc\":\"\\u80cc\\u9762\\u84dd\\u8272\\u901a\\u9053\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"type\":\"int\",\"ui-pos\":75,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":410,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":722,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":811,\"default\":361},\"range\":{\"min\":1,\"max\":1100,\"step\":1}},\"gain-f-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":90,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":91,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":92,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":93,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":94,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-f-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":95,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":120,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":121,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":122,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":123,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff", "08\\u80cc\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":124,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"gain-b-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":125,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":170,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":170,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":170,\"default\":170},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":160,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":116,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":115,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":116,\"default\":113},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":161,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":121,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":119,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":121,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":162,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":119,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":118,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":121,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":163,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":128,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":126,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":129,\"default\":124},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":164,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":129,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":127,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":130,\"default\":126},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-f-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u6b63\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":165,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":127,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":125,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":127,\"default\":125},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-1\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90531\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90531\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":200,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":110,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":109,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":112,\"default\":109},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-2\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90532\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90532\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":201,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":120,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":120,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":121,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-3\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90533\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90533\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":202,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":115,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":114,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":116,\"default\":114},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-4\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90534\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90534\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":203,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":117,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":117,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":120,\"default\":117},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-5\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90535\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90535\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":204,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":118,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":117,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":119,\"default\":116},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"off-b-6\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\u901a\\u90536\\uff09\",\"desc\":\"\\u80cc\\u9762\\u901a\\u90536\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":205,\"auth\":0,\"bind\":true,\"size\":4,\"default\":{\"cis-mode==\\u7070\\u5ea6 && cis-dpi==300\":121,\"cis-mode==\\u5f69\\u8272 && cis-dpi==600\":120,\"cis-mode==\\u7070\\u5ea6 && cis-dpi==600\":123,\"default\":119},\"range\":{\"min\":1,\"max\":200,\"step\":1}},\"phase-f\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u76f8\\u4f4d\",\"desc\":\"CIS\\u6b63\\u9762\\u5206\\u6bb5\\u4e4b\\u95f4\\u7684\\u76f8\\u4f4d\\u5dee\",\"type\":\"int\",\"ui-pos\":26,\"auth\":0,\"size\":4,\"cur\":66,\"default\":66,\"range\":{\"min\":0,\"max\":256,\"step\":1}},\"phase-b\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u76f8\\u4f4d\",\"desc\":\"CIS\\u80cc\\u9762\\u5206\\u6bb5\\u4e4b\\u95f4\\u7684\\u76f8\\u4f4d\\u5dee\",\"type\":\"int\",\"ui-pos\":27,\"auth\":0,\"size\":4,\"cur\":67,\"default\":67,\"range\":{\"min\":0,\"max\":256,\"step\":1}}}" }; #endif ///////////////////////////////////////////////////////////////////////////////////////////////////////// // scanner_hw scanner_hw::scanner_hw() : mb_events_("motorboard-event") { set_where("hardware"); mb_events_.enable_wait_log(false); memset(&img_base_, 0, sizeof(img_base_)); img_base_.bpp = 8; img_base_.bppc = 8; img_base_.channels = 1; img_base_.format = IMG_FMT_BMP; img_base_.resolution_x = dpi_; img_base_.resolution_y = dpi_y_; img_base_.width = cis::get_line_stream_length(dpi_, true) * 2/*two sides*/; img_base_.height = 16380; img_base_.pos.new_img = true; img_base_.pos.img_over = true; img_base_.pos.paper_side = PAPER_SIDE_DSP; CLEAN_ARRAY(exposure_); CLEAN_ARRAY(gain_); CLEAN_ARRAY(off_); cis::update_correct_data(); init(); } scanner_hw::~scanner_hw() { close(); } void scanner_hw::init(void) { std::string text(""); for(auto& v: device_opt_json) text += v; init_version(text); load_correct_data(text); set_opt_json_text(&text[0]); #define OPT_HANDLER(name) \ auto name = [this](void* value) -> void auto a = [this](void* value) -> void { auto_scan_ = *(bool*)value; }; auto e = [this](void* value) -> void { if(strcmp((char*)value, "15s") == 0) time_to_exit_auto_scan_ = 15; else if(strcmp((char*)value, "30s") == 0) time_to_exit_auto_scan_ = 30; else if(strcmp((char*)value, "2min") == 0) time_to_exit_auto_scan_ = 120; else if(strcmp((char*)value, "4min") == 0) time_to_exit_auto_scan_ = 240; else if(strcmp((char*)value, "8min") == 0) time_to_exit_auto_scan_ = 480; else time_to_exit_auto_scan_ = 60; }; auto m = [this](void* value) -> void { if(strcmp((char*)value, WORDS_COLOR_GRAY) == 0) mode_ = (char*)value; else mode_ = WORDS_COLOR_COLOR; }; auto r = [this](void* value) -> void { dpi_ = *(int*)value; }; auto y = [this](void* value) -> void { dpi_y_ = *(int*)value; }; auto b = [this](void* value) -> void { baud_ = *(int*)value; }; auto d = [this](void* value) -> void { delay_ = *(int*)value; }; auto f = [this](void* value) -> void { frame_h_ = *(int*)value; }; auto s = [this](void* value) -> void { sample_ = *(int*)value; }; auto sp = [this](void* value) -> void { sp_ = *(int*)value; }; OPT_HANDLER(pha) { vsp_a_ = *(int*)value; }; OPT_HANDLER(phb) { vsp_b_ = *(int*)value; }; auto led = [this](void* value) -> void { cis_led_ = *(bool*)value; }; auto stretch_h = [this](void* value) -> void { stretch_h_ = *(double*)value; }; auto stretch_v = [this](void* value) -> void { stretch_v_ = *(double*)value; }; auto efb = [this](void* value) -> void { exposure_[SIDE_FRONT][COLOR_IND_BLUE] = *(int*)value; }; auto efg = [this](void* value) -> void { exposure_[SIDE_FRONT][COLOR_IND_GREEN] = *(int*)value; }; auto efr = [this](void* value) -> void { exposure_[SIDE_FRONT][COLOR_IND_RED] = *(int*)value; }; auto ebb = [this](void* value) -> void { exposure_[SIDE_BACK][COLOR_IND_BLUE] = *(int*)value; }; auto ebg = [this](void* value) -> void { exposure_[SIDE_BACK][COLOR_IND_GREEN] = *(int*)value; }; auto ebr = [this](void* value) -> void { exposure_[SIDE_BACK][COLOR_IND_RED] = *(int*)value; }; CLEAN_ARRAY(exposure_); CLEAN_ARRAY(gain_); CLEAN_ARRAY(off_); opt_handler_[SANE_OPT_NAME(WAIT_TO_SCAN)] = a; opt_handler_[SANE_OPT_NAME(WAIT_SCAN_EXIT)] = e; opt_handler_[SANE_OPT_NAME(CIS_MODE)] = m; opt_handler_[SANE_OPT_NAME(CIS_DPI)] = r; opt_handler_[SANE_OPT_NAME(Y_DPI)] = y; opt_handler_[SANE_OPT_NAME(CIS_BAUD)] = b; opt_handler_[SANE_OPT_NAME(CIS_DELAY)] = d; opt_handler_[SANE_OPT_NAME(CIS_FRAME_H)] = f; opt_handler_[SANE_OPT_NAME(CIS_SAMPLE)] = s; opt_handler_[SANE_OPT_NAME(CIS_SP)] = sp; opt_handler_[SANE_OPT_NAME(PHASE_FRONT)] = pha; opt_handler_[SANE_OPT_NAME(PHASE_BACK)] = phb; opt_handler_[SANE_OPT_NAME(CIS_LED)] = led; opt_handler_[SANE_OPT_NAME(CIS_STRETCH_H)] = stretch_h; opt_handler_[SANE_OPT_NAME(CIS_STRETCH_V)] = stretch_v; opt_handler_[SANE_OPT_NAME(CIS_EXPO_FB)] = efb; opt_handler_[SANE_OPT_NAME(CIS_EXPO_FG)] = efg; opt_handler_[SANE_OPT_NAME(CIS_EXPO_FR)] = efr; opt_handler_[SANE_OPT_NAME(CIS_EXPO_BB)] = ebb; opt_handler_[SANE_OPT_NAME(CIS_EXPO_BG)] = ebg; opt_handler_[SANE_OPT_NAME(CIS_EXPO_BR)] = ebr; auto p = [this](void* value) -> void { paper_ = (char*)value; }; auto l = [this](void* value) -> void { lateral_ = *(bool*)value; }; opt_handler_[SANE_OPT_NAME(PAPER)] = p; opt_handler_[SANE_OPT_NAME(LATERAL)] = l; auto staple = [this](void* value) -> void { staple_chk_ = *(bool*)value; }; auto screw = [this](void* value) -> void { screw_chk_ = *(bool*)value; }; auto screwl = [this](void* value) -> void { screw_chk_level_ = *(int*)value; }; auto dbchk = [this](void* value) -> void { double_chk_ = strcmp((char*)value, WORDS_FORBIDDEN) != 0; }; auto motsp = [this](void* value) -> void { int speed = *(int*)value; if(family_ == "G200") { speed -= 100; // 100 110 120 130 } else { speed -= 70; // 70 80 90 100 } switch(speed) { case 10: motor_speed_ = SPEED_PPM_BASE_10; break; case 20: motor_speed_ = SPEED_PPM_BASE_20; break; case 30: motor_speed_ = SPEED_PPM_BASE_30; break; default: motor_speed_ = SPEED_PPM_BASE; break; } }; auto fm = [this](void* value) -> void { family_ = (char*)value; utils::to_log(LOG_LEVEL_DEBUG, "Device family set as: %s\n", family_.c_str()); }; OPT_HANDLER(cntm) { scan_cntless_ = strcmp((char*)value, WORDS_SCAN_CONTINUOUS) == 0; }; OPT_HANDLER(cnt) { scan_count_ = *(int*)value; }; OPT_HANDLER(afs) { }; OPT_HANDLER(ff) { }; OPT_HANDLER(fs) { }; OPT_HANDLER(slp) { }; opt_handler_[SANE_OPT_NAME(IS_CHECK_STAPLE)] = staple; opt_handler_[SANE_OPT_NAME(IS_CHECK_ASKEW)] = screw; opt_handler_[SANE_OPT_NAME(ASKEW_RANGE)] = screwl; opt_handler_[SANE_OPT_NAME(DOUBLE_CHECK)] = dbchk; opt_handler_[SANE_OPT_NAME(MOTOR_SPEED)] = motsp; opt_handler_[SANE_OPT_NAME(DEVICE_MODEL)] = fm; opt_handler_[SANE_OPT_NAME(SCAN_MODE)] = cntm; opt_handler_[SANE_OPT_NAME(SCAN_COUNT)] = cnt; opt_handler_[SANE_OPT_NAME(IS_AUTO_FEED_STRENGTH)] = afs; opt_handler_[SANE_OPT_NAME(FEED_STRENGTH_VALUE)] = ff; opt_handler_[SANE_OPT_NAME(FEED_STRENGTH)] = fs; opt_handler_[SANE_OPT_NAME(TIME_TO_SLEEP)] = slp; } void scanner_hw::init_version(std::string& text) { gb_json *jsn = new gb_json(); if(jsn->attach_text(&text[0])) { gb_json *child = nullptr; jsn->get_value(SANE_OPT_NAME(MOTOR_VER), child); if(child) { unsigned int val = 0; char buf[20] = {0}; motor_.reset(new MotorBoard(nullptr)); motor_->read(MB_PORT_VERSION, val); motor_->stop(); // stop if previous process crashed motor_.reset(); sprintf(buf, "%u", val); child->set_value("cur", buf); child->set_value("default", buf); child->release(); } jsn->get_value(SANE_OPT_NAME(FPGA_VER), child); if(child) { unsigned int val = 0; char buf[20] = {0}; img_controller_.reset(new FpgaComm(baud_, true)); img_controller_->read(MAX_REGS - 1, val); img_controller_.reset(); sprintf(buf, "0x%08x", val); child->set_value("cur", buf); child->set_value("default", buf); child->release(); } jsn->get_value(SANE_OPT_NAME(CIS_LENGTH), child); if(child) { child->get_value("default", cis_length_); child->release(); } text = jsn->to_string(); } jsn->release(); } void scanner_hw::load_correct_data(std::string& text) { gb_json *root = new gb_json(); if(root->attach_text(&text[0])) { cis::load_correct_data_to_json(root); text = root->to_string(); } root->release(); } void scanner_hw::thread_image_capture(bool paper_ready) { PACKIMAGE img(img_base_); safe_fifo avail_mem("v4l2-mem"); int used_v4l2_mem = 0, times = 0, err = SCANNER_ERR_OK, over_msg_id = 0;; devui::SCANSTREAM scanstream; chronograph watch; std::pair mbev; std::function img_callback(img_handler_); utils::to_log(LOG_LEVEL_DEBUG, "scanning thread working ...\n"); utils::to_log(LOG_LEVEL_DEBUG, "set capture thread to CPU %d = %d\n", CPU_MAJOR_0, utils::set_cpu_affinity(CPU_MAJOR_0)); avail_mem.enable_wait_log(false); motor_->clear_error(); if(paper_ready) motor_->start(); scanstream.mode = count_mode_ ? devui::SCAN_COUNT_MODE : devui::SCAN_NORMAL; scanstream.speed = sp_; scanstream.err = 0; devui::send_message(devui::UI_STATUS_SCANNING, (uint8_t*)&scanstream, sizeof(scanstream)); while(scanning_) // auto scan cycle ... { // scanning ONE turn ... if(paper_ready) // auto_scan_ ignore no paper { bool over = false; err = start_and_wait_lifter(to_lifter_, &over_msg_id); if(err) break; uint64_t bgn = chronograph::from_process_born(); uint32_t cnt0 = img.pos.paper_ind; motor_->pick_paper(); err = scan_one_turn(&img, &avail_mem, &used_v4l2_mem, &over_msg_id, &over); bgn = chronograph::from_process_born() - bgn; cnt0 = img.pos.paper_ind - cnt0; utils::to_log(LOG_LEVEL_DEBUG, "Scanned %d papers in %dms.\n", cnt0, (int)bgn); if((over && !auto_scan_) || err || !auto_scan_ || !scanning_) break; { scanstream.err = over_msg_id; scanstream.mode = devui::SCAN_PAUSED; devui::send_message(devui::UI_STATUS_SCANNING, (uint8_t*)&scanstream, sizeof(scanstream)); } } // wait paper ... while(auto_scan_) { mbev.first = -1; mbev.second = 0; if(mb_events_.take(mbev, true)) { if(mbev.first == MOTOR_BORD_EVENT_PAPER_READY) { printf("paper ready: %d-%x\n", mbev.first, mbev.second); paper_ready = true; motor_->start(); break; } printf("\tmotor-board event is %d\n", mbev.first); } } if(!scanning_) break; // retrieve v4l2-mem ... if(!count_mode_) retrieve_v4l2_mem(&avail_mem, &used_v4l2_mem); } motor_->set_auto_paper(false, false); motor_->stop(); while(used_v4l2_mem) { if(times++ == 0) utils::to_log(LOG_LEVEL_DEBUG, "Wait to retrieve %d V4L2 memory(s) ...\n", used_v4l2_mem); else if(times >= 1000) { utils::to_log(LOG_LEVEL_FATAL, "Wait %d times, but %d V4L2 memory(s) has not returned yet!\n", times, used_v4l2_mem); break; } retrieve_v4l2_mem(&avail_mem, &used_v4l2_mem); std::this_thread::sleep_for(std::chrono::milliseconds(5)); } utils::to_log(LOG_LEVEL_DEBUG, "scanning thread exited with error: %d.\n", err); { scanstream.err = over_msg_id; scanstream.mode = devui::SCAN_STOPPED; devui::send_message(devui::UI_STATUS_SCANNING, (uint8_t*)&scanstream, sizeof(scanstream)); } scanning_ = false; img_handler_((dyn_mem_ptr)WORKER_STATUS_IDLE, false, (LPPACKIMAGE)err); } int scanner_hw::start_and_wait_lifter(int to_ms, int* ui_words_id) { int ret = SCANNER_ERR_DEVICE_FEEDER_POS, words = ID_WORDS_STATUS_DEVICE_HD_001; chronograph watch; while(scanning_ && watch.elapse_ms() < to_ms) { std::pair mbev; if(mb_events_.take(mbev, true, 3)) { if(mbev.first == MOTOR_BORD_EVENT_LIFTER_READY) { ret = words = 0; break; } else { int err = trans_motorboard_err_2_hg_error(mbev.first, &words); if(err) { ret = err; break; } } } } if(!scanning_) // user cancelled { ret = SCANNER_ERR_USER_CANCELED; words = 0; } if(ui_words_id) *ui_words_id = words; return ret; } int scanner_hw::scan_one_turn(LPPACKIMAGE img, safe_fifo* cism, int* cism_cnt, int* ui_words, bool* mbstopped) { int ret = SCANNER_ERR_OK, minh = 210 * dpi_y_ / 25.4, words = 0; uint32_t pass = 0; chronograph watch; std::pair mbev; auto put_v4l2_mem = [&](BEFORE_DESTROY_PARAM) -> BEFORE_DESTROY_RET { int ind = (int)(long)mem->get_param(1); safe_fifo* que = (safe_fifo*)mem->get_param(0); mem->detach(nullptr); que->save(ind); }; if(mbstopped) *mbstopped = false; img->life = chronograph::from_process_born(); while(scanning_) { if(!motor_->wait_paper_out(to_paper_out_)) { ret = SCANNER_ERR_DEVICE_HD_002; words = ID_WORDS_STATUS_DEVICE_HD_002; break; } pass = watch.elapse_ms(); mbev.first = -1; mbev.second = 0; if(mb_events_.take(mbev, true, 10) && mbev.first == MOTOR_BORD_EVENT_ERROR) { ret = trans_motorboard_err_2_hg_error(mbev.second, &words); if(ret != SCANNER_ERR_DEVICE_DOUBLE_FEEDING) { break; } } else if(mbev.first == MOTOR_BORD_EVENT_SCAN_DONE) { if(mbstopped) *mbstopped = true; printf("-->scan done event received from motorboard.\n"); break; } else { ret = SCANNER_ERR_OK; words = 0; } img->pos.paper_ind++; if(count_mode_) { devui::send_message(devui::UI_STATUS_PAPER_CNT, (uint8_t*)&pass, sizeof(pass)); } else { img->height = get_image_real_height(minh); size_t size = 0; int ind = -1; void* frame = camera_->read_frame(to_stream_, size, ind); dyn_mem_shared_ptr mem = nullptr; if(!frame) { ret = SCANNER_ERR_DEVICE_CIS_STREAM; words = ID_WORDS_STATUS_CAPTURE_FAILED; break; } cism_cnt[0]++; devui::send_message(devui::UI_STATUS_PAPER_CNT, (uint8_t*)&pass, sizeof(pass)); img->prc_time = watch.elapse_ms(); mem = new dyn_mem_shared(frame, size, put_v4l2_mem); mem->set_param(cism, 0); mem->set_param((void*)(long)ind, 1); img->pos.status = hg_err_2_image_status(ret); img_handler_(mem, true, img); // (frame, ind, LPPACKIMAGE, cism, ret, pass, bool) mem->release(); if(!scan_cntless_ && img->pos.paper_ind == scan_count_) { utils::to_log(LOG_LEVEL_ALL, "Scanning finished for given count %d!\n", scan_count_); break; } // retrieve V4L2 memory ... retrieve_v4l2_mem(cism, cism_cnt); if(cism_cnt[0] >= camera_->get_mem_count()) { ret = SCANNER_ERR_DEVICE_CIS_OUT_OF_MEM; words = ID_WORDS_STATUS_CIS_OUT_OF_MEM; utils::to_log(LOG_LEVEL_FATAL, "Scanning stopped for that V4L2 is out of memory!\n"); break; } } // resource checking ... if(res_(TASK_CAPTURER, true, 3000) && scanning_) { // should check paper ready ? watch.reset(); motor_->pick_paper(); img->life = chronograph::from_process_born(); } else { ret = SCANNER_ERR_DEVICE_HD_003; words = ID_WORDS_STATUS_DEVICE_HD_003; break; } } if(ui_words) *ui_words = words; return ret; } int scanner_hw::get_image_real_height(int minh) { chronograph watch; unsigned int h = 0; while(h < minh && watch.elapse_ms() < 500) { std::this_thread::sleep_for(std::chrono::milliseconds(3)); img_controller_->read(14, h); } h = img_controller_->get_real_height(); return h; } void scanner_hw::retrieve_v4l2_mem(safe_fifo* mem, int* used) { int u = *used, ind = 0; while(u >= camera_->get_mem_count() - 2) { if(mem->size()) { if(ind) utils::to_log(LOG_LEVEL_WARNING, "V4L2 memory returned.\n"); break; } if(ind == 0) utils::to_log(LOG_LEVEL_WARNING, "V4L2 is out of memory, wait image processor return ...\n"); if(ind++ > 1000) // 3 seconds ... break; std::this_thread::sleep_for(std::chrono::milliseconds(3)); } while(mem->take(ind, false)) { u--; camera_->add_v4l2_memory(ind); } *used = u; } void scanner_hw::set_gain_value(bool front, bool gain, int sector, int val) { sector--; if(gain) { if(sector < _countof(gain_[0])) { gain_[!front][sector] = val; } } else { if(sector < _countof(off_[0])) { off_[!front][sector] = val; } } } // sane_opt_provider char* scanner_hw::get_value(const char* name, void* value, size_t* size, int* err) { char *ret = nullptr; if(err) *err = SCANNER_ERR_OK; if(strcmp(name, SANE_OPT_NAME(PAPER_ON)) == 0) { ret = (char*)malloc(sizeof(int)); *(int*)ret = 0; *(bool*)ret = paper_on_; if(size) *size = sizeof(bool); } else if(strcmp(name, SANE_OPT_NAME(PAPER_W)) == 0) { SIZE sz = paper::size(paper_.c_str()); double mm = lateral_ && lateral_en_ ? sz.cy : sz.cx; ret = (char*)malloc(sizeof(double)); *(double*)ret = mm; if(size) *size = sizeof(double); } else if(strcmp(name, SANE_OPT_NAME(PAPER_H)) == 0) { SIZE sz = paper::size(paper_.c_str()); double mm = lateral_ && lateral_en_ ? sz.cx : sz.cy; ret = (char*)malloc(sizeof(double)); *(double*)ret = mm; if(size) *size = sizeof(double); } else if(strcmp(name, SANE_OPT_NAME(CIS_MODE)) == 0) { ret = (char*)malloc(mode_.length() + 1); strcpy(ret, mode_.c_str()); if(size) *size = mode_.length(); } else if(strcmp(name, SANE_OPT_NAME(CIS_DPI)) == 0) { ret = (char*)malloc(sizeof(int)); *(int*)ret = dpi_; if(size) *size = sizeof(int); } else if(err) *err = SCANNER_ERR_DEVICE_NOT_FOUND; return ret; } int scanner_hw::set_value(const char* name, void* val) { if(scanning_) // working, no set { return SCANNER_ERR_DEVICE_BUSY; } if(opt_handler_.count(name)) { opt_handler_[name](val); } else if(strstr(name, SANE_OPT_NAME(CIS_GAIN_FRONT)) == name) { name += strlen(SANE_OPT_NAME(CIS_GAIN_FRONT)) + 1; set_gain_value(true, true, atoi(name), *(int*)val); } else if(strstr(name, SANE_OPT_NAME(CIS_GAIN_BACK)) == name) { name += strlen(SANE_OPT_NAME(CIS_GAIN_BACK)) + 1; set_gain_value(false, true, atoi(name), *(int*)val); } else if(strstr(name, SANE_OPT_NAME(CIS_OFFSET_FRONT)) == name) { name += strlen(SANE_OPT_NAME(CIS_OFFSET_FRONT)) + 1; set_gain_value(true, false, atoi(name), *(int*)val); } else if(strstr(name, SANE_OPT_NAME(CIS_OFFSET_BACK)) == name) { name += strlen(SANE_OPT_NAME(CIS_OFFSET_BACK)) + 1; set_gain_value(false, false, atoi(name), *(int*)val); } else { return SCANNER_ERR_DEVICE_NOT_SUPPORT; } return 0; } void scanner_hw::enable(const char* name, bool able) { if(strcmp(name, SANE_OPT_NAME(LATERAL)) == 0) lateral_en_ = able; } // operation ... int scanner_hw::open(std::function image_handler, CHK_RES_FUNC res, std::string* cfgjson, bool count_mode) { std::string tips(""); refer_guard cfg(new gb_json()); this->close(); int fh = 16380; if(!image_handler) return SCANNER_ERR_INVALID_PARAMETER; res_ = res; if(!res_) { DECL_CHK_RES_FUNC(&, r) { return true; }; res_ = r; } count_mode_ = count_mode; img_handler_ = image_handler; if(!count_mode_) { img_controller_.reset(new FpgaComm(baud_)); if(!img_controller_->is_ok()) return DEV_ERR(HD_001); img_base_.resolution_x = dpi_; img_base_.resolution_y = dpi_y_; if(mode_ == "\345\275\251\350\211\262") { img_base_.width = cis::get_line_stream_length(dpi_, true); img_controller_->setColorMode(COLOR_MODE); } else { img_base_.width = cis::get_line_stream_length(dpi_, false); img_controller_->setColorMode(GRAY_MODE); } img_base_.width *= 2; // two sides img_controller_->setDpi(dpi_ == 300 ? DPI_300 : DPI_600); img_controller_->setDelayTime(delay_); img_controller_->setSample(sample_); img_controller_->setSp(sp_); img_controller_->enableLed(cis_led_); img_controller_->setVsp(vsp_a_, vsp_b_); utils::to_log(LOG_LEVEL_DEBUG, "FPGA Sp = %d, Sample = %d\n", sp_, sample_); if(cfgjson) { cfg->set_value("color", mode_.c_str()); cfg->set_value("dpi", (std::to_string(dpi_) + " * " + std::to_string(dpi_y_)).c_str()); cfg->set_value("sample", sample_); cfg->set_value("Sp", sp_); cfg->set_value("Vsp-A", vsp_a_); cfg->set_value("Vsp-B", vsp_b_); cfg->set_value("Led-On", cis_led_); } void(FpgaComm::* exposure[])(int) = {&FpgaComm::setAExposureB, &FpgaComm::setAExposureG , &FpgaComm::setAExposureR, &FpgaComm::setBExposureB, &FpgaComm::setBExposureG, &FpgaComm::setBExposureR}; tips = "Exposure(BGR): "; for(int i = 0; i < SIDE_COUNT; ++i) { tips += "\tSide_" + std::to_string(i) + "["; for(int j = 0; j < COLOR_IND_COUNT; ++j) { (img_controller_.get()->*exposure[i * SIDE_COUNT + j])(exposure_[i][j]); tips += std::to_string(exposure_[i][j]) + ", "; } tips.erase(tips.length() - 2); tips += "];"; } utils::to_log(LOG_LEVEL_DEBUG, "%s\n", tips.c_str()); if(cfgjson) { char val[128] = {0}; sprintf(val, "(%u, %u, %u)", exposure_[SIDE_FRONT][COLOR_IND_RED], exposure_[SIDE_FRONT][COLOR_IND_GREEN], exposure_[SIDE_FRONT][COLOR_IND_BLUE]); cfg->set_value("exposure-A(RGB)", val); sprintf(val, "(%u, %u, %u)", exposure_[SIDE_BACK][COLOR_IND_RED], exposure_[SIDE_BACK][COLOR_IND_GREEN], exposure_[SIDE_BACK][COLOR_IND_BLUE]); cfg->set_value("exposure-B(RGB)", val); } for(int i = 0; i < CIS_SECTOR_COUNT; ++i) { tips = "Gain: Sector_" + std::to_string(i + 1) + "[F="; tips += std::to_string(gain_[SIDE_FRONT][i]) + "x + " + std::to_string(off_[SIDE_FRONT][i]) + "];\t[B=" + std::to_string(gain_[SIDE_BACK][i]) + "x + " + std::to_string(off_[SIDE_BACK][i]) + "]"; img_controller_->setAGain(i, gain_[SIDE_FRONT][i]); img_controller_->setBGain(i, gain_[SIDE_BACK][i]); img_controller_->setAOffset(i, off_[SIDE_FRONT][i]); img_controller_->setBOffset(i, off_[SIDE_BACK][i]); utils::to_log(LOG_LEVEL_DEBUG, "%s\n", tips.c_str()); } if(cfgjson) { for(int i = 0; i < CIS_SECTOR_COUNT; ++i) { char key[40] = {0}, val[128] = {0}; sprintf(key, "gain-sec-%d", i + 1); sprintf(val, "A = %ux + %u, B = %ux + %u" , gain_[SIDE_FRONT][i], off_[SIDE_FRONT][i] , gain_[SIDE_BACK][i], off_[SIDE_BACK][i]); cfg->set_value(key, val); } } } auto cb = [this](int ev, unsigned int data) -> void { printf("motorboard event: 0x%08X, data = %d\n", ev, data); mb_events_.save(std::make_pair(ev, data), true); }; mb_events_.clear(); motor_.reset(new MotorBoard(cb)); motor_->set_double_inpect(double_chk_); motor_->set_staple_inpect(staple_chk_); motor_->set_screw_inpect(screw_chk_); motor_->set_screw_level(screw_chk_level_); motor_->set_slowmoire(false); if(1 || count_mode_) motor_->set_speed_mode(SPEED_PPM_BASE_20); else motor_->set_speed_mode(motor_speed_); motor_->set_auto_paper(auto_scan_, true); unsigned int val = 0; if(motor_->read(MB_PORT_CONFIG, val)) utils::to_log(LOG_LEVEL_DEBUG, "MotorBoard config : %p\n", val); else utils::to_log(LOG_LEVEL_FATAL, "Get motor-board config failed.\n"); if(motor_->read(MB_PORT_STATUS, val)) utils::to_log(LOG_LEVEL_DEBUG, "MotorBoard status : %p\n", val); else utils::to_log(LOG_LEVEL_FATAL, "Get motor-board status failed.\n"); if(motor_->read(MB_PORT_MODE, val)) utils::to_log(LOG_LEVEL_DEBUG, "MotorBoard mode : %p\n", val); else utils::to_log(LOG_LEVEL_FATAL, "Get motor-board mode failed.\n"); if(motor_->read(MB_PORT_VERSION, val)) utils::to_log(LOG_LEVEL_DEBUG, "MotorBoard version: %p\n", val); else utils::to_log(LOG_LEVEL_FATAL, "Get motor-board version failed.\n"); if(motor_->read(MB_PORT_CONFIG_EX, val)) utils::to_log(LOG_LEVEL_DEBUG, "MotorBoard confige: %p\n", val); else utils::to_log(LOG_LEVEL_FATAL, "Get motor-board confige failed.\n"); if(!count_mode_) { camera_.reset(new GVideoISP1()); camera_->open(/*3888*/cis::get_sector_pixels(0, dpi_, true) * CIS_SECTOR_COUNT, fh); std::this_thread::sleep_for(std::chrono::milliseconds(20)); img_controller_->setFrameHeight(frame_h_); img_controller_->capture(); size_t size; int _int; auto data = camera_->read_frame(100, size, _int); if(data) camera_->add_v4l2_memory(_int); std::this_thread::sleep_for(std::chrono::milliseconds(20)); img_controller_->setFrameHeight(fh / 2 * 3); // if(1) // { // // debug ... // unsigned int vals[] = {0x5ffa, 0x3300c9d, 0x1, 0xaa00aa, 0x340030aa, 0x1380193 // , 0x1270131, 0x340030aa, 0x168000c, 0x168017b, 0, 0x0afa3f // , 0x3e8}; // for(int i = 0; i < _countof(vals); ++i) // img_controller_->write(i, vals[i]); // } std::vector regs; img_controller_->update(®s); if(cfgjson) { gb_json *c = new gb_json(); c->clear(true); for(auto& v: regs) *c += v; cfg->set_value("controller", c); c->release(); *cfgjson = std::move(cfg->to_string()); } } return SCANNER_ERR_OK; } int scanner_hw::start_scan(void) { unsigned int val = 0; if(!motor_.get() || (!count_mode_ && (!camera_.get() || !img_controller_.get()))) return DEV_ERR(NOT_READY); motor_->clear_error(); if(!motor_->read(MB_PORT_STATUS, val)) return DEV_ERR(GET_STATUS_FAILED); utils::to_log(LOG_LEVEL_DEBUG, "start scan: status = 0x%08x.\n", val); if (((SMBSTATUS*)&val)->open_machine) // 0x700fe { devui::send_status_message(ID_WORDS_STATUS_COVER_OPEN); return DEV_ERR(COVER_OPENNED); } if(!motor_->read(MB_PORT_MODE, val)) return DEV_ERR(GET_STATUS_FAILED); utils::to_log(LOG_LEVEL_DEBUG, "start scan: mode-status = 0x%08x.\n", val); if(((SMBMODE*)&val)->paper_jammed_in || ((SMBMODE*)&val)->paper_jammed_out) { devui::send_status_message(ID_WORDS_STATUS_JAMMED); return DEV_ERR(PAPER_JAMMED); } bool paperok = ((SMBMODE*)&val)->feeding_paper_ready; if(!paperok && !auto_scan_) { devui::send_status_message(ID_WORDS_STATUS_NO_PAPER); return DEV_ERR(NO_PAPER); } scanning_ = true; mb_events_.clear(); scan_thread_.reset(new std::thread(&scanner_hw::thread_image_capture, this, paperok)); return SCANNER_ERR_OK; } int scanner_hw::stop_scan(bool from_ui) { bool working = scanning_; scanning_ = auto_scan_ = false; mb_events_.trigger(); if(motor_.get()) { motor_->set_auto_paper(false, false); motor_->stop(); } // if(camera_.get()) // camera_->stop(); // mb_events_.clear(); if(!working && from_ui) { devui::SCANSTREAM stream; stream.err = 0; stream.mode = devui::SCAN_STOPPED; stream.speed = 0; devui::send_message(devui::UI_STATUS_SCANNING, (uint8_t*)&stream, sizeof(stream)); } return 0; } int scanner_hw::close(bool from_worker) { img_controller_.reset(); if(motor_.get()) { motor_->stop(); motor_.reset(); } if(camera_.get()) { camera_->stop(); camera_->close(); camera_.reset(); } if(!from_worker) { if(scan_thread_.get() && scan_thread_->joinable()) scan_thread_->join(); scan_thread_.reset(); } return 0; } int scanner_hw::trans_motorboard_err_2_hg_error(int mberr, int *ui_msg) { unsigned int val = mberr; SMBSTATUS *s = (SMBSTATUS*)&val; int msg = 0; if(s->open_machine) { mberr = SCANNER_ERR_DEVICE_COVER_OPENNED; msg = ID_WORDS_STATUS_COVER_OPEN; } else if(s->pick_failed) { mberr = SCANNER_ERR_DEVICE_FEEDING_PAPER; msg = ID_WORDS_STATUS_FEED_ERR; } else if(s->double_paper) { mberr = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; msg = ID_WORDS_STATUS_DOUBLE_FEED; } else if(s->staple) { mberr = SCANNER_ERR_DEVICE_STAPLE_ON; msg = ID_WORDS_STATUS_STAPLE; } else if(s->papertilted) { mberr = SCANNER_ERR_DEVICE_PAPER_SKEW; msg = ID_WORDS_STATUS_ASKEW; } if(ui_msg) *ui_msg = msg; return mberr; } int scanner_hw::hg_err_2_image_status(int hgerr) { if(hgerr == SCANNER_ERR_DEVICE_DOUBLE_FEEDING) return IMG_STATUS_DOUBLE; if(hgerr == SCANNER_ERR_DEVICE_PAPER_JAMMED) return IMG_STATUS_JAM; if(hgerr == SCANNER_ERR_DEVICE_STAPLE_ON) return IMG_STATUS_STAPLE; return IMG_STATUS_OK; } bool scanner_hw::is_scanning(void) { return scanning_; } void scanner_hw::clean_paper_passway(void) { if(!motor_.get()) { auto cb = [this](int ev, unsigned int data) -> void { mb_events_.save(std::make_pair(ev, data), true); }; mb_events_.clear(); motor_.reset(new MotorBoard(cb)); } motor_->clean_paper_road(); }