diff --git a/hardware/cis/FpgaComm.h b/hardware/cis/FpgaComm.h index b8066ed..2bfccff 100644 --- a/hardware/cis/FpgaComm.h +++ b/hardware/cis/FpgaComm.h @@ -26,6 +26,7 @@ typedef struct Mode_FPGA unsigned short int adcA : 1; unsigned short int adcB : 1; unsigned short int selftest : 1; + unsigned short int sp; } ModeFpga; diff --git a/hardware/hardware.cpp b/hardware/hardware.cpp index f66feb6..b92b006 100644 --- a/hardware/hardware.cpp +++ b/hardware/hardware.cpp @@ -11,8 +11,9 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////// // scanner_hw static std::string device_opt_json[] = { - "{\"mode\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u955c\\u5934\\u8272\\u5f69\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"type\":\"string\",\"fix-id\":34819,\"ui-pos\":10,\"auth\":0,\"size\":12,\"cur\":\"\\u5f69\\u8272\",\"default\":\"\\u5f69\\u8272\",\"range\":[\"\\u5f69\\u8272\",\"\\u7070\\u5ea6\"]},\"resolution\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u955c\\u5934\\u5de5\\u4f5c\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"fix-id\":34840,\"ui-pos\":11,\"auth\":0,\"size\":4,\"cur\":200,\"default\":200,\"range\":[200,300,600]},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"fix-id\":34831,\"ui-pos\":10,\"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\":12,\"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\":13,\"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\":14,\"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\":256,\"default\":256},\"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\":32,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"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\":31,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":1}},\"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\":30,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"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\":35,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"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\":34,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"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\":33,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":1}},\"gain-f\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u6b63\\u9762\\uff09\",\"desc\":\"\\u6b63\\u9762\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":40,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":1}},\"gain-b\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\uff08\\u80cc\\u9762\\uff09\",\"desc\":\"\\u80cc\\u9762\\u7684\\u589e\\u76ca\\u91cf\",\"type\":\"int\",\"ui-pos\":41,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":1}},\"off-f\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u6b63\\u9762\\uff09\",\"desc\":\"\\u6b63\\u9762\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":45,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-100,\"max\":100,\"step\":1}},\"off-b\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u589e\\u76ca\\u8865\\u507f\\uff08\\u80cc\\u9762\\uff09\",\"desc\":\"\\u80cc\\u9762\\u7684\\u589e\\u76ca\\u8865\\u507f\\u91cf\",\"type\":\"int\",\"ui-pos\":46,\"auth\":0,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-100,\"ma", - "x\":100,\"step\":1}},\"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\"},\"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},\"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\":\"\",\"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\":\"\"}}" + "{\"mode\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u955c\\u5934\\u8272\\u5f69\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"type\":\"string\",\"fix-id\":34819,\"ui-pos\":10,\"auth\":0,\"size\":12,\"cur\":\"\\u5f69\\u8272\",\"default\":\"\\u5f69\\u8272\",\"range\":[\"\\u5f69\\u8272\",\"\\u7070\\u5ea6\"]},\"resolution\":{\"cat\":\"none\",\"group\":\"CIS\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u955c\\u5934\\u5de5\\u4f5c\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"fix-id\":34840,\"ui-pos\":11,\"auth\":0,\"size\":4,\"cur\":200,\"default\":200,\"range\":[200,300,600]},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"fix-id\":34831,\"ui-pos\":10,\"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\":12,\"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\":13,\"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\":14,\"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\":256,\"default\":256},\"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\":\"\",\"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\\u73", + "87\",\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":1.000000,\"mode==\\u7070\\u5ea6 && resolution==300\":1.000000,\"mode==\\u7070\\u5ea6 && resolution==200\":1.000000,\"mode==\\u5f69\\u8272 && resolution==600\":1.000000,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":1.000000,\"mode==\\u7070\\u5ea6 && resolution==300\":1.000000,\"mode==\\u7070\\u5ea6 && resolution==200\":1.000000,\"mode==\\u5f69\\u8272 && resolution==600\":1.000000,\"mode==\\u7070\\u5ea6 && resolution==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,\"size\":4,\"auto\":false,\"default\":{\"mode==\\u5f69\\u8272 && resolution==300\":878,\"mode==\\u7070\\u5ea6 && resolution==300\":2637,\"mode==\\u7070\\u5ea6 && resolution==200\":2450,\"mode==\\u5f69\\u8272 && resolution==600\":1531,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":313,\"mode==\\u7070\\u5ea6 && resolution==300\":336,\"mode==\\u7070\\u5ea6 && resolution==200\":337,\"mode==\\u5f69\\u8272 && resolution==600\":622,\"mode==\\u7070\\u5ea6 && resolution==600\":673,\"default\":312},\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":306,\"mode==\\u7070\\u5ea6 && resolution==300\":336,\"mode==\\u7070\\u5ea6 && resolution==200\":337,\"mode==\\u5f69\\u8272 && resolution==600\":611,\"mode==\\u7070\\u5ea6 && resolution==600\":673,\"default\":305},\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":297,\"mode==\\u7070\\u5ea6 && resolution==300\":336,\"mode==\\u7070\\u5ea6 && resolution==200\":337,\"mode==\\u5f69\\u8272 && resolution==600\":590,\"mode==\\u7070\\u5ea6 && resolution==600\":673,\"default\":295},\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":360,\"mode==\\u7070\\u5ea6 && resolution==300\":410,\"mode==\\u7070\\u5ea6 && resolution==200\":406,\"mode==\\u5f69\\u8272 && resolution==600\":713,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":380,\"mode==\\u7070\\u5ea6 && resolution==300\":410,\"mode==\\u7070\\u5ea6 && resolution==200\":406,\"mode==\\u5f69\\u8272 && resolution==600\":758,\"mode==\\u7070\\u5ea6 && resolution==600\":811,\"default\":379},\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":361,\"mode==\\u7070\\u5ea6 && resolution==300\":410,\"mode==\\u7070\\u5ea6 && resolution==200\":406,\"mode==\\u5f69\\u8272 && resolution==600\":722,\"mode==\\u7070\\u5ea6 && resolution==600\":811,\"default\":360},\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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,\"defaul", + "t\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==300\":170,\"mode==\\u7070\\u5ea6 && resolution==200\":170,\"mode==\\u5f69\\u8272 && resolution==600\":170,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":113,\"mode==\\u7070\\u5ea6 && resolution==300\":116,\"mode==\\u7070\\u5ea6 && resolution==200\":116,\"mode==\\u5f69\\u8272 && resolution==600\":115,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":118,\"mode==\\u7070\\u5ea6 && resolution==300\":121,\"mode==\\u7070\\u5ea6 && resolution==200\":119,\"mode==\\u5f69\\u8272 && resolution==600\":119,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":118,\"mode==\\u7070\\u5ea6 && resolution==300\":119,\"mode==\\u7070\\u5ea6 && resolution==200\":121,\"mode==\\u5f69\\u8272 && resolution==600\":118,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":124,\"mode==\\u7070\\u5ea6 && resolution==300\":128,\"mode==\\u7070\\u5ea6 && resolution==200\":128,\"mode==\\u5f69\\u8272 && resolution==600\":126,\"mode==\\u7070\\u5ea6 && resolution==600\":129,\"default\":125},\"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\":{\"mode==\\u5f69\\u8272 && resolution==300\":126,\"mode==\\u7070\\u5ea6 && resolution==300\":129,\"mode==\\u7070\\u5ea6 && resolution==200\":129,\"mode==\\u5f69\\u8272 && resolution==600\":127,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":125,\"mode==\\u7070\\u5ea6 && resolution==300\":127,\"mode==\\u7070\\u5ea6 && resolution==200\":127,\"mode==\\u5f69\\u8272 && resolution==600\":125,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":109,\"mode==\\u7070\\u5ea6 && resolution==300\":110,\"mode==\\u7070\\u5ea6 && resolution==200\":112,\"mode==\\u5f69\\u8272 && resolution==600\":109,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":118,\"mode==\\u7070\\u5ea6 && resolution==300\":120,\"mode==\\u7070\\u5ea6 && resolution==200\":122,\"mode==\\u5f69\\u8272 && resolution==600\":120,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":114,\"mode==\\u7070\\u5ea6 && resolution==300\":115,\"mode==\\u7070\\u5ea6 && resolution==200\":117,\"mode==\\u5f69\\u8272 && resolution==600\":114,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":117,\"mode==\\u7070\\u5ea6 && resolution==300\":117,\"mode==\\u7070\\u5ea6 && resolution==200\":117,\"mode==\\u5f69\\u8272 && resolution==600\":117,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":116,\"mode==\\u7070\\u5ea6 && resolution==300\":118,\"mode==\\u7070\\u5ea6 && resolution==200\":118,\"mode==\\u5f69\\u8272 && resolution==600\":117,\"mode==\\u7070\\u5ea6 && resolution==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\":{\"mode==\\u5f69\\u8272 && resolution==300\":119,\"mode==\\u7070\\u5ea6 && resolution==300\":121,\"mode==\\u7070\\u5ea6 && resolution==200\":121,\"mode==\\u5f69\\u8272 && resolution==600\":120,\"mode==\\u7070\\u5ea6 && resolution==600\":123,\"default\":118},\"range\":{\"min\":1,\"max\":200,\"step\":1}}}" }; @@ -23,6 +24,10 @@ scanner_hw::scanner_hw() : mb_events_("motorboard-event") set_where("hardware"); mb_events_.enable_wait_log(false); + CLEAN_ARRAY(exposure_); + CLEAN_ARRAY(gain_); + CLEAN_ARRAY(off_); + init(); } scanner_hw::~scanner_hw() @@ -92,6 +97,18 @@ void scanner_hw::init(void) { sample_ = *(int*)value; }; + auto sp = [this](void* value) -> void + { + sp_ = *(int*)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 { @@ -118,24 +135,6 @@ void scanner_hw::init(void) exposure_[SIDE_BACK][COLOR_IND_RED] = *(int*)value; }; - auto gf = [this](void* value) -> void - { - gain_[SIDE_FRONT] = *(int*)value; - }; - auto gb = [this](void* value) -> void - { - gain_[SIDE_BACK] = *(int*)value; - }; - - auto of = [this](void* value) -> void - { - off_[SIDE_FRONT] = *(int*)value; - }; - auto ob = [this](void* value) -> void - { - off_[SIDE_BACK] = *(int*)value; - }; - CLEAN_ARRAY(exposure_); CLEAN_ARRAY(gain_); CLEAN_ARRAY(off_); @@ -149,6 +148,9 @@ void scanner_hw::init(void) opt_handler_[SANE_FULL_NAME(CIS_DELAY)] = d; opt_handler_[SANE_FULL_NAME(CIS_FRAME_H)] = f; opt_handler_[SANE_FULL_NAME(CIS_SAMPLE)] = s; + opt_handler_[SANE_FULL_NAME(CIS_SP)] = sp; + opt_handler_[SANE_FULL_NAME(CIS_STRETCH_H)] = stretch_h; + opt_handler_[SANE_FULL_NAME(CIS_STRETCH_V)] = stretch_v; opt_handler_[SANE_FULL_NAME(CIS_EXPO_FB)] = efb; opt_handler_[SANE_FULL_NAME(CIS_EXPO_FG)] = efg; @@ -157,12 +159,6 @@ void scanner_hw::init(void) opt_handler_[SANE_FULL_NAME(CIS_EXPO_BG)] = ebg; opt_handler_[SANE_FULL_NAME(CIS_EXPO_BR)] = ebr; - opt_handler_[SANE_FULL_NAME(CIS_GAIN_FRONT)] = gf; - opt_handler_[SANE_FULL_NAME(CIS_GAIN_BACK)] = gb; - - opt_handler_[SANE_FULL_NAME(CIS_OFFSET_FRONT)] = of; - opt_handler_[SANE_FULL_NAME(CIS_OFFSET_BACK)] = ob; - auto p = [this](void* value) -> void { @@ -440,6 +436,23 @@ void scanner_hw::retrieve_v4l2_mem(safe_fifo* mem, int* used) } *used = u; } +void scanner_hw::set_gain_value(bool front, bool gain, int sector, int val) +{ + 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) @@ -492,13 +505,33 @@ int scanner_hw::set_value(const char* name, void* val) if(opt_handler_.count(name)) { opt_handler_[name](val); - - return 0; + } + else if(strstr(name, SANE_FULL_NAME(CIS_GAIN_FRONT)) == name) + { + name += strlen(SANE_FULL_NAME(CIS_GAIN_FRONT)) + 1; + set_gain_value(true, true, atoi(name), *(int*)val); + } + else if(strstr(name, SANE_FULL_NAME(CIS_GAIN_BACK)) == name) + { + name += strlen(SANE_FULL_NAME(CIS_GAIN_BACK)) + 1; + set_gain_value(false, true, atoi(name), *(int*)val); + } + else if(strstr(name, SANE_FULL_NAME(CIS_OFFSET_FRONT)) == name) + { + name += strlen(SANE_FULL_NAME(CIS_OFFSET_FRONT)) + 1; + set_gain_value(true, false, atoi(name), *(int*)val); + } + else if(strstr(name, SANE_FULL_NAME(CIS_OFFSET_BACK)) == name) + { + name += strlen(SANE_FULL_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) { @@ -524,7 +557,7 @@ int scanner_hw::open(std::function image_handler) img_controller_->setDpi((dpi_ + 100) / 200); img_controller_->setDelayTime(delay_); img_controller_->setSample(sample_); - // img_controller_->setSp(2520); + img_controller_->setSp(sp_); void(FpgaComm::* exposure[])(int) = {&FpgaComm::setAExposureB, &FpgaComm::setAExposureG , &FpgaComm::setAExposureR, &FpgaComm::setBExposureB, &FpgaComm::setBExposureG, &FpgaComm::setBExposureR}; @@ -535,14 +568,14 @@ int scanner_hw::open(std::function image_handler) } for(int i = 0; i < FpgaComm::CIS_SECTOR_COUNT; ++i) - img_controller_->setAGain(i, gain_[SIDE_FRONT]); + img_controller_->setAGain(i, gain_[SIDE_FRONT][i]); for(int i = 0; i < FpgaComm::CIS_SECTOR_COUNT; ++i) - img_controller_->setBGain(i, gain_[SIDE_BACK]); + img_controller_->setBGain(i, gain_[SIDE_BACK][i]); for(int i = 0; i < FpgaComm::CIS_SECTOR_COUNT; ++i) - img_controller_->setAOffset(i, off_[SIDE_FRONT]); + img_controller_->setAOffset(i, off_[SIDE_FRONT][i]); for(int i = 0; i < FpgaComm::CIS_SECTOR_COUNT; ++i) - img_controller_->setBOffset(i, off_[SIDE_BACK]); + img_controller_->setBOffset(i, off_[SIDE_BACK][i]); auto cb = [this](int ev, unsigned int data) -> void { diff --git a/hardware/hardware.h b/hardware/hardware.h index 4081b06..99c34d5 100644 --- a/hardware/hardware.h +++ b/hardware/hardware.h @@ -21,7 +21,7 @@ // LPPACKIMAGE: image information, ignored when bool is false #define IMAGE_HANDLER_PROTO void(dyn_mem_ptr, bool, LPPACKIMAGE) -class FpgaComm; +#include "./cis/FpgaComm.h" class GVideoISP1; class gVideo; class MotorBoard; @@ -60,9 +60,12 @@ class scanner_hw : public sane_opt_provider int delay_ = 1000; int frame_h_ = 12; int sample_ = 256; + int sp_ = 816; int exposure_[SIDE_COUNT][COLOR_IND_COUNT]; - int gain_[SIDE_COUNT]; - int off_[SIDE_COUNT]; + int gain_[SIDE_COUNT][FpgaComm::CIS_SECTOR_COUNT]; + int off_[SIDE_COUNT][FpgaComm::CIS_SECTOR_COUNT]; + double stretch_h_ = 1.0f; + double stretch_v_ = 1.0f; std::string paper_ = "\345\214\271\351\205\215\345\216\237\345\247\213\345\260\272\345\257\270"; bool lateral_ = false; @@ -81,6 +84,7 @@ class scanner_hw : public sane_opt_provider void thread_image_capture(void); bool is_scan_fatal(void); void retrieve_v4l2_mem(safe_fifo* mem, int* used); + void set_gain_value(bool front, bool gain, int sector, int val); public: scanner_hw(); @@ -102,586 +106,3 @@ public: int close(void); bool is_scanning(void); }; -// { -// "mode": { -// "cat": "none", -// "group": "CIS", -// "title": "颜色模式", -// "desc": "选择镜头色彩工作模式", -// "type": "string", -// "fix-id": 34819, -// "ui-pos": 10, -// "auth": 0, -// "size": 12, -// "cur": "彩色", -// "default": "彩色", -// "range": ["彩色", "灰度"] -// }, -// "resolution": { -// "cat": "none", -// "group": "CIS", -// "title": "分辨率", -// "desc": "设置镜头工作的分辨率", -// "type": "int", -// "fix-id": 34840, -// "ui-pos": 11, -// "auth": 0, -// "size": 4, -// "cur": 200, -// "default": 200, -// "range": [200, 300, 600] -// }, -// "paper": { -// "cat": "base", -// "group": "base", -// "title": "纸张尺寸", -// "desc": "设置出图大小", -// "type": "string", -// "fix-id": 34831, -// "ui-pos": 10, -// "auth": 0, -// "size": 44, -// "cur": "匹配原始尺寸", -// "default": "匹配原始尺寸", -// "range": ["A3", "8开", "A4", "16开", "A5", "A6", "B4", "B5", "B6", "Letter", "Double Letter", "LEGAL", "匹配原始尺寸", { -// "resolution<500": "最大扫描尺寸自动裁切" -// }, { -// "resolution<500": "最大扫描尺寸" -// }, { -// "resolution<500": "三联试卷" -// }] -// }, -// "lateral": { -// "cat": "base", -// "group": "base", -// "title": "横向", -// "desc": "横向放置纸张", -// "type": "bool", -// "fix-id": 34924, -// "ui-pos": 12, -// "auth": 0, -// "affect": 6, -// "visible": 0, -// "size": 4, -// "cur": false, -// "default": false, -// "depend": "paper==A4 || paper==16开 || paper==A5 || paper==A6 || paper==B5 || paper==B6 || paper==Letter" -// }, -// "paper-w": { -// "cat": "base", -// "group": "base", -// "title": "纸张宽度", -// "desc": "以毫米为单位的纸张宽", -// "type": "float", -// "fix-id": 34922, -// "ui-pos": 13, -// "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": "纸张高度", -// "desc": "以毫米为单位的纸张高", -// "type": "float", -// "fix-id": 34923, -// "ui-pos": 14, -// "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": "待纸扫描", -// "desc": "启用后,文稿放入扫描仪时将自动启动扫描", -// "type": "bool", -// "fix-id": 34873, -// "ui-pos": 12, -// "auth": 0, -// "size": 4, -// "cur": false, -// "default": false -// }, -// "wait-scan-exit": { -// "cat": "base", -// "group": "feeder", -// "title": "待纸扫描退出时间", -// "desc": "设置结束待纸扫描的时间", -// "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": "扫描张数", -// "desc": "选择指定数量扫描或连续扫描", -// "type": "string", -// "fix-id": 34862, -// "ui-pos": 15, -// "auth": 0, -// "size": 24, -// "cur": "连续扫描", -// "default": "连续扫描", -// "range": ["连续扫描", "扫描指定张数"], -// "depend": "is-wait-scan==false" -// }, -// "scan-count": { -// "cat": "base", -// "group": "feeder", -// "title": " 扫描数量", -// "desc": "扫描指定数量", -// "type": "int", -// "fix-id": 34863, -// "ui-pos": 16, -// "auth": 0, -// "size": 4, -// "cur": -1, -// "default": -1, -// "depend": "scan-mode.enabled&&scan-mode==扫描指定张数" -// }, -// "is-auto-strength": { -// "cat": "base", -// "group": "feeder", -// "title": "自动分纸强度", -// "desc": "扫描仪自动修正分纸力度", -// "type": "bool", -// "fix-id": 34876, -// "ui-pos": 27, -// "auth": 0, -// "size": 4, -// "cur": false, -// "default": false -// }, -// "feed-strength-value": { -// "cat": "base", -// "group": "feeder", -// "title": " 进纸失败率", -// "desc": "高于该值时扫描仪将调整分纸力度", -// "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": "分纸强度", -// "desc": "设置扫描仪的分纸力度", -// "type": "string", -// "fix-id": 34874, -// "ui-pos": 30, -// "auth": 0, -// "size": 12, -// "cur": "一般", -// "default": "一般", -// "range": ["弱", "一般", "强"], -// "depend": "is-auto-strength!=true" -// }, -// "time-to-sleep": { -// "cat": "base", -// "group": "feeder", -// "title": "休眠时间", -// "desc": "设置扫描仪的休眠时间", -// "type": "string", -// "fix-id": 34875, -// "ui-pos": 33, -// "auth": 0, -// "size": 16, -// "cur": "不休眠", -// "default": "不休眠", -// "range": ["不休眠", "五分钟", "十分钟", "半小时", "一小时", "两小时", "四小时"] -// }, -// "baud": { -// "cat": "none", -// "group": "CIS", -// "title": "波特率", -// "desc": "CIS控制通信速率", -// "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": "延迟响应", -// "desc": "采集头接受命令后的动作延迟时间", -// "type": "int", -// "ui-pos": 21, -// "auth": 0, -// "unit": "microsec", -// "size": 4, -// "cur": 1000, -// "default": 1000 -// }, -// "frame-h": { -// "cat": "none", -// "group": "CIS", -// "title": "帧高度", -// "desc": "采集头每一帧的采集高度", -// "type": "int", -// "ui-pos": 22, -// "auth": 0, -// "size": 4, -// "cur": 12, -// "default": 12 -// }, -// "sample": { -// "cat": "none", -// "group": "CIS", -// "title": "采样频率", -// "desc": "采样频率", -// "type": "int", -// "ui-pos": 23, -// "auth": 0, -// "size": 4, -// "cur": 256, -// "default": 256 -// }, -// "expo-fb": { -// "cat": "none", -// "group": "CIS", -// "title": "曝光度(正面蓝色通道)", -// "desc": "正面蓝色通道的曝光强度", -// "type": "int", -// "ui-pos": 32, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "expo-fg": { -// "cat": "none", -// "group": "CIS", -// "title": "曝光度(正面绿色通道)", -// "desc": "正面绿色通道的曝光强度", -// "type": "int", -// "ui-pos": 31, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "expo-fr": { -// "cat": "none", -// "group": "CIS", -// "title": "曝光度(正面红色通道)", -// "desc": "正面红色通道的曝光强度", -// "type": "int", -// "ui-pos": 30, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "expo-bb": { -// "cat": "none", -// "group": "CIS", -// "title": "曝光度(背面蓝色通道)", -// "desc": "背面蓝色通道的曝光强度", -// "type": "int", -// "ui-pos": 35, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "expo-bg": { -// "cat": "none", -// "group": "CIS", -// "title": "曝光度(背面绿色通道)", -// "desc": "背面绿色通道的曝光强度", -// "type": "int", -// "ui-pos": 34, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "expo-br": { -// "cat": "none", -// "group": "CIS", -// "title": "曝光度(背面红色通道)", -// "desc": "背面红色通道的曝光强度", -// "type": "int", -// "ui-pos": 33, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "gain-f": { -// "cat": "none", -// "group": "CIS", -// "title": "增益(正面)", -// "desc": "正面的增益量", -// "type": "int", -// "ui-pos": 40, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "gain-b": { -// "cat": "none", -// "group": "CIS", -// "title": "增益(背面)", -// "desc": "背面的增益量", -// "type": "int", -// "ui-pos": 41, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -1000, -// "max": 1000, -// "step": 1 -// } -// }, -// "off-f": { -// "cat": "none", -// "group": "CIS", -// "title": "增益补偿(正面)", -// "desc": "正面的增益补偿量", -// "type": "int", -// "ui-pos": 45, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -100, -// "max": 100, -// "step": 1 -// } -// }, -// "off-b": { -// "cat": "none", -// "group": "CIS", -// "title": "增益补偿(背面)", -// "desc": "背面的增益补偿量", -// "type": "int", -// "ui-pos": 46, -// "auth": 0, -// "size": 4, -// "cur": 0, -// "default": 0, -// "range": { -// "min": -100, -// "max": 100, -// "step": 1 -// } -// }, -// "paper-on": { -// "cat": "none", -// "group": "feeder", -// "title": "纸张就绪", -// "desc": "纸张已经在进纸台上放置好", -// "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": "双张检测", -// "desc": "检测是否有两张或者多张纸同时搓进", -// "type": "string", -// "ui-pos": 18, -// "auth": 0, -// "size": 16, -// "cur": "超声波", -// "default": "超声波", -// "range": ["超声波", "禁用"] -// }, -// "is-staple": { -// "cat": "none", -// "group": "feeder", -// "title": "装订检测", -// "desc": "检测是否有订书钉存在", -// "type": "bool", -// "fix-id": 34861, -// "ui-pos": 20, -// "auth": 0, -// "size": 4, -// "cur": true, -// "default": true -// }, -// "motor-speed": { -// "cat": "none", -// "group": "feeder", -// "title": "走纸速度", -// "desc": "设置走纸电机的速度,张\/分(PPM)", -// "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": "歪斜检测", -// "desc": "检测进纸是否歪斜", -// "type": "bool", -// "fix-id": 34868, -// "ui-pos": 22, -// "auth": 0, -// "size": 4, -// "cur": true, -// "default": true -// }, -// "askew-range": { -// "cat": "none", -// "group": "feeder", -// "title": "歪斜容忍度", -// "desc": "值越小,能容忍得送入文稿歪斜角度越小", -// "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" -// }, -// "cis-len": { -// "cat": "base", -// "group": "关于", -// "title": "镜头长", -// "desc": "图像采集镜头的长度,单位为毫米(mm)", -// "type": "int", -// "ui-pos": 30, -// "auth": 0, -// "unit": "mm", -// "readonly": true, -// "size": 4, -// "auto": false, -// "cur": 3888, -// "default": 3888 -// }, -// "motor-ver": { -// "cat": "none", -// "group": "关于", -// "title": "电机驱动版本", -// "desc": "电机板驱动程序版本号", -// "type": "string", -// "fix-id": 34909, -// "ui-pos": 16, -// "auth": 0, -// "readonly": true, -// "size": 24, -// "auto": false, -// "cur": "", -// "default": "" -// }, -// "fpga-ver": { -// "cat": "none", -// "group": "关于", -// "title": "CIS控制器版本", -// "desc": "镜头参数控制驱动程序版本号", -// "type": "string", -// "ui-pos": 17, -// "auth": 0, -// "readonly": true, -// "size": 24, -// "auto": false, -// "cur": "", -// "default": "" -// } -// } diff --git a/hardware/motor/motorboard.h b/hardware/motor/motorboard.h index 1732ab4..5874960 100644 --- a/hardware/motor/motorboard.h +++ b/hardware/motor/motorboard.h @@ -41,18 +41,23 @@ typedef struct SMB_CONFIG unsigned int color_mode : 1; unsigned int paper : 1; unsigned int double_paper : 1; + unsigned int staple_enable : 1;//5 unsigned int error_clean : 1; unsigned int status_init : 1; unsigned int pick_paper : 1; + unsigned int skew_enable : 1; unsigned int skew_parameter : 3; + unsigned int key_staple_enable : 1;//8 unsigned int iic_config_addr : 7; + unsigned int slow_moire : 1; unsigned int v_setting : 2;//10 unsigned int speed_set_enable : 1; unsigned int double_out_en : 1; + unsigned int dpi_mode : 2; // unsigned int sleep_parameter : 2;//6 // unsigned int dpi600:1; diff --git a/scanner/async_scanner.cpp b/scanner/async_scanner.cpp index beee270..2b28dd8 100644 --- a/scanner/async_scanner.cpp +++ b/scanner/async_scanner.cpp @@ -457,11 +457,11 @@ dyn_mem_ptr async_scanner::handle_scan_start(LPPACK_BASE pack, uint32_t* used, p FILE* dst = fopen(("/tmp/scan_" + std::to_string(lpinfo->pos.paper_ind) + ".bmp").c_str(), "wb"); if(dst) { - std::string bih(utils::bitmap_info_header(lpinfo->width, lpinfo->height, lpinfo->bpp * lpinfo->channels, lpinfo->resolution_x, lpinfo->resolution_y)), + std::string bih(utils::bitmap_info_header(lpinfo->width, lpinfo->height, lpinfo->bpp, lpinfo->resolution_x, lpinfo->resolution_y)), bfh(utils::bitmap_file_header((BITMAPINFOHEADER*)&bih[0])); fwrite(bfh.c_str(), 1, bfh.length(), dst); fwrite(bih.c_str(), 1, bih.length(), dst); - fwrite(data->ptr(), 1, data->get_rest(), dst); + fwrite(data->ptr(), 1, ((BITMAPINFOHEADER*)&bih[0])->biSizeImage, dst); fclose(dst); } data->release(); diff --git a/scanner/scanner_const_opts.h b/scanner/scanner_const_opts.h index fcb4cf5..e2320d9 100644 --- a/scanner/scanner_const_opts.h +++ b/scanner/scanner_const_opts.h @@ -26,143 +26,3 @@ public: virtual char* get_value(const char* name, void* value, size_t* size, int* err = nullptr) override; }; -// { -// "dev-vid": { -// "cat": "base", -// "group": "关于", -// "title": "USB-VID", -// "desc": "设备制造商在USB组织的ID", -// "type": "string", -// "fix-id": 34898, -// "ui-pos": 10, -// "auth": 0, -// "readonly": true, -// "size": 16, -// "auto": false, -// "cur": "3072", -// "default": "3072" -// }, -// "dev-pid": { -// "cat": "base", -// "group": "关于", -// "title": "USB-PID", -// "desc": "设备在USB组织中的产品ID", -// "type": "string", -// "fix-id": 34899, -// "ui-pos": 11, -// "auth": 0, -// "readonly": true, -// "size": 16, -// "auto": false, -// "cur": "0306", -// "default": "0306" -// }, -// "dev-name": { -// "cat": "base", -// "group": "关于", -// "title": "设备名称", -// "desc": "设备名称", -// "type": "string", -// "fix-id": 34900, -// "ui-pos": 12, -// "auth": 0, -// "readonly": true, -// "size": 96, -// "auto": false, -// "cur": "300NewTx", -// "default": "300NewTx" -// }, -// "dev-model": { -// "cat": "base", -// "group": "关于", -// "title": "产品系列", -// "desc": "设备所属产品系列名称", -// "type": "string", -// "fix-id": 34901, -// "ui-pos": 13, -// "auth": 0, -// "readonly": true, -// "size": 96, -// "auto": false, -// "cur": "G200", -// "default": "G200" -// }, -// "dev-sn": { -// "cat": "base", -// "group": "关于", -// "title": "序列号", -// "desc": "设备序列号", -// "type": "string", -// "fix-id": 34902, -// "ui-pos": 14, -// "auth": 0, -// "readonly": true, -// "size": 32, -// "auto": false, -// "ownread": true, -// "cur": "GB20231201", -// "default": "GB20231201" -// }, -// "fmw-ver": { -// "cat": "base", -// "group": "关于", -// "title": "固件版本", -// "desc": "设备固件版本号", -// "type": "string", -// "fix-id": 34903, -// "ui-pos": 15, -// "auth": 0, -// "readonly": true, -// "size": 32, -// "auto": false, -// "cur": "G2393B0500", -// "default": "G2393B0500" -// }, -// "roller-life": { -// "cat": "base", -// "group": "关于", -// "title": "滚轴寿命", -// "desc": "该设备滚轴过纸的最大张数", -// "type": "int", -// "fix-id": 34907, -// "ui-pos": 20, -// "auth": 0, -// "readonly": true, -// "size": 4, -// "auto": false, -// "cur": 450000, -// "default": 450000 -// }, -// "ip-addr": { -// "cat": "base", -// "group": "关于", -// "title": "IP", -// "desc": "设备联网时所分配的IP地址", -// "type": "string", -// "fix-id": 34904, -// "ui-pos": 21, -// "auth": 0, -// "readonly": true, -// "size": 96, -// "auto": false, -// "ownread": true, -// "cur": "0", -// "default": "0" -// }, -// "mac-addr": { -// "cat": "base", -// "group": "关于", -// "title": "MAC", -// "desc": "设备网卡地址", -// "type": "string", -// "fix-id": 34905, -// "ui-pos": 22, -// "auth": 0, -// "readonly": true, -// "size": 96, -// "auto": false, -// "ownread": true, -// "cur": "0", -// "default": "0" -// } -// } diff --git a/sdk/base/utils.cpp b/sdk/base/utils.cpp index adc0a52..c3a96f0 100644 --- a/sdk/base/utils.cpp +++ b/sdk/base/utils.cpp @@ -1278,12 +1278,12 @@ namespace utils { int pal[] = { 0, 0x0ffffff }; stream += std::string((char*)pal, sizeof(pal)); - bih.biClrUsed = _countof(pal); + ((BITMAPINFOHEADER*)&stream[0])->biClrUsed = _countof(pal); } else if(bpp == 8) { stream += std::string((char*)global_info::gray_pallete, sizeof(global_info::gray_pallete)); - bih.biClrUsed = _countof(global_info::gray_pallete); + ((BITMAPINFOHEADER*)&stream[0])->biClrUsed = _countof(global_info::gray_pallete); } return std::move(stream); diff --git a/sdk/json/gb_json.cpp b/sdk/json/gb_json.cpp index 24a73f0..b91e6d0 100644 --- a/sdk/json/gb_json.cpp +++ b/sdk/json/gb_json.cpp @@ -960,3 +960,36 @@ bool gb_json::operator!=(const gb_json& r) { return !(*this == r); } + +bool gb_json::revise_number_type(bool dbval) +{ + bool chg = false; + + if (dbval) + { + // int -> double + if (type_ == VAL_TYPE_INT) + { + type_ = VAL_TYPE_FLOAT; + simple_val_.dval = simple_val_.nval; + chg = true; + } + else + chg = type_ == VAL_TYPE_FLOAT; + } + else + { + // double -> int + if (type_ == VAL_TYPE_FLOAT) + { + type_ = VAL_TYPE_INT; + simple_val_.nval = simple_val_.dval + .5f; + chg = true; + } + else + chg = type_ == VAL_TYPE_INT; + } + + return chg; +} + diff --git a/sdk/json/gb_json.h b/sdk/json/gb_json.h index 628c8ce..f9c90ec 100644 --- a/sdk/json/gb_json.h +++ b/sdk/json/gb_json.h @@ -115,6 +115,11 @@ public: bool operator==(const gb_json& r); bool operator!=(const gb_json& r); + + // [2024-01-13] double value maybe consider as integer if the number just an integer, this method is to set numbre to right type + // dbval - true: make integer to double and simple_val_.dval = simple_val_.nval; + // false: make double to integer and simple_val_.nval = simple_val_.dval + bool revise_number_type(bool dbval); }; #ifdef DUMP_JSON_OBJECT_LIFE diff --git a/sdk/sane/sane_ex.h b/sdk/sane/sane_ex.h index 42179e2..6e70a84 100644 --- a/sdk/sane/sane_ex.h +++ b/sdk/sane/sane_ex.h @@ -248,6 +248,7 @@ enum opt_visible_level // "visible" field #define SANE_STD_OPT_NAME_CIS_DELAY "act-after" #define SANE_STD_OPT_NAME_CIS_FRAME_H "frame-h" #define SANE_STD_OPT_NAME_CIS_SAMPLE "sample" +#define SANE_STD_OPT_NAME_CIS_SP "cis-sp" #define SANE_STD_OPT_NAME_CIS_EXPO_FB "expo-fb" #define SANE_STD_OPT_NAME_CIS_EXPO_FG "expo-fg" #define SANE_STD_OPT_NAME_CIS_EXPO_FR "expo-fr" @@ -258,6 +259,8 @@ enum opt_visible_level // "visible" field #define SANE_STD_OPT_NAME_CIS_GAIN_BACK "gain-b" #define SANE_STD_OPT_NAME_CIS_OFFSET_FRONT "off-f" #define SANE_STD_OPT_NAME_CIS_OFFSET_BACK "off-b" +#define SANE_STD_OPT_NAME_CIS_STRETCH_H "stretch-h" +#define SANE_STD_OPT_NAME_CIS_STRETCH_V "stretch-v" #define SANE_STD_OPT_NAME_MOTOR_SPEED "motor-speed" // // 借鉴TWAIN协议固定ID的做法,定义SANE属性的固定ID - 这里与TWAIN中的ID保持一致,以方便TWAIN的调用 diff --git a/sdk/sane_opt_json/device_opt.cpp b/sdk/sane_opt_json/device_opt.cpp index 9f43d4b..d32542e 100644 --- a/sdk/sane_opt_json/device_opt.cpp +++ b/sdk/sane_opt_json/device_opt.cpp @@ -1239,6 +1239,12 @@ bool device_option::arrange_raw_json(sane_opt_provider* sop) child->get_value("type", str); if (str != JSON_SANE_TYPE_GROUP) // omit group { + if (str == JSON_SANE_TYPE_FIXED) + { + // revise cur and default + device_option::revise_number_type(child, true); + } + if(no_grp_) { insert_option(child, sop); @@ -1329,7 +1335,7 @@ void device_option::init_depends(gb_json* opt) delete v; } } -gb_json* device_option::copy_opt(gb_json* from) +gb_json* device_option::copy_opt(gb_json* from, bool* changed_cur) { std::string text(from->to_string()); gb_json* to = new gb_json(); @@ -1377,16 +1383,55 @@ gb_json* device_option::copy_opt(gb_json* from) { std::string val(init_value_[to->key()]->value(&device_option::calc_simple_logic_expression, this)); std::string type(""); + bool apply_cur = false, rdo = false; + + // should we change current value ??? - answer: add boolean field "bind" to specify + if (!from->get_value("bind", apply_cur)) + apply_cur = false; + if (!from->get_value("readonly", rdo)) + rdo = false; to->get_value("type", type); + if (changed_cur) + *changed_cur = apply_cur; if (type == JSON_SANE_TYPE_BOOL) + { to->set_value("default", *(bool*)val.c_str()); - else if(type == JSON_SANE_TYPE_INT) + if (apply_cur) + { + to->set_value("cur", *(bool*)val.c_str()); + update_provider_value(to->key().c_str(), &val[0], rdo); + } + } + else if (type == JSON_SANE_TYPE_INT) + { to->set_value("default", *(int*)val.c_str()); - else if(type == JSON_SANE_TYPE_FIXED) + if (apply_cur) + { + to->set_value("cur", *(int*)val.c_str()); + update_provider_value(to->key().c_str(), &val[0], rdo); + } + } + else if (type == JSON_SANE_TYPE_FIXED) + { to->set_value("default", *(double*)val.c_str()); - else if(type == JSON_SANE_TYPE_STRING) - to->set_value("default", (const wchar_t*)val.c_str()); + if (apply_cur) + { + to->set_value("cur", *(double*)val.c_str()); + update_provider_value(to->key().c_str(), &val[0], rdo); + } + } + else if (type == JSON_SANE_TYPE_STRING) + { + to->set_value("default", val.c_str()); + if (apply_cur) + { + to->set_value("cur", val.c_str()); + update_provider_value(to->key().c_str(), &val[0], rdo); + } + } + else if (changed_cur) + *changed_cur = false; } // 4: range value ... @@ -1526,6 +1571,7 @@ bool device_option::to_now(bool init, bool* changed) while (from) { std::string name(from->key()); + bool cur_chged = false; if (init) init_depends(from); @@ -1543,12 +1589,12 @@ bool device_option::to_now(bool init, bool* changed) } } - to = copy_opt(from); + to = copy_opt(from, &cur_chged); from->release(); if (to) { // copy cur value ... - if (now_) + if (now_ && !cur_chged) { gb_json* now = nullptr; now_->get_value(to->key().c_str(), now); @@ -1626,6 +1672,32 @@ bool device_option::to_now(bool init, bool* changed) return now_ != nullptr; } +void device_option::update_provider_value(const char* name, void* value, bool skip_first) +{ + if (src_.count(name)) + { + sane_opt_provider* opt = nullptr; + + if (skip_first) + { + opt = src_[name]->get_following(name); + } + else + { + opt = src_[name]; + opt->add_ref(); + } + + while (opt) + { + opt->set_value(name, value); + + sane_opt_provider* next = opt->get_following(name); + opt->release(); + opt = next; + } + } +} std::string device_option::option_value(gb_json* jsn, bool def_val) { @@ -1658,6 +1730,54 @@ std::string device_option::option_value(gb_json* jsn, bool def_val) return std::move(type); } +void device_option::revise_number_type(gb_json* opt, bool to_double) +{ + gb_json* child = nullptr; + + opt->get_value("cur", child); + if (child) + { + if (child->is_leaf_node()) + child->revise_number_type(to_double); + //else + // no object now, fixed me if be object + + child->release(); + } + + opt->get_value("default", child); + if (child) + { + if (child->is_leaf_node()) + child->revise_number_type(to_double); + else + { + gb_json* v = child->first_child(); + while (v) + { + if (v->is_leaf_node()) + v->revise_number_type(to_double); + v->release(); + v = child->next_child(); + } + } + child->release(); + } + + opt->get_value("range", child); + if (child) + { + gb_json* v = child->first_child(); + while (v) + { + if (v->is_leaf_node()) + v->revise_number_type(to_double); + v->release(); + v = child->next_child(); + } + child->release(); + } +} std::string device_option::trans_group(const char* utf8, bool to_title) { @@ -1787,18 +1907,7 @@ int device_option::update_data(const char* name, void* value, bool reorder_if_ne err = SCANNER_ERR_ACCESS_DENIED; // following ... - if (src_.count(name)) - { - sane_opt_provider* opt = src_[name]->get_following(name); - while(opt) - { - opt->set_value(name, value); - - sane_opt_provider* next = opt->get_following(name); - opt->release(); - opt = next; - } - } + update_provider_value(name, value, true); } else { @@ -1807,22 +1916,7 @@ int device_option::update_data(const char* name, void* value, bool reorder_if_ne // pass to sane_opt_provider ... err = SCANNER_ERR_OK; - if (src_.count(name)) - { - sane_opt_provider* opt = src_[name]; - opt->add_ref(); - - while (opt) - { - int r = opt->set_value(name, value); - if (r) - err = r; - - sane_opt_provider* next = opt->get_following(name); - opt->release(); - opt = next; - } - } + update_provider_value(name, value); child->get_value("type", type); utils::to_log(LOG_LEVEL_DEBUG, "set option '%s' value to '%s' = %d.\n", name, sane_opt_provider::sane_value_2_text(type.c_str(), value).c_str(), err); diff --git a/sdk/sane_opt_json/device_opt.h b/sdk/sane_opt_json/device_opt.h index 6821c62..d38397a 100644 --- a/sdk/sane_opt_json/device_opt.h +++ b/sdk/sane_opt_json/device_opt.h @@ -181,12 +181,14 @@ class device_option : public refer void insert_option(gb_json* opt, sane_opt_provider* from, const char* group = nullptr); bool arrange_raw_json(sane_opt_provider* sop); // create origin_ and re-arrange groups void init_depends(gb_json* opt); - gb_json* copy_opt(gb_json* from); + gb_json* copy_opt(gb_json* from, bool *changed_cur = nullptr); int visibility(gb_json* jsn); bool to_now(bool init, bool* changed); + void update_provider_value(const char* name, void* value, bool skip_first = false/*readonly value should skip first*/); protected: static std::string option_value(gb_json* jsn, bool def_val); + static void revise_number_type(gb_json* opt, bool to_double); template static condition_value* to_condition_value(gb_json* jsn, const char* key, const char* type, device_option* parent) diff --git a/sdk/sane_opt_json/user.h b/sdk/sane_opt_json/user.h index 2ef9678..22290ac 100644 --- a/sdk/sane_opt_json/user.h +++ b/sdk/sane_opt_json/user.h @@ -50,72 +50,3 @@ public: int get_current_user_login_times(void); }; -// { -// "user-name": { -// "cat": "none", -// "group": "用户", -// "title": "用户名", -// "desc": "登录用户账号", -// "type": "string", -// "fix-id": 39173, -// "ui-pos": 10, -// "auth": 0, -// "size": 32, -// "cur": "", -// "default": "" -// }, -// "user-pwd": { -// "cat": "none", -// "group": "用户", -// "title": "密码", -// "desc": "登录用户账号密码", -// "type": "string", -// "fix-id": 39174, -// "ui-pos": 11, -// "auth": 0, -// "size": 32, -// "cur": "", -// "default": "" -// }, -// "login": { -// "cat": "none", -// "group": "用户", -// "title": "登录", -// "desc": "用户登录", -// "type": "button", -// "fix-id": 39168, -// "ui-pos": 20, -// "auth": 0, -// "affect": 6, -// "size": 4, -// "auto": false -// }, -// "logout": { -// "cat": "none", -// "group": "用户", -// "title": "注销", -// "desc": "用户登出", -// "type": "button", -// "fix-id": 39169, -// "ui-pos": 21, -// "auth": 0, -// "affect": 6, -// "size": 4, -// "auto": false -// }, -// "dev-sn": { -// "cat": "base", -// "group": "关于", -// "title": "序列号", -// "desc": "设备序列号", -// "type": "string", -// "fix-id": 34902, -// "ui-pos": 14, -// "pos": 100, -// "auth": 0, -// "size": 32, -// "auto": false, -// "cur": "", -// "default": "" -// } -// } diff --git a/xmake.lua b/xmake.lua index 07a5c03..194f472 100644 --- a/xmake.lua +++ b/xmake.lua @@ -59,9 +59,9 @@ add_packagedirs("sdk") add_defines("BUILD_AS_DEVICE") add_defines("VER_MAIN=2") -add_defines("VER_FAMILY=300") -add_defines("VER_DATE=20240111") -add_defines("VER_BUILD=15") +add_defines("VER_FAMILY=200") +add_defines("VER_DATE=20240113") +add_defines("VER_BUILD=4") target("conf") set_kind("phony")