From 6453b1aad4e85a8bebc582aee571fe7238de6640 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Mon, 8 May 2023 18:04:54 +0800 Subject: [PATCH] fix CIS pre-do bug, add jpeg-quality option --- device/gxx-linux/imgproc/imageencode.cpp | 8 +- device/gxx-linux/imgproc/imageencode.h | 2 +- device/gxx-linux/scanner/imageusbhandler.cpp | 9 +- .../usb/src/async_model/hardware/hardware.cpp | 2 +- .../usb/src/async_model/hardware/hardware.h | 2 +- .../img_process/algs/img_algorithm.cpp | 63 ++++++++-- .../img_process/algs/img_algorithm.h | 9 +- .../async_model/img_process/cis_preproc.cpp | 113 ++++++++++++++++-- .../src/async_model/img_process/cis_preproc.h | 32 ++++- .../usb/src/async_model/io/usb_io.cpp | 5 +- .../src/async_model/scanner/async_scanner.cpp | 12 +- .../src/async_model/scanner/async_scanner.h | 2 +- device/gxx-linux/usb/src/usbdevice.cpp | 77 ++++++++++-- device/gxx-linux/usb/usbimageprocqueue.h | 19 ++- 14 files changed, 293 insertions(+), 62 deletions(-) diff --git a/device/gxx-linux/imgproc/imageencode.cpp b/device/gxx-linux/imgproc/imageencode.cpp index 9c4b669..fce7394 100644 --- a/device/gxx-linux/imgproc/imageencode.cpp +++ b/device/gxx-linux/imgproc/imageencode.cpp @@ -40,7 +40,7 @@ JpegImageEncode::JpegImageEncode(bool bwimg, int dpi) } m_bwimg = bwimg; } -JpegImageEncode::JpegImageEncode(const char* fmt, int dpi) : fmt_(fmt ? fmt : "") +JpegImageEncode::JpegImageEncode(const char* fmt, int dpi_h, int dpi_v, int jpeg_quality) : fmt_(fmt ? fmt : "") { if(fmt_ == "PNG") { @@ -50,12 +50,12 @@ JpegImageEncode::JpegImageEncode(const char* fmt, int dpi) : fmt_(fmt ? fmt : "" else { compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); - compression_params.push_back(100); + compression_params.push_back(jpeg_quality); compression_params.push_back(cv::IMWRITE_RESOLUTION_X); - compression_params.push_back(dpi); + compression_params.push_back(dpi_h); compression_params.push_back(cv::IMWRITE_RESOLUTION_Y); - compression_params.push_back(dpi); + compression_params.push_back(dpi_v); } } JpegImageEncode::~JpegImageEncode() diff --git a/device/gxx-linux/imgproc/imageencode.h b/device/gxx-linux/imgproc/imageencode.h index d01f271..bd5a227 100644 --- a/device/gxx-linux/imgproc/imageencode.h +++ b/device/gxx-linux/imgproc/imageencode.h @@ -25,7 +25,7 @@ class JpegImageEncode : public IImageEncode public: JpegImageEncode(bool bwimg, int dpi); - JpegImageEncode(const char* fmt, int dpi); + JpegImageEncode(const char* fmt, int dpi_h, int dpi_v, int jpeg_quality = 100); virtual ~JpegImageEncode(); virtual MemoryPtr encode(cv::Mat& image); diff --git a/device/gxx-linux/scanner/imageusbhandler.cpp b/device/gxx-linux/scanner/imageusbhandler.cpp index 0bca491..da69729 100644 --- a/device/gxx-linux/scanner/imageusbhandler.cpp +++ b/device/gxx-linux/scanner/imageusbhandler.cpp @@ -36,7 +36,7 @@ ImageUsbHandler::~ImageUsbHandler() static int num = 0; void ImageUsbHandler::add_image(void *data, int width, int height, int type, int scannnum,unsigned int fpgaversion) { - printf("ImageUsbHandler::add_image(%d * %d), fpgaversion = %d\n", width, height, fpgaversion); + printf("ImageUsbHandler::add_image(%d * %d), fpgaversion = %d, HRatio = %f, VRatio = %f\n", width, height, fpgaversion, H_ratio, V_ratio); if(images->push_raw(data, width, height, type == CV_8UC1 ? COLOR_CHANNEL_GRAY : COLOR_CHANNEL_RGB, scannnum, fpgaversion, 0)) { @@ -44,11 +44,6 @@ void ImageUsbHandler::add_image(void *data, int width, int height, int type, int } images->push(nullptr, false); // notify ONE paper passed - - // img_one_paper *paper = new img_one_paper(); - // paper->init_from(data, width, height, scannnum, PAPER_SIDE_LEFT, type == CV_8UC1 ? COLOR_CHANNEL_GRAY : COLOR_CHANNEL_RGB); - // imgproc_->push_image(paper); - // paper->release(); std::string ext = ".jpg"; { @@ -292,6 +287,8 @@ void ImageUsbHandler::Set_ratio(u32 h_ratio,u32 v_ratio) { H_ratio =*((float*)(&h_ratio)); V_ratio =*((float*)(&v_ratio)); + + images->set_ratio(H_ratio, V_ratio); } bool ImageUsbHandler::done() diff --git a/device/gxx-linux/usb/src/async_model/hardware/hardware.cpp b/device/gxx-linux/usb/src/async_model/hardware/hardware.cpp index 90b2817..84624b5 100644 --- a/device/gxx-linux/usb/src/async_model/hardware/hardware.cpp +++ b/device/gxx-linux/usb/src/async_model/hardware/hardware.cpp @@ -10,7 +10,7 @@ static std::string hardware_json = - "{\"cis-mode\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"CIS\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u5f69\\u8272\\u6216\\u8005\\u9ed1\\u767d\\u7684\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":30,\"cur\":\"\\u5f69\\u8272\",\"default\":\"\\u5f69\\u8272\",\"range\":[\"\\u5f69\\u8272\",\"\\u9ed1\\u767d\"]},\"cis-dpi\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"CIS\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u91c7\\u96c6\\u7684\\u5206\\u8fa8\\u7387\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[200,300,600]},\"gain-front\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u589e\\u76ca\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u6b63\\u9762\\u955c\\u5934\\u7684\\u589e\\u76ca\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[100,200,300,600]},\"gain-back\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u589e\\u76ca\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u80cc\\u9762\\u955c\\u5934\\u7684\\u589e\\u76ca\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[100,200,300,600]},\"offset-front\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u504f\\u79fb\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u6b63\\u9762\\u7684\\u504f\\u79fb\\u8ddd\\u79bb\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":150,\"default\":150,\"range\":[0,50,100,150,200]},\"offset-back\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u504f\\u79fb\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u80cc\\u9762\\u7684\\u504f\\u79fb\\u8ddd\\u79bb\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":150,\"default\":150,\"range\":[0,50,100,150,200]},\"exposure-f-r\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-f-g\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-f-b\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-r\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u80cc\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-g\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u80cc\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-b\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u80cc\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"paper\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":96,\"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\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"lateral\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u6a2a\\u5411\",\"desc\":\"\\u6a2a\\u5411\\u653e\\u7eb8\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_or\":[\"paper==A4\",\"==A5\",\"==A6\",\"==B5\",\"==B6\",\"==Letter\"]},\"paper-w\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5bbd\\u5ea6\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u9009\\u62e9\\u7684\\u56fa\\u5b9a\\u5927\\u5c0f\\u7eb8\\u5f20\\u7684\\u5bbd\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":true,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":1654,\"default\":1654},\"paper-h\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u9ad8\\u5ea6\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u9009\\u62e9\\u7684\\u56fa\\u5b9a\\u5927\\u5c0f\\u7eb8\\u5f20\\u7684\\u5bbd\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":true,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":2339,\"default\":2339},\"is-custom-area\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"ver\":1,\"pos\":302,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"ver\":1,\"pos\":303,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":1654,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"ver\":1,\"pos\":304,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":1654,\"default\":1654,\"range\":{\"min\":0,\"max\":1654,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"ver\":1,\"pos\":305,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":2339,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"ver\":1,\"pos\":306,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":2339,\"default\":2339,\"range\":{\"min\":0,\"max\":2339,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"scan-count\":{\"cat\":\"cis\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u7684\\u7eb8\\u5f20\\u6570\\u91cf\\uff0c\\u201c-1\\u201d\\u4e3a\\u8fde\\u7eed\\u626b\\u63cf\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":-1,\"default\":-1,\"range\":[-1,1,2,3,4,5,6,7,8,9,10]},\"double-feed-check\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u68c0\\u6d4b\",\"desc\":\"\\u8bbe\\u7f6e\\u53cc\\u5f20\\u68c0\\u6d4b\\u6a21\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":36,\"cur\":\"\\u8d85\\u58f0\\u6ce2\",\"default\":\"\\u8d85\\u58f0\\u6ce2\",\"range\":[\"\\u65e0\",\"\\u8d85\\u58f0\\u6ce2\"]},\"is-staple\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-check-askew\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"cis\",\"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\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend_or\":[\"is-check-askew==true\"]},\"chip-pos-correct\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6821\\u6b63\\u6a21\\u5f0f\\uff08\\u4f4d\\u7f6e\\uff09\",\"desc\":\"\\u542f\\u7528\\u82af\\u7247\\u4e0a\\u7684\\u4f4d\\u7f6e\\u6821\\u6b63\\u529f\\u80fd\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"auto-scan\":{\"cat\":\"cis\",\"group\":\"advance\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\",\"desc\":\"\\u5f53\\u7eb8\\u5f20\\u653e\\u4e0a\\u626b\\u63cf\\u4eea\\u65f6\\uff0c\\u81ea\\u52a8\\u5f00\\u542f\\u626b\\u63cf\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"photo-mode\":{\"cat\":\"cis\",\"group\":\"advance\",\"title\":\"\\u7167\\u7247\\u6a21\\u5f0f\",\"desc\":\"\\u7167\\u7247\\u6a21\\u5f0f\\u53ef\\u4ee5\\u4fdd\\u7559\\u56fe\\u7247\\u66f4\\u591a\\u7ec6\\u8282\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-color-correct\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u56fe\\u50cf\\u6821\\u6b63\\uff08\\u989c\\u8272\\uff09\",\"desc\":\"\\u542f\\u7528\\u82af\\u7247\\u4e0a\\u7684\\u989c\\u8272\\u6821\\u6b63\\u529f\\u80fd\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-size-check\":{\"cat\":\"cis\",\"group\":\"base\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u56fa\\u5b9a\\u5e45\\u9762\\u4e0b\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5c3a\\u5bf8\\u662f\\u5426\\u5339\\u914d\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-cache\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u7247\\u4e0a\\u7f13\\u5b58\",\"desc\":\"\\u662f\\u5426\\u5728\\u7247\\u4e0a\\u7f13\\u5b58\\u56fe\\u7247\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-size-err\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u5e45\\u9762\\u68c0\\u6d4b\\u8bef\\u5dee\",\"desc\":\"\\u8bbe\\u7f6e\\u5c3a\\u5bf8\\u68c0\\u6d4b\\u65f6\\u7684\\u8bef\\u5dee\\u5927\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":512,\"step\":1},\"depend_or\":[\"is-size-check==true\"]}}"; + "{\"cis-mode\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"CIS\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u5f69\\u8272\\u6216\\u8005\\u9ed1\\u767d\\u7684\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":30,\"cur\":\"\\u5f69\\u8272\",\"default\":\"\\u5f69\\u8272\",\"range\":[\"\\u5f69\\u8272\",\"\\u9ed1\\u767d\"]},\"cis-dpi\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"CIS\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u91c7\\u96c6\\u7684\\u5206\\u8fa8\\u7387\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[200,300,600]},\"gain-front\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u589e\\u76ca\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u6b63\\u9762\\u955c\\u5934\\u7684\\u589e\\u76ca\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[100,200,300,600]},\"gain-back\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u589e\\u76ca\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u80cc\\u9762\\u955c\\u5934\\u7684\\u589e\\u76ca\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[100,200,300,600]},\"offset-front\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u504f\\u79fb\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u6b63\\u9762\\u7684\\u504f\\u79fb\\u8ddd\\u79bb\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":150,\"default\":150,\"range\":[0,50,100,150,200]},\"offset-back\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u504f\\u79fb\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u80cc\\u9762\\u7684\\u504f\\u79fb\\u8ddd\\u79bb\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":150,\"default\":150,\"range\":[0,50,100,150,200]},\"exposure-f-r\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-f-g\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-f-b\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-r\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u80cc\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-g\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u80cc\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-b\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u80cc\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"paper\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":96,\"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\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"lateral\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u6a2a\\u5411\",\"desc\":\"\\u6a2a\\u5411\\u653e\\u7eb8\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_or\":[\"paper==A4\",\"==A5\",\"==A6\",\"==B5\",\"==B6\",\"==Letter\"]},\"paper-w\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5bbd\\u5ea6\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u9009\\u62e9\\u7684\\u56fa\\u5b9a\\u5927\\u5c0f\\u7eb8\\u5f20\\u7684\\u5bbd\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":true,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":1654,\"default\":1654},\"paper-h\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u9ad8\\u5ea6\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u9009\\u62e9\\u7684\\u56fa\\u5b9a\\u5927\\u5c0f\\u7eb8\\u5f20\\u7684\\u5bbd\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":true,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":2339,\"default\":2339},\"is-custom-area\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"ver\":1,\"pos\":302,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"ver\":1,\"pos\":303,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":1654,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"ver\":1,\"pos\":304,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":1654,\"default\":1654,\"range\":{\"min\":0,\"max\":1654,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"ver\":1,\"pos\":305,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":2339,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08\\u50cf\\u7d20\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"ver\":1,\"pos\":306,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":2339,\"default\":2339,\"range\":{\"min\":0,\"max\":2339,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"scan-count\":{\"cat\":\"cis\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u7684\\u7eb8\\u5f20\\u6570\\u91cf\\uff0c\\u201c-1\\u201d\\u4e3a\\u8fde\\u7eed\\u626b\\u63cf\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":-1,\"default\":-1,\"range\":[-1,1,2,3,4,5,6,7,8,9,10]},\"double-feed-check\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u68c0\\u6d4b\",\"desc\":\"\\u8bbe\\u7f6e\\u53cc\\u5f20\\u68c0\\u6d4b\\u6a21\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":36,\"cur\":\"\\u8d85\\u58f0\\u6ce2\",\"default\":\"\\u8d85\\u58f0\\u6ce2\",\"range\":[\"\\u65e0\",\"\\u8d85\\u58f0\\u6ce2\"]},\"is-staple\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-check-askew\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"cis\",\"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\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend_or\":[\"is-check-askew==true\"]},\"chip-pos-correct\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6821\\u6b63\\u6a21\\u5f0f\\uff08\\u4f4d\\u7f6e\\uff09\",\"desc\":\"\\u542f\\u7528\\u82af\\u7247\\u4e0a\\u7684\\u4f4d\\u7f6e\\u6821\\u6b63\\u529f\\u80fd\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"auto-scan\":{\"cat\":\"cis\",\"group\":\"advance\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\",\"desc\":\"\\u5f53\\u7eb8\\u5f20\\u653e\\u4e0a\\u626b\\u63cf\\u4eea\\u65f6\\uff0c\\u81ea\\u52a8\\u5f00\\u542f\\u626b\\u63cf\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"photo-mode\":{\"cat\":\"cis\",\"group\":\"advance\",\"title\":\"\\u7167\\u7247\\u6a21\\u5f0f\",\"desc\":\"\\u7167\\u7247\\u6a21\\u5f0f\\u53ef\\u4ee5\\u4fdd\\u7559\\u56fe\\u7247\\u66f4\\u591a\\u7ec6\\u8282\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-color-correct\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u56fe\\u50cf\\u6821\\u6b63\\uff08\\u989c\\u8272\\uff09\",\"desc\":\"\\u542f\\u7528\\u82af\\u7247\\u4e0a\\u7684\\u989c\\u8272\\u6821\\u6b63\\u529f\\u80fd\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-size-check\":{\"cat\":\"cis\",\"group\":\"base\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u56fa\\u5b9a\\u5e45\\u9762\\u4e0b\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5c3a\\u5bf8\\u662f\\u5426\\u5339\\u914d\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-cache\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u7247\\u4e0a\\u7f13\\u5b58\",\"desc\":\"\\u662f\\u5426\\u5728\\u7247\\u4e0a\\u7f13\\u5b58\\u56fe\\u7247\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-size-err\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u5e45\\u9762\\u68c0\\u6d4b\\u8bef\\u5dee\",\"desc\":\"\\u8bbe\\u7f6e\\u5c3a\\u5bf8\\u68c0\\u6d4b\\u65f6\\u7684\\u8bef\\u5dee\\u5927\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":511,\"step\":1},\"depend_or\":[\"is-size-check==true\"]}}"; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // class image_capture diff --git a/device/gxx-linux/usb/src/async_model/hardware/hardware.h b/device/gxx-linux/usb/src/async_model/hardware/hardware.h index ffce1c4..0f6532d 100644 --- a/device/gxx-linux/usb/src/async_model/hardware/hardware.h +++ b/device/gxx-linux/usb/src/async_model/hardware/hardware.h @@ -12,7 +12,7 @@ class gb_json; -#define CAPTURED_IMG_RECEIVER_PROTO void(int data_type/*img_cb_type*/, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status, bool img_new, bool img_over) +#define CAPTURED_IMG_RECEIVER_PROTO void(int data_type/*img_cb_type*/, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status, bool img_new, bool img_over, float ratio_H, float ratio_v) // { diff --git a/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.cpp b/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.cpp index 1228b15..1500754 100644 --- a/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.cpp +++ b/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.cpp @@ -15,7 +15,7 @@ extern int32_t (*set_pixel_type)(int*); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // class img_one_paper -img_one_paper::img_one_paper() +img_one_paper::img_one_paper() : ratio_h_(1.0f), ratio_v_(1.0f) { } img_one_paper::~img_one_paper() @@ -28,7 +28,7 @@ void img_one_paper::clear(void) imgs_.clear(); } -int img_one_paper::init_from(void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel cc, img_status status, bool img_new, bool img_over) +int img_one_paper::init_from(void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel cc, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v) { PACKIMAGE pk; @@ -58,9 +58,9 @@ int img_one_paper::init_from(void* data, size_t w, size_t h, int dpi_x, int dpi_ } pk.height = h; - return init_from(data, w, h, &pk); + return init_from(data, w, h, &pk, ratio_h, ratio_v); } -int img_one_paper::init_from(void* data, size_t w, size_t h, LPPACKIMAGE pimg) +int img_one_paper::init_from(void* data, size_t w, size_t h, LPPACKIMAGE pimg, float ratio_h, float ratio_v) { int ret = 0; PROCIMG img; @@ -69,6 +69,8 @@ int img_one_paper::init_from(void* data, size_t w, size_t h, LPPACKIMAGE pimg) memcpy(&img.head, pimg, sizeof(img.head)); img.img = std::move(cv::Mat(h, w, CV_8UC1, data)); imgs_.push_back(std::move(img)); + ratio_h_ = ratio_h; + ratio_v_ = ratio_v; return ret; } @@ -76,6 +78,14 @@ std::vector& img_one_paper::images_queue(void) { return imgs_; } +float img_one_paper::get_cis_ratio_h(void) +{ + return ratio_h_; +} +float img_one_paper::get_cis_ratio_v(void) +{ + return ratio_v_; +} @@ -563,7 +573,7 @@ bool img_color_transfer::is_enabled(std::functionattach_text(&fmt_json[0])) @@ -639,12 +673,23 @@ int32_t img_encoder::set_config(const char* cfg_name, void* data, size_t* len, u if(strcmp(cfg_name, "img-format") == 0) fmt_ = std::string((char*)data, *len); + else if(strcmp(cfg_name, "jpeg-quality") == 0) + jpeg_quality_ = *(int*)data; } return ret; } bool img_encoder::update_enabled(const char* name, std::function get_opt) { + gb_json* child = cfg_->first_child(); + + while(child) + { + sane_cfg_provider::update_option_enable_status(child, get_opt); + child->release(); + child = cfg_->next_child(); + } + return false; } int32_t img_encoder::get_raw_value(const char* name, const char* key, std::string& val, uint32_t* type) @@ -666,7 +711,7 @@ int32_t img_encoder::get_raw_value(const char* name, const char* key, std::strin MemoryPtr img_encoder::encode(PROCIMG* img) { - JpegImageEncode encoder(fmt_.c_str(), img->head.resolution_x); + JpegImageEncode encoder(fmt_.c_str(), img->head.resolution_x, img->head.resolution_y, jpeg_quality_); if(fmt_ == "JPEG") img->head.format = IMG_FMT_JPEG; diff --git a/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.h b/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.h index 7109bad..1969117 100644 --- a/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.h +++ b/device/gxx-linux/usb/src/async_model/img_process/algs/img_algorithm.h @@ -43,6 +43,8 @@ class gb_json; class img_one_paper : public refer { std::vector imgs_; + float ratio_h_; // CIS factor + float ratio_v_; // CIS factor void clear(void); @@ -53,10 +55,12 @@ protected: ~img_one_paper(); public: - int init_from(void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side = PAPER_SIDE_LEFT, clr_channel cc = COLOR_CHANNEL_RGB, img_status status = IMG_STATUS_OK, bool img_new = true, bool img_over = true); - int init_from(void* data, size_t w, size_t h, LPPACKIMAGE pimg); + int init_from(void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side = PAPER_SIDE_LEFT, clr_channel cc = COLOR_CHANNEL_RGB, img_status status = IMG_STATUS_OK, bool img_new = true, bool img_over = true, float ratio_h = 1.0f, float ratio_v = 1.0f); + int init_from(void* data, size_t w, size_t h, LPPACKIMAGE pimg, float ratio_h = 1.0f, float ratio_v = 1.0f); std::vector& images_queue(void); + float get_cis_ratio_h(void); + float get_cis_ratio_v(void); }; enum img_alg_type @@ -187,6 +191,7 @@ class img_encoder : public sane_cfg_provider { std::string fmt_; gb_json* cfg_; + int jpeg_quality_; public: img_encoder(); diff --git a/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.cpp b/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.cpp index 0dfb0b6..03fd19f 100644 --- a/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.cpp +++ b/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.cpp @@ -7,7 +7,7 @@ // configuration text // -static std::string g_cis_cfg("{\"montage\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u56fe\\u50cf\\u62fc\\u63a5\",\"desc\":\"\\u5c06CIS\\u91c7\\u96c6\\u7684\\u539f\\u59cb\\u6570\\u636e\\u6062\\u590d\\u4e3a\\u6b63\\u5e38\\u7684\\u56fe\\u50cf\",\"ver\":1,\"pos\":10,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"fb-split\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u62c6\\u5206\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u5c06\\u6b63\\u53cd\\u9762\\u5408\\u6210\\u7684\\u4e00\\u5f20\\u56fe\\u7247\\u62c6\\u5206\\u6210\\u6b63\\u9762\\u548c\\u53cd\\u9762\\u56fe\\u7247\",\"ver\":1,\"pos\":20,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true}}"); +static std::string g_cis_cfg("{\"montage\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u56fe\\u50cf\\u62fc\\u63a5\",\"desc\":\"\\u5c06CIS\\u91c7\\u96c6\\u7684\\u539f\\u59cb\\u6570\\u636e\\u6062\\u590d\\u4e3a\\u6b63\\u5e38\\u7684\\u56fe\\u50cf\",\"ver\":1,\"pos\":10,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"fb-split\":{\"cat\":\"CIS\",\"group\":\"CIS\",\"title\":\"\\u62c6\\u5206\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u5c06\\u6b63\\u53cd\\u9762\\u5408\\u6210\\u7684\\u4e00\\u5f20\\u56fe\\u7247\\u62c6\\u5206\\u6210\\u6b63\\u9762\\u548c\\u53cd\\u9762\\u56fe\\u7247\",\"ver\":1,\"pos\":20,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"page\":{\"cat\":\"CIS\",\"group\":\"base\",\"title\":\"\\u9875\\u9762\",\"desc\":\"\\u83b7\\u53d6\\u7eb8\\u5f20\\u6307\\u5b9a\\u9762\\u7684\\u56fe\\u7247\",\"ver\":1,\"pos\":30,\"type\":\"string\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":30,\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"range\":[\"\\u6b63\\u9762\",\"\\u80cc\\u9762\",\"\\u53cc\\u9762\"],\"depend_or\":[\"fb-split==true\"]}}"); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ img_one_paper* cis_montager(img_one_paper* in) for(auto& v: in->images_queue()) { // 0x00090002 GetMergeMat(int dstwidth ,int dstheight,int type,cv::Mat& mat,unsigned int fpgaversion) - v.img = GetMergeMat(v.head.width * v.head.channels, v.head.height, v.head.channels == 1 ? CV_8UC1 : CV_8UC3, v.img, 0x00090001); + v.img = GetMergeMat(v.head.width, v.head.height, v.head.channels == 1 ? CV_8UC1 : CV_8UC3, v.img, 0x00090001); v.head.width = v.img.cols; v.head.height = v.img.rows; } @@ -34,14 +34,49 @@ img_one_paper* cis_spliter(img_one_paper* in) for(auto& v: in->images_queue()) { - if(v.head.pos.paper_side == PAPER_SIDE_LEFT) + if(v.head.pos.paper_side == PAPER_SIDE_LEFT || + v.head.pos.paper_side == PAPER_SIDE_RIGHT) { int actwidth = v.img.cols / 2; int actheight = v.img.rows; + int off[] = {0, 1}; + + if(v.head.pos.paper_side == PAPER_SIDE_RIGHT) + { + off[0] = 1; + off[1] = 0; + } for (int i = 0; i < 2; i++) { PROCIMG ii; - ii.img = v.img(cv::Rect(i * actwidth, 0, actwidth, actheight)); + ii.img = v.img(cv::Rect(off[i] * actwidth, 0, actwidth, actheight)); + if (!ii.img.empty()) + { + memcpy(&ii.head, &v.head, sizeof(ii.head)); + ii.head.width = v.img.cols; + ii.head.height = v.img.rows; + ii.head.pos.paper_side = i == 0 ? PAPER_SIDE_FRONT : PAPER_SIDE_BACK; + + result.push_back(ii); + } + } + } + else if(v.head.pos.paper_side == PAPER_SIDE_TOP || + v.head.pos.paper_side == PAPER_SIDE_BOTTOM) + { + int actwidth = v.img.cols; + int actheight = v.img.rows / 2; + int off[] = {0, 1}; + + if(v.head.pos.paper_side == PAPER_SIDE_RIGHT) + { + off[0] = 1; + off[1] = 0; + } + for (int i = 0; i < 2; i++) + { + PROCIMG ii; + ii.img = v.img(cv::Rect(0, off[i] * actheight, actwidth, actheight)); if (!ii.img.empty()) { memcpy(&ii.head, &v.head, sizeof(ii.head)); @@ -67,7 +102,7 @@ img_one_paper* cis_spliter(img_one_paper* in) cis_pre_do::cis_pre_do(std::function montage , std::function< img_one_paper* (img_one_paper*)> split) : montage_(montage), split_(split) - , cfg_(g_cis_cfg), is_montage_(true), is_split_(true) + , cfg_(g_cis_cfg), is_montage_(true), is_split_(true), page_(PAGE_DUPLEX), cis_dpi_(200) { if (!montage_) montage_ = cis_montager; @@ -114,9 +149,41 @@ void cis_pre_do::init_value(void) is_split_ = true; child->release(); } + if (jsn->get_value("page", child) && child) + { + std::string val(""); + if (child->get_value("cur", val)) + { + if(val == "\xE6\xAD\xA3\xE9\x9D\xA2") + page_ = PAGE_FRONT; + else if(val == "\xE8\x83\x8c\xE9\x9D\xA2") + page_ = PAGE_BACK; + else + page_ = PAGE_DUPLEX; + } + printf("current page: %d(%s)\n", page_, val.c_str()); + child->release(); + } jsn->release(); } } +void cis_pre_do::resize(cv::Mat& img, float ratio_h, float ratio_v) +{ + if(cis_dpi_ == 200) + { + cv::resize(img, img, cv::Size(0, 0), 200.0 / 300.0 * ratio_h, ratio_v); + } + else if(cis_dpi_ == 300) + { + if(!IS_FLOAT_EQUAL(ratio_h, 1.0f) || + !IS_FLOAT_EQUAL(ratio_v, 1.0f)) + cv::resize(img, img, cv::Size(0, 0), ratio_h, ratio_v); + } + else + { + cv::resize(img, img, cv::Size(0, 0), ratio_h, 1.432323f * ratio_v); + } +} int32_t cis_pre_do::get_config(void* buf, size_t* len, const char* cfg_name, std::string* strval) { @@ -161,10 +228,21 @@ int32_t cis_pre_do::set_config(const char* cfg_name, void* data, size_t* len, ui bool cis_pre_do::update_enabled(const char* name, std::function get_opt) { gb_json* root = new gb_json(); + std::string val(""); + + if(get_opt("cis-dpi", "cur", val, nullptr) == 0) + cis_dpi_ = *(int*)val.c_str(); + printf("cis-dpi = %d\n", cis_dpi_); if(root->attach_text(&cfg_[0])) { - sane_cfg_provider::update_option_enable_status(root, get_opt); + gb_json* child = root->first_child(); + while(child) + { + sane_cfg_provider::update_option_enable_status(child, get_opt); + child->release(); + child = root->next_child(); + } cfg_ = std::move(root->to_string()); } @@ -197,17 +275,36 @@ img_one_paper* cis_pre_do::execute(img_one_paper* img) if(is_montage_) { - printf("montage ...\n"); img_one_paper* mont = montage_(img); img->release(); img = mont; } + + for(auto& v: img->images_queue()) + { + resize(v.img, img->get_cis_ratio_h(), img->get_cis_ratio_v()); + v.head.width = v.img.cols; + v.head.height = v.img.rows; + } + if(is_split_) { - printf("split ...\n"); img_one_paper* sp = split_(img); img->release(); img = sp; + + if(page_ == PAGE_FRONT || page_ == PAGE_BACK) + { + int side = page_ == PAGE_FRONT ? PAPER_SIDE_FRONT : PAPER_SIDE_BACK; + for(int i = 0; i < img->images_queue().size(); ++i) + { + if(img->images_queue()[i].head.pos.paper_side != side) + { + img->images_queue().erase(img->images_queue().begin() + i); + i--; + } + } + } } return img; diff --git a/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.h b/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.h index 6796a36..6d28b68 100644 --- a/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.h +++ b/device/gxx-linux/usb/src/async_model/img_process/cis_preproc.h @@ -29,7 +29,7 @@ class gb_json; // "default": true // }, // "fb-split": { -// "cat": "cis", +// "cat": "CIS", // "group": "CIS", // "title": "拆分正反面", // "desc": "将正反面合成的一张图片拆分成正面和反面图片", @@ -37,13 +37,32 @@ class gb_json; // "pos": 20, // "type": "bool", // "unit": "none", -// "affect": 0, +// "affect": 2, // "readonly": false, // "visible": false, // "enabled": true, // "size": 4, // "cur": true, // "default": true +// }, +// "page": { +// "cat": "CIS", +// "group": "base", +// "title": "页面", +// "desc": "获取纸张指定面的图片", +// "ver": 1, +// "pos": 30, +// "type": "string", +// "unit": "none", +// "affect": 2, +// "readonly": false, +// "visible": true, +// "enabled": true, +// "size": 30, +// "cur": "双面", +// "default": "双面", +// "range": ["正面", "背面", "双面"], +// "depend_or": ["fb-split==true"] // } // } @@ -52,12 +71,21 @@ class cis_pre_do : public sane_cfg_provider std::string cfg_; bool is_montage_; bool is_split_; + enum + { + PAGE_FRONT = 0, + PAGE_BACK, + PAGE_DUPLEX, + }; + int page_; + int cis_dpi_; std::function montage_; std::function split_; gb_json* from_json_text(char* jsn_text = nullptr); void init_value(void); + void resize(cv::Mat& img, float ratio_h = 1.0f, float ratio_v = 1.0f); public: cis_pre_do(std::function montage = std::function() diff --git a/device/gxx-linux/usb/src/async_model/io/usb_io.cpp b/device/gxx-linux/usb/src/async_model/io/usb_io.cpp index 6c12d28..6702a95 100644 --- a/device/gxx-linux/usb/src/async_model/io/usb_io.cpp +++ b/device/gxx-linux/usb/src/async_model/io/usb_io.cpp @@ -45,9 +45,10 @@ usb_gadget* usb_gadget_config::get_config(void) static void print_mem_usage(const char* tips) { - uint64_t size = sys_util::get_memory_usage("scan"); + // uint64_t size = sys_util::get_memory_usage("scan"); - printf("\n--Memory usage of %s: %s--\n", tips, sys_util::format_readable_bytes(size).c_str()); + // printf("\n--Memory usage of %s: %s--\n", tips, sys_util::format_readable_bytes(size).c_str()); + log_cls::log_memory_usage(tips, true); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // async_usb_gadget diff --git a/device/gxx-linux/usb/src/async_model/scanner/async_scanner.cpp b/device/gxx-linux/usb/src/async_model/scanner/async_scanner.cpp index 2446c0b..88c5b6e 100644 --- a/device/gxx-linux/usb/src/async_model/scanner/async_scanner.cpp +++ b/device/gxx-linux/usb/src/async_model/scanner/async_scanner.cpp @@ -25,12 +25,12 @@ extern int32_t (*scan_start)(void); extern int32_t (*scan_stop)(void); extern int32_t (*set_dpi)(int*, int*); extern int32_t (*set_scan_num)(int); -extern int32_t (*set_image_receiver)(void(*rcv)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, void* param), void* param); +extern int32_t (*set_image_receiver)(void(*rcv)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v, void* param), void* param); static bool reg_img_cb = true; -static void push_image(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, void* param) +static void push_image(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v, void* param) { - ((async_scanner*)param)->push_image(data_type, data, w, h, dpi_x, dpi_y, paper_ind, side, clr, status, img_new, img_over); + ((async_scanner*)param)->push_image(data_type, data, w, h, dpi_x, dpi_y, paper_ind, side, clr, status, img_new, img_over, ratio_h, ratio_v); } #endif @@ -121,7 +121,7 @@ async_scanner::~async_scanner() cfg_mgr_->release(); } -void async_scanner::push_image(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over) +void async_scanner::push_image(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v) { if(data_type == IMG_CB_STOPPED) { @@ -235,9 +235,9 @@ void async_scanner::init(void) cfg_mgr_->reg_sane_provider(dynamic_cast(r)); r->release(); - auto on_image_captured = [&](int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over) -> void + auto on_image_captured = [&](int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v) -> void { - push_image(data_type, data, w, h, dpi_x, dpi_y, paper_ind, side, clr, status, img_new, img_over); + push_image(data_type, data, w, h, dpi_x, dpi_y, paper_ind, side, clr, status, img_new, img_over, ratio_h, ratio_v); }; capture_ = new image_capture(on_image_captured); cfg_mgr_->reg_sane_provider(dynamic_cast(capture_)); diff --git a/device/gxx-linux/usb/src/async_model/scanner/async_scanner.h b/device/gxx-linux/usb/src/async_model/scanner/async_scanner.h index 303610f..3799d76 100644 --- a/device/gxx-linux/usb/src/async_model/scanner/async_scanner.h +++ b/device/gxx-linux/usb/src/async_model/scanner/async_scanner.h @@ -58,7 +58,7 @@ public: // virtual int32_t set_config(const char* cfg_name, void* data, size_t* len, uint32_t* afterdo) override; // virtual void update_enabled(std::function get_opt) override; // virtual int32_t get_value(const char* name, const char* key, std::string& val) override; - void push_image(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over); + void push_image(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v); public: uint32_t stop(void); diff --git a/device/gxx-linux/usb/src/usbdevice.cpp b/device/gxx-linux/usb/src/usbdevice.cpp index 0546eef..0f758fb 100644 --- a/device/gxx-linux/usb/src/usbdevice.cpp +++ b/device/gxx-linux/usb/src/usbdevice.cpp @@ -25,9 +25,17 @@ int32_t (*set_scan_num)(int) = nullptr; int32_t (*set_paper_type)(int) = nullptr; int32_t (*set_pixel_type)(int*) = nullptr; int32_t (*set_capturer_param)(int, int, int) = nullptr; -int32_t (*set_image_receiver)(void(*rcv)(int data_type, void* data, size_t w, size_t h, int, int, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, void* param), void* param) = nullptr; +int32_t (*set_image_receiver)(void(*rcv)(int data_type, void* data, size_t w, size_t h, int, int, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v, void* param), void* param) = nullptr; #endif +#else +#define LOG_LEVEL_ALL 0 +namespace log_cls +{ + template + void log(int level, const char* fmt, Args ... args) + {} +} #endif #define CONFIG_VALUE 1 @@ -106,7 +114,7 @@ int32_t call_set_capturer_param(int type, int ind, int val) { return inst->set_capturer_parameter(type, ind, val); } -int32_t call_set_image_receiver(void(*rcv)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, void* param), void* param) +int32_t call_set_image_receiver(void(*rcv)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v, void* param), void* param) { return inst->set_img_receiver((void*)rcv, param); } @@ -222,7 +230,9 @@ void UsbDevice::fill_if_descriptor(camtp_ctx * ctx, usb_gadget * usbctx, struct desc->iInterface = STRINGID_INTERFACE; } +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "fill_if_descriptor:\n"); +#endif PRINT_DEBUG_BUF(desc, sizeof(struct usb_interface_descriptor)); return; @@ -271,8 +281,9 @@ void UsbDevice::fill_ep_descriptor(camtp_ctx * ctx, usb_gadget * usbctx,struct u } } #endif - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "fill_ep_descriptor:\n"); +#endif PRINT_DEBUG_BUF(desc, sizeof(struct usb_endpoint_descriptor_no_audio)); return; @@ -331,7 +342,9 @@ void UsbDevice::fill_config_descriptor(camtp_ctx * ctx , usb_gadget * usbctx,str desc->bmAttributes = USB_CONFIG_ATT_ONE; desc->bMaxPower = 1; +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "fill_config_descriptor: (Total Len : %u + %d = %d)\n", (unsigned int) sizeof(struct usb_config_descriptor), total_size, desc->wTotalLength); +#endif PRINT_DEBUG_BUF(desc, sizeof(struct usb_config_descriptor)); return; @@ -355,7 +368,9 @@ void UsbDevice::fill_dev_descriptor(camtp_ctx * ctx, usb_gadget * usbctx,struct desc->iSerialNumber = STRINGID_SERIAL; desc->bNumConfigurations = 1; // Only one configuration +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "fill_dev_descriptor:\n"); +#endif PRINT_DEBUG_BUF(desc, sizeof(struct usb_device_descriptor)); return; @@ -540,7 +555,9 @@ usb_gadget* UsbDevice::init_usb_camtp_gadget(camtp_ctx * ctx) usbctx->ep_path[2] = ctx->usb_cfg.usb_endpoint_intin; usbctx->usb_device = open(ctx->usb_cfg.usb_device_path, O_RDWR|O_SYNC); +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "USB device: open(%s) = %d (%d)\n", ctx->usb_cfg.usb_device_path, usbctx->usb_device, usbctx->usb_device == -1 ? errno : 0); +#endif // std::this_thread::sleep_for(std::chrono::milliseconds(15000)); // printf("USB device: go on ^_^\n"); @@ -608,8 +625,9 @@ usb_gadget* UsbDevice::init_usb_camtp_gadget(camtp_ctx * ctx) fill_ep_descriptor(ctx, usbctx, &usbctx->usb_ffs_config->ep_desc_ss.ep_desc_out,2, EP_BULK_MODE | EP_OUT_DIR | EP_SS_MODE); fill_ep_descriptor(ctx, usbctx, &usbctx->usb_ffs_config->ep_desc_ss.ep_desc_int_in,3, EP_INT_MODE | EP_IN_DIR | EP_SS_MODE); #endif - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "init_usb_camtp_gadget :\n"); +#endif PRINT_DEBUG_BUF(usbctx->usb_ffs_config, sizeof(usb_ffs_cfg)); ret = write(usbctx->usb_device, usbctx->usb_ffs_config, sizeof(usb_ffs_cfg)); @@ -627,8 +645,9 @@ usb_gadget* UsbDevice::init_usb_camtp_gadget(camtp_ctx * ctx) ffs_str.header.lang_count = htole32(1); ffs_str.code = htole16(0x0409); // en-us strcpy(ffs_str.string_data,ctx->usb_cfg.usb_string_interface); - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "write string :\n"); +#endif PRINT_DEBUG_BUF(&ffs_str, sizeof(ffs_strings)); ret = write(usbctx->usb_device, &ffs_str, ffs_str.header.length); @@ -674,8 +693,9 @@ usb_gadget* UsbDevice::init_usb_camtp_gadget(camtp_ctx * ctx) #endif fill_dev_descriptor(ctx, usbctx,&usbctx->usb_config->dev_desc); - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "init_usb_camtp_gadget :\n"); +#endif PRINT_DEBUG_BUF(usbctx->usb_config, sizeof(usb_cfg)); ret = write(usbctx->usb_device, usbctx->usb_config, sizeof(usb_cfg)); @@ -686,8 +706,9 @@ usb_gadget* UsbDevice::init_usb_camtp_gadget(camtp_ctx * ctx) goto init_error; } } - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "init_usb_camtp_gadget : USB config done\n"); +#endif printf("init usb ok!\n"); return usbctx; @@ -704,9 +725,9 @@ init_error: void UsbDevice::deinit_usb_camtp_gadget(usb_gadget * usbctx) { int i; - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "entering deinit_usb_camtp_gadget\n"); - +#endif if( usbctx ) { usbctx->stop = 1; @@ -717,7 +738,9 @@ void UsbDevice::deinit_usb_camtp_gadget(usb_gadget * usbctx) if( usbctx->ep_handles[i] >= 0 ) { +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "Closing End Point %d...\n",i); +#endif close(usbctx->ep_handles[i] ); } i++; @@ -725,7 +748,9 @@ void UsbDevice::deinit_usb_camtp_gadget(usb_gadget * usbctx) if (usbctx->usb_device >= 0) { +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "Closing usb device...\n"); +#endif printf("close USB device(%d)\n", usbctx->usb_device); close(usbctx->usb_device); usbctx->usb_device = - 1; @@ -733,7 +758,9 @@ void UsbDevice::deinit_usb_camtp_gadget(usb_gadget * usbctx) if( !usbctx->thread_not_started ) { +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "Stopping USB Thread...\n"); +#endif pthread_cancel (usbctx->thread); pthread_join(usbctx->thread, NULL); usbctx->thread_not_started = 1; @@ -769,8 +796,9 @@ void UsbDevice::deinit_usb_camtp_gadget(usb_gadget * usbctx) free( usbctx ); } - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "leaving deinit_usb_camtp_gadget\n"); +#endif } void UsbDevice::usb_main() @@ -793,12 +821,16 @@ void UsbDevice::usb_main() printf("function mode: %d\n", camtp_context->usb_cfg.usb_functionfs_mode); if (camtp_context->usb_cfg.usb_functionfs_mode) { +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "CAMTP Responder : FunctionFS Mode - entering handle_ffs_ep0\n"); +#endif handle_ffs_ep0(usb_ctx); } else { +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "CAMTP Responder : GadgetFS Mode - entering handle_ep0\n"); +#endif handle_ep0(usb_ctx); } deinit_usb_camtp_gadget(usb_ctx); @@ -824,8 +856,9 @@ int UsbDevice::handle_ffs_ep0(usb_gadget * ctx) fd_set read_set; struct usb_functionfs_event event; int status; - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "handle_ffs_ep0 : Entering...\n"); +#endif timeout.tv_sec = 40; timeout.tv_usec = 0; @@ -842,7 +875,9 @@ int UsbDevice::handle_ffs_ep0(usb_gadget * ctx) } else { +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "Select without timeout\n"); +#endif ret = select(ctx->usb_device+1, &read_set, NULL, NULL, NULL); } @@ -862,16 +897,18 @@ int UsbDevice::handle_ffs_ep0(usb_gadget * ctx) } nevents = ret / sizeof(event); - +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "%d event(s)\n", nevents); - +#endif printf("event type = %d\n", event.type); for (i=0; istop = 1; end: +#ifdef ASYNC_EP log_cls::log(LOG_LEVEL_ALL, "handle_ffs_ep0 : Leaving... (ctx->stop=%d)\n",ctx->stop); +#endif return 1; } diff --git a/device/gxx-linux/usb/usbimageprocqueue.h b/device/gxx-linux/usb/usbimageprocqueue.h index de22c50..50c4157 100644 --- a/device/gxx-linux/usb/usbimageprocqueue.h +++ b/device/gxx-linux/usb/usbimageprocqueue.h @@ -18,6 +18,8 @@ class UsbImageProcQueue int scan_status_; int dpi_x_; int dpi_y_; + float ratio_h_; + float ratio_v_; int sensor_status_2_scanner_status(int ss) { @@ -52,7 +54,7 @@ class UsbImageProcQueue } public: - UsbImageProcQueue(NotifyPtr notify) : img_keeper_(nullptr), kp_param_(nullptr), scan_status_(0), dpi_x_(200), dpi_y_(200) + UsbImageProcQueue(NotifyPtr notify) : img_keeper_(nullptr), kp_param_(nullptr), scan_status_(0), dpi_x_(200), dpi_y_(200), ratio_h_(1.0f), ratio_v_(1.0f) { this->notify = notify; } @@ -61,20 +63,20 @@ public: { if(!containsimg) { - void (*push_image)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, void* param) = nullptr; + void (*push_image)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v, void* param) = nullptr; HGIntInfo* info = (HGIntInfo*)image->data(); *(uint64_t*)&push_image = (uint64_t)img_keeper_; if(info->From == HGType::STOPSCAN) { if(push_image) - push_image(IMG_CB_STOPPED, nullptr, sensor_status_2_scanner_status(info->Code), 0, dpi_x_, dpi_y_, 0, PAPER_SIDE_LEFT, (clr_channel)0, (img_status)0, true, true, kp_param_); + push_image(IMG_CB_STOPPED, nullptr, sensor_status_2_scanner_status(info->Code), 0, dpi_x_, dpi_y_, 0, PAPER_SIDE_LEFT, (clr_channel)0, (img_status)0, true, true, ratio_h_, ratio_v_, kp_param_); } else { scan_status_ = sensor_status_2_scanner_status(info->Code); if(push_image) - push_image(IMG_CB_STATUS, nullptr, sensor_status_2_scanner_status(info->Code), 0, dpi_x_, dpi_y_, 0, PAPER_SIDE_LEFT, (clr_channel)0, (img_status)0, true, true, kp_param_); + push_image(IMG_CB_STATUS, nullptr, sensor_status_2_scanner_status(info->Code), 0, dpi_x_, dpi_y_, 0, PAPER_SIDE_LEFT, (clr_channel)0, (img_status)0, true, true, ratio_h_, ratio_v_, kp_param_); } } return; @@ -107,12 +109,12 @@ public: if(scannnum == 1) scan_status_ = 0; - void (*push_image)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, void* param) = nullptr; + void (*push_image)(int data_type, void* data, size_t w, size_t h, int dpi_x, int dpi_y, size_t paper_ind, paper_side side, clr_channel clr, img_status status, bool img_new, bool img_over, float ratio_h, float ratio_v, void* param) = nullptr; *(uint64_t*)&push_image = (uint64_t)img_keeper_; if(push_image) { - push_image(IMG_CB_IMAGE, data, width, height, dpi_x_, dpi_y_, scannnum, PAPER_SIDE_LEFT, (clr_channel)type, (img_status)status, true, true, kp_param_); + push_image(IMG_CB_IMAGE, data, width, height, dpi_x_, dpi_y_, scannnum, PAPER_SIDE_LEFT, (clr_channel)type, (img_status)status, true, true, ratio_h_, ratio_v_, kp_param_); return true; } @@ -178,6 +180,11 @@ public: //return (images.Size()>0) ? 0 : images.Front()->size(); } + void set_ratio(float h, float v) + { + ratio_h_ = h; + ratio_v_ = v; + } void clear() {