diff --git a/hgdriver/hgdev/CMakeLists.txt.user b/hgdriver/hgdev/CMakeLists.txt.user deleted file mode 100644 index 9be6794..0000000 --- a/hgdriver/hgdev/CMakeLists.txt.user +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - EnvironmentId - {7ffe135c-9a6a-47fd-aa17-30ca7cc38f36} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - true - - - - ProjectExplorer.Project.Target.0 - - 桌面 - 桌面 - {dd7642b7-8b16-4d2a-a3db-a41203cb41bc} - 0 - 0 - 0 - - - CMAKE_BUILD_TYPE:STRING=Debug - - /home/huagao/Desktop/3.22code/sane-driver-rewrite/sane-driver-rewrite/hgdriver/build-hgdev-unknown-Debug - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=Release - - /home/huagao/Desktop/3.22code/sane-driver-rewrite/sane-driver-rewrite/hgdriver/build-hgdev-unknown-Release - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - Release - CMakeProjectManager.CMakeBuildConfiguration - - 2 - - - 0 - 部署 - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy Configuration - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - - Custom Executable - - ProjectExplorer.CustomExecutableRunConfiguration - - 3768 - false - true - false - false - true - - - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 20 - - - Version - 20 - - diff --git a/hgdriver/hgdev/IConfig.h b/hgdriver/hgdev/IConfig.h deleted file mode 100644 index c5ded40..0000000 --- a/hgdriver/hgdev/IConfig.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef ICONFIG_H -#define ICONFIG_H - // !ICONFIG_H -#include "predefine.h" -#include -#include "PaperSize.h" - -#ifndef unix - //typedef char byte; -#endif - -enum G400_PaperSize { - G400_A3 = 0, - G400_A4, - G400_A4R, - G400_A5, - G400_A5R, - G400_A6, - G400_A6R, - G400_B4, - G400_B5, - G400_B5R, - G400_B6, - G400_B6R, - G400_DOUBLELETTER, - G400_LEGAL, - G400_LETTER, - G400_LETTERR, - G400_LONGLETTER, - G400_MAXSIZE -}; - -enum G400_DPI { - G400_D300 = 0, - G400_D200, - G400_D600 -}; - -static std::map SupPixelTypes = { - {0, 0},//bw - {1, 0},//gray - {2, 1}//color -}; - -static std::map SupResolutions = { - {300.0f, 0}, - {200.0f, 1}, - {600.0f, 2} -}; - - -static std::map secrewMaps = { - {1,0}, - {2,1}, - {3,2}, - {4,3}, - {5,4} -}; -typedef union Config_Param { - unsigned int value; - struct { - unsigned int paper : 5; - unsigned int color : 1; - unsigned int dpi : 2; - unsigned int double_feed_enbale : 1; - unsigned int stable_enbale : 1; - unsigned int screw_detect_enable : 1; - unsigned int screw_detect_level : 3; - unsigned int unused_one : 6; - unsigned int pc_correct : 1; - unsigned int unused_two : 11; - }; -} ConfigParam; - -static std::map SupPaperTyps_G100 -{ - {{TwSS::A3,PaperAlign::Rot0},0}, - {{TwSS::A4,PaperAlign::Rot0},1}, - {{TwSS::A4,PaperAlign::Rot270},2}, - {{TwSS::A5,PaperAlign::Rot0 },2}, - {{TwSS::A5,PaperAlign::Rot270},2}, - {{TwSS::A6,PaperAlign::Rot0},2}, - {{TwSS::A6,PaperAlign::Rot270},2}, - {{TwSS::B4,PaperAlign::Rot0},0}, - {{TwSS::B5,PaperAlign::Rot0},0}, - {{TwSS::B5,PaperAlign::Rot270},1}, - {{TwSS::B6,PaperAlign::Rot0},2}, - {{TwSS::B6,PaperAlign::Rot270},2}, - {{TwSS::USLetter,PaperAlign::Rot0},1}, - {{TwSS::USLetter,PaperAlign::Rot270},2}, - {{TwSS::USLedger,PaperAlign::Rot0},0}, - {{TwSS::USLegal,PaperAlign::Rot0},0}, - {{TwSS::None,PaperAlign::Rot0},0}, - {{TwSS::USStatement,PaperAlign::Rot0},16}, - {{TwSS::MaxSize,PaperAlign::Rot0},16} -}; - -static std::map SupPaperTyps_G300 -{ - {{TwSS::A4,PaperAlign::Rot270},G400_A4R}, - {{TwSS::A5,PaperAlign::Rot0 },G400_A5}, - {{TwSS::A5,PaperAlign::Rot270},G400_A5R}, - {{TwSS::A6,PaperAlign::Rot0},G400_A6}, - {{TwSS::A6,PaperAlign::Rot270},G400_A6R}, - {{TwSS::B5,PaperAlign::Rot0},G400_B5}, - {{TwSS::B5,PaperAlign::Rot270},G400_B5R}, - {{TwSS::B6,PaperAlign::Rot0},G400_B6}, - {{TwSS::B6,PaperAlign::Rot270},G400_B6R}, - {{TwSS::USLetter,PaperAlign::Rot0},G400_LETTER}, - {{TwSS::USLetter,PaperAlign::Rot270},G400_LETTERR}, - {{TwSS::USLegal,PaperAlign::Rot0},G400_LEGAL}, - {{TwSS::None,PaperAlign::Rot0},G400_A4}, -}; - -static std::map SupPaperTyps_G400 -{ - {{TwSS::A3,PaperAlign::Rot0},G400_A3}, - {{TwSS::A4,PaperAlign::Rot0},G400_A4}, - {{TwSS::A4,PaperAlign::Rot270},G400_A4R}, - {{TwSS::A5,PaperAlign::Rot0 },G400_A5}, - {{TwSS::A5,PaperAlign::Rot270},G400_A5R}, - {{TwSS::A6,PaperAlign::Rot0},G400_A6}, - {{TwSS::A6,PaperAlign::Rot270},G400_A6R}, - {{TwSS::B4,PaperAlign::Rot0},G400_B4}, - {{TwSS::B5,PaperAlign::Rot0},G400_B5}, - {{TwSS::B5,PaperAlign::Rot270},G400_B5R}, - {{TwSS::B6,PaperAlign::Rot0},G400_B6}, - {{TwSS::B6,PaperAlign::Rot270},G400_B6R}, - {{TwSS::USLetter,PaperAlign::Rot0},G400_LETTER}, - {{TwSS::USLetter,PaperAlign::Rot270},G400_LETTERR}, - {{TwSS::USLedger,PaperAlign::Rot0},G400_DOUBLELETTER}, - {{TwSS::USLegal,PaperAlign::Rot0},G400_LEGAL}, - {{TwSS::None,PaperAlign::Rot0},G400_A3}, - {{TwSS::MaxSize,PaperAlign::Rot0},G400_MAXSIZE}, - {{TwSS::USStatement,PaperAlign::Rot0},G400_MAXSIZE} -}; - - -// static std::map SupPaperTyps = { -// #ifdef G200SCANNER -// {{TwSS::A3,PaperAlign::Rot0},0}, -// {{TwSS::A4,PaperAlign::Rot0},1}, -// {{TwSS::A4,PaperAlign::Rot270},2}, -// {{TwSS::A5,PaperAlign::Rot0 },2}, -// {{TwSS::A5,PaperAlign::Rot270},2}, -// {{TwSS::A6,PaperAlign::Rot0},2}, -// {{TwSS::A6,PaperAlign::Rot270},2}, -// {{TwSS::B4,PaperAlign::Rot0},0}, -// {{TwSS::B5,PaperAlign::Rot0},0}, -// {{TwSS::B5,PaperAlign::Rot270},1}, -// {{TwSS::B6,PaperAlign::Rot0},2}, -// {{TwSS::B6,PaperAlign::Rot270},2}, -// {{TwSS::USLetter,PaperAlign::Rot0},1}, -// {{TwSS::USLetter,PaperAlign::Rot270},2}, -// {{TwSS::USLedger,PaperAlign::Rot0},0}, -// {{TwSS::USLegal,PaperAlign::Rot0},0}, -// {{TwSS::None,PaperAlign::Rot0},0}, -// {{TwSS::USStatement,PaperAlign::Rot0},16}, -// {{TwSS::MaxSize,PaperAlign::Rot0},16} -// #else -// {{TwSS::A3,PaperAlign::Rot0},G400_A3}, -// {{TwSS::A4,PaperAlign::Rot0},G400_A4}, -// {{TwSS::A4,PaperAlign::Rot270},G400_A4R}, -// {{TwSS::A5,PaperAlign::Rot0 },G400_A5}, -// {{TwSS::A5,PaperAlign::Rot270},G400_A5R}, -// {{TwSS::A6,PaperAlign::Rot0},G400_A6}, -// {{TwSS::A6,PaperAlign::Rot270},G400_A6R}, -// {{TwSS::B4,PaperAlign::Rot0},G400_B4}, -// {{TwSS::B5,PaperAlign::Rot0},G400_B5}, -// {{TwSS::B5,PaperAlign::Rot270},G400_B5R}, -// {{TwSS::B6,PaperAlign::Rot0},G400_B6}, -// {{TwSS::B6,PaperAlign::Rot270},G400_B6R}, -// {{TwSS::USLetter,PaperAlign::Rot0},G400_LETTER}, -// {{TwSS::USLetter,PaperAlign::Rot270},G400_LETTERR}, -// {{TwSS::USLedger,PaperAlign::Rot0},G400_DOUBLELETTER}, -// {{TwSS::USLegal,PaperAlign::Rot0},G400_LEGAL}, -// #ifdef G300SCANNER -// {{TwSS::None,PaperAlign::Rot0},G400_A4}, -// #else // G300 -// {{TwSS::None,PaperAlign::Rot0},G400_A3}, -// #endif -// {{TwSS::MaxSize,PaperAlign::Rot0},G400_MAXSIZE}, -// {{TwSS::USStatement,PaperAlign::Rot0},G400_MAXSIZE} -// #endif -// }; - -class IConfig -{ -public: - IConfig(void) {}; - virtual ~IConfig(void) {}; - virtual unsigned int GetData() { return m_param.value; } -protected: - ConfigParam m_param; -}; -#endif diff --git a/hgdriver/hgdev/ImageMultiOutput.cpp b/hgdriver/hgdev/ImageMultiOutput.cpp deleted file mode 100644 index bfc544b..0000000 --- a/hgdriver/hgdev/ImageMultiOutput.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "ImageMultiOutput.h" - - -ImageMultiOutput::ImageMultiOutput(void) -{ -} - - -ImageMultiOutput::~ImageMultiOutput(void) -{ -} - -//void ImageMultiOutput::apply(cv::Mat& pDib,int side) -//{ -// //throw std::logic_error("The method or operation is not implemented."); -//} - -cv::Mat ImageMultiOutput::GetMultiFilterMat(cv::Mat &src,int channel) -{ - return FilterColor(src,channel); -} - -cv::Mat ImageMultiOutput::FilterColor(cv::Mat image,short channel) -{ - cv::Mat dstImage(image.rows,image.cols,CV_8UC1); - - //int pixelSize = image.depth(); - int channels = image.channels(); - if(channel > channels -1){ - return dstImage; - } - if ( ( channel == 3 ) && ( channels != 4 ) && ( channels != 8 )) - { - return dstImage; - } - if ( channels <= 4 ) - { - int srcOffset = image.step - image.cols* channels ; - int dstOffset = dstImage.step - dstImage.cols; - unsigned char* src = image.data; - unsigned char* dst = dstImage.data; - src += channel; - - for ( int y = 0; y < image.rows; y++ ) - { - for ( int x = 0; x < image.cols; x++, src += channels , dst++ ) - { - unsigned short pix = *src; - if(pix >=130){ - pix = 255; - } - *dst = pix; - } - src += srcOffset; - dst += dstOffset; - } - } - return dstImage; -} diff --git a/hgdriver/hgdev/ImageMultiOutput.h b/hgdriver/hgdev/ImageMultiOutput.h deleted file mode 100644 index bed76d7..0000000 --- a/hgdriver/hgdev/ImageMultiOutput.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef IMAGE_MULTI_OUTPUT -#define IMAGE_MULTI_OUTPUT - -#include "../ImageProcess/ImageApply.h" - -class ImageMultiOutput -{ -public: - ImageMultiOutput(void); - ~ImageMultiOutput(void); - - cv::Mat GetMultiFilterMat(cv::Mat &src,int channel); -private: - cv::Mat FilterColor(cv::Mat image,short channel); - -}; - -#endif diff --git a/hgdriver/hgdev/PaperSize.cpp b/hgdriver/hgdev/PaperSize.cpp deleted file mode 100644 index 7708f5b..0000000 --- a/hgdriver/hgdev/PaperSize.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "PaperSize.h" - -using namespace std; - -namespace Device { - - PaperSize::PaperSize(int pid):pid_(pid) - { - InitPaperMap(); - } - - void PaperSize::InitPaperMap() - { - papersize.insert({ A3,SIZE{297,420} }); - papersize.insert({ A4,SIZE{210,297} }); - papersize.insert({ A5,SIZE{148,210} }); - papersize.insert({ A6,SIZE{105,148} }); - papersize.insert({ B4,SIZE{250,353} }); - papersize.insert({ B5,SIZE{176,250} }); - papersize.insert({ B6,SIZE{125,176} }); - if(pid_ == 0x400 || pid_ == 0x402) - papersize.insert({ MaxSize,SIZE{297,(long)(420 * 1.5)} }); - else if(pid_ == 0x300) - papersize.insert({ MaxSize,SIZE{210,297 * 2} }); - else - papersize.insert({ MaxSize,SIZE{297,420 * 2} }); - - if(pid_ == 0x300) - papersize.insert({ USStatement,SIZE{210,(long)(297 * 1.5)} }); - else - papersize.insert({ USStatement,SIZE{297,(long)(420 * 1.5)} }); - - papersize.insert({ USLetter,SIZE{216,279} }); - papersize.insert({ USLegal,SIZE{216,356} }); - papersize.insert({ USLedger,SIZE{297,432} }); - papersize.insert({ None,SIZE{297,420} }); - papersize.insert({ K8,SIZE{270,390} }); - papersize.insert({ K16,SIZE{190,270} }); - papersize.insert({ Trigeminy,SIZE{270,560} }); - } - - SIZE PaperSize::GetPaperSize(DWORD paperType, float dpi,int orentation) - { - - if (papersize.find((TwSS)paperType) != papersize.end() && (dpi > 99 && dpi < 601)) - { - SIZE resize{2338,3307}; - long cx = papersize[(TwSS)paperType].cx * dpi / 25.4; - long cy = papersize[(TwSS)paperType].cy * dpi / 25.4; - if (orentation == 0) - { - resize.cx = cx; - resize.cy = cy; - } - else - { - resize.cx = cy; - resize.cy = cx; - } - return resize; - } - return SIZE{2338, 3307}; - } -} \ No newline at end of file diff --git a/hgdriver/hgdev/PaperSize.h b/hgdriver/hgdev/PaperSize.h deleted file mode 100644 index fd0da0e..0000000 --- a/hgdriver/hgdev/PaperSize.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef PAPER_SIZE_H -#define PAPER_SIZE_H - -#include - -#if defined(WIN32) || defined(_WIN64) -#include -#endif -#include "common_setting.h" - -#ifdef __linux__ -typedef CSSIZE Size; -typedef CSSIZE SIZE; -#endif - -typedef struct Paper_Status { - unsigned int Paper; - unsigned int Orentate; - friend bool operator<(const struct Paper_Status& a, const struct Paper_Status& b) { - if (a.Paper < b.Paper || - (a.Paper == b.Paper && a.Orentate < b.Orentate)) { - return true; - } - return false; - } -}PaperStatus; - -namespace Device { - class PaperSize - { - public: - PaperSize(int pid); - private: - void InitPaperMap(); - std::map papersize; - std::map, SIZE> dpiDct; - std::map dpiDct_100; - std::map dpiDct_400; - std::map dpiDct_300; - - int pid_; - public: - SIZE GetPaperSize(DWORD paperType, float dpi, int orentation); - }; -} - -#endif diff --git a/hgdriver/hgdev/common_setting.cpp b/hgdriver/hgdev/common_setting.cpp deleted file mode 100644 index 3acea7f..0000000 --- a/hgdriver/hgdev/common_setting.cpp +++ /dev/null @@ -1,561 +0,0 @@ -#include "common_setting.h" -#include "sane/sane_option_definitions.h" -#include - -#define MAKE_ID_AND_STR(l936) l936 -static struct _fixed_option -{ - std::string str; - int enum_val; -} - -g_color_mode[] = - { - - {MAKE_ID_AND_STR(OPTION_VALUE_YSMS_HB), COLOR_MODE_BLACK_WHITE }, - {MAKE_ID_AND_STR(OPTION_VALUE_YSMS_256JHD), COLOR_MODE_256_GRAY}, - {MAKE_ID_AND_STR(OPTION_VALUE_YSMS_24WCS), COLOR_MODE_24_BITS}, - {MAKE_ID_AND_STR(OPTION_VALUE_YSMS_YSZDSB), COLOR_MODE_AUTO_MATCH} - }, -g_multi_out[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_DLSCLX_CS_HD_HB), MULTI_OUT_ALL}, - {MAKE_ID_AND_STR(OPTION_VALUE_DLSCLX_CS_HD), MULTI_COLOR_AND_GRAY}, - {MAKE_ID_AND_STR(OPTION_VALUE_DLSCLX_CS_HB), MULTI_COLOR_AND_BW}, - {MAKE_ID_AND_STR(OPTION_VALUE_DLSCLX_HD_HB), MULTI_GRAY_AND_BW} - }, -g_rid_color[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_BCS), RID_COLOR_NONE}, - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_CHS), RID_COLOR_RID_RED}, - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_CLS), RID_COLOR_RID_GREEN}, - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_CHULANSE), RID_COLOR_RID_BLUE}, - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_HSZQ), RID_COLOR_ENHANCE_RED}, - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_LSZQ), RID_COLOR_ENHANCE_GREEN}, - {MAKE_ID_AND_STR(OPTION_VALUE_HDHHBTX_CSYZQ_LANSEZENGQIANG), RID_COLOR_ENHANCE_BLUE} - }, - -g_paper[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A3), PAPER_A3}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A4), PAPER_A4}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A5), PAPER_A5}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A6), PAPER_A6}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_B4), PAPER_B4}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_B5), PAPER_B5}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_B6), PAPER_B6}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_8K), PAPER_8K}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_16K), PAPER_16K}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_Letter), PAPER_LETTER}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A4HX), PAPER_A4_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A5HX), PAPER_A5_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_A6HX), PAPER_A6_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_B5HX), PAPER_B5_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_B6HX), PAPER_B6_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_16KHX), PAPER_16K_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_LetterHX), PAPER_LETTER_LATERAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_DoubleLetter), PAPER_DOUBLE_LETTER}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_LEGAL), PAPER_LEGAL}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_PPYSCC), PAPER_AUTO_MATCH}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_ZDSMCC), PAPER_MAX_SIZE}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_ZDSMCCZDCQ), PAPER_MAX_SIZE_CLIP}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZZCC_SLSJ), PAPER_TRIGEMINY} - }, - -g_page[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_SMYM_DM), PAGE_SINGLE}, - {MAKE_ID_AND_STR(OPTION_VALUE_SMYM_SM), PAGE_DOUBLE}, - {MAKE_ID_AND_STR(OPTION_VALUE_SMYM_TGKBYTY), PAGE_OMIT_EMPTY}, - {MAKE_ID_AND_STR(OPTION_VALUE_SMYM_TGKBYFPZ), PAGE_OMIT_EMPTY_RECEIPT}, - {MAKE_ID_AND_STR(OPTION_VALUE_SMYM_DZ), PAGE_FOLIO} - }, - -g_sharpen[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_RHYMH_W), SHARPEN_NONE}, - {MAKE_ID_AND_STR(OPTION_VALUE_RHYMH_RH), SHARPEN_SHARPEN}, - {MAKE_ID_AND_STR(OPTION_VALUE_RHYMH_JYBRH), SHARPEN_SHARPEN_MORE}, - {MAKE_ID_AND_STR(OPTION_VALUE_RHYMH_MH), SHARPEN_HAZY}, - {MAKE_ID_AND_STR(OPTION_VALUE_RHYMH_JYBMH), SHARPEN_HAZY_MORE} - }, - -g_fill_bkg[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_BJTCFS_TDBX), FILL_BKG_CONVEX_POLYGON}, - {MAKE_ID_AND_STR(OPTION_VALUE_BJTCFS_ADBX), FILL_BKG_CONCAVE_POLYGON} - }, - -g_scan_mode[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_SMZS_LXSM), SCAN_MODE_CONTINUOUS}, - {MAKE_ID_AND_STR(OPTION_VALUE_SMZS_SMZDZS), SCAN_MODE_GIVEN_COUNT} - }, - -g_text_direction[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_WGFX_0), TEXT_DIRECTION_0}, - {MAKE_ID_AND_STR(OPTION_VALUE_WGFX_90), TEXT_DIRECTION_90}, - {MAKE_ID_AND_STR(OPTION_VALUE_WGFX_180), TEXT_DIRECTION_180}, - {MAKE_ID_AND_STR(OPTION_VALUE_WGFX__90), TEXT_DIRECTION_270}, - {MAKE_ID_AND_STR(OPTION_VALUE_WGFX_ZDWBFXSB), TEXT_DIRECTION_AUTO} - }, - -g_permeate_lv[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_FZSTDJ_JR), PERMAEATE_WEAKER}, - {MAKE_ID_AND_STR(OPTION_VALUE_FZSTDJ_R), PERMAEATE_WEAK}, - {MAKE_ID_AND_STR(OPTION_VALUE_FZSTDJ_YB), PERMAEATE_ORDINARY}, - {MAKE_ID_AND_STR(OPTION_VALUE_FZSTDJ_Q), PERMAEATE_STRONG}, - {MAKE_ID_AND_STR(OPTION_VALUE_FZSTDJ_JQ), PERMAEATE_STRONGER} - }, -g_img_quality[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_HZ_W), IMG_NONE}, - {MAKE_ID_AND_STR(OPTION_VALUE_HZ_SDYX), IMG_SPEED}, - {MAKE_ID_AND_STR(OPTION_VALUE_HZ_HZYX), IMG_QUALITY} - }, -g_paper_strenght[]= - { - {MAKE_ID_AND_STR(OPTION_VALUE_FZQD_R),PAPER_WEAK}, - {MAKE_ID_AND_STR(OPTION_VALUE_FZQD_YB),PAPER_AVERAGE}, - {MAKE_ID_AND_STR(OPTION_VALUE_FZQD_Q),PAPER_STRONG} - }, -g_sleep_time[]= - { - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_BXM),SLEEP_TIME_0MIN}, - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_WFZ),SLEEP_TIME_5MIN}, - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_SFZ),SLEEP_TIME_10MIN}, - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_BXS),SLEEP_TIME_30MIN}, - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_YXS),SLEEP_TIME_60MIN}, - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_LXS),SLEEP_TIME_120MIN}, - {MAKE_ID_AND_STR(OPTION_VALUE_XMSJ_SXS),SLEEP_TIME_240MIN}, - }, -g_fold_type[] = - { - {MAKE_ID_AND_STR(OPTION_VALUE_ZYDZ),FOLD_TYPE_LEFT_RIGHT}, - {MAKE_ID_AND_STR(OPTION_VALUE_SXDZ),FOLD_TYPE_UP_DOWN}, - {MAKE_ID_AND_STR(OPTION_VALUE_ZDDZ),FOLD_TYPE_AUTO} - }; - -int g_paper_hx[] = { PAPER_A4, PAPER_A4_LATERAL - , PAPER_A5, PAPER_A5_LATERAL - , PAPER_A6, PAPER_A6_LATERAL - , PAPER_B5, PAPER_B5_LATERAL - , PAPER_B6, PAPER_B6_LATERAL - , PAPER_16K,PAPER_16K_LATERAL - , PAPER_LETTER, PAPER_LETTER_LATERAL - }; - -static struct paper_size -{ - int paper; - SIZE size; -}g_paper_size[] = - { - {PAPER_A3, {297, 420}}, - {PAPER_A4, {210, 297}}, - {PAPER_A5, {148, 210}}, - {PAPER_A6, {105, 148}}, - {PAPER_B4, {257, 364}}, - {PAPER_B5, {176, 250}}, // {PAPER_B5, {182, 257}}, - {PAPER_B6, {125, 176}}, - {PAPER_8K, {297, 420}}, - {PAPER_16K, {210, 285}}, // {PAPER_16K, {185, 260}} - {PAPER_A4_LATERAL, {297, 210}}, - {PAPER_A5_LATERAL, {210, 148}}, - {PAPER_A6_LATERAL, {148, 105}}, - {PAPER_B5_LATERAL, {250, 176}}, // {PAPER_B5, {182, 257}}, - {PAPER_B6_LATERAL, {176, 125}} - }; -// Custom 纸张的大小由用户定义. -// Letter Letter 纸(216 毫米 × 279 毫米). -// Legal Legal 纸(216 毫米 × 356 毫米). -// A4 A4 纸(210 毫米 × 297 毫米). -// CSheet C 纸(432 毫米 × 559 毫米). -// DSheet D 纸(559 毫米 × 864 毫米). -// ESheet E 纸(864 毫米 × 1118 毫米). -// LetterSmall Letter small 纸(216 毫米 × 279 毫米). -// Tabloid Tabloid 纸(279 毫米 × 432 毫米). -// Ledger Ledger 纸(432 毫米 × 279 毫米). -// Statement Statement 纸(140 毫米 × 216 毫米). -// Executive Executive 纸(184 毫米 × 267 毫米). -// A3 A3 纸(297 毫米 × 420 毫米). -// A4Small A4 small 纸(210 毫米 × 297 毫米). -// A5 A5 纸(148 毫米 × 210 毫米). -// B4 B4 纸(250 × 353 毫米). -// B5 B5 纸(176 毫米 × 250 毫米). -// Folio Folio 纸(216 毫米 × 330 毫米). -// Quarto Quarto 纸(215 毫米 × 275 毫米). -// Standard10x14 Standard 纸(254 毫米 × 356 毫米). -// Standard11x17 Standard 纸(279 毫米 × 432 毫米). -// Note Note 纸(216 毫米 × 279 毫米). -// Number9Envelope #9 envelope(98 毫米 × 225 毫米). -// Number10Envelope #10 envelope(105 毫米 × 241 毫米). -// Number11Envelope #11 envelope(114 毫米 × 263 毫米). -// Number12Envelope #12 envelope(120 毫米 × 279 毫米). -// Number14Envelope #14 envelope(127 毫米 × 292 毫米). -// DLEnvelope DL 信封(110 毫米 × 220 毫米). -// C5Envelope C5 信封(162 毫米 × 229 毫米). -// C3Envelope C3 信封(324 毫米 × 458 毫米). -// C4Envelope C4 信封(229 毫米 × 324 毫米). -// C6Envelope C6 信封(114 毫米 × 162 毫米). -// C65Envelope C65 信封(114 毫米 × 229 毫米). -// B4Envelope B4 信封(250 × 353 毫米). -// B5Envelope B5 信封(176 毫米 × 250 毫米). -// B6Envelope B6 信封(176 毫米 × 125 毫米). -// ItalyEnvelope Italy envelope(110 毫米 × 230 毫米). -// MonarchEnvelope Monarch envelope(98 毫米 × 191 毫米). -// PersonalEnvelope 6 3 / 4 envelope(92 毫米 × 165 毫米). -// USStandardFanfold US standard fanfold(378 毫米 × 279 毫米). -// GermanStandardFanfold German standard fanfold(216 毫米 × 305 毫米). -// GermanLegalFanfold German legal fanfold(216 毫米 × 330 毫米). -// IsoB4 ISO B4(250 毫米 × 353 毫米). -// JapanesePostcard Japanese postcard(100 毫米 × 148 毫米). -// Standard9x11 Standard 纸(229 毫米 × 279 毫米). -// Standard10x11 Standard 纸(254 毫米 × 279 毫米). -// Standard15x11 Standard 纸(381 毫米 × 279 毫米). -// InviteEnvelope 邀请函信封(220 毫米 × 220 毫米). -// LetterExtra Letter extra 纸(236 毫米 × 305 毫米).该值特定于 PostScript 驱动程序, 仅供 Linotronic 打印机使用以节省纸张. -// LegalExtra Legal extra 纸(236 毫米 × 381 毫米).该值特定于 PostScript 驱动程序, 仅供 Linotronic 打印机使用以节省纸张. -// TabloidExtra Tabloid extra 纸(297 毫米 × 457 毫米).该值特定于 PostScript 驱动程序, 仅供 Linotronic 打印机使用以节省纸张. -// A4Extra A4 extra 纸(236 毫米 × 322 毫米).该值是针对 PostScript 驱动程序的, 仅供 Linotronic 打印机使用以节省纸张. -// LetterTransverse Letter transverse 纸(210 毫米 × 279 毫米). -// A4Transverse A4 transverse 纸(210 毫米 × 297 毫米). -// LetterExtraTransverse Letter extra transverse 纸(236 毫米 × 305 毫米). -// APlus SuperA / SuperA / A4 纸(227 毫米 × 356 毫米). -// BPlus SuperB / SuperB / A3 纸(305 毫米 × 487 毫米). -// LetterPlus Letter plus 纸(216 毫米 × 322 毫米). -// A4Plus A4 plus 纸(210 毫米 × 330 毫米). -// A5Transverse A5 transverse 纸(148 毫米 × 210 毫米). -// B5Transverse JIS B5 transverse 纸(182 毫米 × 257 毫米). -// A3Extra A3 extra 纸(322 毫米 × 445 毫米). -// A5Extra A5 extra 纸(174 毫米 × 235 毫米). -// B5Extra ISO B5 extra 纸(201 毫米 × 276 毫米). -// A2 A2 纸(420 毫米 × 594 毫米). -// A3Transverse A3 transverse 纸(297 毫米 × 420 毫米). -// A3ExtraTransverse A3 extra transverse 纸(322 毫米 × 445 毫米). - -static int match_best(struct _fixed_option* arr, size_t num, std::string& val, bool& exact) -{ - exact = true; - for (size_t i = 0; i < num; ++i) - { - if (val == from_default_language(arr[i].str.c_str())) - return arr[i].enum_val; - } - - exact = false; - - return -1; -} -static std::string get_str(struct _fixed_option* arr, int num, int enm, int default_v = 0) -{ - if (enm >= 0 && enm < num) - return from_default_language(arr[enm].str.c_str()); - else - return from_default_language(arr[default_v].str.c_str()); -} - - -#define INVOKE_MATCH(arr, val, yes) match_best(arr, ARRAY_SIZE(arr), val, yes) -#define INVOKE_STR(arr, val, def) get_str(arr, ARRAY_SIZE(arr), val, def) -#define SET_DEFAULT_ON_FAIL(map_array, ind, val, def) \ - if(ind == -1) \ - { \ - ind = def; \ - val = INVOKE_STR(map_array, def, def); \ - } - -int match_best_color_mode(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_color_mode, val, yes); - - SET_DEFAULT_ON_FAIL(g_color_mode, ind, val, COLOR_MODE_24_BITS); - if (exact) - *exact = yes; - - return ind; -} -int match_best_multi_out(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_multi_out, val, yes); - - SET_DEFAULT_ON_FAIL(g_multi_out, ind, val, MULTI_OUT_ALL); - if (exact) - *exact = yes; - - return ind; - -} -int match_best_rid_color(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_rid_color, val, yes); - - SET_DEFAULT_ON_FAIL(g_rid_color, ind, val, RID_COLOR_NONE); - if (exact) - *exact = yes; - - return ind; -} -SIZE paper_size(int paper) -{ - for (size_t i = 0; i < ARRAY_SIZE(g_paper_size); ++i) - { - if (g_paper_size[i].paper == paper) - return g_paper_size[i].size; - } - - //return SIZE{ 2338, 3307 }; - - return SIZE{ 297, 420 }; // A3 -} -int match_best_paper(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_paper, val, yes); - - SET_DEFAULT_ON_FAIL(g_paper, ind, val, PAPER_A4); - if (exact) - *exact = yes; - - return ind; -} -int match_best_page(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_page, val, yes); - - SET_DEFAULT_ON_FAIL(g_page, ind, val, PAGE_DOUBLE); - if (exact) - *exact = yes; - - return ind; -} -int match_best_sharpen(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_sharpen, val, yes); - - SET_DEFAULT_ON_FAIL(g_sharpen, ind, val, SHARPEN_NONE); - if (exact) - *exact = yes; - - return ind; -} -int match_best_fill_background(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_fill_bkg, val, yes); - - SET_DEFAULT_ON_FAIL(g_fill_bkg, ind, val, FILL_BKG_CONVEX_POLYGON); - if (exact) - *exact = yes; - - return ind; -} -int match_best_scan_mode(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_scan_mode, val, yes); - - SET_DEFAULT_ON_FAIL(g_scan_mode, ind, val, SCAN_MODE_CONTINUOUS); - if (exact) - *exact = yes; - - return ind; -} -int match_best_text_direction(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_text_direction, val, yes); - - SET_DEFAULT_ON_FAIL(g_text_direction, ind, val, TEXT_DIRECTION_0); - if (exact) - *exact = yes; - - return ind; -} - -int match_best_permaeate_lv(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_permeate_lv, val, yes); - - SET_DEFAULT_ON_FAIL(g_permeate_lv, ind, val, TEXT_DIRECTION_0); - if (exact) - *exact = yes; - - return ind; -} - -int match_best_img_quality(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_img_quality, val, yes); - - SET_DEFAULT_ON_FAIL(g_img_quality, ind, val, IMG_SPEED); - if (exact) - *exact = yes; - - return ind; -} -int match_best_paper_strength(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_paper_strenght, val, yes); - - SET_DEFAULT_ON_FAIL(g_paper_strenght, ind, val, PAPER_WEAK); - if (exact) - *exact = yes; - - return ind; -} -int match_best_sleep_time(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_sleep_time, val, yes); - - SET_DEFAULT_ON_FAIL(g_sleep_time, ind, val, SLEEP_TIME_0MIN); - if (exact) - *exact = yes; - - return ind; -} -int match_best_fold_type(std::string& val, bool* exact) -{ - bool yes = true; - int ind = INVOKE_MATCH(g_fold_type, val, yes); - - SET_DEFAULT_ON_FAIL(g_fold_type, ind, val, FOLD_TYPE_AUTO); - if (exact) - *exact = yes; - - return ind; -} -std::string color_mode_string(int clr_mode) -{ - return INVOKE_STR(g_color_mode, clr_mode, 0); -} -std::string multi_out_string(int multi_out) -{ - return INVOKE_STR(g_multi_out, multi_out, 0); -} -std::string rid_color_string(int rid_color) -{ - return INVOKE_STR(g_rid_color, rid_color, 0); -} -std::string paper_string(int paper) -{ - return INVOKE_STR(g_paper, paper, 1); -} -bool is_lateral(int paper) -{ - for (int i = 1; i < _countof(g_paper_hx); i += 2) - { - if (paper == g_paper_hx[i]) - return true; - } - - return false; -} -int switch_lateral(int paper, bool lateral) -{ - for (int i = !lateral; i < _countof(g_paper_hx); i += 2) - { - if (g_paper_hx[i] == paper) - { - i += lateral ? 1 : -1; - paper = g_paper_hx[i]; - break; - } - } - - return paper; -} -std::string page_string(int page) -{ - return INVOKE_STR(g_page, page, 1); -} -std::string sharpen_string(int sharpen) -{ - return INVOKE_STR(g_sharpen, sharpen, 0); -} -std::string fill_background_string(int fill) -{ - return INVOKE_STR(g_fill_bkg, fill, 0); -} -std::string scan_mode_string(int mode) -{ - return INVOKE_STR(g_scan_mode, mode, 0); -} -std::string text_direction_string(int text_dir) -{ - return INVOKE_STR(g_text_direction, text_dir, 0); -} -std::string is_permaeate_string(int permaeate_lv) -{ - return INVOKE_STR(g_permeate_lv, permaeate_lv, 0); -} -std::string is_img_quality(int is_quakuty) -{ - return INVOKE_STR(g_img_quality, is_quakuty + 1/*start from -1*/, 0); -} -std::string is_paper_strength(int strength) -{ - return INVOKE_STR(g_paper_strenght, strength, 0); -} -std::string is_sleep_time(int sleep_time) -{ - return INVOKE_STR(g_sleep_time, sleep_time, 0); -} -std::string is_fold_type(int fold_type) -{ - return INVOKE_STR(g_fold_type, fold_type, 0); -} -int double_paper_flag_from_option_value(std::string& opt_val, bool* exact) -{ - if (exact) - *exact = true; - - if (opt_val == from_default_language(OPTION_VALUE_SZTPCL_SCTXBJXSM, nullptr)) - return DOUBLE_PAPER_CONTINUE | DOUBLE_PAPER_SAVE_IMG; - else if (opt_val == from_default_language(OPTION_VALUE_SZTPCL_SCTXBTZSM, nullptr)) - return DOUBLE_PAPER_SAVE_IMG; - else if (opt_val == from_default_language(OPTION_VALUE_SZTPCL_DQTXBJXSM, nullptr)) - return DOUBLE_PAPER_CONTINUE; - else - { - if (exact) - *exact = opt_val == from_default_language(OPTION_VALUE_SZTPCL_DQTXBTZSM, nullptr); - } - return 0; -} - -std::string double_paper_flag_to_option_value(int flag) -{ - if (is_continue_when_double_paper(flag)) - { - if (is_save_img_when_double_paper(flag)) - return from_default_language(OPTION_VALUE_SZTPCL_SCTXBJXSM, nullptr); - else - return from_default_language(OPTION_VALUE_SZTPCL_DQTXBJXSM, nullptr); - } - else if (is_save_img_when_double_paper(flag)) - return from_default_language(OPTION_VALUE_SZTPCL_SCTXBTZSM, nullptr); - else - return from_default_language(OPTION_VALUE_SZTPCL_DQTXBTZSM, nullptr); -} -bool is_continue_when_double_paper(int flag) -{ - return flag & DOUBLE_PAPER_CONTINUE; -} -bool is_save_img_when_double_paper(int flag) -{ - return flag& DOUBLE_PAPER_SAVE_IMG; -} - - diff --git a/hgdriver/hgdev/common_setting.h b/hgdriver/hgdev/common_setting.h deleted file mode 100644 index 38ba68a..0000000 --- a/hgdriver/hgdev/common_setting.h +++ /dev/null @@ -1,1231 +0,0 @@ -#pragma once - -// hg_scanner_cfg is the base configuration definitions -// -// created on 2022-02-23 -// -#include -#include "../../../sdk/include/huagao/brand.h" -#include "sane/sane_ex.h" -#include -#include -#include "sane/sane_option_definitions.h" -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// 硬件配置项定义 -// -#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) - -typedef struct hg_tag_SIZE -{ - long cx; - long cy; -}CSSIZE, * PCSSIZE, * LPCSSIZE; - -typedef CSSIZE CSSIZEL; -typedef CSSIZE* PCSSIZEL, * LPCSSIZEL; -#if defined(WIN32) || defined(_WIN64) -#include -#else -typedef CSSIZE Size; -typedef CSSIZE SIZE; -#endif - -enum hg_scanner_type -{ - HG_SCANNER_TYPE_NONE = 0, - HG_SCANNER_TYPE_G100, - HG_SCANNER_TYPE_G200, - HG_SCANNER_TYPE_G300, - HG_SCANNER_TYPE_G400, - HG_SCANNER_TYPE_G139, - HG_SCANNER_TYPE_G239, -}; - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// 设置项字符串定义 -// - -// int match_best_xxx(std::string& val, bool* exact) 函数簇原型说明 -// -// Function: 匹配最接近的字符串,并返回对应的枚举值 -// -// Parameter: val - [in] 用户传入的设置参数字符串 -// [out] 如果传入的参数不能精确匹配固定值,则修改为最接近的值或默认值 -// -// exact - [out] 如果val与固定选项精确匹配, 则返回true; -// 否则返回false,并在val中返回精确的选项值 -// -// Return: 匹配字符串值的枚举值 - -// -// 注意:下列所有文本定义,必须与设备JSON配置文件中的相关内容保持一致,否则将导致设备参数设置不正确,行为不可控!!! -// -// 颜色模式 选项 -//#define HUAGAO_SETTING_STR_COLOR_MODE_BLACK_WHITE "黑白" -//#define HUAGAO_SETTING_STR_COLOR_MODE_256_GRAY "256级灰度" -//#define HUAGAO_SETTING_STR_COLOR_MODE_24_BITS "24位彩色" -//#define HUAGAO_SETTING_STR_COLOR_MODE_AUTO_MATCH "颜色自动识别" -enum -{ - COLOR_MODE_BLACK_WHITE = 0, - COLOR_MODE_256_GRAY, - COLOR_MODE_24_BITS, - COLOR_MODE_AUTO_MATCH, -}; -int match_best_color_mode(std::string& val, bool* exact); -std::string color_mode_string(int clr_mode); - -//#define HUAGAO_SETTING_STR_MULTI_OUT_NOT "不选择输出模式" -//#define HUAGAO_SETTING_STR_MULTI_OUT_ALL "彩色+灰度+黑白" -//#define HUAGAO_SETTING_STR_MULTI_COLOR_ADN_GRAY "彩色+灰度" -//#define HUAGAO_SETTING_STR_MULTI_COLOR_ADN_BW "彩色+黑白" -//#define HUAGAO_SETTING_STR_MULTI_GRAY_ADN_BW "灰度+黑白" -enum -{ - MULTI_OUT_ALL = 0, - MULTI_COLOR_AND_GRAY, - MULTI_COLOR_AND_BW, - MULTI_GRAY_AND_BW -}; -int match_best_multi_out(std::string& val, bool* exact); -std::string multi_out_string(int clr_mode); - - -// 除色 选项 -//#define HUAGAO_SETTING_STR_RID_COLOR_NONE "不除色" -//#define HUAGAO_SETTING_STR_RID_COLOR_RID_RED "除红色" -//#define HUAGAO_SETTING_STR_RID_COLOR_RID_GREEN "除绿色" -//#define HUAGAO_SETTING_STR_RID_COLOR_RID_BLUE "除蓝色" -//#define HUAGAO_SETTING_STR_RID_COLOR_ENHANCE_RED "红色增强" -//#define HUAGAO_SETTING_STR_RID_COLOR_ENHANCE_GREEN "绿色增强" -//#define HUAGAO_SETTING_STR_RID_COLOR_ENHANCE_BLUE "蓝色增强" -enum -{ - RID_COLOR_NONE = 0, - RID_COLOR_RID_RED, - RID_COLOR_RID_GREEN, - RID_COLOR_RID_BLUE, - RID_COLOR_ENHANCE_RED, - RID_COLOR_ENHANCE_GREEN, - RID_COLOR_ENHANCE_BLUE, -}; -int match_best_rid_color(std::string& val, bool* exact); -std::string rid_color_string(int rid_color); - -// 纸张 选项 -//#define HUAGAO_SETTING_STR_PAPER_A3 "A3" -//#define HUAGAO_SETTING_STR_PAPER_A4 "A4" -//#define HUAGAO_SETTING_STR_PAPER_A5 "A5" -//#define HUAGAO_SETTING_STR_PAPER_A6 "A6" -//#define HUAGAO_SETTING_STR_PAPER_B4 "B4" -//#define HUAGAO_SETTING_STR_PAPER_B5 "B5" -//#define HUAGAO_SETTING_STR_PAPER_B6 "B6" -//#define HUAGAO_SETTING_STR_PAPER_8K "8开" -//#define HUAGAO_SETTING_STR_PAPER_16K "16开" -//#define HUAGAO_SETTING_STR_PAPER_LETTER "Letter" -//#define HUAGAO_SETTING_STR_PAPER_A4_LATERAL "A4横向" -//#define HUAGAO_SETTING_STR_PAPER_A5_LATERAL "A5横向" -//#define HUAGAO_SETTING_STR_PAPER_A6_LATERAL "A6横向" -//#define HUAGAO_SETTING_STR_PAPER_B5_LATERAL "B5横向" -//#define HUAGAO_SETTING_STR_PAPER_B6_LATERAL "B6横向" -//#define HUAGAO_SETTING_STR_PAPER_16K_LATERAL "16开横向" -//#define HUAGAO_SETTING_STR_PAPER_LETTER_LATERAL "Letter横向" -//#define HUAGAO_SETTING_STR_PAPER_DOUBLE_LETTER "Double Letter" -//#define HUAGAO_SETTING_STR_PAPER_LEGAL "LEGAL" -//#define HUAGAO_SETTING_STR_PAPER_AUTO_MATCH "匹配原始尺寸" -//#define HUAGAO_SETTING_STR_PAPER_MAX_SIZE "最大扫描尺寸" -//#define HUAGAO_SETTING_STR_PAPER_MAX_SIZE_CLIP "最大扫描尺寸自动裁切" -//#define HUAGAO_SETTING_STR_PAPER_TRIGEMINY "三联试卷" -enum -{ - PAPER_A3 = 0, - PAPER_A4, - PAPER_A5, - PAPER_A6, - PAPER_B4, - PAPER_B5, - PAPER_B6, - PAPER_8K, - PAPER_16K, - PAPER_LETTER, - PAPER_A4_LATERAL, - PAPER_A5_LATERAL, - PAPER_A6_LATERAL, - PAPER_B5_LATERAL, - PAPER_B6_LATERAL, - PAPER_16K_LATERAL, - PAPER_LETTER_LATERAL, - PAPER_DOUBLE_LETTER, - PAPER_LEGAL, - PAPER_AUTO_MATCH, - PAPER_MAX_SIZE, - PAPER_MAX_SIZE_CLIP, - PAPER_TRIGEMINY, -}; -SIZE paper_size(int paper); // unit: mm -int match_best_paper(std::string& val, bool* exact); -std::string paper_string(int paper); -bool is_lateral(int paper); -int switch_lateral(int paper, bool lateral); - -// 页面扫描模式 选项 -//#define HUAGAO_SETTING_STR_PAGE_SINGLE "单面" -//#define HUAGAO_SETTING_STR_PAGE_DOUBLE "双面" -//#define HUAGAO_SETTING_STR_PAGE_OMIT_EMPTY "跳过空白页(通用)" -//#define HUAGAO_SETTING_STR_PAGE_OMIT_EMPTY_RECEIPT "跳过空白页(发票纸)" -//#define HUAGAO_SETTING_STR_PAGE_FOLIO "对折" -enum { - PAGE_SINGLE = 0, - PAGE_DOUBLE, - PAGE_OMIT_EMPTY, - PAGE_OMIT_EMPTY_RECEIPT, - PAGE_FOLIO, -}; -int match_best_page(std::string& val, bool* exact); -std::string page_string(int page); - -// 锐化 选项 -//#define HUAGAO_SETTING_STR_SHARPEN_NONE "无" -//#define HUAGAO_SETTING_STR_SHARPEN_SHARPEN "锐化" -//#define HUAGAO_SETTING_STR_SHARPEN_SHARPEN_MORE "进一步锐化" -//#define HUAGAO_SETTING_STR_SHARPEN_HAZY "模糊" -//#define HUAGAO_SETTING_STR_SHARPEN_HAZY_MORE "进一步模糊" -enum -{ - SHARPEN_NONE = 0, - SHARPEN_SHARPEN, - SHARPEN_SHARPEN_MORE, - SHARPEN_HAZY, - SHARPEN_HAZY_MORE, -}; -int match_best_sharpen(std::string& val, bool* exact); -std::string sharpen_string(int sharpen); - -//背景填充方式 选项 -//#define HUAGAO_SETTING_STR_FILL_BKG_CONVEX_POLYGON "凸多边形" -//#define HUAGAO_SETTING_STR_FILL_BKG_CONCAVE_POLYGON "凹多边形" -enum -{ - FILL_BKG_CONVEX_POLYGON = 0, - FILL_BKG_CONCAVE_POLYGON, -}; -int match_best_fill_background(std::string& val, bool* exact); -std::string fill_background_string(int fill); - -// 扫描数量 选项 -//#define HUAGAO_SETTING_STR_SCAN_MODE_CONTINUOUS "连续扫描" -//#define HUAGAO_SETTING_STR_SCAN_MODE_GIVEN_COUNT "扫描指定张数" -enum -{ - SCAN_MODE_CONTINUOUS = 0, - SCAN_MODE_GIVEN_COUNT, -}; -int match_best_scan_mode(std::string& val, bool* exact); -std::string scan_mode_string(int mode); - -// 文稿方向 选项 -//#define HUAGAO_SETTING_STR_TEXT_DIRECTION_0 "0°" -//#define HUAGAO_SETTING_STR_TEXT_DIRECTION_90 "90°" -//#define HUAGAO_SETTING_STR_TEXT_DIRECTION_180 "180°" -//#define HUAGAO_SETTING_STR_TEXT_DIRECTION_270 "-90°" -//#define HUAGAO_SETTING_STR_TEXT_DIRECTION_AUTO "自动文本方向识别°" -enum -{ - TEXT_DIRECTION_0 = 0, - TEXT_DIRECTION_90, - TEXT_DIRECTION_180, - TEXT_DIRECTION_270, - TEXT_DIRECTION_AUTO, -}; -int match_best_text_direction(std::string& val, bool* exact); -std::string text_direction_string(int text_dir); - - -//#define HUAGAO_SETTING_STR_PERMAEATE_WEAKER "较弱" -//#define HUAGAO_SETTING_STR_PERMAEATE_WEAK "弱" -//#define HUAGAO_SETTING_STR_PERMAEATE_ORDINARY "一般" -//#define HUAGAO_SETTING_STR_PERMAEATE_STRONG "强" -//#define HUAGAO_SETTING_STR_PERMAEATE_STRONGER "较强" -enum -{ - PERMAEATE_WEAKER = 0, - PERMAEATE_WEAK, - PERMAEATE_ORDINARY, - PERMAEATE_STRONG, - PERMAEATE_STRONGER, -}; - -int match_best_permaeate_lv(std::string& val, bool* exact); -std::string is_permaeate_string(int text_dir); - -//画质 -enum -{ - IMG_NONE = -1, - IMG_SPEED , - IMG_QUALITY, -}; -int match_best_img_quality(std::string& val, bool* exact); -std::string is_img_quality(int is_quakuty); - -// 双张处理 -enum -{ - DOUBLE_PAPER_CONTINUE = 0x01, // 继续扫描 - DOUBLE_PAPER_SAVE_IMG = 0x02, // 保存图片 -}; -int double_paper_flag_from_option_value(std::string& opt_val, bool* exact); -std::string double_paper_flag_to_option_value(int flag); -bool is_continue_when_double_paper(int flag); -bool is_save_img_when_double_paper(int flag); - -enum -{ - PAPER_WEAK = 0, - PAPER_AVERAGE, - PAPER_STRONG, -}; -int match_best_paper_strength(std::string& val, bool* exact); -std::string is_paper_strength(int strength); - -enum -{ - SLEEP_TIME_0MIN = 0, - SLEEP_TIME_5MIN, - SLEEP_TIME_10MIN, - SLEEP_TIME_20MIN, - SLEEP_TIME_30MIN, - SLEEP_TIME_60MIN, - SLEEP_TIME_120MIN, - SLEEP_TIME_240MIN, -}; -int match_best_sleep_time(std::string& val, bool* exact); -std::string is_sleep_time(int sleep_time); - -enum -{ - FOLD_TYPE_LEFT_RIGHT, - FOLD_TYPE_UP_DOWN, - FOLD_TYPE_AUTO -}; -int match_best_fold_type(std::string& val, bool* exact); -std::string is_fold_type(int fold_type); - -typedef union _img_proc_fixed_param -{ - unsigned long long value; - struct - { - unsigned long long rid_red : 1; // 多流输出除红 - unsigned long long rid_answer_red : 1; // 答题卡除红 - unsigned long long erase_bakground : 1; // 背景移除 - unsigned long long noise_optimize : 1; // 噪点优化 - unsigned long long exchange : 1; // 交换正反面 - unsigned long long split : 1; // 图像拆分 - unsigned long long rid_hole : 1; // 穿孔移除 - unsigned long long dark_sample : 1; // 深色样张 - - unsigned long long rotate_back_180 : 1; // 背面旋转180度 - unsigned long long fractate_check : 1; // 折角检测 - unsigned long long is_permeate : 1; // 防止渗透 - unsigned long long remove_morr : 1; // 去除摩尔纹 - unsigned long long error_extention : 1; // 错误扩散 - unsigned long long remove_txtture : 1; // 去网纹 - unsigned long long fill_background : 2; // 背景填充方式 - - unsigned long long is_permeate_lv_ : 3; // 渗透等级 1 - 5 - unsigned long long multi_out : 3; // 多流输出 - unsigned long long erase_black_frame: 1; // 消除黑框 - unsigned long long automatic_skew : 1; // 自动纠偏 - - unsigned long long rid_color : 3; // 除色 - unsigned long long color_mode : 3; // 颜色模式 - unsigned long long page : 3; // 页面模式 - - unsigned long long paper : 8; // 纸张类型 - - unsigned long long sharpen : 4; // 锐化模式 - unsigned long long text_direction : 4; // 文稿方向 - - unsigned long long reserved2 : 14; // 保留 - }bits; -}IMGPRCFIXPARAM; - -// 设置项字符串定义 - OVER -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// 状态信息描述符 -// - -// 状态信息描述符 - OVER -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////图像参数及设备协议/////////////////////////////////////////////////////// - - -//DSP 3288设备USB读写协议结构 -// -typedef struct tag_USBCB { - unsigned int u32_CMD; - unsigned int u32_Data; - unsigned int u32_Count; -}USBCB, * PUSBCB; - -//DSP设备USB读写协议结构 - OVER - -enum PaperAlign :unsigned char { - Rot0 = 0, - Rot270 = 3, - AutoTextOrientation = 5 -}; - -enum LowPowerMode :unsigned int { - Min_None = 0, - Min_5, - Min_10, - Min_20, - Min_30, - Min_60, - Min_120, - Min_240 -}; - -//纸张类型 -enum TwSS : unsigned short -{ - None = 0, - A4Letter = 1, - A4 = 1, - B5Letter = 2, - JISB5 = 2, - B5 = 2, - USLetter = 3, - USLegal = 4, - A5 = 5, - B4 = 6, - ISOB4 = 6, - B6 = 7, - ISOB6 = 7, - USLedger = 9, - USExecutive = 10, - A3 = 11, - B3 = 12, - ISOB3 = 12, - A6 = 13, - C4 = 14, - C5 = 15, - C6 = 16, - _4A0 = 17, - _2A0 = 18, - A0 = 19, - A1 = 20, - A2 = 21, - A7 = 22, - A8 = 23, - A9 = 24, - A10 = 25, - ISOB0 = 26, - ISOB1 = 27, - ISOB2 = 28, - ISOB5 = 29, - ISOB7 = 30, - ISOB8 = 31, - ISOB9 = 32, - ISOB10 = 33, - JISB0 = 34, - JISB1 = 35, - JISB2 = 36, - JISB3 = 37, - JISB4 = 38, - JISB6 = 39, - JISB7 = 40, - JISB8 = 41, - JISB9 = 42, - JISB10 = 43, - C0 = 44, - C1 = 45, - C2 = 46, - C3 = 47, - C7 = 48, - C8 = 49, - C9 = 50, - C10 = 51, - USStatement = 52, - BusinessCard = 53, - MaxSize = 54, - K8 = 0x81, - K16 = 0x82, - Trigeminy = 0x83, -}; -//纸张类型 - OVER - -enum ScannerSerial -{ - G100Serial, - G200Serial, - G300Serial, - G400Serial, - G10039Serial, - G20039Serial, -}; - -#pragma pack(push) -#pragma pack(4) - -//除色和增强 -// -typedef enum tagColor_Filter -{ - FILTER_RED, - FILTER_GREEN, - FILTER_BLUE, - FILTER_NONE, - FILTER_ALL, - ENHANCE_RED, - ENHANCE_GREEN, - ENHANCE_BLUE -}ColorFilter; -//除色和增强 - OVER - -//填穿孔 -// -typedef struct tagFillHole -{ - uint8_t is_fillhole; - int fillholeratio; -}FillHole; -//填穿孔 - OVER - -//黑白降噪 -// -typedef struct tagDetachNoise -{ - unsigned char is_detachnoise; - int detachnoise; -}DetachNoise; - -//黑白降噪 -OVER - -//自定义裁切 -// -typedef struct tagCrop_Rect -{ - int enable; - int x; /*****自定义裁切区域左上角x坐标*/ - int y; /*****自定义裁切区域左上角y坐标*/ - int width; /*****自定义裁切区域宽度*******/ - int height; /*****自定义裁切区域高度*******/ -}CropRect; -//自定义裁切 -OVER - -//多留输出 -// -typedef enum tagMulti_Output { - Unused = -1, - All, - ColorGray, - ColorBw, - GrayBw -}MultiOutput; -//多留输出 -OVER - -//设置设备硬件状态 -// -typedef struct tagHhardware_Params -{ - unsigned char capturepixtype; - unsigned char en_doublefeed; - unsigned char en_stapledetect; - unsigned char en_skrewdetect; - unsigned char skrewdetectlevel; - LowPowerMode lowpowermode; -#ifdef UV - unsigned char en_uv; -#endif -}HardwareCaps; -//设置设备硬件状态 -OVER - -//图像参数设置 -// -typedef struct _scan_conf -{ - unsigned char papertype; /**< 纸张尺寸>*/ - unsigned char paperAlign; /**< 纸张尺寸是否横向>*/ - unsigned char en_sizecheck; /**< 尺寸检测>*/ - float imageRotateDegree; /**< 旋转>*/ - unsigned char is_duplex; /**< 是否双面*/ - unsigned char en_fold; /**< 是否对折>*/ - int pixtype; /**< 颜色模式>*/ - int automaticcolor; /**< 顔色自動識別>*/ - int automaticcolortype; /**< 顔色自動識別后非彩色上傳類型>*/ - float resolution_dst; /**< 设置分辨率>*/ - float resolution_native; /**< 保存分辨率>*/ - float gamma; /**< 伽马值>*/ - float contrast; /**< 对比度>*/ - float brightness; /**< 亮度>*/ - float threshold; /**< 阈值>*/ - unsigned char is_autocontrast; /**< 自动对比度>*/ - unsigned char is_autocrop; /**< 自动裁切>*/ - unsigned char is_autodiscradblank_normal; /**< 自动丢弃空白页通用>*/ - int discardblank_percent; /**< 跳过空白页阈值*/ - unsigned char is_autodiscradblank_vince; /**< 自动丢弃空白页发票>*/ - unsigned char is_switchfrontback; /**< 交换正反面>*/ - unsigned char autodescrew; /**< 自动纠偏>*/ - unsigned char multi_output_red; /**< 多流输出>*/ - unsigned char hsvcorrect; /**< 答题卡除红>*/ - unsigned char filter; /**< 除色>*/ - unsigned char sharpen; /**< 锐化>*/ - unsigned char enhance_color; /**< 颜色增强>*/ - unsigned char fillbackground; /**< 填黑框>*/ - bool is_convex; /**< 填黑框模式,true为凸多边形填充,false为凹多边形填充,默认true>*/ - int noise; /**< 除噪像素,能够消除noise宽度的背景竖条纹干扰,默认40>*/ - int indent; /**< 轮廓缩进,裁剪、纠偏或者黑底填充时,对探索到的纸张轮廓进行缩进indent像素,默认5>*/ - int AutoCrop_threshold; /**< 自动裁剪二值化阈值,取值范围(0, 255),默认40>*/ - unsigned short scannum; /**< 扫描张数>*/ - unsigned char is_backrotate180; /**< 背面旋转180>*/ - unsigned char is_dogeardetection; /**< 折角检测>*/ - HardwareCaps hardwarecaps; /**< 硬件扫描参数>*/ - FillHole fillhole; /**< 填穿孔>*/ - DetachNoise detachnoise; /**< 黑白降噪>*/ - unsigned char is_autotext; /**< 自动文本方向识别>*/ - bool isfillcolor; /**< 自动裁切颜色填充>*/ - int refuseInflow; /**< 防止渗透>*/ - int colorCorrection; /**< 色彩校正>*/ - int removeMorr; /**< 去除摩尔纹>*/ - int errorExtention; /**< 错误扩散>*/ - int textureRemove; /**< 除网纹>*/ - int splitImage; /**< 图像拆分>*/ - CropRect cropRect; /**< 自定义裁切>*/ - MultiOutput multiOutput; /**< 多流输出>*/ - bool normalCrop; /**< 自动裁切深色样张>*/ - uint32_t dogeardistabce; - bool fadeback; /**< 背景除色>*/ - int fadebackrange; /**< 背景除色阈值>*/ - bool isuoloadexceptionimage; /**< 是否保留双张出图>*/ - int fillholeratio_up; /**< 上侧除穿孔比率,0为不除。[0,50],added on 2022-09-12>*/ - int fillholeratio_down; /**< 下侧除穿孔比率,0为不除。[0,50],added on 2022-09-12>*/ - int fillholeratio_left; /**< 左侧除穿孔比率,0为不除。[0,50],added on 2022-09-12>*/ - int fillholeratio_right; /**< 右侧除穿孔比率,0为不除。[0,50],added on 2022-09-12>*/ - uint8_t fold_concatmode; /**< 对折拼接模式 0左右,1上下,2自动对折>*/ - int HsvFilterType; /**< 答题卡留红出杂色功能类型 暂定为0*/ - bool is_colorcast; /**< 色偏校正*/ - uint32_t reserve[1024]; /**< 预留4096字节做协议扩展*/ -}SCANCONF ,*LPSCANCONF; -//图像参数设置 -OVER - -//硬件协议定义 -namespace setting_hardware -{ - typedef union hg_scanner_config_3399 - { - unsigned int value; - struct - { - unsigned int paper : 5; // 纸张类型 (每个型号有不同的映射表) - unsigned int color : 1; // 是否彩色 0 - 黑白, 1 - 彩色 - unsigned int dpi : 2; // DPI (映射表) - unsigned int ultrasonic_enable : 1; // 是否进行超声波检测(双/多张进纸检测) - unsigned int staple_enbale : 1; // 是否进行钉书钉检测 - unsigned int screw_detect_enable : 1; // 是否歪斜检测 - unsigned int screw_detect_level : 3; // 歪斜检测水平 - unsigned int iscorrect_mod : 1; // 是否自动校正 - unsigned int is_autopaper : 1; // 是否自动进纸 - // unsigned int reserved1 : 4; // 保留 - unsigned int is_textcorrect : 1; // 1 - 照片模式;0 - 文本模式。默认值为 0 - unsigned int is_fixedpaper : 1; // is_fixedpaper 为false en_autosize为true自适应幅面开启 - unsigned int en_anlogic_key : 1; // - unsigned int en_autosize : 1; // - unsigned int pc_correct : 1; // 是否在PC端校正 1:不校正 cis原图,0:校正 - unsigned int enable_sizecheck : 1; // 是否进行尺寸检测 - unsigned int enabledsp_cache : 1; // 是否在片上缓存 - unsigned int sizeerror_errorratio : 9; // 幅面检测 - }params_3399; - }HGSCANCONF_3399; - typedef union hg_scanner_config_dsp - { - unsigned int value; - struct - { - unsigned int paper : 5; - unsigned int color : 1; - unsigned int dpi : 2; - unsigned int double_feed_enbale : 1; - unsigned int stable_enbale : 1; - unsigned int screw_detect_enable : 1; - unsigned int screw_detect_level : 3; - unsigned int isCorrect : 1; //设置0 为原图,1为校正后的图 - unsigned int unused_one : 5; - unsigned int pc_correct : 1; - unsigned int enable_sizecheck : 1; - unsigned int unused_two : 10; - }params_dsp; - }HGSCANCONF_DSP; - typedef union hg_scanner_config_3288 - { - unsigned int value; - //struct - //{ - // unsigned int pageSize : 5; - // unsigned int isColor : 1; - // unsigned int dpi : 2; - // unsigned int doubleFeeded : 1; - // unsigned int enableUV : 1; - // unsigned int enableLed : 1; - // unsigned int sizedetece : 1; - // unsigned int reversed1 : 5; - // unsigned int isCorrect : 1; - // unsigned int dstHeight : 8; - // unsigned int reversed2 : 6; - //}params; - struct // changed on 2022-07-25 - { - unsigned int pageSize : 5; - unsigned int isColor : 1; - unsigned int dpi : 2; - unsigned int doubleFeeded : 1; - unsigned int enableStable : 1; - unsigned int enableLed : 1; - unsigned int enableSizeDetect : 1; - unsigned int lutmode : 1; // 设置文本和照片模式, 0 - 文本;1 - 照片。默认值为“0” - unsigned int reversed1 : 4; - unsigned int isCorrect : 1; //设置0 为原图,1为校正后的图 - unsigned int dstHeight : 8; - unsigned int reversed2 : 6; - }params_3288; - }HGSCANCONF_3288; -} -//硬件协议定义 -OVER -namespace setting3288dsp -{ - struct HG_JpegCompressInfo - { - unsigned int data_type; - unsigned int first_frame; - unsigned int last_frame; - unsigned int index_frame; - unsigned int DataLength; - unsigned int width; - unsigned int height; - unsigned char* pJpegData; - }; - //100-200 dsp 300-400 3288设备状态 - typedef enum tagUsbSupported - { - SCAN_STOP = -2, //停止扫描 - HAVE_ERROR = -1, //异常 - NORMAL = 0, //正常状态 - OPEN_COVER = 1, //开盖 - NO_FEED = 2, //无纸 - FEED_IN_ERROR = 4, //搓纸失败 - PAPER_JAM = 8, //卡纸 - DETECT_DOUBLE_FEED = 16,//检测到双张 - DETECT_STAPLE = 32, //检测到订书钉 - PAPER_SKEW = 64, //纸张倾斜 - AUTO_SCAN_MODE = 65, //自动模式 - MANAUL_SCAN_MODE = 66, //手动模式 - COUNT_MODE = 67, //计数模式 - HARDWARE_ERROR = 68, //硬件错误 - FPGA_ERROR = 68, //FPGA崩溃 - START_SCAN = 69, //开始 - STOP_SCAN = 70, //停止 - HAVE_IMAGE = 71, //有图 - UPDATE_SCAN_PARAMETER = 72,// 更新扫描参数 - PC_SCAN_BUSY_or_ERROR = 73,// PC繁忙或出错 - DOG_EAR = 74, //摺角 - SIZE_ERROR = 75, //幅面检测错误 - AQUIRE_IMAGE_TIMEOUT = 76, //取图超时 - LOSE_IMAGE = 77, //获取图片与扫描张数不匹配 - USB_BULK_ERROR = 78, //usb读取数据错误 - V4L2_AQULRE_ERROR = 79, //v4l2取图失败 - V4L2_IMAGE_EMPTY = 80, //扫描仪内部图片丢失 - SLEEPING = 81, //处于休眠中 - HAVE_DOGEAR = 82, //检测到有折角 - HAVE_HOLE = 84 , //检测到纸张有孔洞, 注意不是穿孔,类似于中间破损一块 - AUTO_FLATTING = 198, //自动校正中 - USB_DISCONNECTED = 200, //USB 未连接 - USER_STOP = 201, //用户点击停止 - AUTO_FLAT_FINISHED = 202, //自动校正完成 - USB_CONNECTED, //USB已连接 - HAVE_PAPER, - DEVICE_OFF_LINE, //USB链接断开 - } UsbSupported, * PUsbSupported; - // - //设备状态 - OVER - - enum tagUsbKeyWords - { - //无命令 - NO_COMMAND = 0, - //获取dsp 状态 - GET_DSP_STATUS = 1, - //取图 - GET_IMAGE = 2, - //销毁DSP中驻存的图 - POP_IMAGE = 3, - //开始扫描命令 - START_COMMAND = 4, - //停止扫描命令 - STOP = 5, - //获取扫描仪扫描模式 - GET_SCAN_MODE = 6, - //获取固件版本号 - GET_FW_VERSION = 7, - //返回PC端的状态 - SEND_STATUS_PC = 8, - //下发扫描配置参数 - CONFIGURED_DATA = 9, - //下发固件信息 - SEND_FW = 10, - //获取扫描参数 - GET_CONFIG_DATA = 11, - //获取扫描总张数 - GET_SCANN_NUM = 12, - //获取有无纸的状态 - GET_PAPERFEEDER_STATUS = 13, - //DSP初始化 - INIT_HARDWARE_SYS = 14, - //下发元器件配置参数(灰度,LED R曝光时间) - SEND_COMPONENTS_GR = 15, - //下发元器件配置参数(LED G/B曝光时间) - SEND_COMPONENTS_GB = 16, - //下发扫描模式 - SEND_SCAN_MODE = 17, - //开始进行平场矫正 - START_FLAT = 18, - //停止平场矫正 - STOP_FLAT = 19, - //下发200dpi彩色平场矫正参数 - SEND_200_COLOR_FLAT_DATA = 20, - //下发300dpi彩色平场矫正参数 - SEND_300_COLOR_FLAT_DATA = 21, - //获取200dpi彩色平场矫正参数 - GET_200_COLOR_FLAT_DATA = 22, - //获取300dpi彩色平场矫正参数 - GET_300_COLOR_FLAT_DATA = 23, - //下发200dpi灰度平场校正参数 - SEND_200_GRAY_FLAT_DATA = 24, - //下发300dpi灰度平场校正参数 - SEND_300_GRAY_FLAT_DATA = 25, - //获取200DPI灰度平场校正参数 - GET_200_GRAY_FLAT_DATA = 26, - //获取300DPI灰度平场校正参数 - GET_300_GRAY_FLAT_DATA = 27, - //下发序列号命令 - SEND_SERIAL = 28, - //获取序列号命令 - GET_SERIAL = 29, - //获取滚轴数 - GET_ROLLER_NUM = 0x1e, - //清零滚轴数 - CLR_ROLLER_NUM = 0x1f, - //清除扫描总张数 - CLR_SCAN_NUM = 0x20, - //准备更新固件 - PRE_UPGRADE = 0X21, - //开始更新固件 - START_UPGRADE = 0x22, - //彩色的AD参数 - RGB_ADI_PARA = 0x23, - //灰度的AD参数 - ADI_PARA = 0x24, - //获取CIS参数(曝光时间,ad参数) - GET_CIS_PARA = 0x25, - //扫描张数 - START_COMMAND_COUNT = 0x26, - //下发休眠时间 - SET_SLEEP_TIME = 0x27, - //获取休眠时间 - GET_SLEEP_TIME = 0x28, - //清除缓存 - CLR_CACHE = 0x29, - //下发速度模式 - SET_SPEED_MODE = 0x2a, - //获取扫描速度模式 - GET_SPEED_MODE = 0X2b, - //设置固件版本一共8个字节 - SET_FW_VERSION = 0X2c, - //获取DSP版本 - GET_DSP_VERSION = 0X2d, - //采集板FPGA固件版本 - GET_SCANFPGA_VERSION = 0x2e, - //电机板FPGA固件版本 - GET_MOTORFPGA_VERSION = 0X2f, - //设置制造商信息 - SET_USB_INFOR_MANUFACTURE = 0X30, - //获取制造商信息 - GET_USB_INFOR_MANUFACTURE = 0X31, - //设置产品型号信息 - SET_USB_INFOR_MODEL_NAME = 0X32, - //获取产品型号信息 - GET_USB_INFOR_MODEL_NAME = 0X33, - //设置USB PID / VID信息 - SET_USB_INFOR_VIDPID = 0X34, - GET_USB_INFOR_VIDPID = 0X35, - //设置卡纸急停检测灵敏度 - SET_JAM_DETECT_SENSITIVE = 0X36, - //获取卡纸急停检测灵敏度 - GET_JAM_DETECT_SENSITIVE = 0X37, - //设置横向畸变系数 - SET_JUST_COF_H = 0x38, - //读取横向畸变系数 - GET_JUST_COF_H = 0x39, - //G400 清除硬件异常 - CLEAR_HWERROR = 0x40, - //设置纵向畸变系数 - SET_JUST_COF_V = 0x41, - //读取纵向畸变系数 - GET_JUST_COF_V = 0x42, - //设置彩色校正参数 - SEND_COLOR_FLAT = 0x43, - //设置彩色平场校正参数 - SEND_COLORCORRECT_FLAT = 0x44, - //设置灰度校正参数 - SEND_GRAY_FLAT = 0x45, - //设置灰度平场校正参数 - SEND_GRAYCORRECT_FLAT = 0x46, - //设置平场校正参数 - GET_FLAT_DATA = 0x47, - //更新完成 - UPDATE_FINISHED = 0x48, - //重启 1进入loader,0普通重启 - REBOOT = 0x49, - //获取日志 - GET_LOG_FILES_INFO = 0x50, - //发送log文件完成 - GET_UPDATE_RESULT = 0x51, - //清空日志 - CLEAR_LOG_FILES = 0x52, - //获取搓纸失败 - GET_CUO_ERROR, - //获取双张失败次数 - GET_DOU_ERROR, - //获取卡纸次数 - GET_JAM_ERROR, - //获取设备是否睡眠状态 - ACTIVE_SCANNER = 0x100, - //图像处理参数下发 - GETSYSINFO_LEN = 0x200, - GETSYSINFO = 0x201, - GETMOTORPARAM = 0x202, - GETMOTORPARMLEN = 0x203, - SETMOTORPARAM = 0x204, - SETMOTORPARAMLEN = 0x205 - }; - typedef enum tagUsbKeyWords UsbKeyWords, * PUsbKeyWords; - //G300 G400 纸张类型协议 注:只支持3288 300 400 - // - enum G400_PaperSize { - G400_A3 = 0, - G400_A4, - G400_A4R, - G400_A5, - G400_A5R, - G400_A6, - G400_A6R, - G400_B4, - G400_B5, - G400_B5R, - G400_B6, - G400_B6R, - G400_DOUBLELETTER, - G400_LEGAL, - G400_LETTER, - G400_LETTERR, - G400_LONGLETTER, - G400_MAXSIZE, - G400_AUTO - }; - //G300 G400 纸张类型协议 - OVER -} -namespace setting3288dsp_600dpi -{ - enum G400_PaperSize { - G400_A3 = 0, - G400_A4, - G400_A4R, - G400_A5, - G400_A5R, - G400_A6, - G400_A6R, - G400_B4, - G400_B5, - G400_B5R, - G400_B6, - G400_B6R, - G400_DOUBLELETTER, - G400_LEGAL, - G400_LETTER, - G400_LETTERR, - G400_LONGLETTER, - G400_MAXSIZE, - G400_AUTO, - G400_MAXAUTO - }; -} -namespace setting3399 -{ - enum Scanner_Reg_Defs - { - SR_CMD, - SR_STATUS, - SR_SCAN_COUNT, - SR_OS, //val == 1计数模式 - SR_SENSORS, - SR_MOTOR, - SR_IM_TYPE, - SR_IM_COUNT, - SR_IM_TX, - SR_IM_FRONT_SIZE, - SR_IM_CLEAR, - SR_IM_TXING,//图像数据传输过程中 - SR_IM_POP, - SR_IM_ABORT,//停止传输图像 - SR_COUNT, - SR_CONFIG_SCAN_PARAM, - SR_GET_FWVERSION, - SR_SET_FWERSION, - SR_GET_SERIALNUM, - SR_SET_SERIALNUM, - SR_CONFIF_IMGPROCPARAM, - SC_AUTOCORRECT, - SC_GET_CORRECT_PARAM, - SC_SET_CORRECT_PARAM, - SR_GET_H_RATIO, - SR_SET_H_RATIO, - SR_GET_V_RATIO, - SR_SET_V_RATIO, - SR_GET_SERIAL_LEN, - SR_GET_GRAY_SP, - SR_GET_COLOR_SP, - SR_SET_GRAY_SP, - SR_SET_COLOR_SP, - SR_SET_SLEEPTIME, - SR_GET_SLEEPTIME, - SR_GET_SLEEP_STAUTUS, //返回1不在睡眠状态 0反之 - SR_GET_IMAGEPROCESSDONE,//指设备所有图像处理完成没有 - SR_GET_KEEP_LAST_PAPER, - SR_GET_PAPERON, - SR_SET_SPEEDMODE, - SR_GET_SPEEDMODE, - SR_GET_JSON_SIZE, - SR_GET_JSON, - SR_SET_JSON_PATH, - SR_SET_JSON, - SR_GET_FILE_POS, - SR_SET_FILE_POS, - SR_NOTIFY_SLEEP, - SR_GET_FEEDMODE, - SR_SET_FEEDMODE, - SR_GET_AUTOMATICCONTROLFEEDMODE_ENABLE, - SR_SET_AUTOMATICCONTROLFEEDMODE_ENABLE, - SR_GET_AUTOMATICCONTROLFEEDMODE_THRESHOLD, - SR_SET_AUTOMATICCONTROLFEEDMODE_THRESHOLD, - SR_GET_TRAYPOSITION, - SR_SET_TRAYPOSITION, - - SR_GET_LOCK_STATES, - SR_SET_LOCK_STATES, - SR_GET_TOKEN, - SR_SET_TOKEN, - SR_GET_TOKEN_LENGHT, - SR_DECODE_TOKEN, - SR_CLEAN_PAPER_ROAD, //清理纸道 - SR_GET_CUO_ERROR = 0x50, - SR_GET_DOU_ERROR, - SR_GET_JAM_ERROR, - SR_GET_SCANN_NUM, //历史张数 - SR_CLR_ROLLER_NUM, - SR_GET_ROLLER_NUM, //获取滚轴张数 - SR_CLR_SCANN_NUM, - SR_GET_H_200_RATIO, //非敦南cis需返回false - SR_SET_H_200_RATIO, - SR_GET_V_200_RATIO, - SR_SET_V_200_RATIO, - SR_GET_H_300_RATIO, - SR_SET_H_300_RATIO, - SR_GET_V_300_RATIO, - SR_SET_V_300_RATIO, - SR_GET_H_600_RATIO, - SR_SET_H_600_RATIO, - SR_GET_V_600_RATIO, - SR_SET_V_600_RATIO, - SR_UPDATA_START = 0x100, - SR_UPDATA_STAUTUS = 0x101, - SR_UPDATA_MD5_RELUST = 0x102, - SR_UPDATA_RECOVERY = 0x103, - SR_UPDATA_REBOOT = 0x104, - SR_POWEROFF = 0x105, - SR_REBOOT = 0x106, - SR_FLAT_CLR_MAX_BRIGHT, - SR_FLAT_GRAY_MAX_BRIGHT, - SR_KERNEL_VERSION_INFO_LENGTH, - SR_GET_KERNEL_VERSION, - SR_GET_MBSTATUS, - SR_GET_IPADDR_LENGHT = 0x200, - SR_GET_MACADDR, - SR_GET_IPADDR, - SR_GET_MBVERSION_LENGHT, - SR_GET_MBVERSION, - SR_GET_USBVIDPID, - SR_SET_USBVIDPID, - SR_SET_STARTBACKUP - }; - enum Scanner_Cmd_Defs - { - SC_START, - SC_STOP, - SC_CLEAR, - SC_COUNT - }; - enum HGType - { - MtBoard = 1, - FPGA, - V4L2, - IMG, - AutoCorrect, - STOPSCAN, - }; - struct HGEIntInfo - { - HGType From; - unsigned int Code; - unsigned int Img_Index; - }; - enum PaperSize_ //239 302 402 - { - G400_A3 = 0, - G400_A4, - G400_A4R, - G400_A5, - G400_A5R, - G400_A6, - G400_A6R, - G400_B4, - G400_B5, - G400_B5R, - G400_B6, - G400_B6R, - G400_DOUBLELETTER, - G400_LEGAL, - G400_LETTER, - G400_LETTERR, - G400_LONGLETTER = 16, - G400_MAXSIZE = 16, - G400_AUTO = 16, - G400_MAXAUTO = 16 - }; - - - //#define SAVE_TO_FILE - -} -#pragma pack(pop) - - static struct Paper_Map - { - int paper; - TwSS type; - int dev_value; - }paper_map_3399[] = - { - {PAPER_A3, TwSS::A3, setting3399::G400_A3}, - {PAPER_8K, TwSS::K8, 0}, - {PAPER_A4, TwSS::A4, setting3399::G400_A4}, - {PAPER_A4_LATERAL, TwSS::A4, setting3399::G400_A4R}, - {PAPER_16K, TwSS::K16, 0}, - {PAPER_16K_LATERAL, TwSS::K16, 0}, - {PAPER_A5, TwSS::A5, setting3399::G400_A5}, - {PAPER_A5_LATERAL, TwSS::A5, setting3399::G400_A5R}, - {PAPER_A6, TwSS::A6, setting3399::G400_A6}, - {PAPER_A6_LATERAL, TwSS::A6, setting3399::G400_A6R}, - {PAPER_B4, TwSS::B4, setting3399::G400_B4}, - {PAPER_B5, TwSS::B5, setting3399::G400_B5}, - {PAPER_B5_LATERAL, TwSS::B5, setting3399::G400_B5R}, - {PAPER_B6, TwSS::B6, setting3399::G400_B6}, - {PAPER_B6_LATERAL, TwSS::B6, setting3399::G400_B6R}, - {PAPER_LETTER, TwSS::USLetter, setting3399::G400_LETTER}, - {PAPER_LETTER_LATERAL, TwSS::USLetter, setting3399::G400_LETTERR}, - {PAPER_DOUBLE_LETTER, TwSS::USLedger, setting3399::G400_DOUBLELETTER}, - {PAPER_LEGAL, TwSS::USLegal, setting3399::G400_LEGAL}, - {PAPER_AUTO_MATCH, TwSS::None, 0}, //重影版本发布之后 需要变更为G400_MAXAUTO ,3C 以前发12 - {PAPER_MAX_SIZE_CLIP, TwSS::USStatement, setting3399::G400_MAXAUTO}, - {PAPER_MAX_SIZE, TwSS::MaxSize, setting3399::G400_MAXSIZE}, - {PAPER_TRIGEMINY, TwSS::Trigeminy, setting3399::G400_LONGLETTER} - }, - paper_map_dsp[] = - { - {PAPER_A3, TwSS::A3, 0}, - {PAPER_8K, TwSS::K8, 0}, - {PAPER_A4, TwSS::A4, 1}, - {PAPER_A4_LATERAL, TwSS::A4, 2}, - {PAPER_16K, TwSS::K16, 0}, - {PAPER_16K_LATERAL, TwSS::K16, 0}, - {PAPER_A5, TwSS::A5, 2}, - {PAPER_A5_LATERAL, TwSS::A5, 2}, - {PAPER_A6, TwSS::A6, 2}, - {PAPER_A6_LATERAL, TwSS::A6, 2}, - {PAPER_B4, TwSS::B4, 0}, - {PAPER_B5, TwSS::B5, 0}, - {PAPER_B5_LATERAL, TwSS::B5, 1}, - {PAPER_B6, TwSS::B6, 2}, - {PAPER_B6_LATERAL, TwSS::B6, 2}, - {PAPER_LETTER, TwSS::USLetter, 14}, - {PAPER_LETTER_LATERAL, TwSS::USLetter, 1}, - {PAPER_DOUBLE_LETTER, TwSS::USLedger, 2}, - {PAPER_LEGAL, TwSS::USLegal, 0}, - {PAPER_AUTO_MATCH, TwSS::None, 0}, - {PAPER_MAX_SIZE_CLIP, TwSS::USStatement, 16}, - {PAPER_MAX_SIZE, TwSS::MaxSize, 16}, - {PAPER_TRIGEMINY, TwSS::Trigeminy, 16} - }, - paper_map_3288[] = - { - {PAPER_A3, TwSS::A3, setting3288dsp::G400_A3}, - {PAPER_A4, TwSS::A4, setting3288dsp::G400_A4}, - {PAPER_A4_LATERAL, TwSS::A4, setting3288dsp::G400_A4R}, - {PAPER_A5, TwSS::A5, setting3288dsp::G400_A5}, - {PAPER_A5_LATERAL, TwSS::A5, setting3288dsp::G400_A5R}, - {PAPER_A6, TwSS::A6, setting3288dsp::G400_A6}, - {PAPER_A6_LATERAL, TwSS::A6, setting3288dsp::G400_A6R}, - {PAPER_B4, TwSS::B4, setting3288dsp::G400_B4}, - {PAPER_B5, TwSS::B5, setting3288dsp::G400_B5}, - {PAPER_B5_LATERAL, TwSS::B5, setting3288dsp::G400_B5R}, - {PAPER_B6, TwSS::B6, setting3288dsp::G400_B6}, - {PAPER_B6_LATERAL, TwSS::B6, setting3288dsp::G400_B6R}, - {PAPER_LETTER, TwSS::USLetter, setting3288dsp::G400_LETTER}, - {PAPER_LETTER_LATERAL, TwSS::USLetter, setting3288dsp::G400_LETTERR}, - {PAPER_DOUBLE_LETTER, TwSS::USLedger, setting3288dsp::G400_DOUBLELETTER}, - {PAPER_LEGAL, TwSS::USLegal, setting3288dsp::G400_LEGAL}, - {PAPER_AUTO_MATCH, TwSS::None, setting3288dsp::G400_A3}, - {PAPER_MAX_SIZE_CLIP, TwSS::USStatement, setting3288dsp::G400_MAXSIZE}, - {PAPER_MAX_SIZE, TwSS::MaxSize, setting3288dsp::G400_MAXSIZE}, - {PAPER_TRIGEMINY, TwSS::MaxSize, setting3288dsp::G400_LONGLETTER}, - }, - paper_map_3288_600dpi[] = - { - {PAPER_A3, TwSS::A3, setting3288dsp_600dpi::G400_A3}, - {PAPER_A4, TwSS::A4, setting3288dsp_600dpi::G400_A4}, - {PAPER_A4_LATERAL, TwSS::A4, setting3288dsp_600dpi::G400_A4R}, - {PAPER_A5, TwSS::A5, setting3288dsp_600dpi::G400_A5}, - {PAPER_A5_LATERAL, TwSS::A5, setting3288dsp_600dpi::G400_A5R}, - {PAPER_A6, TwSS::A6, setting3288dsp_600dpi::G400_A6}, - {PAPER_A6_LATERAL, TwSS::A6, setting3288dsp_600dpi::G400_A6R}, - {PAPER_B4, TwSS::B4, setting3288dsp_600dpi::G400_B4}, - {PAPER_B5, TwSS::B5, setting3288dsp_600dpi::G400_B5}, - {PAPER_B5_LATERAL, TwSS::B5, setting3288dsp_600dpi::G400_B5R}, - {PAPER_B6, TwSS::B6, setting3288dsp_600dpi::G400_B6}, - {PAPER_B6_LATERAL, TwSS::B6, setting3288dsp_600dpi::G400_B6R}, - {PAPER_LETTER, TwSS::USLetter, setting3288dsp_600dpi::G400_LETTER}, - {PAPER_LETTER_LATERAL, TwSS::USLetter, setting3288dsp_600dpi::G400_LETTERR}, - {PAPER_DOUBLE_LETTER, TwSS::USLedger, setting3288dsp_600dpi::G400_DOUBLELETTER}, - {PAPER_LEGAL, TwSS::USLegal, setting3288dsp_600dpi::G400_LEGAL}, - {PAPER_AUTO_MATCH, TwSS::None, setting3288dsp_600dpi::G400_AUTO}, - {PAPER_MAX_SIZE_CLIP, TwSS::USStatement, setting3288dsp_600dpi::G400_MAXAUTO}, - {PAPER_MAX_SIZE, TwSS::MaxSize, setting3288dsp_600dpi::G400_MAXSIZE}, - {PAPER_TRIGEMINY, TwSS::MaxSize, setting3288dsp_600dpi::G400_LONGLETTER}, - }; - - diff --git a/hgdriver/hgdev/filetools.h b/hgdriver/hgdev/filetools.h deleted file mode 100644 index d373c71..0000000 --- a/hgdriver/hgdev/filetools.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef FILE_TOOLS_H -#define FILE_TOOLS_H - -#if defined(WIN32) || defined(_WIN64) -#include -#include -#include -#include - -class FileTools -{ -public: - static std::vector getFiles(std::string path) - { - std::vector files; - getFiles(path, files); - return files; - } - - static void write_log(std::string filename, std::string log) - { - std::string savepath; - std::string str = "D:"; - savepath = str+"\\"+filename; - std::ofstream ofs(savepath, std::ios::app); - - time_t timp; - struct tm* p; - time(&timp); - p=localtime(&timp); - ofs << p->tm_year << "/" << p->tm_mon << "/" << p->tm_mday << " " << p->tm_hour << ":" << p->tm_min << ":" << p->tm_sec << " "<& files) - { - //ļ - long hFile = 0; - //ļϢ - struct _finddata_t fileinfo; - std::string p; - if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo))!=-1) - { - do - { - //Ŀ¼,֮ - //,б - if ((fileinfo.attrib & _A_SUBDIR)) - { - if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) - getFiles(p.assign(path).append("\\").append(fileinfo.name), files); - } - else - { - files.push_back(p.assign(path).append("\\").append(fileinfo.name)); - } - } while (_findnext(hFile, &fileinfo) == 0); - _findclose(hFile); - } - } - -}; -#endif - -#endif \ No newline at end of file diff --git a/hgdriver/hgdev/hg_ipc.cpp b/hgdriver/hgdev/hg_ipc.cpp deleted file mode 100644 index f9c6e79..0000000 --- a/hgdriver/hgdev/hg_ipc.cpp +++ /dev/null @@ -1,891 +0,0 @@ -#include "hg_ipc.h" - -#include "huagao/hgscanner_error.h" -#include "../../sdk/hginclude/utils.h" - -#if defined(WIN32) || defined(_WIN64) -//#include "scanner_manager.h" -#else -#include -#include -#include -#include -#include -#endif - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// memory management ... -void* allocate_memory(size_t bytes, const char* log_msg) -{ - bytes += 7; - bytes /= 8; - bytes *= 8; - - return new char[bytes]; -} -void free_memory(void* ptr) -{ - if (ptr) - delete[] ptr; -} - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// windows event ... -#if defined(WIN32) || defined(_WIN64) -int __stdcall sem_init(sem_t* handle, int, int) -{ - if (!handle) - { - errno = EINVAL; - return -1; - } - - *handle = CreateEvent(NULL, TRUE, FALSE, NULL); - if (*handle) - return 0; - else - { - errno = GetLastError(); - - return -1; - } -} -void __stdcall sem_destroy(sem_t* handle) -{ - if (*handle) - { - CloseHandle(*handle); - *handle = NULL; - } -} -int __stdcall sem_trywait(sem_t* handle) -{ - return WaitForSingleObject(*handle, 1) == WAIT_TIMEOUT ? -1 : 0; -} -void __stdcall sem_wait(sem_t* handle) -{ - if(WaitForSingleObject(*handle, INFINITE) == WAIT_OBJECT_0) - ResetEvent(*handle); -} -int __stdcall sem_timedwait(sem_t* handle, struct timespec* to) -{ - DWORD elapse = to->tv_sec * 1000; - elapse += to->tv_nsec / (1000 * 1000); - - int ret = WaitForSingleObject(*handle, elapse) == WAIT_TIMEOUT ? -1 : 0; - - if(ret == 0) - ResetEvent(*handle); - - return ret; -} -void __stdcall sem_post(sem_t* handle) -{ - SetEvent(*handle); -} - -#define pid_t int - -#endif - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// platform_event (base on semaphore) -platform_event::platform_event() : waiting_(false), dbg_info_("") -{ - int err = sem_init(&sem_, 0, 0); - - if (err == -1) - { - err = errno; - utils::to_log(LOG_LEVEL_FATAL, "(%p)sem_init failed: %d\n", this, err); - } -} -platform_event::~platform_event() -{ - sem_destroy(&sem_); -} - -bool platform_event::try_wait(void) -{ - return sem_trywait(&sem_) == 0; -} -bool platform_event::wait(unsigned timeout) -{ - bool waited = true; - - utils::to_log(LOG_LEVEL_DEBUG, "platform_event(%p - %s) --> waiting...\n", this, dbg_info_.c_str()); - waiting_ = true; - if (timeout == USB_TIMEOUT_INFINITE) - sem_wait(&sem_); - else - { - struct timespec to; - to.tv_sec = timeout / 1000; - to.tv_nsec = (long)((timeout % 1000) * 1000 * 1000); - waited = sem_timedwait(&sem_, &to) == 0; - } - utils::to_log(LOG_LEVEL_DEBUG, "platform_event(%p - %s) --> %s.\n", this, dbg_info_.c_str(), waited ? "waited" : "wait timeout"); - waiting_ = false; - - return waited; -} -void platform_event::notify(void) -{ - sem_post(&sem_); -} -bool platform_event::is_waiting(void) -{ - return waiting_; -} -void platform_event::set_debug_info(const char* info) -{ - dbg_info_ = info ? info : ""; -} - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// shared_memory -shared_memory::shared_memory(unsigned long long key, size_t size) : key_(key), obj_((void*)-1), first_(true), bytes_(size), len_(0) -{ - unsigned int* ptr = (unsigned int*)&key_; - utils::to_log(LOG_LEVEL_DEBUG, "shared memory key = 0x%x%08x\n", ptr[1], ptr[0]); - - init(); -} -shared_memory::~shared_memory() -{ - clear(); -} - -void shared_memory::init(void) -{ -#if defined(WIN32) || defined(_WIN64) - char name[40] = { 0 }; - DWORD* key = (DWORD*)&key_; - HANDLE h = NULL; - - sprintf(name, "scanner_0x%08x-%08x", key[1], key[0]); - h = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, bytes_, name); - if (h == NULL) - return; - - first_ = !(GetLastError() == ERROR_ALREADY_EXISTS); - obj_ = (void*)h; -#else - int obj = shmget(key_, bytes_, IPC_EXCL | IPC_CREAT | 0666); - if (obj < 0) - { - unsigned int* v = (unsigned int*)&key_; - if (errno == EEXIST) - { - first_ = false; - obj = shmget(key_, bytes_, 0600); - if(obj == -1) - obj = shmget(key_, bytes_, 0); - utils::to_log(LOG_LEVEL_DEBUG, "open existing: shmget(0x%x%08x) = %d\n", v[1], v[0], obj); - obj_ = (void*)obj; - - std::string prev(read()), proc(""); - utils::to_log(LOG_LEVEL_DEBUG, "shared memory content: %s\n", prev.c_str()); - if(prev.length()) - { - proc = prev; - size_t pos = proc.find("pid: "); - if (pos != std::string::npos) - proc.erase(0, pos + 5); - pos = proc.find(")"); - if (pos != std::string::npos) - proc.erase(pos); - proc = shared_memory::get_proc_name_by_pid(atoi(proc.c_str())); - if (proc.length()) - { - pos = prev.find("("); - if (pos == std::string::npos) - pos = prev.length(); - if (strcasecmp(proc.c_str(), prev.substr(0, pos).c_str())) - proc = ""; - } - } - if (proc.empty()) - { - first_ = true; - clear(); - obj = shmget(key_, bytes_, IPC_EXCL | IPC_CREAT | 0600); - utils::to_log(LOG_LEVEL_DEBUG, "%s is not existing and reopen it\n", prev.c_str()); - } - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "shmget(0x%x%08x) = %d\n", v[1], v[0], errno); - return; - } - } - obj_ = (void*)obj; - utils::to_log(LOG_LEVEL_DEBUG, "shared memory id = %d[%s], \n", obj, first_ ? "created" : "opened"); -#endif - - if(first_) - { - pid_t pid = getpid(); - std::string me(utils::get_module_full_path()); - char buf[40] = { 0 }; - unsigned int* pn = (unsigned int*)&pid; - - if (sizeof(pid) > 4 && pn[1]) - sprintf(buf, "(pid: 0x%x%08x)", pn[1], pn[0]); - else - sprintf(buf, "(pid: %u)", pn[0]); - - size_t pos = me.rfind(PATH_SEPARATOR[0]); - if(pos++ != std::string::npos) - me.erase(0, pos); - me += buf; - write(me.c_str(), me.length()); - } -} -void shared_memory::clear(void) -{ - if (obj_ != (void*)-1) -#if defined(WIN32) || defined(_WIN64) - CloseHandle((HANDLE)obj_); -#else - { - if (first_) - { - struct shmid_ds ds = { 0 }; - int* h = (int*)&obj_; - shmctl(*h, IPC_RMID, &ds); - } - } -#endif - - obj_ = (void*)-1; -} -char* shared_memory::get_buf(void) -{ -#if defined(WIN32) || defined(_WIN64) - char* buf = (char*)MapViewOfFile((HANDLE)obj_, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); - if (!buf) - buf = (char*)-1; -#else - int* h = (int*)&obj_; - char* buf = (char*)shmat(*h, 0, 0); - utils::to_log(LOG_LEVEL_DEBUG, "shared memory %d buffer = %p, error = %d\n", *h, buf, errno); -#endif - - return buf; -} -void shared_memory::release_buf(void* buf) -{ -#if defined(WIN32) || defined(_WIN64) - UnmapViewOfFile(buf); -#else - shmdt(buf); -#endif -} - -#if !defined(WIN32) && !defined(_WIN64) -std::string shared_memory::get_proc_name_by_pid(pid_t pid) -{ - char path[512] = { 0 }; - unsigned int* v = (unsigned int*)&pid; - std::string ret(""); - - if (sizeof(pid) > 4 && v[1]) - sprintf(path, "/proc/%lld/status", pid); - else - sprintf(path, "/proc/%u/status", pid); - - FILE* src = fopen(path, "rb"); - if (src) - { - char val[512] = { 0 }; - - memset(path, 0, sizeof(path)); - fgets(path, sizeof(path) - 1, src); - fclose(src); - sscanf(path, "%*s %s", val); - ret = val; - } - if (sizeof(pid) > 4 && v[1]) - { - utils::to_log(LOG_LEVEL_DEBUG, "PID(%lld) name is: %s\n", pid, ret.c_str()); - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "PID(%u) name is: %s\n", pid, ret.c_str()); - } - - return ret; -} -#endif - -bool shared_memory::is_ok(void) -{ - return obj_ != (void*)-1; -} -bool shared_memory::is_first(void) -{ - return is_ok() && first_; -} -std::string shared_memory::read(void) -{ - if (obj_ == (void*)-1) - return ""; - - char* buf = get_buf(); - if (buf == (char*)-1) - return ""; - - std::string ret(""); - size_t len = 0; - int off = 4; // sizeof(size_t); - - memcpy(&len, buf, off); - ret = std::string(buf + off, len); - release_buf(buf); - - return ret; -} -int shared_memory::write(const char* data, size_t len) -{ - if (len > bytes_) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - - char* buf = get_buf(); - int off = 4; // sizeof(len); - if (buf == (char*)-1) - return errno; - - memcpy(buf, &len, off); - memcpy(buf + off, data, len); - len_ = len; - release_buf(buf); - - return 0; -} - - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// tiny_file_map ... -tiny_file_map::tiny_file_map() : size_(0), map_(INVALID_HANDLE_NAME), buf_(nullptr), file_(""), keep_f_(false) - , map_off_(0), map_bytes_(0), page_size_(utils::get_page_size()) -{ - utils::get_page_size(&page_size_); -} -tiny_file_map::~tiny_file_map() -{ - close(); -} - -HANDLE_NAME tiny_file_map::open_file_for_mapping(const char* file, unsigned* bytes, bool create) -{ - HANDLE_NAME ret = INVALID_HANDLE_NAME; - -#if defined(WIN32) || defined(_WIN64) - HANDLE f = INVALID_HANDLE_VALUE; - if (create) - { - f = CreateFileA(file, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (f != INVALID_HANDLE_VALUE) - { - DWORD wrote = SetFilePointer(f, *bytes - 1, NULL, FILE_BEGIN); - if (wrote != *bytes - 1 || !WriteFile(f, "\0", 1, &wrote, NULL)) - { - CloseHandle(f); - f = INVALID_HANDLE_VALUE; - } - } - } - else - { - f = CreateFileA(file, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (f != INVALID_HANDLE_VALUE) - *bytes = GetFileSize(f, NULL); - } - if (f != INVALID_HANDLE_VALUE) - { - ret = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, *bytes, NULL); - CloseHandle(f); - } -#else - if (create) - { - ret = ::open(file, O_CREAT | O_RDWR,0777); - if (ret != INVALID_HANDLE_NAME) - { - if (lseek(ret, *bytes - 1, SEEK_SET) < 0) - { - utils::to_log(LOG_LEVEL_DEBUG, "set file size to %u - 1 bytes failed: %d\n", *bytes, errno); - ::close(ret); - remove(file); - ret = INVALID_HANDLE_NAME; - } - if (write(ret, "0", 1) < 0) - { - utils::to_log(LOG_LEVEL_DEBUG, "set file size to %u bytes failed: %d\n", *bytes, errno); - ::close(ret); - remove(file); - ret = INVALID_HANDLE_NAME; - } - } - } - else - { - ret = ::open(file, O_RDWR); - if (ret != INVALID_HANDLE_NAME) - { - struct stat fsize; - if (fstat(ret, &fsize) >= 0) - *bytes = fsize.st_size; - } - } -#endif - - return ret; -} -void tiny_file_map::close_handle_name(HANDLE_NAME h) -{ -#if defined(WIN32) || defined(_WIN64) - CloseHandle(h); -#else - ::close(h); -#endif -} -void* tiny_file_map::sys_map_api(HANDLE_NAME h, int access, unsigned int off, unsigned size, int* err) -{ - void* mem = nullptr; - -#if defined(WIN32) || defined(_WIN64) - mem = MapViewOfFile(h, access, 0, off, size); - if (err) - { - if (mem) - *err = SCANNER_ERR_OK; - else - { - if (GetLastError() == ERROR_NOT_ENOUGH_MEMORY) - *err = SCANNER_ERR_INSUFFICIENT_MEMORY; - else - *err = SCANNER_ERR_OUT_OF_RANGE; - } - } -#else - mem = mmap(nullptr, size, access, MAP_SHARED, h, off); - if (mem == MAP_FAILED) - { - mem = nullptr; - if (errno == ENOMEM) - *err = SCANNER_ERR_INSUFFICIENT_MEMORY; - else - *err = SCANNER_ERR_OUT_OF_RANGE; - } - else if(err) - *err = SCANNER_ERR_OK; -#endif - - return mem; -} -void tiny_file_map::sys_unmap_api(void* buf, size_t size) -{ -#if defined(WIN32) || defined(_WIN64) - UnmapViewOfFile(buf); -#else - munmap(buf, size); -#endif -} - -int tiny_file_map::map_to_mem(unsigned int off) -{ - int err = SCANNER_ERR_OUT_OF_RANGE; - -#if defined(WIN32) || defined(_WIN64) - int acc = FILE_MAP_READ | FILE_MAP_WRITE; -#else - int acc = PROT_READ | PROT_WRITE; -#endif - if (off < size_) - { - unsigned int bytes = size_ - off; - if (off >= map_off_ && off + bytes <= map_off_ + map_bytes_) - err = SCANNER_ERR_OK; - else - { - if (buf_) - tiny_file_map::sys_unmap_api(buf_, map_bytes_); - off /= page_size_; - off *= page_size_; - map_bytes_ = bytes; - map_off_ = off; - buf_ = (unsigned char*)tiny_file_map::sys_map_api(map_, acc, map_off_, map_bytes_, &err); // MapViewOfFile(map_, FILE_MAP_READ | FILE_MAP_WRITE, 0, off, map_bytes_); - if (err != SCANNER_ERR_OK) - { - map_bytes_ /= page_size_; - map_bytes_ *= page_size_; - while (map_bytes_ >= page_size_ - && !(buf_ = (unsigned char*)tiny_file_map::sys_map_api(map_, acc, map_off_, map_bytes_, &err)) - && err == SCANNER_ERR_INSUFFICIENT_MEMORY) - map_bytes_ -= page_size_; - } - } - } - - return err; -} - -int tiny_file_map::open(const char* file, bool existing, unsigned int size) -{ - int ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - - close(); - map_ = tiny_file_map::open_file_for_mapping(file, &size, !existing); - if (map_ != INVALID_HANDLE_NAME) - { - ret = SCANNER_ERR_OK; - size_ = size; - } - - utils::to_log(LOG_LEVEL_DEBUG, "map([%s]%s) = %d\n", existing ? "existing" : "new", file, ret); - if (ret == SCANNER_ERR_OK) - file_ = file; - - return ret; -} -void tiny_file_map::close(void) -{ - if (buf_) - { - tiny_file_map::sys_unmap_api(buf_, size_); - buf_ = nullptr; - } - if (map_ != INVALID_HANDLE_NAME) - { - close_handle_name(map_); - map_ = INVALID_HANDLE_NAME; - } - if (!keep_f_ && !file_.empty()) - remove(file_.c_str()); - - size_ = 0; - file_ = ""; - keep_f_ = false; - map_off_ = map_bytes_ = 0; -} -void tiny_file_map::keep_file(bool keep) -{ - keep_f_ = keep; -} -unsigned char* tiny_file_map::mapping_buffer(unsigned int off, unsigned int* bytes) -{ - unsigned int len = bytes ? *bytes : size_; - unsigned char* buf = nullptr; - - if (off >= size_) - { - return buf; - } - if (!buf_ && map_to_mem(off) != SCANNER_ERR_OK) - { - return buf; - } - - if (off >= map_off_ && off + len <= map_off_ + map_bytes_) - { - buf = buf_ + off - map_off_; - - return buf; - } - - if (off < map_off_ || off >= map_off_ + map_bytes_) - { - if (map_to_mem(off) == SCANNER_ERR_OK) - { - buf = buf_ + off - map_off_; - if (bytes) - *bytes = map_bytes_ - (off - map_off_); - } - - return buf; - } - - // - buf = buf_ + off - map_off_; - if (bytes) - *bytes = map_bytes_ - (off - map_off_); - - return buf; -} -std::string tiny_file_map::file(void) -{ - return file_; -} -unsigned int tiny_file_map::size(void) -{ - return size_; -} - -bool tiny_file_map::swap(void) -{ - bool ret = true; - - tiny_file_map::sys_unmap_api(buf_, size_); - buf_ = nullptr; - - return ret; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// memory or file mapping ... -tiny_buffer::tiny_buffer(unsigned int size - , const char* tmp_path - , const char* name_leading - , const char* ext - , unsigned int uniq_id) - : size_(size), buf_(nullptr), img_statu_(IMG_STATUS_OK) -{ - init(tmp_path, name_leading, ext, uniq_id); -} -tiny_buffer::tiny_buffer(const char* src_file) : size_(0), buf_(nullptr) -{ - fmap_.open(src_file); - size_ = fmap_.size(); - - unsigned int len = size_; - buf_ = fmap_.mapping_buffer(0, &len); -} -tiny_buffer::~tiny_buffer() -{ - if (buf_) - { - if (fmap_.file().empty()) - delete[] buf_; - else - fmap_.close(); - } -} - -void tiny_buffer::init(const char* tmp_path, const char* name_leading, const char* ext, unsigned int uniq_id) -{ - try - { - buf_ = new unsigned char[size_]; - memset(buf_, 0, size_); - } - catch (...) - { - if (tmp_path && *tmp_path) - { - std::string f(tmp_path); - char buf[128] = { 0 }; - - f += PATH_SEPARATOR; - f += name_leading ? name_leading : "mapf"; - sprintf(buf, "_%05u.%s", uniq_id, ext ? ext : "tmp"); - f += buf; - - unsigned int bytes = size_; - fmap_.open(f.c_str(), false, size_); - buf_ = fmap_.mapping_buffer(0, &bytes); - } - } -} - -unsigned int tiny_buffer::size(void) -{ - return size_; -} -unsigned char* tiny_buffer::data(unsigned int off, unsigned int* bytes) -{ - if (off >= size_) - return nullptr; - - if (fmap_.file().empty()) - { - if (size_ - off < *bytes) - *bytes = size_ - off; - - return buf_ + off; - } - - return fmap_.mapping_buffer(off, bytes); -} -void tiny_buffer::keep_file(bool keep) -{ - fmap_.keep_file(keep); -} -std::string tiny_buffer::file(void) -{ - return fmap_.file(); -} - -bool tiny_buffer::swap(void) -{ - if (fmap_.file().empty()) - return true; - - bool ret = fmap_.swap(); - unsigned int bytes = size_; - - buf_ = fmap_.mapping_buffer(0, &bytes); - - return ret; -} -int tiny_buffer::to_file(const char* file) -{ - FILE* dst = fopen(file, "wb"); - - if (!dst) - return errno; - - unsigned int off = 0, len = size_; - unsigned char* buf = data(off, &len); - while (buf) - { - fwrite(buf, 1, len, dst); - off += len; - if (off >= size_) - break; - len = size_ - off; - buf = data(off, &len); - } - fclose(dst); - - return 0; -} - -void tiny_buffer::set_image_statu(int statu) -{ - img_statu_ = statu; -} -int tiny_buffer::get_image_statu(void) -{ - return img_statu_; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// final_img_queue - -final_img_queue::final_img_queue() : mem_usage_(0) -{} -final_img_queue::~final_img_queue() -{} - -unsigned long long final_img_queue::mem_usage(void) -{ - return mem_usage_; -} -size_t final_img_queue::size(void) -{ - std::lock_guard lck(lock_); - - return queue_.size(); -} -void final_img_queue::clear(void) -{ - std::lock_guard lck(lock_); - - mem_usage_ = 0; - queue_.clear(); -} -bool final_img_queue::put(int w, int h, int bpp, int channels, int line_bytes, void* data, unsigned bytes - , const char* tmp_path, const char* name_leading, const char* ext, int ind, uint32_t id) -{ - IMGDT imgd; - bool ret = false; - unsigned int l = bytes, off = 0; - - imgd.header.bits = bpp; - imgd.header.bytes = bytes; - imgd.header.channels = channels; - imgd.header.height = h; - imgd.header.line_bytes = line_bytes; - imgd.header.width = w; - imgd.header.src_id = id; - imgd.offset = 0; - imgd.data.reset(new tiny_buffer(bytes, tmp_path, name_leading, ext, ind)); - - unsigned char* buf = imgd.data->data(off, &l), - * src = (unsigned char*)data; - while(buf) - { - memcpy(buf, src, l); - off += l; - if (off >= bytes) - break; - - src += l; - l = bytes - off; - buf = imgd.data->data(off, &l); - } - if (off >= bytes && imgd.data->swap()) - { - std::lock_guard lck(lock_); - queue_.push_back(imgd); - mem_usage_ += bytes; - ret = true; - } - else - imgd.data.reset(); - - return ret; -} -bool final_img_queue::front(IMH* header) -{ - std::lock_guard lck(lock_); - if (queue_.size() == 0) - return false; - - memcpy(header, &queue_[0].header, sizeof(*header)); - - return true; -} -void final_img_queue::fetch_front(void* buf, int* len, bool* over) -{ - std::lock_guard lck(lock_); - - if (queue_.size() == 0) - { - if(len) - *len = 0; - if(over) - *over = true; - } - else - { - // for third-apps, we make fake data upto len when re-map file failed here - IMGDT& imgd = queue_[0]; - - if (imgd.offset == 0) - { - if (!imgd.data->swap()) - { - utils::to_log(LOG_LEVEL_FATAL, "Reload final image '%s' failed!\n", imgd.data->file().c_str()); - } - } - - if (imgd.offset + *len >= imgd.header.bytes) - *len = imgd.header.bytes - imgd.offset; - - unsigned char* src = imgd.data->data(imgd.offset, (unsigned int*)len); - if (src) - { - memcpy(buf, src, *len); - } - else - { - utils::to_log(LOG_LEVEL_FATAL, "Remap final image '%s + 0x%08x' failed!\n", imgd.data->file().c_str(), imgd.offset); - } - imgd.offset += *len; - if (imgd.offset >= imgd.header.bytes) - { - mem_usage_ -= imgd.header.bytes; - if (mem_usage_ < 0) - mem_usage_ = 0; - if (over) - *over = true; - queue_.erase(queue_.begin()); - } - } -} diff --git a/hgdriver/hgdev/hg_ipc.h b/hgdriver/hgdev/hg_ipc.h deleted file mode 100644 index ebb3411..0000000 --- a/hgdriver/hgdev/hg_ipc.h +++ /dev/null @@ -1,212 +0,0 @@ -#pragma once - -// Objects for Inter-Process-Communication -// -// created on 2022-03-01 -// - -#if defined(WIN32) || defined(_WIN64) -#include - -#define sem_t HANDLE -#define USB_TIMEOUT_INFINITE -1 -#else -#include -#include -#include -#include -#define USB_TIMEOUT_INFINITE 0 -#endif - -#include -#include -#include -#include - - -#include - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// memory management ... -void* allocate_memory(size_t bytes, const char* log_msg = ""); -void free_memory(void* ptr); - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class platform_event -{ - sem_t sem_; - volatile bool waiting_; - std::string dbg_info_; - -public: - platform_event(); - ~platform_event(); - -public: - bool try_wait(void); - bool wait(unsigned timeout = USB_TIMEOUT_INFINITE/*ms*/); // USB_TIMEOUT_INFINITE is waiting unfinite, true when watied and false for wait timeout - void notify(void); - bool is_waiting(void); - - void set_debug_info(const char* info); -}; - -template -class do_when_born_and_dead : public refer -{ - T* obj_; - void(T::* dead_)(void*); - void* param_; - -public: - do_when_born_and_dead(T* obj, void(T::* born)(void*), void(T::* dead)(void*), void* param) - : obj_(obj), dead_(dead), param_(param) - { - if(born) - (obj_->*born)(param_); - } - -protected: - ~do_when_born_and_dead() - { - (obj_->*dead_)(param_); - } -}; - -// mutex object -class shared_memory : public refer -{ - unsigned long long key_; - void* obj_; - bool first_; - size_t bytes_; - size_t len_; - - void init(void); - void clear(void); - char* get_buf(void); - void release_buf(void* buf); - -#if !defined(WIN32) && !defined(_WIN64) - static std::string get_proc_name_by_pid(pid_t pid); -#endif - -public: - shared_memory(unsigned long long key, size_t size = 1024); - -protected: - ~shared_memory(); - -public: - bool is_ok(void); - bool is_first(void); - std::string read(void); - int write(const char* data, size_t len); -}; - -// buffer -#if defined(WIN32) || defined(_WIN64) -#define HANDLE_NAME HANDLE -#define INVALID_HANDLE_NAME NULL -#else -#define HANDLE_NAME int -#define INVALID_HANDLE_NAME -1 -#endif -class tiny_file_map -{ - unsigned int size_; - unsigned int page_size_; - HANDLE_NAME map_; - unsigned char *buf_; - std::string file_; - bool keep_f_; - unsigned int map_off_; - unsigned int map_bytes_; - - int map_to_mem(unsigned int off = 0); - -public: - tiny_file_map(); - ~tiny_file_map(); - - static HANDLE_NAME open_file_for_mapping(const char* file, unsigned* bytes, bool create); - static void close_handle_name(HANDLE_NAME h); - static void* sys_map_api(HANDLE_NAME h, int access, unsigned int off, unsigned size, int* err); - static void sys_unmap_api(void* buf, size_t size = 0); - -public: - int open(const char* file, bool existing = true, unsigned int size = 0); - void close(void); - void keep_file(bool keep); - unsigned char* mapping_buffer(unsigned int off, unsigned int* bytes); - std::string file(void); - unsigned int size(void); - - // mapping if unmapped; or unmapping if mapped - bool swap(void); -}; -class tiny_buffer -{ - unsigned int size_; - unsigned char *buf_; - tiny_file_map fmap_; - int img_statu_; - - void init(const char* tmp_path, const char* name_leading, const char* ext, unsigned int uniq_id); - -public: - tiny_buffer(unsigned int size, const char* tmp_path, const char* name_leading, const char* ext, unsigned int uniq_id); - tiny_buffer(const char* src_file); - ~tiny_buffer(); - -public: - unsigned int size(void); - unsigned char* data(unsigned int off, unsigned int* bytes/*[in] - need bytes, [out] - real bytes*/); - void keep_file(bool keep); - std::string file(void); - - // mapping if unmapped; or unmapping if mapped - bool swap(void); - int to_file(const char* file); - - void set_image_statu(int statu); - int get_image_statu(void); -}; - -typedef struct _img_header -{ - int width; - int height; - int bits; - int channels; - int line_bytes; - int statu; // SANE_Image_Statu - unsigned bytes; - uint32_t src_id; -}IMH; -typedef struct _img -{ - IMH header; - unsigned offset; - std::shared_ptr data; -}IMGDT; -class final_img_queue -{ - mutable std::mutex lock_; - std::vector queue_; - long long mem_usage_; - -public: - final_img_queue(); - ~final_img_queue(); - -public: - unsigned long long mem_usage(void); - size_t size(void); - void clear(void); - bool put(int w, int h, int bpp, int channels, int line_bytes, void* data, unsigned bytes - , const char* tmp_path, const char* name_leading, const char* ext, int ind, uint32_t id); - bool front(IMH* header); - void fetch_front(void* buf, int* len, bool* over); -}; \ No newline at end of file diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index 81e46e4..0364c6c 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -1,4363 +1,311 @@ -#include "hg_scanner.h" +#include "hg_scanner.h" + -#include "../../sdk/hginclude/utils.h" -#include -#include "sane/sane_option_definitions.h" -#include "scanner_setting.h" #include "scanner_manager.h" -#include "../../sdk/json/gb_json.h" #include -#include #include - -#if defined(WIN32) || defined(_WIN64) -#include -#endif +#include +#include "./scanner/scanner_handler.h" +#include "user-opt/user.h" -#if defined(WIN32) || defined(_WIN64) -static int load_dll(const wchar_t* path_dll, HMODULE* dll) + + + + + + + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// img_receiver +img_receiver::img_receiver(LPPACKIMAGE head, size_t info_size, size_t size, std::function complete_routine, uint32_t id) + : id_(id), head_(*head), info_size_(info_size) + , size_(size), finish_(complete_routine) { - - HMODULE h = LoadLibraryW(path_dll); - int ret = GetLastError(); - wchar_t info[128] = { 0 }; - - swprintf_s(info, _countof(info) - 1, L" = %d\r\n", ret); - OutputDebugStringW((L"[TWAIN]Load: " + std::wstring(path_dll) + info).c_str()); - if (!h && ret == ERROR_MOD_NOT_FOUND) - { - std::wstring dir(path_dll); - size_t pos = dir.rfind(L'\\'); - wchar_t path[MAX_PATH] = { 0 }; - - GetDllDirectoryW(_countof(path) - 1, path); - if (pos != std::wstring::npos) - dir.erase(pos); - OutputDebugStringW((L"[TWAIN]Load: try change directory to " + dir + L"\r\n").c_str()); - SetDllDirectoryW(dir.c_str()); - h = LoadLibraryW(path_dll); - ret = GetLastError(); - swprintf_s(info, _countof(info) - 1, L" = %d\r\n", ret); - OutputDebugStringW((L"[TWAIN]Load: " + std::wstring(path_dll) + info).c_str()); - OutputDebugStringW((L"[TWAIN]Load: restore directory to " + std::wstring(path) + L"\r\n").c_str()); - SetDllDirectoryW(path); - } - - if (dll) - *dll = h; - - return ret; + buf_ = (uint8_t*)malloc(size); + if (buf_) + memset(buf_, 0, size); +} +img_receiver::~img_receiver() +{ + if (buf_) + free(buf_); + buf_ = nullptr; } -static int strToWchar(string str, wchar_t* s) +int img_receiver::put_data(const void* data, uint32_t* size) { - if (str.empty() || !s) + size_t info = 0; + + if (info_.length() < info_size_) { - return -1; + size_t need = info_size_ - info_.length(); + if (need > *size) + { + info = *size; + info_ += std::string((const char*)data, *size); + *size = 0; + } + else + { + info_ += std::string((const char*)data, need); + *size -= need; + info = need; + } } - size_t size = str.length(); - //获取缓冲区大小,并申请空间,缓冲区大小按字符计算 - int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), size, NULL, 0); - wchar_t* buffer = new wchar_t[size + 1]; - MultiByteToWideChar(CP_ACP, 0, str.c_str(), size, buffer, len); - buffer[len] = '\0'; - wcscpy(s, buffer); - if (!buffer || !s) - return -1; - delete[]buffer; - buffer = NULL; + + if (*size) + { + if (*size > size_ - wpos_) + *size = size_ - wpos_; + + memcpy(buf_ + wpos_, data, *size); + wpos_ += *size; + if (wpos_ >= size_ && finish_) + finish_(this); + } + *size += info; + return 0; } -#endif -static int ui_default_callback(scanner_handle, int, void*, unsigned int*, void*) +bool img_receiver::is_complete(void) { - return 0; + return wpos_ >= size_; } -static std::string bmp_821(unsigned char* bits/*bits data*/, int w, int h, int* lbytes/*in/out 行字节*/, bool line_align_4/*是否行对齐4字节*/, int threashold/*黑白像素阈值*/, bool reverse/*是否反色输出*/) +uint32_t img_receiver::get_required(void) { - static unsigned int g_bmp8_pallete[] = { - 0x00000000, 0x00800000, 0x00008000, 0x00808000, 0x00000080, 0x00800080, 0x00008080, 0x00c0c0c0, 0x00c0dcc0, 0x00a6caf0, 0x00402000, 0x00602000, 0x00802000, 0x00a02000, 0x00c02000, 0x00e02000 - , 0x00004000, 0x00204000, 0x00404000, 0x00604000, 0x00804000, 0x00a04000, 0x00c04000, 0x00e04000, 0x00006000, 0x00206000, 0x00406000, 0x00606000, 0x00806000, 0x00a06000, 0x00c06000, 0x00e06000 - , 0x00008000, 0x00208000, 0x00408000, 0x00608000, 0x00808000, 0x00a08000, 0x00c08000, 0x00e08000, 0x0000a000, 0x0020a000, 0x0040a000, 0x0060a000, 0x0080a000, 0x00a0a000, 0x00c0a000, 0x00e0a000 - , 0x0000c000, 0x0020c000, 0x0040c000, 0x0060c000, 0x0080c000, 0x00a0c000, 0x00c0c000, 0x00e0c000, 0x0000e000, 0x0020e000, 0x0040e000, 0x0060e000, 0x0080e000, 0x00a0e000, 0x00c0e000, 0x00e0e000 - , 0x00000040, 0x00200040, 0x00400040, 0x00600040, 0x00800040, 0x00a00040, 0x00c00040, 0x00e00040, 0x00002040, 0x00202040, 0x00402040, 0x00602040, 0x00802040, 0x00a02040, 0x00c02040, 0x00e02040 - , 0x00004040, 0x00204040, 0x00404040, 0x00604040, 0x00804040, 0x00a04040, 0x00c04040, 0x00e04040, 0x00006040, 0x00206040, 0x00406040, 0x00606040, 0x00806040, 0x00a06040, 0x00c06040, 0x00e06040 - , 0x00008040, 0x00208040, 0x00408040, 0x00608040, 0x00808040, 0x00a08040, 0x00c08040, 0x00e08040, 0x0000a040, 0x0020a040, 0x0040a040, 0x0060a040, 0x0080a040, 0x00a0a040, 0x00c0a040, 0x00e0a040 - , 0x0000c040, 0x0020c040, 0x0040c040, 0x0060c040, 0x0080c040, 0x00a0c040, 0x00c0c040, 0x00e0c040, 0x0000e040, 0x0020e040, 0x0040e040, 0x0060e040, 0x0080e040, 0x00a0e040, 0x00c0e040, 0x00e0e040 - , 0x00000080, 0x00200080, 0x00400080, 0x00600080, 0x00800080, 0x00a00080, 0x00c00080, 0x00e00080, 0x00002080, 0x00202080, 0x00402080, 0x00602080, 0x00802080, 0x00a02080, 0x00c02080, 0x00e02080 - , 0x00004080, 0x00204080, 0x00404080, 0x00604080, 0x00804080, 0x00a04080, 0x00c04080, 0x00e04080, 0x00006080, 0x00206080, 0x00406080, 0x00606080, 0x00806080, 0x00a06080, 0x00c06080, 0x00e06080 - , 0x00008080, 0x00208080, 0x00408080, 0x00608080, 0x00808080, 0x00a08080, 0x00c08080, 0x00e08080, 0x0000a080, 0x0020a080, 0x0040a080, 0x0060a080, 0x0080a080, 0x00a0a080, 0x00c0a080, 0x00e0a080 - , 0x0000c080, 0x0020c080, 0x0040c080, 0x0060c080, 0x0080c080, 0x00a0c080, 0x00c0c080, 0x00e0c080, 0x0000e080, 0x0020e080, 0x0040e080, 0x0060e080, 0x0080e080, 0x00a0e080, 0x00c0e080, 0x00e0e080 - , 0x000000c0, 0x002000c0, 0x004000c0, 0x006000c0, 0x008000c0, 0x00a000c0, 0x00c000c0, 0x00e000c0, 0x000020c0, 0x002020c0, 0x004020c0, 0x006020c0, 0x008020c0, 0x00a020c0, 0x00c020c0, 0x00e020c0 - , 0x000040c0, 0x002040c0, 0x004040c0, 0x006040c0, 0x008040c0, 0x00a040c0, 0x00c040c0, 0x00e040c0, 0x000060c0, 0x002060c0, 0x004060c0, 0x006060c0, 0x008060c0, 0x00a060c0, 0x00c060c0, 0x00e060c0 - , 0x000080c0, 0x002080c0, 0x004080c0, 0x006080c0, 0x008080c0, 0x00a080c0, 0x00c080c0, 0x00e080c0, 0x0000a0c0, 0x0020a0c0, 0x0040a0c0, 0x0060a0c0, 0x0080a0c0, 0x00a0a0c0, 0x00c0a0c0, 0x00e0a0c0 - , 0x0000c0c0, 0x0020c0c0, 0x0040c0c0, 0x0060c0c0, 0x0080c0c0, 0x00a0c0c0, 0x00fffbf0, 0x00a0a0a4, 0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00, 0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff - }; - int l = (w + 31) / 32 * 4, - size = l * h, - line_bytes = (w + 3) / 4 * 4; - std::string f(""); - unsigned char* data = nullptr, mask = reverse ? -1 : 0; - unsigned int* pallete = g_bmp8_pallete; - - if (!line_align_4) - { - l = (w + 7) / 8; - size = l * h; - } - if (lbytes && *lbytes) - line_bytes = *lbytes; - f.resize(size); - data = (unsigned char*)&f[0]; - for (int i = 0; i < h; ++i) - { - unsigned char v = 0, - *dst = data; - for (int j = 0; j < w; ++j) - { - v <<= 1; - - unsigned char pixel = ((pallete[bits[j]] & 0x0ff) + ((pallete[bits[j]] >> 8) & 0x0ff) + ((pallete[bits[j]] >> 16) & 0x0ff)) / 3; - if (pixel >= threashold) - v |= 1; - if ((j + 1) % 8 == 0) - { - *dst++ = v ^ mask; - v = 0; - } - } - if (w % 8) - { - v ^= mask; - v <<= 8 - (w % 8); - *dst++ = v; - } - - data += l; - bits += line_bytes; - } - if (lbytes) - *lbytes = l; - - return f; -} - -static bool is_firstopen_ = true; //第二次打开设备就不在去获取和设置设备锁定状态 -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// hg_scanner -hg_scanner::hg_scanner(ScannerSerial serial, const char* dev_name, const char* model, usb_io* io, int pid) - : name_(dev_name ? dev_name : ""), family_(model ? model : ""), io_(io), status_(SCANNER_ERR_NOT_START), serial_(serial) - , scan_count_(-1), run_(true), paper_size_(TwSS::A4), erase_bkg_range_(10), read_over_with_no_data_(false) - , noise_range_(30), omit_empty_level_(50), resolution_(200), rid_hole_range_(10.0f) - , bright_(128), contrast_(4), gamma_(1.0f), threshold_(40), anti_noise_(8), margin_(5) - , fractate_level_(50), ui_ev_cb_(ui_default_callback), scan_life_(NULL) - , notify_setting_result_(false), user_cancel_(false), cb_mem_(true), test_1_paper_(false) - , img_type_(""), online_(false), is_quality_(-1), is_color_fill(false), is_multiout(false), save_multiout(from_default_language(OPTION_VALUE_DLSCLX_CS_HD_HB, nullptr)) - , final_img_index_(0), custom_area_(false), save_sizecheck(false), bw_threshold_(128), custom_gamma_(false) - , double_paper_handle_(0), keep_watermark_(false), save_feedmode_type_(false), feedmode_(1), sleeptime_(-1), split3399_(0) - , async_io_(false), is_white_0_(true), isremove_left_hole(false), isremove_right_hole(false), isremove_top_hole(false), isremove_low_hole(false) - , isremove_left_hole_threshold(0), isremove_right_hole_threshold(0), isremove_top_hole_threshold(0), isremove_low_hole_threshold(0) - , dump_usb_path_(""), dump_img_(&hg_scanner::dump_image_empty) - , memory_size_(4000/*USB+JPEG压缩及图像处理图队列,总共1GB*/), isx86_Advan_(true), stop_fatal_(SCANNER_ERR_OK), is_auto_paper_scan(false) - , size_check(false), save_sleeptime_type_(false), is_checksum_strat_scan(false), is_cis_image(false) - , is_dpi_color_check(false), save_dpi_color_check_val(0.0f), is_auto_falt(false), HGVersion_mgr_(NULL), HGVersion_Init_(NULL) - , HGVersion_Islock_(NULL), HGVersion_Postlog_(NULL), HGVersion_Free_(NULL), Dynamicopen_HGVersion_pHandle_(NULL), pid_(pid), fetching_id_(-1), color_correction_(false) - , is_auto_paper_scan_exit_time(60), is_read_int(true), is_auto_feedmode_(false) - , firmware_sup_wait_paper_(false),firmware_sup_pick_strength_(false),firmware_sup_log_export_(false),firmware_sup_color_corr_(false),firmware_sup_wake_device_(false) - , firmware_sup_double_img(false),firmware_sup_devs_lock_(false),firmware_sup_dpi_300(false),firmware_sup_dpi_600(false),firmware_sup_auto_speed_(false),firmware_sup_morr_(false) - , firmware_sup_color_fill_(false),firmware_sup_history_cnt(false), is_discardblank(false) - , auto_scan_restore_(false), auto_scan_prev_(is_auto_paper_scan) -{ - set_where("scanner-instance"); - - #if !defined(_WIN32) && !defined(_WIN64) &&defined(x86_64) - isx86_Advan_ = false; - #endif - std::string config_file(utils::get_local_data_path() + PATH_SEPARATOR + "config" + PATH_SEPARATOR + "debug.cfg"); - char strbuf[260] = {0}; - int getl = GetPrivateProfileStringA("path", "final_img", "", strbuf, sizeof(strbuf) - 1, config_file.c_str()); - - init_setting_func_map(); - strbuf[getl] = 0; - final_path_ = strbuf; - if(final_path_.empty()) - final_path_ = utils::get_local_data_path() + PATH_SEPARATOR + "imgs"; - if (GetPrivateProfileIntA("dump", "dumpusb", 0, config_file.c_str()) == 1) - { - getl = GetPrivateProfileStringA("dump", "usb_path", "", strbuf, sizeof(strbuf) - 1, config_file.c_str()); - strbuf[getl] = 0; - dump_usb_path_ = strbuf; - if (dump_usb_path_.empty()) - dump_usb_path_ = final_path_; - if (!dump_usb_path_.empty()) - dump_img_ = &hg_scanner::dump_image_real; - } - - getl = GetPrivateProfileStringA("mem", "max_img", "", strbuf, sizeof(strbuf) - 1, config_file.c_str()); - strbuf[getl] = 0; - - std::string mem(strbuf); - if (!mem.empty()) - { - memory_size_ = std::stoi(mem); - utils::to_log(LOG_LEVEL_DEBUG, "Get the config file --->memory_size_ set is :%lld\n", memory_size_); - } - getl = GetPrivateProfileStringA("cpu", "advanced", "", strbuf, sizeof(strbuf) - 1, config_file.c_str()); - strbuf[getl] = 0; - std::string adv(strbuf); - if (!adv.empty()) - { - isx86_Advan_ = adv == "0" ? false : true; - utils::to_log(LOG_LEVEL_DEBUG, "Get the config file --->isx86_Advan_ set is :%d\n", isx86_Advan_); - } - - if (utils::create_folder(final_path_.c_str())) - { - utils::to_log(LOG_LEVEL_WARNING, "temporary image folder: %s\n", final_path_.c_str()); - final_path_ += PATH_SEPARATOR; - } + if (wpos_ >= size_) + return 0; else - { - utils::to_log(LOG_LEVEL_WARNING, "create temporary image folder failed: %s\n", final_path_.c_str()); - final_path_ = ""; - } + return size_ - wpos_ + (info_size_ - info_.length()); +} - custom_gamma_val_ = new SANE_Gamma; - memset(custom_gamma_val_, 0, sizeof(SANE_Gamma)); - for (int i = 0; i < ARRAY_SIZE(custom_gamma_val_->table); ++i) - custom_gamma_val_->table[i] = i & 0x0ff; +uint32_t img_receiver::id(void) +{ + return id_; +} +size_t img_receiver::size(void) +{ + return wpos_; +} +uint8_t* img_receiver::data(void) +{ + return buf_; +} +std::string img_receiver::information(void) +{ + return info_; +} +PACKIMAGE img_receiver::head(void) +{ + return head_; +} - paper_size_mm_.cx = 210; - paper_size_mm_.cy = 297; - utils::to_log(LOG_LEVEL_DEBUG, "%s(%p) constructed\n", name_.c_str(), this); - image_prc_param_.value = 0; - if (io_) - { - io_->add_ref(); - status_ = io_->last_error(); - online_ = status_ == SCANNER_ERR_OK; - } - wait_usb_.set_debug_info("USB"); - wait_img_.set_debug_info("Image"); - wait_usb_result_.set_debug_info("start"); - wait_devsislock_.set_debug_info("Devsislock"); - //wait_read_int.set_debug_info("read_int"); - //thread_read_int_.reset(new std::thread(&hg_scanner::thread_read_int, this)); - thread_usb_read_.reset(new std::thread(&hg_scanner::thread_handle_usb, this)); - thread_img_handle_.reset(new std::thread(&hg_scanner::thread_image_handle, this)); +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// hg_scanner +hg_scanner::hg_scanner(ONLNSCANNER* dev, imgproc_mgr* imgproc, hguser* user, std::vector* constopts) + : dev_(*dev), status_(SCANNER_ERR_OPENED_BY_OTHER_PROCESS) + , msg_(from_default_language("\350\256\276\345\244\207\345\267\262\347\273\217\350\242\253\350\277\233\347\250\213 '%s' \345\215\240\347\224\250")) +{ + singleton_ = hg_scanner::create_device_singleton(dev_.vid, dev_.pid, dev_.addr); + if (!singleton_->is_first()) + { + std::string pre(singleton_->read()); + size_t pos = msg_.find("%s"); -#ifdef OEM_HUAGAO - thread_devslock_handle_.reset(new std::thread(&hg_scanner::thread_devslock_handle, this)); -#endif + if (pos == std::string::npos) + msg_ += ": " + pre; + else + msg_.replace(pos, 2, pre); + singleton_->release(); + } + else + { + set_where(dev->display_name.c_str()); + user_ = user; + init(); + if (status() == SCANNER_ERR_OK) + { + imgproc_ = imgproc; + imgproc_->add_ref(); - ImagePrc_pHandle_ = hg_imgproc::init(pid_, isx86_Advan_);; - //ImagePrc_pHandle_ = nullptr; + dev_opts_->add(imgproc_); + if (constopts) + { + for(auto& v: *constopts) + dev_opts_->add(v); + } + imgpr_thread_.reset(new std::thread(&hg_scanner::thread_image_processor, this)); + } + } } hg_scanner::~hg_scanner() { - close(true); - set_image_processor(nullptr); - - hg_version_free_handle(); - //if (thread_read_int_.get() && thread_read_int_->joinable()) - // thread_read_int_->join(); - if (thread_usb_read_.get() && thread_usb_read_->joinable()) - thread_usb_read_->join(); - if (thread_img_handle_.get() && thread_img_handle_->joinable()) - thread_img_handle_->join(); - -#ifdef OEM_HUAGAO - if (thread_devslock_handle_.get() && thread_devslock_handle_->joinable()) - thread_devslock_handle_->join(); -#endif - - delete custom_gamma_val_; - if(ImagePrc_pHandle_) - hg_imgproc::release(ImagePrc_pHandle_); - - name_.insert(0, from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_DEVS, nullptr)); - name_ += from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_IS_CLOSE, nullptr); - notify_ui_working_status(name_.c_str(), SANE_EVENT_SCANNER_CLOSED); - utils::to_log(LOG_LEVEL_DEBUG, "%s(%p) destroyed.\n", name_.c_str(), this); -} - -std::string hg_scanner::temporary_file(char* tail, char* head) -{ - std::string path("/tmp/"); - char buf[128]; - FILE* src = NULL; - unsigned int ind = 1; - - if (!head || *head == 0) - head = (char*)"scan"; - if (!tail) - tail = (char*)""; - -#if defined(WIN32) || defined(_WIN64) - char me[MAX_PATH] = { 0 }, * n = NULL; - - GetModuleFileNameA(NULL, me, _countof(me) - 1); - n = strrchr(me, '\\'); - if (n++ == NULL) - n = me; - *n = 0; - path = me; - path += "img_tmp\\"; - mkdir(path.c_str()); -#endif - - srand(time(NULL)); - sprintf(buf, "%s%s", head, tail); - while ((src = fopen((path + buf).c_str(), "rb"))) - { - fclose(src); - sprintf(buf, "%s(%u)%s", head, ind++, tail); - } - - return path + buf; -} -int hg_scanner::save_2_tempory_file(std::shared_ptr> data, std::string* path_file, unsigned int index) -{ - char head[40] = { 0 }; - std::string file(""); - FILE* dst = nullptr; - int ret = SCANNER_ERR_OK; - - sprintf(head, "usb_%05u", index); - if(!path_file || path_file->empty()) - file = hg_scanner::temporary_file((char*)".jpg", (char*)head); - dst = fopen(file.c_str(), "wb"); - if (dst) - { - size_t wrote = fwrite(data->data(), 1, data->size(), dst); - if (wrote == data->size()) - { - if (path_file) - *path_file = file; - utils::to_log(LOG_LEVEL_DEBUG, "--->Wrote %u bytes to file '%s'\n", wrote, file.c_str()); - } - else - { - ret = SCANNER_ERR_WRITE_FILE_FAILED; - utils::to_log(LOG_LEVEL_FATAL, "Failed in writting file(%u/%u) '%s'\n", wrote, data->size(), file.c_str()); - } - fclose(dst); - } - else - { - ret = SCANNER_ERR_CREATE_FILE_FAILED; - utils::to_log(LOG_LEVEL_FATAL, "Failed in creating file '%s'\n", file.c_str()); - } - - return ret; -} -void hg_scanner::thread_devslock_handle(void) -{ - int ret = SCANNER_ERR_OK; - while (run_) - { - wait_devsislock_.wait(); -#ifdef OEM_HUAGAO - if (is_firstopen_ && firmware_sup_devs_lock_) - { - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - ret = set_server_blacklist_lock(); - hg_version_free_handle(); - } -#endif - is_firstopen_ = false; - //is_read_int = false; - break; - } - - //int ret = SCANNER_ERR_OK; - //wait_devsislock_.wait(); - //while (is_firstopen_ && firmware_sup_devs_lock_) - //{ - // if (!is_read_int) - // { - // std::this_thread::sleep_for(std::chrono::milliseconds(500)); - // ret = set_server_blacklist_lock(); - // hg_version_free_handle(); - // is_firstopen_ = false; - // } - //} -} -void hg_scanner::thread_read_int(void) -{ - while (run_) - { - wait_read_int.wait(); - if (is_read_int && is_firstopen_ && pid_ == 0x300) - { - is_read_int = true; - //notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_DEVS_BOOTING, SANE_EVENT_STATUS, status_); - //discard_all_images(); - set_updata0303(); - //notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_DEVS_START_SUCCES, SANE_EVENT_STATUS, status_); - } - if (is_firstopen_) - { - //wait_devsislock_.notify(); - } - } - - //if (is_read_int && pid_ == 0x0300) - //{ - // wait_read_int.wait(); - // is_read_int = true; - // notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_DEVS_BOOTING, SANE_EVENT_STATUS, status_); - // //discard_all_images(); - // set_updata0303(); - // notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_DEVS_START_SUCCES, SANE_EVENT_STATUS, status_); - //} - //is_read_int = false; -} -void hg_scanner::thread_handle_usb(void) -{ - int cnt = 0; - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_usb 'START' !!!]:[%d]\n", cnt); - while (run_) - { - cnt++; - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_usb 'WAIT' !!!]:[%d]\n", cnt); - wait_usb_.wait(); - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_usb 'NOTIFY' !!!]:[%d]\n", cnt); - if (!run_) - break; - - if (scan_life_) - { - std::this_thread::sleep_for(std::chrono::milliseconds(3000)); - if (scan_life_) - { - utils::to_log(LOG_LEVEL_FATAL, "[thread_handle_usb image process is still running!]:[%d]\n", cnt); - continue; - } - } - - scan_life_ = new do_when_born_and_dead(this, &hg_scanner::working_begin, &hg_scanner::working_done, NULL); - usb_img_index_ = 0; - thread_handle_usb_read(); - if (scan_life_->release() == 0) - scan_life_ = NULL; - - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_usb_read 'GET IMAGE END'!!!]:[%d]\n", cnt); - } - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_usb EXIT !!!]:[%d]\n", cnt); -} -void hg_scanner::thread_image_handle(void) -{ - while (run_) - { - wait_img_.wait(); - if (!run_) - break; - - scan_life_->add_ref(); - thread_handle_image_process(); - if (scan_life_->release() == 0) - scan_life_ = NULL; - } -} - -int hg_scanner::hg_version_init_handle() -{ - int ret = SCANNER_ERR_OK; - string scanner_path = utils::get_module_full_path(MODULE_NAME_SCANNER); - if (scanner_path.empty()) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - size_t pos = scanner_path.rfind(PATH_SEPARATOR[0]); - if(pos++ == std::string::npos) - pos = 0; - scanner_path.erase(pos); - -#ifndef WIN32 - string HGVersionlib_path = scanner_path + HGVERSION_LIBNANE; - - if (access(HGVersionlib_path.c_str(), F_OK) != 0) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - printf("HGVersionlib_path:%s \r\n", HGVersionlib_path.c_str()); - Dynamicopen_HGVersion_pHandle_ = dlopen(HGVersionlib_path.c_str(), RTLD_LAZY); - - if (!Dynamicopen_HGVersion_pHandle_ ) - { - utils::to_log(LOG_LEVEL_DEBUG, "HGVersionlib_path open dll is error: %s\n", "SCANNER_ERR_INSUFFICIENT_MEMORY"); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - HGVersion_Init_ = (SDKHGVersion_Init_)dlsym(Dynamicopen_HGVersion_pHandle_, "HGVersion_CreateMgr"); - HGVersion_Islock_ = (SDKHGVersion_Islock_)dlsym(Dynamicopen_HGVersion_pHandle_, "HGVersion_BlackListCheck"); - HGVersion_Postlog_ = (SDKHGVersion_Postlog_)dlsym(Dynamicopen_HGVersion_pHandle_, "HGVersion_PostDeviceLockInfo"); - HGVersion_Free_ = (SDKHGVersion_Free_)dlsym(Dynamicopen_HGVersion_pHandle_, "HGVersion_DestroyMgr"); - -#else - //string scanner_path = utils::get_module_full_path(MODULE_NAME_SCANNER); - //scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(MODULE_NAME_SCANNER)); - - string HGVersionlib_path = scanner_path + HGVERSION_LIBNANE; - wchar_t* Prclibbuffer = new wchar_t[HGVersionlib_path.length() + 1]; - - ret = strToWchar(HGVersionlib_path, Prclibbuffer); - if (ret == -1) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - - load_dll(Prclibbuffer, &Dynamicopen_HGVersion_pHandle_); //windows下可能会找不到他所在的依赖库导致直接打开动态库的时候找不到模块 - if (Prclibbuffer) - { - delete []Prclibbuffer; - Prclibbuffer = NULL; - } - //int l = GetLastError(); - if (!Dynamicopen_HGVersion_pHandle_ ) - { - utils::to_log(LOG_LEVEL_DEBUG, "Dynamicopen_HGVersion_pHandle_ open dll is error: %s\n", "SCANNER_ERR_INSUFFICIENT_MEMORY"); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - HGVersion_Init_ = (SDKHGVersion_Init_) GetProcAddress(Dynamicopen_HGVersion_pHandle_, "HGVersion_CreateMgr"); - HGVersion_Islock_ = (SDKHGVersion_Islock_) GetProcAddress(Dynamicopen_HGVersion_pHandle_, "HGVersion_BlackListCheck"); - HGVersion_Postlog_ = (SDKHGVersion_Postlog_) GetProcAddress(Dynamicopen_HGVersion_pHandle_, "HGVersion_PostDeviceLockInfo"); - HGVersion_Free_ = (SDKHGVersion_Free_) GetProcAddress(Dynamicopen_HGVersion_pHandle_, "HGVersion_DestroyMgr"); -#endif - - if (!HGVersion_Init_ ||!HGVersion_Islock_ || !HGVersion_Postlog_ || !HGVersion_Free_) - { - return SCANNER_ERR_INVALID_PARAMETER; - } - HGVersion_Init_(&HGVersion_mgr_); - return ret; -} -int hg_scanner::set_server_blacklist_lock() -{ - if (!HGVersion_mgr_) - { - return SCANNER_ERR_INVALID_PARAMETER; - } - char snbuffer[20]; - char fvbuffer[15]; - char pidbuffer[5]; - SANE_Bool scan_islock = false; - memset(snbuffer, 0, sizeof(snbuffer)); - memset(fvbuffer, 0, sizeof(fvbuffer)); - memset(pidbuffer, 0, sizeof(pidbuffer)); - HGBool islock = false; - - string sn = get_serial_num(); - string fv = get_firmware_version(); - if (fv.empty() || sn.empty()) - return -1; - ::strcpy(snbuffer, sn.c_str()); - ::strcpy(fvbuffer, fv.c_str()); - sprintf(pidbuffer, "%0x", pid_); - //优先从机器设备上进行校验 - int ret = HGVersion_Islock_(HGVersion_mgr_, snbuffer, &islock); - int islock_file = 0; - if (ret != 0) //服务器没有连接到网络 - { - ret = get_dev_islock_file(islock_file); - is_checksum_strat_scan = islock_file <= 0 ? true : false; //使用校验码来进行扫描,以后只会使用这种方法进行扫描 - utils::to_log(LOG_LEVEL_DEBUG, "net is 404 , devs list is:%d\n", islock_file); - } - else if (!islock) - { - ret = HGVersion_Postlog_(HGVersion_mgr_, pidbuffer, snbuffer, fv.substr(0, 4).c_str(), fvbuffer, islock); //发送日志到服务,第三个参数随意字符串但不能为NULL - is_checksum_strat_scan = true; - set_dev_islock_file(0); - utils::to_log(LOG_LEVEL_DEBUG, "use checksum start scan:%d\n", islock); - } - else - { - ret = HGVersion_Postlog_(HGVersion_mgr_, pidbuffer, snbuffer, fv.substr(0, 4).c_str(), fvbuffer, islock); //发送日志到服务,第三个参数随意字符串但不能为NULL - is_checksum_strat_scan = false; - set_dev_islock_file(1); - utils::to_log(LOG_LEVEL_DEBUG, "devs is lock:%d\n", islock); - } - return 0 ; -} -void hg_scanner::hg_version_free_handle() -{ - int ret = 0; - if (HGVersion_mgr_) - { - int ret = HGVersion_Free_(HGVersion_mgr_); - HGVersion_mgr_ = NULL; - } - if (Dynamicopen_HGVersion_pHandle_) - { -#if (!defined WIN32) - ret = dlclose(Dynamicopen_HGVersion_pHandle_); -#else - ret = FreeLibrary(Dynamicopen_HGVersion_pHandle_); -#endif - Dynamicopen_HGVersion_pHandle_ = NULL; - } -} -void hg_scanner::dump_image_empty(hg_imgproc::HIMGPRC himg, const char* desc) -{} -void hg_scanner::dump_image_real(hg_imgproc::HIMGPRC himg, const char* desc) -{ - char sn[40] = { 0 }; - - sprintf(sn, "%03d_", final_img_index_ + 1); - hg_imgproc::dump_2_file(himg, (dump_usb_path_ + PATH_SEPARATOR + sn + desc + ".jpg").c_str()); -} -void hg_scanner::init_setting_func_map(void) -{ - setting_map_[SANE_STD_OPT_NAME_RESTORE] = &hg_scanner::setting_restore; - setting_map_[SANE_STD_OPT_NAME_HELP] = &hg_scanner::setting_help; - setting_map_[SANE_STD_OPT_NAME_COLOR_MODE] = &hg_scanner::setting_color_mode; - setting_map_[SANE_STD_OPT_NAME_IS_MULTI_OUT] = &hg_scanner::setting_multi_out; - setting_map_[SANE_STD_OPT_NAME_MULTI_OUT_TYPE] = &hg_scanner::setting_multi_out_type; - setting_map_[SANE_STD_OPT_NAME_FILTER] = &hg_scanner::setting_rid_color; - setting_map_[SANE_STD_OPT_NAME_RID_MULTIOUT_RED] = &hg_scanner::setting_rid_multi_red; - setting_map_[SANE_STD_OPT_NAME_RID_ANSWER_SHEET_RED] = &hg_scanner::setting_rid_answer_red; - setting_map_[SANE_STD_OPT_NAME_ERASE_BACKGROUND] = &hg_scanner::setting_erase_background; - setting_map_[SANE_STD_OPT_NAME_BKG_COLOR_RANGE] = &hg_scanner::setting_erase_background_range; - setting_map_[SANE_STD_OPT_NAME_NOISE_OPTIMIZE] = &hg_scanner::setting_noise_optimize; - setting_map_[SANE_STD_OPT_NAME_NOISE_SIZE] = &hg_scanner::setting_noise_optimize_range; - setting_map_[SANE_STD_OPT_NAME_PAPER] = &hg_scanner::setting_paper; - setting_map_[SANE_STD_OPT_NAME_SIZE_CHECK] = &hg_scanner::setting_paper_check; - setting_map_[SANE_STD_OPT_NAME_PAGE] = &hg_scanner::setting_page; - setting_map_[SANE_STD_OPT_NAME_DISCARD_BLANK_SENS] = &hg_scanner::setting_page_omit_empty; - setting_map_[SANE_STD_OPT_NAME_RESOLUTION] = &hg_scanner::setting_resolution; - setting_map_[SANE_STD_OPT_NAME_EXCHANGE] = &hg_scanner::setting_exchagnge; - setting_map_[SANE_STD_OPT_NAME_SPLIT] = &hg_scanner::setting_split_image; - setting_map_[SANE_STD_OPT_NAME_ANTI_SKEW] = &hg_scanner::setting_automatic_skew; - setting_map_[SANE_STD_OPT_NAME_RID_HOLE] = &hg_scanner::setting_rid_hole; - setting_map_[SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE] = &hg_scanner::setting_rid_hoe_range; - setting_map_[SANE_STD_OPT_NAME_BRIGHTNESS] = &hg_scanner::setting_bright; - setting_map_[SANE_STD_OPT_NAME_CONTRAST] = &hg_scanner::setting_contrast; - setting_map_[SANE_STD_OPT_NAME_GAMMA] = &hg_scanner::setting_gamma; - setting_map_[SANE_STD_OPT_NAME_SHARPEN] = &hg_scanner::setting_sharpen; - setting_map_[SANE_STD_OPT_NAME_DARK_SAMPLE] = &hg_scanner::setting_dark_sample; - setting_map_[SANE_STD_OPT_NAME_ERASE_BLACK_FRAME] = &hg_scanner::setting_erase_black_frame; - setting_map_[SANE_STD_OPT_NAME_THRESHOLD] = &hg_scanner::setting_threshold; - setting_map_[SANE_STD_OPT_NAME_ANTI_NOISE_LEVEL] = &hg_scanner::setting_anti_noise; - setting_map_[SANE_STD_OPT_NAME_MARGIN] = &hg_scanner::setting_margin; - setting_map_[SANE_STD_OPT_NAME_FILL_BKG_MODE] = &hg_scanner::setting_filling_background; - setting_map_[SANE_STD_OPT_NAME_IS_ANTI_PERMEATE] = &hg_scanner::setting_is_permeate; - setting_map_[SANE_STD_OPT_NAME_ANTI_PERMEATE_LEVEL] = &hg_scanner::setting_is_permeate_lv; - setting_map_[SANE_STD_OPT_NAME_RID_MORR] = &hg_scanner::setting_remove_morr; - setting_map_[SANE_STD_OPT_NAME_ERROR_EXTENSION] = &hg_scanner::setting_error_extention; - setting_map_[SANE_STD_OPT_NAME_RID_GRID] = &hg_scanner::setting_remove_texture; - setting_map_[SANE_STD_OPT_NAME_IS_ULTROSONIC_CHECK] = &hg_scanner::setting_ultrasonic_check; - setting_map_[SANE_STD_OPT_NAME_DOUBLE_FEED_HANDLE] = &hg_scanner::setting_go_on_when_double_checked; - setting_map_[SANE_STD_OPT_NAME_IS_CHECK_STAPLE] = &hg_scanner::setting_staple_check; - setting_map_[SANE_STD_OPT_NAME_SCAN_MODE] = &hg_scanner::setting_scan_mode; - setting_map_[SANE_STD_OPT_NAME_SCAN_COUNT] = &hg_scanner::setting_scan_count; - setting_map_[SANE_STD_OPT_NAME_TEXT_DIRECTION] = &hg_scanner::setting_text_direction; - setting_map_[SANE_STD_OPT_NAME_IS_ROTATE_BKG_180] = &hg_scanner::setting_rotate_bkg_180; - setting_map_[SANE_STD_OPT_NAME_IS_CHECK_DOG_EAR] = &hg_scanner::setting_fractate_check; - setting_map_[SANE_STD_OPT_NAME_DOG_EAR_SIZE] = &hg_scanner::setting_fractate_check_level; - setting_map_[SANE_STD_OPT_NAME_IS_CHECK_ASKEW] = &hg_scanner::setting_skew_check; - setting_map_[SANE_STD_OPT_NAME_ASKEW_RANGE] = &hg_scanner::setting_skew_check_level; - setting_map_[SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA] = &hg_scanner::setting_is_custom_gamma; - - setting_map_[SANE_STD_OPT_NAME_CUSTOM_AREA] = &hg_scanner::setting_is_custom_area; - setting_map_[SANE_STD_OPT_NAME_CUSTOM_AREA_LEFT] = &hg_scanner::setting_custom_area_left; - setting_map_[SANE_STD_OPT_NAME_CUSTOM_AREA_RIGHT] = &hg_scanner::setting_custom_area_right; - setting_map_[SANE_STD_OPT_NAME_CUSTOM_AREA_TOP] = &hg_scanner::setting_custom_area_top; - setting_map_[SANE_STD_OPT_NAME_CUSTOM_AREA_BOTTOM] = &hg_scanner::setting_custom_area_bottom; - setting_map_[SANE_STD_OPT_NAME_IMAGE_QUALITY] = &hg_scanner::setting_img_quality; - setting_map_[SANE_STD_OPT_NAME_IS_FILL_COLOR] = &hg_scanner::setting_color_fill; - setting_map_[SANE_STD_OPT_NAME_IS_PHOTO_MODE] = &hg_scanner::setting_keep_watermark; - setting_map_[SANE_STD_OPT_NAME_BINARY_THRESHOLD] = &hg_scanner::setting_black_white_threshold; - setting_map_[SANE_STD_OPT_NAME_REVERSE_01] = &hg_scanner::setting_white_pixel_0; - setting_map_[SANE_STD_OPT_NAME_FEED_STRENGTH] = &hg_scanner::setting_feedmode; - setting_map_[SANE_STD_OPT_NAME_TIME_TO_SLEEP] = &hg_scanner::setting_sleeptime; - setting_map_[SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH] = &hg_scanner::setting_auto_pick_paper; - setting_map_[SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE] = &hg_scanner::setting_auto_pick_paper_threshold; - setting_map_[SANE_STD_OPT_NAME_WAIT_TO_SCAN] = &hg_scanner::setting_auto_paper_scan; - setting_map_[SANE_STD_OPT_NAME_RID_HOLE_L] = &hg_scanner::setting_isremove_left_hole; - setting_map_[SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_L] = &hg_scanner::setting_isremove_left_hole_threshold; - setting_map_[SANE_STD_OPT_NAME_RID_HOLE_R] = &hg_scanner::setting_isremove_right_hole; - setting_map_[SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_R] = &hg_scanner::setting_isremove_right_hole_threshold; - setting_map_[SANE_STD_OPT_NAME_RID_HOLE_T] = &hg_scanner::setting_isremove_top_hole; - setting_map_[SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_T] = &hg_scanner::setting_isremove_top_hole_threshold; - setting_map_[SANE_STD_OPT_NAME_RID_HOLE_B] = &hg_scanner::setting_isremove_low_hole; - setting_map_[SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_B] = &hg_scanner::setting_isremove_low_hole_threshold; - setting_map_[SANE_STD_OPT_NAME_FOLD_TYPE] = &hg_scanner::setting_fold_type; - setting_map_[SANE_STD_OPT_NAME_COLOR_CORRECTION] = &hg_scanner::setting_color_correction; - setting_map_[SANE_STD_OPT_NAME_WAIT_SCAN_EXIT] = &hg_scanner::setting_auto_paper_scan_exit_time; - setting_map_[SANE_STD_OPT_NAME_DISCARDBLANK] = &hg_scanner::setting_set_discardblank; - - - - - - setting_map_[SANE_STD_OPT_NAME_DEVICE_VID] = &hg_scanner::setting_get_dev_vid; - setting_map_[SANE_STD_OPT_NAME_DEVICE_PID] = &hg_scanner::setting_get_dev_pid; - setting_map_[SANE_STD_OPT_NAME_DEVICE_MODEL] = &hg_scanner::setting_get_dev_family; - setting_map_[SANE_STD_OPT_NAME_DEVICE_NAME] = &hg_scanner::setting_get_dev_name; - setting_map_[SANE_STD_OPT_NAME_DEVICE_SERIAL_NO] = &hg_scanner::setting_get_dev_sn; - setting_map_[SANE_STD_OPT_NAME_FIRMWARE_VERSION] = &hg_scanner::setting_get_dev_fmver; - setting_map_[SANE_STD_OPT_NAME_DEVICE_IP_ADDR] = &hg_scanner::setting_get_dev_ip; - setting_map_[SANE_STD_OPT_NAME_ROLLER_COUNT] = &hg_scanner::setting_get_roller_count; - setting_map_[SANE_STD_OPT_NAME_TOTAL_COUNT] = &hg_scanner::setting_get_history_count; - setting_map_[SANE_STD_OPT_NAME_GET_DEVS_L0G] = &hg_scanner::setting_get_devs_log; - setting_map_[SANE_STD_OPT_NAME_LANGUAGE] = &hg_scanner::setting_set_language; - setting_map_[SANE_STD_OPT_NAME_MOTOR_VER] = &hg_scanner::setting_get_motor_ver; - setting_map_[SANE_STD_OPT_NAME_INITIAL_BOOT_TIME] = &hg_scanner::setting_get_initial_boot_time; -} -bool hg_scanner::is_to_file(void) -{ - return resolution_ > 200 - || paper_size_ == TwSS::USStatement - || paper_size_ == TwSS::MaxSize - || paper_size_ == TwSS::Trigeminy; -} -void hg_scanner::thread_handle_image_process(void) -{ - //VLDGlobalEnable(); - //VLDReportLeaks(); - //while (run_ && !user_cancel_) - int cnt = 0; - while (run_) - { - std::shared_ptr tiny_buffer; - if (imgs_.Size() == 0) - { - if (wait_usb_.is_waiting()) - { - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_image_process 'break thread!!!'] Total pic %d.\n", cnt); - cnt = 0; - break; - } - this_thread::sleep_for(chrono::milliseconds(30)); - continue; - } - - uint32_t id = -1; - cnt++; - utils::log_info("\r\n", LOG_LEVEL_DEBUG); - utils::to_log(LOG_LEVEL_DEBUG, "[thread_handle_image_process] Total from the queue:[%d].\n", cnt); - tiny_buffer = imgs_.Take(&id); - if (tiny_buffer->swap()) - { - try - { - if (!ImagePrc_pHandle_) - { - ImagePrc_pHandle_ = hg_imgproc::init(pid_, isx86_Advan_); - if (!ImagePrc_pHandle_) - { - utils::to_log(LOG_LEVEL_FATAL, "[thread_handle_image_process]:Get Image Process is NULL pid is %d.\n", pid_); - stop_fatal_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - stop(); - break; - } - } - image_process(tiny_buffer, id); - } - catch (const std::exception& e) - { - if (is_dpi_color_check) - { - is_dpi_color_check = false; - stop_fatal_ = SCANNER_ERR_DEVICE_DISTORTION; - } - else - stop_fatal_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - utils::to_log(LOG_LEVEL_FATAL, "[thread_handle_image_process]:is opencv Fatal and stop scanner: %s\n", e.what()); - stop(); - break; - - } - catch (...) - { - utils::to_log(LOG_LEVEL_FATAL, "[thread_handle_image_process]:stop scanner!!! Insufficient memory when proecss image with %d bytes.\n", tiny_buffer->size()); - stop_fatal_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - stop(); - } - } - else - { - utils::to_log(LOG_LEVEL_FATAL, "[thread_handle_image_process]:Reload USB data '%s' failed!\n", tiny_buffer->file().c_str()); - } - } - utils::log_info("[thread_handle_image_process 'EXIT !!!']\n", LOG_LEVEL_DEBUG); - //VLDGlobalDisable(); -} -void hg_scanner::working_begin(void*) -{ - stop_fatal_ = SCANNER_ERR_OK; - final_img_index_ = 0; - status_ = SCANNER_ERR_OK; - notify_ui_working_status(from_default_language(STATU_DESC_SCAN_WORKING, nullptr), SANE_EVENT_WORKING, SCANNER_ERR_OK); - utils::log_info("scanning ...\n", LOG_LEVEL_DEBUG); -} -void hg_scanner::working_done(void*) -{ -// imgs_.Clear(); // do before start ... -// if(user_cancel_) -// final_imgs_.clear(); - - if (status_ == SCANNER_ERR_OK && stop_fatal_) - status_ = stop_fatal_; - - switch (status_) - { - case SCANNER_ERR_OK: - notify_ui_working_status(from_default_language(STATU_DESC_SCAN_STOPPED, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_BUSY: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_PC_BUSY, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_STOPPED: - notify_ui_working_status(from_default_language(STATU_DESC_SCAN_STOPPED, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_COVER_OPENNED: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_COVER_OPENNED, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_NO_PAPER: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_NO_PAPER, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_FEEDING_PAPER: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_FEEDING_PAPER, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_NOT_FOUND: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_NOT_FOUND, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_SLEEPING: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_SLEEPING, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_COUNT_MODE: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_COUNT_MODE, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_DOUBLE_FEEDING: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_DOUBLE_FEEDING, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_PAPER_JAMMED: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_PAPER_JAMMED, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_STAPLE_ON: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_STAPLE_ON, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_PAPER_SKEW: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_PAPER_SKEW, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_SIZE_CHECK: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_SIZE_CHECK, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_DOGEAR: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_DOGEAR, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_NO_IMAGE: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_NO_IMAGE, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_SCANN_ERROR: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_SCANN_ERROR, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_PC_BUSY: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_PC_BUSY, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_INSUFFICIENT_MEMORY: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_INSUFFICIENT_MEMORY, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_TIMEOUT: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_TIMEOUT, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_ISLOCK: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_ISLOCK, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_AUTO_FAIL_OVER: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_AUTO_FAIL_OVER, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_DISTORTION: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_DISTORTION, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_MAYBE_IS_HOLE: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_MAYBE_IS_HOLE, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - case SCANNER_ERR_DEVICE_DEVS_BOOTING: - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_DEVS_BOOTING, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - default: - notify_ui_working_status(user_cancel_ ? from_default_language(STATU_DESC_SCAN_CANCELED, nullptr) : from_default_language(STATU_DESC_SCAN_STOPPED, nullptr), SANE_EVENT_SCAN_FINISHED, status_); - break; - } - - if (test_1_paper_) - { - utils::log_info("scanning mode: finished testing ONE paper, restore to normal scanning.\n", LOG_LEVEL_DEBUG); - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "EXIT All Thread--->Total picture: [%d] and scanner status [%s].\n", final_img_index_, hg_scanner_err_description(status_)); - } - utils::to_log(LOG_LEVEL_DEBUG, "----------Main End scan status----------%s:\n", hg_scanner_err_description(status_)); - - test_1_paper_ = false; -} - -int hg_scanner::hgpaper_to_devspaper(Paper_Map papermap[], int len, int& paper, bool* exact, TwSS* type) -{ - int ind = 0; - bool good = true, * r = exact ? exact : &good; - - for (int i = 0; i < len; ++i) - { - if (paper == papermap[i].paper) - { - ind = i; - break; - } - } - - if (paper == papermap[ind].paper) - *r = true; - else - *r = false; - paper = papermap[ind].paper; - if (type) - *type = papermap[ind].type; - - return ind; -} -int hg_scanner::invoke_setting_xxx(int(hg_scanner::*func)(void*, long*), void* data, long* len) -{ - int ret = SCANNER_ERR_DEVICE_NOT_SUPPORT; - auto it = setting_map_.begin(); - while (it != setting_map_.end()) - { - if (it->second == func) - { - ret = set_setting(it->first.c_str(), data); - break; - } - ++it; - } - - return ret; -} -int hg_scanner::setting_restore(void* data, long* len) -{ - // move to scanner manager ... - - return SCANNER_ERR_CONFIGURATION_CHANGED; -} - -static int GetModuleName(void* addr, char* name, int maxLen) -{ - if (NULL == name || 0 == maxLen) - { - return -1; - } - -#if !defined(_WIN32) - if (NULL == addr) - { - char dir[PATH_MAX] = { 0 }; - if (0 == readlink("/proc/self/exe", dir, PATH_MAX)) - return -1; - if (maxLen < strlen(dir) + 1) - return -1; - ::strcpy(name, dir); - } - else - { - Dl_info dlinfo; - if (0 == dladdr(addr, &dlinfo)) - return -1; - if (maxLen < strlen(dlinfo.dli_fname) + 1) - return -1; - ::strcpy(name, dlinfo.dli_fname); - } -#else - HMODULE hModule = NULL; - GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS - | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)addr, &hModule); - - CHAR moduleName[MAX_PATH] = { 0 }; - DWORD len = GetModuleFileNameA(hModule, moduleName, MAX_PATH); - if (0 == len || maxLen < strlen(moduleName) + 1) - return -1; - ::strcpy(name, moduleName); -#endif - return 0; -} - -static int GetFilePath(const char* fileName, char* path, int maxLen) -{ - if (NULL == fileName || NULL == path || 0 == maxLen) - { - return -1; - } - -#if defined(_WIN32) - const char* pcName = strrchr(fileName, '\\'); - if (NULL == pcName) - { - pcName = strrchr(fileName, '/'); - if (NULL == pcName) - return -1; - } -#else - const char* pcName = strrchr(fileName, '/'); - if (NULL == pcName) - return -1; -#endif - - ++pcName; - if (maxLen < (int)(pcName - fileName + 1)) - return -1; - memcpy(path, fileName, pcName - fileName); - path[pcName - fileName] = 0; - return 0; -} - -int hg_scanner::setting_help(void* data, long* len) -{ - char moduleName[256]; - GetModuleName(NULL, moduleName, 256); - char exePath[256]; - GetFilePath(moduleName, exePath, 256); - std:string exePath2 = exePath; - - std::string helpfile = exePath2 + HELP_PATH; - std::string com = "xdg-open ";//注意空格保留 - int code_page = lang_get_cur_code_page(); - int ret = SCANNER_ERR_OK; - - if (code_page == 20127) - { - helpfile = exePath2 + HELP_PATH_EN; - } - -#if defined(WIN32) || defined(_WIN64) - com = ""; - //helpfile.insert(0, root); - FILE* src = fopen(helpfile.c_str(), "rb"); - if (src) - fclose(src); - else -#else - if (access(helpfile.c_str(),F_OK) == -1) -#endif - { - utils::to_log(LOG_LEVEL_DEBUG,"open help file fail,not find file :%d code page :%d\r\n",helpfile.c_str(), code_page); - ret = SCANNER_ERR_OPEN_FILE_FAILED; - return ret ; - } - - com += helpfile; -#if defined(WIN32) || defined(_WIN64) - ShellExecuteA(NULL, "Open", com.c_str(), NULL, NULL, SW_SHOWNORMAL); -#else - system(com.c_str()); -#endif - utils::to_log(LOG_LEVEL_DEBUG,"App_Help_pdf Path is:%s Code Page is:%d\n",helpfile.c_str(), code_page); - return ret; -} -int hg_scanner::setting_color_mode(void* data, long* len) -{ - int old = image_prc_param_.bits.color_mode, - sub = SCANNER_ERR_OK, - val = 0, - ret = SCANNER_ERR_OK; - std::string str((char*)data); - char errbuf[40] = { 0 }; - - val = image_prc_param_.bits.color_mode = match_best_color_mode(str, NULL); - - sub = on_color_mode_changed(val); - image_prc_param_.bits.color_mode = val; - - if (sub == SCANNER_ERR_NOT_EXACT) - { - image_prc_param_.bits.color_mode = old; - str = color_mode_string(image_prc_param_.bits.color_mode); - ret = SCANNER_ERR_NOT_EXACT; - } - else if (sub) - { - ret = sub; - image_prc_param_.bits.color_mode = old; - } - - is_auto_matic_color = image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH ? true :false; // 等于COLOR_MODE_AUTO_MATCH 的时候颜色模式需要变为2 彩色模式图像参数和硬件参数都如此 - - - utils::to_log(LOG_LEVEL_DEBUG, "Change color mode from %s to %s = %s color is =%s\n", color_mode_string(old).c_str(), (char*)data, hg_scanner_err_name(ret, errbuf), str.c_str()); - if(ret == SCANNER_ERR_NOT_EXACT) - ::strcpy((char*)data, str.c_str()); - - return SCANNER_ERR_RELOAD_OPT_PARAM; // ret; -} -int hg_scanner::setting_multi_out(void* data, long* len) -{ - is_multiout = *((bool*)data); - int val = image_prc_param_.bits.color_mode; - - utils::to_log(LOG_LEVEL_DEBUG, "image_prc_param_.bits.multi_out %d\n", image_prc_param_.bits.multi_out); - - //if (is_multiout) - //{ - // if (image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW) - // val = COLOR_MODE_256_GRAY; - // else - // val = COLOR_MODE_24_BITS; - //} - //on_color_mode_changed(val); - - return SCANNER_ERR_RELOAD_OPT_PARAM; // SCANNER_ERR_OK; -} -int hg_scanner::setting_multi_out_type(void* data, long* len) -{ - char errbuf[40] = { 0 }; - int ret = SCANNER_ERR_OK; - - std::string str((char*)data); - - int color; - image_prc_param_.bits.multi_out = match_best_multi_out(str,NULL); - - save_multiout = str; - utils::to_log(LOG_LEVEL_DEBUG, "set multi_out type from %s to %s = %s\n", multi_out_string(image_prc_param_.bits.multi_out).c_str(), (char*)data, hg_scanner_err_name(ret, errbuf)); - - /*if (image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW) - color = COLOR_MODE_256_GRAY; - else - color = COLOR_MODE_24_BITS; - - on_color_mode_changed(color);*/ - return SCANNER_ERR_RELOAD_OPT_PARAM; // ret; -} -int hg_scanner::setting_rid_color(void* data, long* len) -{ - std::string str((char*)data); - int ret = SCANNER_ERR_OK, - old = image_prc_param_.bits.rid_color; - - image_prc_param_.bits.rid_color = match_best_rid_color(str, NULL); - - int color = image_prc_param_.bits.color_mode; - on_color_mode_changed(color); - - return ret; -} -int hg_scanner::setting_rid_multi_red(void* data, long* len) -{ - int val = 2; - image_prc_param_.bits.rid_red = *((bool*)data); - if (*((bool*)data)) - { - on_color_mode_changed(val); - } - - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_rid_answer_red(void* data, long* len) -{ - int val = 2; - image_prc_param_.bits.rid_answer_red = *((bool*)data); - if (*((bool*)data)) - { - on_color_mode_changed(val); - } - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_erase_background(void* data, long* len) -{ - image_prc_param_.bits.erase_bakground = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_erase_background_range(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - erase_bkg_range_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_noise_optimize(void* data, long* len) -{ - image_prc_param_.bits.noise_optimize = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_noise_optimize_range(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - noise_range_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_paper(void* data, long* len) -{ - std::string paper((char*)data); - int ret = SCANNER_ERR_OK, sub = SCANNER_ERR_OK, - val = 0, - old = image_prc_param_.bits.paper; - char errbuf[40] = { 0 }; - - val = image_prc_param_.bits.paper = switch_lateral(match_best_paper(paper, NULL), lateral_); - - // check 600 dpi ... - paper_size_mm_ = paper_size(val); - - sub = on_paper_changed(val); - image_prc_param_.bits.paper = val; - if (sub == SCANNER_ERR_NOT_EXACT) - { - ret = sub; - paper = paper_string(image_prc_param_.bits.paper); - } - else if (sub) - { - ret = sub; - image_prc_param_.bits.paper = old; - } - - if (save_sizecheck) - { - //setting_paper_check(0,(void*)&save_sizecheck); - long l = sizeof(save_sizecheck); - invoke_setting_xxx(&hg_scanner::setting_paper_check, &save_sizecheck, &l); - } - - utils::to_log(LOG_LEVEL_DEBUG, "Change paper from %s to %s = %s\n", paper_string(old).c_str(), (char*)data, hg_scanner_err_name(ret, errbuf)); - - return SCANNER_ERR_RELOAD_OPT_PARAM; // ret; -} -int hg_scanner::setting_paper_check(void* data, long* len) -{ - bool use = *((bool*)data); - char errbuf[40] = { 0 }; - - int ret = on_paper_check_changed(use); - - utils::to_log(LOG_LEVEL_DEBUG, "Change paper size-checking %s = %s\n", *((bool*)data) ? "enabled" : "disabled", hg_scanner_err_name(ret, errbuf)); - if (ret == SCANNER_ERR_DEVICE_NOT_SUPPORT) - { - *((bool*)data) = use; - } - - save_sizecheck = use; - - return ret; -} -int hg_scanner::setting_page(void* data, long* len) -{ - std::string val((char*)data); - int ret = SCANNER_ERR_OK; - char errbuf[40] = { 0 }; - - utils::to_log(LOG_LEVEL_DEBUG, "Change page from %s to %s = %s\n", page_string(image_prc_param_.bits.page).c_str(), (char*)data, hg_scanner_err_name(ret, errbuf)); - image_prc_param_.bits.page = match_best_page(val, NULL); - - return ret; -} -int hg_scanner::setting_page_omit_empty(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - omit_empty_level_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_resolution(void* data, long* len) -{ - int ret = SCANNER_ERR_OK, - old = resolution_, - sub = SCANNER_ERR_OK; - - resolution_ = *((int*)data); - - return SCANNER_ERR_RELOAD_OPT_PARAM; // ret; -} -int hg_scanner::setting_exchagnge(void* data, long* len) -{ - image_prc_param_.bits.exchange = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_split_image(void* data, long* len) -{ - image_prc_param_.bits.split = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_automatic_skew(void* data, long* len) -{ - // automatic_skew_detection_ = *((bool*)data); - image_prc_param_.bits.automatic_skew = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_rid_hole(void* data, long* len) -{ - image_prc_param_.bits.rid_hole = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_rid_hoe_range(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - rid_hole_range_ = *((double*)data); - rid_hole_range_*=100; - utils::to_log(LOG_LEVEL_WARNING, "set rid_hole_range_ = %f\r\n", rid_hole_range_); - - return ret; -} -int hg_scanner::setting_bright(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - bright_ = *((int*)data); - utils::to_log(LOG_LEVEL_WARNING, "set bright_ = %d\r\n", bright_); - return ret; -} -int hg_scanner::setting_contrast(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - contrast_ = *((int*)data); - utils::to_log(LOG_LEVEL_WARNING, "set contrast_ = %d\r\n", contrast_); - return ret; -} -int hg_scanner::setting_gamma(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - gamma_ = *((double*)data); - - return ret; -} -int hg_scanner::setting_sharpen(void* data, long* len) -{ - std::string str((char*)data); - int ret = SCANNER_ERR_OK; - - utils::to_log(LOG_LEVEL_DEBUG, "Change sharpen from %s to %s\n", sharpen_string(image_prc_param_.bits.sharpen).c_str(), (char*)data); - - image_prc_param_.bits.sharpen = match_best_sharpen(str, NULL); - - return ret; -} -int hg_scanner::setting_dark_sample(void* data, long* len) -{ - image_prc_param_.bits.dark_sample = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_erase_black_frame(void* data, long* len) -{ - image_prc_param_.bits.erase_black_frame = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_threshold(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - threshold_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_anti_noise(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - anti_noise_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_margin(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - margin_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_filling_background(void* data, long* len) -{ - std::string str((char*)data); - int ret = SCANNER_ERR_OK; - - image_prc_param_.bits.fill_background = match_best_fill_background(str, NULL); - - return ret; -} -int hg_scanner::setting_is_permeate(void* data, long* len) -{ - image_prc_param_.bits.is_permeate = *((bool*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_is_permeate_lv(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - std::string str((char*)data); - - utils::to_log(LOG_LEVEL_DEBUG, "Change is_permeate_lv from %s to %s\n", is_permaeate_string(image_prc_param_.bits.is_permeate_lv_).c_str(), (char*)data); - image_prc_param_.bits.is_permeate_lv_ = match_best_permaeate_lv(str, NULL); - - return ret; - -} -int hg_scanner::setting_remove_morr(void* data, long* len) -{ - if (resolution_ > 300 ) - { - image_prc_param_.bits.remove_txtture = image_prc_param_.bits.remove_morr = *((bool*)data) = false; - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - - image_prc_param_.bits.remove_morr = *((bool*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_error_extention(void* data, long* len) -{ - image_prc_param_.bits.error_extention = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_remove_texture(void* data, long* len) -{ - if (resolution_ > 300) - { - image_prc_param_.bits.remove_txtture = *((bool*)data) = false; - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - image_prc_param_.bits.remove_txtture = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_ultrasonic_check(void* data, long* len) -{ - bool use = *((bool*)data); - int ret = on_ultrasonic_check_changed(use); - - if (ret) - *((bool*)data) = use; - - return ret; -} -int hg_scanner::setting_go_on_when_double_checked(void* data, long* len) -{ - - bool ok = true; - std::string val((char*)data); - if (!firmware_sup_double_img && val.compare(from_default_language(OPTION_VALUE_SZTPCL_DQTXBTZSM, nullptr))) - { - ::strcpy((char*)data, from_default_language(OPTION_VALUE_SZTPCL_SCTXBTZSM, nullptr)); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - - double_paper_handle_ = double_paper_flag_from_option_value(val, &ok); - - // 此处需要通知设备双张处理方式 !!! - // OPTION_VALUE_SZTPCL_xxx 共4种选择,目前只支持出现双张后停止的两种方式 - // 若要上传出现双张的图片,请确保双张信号在图片之前发出来 !!! - - if(ok) - return SCANNER_ERR_OK; - else - { - ::strcpy((char*)data, val.c_str()); - - return SCANNER_ERR_NOT_EXACT; - } -} -int hg_scanner::setting_staple_check(void* data, long* len) -{ - bool use = *((bool*)data); - int ret = on_staple_check_changed(use); - - if (ret) - *((bool*)data) = use; - - return ret; -} -int hg_scanner::setting_scan_mode(void* data, long* len) -{ - std::string str((char*)data); - int ret = SCANNER_ERR_OK; - - if (strcmp(str.c_str(), from_default_language(OPTION_VALUE_SMZS_LXSM)) == 0) - { - scan_count_ = -1; - - // restore AutoScan ? - if (auto_scan_restore_) - { - long len = sizeof(auto_scan_prev_); - - setting_auto_paper_scan(&auto_scan_prev_, &len); - utils::to_log(LOG_LEVEL_DEBUG, "Restore 'AutoScan' to '%s' for user changes scan mode to '%s'\n" - , auto_scan_prev_ ? "true" : "false", str.c_str()); - } - } - else - { - scan_count_ = 1; // *(int*)setting_jsn_->get_option_value(SANE_STD_OPT_NAME_SCAN_COUNT, SANE_ACTION_GET_VALUE).c_str(); - - // 智学网设置该参数时,程序取消待纸扫描 - if (!auto_scan_restore_) // 连续调用时,保留最初状态 - { - auto_scan_restore_ = auto_scan_prev_ = is_auto_paper_scan; - if (auto_scan_restore_) - { - bool v = false; - long len = sizeof(v); - setting_auto_paper_scan(&v, &len); - auto_scan_restore_ = true; - utils::to_log(LOG_LEVEL_DEBUG, "Disable 'AutoScan' for user changes scan mode to '%s'\n", str.c_str()); - } - } - } - - utils::to_log(LOG_LEVEL_DEBUG, "set scanning pages to %d\n", scan_count_); - - return ret; -} -int hg_scanner::setting_scan_count(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - //std::string val(get_setting_item_string(SANE_STD_OPT_NAME_SCAN_MODE, "cur")); - - //if (val == from_default_language(OPTION_VALUE_SMZS_LXSM, nullptr)) - //{ - // scan_count_ = -1; - //} - //else - { - scan_count_ = *((int*)data); - } - utils::to_log(LOG_LEVEL_DEBUG, "set scanning pages to %d\n", scan_count_); - - return ret; -} -int hg_scanner::setting_text_direction(void* data, long* len) -{ - std::string str((char*)data); - int ret = SCANNER_ERR_OK; - char errbuf[40] = { 0 }; - - utils::to_log(LOG_LEVEL_DEBUG, "Change text direction from '%s' to '%s' = %s\n", text_direction_string(image_prc_param_.bits.text_direction).c_str() - , (char*)data, hg_scanner_err_name(ret, errbuf)); - image_prc_param_.bits.text_direction = match_best_text_direction(str, NULL); - - if (image_prc_param_.bits.text_direction == TEXT_DIRECTION_AUTO && ImagePrc_pHandle_) - { - hg_imgproc::init_auto_txt_hanld(ImagePrc_pHandle_); - } - else if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO && ImagePrc_pHandle_) - { - hg_imgproc::free_auto_txt_hanld(ImagePrc_pHandle_); - } - return ret; -} -int hg_scanner::setting_rotate_bkg_180(void* data, long* len) -{ - image_prc_param_.bits.rotate_back_180 = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_fractate_check(void* data, long* len) -{ - image_prc_param_.bits.fractate_check = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_fractate_check_level(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - - fractate_level_ = *((int*)data); - - return ret; -} -int hg_scanner::setting_skew_check(void* data, long* len) -{ - bool use = *((bool*)data); - int ret = on_skew_check_changed(use); - - if (ret) - *((bool*)data) = use; - - return ret; -} -int hg_scanner::setting_skew_check_level(void* data, long* len) -{ - int level = *((int*)data); - int ret = SCANNER_ERR_OK, - sub = on_skew_check_level_changed(level); - - if (sub) - { - ret = sub; - } - if (ret) - *((int*)data) = level; - - return ret; -} -int hg_scanner::setting_is_custom_gamma(void* data, long* len) -{ - custom_gamma_ = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_custom_gamma_data(void* data, long* len) -{ - SANE_Gamma* gamma = (SANE_Gamma*)data; - - memcpy(custom_gamma_val_, gamma, sizeof(*custom_gamma_val_)); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_is_custom_area(void* data, long* len) -{ - custom_area_ = *((bool*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_custom_area_left(void* data, long* len) -{ - SANE_Fixed* v = (SANE_Fixed*)data; - - custom_area_lt_x_ = *((double*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_custom_area_top(void* data, long* len) -{ - SANE_Fixed* v = (SANE_Fixed*)data; - - custom_area_lt_y_ = *((double*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_custom_area_right(void* data, long* len) -{ - SANE_Fixed* v = (SANE_Fixed*)data; - - custom_area_br_x_ = *((double*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_custom_area_bottom(void* data, long* len) -{ - SANE_Fixed* v = (SANE_Fixed*)data; - - custom_area_br_y_ = *((double*)data); - - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_img_quality(void* data, long* len) -{ - std::string str((char*)data); - int ret = SCANNER_ERR_OK; - int old = is_quality_; - char errbuf[40] = { 0 }; - - utils::to_log(LOG_LEVEL_DEBUG, "Change quality from '%s' to '%s' = %s\n", is_img_quality(is_quality_).c_str() - , (char*)data, hg_scanner_err_name(ret, errbuf)); - - is_quality_ = match_best_img_quality(str,NULL); - /*if (!check_resolution_and_quality(resolution_, is_img_quality(is_quality_).c_str())) - { - is_quality_ = old; - ::strcpy((char*)data, is_img_quality(is_quality_).c_str()); - - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - }*/ - return SCANNER_ERR_OK; -} -int hg_scanner::setting_color_fill(void* data, long* len) -{ - is_color_fill = *((bool *)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_keep_watermark(void* data, long* len) -{ - keep_watermark_ = *(bool*)data; - on_pic_type(keep_watermark_); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_black_white_threshold(void* data, long* len) -{ - bw_threshold_ = (unsigned char)(*(SANE_Int*)data); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_white_pixel_0(void* data, long* len) -{ - is_white_0_ = *(bool*)data; - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_feedmode(void* data, long* len) -{ - if (is_auto_feedmode_) - { - return SCANNER_ERR_OK;; - } - std::string str((char *)data); - int val = match_best_paper_strength(str,NULL); - - if (val == feedmode_) - return SCANNER_ERR_OK; - - char errbuf[40] = { 0 }; - int ret = on_set_feedmode(val); - if (ret == SCANNER_ERR_OK) - feedmode_ = val; - - utils::to_log(LOG_LEVEL_DEBUG, "setfeedmode from '%s' to '%s' = %s\n", is_paper_strength(feedmode_).c_str() - , (char*)data, hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner::setting_sleeptime(void* data, long* len) -{ - std::string str((char *)data); - int val = match_best_sleep_time(str,0); - int mintosec = 0; - switch (val) - { - case SLEEP_TIME_0MIN: - val = -1; //不休眠 -1 - break; - case SLEEP_TIME_5MIN: - val = 5; - break; - case SLEEP_TIME_10MIN: - val = 10; - break; - case SLEEP_TIME_30MIN: - val = 30; - break; - case SLEEP_TIME_60MIN: - val = 60; - break; - case SLEEP_TIME_120MIN: - val = 120; - break; - case SLEEP_TIME_240MIN: - val = 240; - break; - } - - /*if (val == sleeptime_) - return SCANNER_ERR_OK;*/ - - mintosec = val ; - if (val != -1) - { - mintosec = val * 60; - } - - char errbuf[40] = { 0 }; - int ret = set_sleep_time(mintosec); - if (ret == SCANNER_ERR_OK) - sleeptime_ = val; - - utils::to_log(LOG_LEVEL_DEBUG, "set sleeptime from (%s)min to (%s)min = %s\n", is_sleep_time(sleeptime_).c_str() - , (char*)data, hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner::setting_auto_pick_paper(void* data, long* len) -{ - int ret = SCANNER_ERR_OK; - is_auto_feedmode_ = *((bool *)data); - ret = on_pick_paper(is_auto_feedmode_); - - return ret; -} -int hg_scanner::setting_auto_pick_paper_threshold(void* data, long* len) - { - int ret = SCANNER_ERR_OK; - double threshold = *((double*)data); - ret = on_pick_paper_threshold(threshold); - - return ret; - } -int hg_scanner::setting_auto_paper_scan(void* data, long* len) -{ - utils::to_log(LOG_LEVEL_DEBUG, "No 'AutoScan' restroing for setting_auto_paper_scan invoked.\n"); - - auto_scan_restore_ = false; - is_auto_paper_scan = *((bool *)data); - if (!firmware_sup_wait_paper_ && is_auto_paper_scan) - { - is_auto_paper_scan = *(bool*)data = false; - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - on_is_auto_paper(is_auto_paper_scan); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_left_hole(void* data, long* len) -{ - isremove_left_hole = *((bool*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_right_hole(void* data, long* len) -{ - isremove_right_hole = *((bool*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_top_hole(void* data, long* len) -{ - isremove_top_hole = *((bool*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_low_hole(void* data, long* len) -{ - isremove_low_hole = *((bool*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_left_hole_threshold(void* data, long* len) -{ - isremove_left_hole_threshold = *((double*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_right_hole_threshold(void* data, long* len) -{ - isremove_right_hole_threshold = *((double*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_top_hole_threshold(void* data, long* len) -{ - isremove_top_hole_threshold = *((double*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_isremove_low_hole_threshold(void* data, long* len) -{ - isremove_low_hole_threshold = *((double*)data); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_fold_type(void* data, long* len) -{ - string str((char*)data); - bool exact = NULL; - int val = match_best_fold_type(str, 0); - fold_type_ = val; - return SCANNER_ERR_OK; -} -int hg_scanner::setting_color_correction(void* data, long* len) -{ - color_correction_ = *((bool*)data); - if (!color_correction_) - { - return SCANNER_ERR_OK; - } - if (pid_ == 0x239 || pid_ == 0x439) - { - if (!firmware_sup_color_corr_) - { - *((bool*)data) = color_correction_ = false; - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - } - return SCANNER_ERR_OK; -} -int hg_scanner::setting_auto_paper_scan_exit_time(void* data, long* len) -{ - string str((char*)data); - if (str.compare("15s") == 0) - is_auto_paper_scan_exit_time = 15; - else if (str.compare("30s") == 0) - is_auto_paper_scan_exit_time = 30; - else if (str.compare("60s") == 0) - is_auto_paper_scan_exit_time = 60; - else if (str.compare("2min") == 0) - is_auto_paper_scan_exit_time = 120; - else if (str.compare("4min") == 0) - is_auto_paper_scan_exit_time = 240; - else if (str.compare("8min") == 0) - is_auto_paper_scan_exit_time = 480; - else - is_auto_paper_scan_exit_time = 60; - //is_auto_paper_scan_exit_time = *((int*)data); - //utils::to_log(LOG_LEVEL_DEBUG, "set paper_scan_exit_time from (%d)min to (%s)min = %d\n", is_auto_paper_scan_exit_time, (char*)data); - return 0; -} -int hg_scanner::setting_get_dev_vid(void* data, long* len) -{ - if (io_) - { - *(int*)data = io_->get_vid(); - if (len) - *len = sizeof(int); - - return SCANNER_ERR_OK; - } - - return SCANNER_ERR_NOT_OPEN; -} -int hg_scanner::setting_get_dev_pid(void* data, long* len) -{ - if (io_) - { - *(int*)data = io_->get_pid(); - if (len) - *len = sizeof(int); - - return SCANNER_ERR_OK; - } - - return SCANNER_ERR_NOT_OPEN; -} -int hg_scanner::setting_get_dev_family(void* data, long* len) -{ - ::strcpy((char*)data, family_.c_str()); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_get_dev_name(void* data, long* len) -{ - ::strcpy((char*)data, name_.c_str()); - - return SCANNER_ERR_OK; -} -int hg_scanner::setting_get_dev_sn(void* data, long* len) -{ - if (!data) - { - return SCANNER_ERR_NO_DATA; - } - ::strcpy((char*)data, get_serial_num().c_str()); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_get_dev_fmver(void* data, long* len) -{ - if (!data) - { - return SCANNER_ERR_NO_DATA; - } - ::strcpy((char*)data, get_firmware_version().c_str()); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_get_dev_ip(void* data, long* len) -{ - if (!data) - { - return SCANNER_ERR_NO_DATA; - } - ::strcpy((char*)data, get_ip().c_str()); - return SCANNER_ERR_OK; -} -int hg_scanner::setting_get_roller_count(void* data, long* len) -{ - if (!data) - { - return SCANNER_ERR_NO_DATA; - } - if (len) - *len = sizeof(int); - return get_roller_num(*((int*)data)); -} -int hg_scanner::setting_get_history_count(void* data, long* len) -{ - if (!data) - { - return SCANNER_ERR_NO_DATA; - } - if (len) - *len = sizeof(int); - return get_history_scan_count(*((int*)data)); -} -int hg_scanner::setting_get_devs_log(void* data, long* len) -{ - if (!data) - { - return SCANNER_ERR_NO_DATA; - } - string str; - int ret = get_device_log(str); - if(ret == SCANNER_ERR_OK) - ::strcpy((char*)data, str.c_str()); - return ret; -} -int hg_scanner::setting_set_language(void* data, long* len) -{ - int err = SCANNER_ERR_OK; - LANATTR **pla = lang_get_supported_languages(); - - if (!pla) - err = SCANNER_ERR_DEVICE_NOT_SUPPORT; - else - { - std::string n(to_default_language((char*)data, nullptr)), now(""); - int id = -1, cur = lang_get_cur_code_page(); - for (int i = 0; pla[i]; ++i) - { - if (pla[i]->cp == cur) - now = pla[i]->name; - if (n == pla[i]->name) - { - id = pla[i]->cp; - break; - } - } - if (id == -1) - { - err = SCANNER_ERR_INVALID_PARAMETER; - ::strcpy((char*)data, now.c_str()); - } - else if(cur != id) - { - int lid = lang_get_string_id((char*)data, false); - - err = SCANNER_ERR_CONFIGURATION_CHANGED; - lang_set_code_page(id); - } - } - - return err; -} -int hg_scanner::setting_get_motor_ver(void* data, long* len) -{ - string str; - int ret = get_motor_board_ver(str); - if (ret == SCANNER_ERR_OK) - { - ::strcpy((char*)data, str.c_str()); - } - return ret; -} -int hg_scanner::setting_get_initial_boot_time(void* data, long* len) -{ - string str; - int ret = get_devs_time(str); - if (ret == SCANNER_ERR_OK) - { - ::strcpy((char*)data, str.c_str()); - } - return ret; -} -int hg_scanner::setting_set_discardblank(void* data, long* len) -{ - is_discardblank = *(bool*)data; - return SCANNER_ERR_OK; -} -int hg_scanner::on_color_mode_changed(int& color_mode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_paper_changed(int& paper) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_paper_check_changed(bool& check) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_resolution_changed(int& dpi) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_ultrasonic_check_changed(bool& check) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_staple_check_changed(bool& check) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_skew_check_changed(bool& check) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_skew_check_level_changed(int& check) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_set_feedmode(int feedmode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_get_feedmode(int &feedmode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_pic_type(bool& pic) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_pick_paper(bool autostrength) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_pick_paper_threshold(double threshold) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_is_auto_paper(bool isautopaper) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_cis_get_image(bool isautopaper) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -void hg_scanner::on_device_reconnected(void) -{ - std::lock_guard lock(io_lock_); - - utils::to_log(LOG_LEVEL_DEBUG, "%04x:%04x reconnected.\n", io_->get_vid(), io_->get_pid()); -} -int hg_scanner::set_setting_value(const char* name, void* data, long* len) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::on_scanner_closing(bool force) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -void hg_scanner::thread_handle_usb_read(void) -{ -} -void hg_scanner::thread_handle_islock_read(void) -{ -} -void hg_scanner::adjust_color(hg_imgproc::HIMGPRC handle) -{ - int tableLength = 0; // ZERO length perform color-adjust only - unsigned char buffer1[256 * 3]; - - if (custom_gamma_) - { - if (img_conf_.pixtype == COLOR_MODE_BLACK_WHITE || img_conf_.pixtype == COLOR_MODE_256_GRAY) - { - tableLength = 256; - memcpy(buffer1, custom_gamma_val_->table + 256 * GAMMA_INDEX_GRAY, tableLength); - } - else - { - // convert R[256] + G[256] + B[256] to BGR[256] ... - // - // To be modified: here should be color[256] + R[256] + G[256] + B[256] to BGR[256], final pixel = color[R[x]] - commented on 2023-08-07 - tableLength = 256 * 3; - for (int i = 0; i < 256; ++i) - { - //buffer1[i * 3 + 0] = custom_gamma_val_->table[256 * GAMMA_INDEX_BLUE + i]; - //buffer1[i * 3 + 1] = custom_gamma_val_->table[256 * GAMMA_INDEX_GREEN + i]; - //buffer1[i * 3 + 2] = custom_gamma_val_->table[256 * GAMMA_INDEX_RED + i]; - buffer1[i * 3 + 0] = custom_gamma_val_->table[256 * GAMMA_INDEX_COLOR + custom_gamma_val_->table[256 * GAMMA_INDEX_BLUE + i]]; - buffer1[i * 3 + 1] = custom_gamma_val_->table[256 * GAMMA_INDEX_COLOR + custom_gamma_val_->table[256 * GAMMA_INDEX_GREEN + i]]; - buffer1[i * 3 + 2] = custom_gamma_val_->table[256 * GAMMA_INDEX_COLOR + custom_gamma_val_->table[256 * GAMMA_INDEX_RED + i]]; - } - } - } - hg_imgproc::adjust_color(handle, buffer1, tableLength); -} -hg_imgproc::IMGPRCPARAM hg_scanner::get_image_process_object(int model) -{ - hg_imgproc::IMGPRCPARAM param; - hg_imgproc::HIMGPRC handle = nullptr; - //float bright = img_conf_.brightness, - // contrast = img_conf_.contrast; - - bzero(¶m, sizeof(param)); - param.bits = 8; - //image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE - - param.black_white = image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE; - if (image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW && is_multiout) - param.channels = 1; - else if ((image_prc_param_.bits.multi_out == MULTI_OUT_ALL - || image_prc_param_.bits.multi_out == MULTI_COLOR_AND_GRAY - ||image_prc_param_.bits.multi_out== MULTI_COLOR_AND_BW) && is_multiout) - param.channels = 3; - else - param.channels = (image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS || image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH) ? 3 : 1; - - param.color_mode = image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH ? 2 : image_prc_param_.bits.color_mode; - param.double_side = img_conf_.is_duplex; - param.dpi = img_conf_.resolution_dst; - param.cis_image = is_cis_image; - //img_conf_.brightness = (float)bright_; - //img_conf_.contrast = (float)contrast_; - - return param; -} -SANE_Image_Statu hg_scanner::last_usb_image_statu(int err) -{ - SANE_Image_Statu statu = IMG_STATUS_OK; - - if (!is_continue_when_double_paper(double_paper_handle_) && - is_save_img_when_double_paper(double_paper_handle_)) - { - if (err == SCANNER_ERR_DEVICE_DOUBLE_FEEDING) - statu = IMG_STATUS_DOUBLE; - //else if (err == SCANNER_ERR_DEVICE_PAPER_JAMMED) - //statu = SANE_Image_Statu_Jammed; - } - - return statu; -} -void hg_scanner::init_settings(const char* json_setting_text) -{ - std::string text(json_setting_text); - gb_json* jsn = new gb_json(); - - // set fixed values ... dev-vid/dev-pid/dev-name/dev-model/roller-life - if (jsn->attach_text(&text[0])) - { - gb_json* child = nullptr; - - // fixed values ... - jsn->get_value(SANE_STD_OPT_NAME_DEVICE_VID, child); - if (child) - { - child->set_value("cur", io_->get_vid()); - child->set_value("default", io_->get_vid()); - child->release(); - } - - jsn->get_value(SANE_STD_OPT_NAME_DEVICE_PID, child); - if (child) - { - child->set_value("cur", io_->get_pid()); - child->set_value("default", io_->get_pid()); - child->release(); - } - - jsn->get_value(SANE_STD_OPT_NAME_DEVICE_NAME, child); - if (child) - { - child->set_value("cur", name_.c_str()); - child->set_value("default", name_.c_str()); - child->release(); - } - - jsn->get_value(SANE_STD_OPT_NAME_DEVICE_MODEL, child); - if (child) - { - child->set_value("cur", family_.c_str()); - child->set_value("default", family_.c_str()); - child->release(); - } - - jsn->get_value(SANE_STD_OPT_NAME_ROLLER_LIFE, child); - if (child) - { - child->set_value("cur", 450000); - child->set_value("default", 450000); - child->release(); - } - - // fixed values from device ... - jsn->get_value(SANE_STD_OPT_NAME_FIRMWARE_VERSION, child); - if(child) - { - std::string val(get_firmware_version()); - child->set_value("cur", val.c_str()); - child->set_value("default", val.c_str()); - child->release(); - } - jsn->get_value(SANE_STD_OPT_NAME_DEVICE_SERIAL_NO, child); - if(child) - { - std::string val(get_serial_num()); - child->set_value("cur", val.c_str()); - child->set_value("default", val.c_str()); - child->release(); - } - jsn->get_value(SANE_STD_OPT_NAME_DEVICE_IP_ADDR, child); - if(child) - { - std::string val(get_ip()); - child->set_value("cur", val.c_str()); - child->set_value("default", val.c_str()); - child->release(); - } - - text = std::move(jsn->to_string()); - } - jsn->release(); - - set_opt_json_text(&text[0]); -} -int hg_scanner::init_settings(int pid) -{ - char rel_path[80] = { 0 }; - std::string root(utils::get_module_full_path(MODULE_NAME_SCANNER)), jsn(""); - int ret = root.rfind(PATH_SEPARATOR[0]); - - if((size_t)ret++ == std::string::npos) - ret = 0; - root.erase(ret); - sprintf(rel_path, "%ssettings%s%04x.hsc", PATH_SEPARATOR, PATH_SEPARATOR, pid); - root += rel_path; - ret = load_scanner_setting(root.c_str(), jsn); - utils::to_log(LOG_LEVEL_WARNING, "Apply '%s' setting: %d\n", root.c_str(), ret); - if (ret) - return SCANNER_ERR_DATA_DAMAGED; - - init_settings(jsn.c_str()); - - return SCANNER_ERR_OK; -} -int hg_scanner::on_scann_error(int err) -{ - status_ = err; - - utils::to_log(LOG_LEVEL_FATAL, "[xxx]Device status: 0x%x\n", err); - - unsigned int e = err; - char errbuf[40] = { 0 }; - - return ui_ev_cb_((scanner_handle)this, SANE_EVENT_ERROR, (void*)hg_scanner_err_name(err, errbuf), &e, NULL); -} -int hg_scanner::try_third_app_handle_start(bool& handled) -{ - int ret = SCANNER_ERR_OK; - - handled = false; - return ret; - - handled = !async_io_; - if (handled) - { - while (wait_usb_result_.try_wait()) - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - - if (!wait_img_.is_waiting() || !wait_usb_.is_waiting() || final_imgs_.size()) - { - // working or has images ... - while (final_imgs_.size() == 0) - { - if (wait_img_.is_waiting() && wait_usb_.is_waiting()) - break; - - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - } - if (final_imgs_.size() == 0) - { - final_img_index_ = 0; - - if (user_cancel_) - handled = false; - else if (status_ == SCANNER_ERR_OK) - ret = SCANNER_ERR_DEVICE_NO_PAPER; - else - ret = status_; - } - } - else if (final_img_index_) - { - final_img_index_ = 0; - - if (user_cancel_) - handled = false; - else if (status_ == SCANNER_ERR_OK) - ret = SCANNER_ERR_DEVICE_NO_PAPER; - else - ret = status_; - } - else - handled = false; - } - - return ret; -} -int hg_scanner::try_third_app_after_start(int err) -{ - //if (!async_io_) - //{ - // while (wait_img_.is_waiting() && !wait_usb_.is_waiting()) - // std::this_thread::sleep_for(std::chrono::milliseconds(10)); - // if (wait_img_.is_waiting() && wait_usb_.is_waiting()) - // err = status_; - // - //} - - return err; -} -std::shared_ptr hg_scanner::aquire_memory(int size, bool from_usb) -{ - std::string lead(from_usb ? "usb" : "imgp"), ext(from_usb ? "jpg" : "dat"); - unsigned int ind = from_usb ? usb_img_index_ : final_img_index_; - std::shared_ptr mem(new tiny_buffer(size, final_path_.c_str(), lead.c_str(), ext.c_str(), ind)); - - if (!mem->data(0, (unsigned int*)&size)) - { - mem.reset(); - utils::log_info("Can't aquire enough memory, working must be stopped!\n", LOG_LEVEL_FATAL); - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_INSUFFICIENT_MEMORY, nullptr), SANE_EVENT_ERROR, SCANNER_ERR_INSUFFICIENT_MEMORY); - stop(); - } - - return mem; -} -int hg_scanner::notify_ui_working_status(const char* msg, int ev, int status) -{ - unsigned int s = status; - - return ui_ev_cb_((scanner_handle)this, ev, (void*)msg, &s, NULL); -} -bool hg_scanner::waiting_for_memory_enough(unsigned need_bytes) -{ - return true; // disable the memory control - added on 2022-03-22 - - bool ret = true; - - if(cb_mem_) - { - int ret = ui_ev_cb_((scanner_handle)this, SANE_EVENT_IS_MEMORY_ENOUGH, NULL, &need_bytes, NULL); - - if (ret == SCANNER_ERR_INSUFFICIENT_MEMORY) - { - user_cancel_ = true; - status_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - ret = false; - } - else if (ret == SCANNER_ERR_NOT_ANY_MORE) - cb_mem_ = false; - } - else - { - need_bytes *= 4; - - void* buf = malloc(need_bytes); - bool first = true; - while (!buf && !user_cancel_) - { - if (first) - { - utils::to_log(LOG_LEVEL_DEBUG, "Memory is too small for aquiring image(%u bytes), wait for ENOUGH ...\n", need_bytes); - notify_ui_working_status(from_default_language(STATU_DESC_WAIT_FOR_MEM, nullptr)); - first = false; - } - std::this_thread::sleep_for(std::chrono::milliseconds(30)); - buf = malloc(need_bytes); - } - if (!first) - { - if (buf) - { - utils::to_log(LOG_LEVEL_DEBUG, "waited for memory need(%u)\n", need_bytes); - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "canceled by user while waiting for memory need(%u)\n", need_bytes); - } - } - ret = (!user_cancel_) && (buf != NULL); - if (buf) - free(buf); - } - - return ret; -} -void hg_scanner::copy_to_sane_image_header(SANE_Parameters* header, int w, int h, int line_bytes, int channels, int bits) -{ - if (channels == 3) - header->format = SANE_FRAME_RGB; - else - header->format = SANE_FRAME_GRAY; - header->depth = bits >= 8 ? 8 : bits; // 此处指每一个颜色分量的位深,我们的扫描仪固定为“8” - header->last_frame = SANE_TRUE; // 一幅图片如果各个分量相互分离,则最后一个分量的时候设置为true。彩色图像RGB时也只有一“帧”,所以也为true - header->pixels_per_line = w; - header->lines = h; - header->bytes_per_line = line_bytes; -} -int hg_scanner::save_usb_data(std::shared_ptr data) -{ - int ret = SCANNER_ERR_OK; - unsigned int bytes = data->size(); - - usb_img_index_++; - utils::to_log(LOG_LEVEL_DEBUG, "USB read one picture with %u bytes\n", data->size()); - if (dump_usb_path_.length()) //这两台设备不是jpg的图 所以不能直接处理 - { - char name[80] = { 0 }; - FILE* dst = nullptr; - - sprintf(name, "%s%03u_usb_img.jpg", PATH_SEPARATOR, usb_img_index_); - if ((dst = fopen((dump_usb_path_ + name).c_str(), "wb"))) - { - unsigned int off = 0, len = bytes; - unsigned char* buf = data->data(off, &len); - while (buf) - { - fwrite(buf, 1, len, dst); - off += len; - if (off >= bytes) - break; - len = bytes - off; - buf = data->data(off, &len); - } - fclose(dst); - } - } - if (!data->swap()) - { - ret = SCANNER_ERR_OPEN_FILE_FAILED; - } - else - { - int num = 0; - float Memoryusae = .0f; // hg_log::GetAppMemoryUsage();; - size_t que_size = 0; - imgs_.Size(&que_size); - Memoryusae = que_size / 1024.0f / 1024.0f; - if (async_io_) - Memoryusae *= 10; - else - Memoryusae += final_imgs_.mem_usage() / 1024.0f / 1024.0f; - while (Memoryusae >= memory_size_ && !user_cancel_ && num < 20)//三个条件以防止卡死 - { - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - //Memoryusae = hg_log::GetAppMemoryUsage(); - imgs_.Size(&que_size); - Memoryusae = que_size / 1024.0f / 1024.0f; - if (async_io_) - Memoryusae *= 10; - else - Memoryusae += final_imgs_.mem_usage() / 1024.0f / 1024.0f; - if(num++ == 0) - utils::to_log(LOG_LEVEL_DEBUG, "Memory Usage is Too big:%f ,Please wait -_- ...\r\n", Memoryusae); - } - if (num && Memoryusae >= memory_size_ && !user_cancel_) - { - utils::to_log(LOG_LEVEL_WARNING, "Warning: memory usage(%.2fMB) maybe leading exception!\r\n", Memoryusae); - } - imgs_.Put(data, data->size(), hg_scanner_mgr::unique_id()); - if (wait_img_.is_waiting()) - wait_img_.notify(); - } - - if((serial_ != G10039Serial && serial_ != G20039Serial) || (usb_img_index_ & 1)) - ui_ev_cb_((scanner_handle)this, SANE_EVENT_USB_DATA_RECEIVED, NULL, &bytes, NULL); - - return ret; -} -int hg_scanner::save_final_image(hg_imgproc::LPIMGHEAD head, void* buf, uint32_t id) -{ - std::string bw(""); - - final_img_index_++; - bool is_1bit = false; - if (image_prc_param_.bits.multi_out == MULTI_OUT_ALL && is_multiout) - { - if(final_img_index_%3 == 0) - is_1bit = true; - } - else if ((image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW||image_prc_param_.bits.multi_out == MULTI_COLOR_AND_BW) && is_multiout) - { - if(final_img_index_%2 == 0) - is_1bit = true; - } - - if ((image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE && !is_multiout) || (is_1bit && is_multiout)) - { - int old = head->line_bytes; - /*/ - bw = bmp_821((unsigned char*)buf, head->width, head->height, &head->line_bytes, async_io_, bw_threshold_, is_white_0_); - /*/ - bw = hg_imgproc::bmp8_2_1bit((unsigned char*)buf, head->width, head->height, head->line_bytes, bw_threshold_, is_white_0_, async_io_); - head->line_bytes = bw.length() / head->height;////////*////////// - buf = &bw[0]; - head->channels = head->bits = 1; - head->total_bytes = head->line_bytes * head->height; - utils::to_log(LOG_LEVEL_DEBUG, "convert to 1-bit bmp(%d * %d), total = %u, len = %u , black_white_image_threshold_ =%d\n", head->width, head->height, head->total_bytes, bw.length(), bw_threshold_); - } - - if (async_io_) - { - SANE_Image img; - - ZERO_STRUCT(&img); - copy_to_sane_image_header(&img.header, head->width, head->height, head->line_bytes, head->channels, head->bits); - img.data = (unsigned char*)buf; - img.bytes = head->total_bytes; - img.flag.statu = head->statu; - img.flag.dpi = resolution_; - img.src_id = id; - - if (img.flag.statu) - { - utils::to_log(LOG_LEVEL_DEBUG, "some error with final image: %s\n", hg_scanner_image_statu_name(img.flag.statu)); - } - - return ui_ev_cb_((scanner_handle)this, SANE_EVENT_IMAGE_OK, &img, &final_img_index_, NULL); - } - - if (final_imgs_.put(head->width, head->height, head->bits, head->channels, head->line_bytes, buf, head->total_bytes - , final_path_.c_str(), "final", "dat", final_img_index_, id)) - return SCANNER_ERR_OK; - else - return SCANNER_ERR_INSUFFICIENT_MEMORY; -} -void hg_scanner::adjust_filling_hole(LPSCANCONF conf) -{ - int maxval = 0; -#define SET_FILL_HOLE(member, me) \ - conf->fillholeratio_##member = isremove_##me##_hole ? isremove_##me##_hole_threshold * 100 + .5f : 0; \ - if(conf->fillholeratio_##member < 0) \ - conf->fillholeratio_##member = 0; \ - else if(conf->fillholeratio_##member > 50) \ - conf->fillholeratio_##member = 50; \ - if(maxval < conf->fillholeratio_##member) \ - maxval = conf->fillholeratio_##member; - - SET_FILL_HOLE(up, top); - SET_FILL_HOLE(down, low); - SET_FILL_HOLE(left, left); - SET_FILL_HOLE(right, right); - - if (maxval) - { - conf->fillhole.is_fillhole = true; - conf->fillhole.fillholeratio = maxval; - } -} -int hg_scanner::is_running(void) -{ - if (!scan_life_) - return THREAD_RUNNING_IDLE; - - int run = THREAD_RUNNING_IDLE; - if (!wait_usb_.is_waiting()) - run |= THREAD_RUNNING_USB; - if (!wait_img_.is_waiting()) - run |= THREAD_RUNNING_IMAGE; - - return run; -} -int hg_scanner::reset_io(usb_io* io) -{ - online_ = false; - if (!io) - return SCANNER_ERR_INVALID_PARAMETER; - - { - std::lock_guard lock(io_lock_); - - usb_io* old = io_; - - io->add_ref(); - io_ = io; - status_ = io_->last_error(); - online_ = status_ == SCANNER_ERR_OK; - if (old) - old->release(); - } - on_device_reconnected(); - - return SCANNER_ERR_OK; -} -int hg_scanner::io_disconnected(void) -{ - std::lock_guard lock(io_lock_); - - online_ = false; - io_->on_disconnected(); - - return SCANNER_ERR_OK; -} -void hg_scanner::set_ui_callback(sane_callback cb, bool enable_async_io) -{ - ui_ev_cb_ = cb ? cb : ui_default_callback; - async_io_ = enable_async_io; - is_white_0_ = !async_io_; -} -void hg_scanner::set_image_processor(imgproc_mgr* proc) -{ - if (img_processor_) - { - img_processor_->release(); - } - img_processor_ = proc; - if (img_processor_) - { - img_processor_->add_ref(); - } + close(); } -void hg_scanner::set_dev_family(const char* family) -{ - family_ = family ? family : ""; -} -void hg_scanner::set_read_over_with_no_data(bool no_data) -{ - read_over_with_no_data_ = no_data; -} -int hg_scanner::get_pid(void) -{ - std::lock_guard lock(io_lock_); - return io_->get_pid(); -} -int hg_scanner::get_vid(void) +shared_memory* hg_scanner::create_device_singleton(int vid, int pid, int addr) { - std::lock_guard lock(io_lock_); + unsigned long long key = vid; + key <<= 16; + key |= pid; + key <<= 16; + key |= addr; - return io_->get_vid(); + return new shared_memory(key); } -int hg_scanner::close(bool force) -{ - int ret = on_scanner_closing(force); - - online_ = false; - if (ret == SCANNER_ERR_OK) - { - run_ = false; - wait_usb_.notify(); - wait_img_.notify(); - - if (thread_devslock_handle_.get()) - wait_devsislock_.notify(); - //wait_read_int.notify(); - - if(!scan_life_) - { - std::lock_guard lock(io_lock_); - - if (io_) - { - io_->close(); - io_->release(); - io_ = NULL; - } - } - else if (io_) - { - utils::log_info("close scanner: USB thread or Image thread is still running.\n", LOG_LEVEL_WARNING); - io_->close(); - while (scan_life_) - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - io_->release(); - io_ = NULL; - } - status_ = SCANNER_ERR_NOT_OPEN; - } - - return ret; -} -int hg_scanner::set_setting(const char* name, void* data) +void hg_scanner::init(void) { - std::string real_n(name); - int ret = SCANNER_ERR_OUT_OF_RANGE, refine = 0; - bool hit = setting_map_.count(real_n) > 0; - long len = 0; - - if (hit) + auto on_status = [this](uint32_t statu) ->void { - ret = (this->*setting_map_[real_n])(data, &len); - } - else + //status_ = statu; + }; + auto on_image_received = [this](LPPACKIMAGE pimg, uint64_t size) ->data_holder_ptr { - utils::to_log(LOG_LEVEL_WARNING, "Setting '%s' is not found in base setting functions.\n", real_n.c_str()); - ret = set_setting_value(real_n.c_str(), data, &len); - } - - return ret; -} -int hg_scanner::get_setting(const char* name, char* buf, int* len) -{ - if (!len) - return SCANNER_ERR_INVALID_PARAMETER; + data_holder_ptr pdh = nullptr; - return SCANNER_ERR_OK; -} -std::string hg_scanner::name(void) -{ - return name_; -} -int hg_scanner::status(void) -{ - if (!online_) - return SCANNER_ERR_DEVICE_NOT_FOUND; - else if (!wait_usb_.is_waiting() || !wait_img_.is_waiting()) - return SCANNER_ERR_DEVICE_BUSY; - else - return status_; -} -bool hg_scanner::is_online(void) -{ - return online_; -} -int hg_scanner::wait_one_image_from_start(bool& handled) -{ - int ret = SCANNER_ERR_OK; + return pdh; + }; - handled = false; - if (!async_io_) // non-callback + auto privilege = [this](int priv) -> bool { - while (is_running() != THREAD_RUNNING_IDLE) - { - handled = true; - if (final_imgs_.size()) - { - break; - } - } - - if (final_imgs_.size()) - { - IMH head = { 0 }; - - handled = true; - if (final_imgs_.front(&head)) - { - if (head.statu & IMG_STATUS_DOUBLE) - ret = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; - else if (head.statu & IMG_STATUS_JAM) - ret = SCANNER_ERR_DEVICE_PAPER_JAMMED; - else if (head.statu & IMG_STATUS_STAPLE) - ret = SCANNER_ERR_DEVICE_STAPLE_ON; - else if (head.statu & IMG_STATUS_SIZE_ERR) - ret = SCANNER_ERR_DEVICE_SIZE_CHECK; - else if (head.statu & IMG_STATUS_DOGEAR) - ret = SCANNER_ERR_DEVICE_DOGEAR; - } - } - else if (handled) // overed normal or exception - { - if (status_ == SCANNER_ERR_OK - || status_ == SCANNER_ERR_DEVICE_DOUBLE_FEEDING) // 双张特殊处理,视为成功 - { - SANE_Bool has_paper = SANE_FALSE; - - get_scanner_paperon(has_paper); - if (has_paper == SANE_TRUE) - handled = false; - else - ret = SCANNER_ERR_DEVICE_NO_PAPER; - } - else - ret = status_; - } - } - - return ret; -} -int hg_scanner::start(void) -{ - int ret = SCANNER_ERR_OK; - bool handled = false; - - if (user_cancel_) + return user_->has_privilege(priv); + }; + auto privilege_empty = [this](int priv) -> bool { - user_cancel_ = false; // stopped by user, reset flag and starting a new scanning ... - utils::to_log(LOG_LEVEL_DEBUG, "start after user stopped just now while with %d image(s) in queue, a new scanning will to be started ...\n", final_imgs_.size()); - } - else + return true; + }; + auto logmsg = [&](const char* msg) -> void { - ret = wait_one_image_from_start(handled); - if (handled) - { - utils::to_log(LOG_LEVEL_DEBUG, "start in previous scanning and result is %s, image count %d\n", hg_scanner_err_description(ret), final_imgs_.size()); - return ret; - } - } + utils::to_log(LOG_LEVEL_DEBUG, msg); + }; - // clear ... - imgs_.Clear(); - final_imgs_.clear(); - usb_img_index_ = final_img_index_ = 0; - status_ = SCANNER_ERR_OK; + scanner_ = new scanner_handler(); + scanner_->set_image_receiver(on_image_received); + scanner_->set_status_notifyer(on_status); - // start ... - ret = do_start(); + std::string opts(""); + int ret = scanner_->option_get_all(opts); if (ret == SCANNER_ERR_OK) { - // wait ONE picture or stopped - ret = wait_one_image_from_start(handled); + set_opt_json_text(&opts[0]); + if(user_) + dev_opts_ = new device_option(privilege, logmsg); + else + dev_opts_ = new device_option(privilege_empty, logmsg); + dev_opts_->add(this); + } + else + { + status_ = ret; } - utils::to_log(LOG_LEVEL_DEBUG, "start scanning result = %s\n", hg_scanner_err_description(ret)); - - return ret; } -int hg_scanner::get_image_info(SANE_Parameters* ii) +void hg_scanner::thread_image_processor(void) +{ + imgproc_mgr * processor = imgproc_; + img_receiver* raw = nullptr; + + processor->add_ref(); + while (raw_imgs_.take(raw, true)) + { + } + processor->release(); +} + +int hg_scanner::start(void) { int ret = SCANNER_ERR_OK; - IMH imh; - fetching_id_ = -1; - bzero(&imh, sizeof(imh)); - bzero(ii, sizeof(*ii)); - while ((!wait_img_.is_waiting() || !wait_usb_.is_waiting()) && final_imgs_.size() <= 0) - this_thread::sleep_for(chrono::milliseconds(10)); - - if (final_imgs_.size() <= 0) - ret = SCANNER_ERR_NO_DATA; - else - { - if (!final_imgs_.front(&imh)) - ret = SCANNER_ERR_NO_DATA; - else - { - copy_to_sane_image_header(ii, imh.width, imh.height, imh.line_bytes, imh.channels, imh.bits); - fetching_id_ = imh.src_id; - } - } - - if (ret == SCANNER_ERR_NO_DATA /*&& final_img_index_ == 0*/) - { - //if (status_ != SCANNER_ERR_OK && status_ != SCANNER_ERR_DEVICE_BUSY) - // ret = SCANNER_ERR_NO_DATA; - //else - { - ii->depth = image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE ? 1 : 8; - ii->last_frame = SANE_TRUE; - ii->format = image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS || image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH ? - SANE_FRAME_RGB : SANE_FRAME_GRAY; - - SIZE paper = paper_size(image_prc_param_.bits.paper); - ii->pixels_per_line = paper.cx * 1.0f / 25.4 * resolution_ + .5f; - ii->lines = paper.cy * 1.0f / 25.4 * resolution_ + .5f; - ii->bytes_per_line = ii->format == SANE_FRAME_RGB ? ii->pixels_per_line * 3 : ii->pixels_per_line; - if (ii->bytes_per_line > ii->pixels_per_line) - imh.bits = 24; - else - imh.bits = 8; - - ret = SCANNER_ERR_OK; - } - } - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "Get image info(%d * %d * %d) = %s\n", ii->pixels_per_line, ii->lines, imh.bits, hg_scanner_err_name(ret, errbuf)); + cancelled_ = false; + if (scanner_) + ret = scanner_->scan_start(); return ret; } -int hg_scanner::read_image_data(unsigned char* buf, int* len) -{ - if (!len) - return SCANNER_ERR_INVALID_PARAMETER; - - if (!buf) - { - IMH imh; - final_imgs_.front(&imh); - *len = imh.bytes; - - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - if (final_imgs_.size() > 0) - { - int fetch = *len; - bool over = false; - - final_imgs_.fetch_front(buf, len, &over); - if (over) - { - if (read_over_with_no_data_) - return SCANNER_ERR_NO_DATA; - } - - return SCANNER_ERR_OK; - } - else - { - *len = 0; - return SCANNER_ERR_NO_DATA; - } -} int hg_scanner::stop(void) { int ret = SCANNER_ERR_OK; - user_cancel_ = true; - ret = do_stop(); - - // wait until really stopped ... - if (ret == SCANNER_ERR_OK) - { - while (is_running() != THREAD_RUNNING_IDLE) - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - ret = status_; - } - utils::to_log(LOG_LEVEL_DEBUG, "user stopped result = %s\n", hg_scanner_err_description(ret)); + cancelled_ = true; + if (scanner_) + ret = scanner_->scan_stop(); return ret; } -int hg_scanner::reset(void) +int hg_scanner::close(void) +{ + int ret = SCANNER_ERR_OK; + + if (scanner_) + { + ret = scanner_->close(); + if (ret) + return ret; + scanner_->release(); + scanner_ = nullptr; + } + + if (dev_opts_) + { + dev_opts_->clear(); + dev_opts_->release(); + dev_opts_ = nullptr; + } + + if (singleton_) + { + singleton_->release(); + singleton_ = nullptr; + } + + // wait image thread ... + if (imgpr_thread_.get() && imgpr_thread_->joinable()) + imgpr_thread_->join(); + + if (imgproc_) + { + imgproc_->release(); + imgproc_ = nullptr; + } + user_ = nullptr; + + return ret; +} +int hg_scanner::re_connect(void) +{ + return SCANNER_ERR_OK; +} +int hg_scanner::get_image_info(SANE_Parameters* pii) +{ + return SCANNER_ERR_OK; +} +int hg_scanner::read_image_data(uint8_t* buf, size_t* len) +{ + return SCANNER_ERR_OK; +} +int hg_scanner::status(void) { return status_; } -int hg_scanner::device_io_control(unsigned long code, void* data, unsigned* len) +std::string hg_scanner::status_message(void) { - //SANE_Bool devs_status = false; - //int ret = get_scan_is_sleep(devs_status); - //if (ret == SCANNER_ERR_OK) - //{ - // if (!devs_status) - // { - // if (pid_ == 0x239 || pid_ == 0x402) - // { - // set_notify_sleep(); - // } - // return SCANNER_ERR_DEVICE_SLEEPING; - // } - //} - if (code == IO_CTRL_CODE_RESTORE_SETTINGS) - { - long l = len ? *len : 0; - int ret = invoke_setting_xxx(&hg_scanner::setting_restore, data, &l); - - if (ret == SCANNER_ERR_OK) - { - ret = SCANNER_ERR_CONFIGURATION_CHANGED; - } - if (len) - *len = l; - - return ret; - } - else if (code == IO_CTRL_CODE_GET_DEFAULT_VALUE) - { - //if (*len <= 0) - //{ - // *len = setting_jsn_->count() + 1; - - // return SCANNER_ERR_OK; - //} - //else if (*len >= setting_jsn_->count()) - //{ - // return SCANNER_ERR_OUT_OF_RANGE; - //} - //else - //{ - // std::string val(setting_jsn_->get_option_value((int)*len, SANE_ACTION_GET_DEFAULT_VALUE)); - // memcpy(data, &val[0], val.length()); - - return SCANNER_ERR_OK; - //} - } - else if (code == IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT) - { - return set_clear_roller_num(); - } - else if (code == IO_CTRL_CODE_SET_CLEAR_HISTORY_COUNT) - { - return set_clear_history_num(); - } - else if (code == IO_CTRL_CODE_GET_FINAL_IMAGE_FORMAT) - { - SANE_FinalImgFormat* fmt = (SANE_FinalImgFormat*)data; - if (!fmt) - { - *len = sizeof(SANE_FinalImgFormat); - - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - if (img_type_ == ".bmp") - fmt->img_format = SANE_IMAGE_TYPE_BMP; - else if (img_type_ == ".jpg") - fmt->img_format = SANE_IMAGE_TYPE_JPG; - else if (img_type_ == ".png") - fmt->img_format = SANE_IMAGE_TYPE_PNG; - else if (img_type_ == ".gif") - fmt->img_format = SANE_IMAGE_TYPE_GIF; - else - fmt->img_format = SANE_IMAGE_TYPE_BMP; - - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_SET_FINAL_IMAGE_FORMAT) - { - SANE_FinalImgFormat* fmt = (SANE_FinalImgFormat*)data; - - return set_final_image_format(fmt); - } - else if (code == IO_CTRL_CODE_GET_FINAL_COMPRESSION) - { - *(int*)data = SANE_COMPRESSION_NONE; - - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_SET_FINAL_COMPRESSION) - { - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - else if(code == IO_CTRL_CODE_TEST_SINGLE) - { - return set_leaflet_scan(); - } - else if (code == IO_CTRL_CODE_SET_AUTO_COLOR_TYPE) - { - return set_auto_color_type(); - } - else if(code == IO_CTRL_CODE_GET_HARDWARE_VERSION) - { - - std::string fw = get_firmware_version(); - if (fw.empty()) - { - return SCANNER_ERR_NO_DATA; - } - if (*len < fw.size() + 1) - { - *len = fw.size() + 1; - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - if (data && fw.length()) - ::strcpy((char*)data, fw.c_str()); - - return SCANNER_ERR_OK; - } - else if(code == IO_CTRL_CODE_GET_SERIAL) - { - if (!is_online()) - return SCANNER_ERR_DEVICE_NOT_FOUND; - - std::string ser = get_serial_num(); - if (*len < ser.size() + 1) - { - *len = ser.size() + 1; - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - if(data && ser.length()) - ::strcpy((char*)data, ser.c_str()); - - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_GET_IP) - { - std::string ip = get_ip(); - if (*len < ip.size() + 1) - { - *len = ip.size() + 1; - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - if(data && ip.length()) - ::strcpy((char*)data, ip.c_str()); - - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_GET_PAPER_ON) - { - return get_scanner_paperon(*(SANE_Bool*)data); - } - else if(code == IO_CTRL_CODE_GET_POWER_LEVEL) - { - int val = 0, - ret = SCANNER_ERR_OK; - - if (*len < sizeof(int *)) - { - *len = sizeof(int *); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - ret = get_sleep_time(val); - if (ret == SCANNER_ERR_OK) - { - *((int *)data) = val; - } - return ret; - } - else if(code == IO_CTRL_CODE_SET_POWER_LEVEL) - { - int val = *((int*)data); - int sleeptime = 0; - - switch (val) - { - case SLEEP_TIME_0MIN: - if (pid_ == 0x300 || pid_ == 0x400) - val = INT_MAX; //3288不休眠 - else - val = -1; //不休眠 -1 3399 - break; - case SLEEP_TIME_5MIN: - val = 5; - break; - case SLEEP_TIME_10MIN: - val = 10; - break; - case SLEEP_TIME_20MIN: - val = 20; - break; - case SLEEP_TIME_30MIN: - val = 30; - break; - case SLEEP_TIME_60MIN: - val = 60; - break; - case SLEEP_TIME_120MIN: - val = 120; - break; - case SLEEP_TIME_240MIN: - val = 240; - break; - case SANE_POWER_SHUTDOWN: - return set_devshtudown(); - case SANE_POWER_RESTART: - return set_devreboot(val); - default: - val = -1; - break; - } - - sleeptime = val; - if (val != -1 && val != INT_MAX) - { - sleeptime = val * 60; - } - return set_sleep_time(sleeptime); - } - else if (code == IO_CTRL_CODE_GET_CUSTOM_GAMMA) - { - SANE_Gamma* v = (SANE_Gamma*)data; - - memcpy(v, custom_gamma_val_, sizeof(*custom_gamma_val_)); - if (len) - *len = sizeof(*custom_gamma_val_); - - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_SET_CUSTOM_GAMMA) - { - SANE_Gamma* v = (SANE_Gamma*)data; - - memcpy(custom_gamma_val_, v, sizeof(*custom_gamma_val_)); - - return SCANNER_ERR_OK; - } - else if(code == IO_CTRL_CODE_DISPLAY_APP_HELP) - { - //setting_help(data); - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_GET_IMAGE_QUEUE_COUNT) - { - *len = final_imgs_.size(); - - return wait_img_.is_waiting() && wait_usb_.is_waiting() ? SCANNER_ERR_NO_DATA : SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_GET_PAPER_SIZE) - { - std::string name((char*)data); - int paper = match_best_paper(name, NULL); - SIZE size = paper_size(paper); - - *len = (size.cx & 0x0ffff) | ((size.cy & 0x0ffff) << 16); - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_CONVERT_IMAGE_FORMAT) - { - SANE_ImageFormatConvert *conv = (SANE_ImageFormatConvert*)data; - void* threshold = conv->dst.fmt.compress.detail; - int ret = SCANNER_ERR_OK; - - conv->dst.fmt.compress.detail = (void*)bw_threshold_; - ret = hg_imgproc::convert_image_file(conv); - conv->dst.fmt.compress.detail = threshold; - - return ret; - } - else if (code == IO_CTRL_CODE_FREE_MEMORY) - { - free_memory(data); - - return SCANNER_ERR_OK; - } - else if(code == IO_CTRL_CODE_GET_LOG_FILE && len && *len == LOG_FILE_DEVICE) - { - string str; - int ret = get_device_log(str); - utils::to_log(LOG_LEVEL_DEBUG, "str = %d\n", str.length()); - - *(char*)data = 0; - if (ret != SCANNER_ERR_OK) - { - return ret; - } - ::strcpy((char*)data, str.c_str()); - return 0; - } - else if(code == IO_CTRL_CODE_SET_SCAN_LOCK_CHECK_VAL) - { - string str = (char*)data; - - return set_scan_lock_check_val(str); - } - else if (code == IO_CTRL_CODE_SET_SCAN_LOCK) - { - SANE_Bool set_islock = *((SANE_Bool *)data); - //set_scan_islock(set_islock); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - else if (code == IO_CTRL_CODE_GET_SCAN_ISLOCK) - { - - SANE_Bool islock = *((SANE_Bool*)data); - int ret = get_scan_islock(islock); - *((SANE_Bool*)data) = islock; - utils::to_log(LOG_LEVEL_DEBUG, "io ctrl islock:%d\r\n", *((SANE_Bool*)data)); - return ret; - } - else if (code == IO_CTRL_CODE_SET_FIRMWARE_UPGRADE) - { - string str = (char*)data; - return set_firmware_upgrade(str); - } - else if (code == IO_CTRL_CODE_GET_HISTORY_SCAN_NUM) - { - int num = 0; - int ret = get_history_scan_count(num); - (*(int*)data) = num; - return ret; - } - else if (code == IO_CTRL_CODE_GET_CLEAN_PAPER_ROAD) - { - return set_clean_paper_road(); - } - else if (code == IO_CTRL_CODE_GET_ROLLER_NUM) - { - int num = 0; - int ret = get_roller_num(num); - (*(int*)data) = num; - return ret; - } - else if (code == IO_CTRL_CODE_SET_FEEDMODE) - { - return on_set_feedmode(*((int*)data)); - } - else if (code == IO_CTRL_CODE_SET_SKEW_CHECK) - { - return on_skew_check_changed(*((bool*)data)); - } - else if (code == IO_CTRL_CODE_SET_SKEW_CHECK_VAL) - { - return on_skew_check_level_changed(*((int*)data)); - } - else if (code == IO_CTRL_CODE_GET_IS_MODE) - { - return get_scan_mode(*((bool*)data)); - } - else if (code == IO_CTRL_CODE_SET_ULTRASONIC_MODULE) - { - return on_ultrasonic_check_changed(*((bool*)data)); - } - else if (code == IO_CTRL_CODE_SET_SPEED_MODE) - { - return set_speed_mode(*((int*)data)); - } - else if (code == IO_CTRL_CODE_GET_SPEED_MODE) - { - return get_speed_mode(*((int*)data)); - } - else if (code == IO_CTRL_CODE_SET_CIS_IMAGE) - { - return on_cis_get_image(*((bool*)data)); - } - else if(code == IO_CTRL_CODE_GET_IMAGE) - { - return start();; - } - else if (code == IO_CTRL_CODE_SET_DISTORTION_IMAGE) - { - return set_distortion_image(*((bool*)data)); - } - else if(code == IO_CTRL_CODE_GET_PC_DISTORTION_CHECK_VAL) - { - if (distortion_val.h > 0) - { - *(SANE_DISTORTION_VAL*)data = distortion_val; - } - return SCANNER_ERR_OK; - //return get_distortion_check_val(*((int*)data)); - } - else if(code == IO_CTRL_CODE_SET_DISTORTION_DEVS_CHECK_VAL) - { - return set_devs_distortion_check_val(*((float*)data)); - } - else if (code == IO_CTRL_CODE_GET_DISTORTION_DEVS_CHECK_VAL) - { - return get_devs_distortion_check_val(*((float*)data)); - } - else if(code == IO_CTRL_CODE_SET_DEVS_REBOOT) - { - return set_devreboot(*((int*)data)); - } - else if (code == IO_CTRL_CODE_SET_AUTO_FALT) - { - is_auto_falt = true; - return set_auto_flat(*((int*)data)); - } - else if (code == IO_CTRL_CODE_SET_COLOR) - { - long l = len ? *len : 0; - int err = setting_color_mode(data, &l); - if (len) - *len = l; - - return err; - } - else if (code == IO_CTRL_CODE_SET_DPI) - { - long l = len ? *len : sizeof(int); - int err = setting_resolution(data, &l); - - if (len) - *len = l; - - return err; - } - else if (code == IO_CTRL_CODE_SET_VIDPID) - { - int num = *((int*)data); - return set_vid_pid(num); - } - else if (code == IO_CTRL_CODE_SET_SERIAL) - { - string str = (char*)data; - return set_serial_num((char*)data); - } - else if (code == IO_CTRL_CODE_GET_VIDPID) - { - int num = 0; - int ret = get_vid_pid(num); - (*(int*)data) = num; - return ret; - } - else if (code == IO_CTRL_CODE_SET_DEVS_MODEL) - { - return set_device_model((char*)data); - } - else if (code == IO_CTRL_CODE_GET_DEVS_MODEL) - { - int num = 0; - string str = get_device_model(); - if (str.empty()) - { - return SCANNER_ERR_NO_DATA; - } - if (*len < str.size()) - { - *len = str.size(); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - ::strcpy((char*)data, str.c_str()); - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_GET_SCAN_WITH_HOLE) - { - *(SANE_Bool*)data = image_prc_param_.bits.rid_hole || isremove_left_hole || isremove_low_hole || isremove_right_hole || isremove_top_hole ? SANE_TRUE : SANE_FALSE; - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_SET_SCAN_WITH_HOLE) - { - image_prc_param_.bits.rid_hole = *(SANE_Bool*)data == SANE_TRUE; - - return SCANNER_ERR_OK; - } - else if (code == IO_CTRL_CODE_SET_SCAN_WHEN_PAPER_ON) - { - long l = len ? *len : sizeof(bool); - int ret = setting_auto_paper_scan(data, &l); - if (len) - *len = l; - - return ret; - } - else if (code == IO_CTRL_CODE_GET_SCAN_WHEN_PAPER_ON) - { - if (!len) - return SCANNER_ERR_INVALID_PARAMETER; - if (*len < sizeof(bool)) - { - *len = sizeof(bool); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - *(bool*)data = is_auto_paper_scan; - - return SCANNER_ERR_OK; - } - - return SCANNER_ERR_DEVICE_NOT_SUPPORT; + return msg_; } -int hg_scanner::get_roller_life(void) +bool hg_scanner::is_online(void) { - return 150000; + return online_; } -int hg_scanner::discard_all_images(void) +device_option* hg_scanner::get_device_opt(void) { - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -std::string hg_scanner::get_firmware_version(void) -{ - return BRAND_DEVICE_NOT_SUPPORT; -} -std::string hg_scanner::get_serial_num(void) -{ - return BRAND_DEVICE_NOT_SUPPORT; -} -std::string hg_scanner::get_ip(void) -{ - return BRAND_DEVICE_NOT_SUPPORT; -} -std::string hg_scanner::get_device_model(void) -{ - return BRAND_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_roller_num(int &val) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_device_log(string &log) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_devreboot(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_devshtudown() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_clear_roller_num(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_clear_history_num(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_history_scan_count(int &num) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_scan_islock(SANE_Bool set_islock) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_scan_islock(SANE_Bool& islock) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_scan_lock_check_val(string check_str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_firmware_upgrade(std::string filename) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_clean_paper_road() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_dev_islock_file(int& islockfile) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_dev_islock_file(int islockfile) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_scan_mode(bool& type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_speed_mode(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_speed_mode(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; + dev_opts_->add_ref(); + + return dev_opts_; } -int hg_scanner::set_distortion_image(bool type) -{ - is_dpi_color_check = type; - int ret = SCANNER_ERR_OK; - if (type) - { - ret = set_leaflet_scan(); - } - return ret; -} -int hg_scanner::get_distortion_check_val(int &val) -{ - val = *(int*)&save_dpi_color_check_val; - //val = ; - - if (val != 0) - { - return SCANNER_ERR_NO_DATA; - } - return 0; -} -int hg_scanner::set_devs_distortion_check_val(float data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_devs_distortion_check_val(float& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_auto_flat(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_updata0303(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_motor_board_ver(string& ver) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_devs_time(string times) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_devs_time(string& times) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_device_model(string sts) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_serial_num(string str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_vid_pid(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_vid_pid(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -////////////////////////////////////////////////////////////////////////////////////////////////////// -int hg_scanner::set_leaflet_scan(void) -{ - return SCANNER_ERR_NO_DATA; -} -int hg_scanner::get_abuot_info(void) -{ - - return SCANNER_ERR_NO_DATA; -} -int hg_scanner::restore_default_setting(void) -{ - return SCANNER_ERR_NO_DATA; -} -int hg_scanner::set_final_image_format(SANE_FinalImgFormat* fmt) -{ - switch (fmt->img_format) - { - case SANE_IMAGE_TYPE_BMP: - img_type_ = ".bmp"; - break; - case SANE_IMAGE_TYPE_PNG: - img_type_ = ".png"; - break; - case SANE_IMAGE_TYPE_JPG: - img_type_ = ".jpg"; - break; - case SANE_IMAGE_TYPE_TIFF: - return SCANNER_ERR_INVALID_PARAMETER; - case SANE_IMAGE_TYPE_WEBP: - return SCANNER_ERR_INVALID_PARAMETER; - case SANE_IMAGE_TYPE_PDF: - return SCANNER_ERR_INVALID_PARAMETER; - case SANE_IMAGE_TYPE_GIF: - return SCANNER_ERR_INVALID_PARAMETER; - case SANE_IMAGE_TYPE_SVG: - return SCANNER_ERR_INVALID_PARAMETER; - default: - img_type_ = ".bmp"; - break; - } - return SCANNER_ERR_OK; -} -int hg_scanner::get_compression_format(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_compression_format(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_auto_color_type(void) -{ - is_auto_matic_color = true; - return SCANNER_ERR_OK; -} -int hg_scanner::get_device_code(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::get_sleep_time(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_sleep_time(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner::set_notify_sleep() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -int hg_scanner::get_scanner_paperon(SANE_Bool& paperon) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -int hg_scanner::get_scan_is_sleep(SANE_Bool& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -void hg_scanner::image_process(std::shared_ptr& buffer, uint32_t id) -{ - if (!buffer.get() || !ImagePrc_pHandle_) - { - return; - } - int ret = SCANNER_ERR_OK; - hg_imgproc::IMGPRCPARAM param = get_image_process_object(pid_); - hg_imgproc::IMGHEAD ih; - int err = SCANNER_ERR_OK, - index = 0; - void* buf = NULL; - - hg_imgproc::load_buffer(ImagePrc_pHandle_, buffer); - hg_imgproc::decode(ImagePrc_pHandle_, pid_, &img_conf_, ¶m); - (this->*dump_img_)(ImagePrc_pHandle_, "decode"); - - if (is_dpi_color_check) - { - CISTestImageProcess::CISTestResult res; - distortion_val.h = 0; - distortion_val.w =0; - distortion_val.scaleXY = 0; - save_dpi_color_check_val = 0; - - err = hg_imgproc::cis_test_image(ImagePrc_pHandle_, res); - distortion_val.h = res.h; - distortion_val.w = res.w; - save_dpi_color_check_val = distortion_val.scaleXY = res.scaleXY; - is_dpi_color_check = false; - - utils::to_log(LOG_LEVEL_DEBUG, "Set distortion val is:h:%f w:%f distortion val is:%f\n", distortion_val.h, distortion_val.w, distortion_val.scaleXY); - } - else if (param.cis_image - || ((img_conf_.papertype == TwSS::MaxSize || img_conf_.papertype == TwSS::USStatement) - && pid_ == 0x0300 - && firmware_sup_dpi_600)) - { - printf("cis 原图测试无需任何算法\r\n"); - } - else - { - if ((isremove_left_hole || isremove_right_hole || isremove_top_hole || isremove_low_hole) && (pid_ != 0x239 && pid_ != 0x439)) - { - //ret = hg_imgproc::fillhole(ImagePrc_pHandle_, isremove_top_hole_threshold, isremove_low_hole_threshold, isremove_left_hole_threshold, isremove_right_hole_threshold); - /*double left = isremove_left_hole ? isremove_left_hole_threshold : 0; - double right = isremove_right_hole ? isremove_right_hole_threshold : 0; - double top = isremove_top_hole ? isremove_top_hole_threshold : 0; - double low = isremove_low_hole ? isremove_low_hole_threshold : 0;*/ - - //double left = img_conf_.fillholeratio_left / 100.0; - //double right = img_conf_.fillholeratio_right / 100.0; - //double top = img_conf_.fillholeratio_up / 100.0 ; - //double low = img_conf_.fillholeratio_down / 100.0 ; - - //ret = hg_imgproc::fillhole(ImagePrc_pHandle_, top, low, left, right); - - //(this->*dump_img_)(ImagePrc_pHandle_, "fillhole"); - //utils::to_log(LOG_LEVEL_WARNING, "Image proc fillhole is:%d\n", ret); - } - - if (pid_ != 0x239 && pid_ != 0x439) - { - float dpi3288 = 200; - if (pid_ == 0x300|| pid_== 0x400) - { - if (firmware_sup_dpi_300 && pid_ == 0x300) - dpi3288 = (img_conf_.resolution_dst >= 300) ? 300 : 200; - else if (firmware_sup_dpi_600 && pid_ == 0x300) - dpi3288 = (img_conf_.resolution_dst == 600) ? 600 : (img_conf_.resolution_dst < 600 && img_conf_.resolution_dst >= 300) ? 300 : 200; - else - dpi3288 = 200; - } - ret = hg_imgproc::auto_crop(ImagePrc_pHandle_, dpi3288); - (this->*dump_img_)(ImagePrc_pHandle_, "auto_crop"); - } - - if (is_quality_ == IMG_SPEED && resolution_ >= 300)//239 - { - utils::to_log(LOG_LEVEL_DEBUG, "set resolution_ is :%d\n", resolution_); - err = hg_imgproc::quality(ImagePrc_pHandle_, resolution_); - - (this->*dump_img_)(ImagePrc_pHandle_, "quality"); - } - - if (img_conf_.is_colorcast && pid_ != 0x239 && pid_ != 0x439) - { - ret = hg_imgproc::color_cast_correction(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "discardBlank"); - } - if ((img_conf_.is_autodiscradblank_normal || img_conf_.is_autodiscradblank_vince) && (pid_ != 0x239 && pid_ != 0x439)) - { - ret = hg_imgproc::discardBlank(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "discardBlank"); - } - - if (img_conf_.fadeback) //239 - { - hg_imgproc::fadeback(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "fadeback"); - } - - if ( (((img_conf_.resolution_dst != img_conf_.resolution_native) && (pid_ == 0x300 || pid_ == 0x0400 || pid_ == 0x302 || pid_ == 0x402)) - && !firmware_sup_dpi_300 && !firmware_sup_dpi_600) - - || (pid_ == 0x300 && firmware_sup_dpi_300 && img_conf_.resolution_dst != 200 && img_conf_.resolution_dst != 300) - || (pid_ == 0x300 && firmware_sup_dpi_600 && img_conf_.resolution_dst != 200 && img_conf_.resolution_dst != 300 && img_conf_.resolution_dst != 600)) - { - float dpi3288 = 0.0; - dpi3288 = (img_conf_.resolution_dst >= 300 && (firmware_sup_dpi_300 || firmware_sup_dpi_600)) ? 300 : 200; - - hg_imgproc::resolution_change(ImagePrc_pHandle_, dpi3288); - (this->*dump_img_)(ImagePrc_pHandle_, "resolution_change"); - } - - if ((img_conf_.cropRect.enable && !img_conf_.is_autocrop) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::croprect(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "resolution_change"); - } - - if ((img_conf_.filter != ColorFilter::FILTER_NONE - && (image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE - || image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY)) - && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::channel(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "filter"); - } - - { - adjust_color(ImagePrc_pHandle_); //色调曲线 普通dsp版本需要矫正颜色 色调曲线目前是PC支持 - (this->*dump_img_)(ImagePrc_pHandle_, "adjust_color"); - } - - if ((img_conf_.pixtype == COLOR_MODE_24_BITS && img_conf_.hsvcorrect) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::answerSheetFilterRed(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "answerSheetFilterRed"); - } - - if ((img_conf_.refuseInflow) && (pid_ != 0x239 && pid_ != 0x439)) - { - int lv = 5 + image_prc_param_.bits.is_permeate_lv_ * 10; //image_prc_param_.bits.is_permeate_lv_ = 0 1 2 3 4 - - hg_imgproc::antiInflow(ImagePrc_pHandle_, lv); - (this->*dump_img_)(ImagePrc_pHandle_, "antiInflow"); - } - if ((img_conf_.colorCorrection && img_conf_.pixtype != COLOR_MODE_BLACK_WHITE) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::colorCorrection(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "colorCorrection"); - } - - if (((img_conf_.en_fold && pid_ != 0x239 && pid_ != 0x439))) - { - hg_imgproc::fold(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "fold"); - } - - if (((img_conf_.imageRotateDegree != TEXT_DIRECTION_0 || img_conf_.is_backrotate180) && (!img_conf_.is_autotext)) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::orentation(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "orentation"); - } - - if ((img_conf_.textureRemove) && (pid_ != 0x239 && pid_ != 0x439)) - { - //hg_imgproc::textureRemove(ImagePrc_pHandle_); - hg_imgproc::remove_morr(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "textureRemove"); - } - - if (img_conf_.removeMorr && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::remove_morr(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "remove_morr"); - } - - if ((img_conf_.detachnoise.is_detachnoise) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::nosieDetach(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "nosieDetach"); - } - - if ((img_conf_.pixtype == COLOR_MODE_BLACK_WHITE) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::errorextention(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "errorextention"); - } - - - if (img_conf_.multi_output_red && img_conf_.pixtype == COLOR_MODE_24_BITS)//239 - { - err = hg_imgproc::multi_out_red(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "multi_out_red"); - } - - if ((img_conf_.sharpen) && (pid_ != 0x239 && pid_ != 0x439)) - { - hg_imgproc::sharpenType(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "sharpenType"); - } - - if (image_prc_param_.bits.split) //239 - { - split3399_++; - err = hg_imgproc::split(ImagePrc_pHandle_,split3399_); - (this->*dump_img_)(ImagePrc_pHandle_, "split"); - } - - if (!img_conf_.splitImage && !img_conf_.multi_output_red && !is_multiout) //239 - { - if (img_conf_.automaticcolor) - { - hg_imgproc::auto_matic_color(ImagePrc_pHandle_, img_conf_.automaticcolortype); - (this->*dump_img_)(ImagePrc_pHandle_, "auto_matic_color"); - } - } - if (img_conf_.is_autotext)//239 - { - //hg_imgproc::ocr_auto_txtdirect(ImagePrc_pHandle_); - hg_imgproc::tesseract_auto_txtdirect(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "ocr_auto_txtdirect"); - } - - - - if (is_multiout)//239 - { - int multi_out = img_conf_.multiOutput; - err = hg_imgproc::multi_out(ImagePrc_pHandle_, multi_out); - (this->*dump_img_)(ImagePrc_pHandle_, "multi_out"); - } - } - - hg_imgproc::final(ImagePrc_pHandle_); - (this->*dump_img_)(ImagePrc_pHandle_, "final"); - while (hg_imgproc::get_final_data(ImagePrc_pHandle_, &ih, &buf, index++) == SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_DEBUG, "Final picture %d (%d * %d * %d) with %u bytes!\n", index - , ih.width, ih.height, ih.bits * ih.channels, ih.total_bytes); - - if (!img_type_.empty()) - { - std::vectorbmpdata; - //cv::imencode(img_type_,*((cv::Mat*)buf),bmpdata); - hg_imgproc::imgtypechange(ImagePrc_pHandle_, img_type_, buf, bmpdata); - if (bmpdata.empty()) - { - status_ = SCANNER_ERR_NO_DATA; - return; - } - buf = bmpdata.data(); - ih.total_bytes = bmpdata.size(); - - utils::to_log(LOG_LEVEL_DEBUG, "Set img type is:%s Final picture %d (%d * %d * %d) with %u bytes!\n", img_type_.c_str(), index - , ih.width, ih.height, ih.bits * ih.channels, ih.total_bytes); - } - if (id == -1) - id = hg_scanner_mgr::unique_id(); - save_final_image(&ih, buf, id); - id = -1; - } -} -int hg_scanner::image_configuration(SCANCONF& ic) -{ - int ret = 0; - ic.papertype = paper_size_; - - if (is_lateral(image_prc_param_.bits.paper)) - ic.paperAlign = Rot270; - else - ic.paperAlign = Rot0; - //{ - //子类处理 - //ic.en_sizecheck = dev_conf_.params_3399.enable_sizecheck; - //if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO) - // ic.imageRotateDegree = (float)image_prc_param_.bits.text_direction; - //else - // ic.imageRotateDegree = 0; - - //ic.imageRotateDegree *= 90.0f; - //} - - ic.is_duplex = (image_prc_param_.bits.page == PAGE_DOUBLE - || image_prc_param_.bits.page == PAGE_OMIT_EMPTY - || image_prc_param_.bits.page == PAGE_OMIT_EMPTY_RECEIPT - || image_prc_param_.bits.page == PAGE_FOLIO); - - if (is_dpi_color_check) - { - ic.is_duplex = false; - } - ic.en_fold = (image_prc_param_.bits.page == PAGE_FOLIO); - - ic.pixtype = image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH ? 2 : image_prc_param_.bits.color_mode; - ic.automaticcolor = is_auto_matic_color; - ic.automaticcolortype = 1;// ic.pixtype; //存疑 - - ic.resolution_dst = (resolution_ >= 300) ? (is_quality_ == IMG_SPEED ? 200 : resolution_) : resolution_; - - //if (resolution_ >= 300) - //{ - // if (is_quality_ == IMG_SPEED) - // ic.resolution_dst = 200; - // else - // ic.resolution_dst = resolution_; - //} - //else - // ic.resolution_dst = resolution_; - - ic.resolution_native = 200.0f; - ic.gamma = (float)gamma_; - { - //子类处理 - /*ic.contrast = (contrast_ - 4) * 333.0; - ic.brightness = (bright_ - 128) * (2000.0 / 254.0);*/ - } - - ic.threshold = threshold_; - ic.is_autocontrast = 0; //无参数 - ic.is_autocrop = (ic.papertype == TwSS::None || ic.papertype == TwSS::USStatement); - ic.is_autodiscradblank_normal = image_prc_param_.bits.page == PAGE_OMIT_EMPTY || is_discardblank; - ic.discardblank_percent = omit_empty_level_; - ic.is_autodiscradblank_vince = image_prc_param_.bits.page == PAGE_OMIT_EMPTY_RECEIPT; - ic.is_switchfrontback = image_prc_param_.bits.exchange; - ic.autodescrew = image_prc_param_.bits.automatic_skew; - ic.multi_output_red = image_prc_param_.bits.rid_red; //之前加上可能导致超时,或者未知错误不可描述。 - ic.hsvcorrect = image_prc_param_.bits.rid_answer_red; - ic.sharpen = image_prc_param_.bits.sharpen; - //ic.enhance_color = image_prc_param_.bits.rid_color; //加这个会有问题 - ic.fillbackground = image_prc_param_.bits.erase_black_frame; - ic.is_convex = (image_prc_param_.bits.fill_background == FILL_BKG_CONVEX_POLYGON); - if (ic.resolution_dst == 300) - ic.noise = anti_noise_ * 1.5; - else if (ic.resolution_dst == 600) - ic.noise = anti_noise_ * 3; - else - ic.noise = anti_noise_; - - ic.indent = margin_; - ic.AutoCrop_threshold = threshold_; - { - //子类处理 - //if (test_1_paper_) - //{ - // LOG_INFO(LOG_LEVEL_DEBUG, "scanning mode: testing ONE paper ...\n"); - // ic.scannum = ic.is_duplex ? 2 : 1; - //} - //else - //{ - // if (scan_count_ == -1) - // ic.scannum = -1; - // else - // ic.scannum = (ic.is_duplex ? scan_count_ * 2 : scan_count_); - //} - } - ic.is_backrotate180 = image_prc_param_.bits.rotate_back_180; - ic.is_dogeardetection = image_prc_param_.bits.fractate_check; - { - //子类处理 - //ic.hardwarecaps.en_skrewdetect = dev_conf_.params_3399.screw_detect_enable; - //ic.hardwarecaps.en_doublefeed = dev_conf_.params_3399.ultrasonic_enable; - //ic.hardwarecaps.en_stapledetect = dev_conf_.params_3399.staple_enbale; - //ic.hardwarecaps.skrewdetectlevel = dev_conf_.params_3399.screw_detect_level; - //ic.hardwarecaps.is_autopaper = dev_conf_.params_3399.is_autopaper; - } - ic.hardwarecaps.capturepixtype = 0; //暂无参数 获取图像类型 - ic.hardwarecaps.lowpowermode = LowPowerMode::Min_None; //暂无参数 设置休眠时间 两个参数3399未使用 - ic.fillhole.is_fillhole = image_prc_param_.bits.rid_hole; - ic.fillhole.fillholeratio = rid_hole_range_; - ic.detachnoise.is_detachnoise = image_prc_param_.bits.noise_optimize; - ic.detachnoise.detachnoise = noise_range_; - ic.is_autotext = image_prc_param_.bits.text_direction == TEXT_DIRECTION_AUTO ? 1 : 0; - ic.isfillcolor = is_color_fill; - ic.refuseInflow = image_prc_param_.bits.is_permeate; - ic.colorCorrection = 0; - ic.removeMorr = image_prc_param_.bits.remove_morr; - ic.errorExtention = image_prc_param_.bits.error_extention;// - ic.textureRemove = image_prc_param_.bits.remove_txtture;// - ic.splitImage = image_prc_param_.bits.split; - { - ic.cropRect.enable = custom_area_; - int height = (custom_area_br_y_ * ic.resolution_dst) / 25.4 - (custom_area_lt_y_ * ic.resolution_dst / 25.4); - int width = (custom_area_br_x_ * ic.resolution_dst) / 25.4 - (custom_area_lt_x_ * ic.resolution_dst / 25.4); - ic.cropRect.height = height; - ic.cropRect.width = width; - ic.cropRect.x = custom_area_lt_x_ * ic.resolution_dst / 25.4; - ic.cropRect.y = custom_area_lt_y_ * ic.resolution_dst / 25.4; - } - ic.multiOutput = (MultiOutput)image_prc_param_.bits.multi_out; - ic.normalCrop = image_prc_param_.bits.dark_sample; - ic.dogeardistabce = fractate_level_; - ic.fadeback = image_prc_param_.bits.erase_bakground; - ic.fadebackrange = erase_bkg_range_; - ic.isuoloadexceptionimage = pid_ == 0x0439 ? false : (double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG) == DOUBLE_PAPER_SAVE_IMG; - adjust_filling_hole(&ic); - - ic.fold_concatmode = fold_type_; - ic.HsvFilterType = 0;//暂定为0 - ic.is_colorcast = color_correction_; - if (ic.en_fold) - { - ic.splitImage = false; - } - - //多流输出优先级最高 - if (is_multiout) - { - ic.pixtype = image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW ? COLOR_MODE_256_GRAY : COLOR_MODE_24_BITS; - ic.filter = 3; - ic.hsvcorrect = 0; - ic.multi_output_red = 0; - ic.fadeback = false; - ic.sharpen = 0; - ic.removeMorr = 0; - ic.textureRemove = 0; - ic.errorExtention = 0; - ic.detachnoise.is_detachnoise = 0; - } - else if (image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS) - { - ic.filter = 3; - ic.errorExtention = 0; - ic.detachnoise.is_detachnoise = 0; - } - else if (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY) - { - int filter_clr[] = { 3, 0, 1, 2, 5, 6, 7 }; - ic.filter = filter_clr[image_prc_param_.bits.rid_color]; - if (ic.filter != 3) - { - ic.pixtype = 2; - } - ic.multi_output_red = 0; - ic.hsvcorrect = 0; - ic.fadeback = false; - ic.errorExtention = 0; - ic.detachnoise.is_detachnoise = 0; - ic.is_colorcast = false; - } - else if (image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) - { - int filter_clr[] = { 3, 0, 1, 2, 5, 6, 7 }; - ic.filter = filter_clr[image_prc_param_.bits.rid_color]; - if (ic.filter != 3) - { - ic.pixtype = 2; - } - ic.multi_output_red = 0; - ic.hsvcorrect = 0; - ic.fadeback = false; - ic.sharpen = 0; - ic.removeMorr = 0; - ic.textureRemove = 0; - ic.is_colorcast = false; - } - else if (image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH) - { - ic.pixtype = 2; - ic.filter = 3; - ic.hsvcorrect = 0; - ic.multi_output_red = 0; - ic.fadeback = false; - ic.sharpen = 0; - ic.removeMorr = 0; - ic.textureRemove = 0; - ic.errorExtention = 0; - ic.detachnoise.is_detachnoise = 0; - ic.is_colorcast = false; - - } - if (ic.resolution_dst >= 500 - || image_prc_param_.bits.paper == PAPER_MAX_SIZE - || image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP - || image_prc_param_.bits.paper == PAPER_TRIGEMINY) - { - ic.removeMorr = 0; - ic.textureRemove = 0; - } - //自定义裁切 - if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH - || image_prc_param_.bits.paper == PAPER_MAX_SIZE - || image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP - || image_prc_param_.bits.paper == PAPER_TRIGEMINY - ) - { - ic.cropRect.enable = false; - } - img_conf_ = ic; - utils::to_log(LOG_LEVEL_DEBUG, "ic.pixtype=%d\r\n", ic.pixtype); - utils::to_log(LOG_LEVEL_DEBUG, "ic.papertype=%d\r\n", ic.papertype); - utils::to_log(LOG_LEVEL_DEBUG, "ic.AutoCrop_threshold=%d\r\n", ic.AutoCrop_threshold); - utils::to_log(LOG_LEVEL_DEBUG, "ic.autodescrew=%d\r\n", ic.autodescrew); - utils::to_log(LOG_LEVEL_DEBUG, "ic.automaticcolor=%d\r\n", ic.automaticcolor); - utils::to_log(LOG_LEVEL_DEBUG, "ic.brightness=%f\r\n", ic.brightness); - utils::to_log(LOG_LEVEL_DEBUG, "ic.contrast=%f\r\n", ic.contrast); - utils::to_log(LOG_LEVEL_DEBUG, "ic.en_fold=%d\r\n", ic.en_fold); - utils::to_log(LOG_LEVEL_DEBUG, "ic.en_sizecheck=%d\r\n", ic.en_sizecheck); - utils::to_log(LOG_LEVEL_DEBUG, "ic.enhance_color=%d\r\n", ic.enhance_color); - utils::to_log(LOG_LEVEL_DEBUG, "ic.fillbackground=%d\r\n", ic.fillbackground); - utils::to_log(LOG_LEVEL_DEBUG, "ic.filter=%d\r\n", ic.filter); - utils::to_log(LOG_LEVEL_DEBUG, "ic.gamma=%f\r\n", ic.gamma); - utils::to_log(LOG_LEVEL_DEBUG, "ic.hardwarecaps.capturepixtype=%d\r\n", ic.hardwarecaps.capturepixtype); - utils::to_log(LOG_LEVEL_DEBUG, "ic.hardwarecaps.en_doublefeed=%d\r\n", ic.hardwarecaps.en_doublefeed); - utils::to_log(LOG_LEVEL_DEBUG, "ic.hsvcorrect=%d\n", ic.hsvcorrect); - utils::to_log(LOG_LEVEL_DEBUG, "ic.imageRotateDegree=%f\r\n", ic.imageRotateDegree); - utils::to_log(LOG_LEVEL_DEBUG, "ic.indent=%d\r\n", 5); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_autocontrast=%d\r\n", ic.is_autocontrast); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_autocrop=%d\r\n", ic.is_autocrop); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_autodiscradblank_normal=%d\r\n", ic.is_autodiscradblank_normal); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_autodiscradblank_vince=%d\r\n", ic.is_autodiscradblank_vince); - utils::to_log(LOG_LEVEL_DEBUG, "ic.isfillcolor=%d\r\n", ic.isfillcolor); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_autotext=%d\r\n", ic.is_autotext); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_backrotate180=%d\r\n", ic.is_backrotate180); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_convex=%d\r\n", ic.is_convex); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_duplex=%d\r\n", ic.is_duplex); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_switchfrontback=%d\r\n", ic.is_switchfrontback); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_dogeardetection=%d\r\n", ic.is_dogeardetection); - utils::to_log(LOG_LEVEL_DEBUG, "ic.fillhole.multi_output_red=%d\r\n", ic.multi_output_red); - utils::to_log(LOG_LEVEL_DEBUG, "ic.noise=%d\r\n", ic.noise); - utils::to_log(LOG_LEVEL_DEBUG, "ic.pixtype=%d\r\n", ic.pixtype); - utils::to_log(LOG_LEVEL_DEBUG, "ic.resolution_dst=%f\r\n", ic.resolution_dst); - utils::to_log(LOG_LEVEL_DEBUG, "ic.resolution_native=%f\r\n", ic.resolution_native); - utils::to_log(LOG_LEVEL_DEBUG, "ic.scannum=%d\r\n", ic.scannum); - utils::to_log(LOG_LEVEL_DEBUG, "ic.sharpen=%d\r\n", ic.sharpen); - utils::to_log(LOG_LEVEL_DEBUG, "ic.discardblank_percent=%d\r\n", ic.discardblank_percent); - utils::to_log(LOG_LEVEL_DEBUG, "ic.detachnoise.is_detachnoise=%d\r\n", ic.detachnoise.is_detachnoise); - utils::to_log(LOG_LEVEL_DEBUG, "ic.detachnoise.detachnoise=%d\r\n", ic.detachnoise.detachnoise); - utils::to_log(LOG_LEVEL_DEBUG, "ic.detachnoise.refuseInflow=%d\r\n", ic.refuseInflow); - utils::to_log(LOG_LEVEL_DEBUG, "ic.detachnoise.refuseInflow=%d\r\n", ic.refuseInflow); - utils::to_log(LOG_LEVEL_DEBUG, "ic.removeMorr=%d\r\n", ic.removeMorr); - utils::to_log(LOG_LEVEL_DEBUG, "ic.errorExtention=%d\r\n", ic.errorExtention); - utils::to_log(LOG_LEVEL_DEBUG, "ic.textureRemove=%d\r\n", ic.refuseInflow); - utils::to_log(LOG_LEVEL_DEBUG, "ic.fillhole.is_fillhole=%d\r\n", ic.fillhole.is_fillhole); - utils::to_log(LOG_LEVEL_DEBUG, "ic.ic.fillhole.fillholeratio=%d\r\n", ic.fillhole.fillholeratio); - utils::to_log(LOG_LEVEL_DEBUG, "ic.fadeback=%d\r\n", ic.fadeback); - utils::to_log(LOG_LEVEL_DEBUG, "ic.cropRect.enable=%d\r\n", ic.cropRect.enable); - utils::to_log(LOG_LEVEL_DEBUG, "ic.cropRect.width=%d\r\n", ic.cropRect.width); - utils::to_log(LOG_LEVEL_DEBUG, "ic.cropRect.height=%d\r\n", ic.cropRect.height); - utils::to_log(LOG_LEVEL_DEBUG, "ic.cropRect.x=%d\r\n", ic.cropRect.x); - utils::to_log(LOG_LEVEL_DEBUG, "ic.cropRect.y=%d\r\n", ic.cropRect.y); - utils::to_log(LOG_LEVEL_DEBUG, "ic.dogeardistabce=%d\r\n", ic.dogeardistabce); - utils::to_log(LOG_LEVEL_DEBUG, "ic.fold_concatmode=%d\r\n", ic.fold_concatmode); - utils::to_log(LOG_LEVEL_DEBUG, "ic.HsvFilterType=%d\r\n", ic.HsvFilterType); - utils::to_log(LOG_LEVEL_DEBUG, "ic.is_colorcast =%d\r\n", ic.is_colorcast); - utils::to_log(LOG_LEVEL_DEBUG, "ic.isuoloadexceptionimage=%d\r\n", ic.isuoloadexceptionimage); - return ret; -} - -char* hg_scanner::get_value(const char* name, void* value, size_t* size, int* err) -{ - std::string val(""); - int result = SCANNER_ERR_OK, nv = 0; - - if (strcmp(name, SANE_STD_OPT_NAME_ROLLER_COUNT) == 0) - { - result = get_roller_num(nv); - val = std::string((char*)&nv, sizeof(nv)); - } - else if (strcmp(name, SANE_STD_OPT_NAME_HISTORY_COUNT) == 0) - { - result = get_history_scan_count(nv); - val = std::string((char*)&nv, sizeof(nv)); - } - else if (strcmp(name, SANE_STD_OPT_NAME_FIRMWARE_VERSION) == 0) - { - val = get_firmware_version(); - } - else if (strcmp(name, SANE_STD_OPT_NAME_DEVICE_SERIAL_NO) == 0) - { - val = get_serial_num(); - } - else if (strcmp(name, SANE_STD_OPT_NAME_DEVICE_IP_ADDR) == 0) - { - val = get_ip(); - } - else if (strcmp(name, SANE_STD_OPT_NAME_PAPER_W) == 0) - { - double w = paper_size_mm_.cx; - val = std::string((char*)&w, sizeof(w)); - } - else if (strcmp(name, SANE_STD_OPT_NAME_PAPER_H) == 0) - { - double h = paper_size_mm_.cy; - val = std::string((char*)&h, sizeof(h)); - } - else - { - result = SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - - if (err) - *err = result; - - if (size) - *size = val.length(); - - if (val.length()) - { - char* buf = (char*)malloc(val.length() + 1); - - memcpy(buf, val.c_str(), val.length()); - buf[val.length()] = 0; - - return buf; - } - else - { - return nullptr; - } -} -int hg_scanner::set_value(const char* name, void* val) -{ - int err = SCANNER_ERR_DEVICE_NOT_SUPPORT; - - if (setting_map_.count(name)) - { - long len = 0; - err = (this->*setting_map_[name])(val, &len); - } - else if (strcmp(name, SANE_STD_OPT_NAME_LATERAL) == 0) - { - lateral_ = *(bool*)val; - image_prc_param_.bits.paper = switch_lateral(image_prc_param_.bits.paper, lateral_); - err = SCANNER_ERR_OK; - } - - return err; -} -void hg_scanner::enable(const char* name, bool able) -{ - -} diff --git a/hgdriver/hgdev/hg_scanner.h b/hgdriver/hgdev/hg_scanner.h index 056e7b3..05991e7 100644 --- a/hgdriver/hgdev/hg_scanner.h +++ b/hgdriver/hgdev/hg_scanner.h @@ -1,557 +1,114 @@ -#pragma once - -// hg_scanner is the base class of kinds of scanners +// scanner business handler // -// created on 2022-01-30 +// created on 2023-03-27 // -#include -#include -#include -#include -#include -#include -//#include -#include "usb_manager.h" -#include "../../sdk/hginclude/huagaoxxx_warraper_ex.h" -#include "../3rdparty/nick/StopWatch.h" -#include "hg_ipc.h" -#include "common_setting.h" -#include "image_process.h" -#include "StopWatch.h" -#include "PaperSize.h" -#include "version/HGVersion.h" -#if defined(WIN32) || defined(_WIN64) -#include //暂时linux 屏蔽 -#include -#include -#include -#include -#else -#include -#include -#endif - - - - -#ifndef WIN32 -#define __stdcall -#endif - -#define MAPPING_FUNCTION_IN_BASE // 定义该标志,各子类不必再初始化setting_map_数组 - -#define SAFE_DELETE(p){ \ -if (NULL != (p)) {delete((p)); \ - (p) = nullptr; \ -}\ -} -//#ifdef OEM_HANWANG -//#define hg_scanner hw_scanner -//#elif defined(OEM_LISICHENG) -//#define hg_scanner lsc_scanner -//#elif defined(OEM_CANGTIAN) -//#define hg_scanner cts_scanner -//#endif - - -#define USB_REQ_GET_FPGA_REGS 0x40 -#define USB_REQ_SET_FPGA_REGS 0x41 -#define USB_REQ_GET_MOTOR_REGS 0x42 -#define USB_REQ_SET_MOTOR_REGS 0x43 - -#define USB_REQ_GET_DEV_STATUS 0x60 -#define USB_REQ_GET_DEV_CONFIGURATION 0x61 -#define USB_REQ_SET_DEV_CONFIGURATION 0x62 -#define USB_REQ_GET_DEV_REGS 0x63 -#define USB_REQ_SET_DEV_REGS 0x64 - -typedef HGResult(__stdcall* SDKHGVersion_Init_)(HGVersionMgr* mgr); -typedef HGResult(__stdcall* SDKHGVersion_Islock_)(HGVersionMgr mgr, const HGChar* devSN, HGBool* inList); -typedef HGResult(__stdcall* SDKHGVersion_Postlog_)(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, - const HGChar* devType, const HGChar* devFW, HGBool isLock); -typedef HGResult(__stdcall* SDKHGVersion_Free_)(HGVersionMgr mgr); - -class imgproc_mgr; +#pragma once #include +#include +#include + +class hg_scanner; +class imgproc_mgr; +class device_option; +class scanner_handler; +class hguser; +struct libusb_device; + +typedef struct _online_scanner +{ + int vid; + int pid; + int addr; + libusb_device *dev; // the unique usb device + hg_scanner *scanner; + std::string family; + std::string display_name; // unique. same device name should append sn + + bool operator==(const libusb_device* d) + { + return d == dev; + } + bool operator==(const char* name) + { + return display_name == name; + } + bool operator==(const hg_scanner* s) + { + return s == scanner; + } +}ONLNSCANNER; + +class img_receiver : public data_holder +{ + uint32_t id_; + PACKIMAGE head_; + std::string info_; + uint8_t* buf_ = nullptr; + size_t info_size_ = 0; // image info + size_t size_ = 0; // image data only + size_t wpos_ = 0; // image data only + std::function finish_; + +public: + img_receiver(LPPACKIMAGE head, size_t info_size, size_t size, std::function complete_routine, uint32_t id); + +protected: + ~img_receiver(); + + // data_holder +public: + virtual int put_data(const void* data, uint32_t* size/*[in] - total bytes of data; [out] - used bytes*/) override; // return error code + virtual bool is_complete(void) override; + virtual uint32_t get_required(void) override; + +public: + uint32_t id(void); + size_t size(void); + uint8_t* data(void); + std::string information(void); + PACKIMAGE head(void); +}; class hg_scanner : public sane_opt_provider { - HGVersionMgr HGVersion_mgr_; - SDKHGVersion_Init_ HGVersion_Init_; - SDKHGVersion_Islock_ HGVersion_Islock_; - SDKHGVersion_Postlog_ HGVersion_Postlog_; - SDKHGVersion_Free_ HGVersion_Free_; -#ifndef WIN32 - void* Dynamicopen_HGVersion_pHandle_;; -#else - HINSTANCE Dynamicopen_HGVersion_pHandle_; -#endif + int status_; + std::string msg_; + ONLNSCANNER dev_; + device_option *dev_opts_ = nullptr; + imgproc_mgr *imgproc_ = nullptr; + shared_memory *singleton_ = nullptr; + scanner_handler *scanner_ = nullptr; + hguser *user_ = nullptr; - bool notify_setting_result_; - std::string name_; - std::string family_; - std::string save_multiout; //保存多留输出类型 - bool save_sizecheck; - bool read_over_with_no_data_; // 针对第三方调用,在最后一段数据时是否返回“SCANNER_ERR_NO_DATA” - int is_color_type_;//保存最后下发到设备的颜色类型 + volatile bool cancelled_ = false; + volatile bool run_ = true; + safe_fifo raw_imgs_; + safe_fifo final_imgs_; + std::unique_ptr imgpr_thread_; + bool online_ = true; + static shared_memory* create_device_singleton(int vid, int pid, int addr); - sane_callback ui_ev_cb_; - imgproc_mgr* img_processor_ = nullptr; - do_when_born_and_dead* scan_life_; + void init(void); + void thread_image_processor(void); - std::unique_ptr thread_usb_read_; - void thread_handle_usb(void); - - std::unique_ptr thread_img_handle_; - void thread_image_handle(void); - - std::unique_ptr thread_devslock_handle_; - void thread_devslock_handle(void); - - std::unique_ptr thread_read_int_; - void thread_read_int(void); - - void(hg_scanner::* dump_img_)(hg_imgproc::HIMGPRC himg, const char* desc); - void dump_image_empty(hg_imgproc::HIMGPRC himg, const char* desc); - void dump_image_real(hg_imgproc::HIMGPRC himg, const char* desc); - - void init_setting_func_map(void); - bool is_to_file(void); - void thread_handle_image_process(void); - - void working_begin(void*); - void working_done(void*); - - void image_process(std::shared_ptr& buffer, uint32_t id); public: + hg_scanner(ONLNSCANNER* dev, imgproc_mgr* imgproc = nullptr, hguser* user = nullptr, std::vector* constopts = nullptr); - - // 设置接口 protected: - - // 配置序号映射数组,各子类必须重载“init_setting_map”方法以初始化该数组 --> 2022-05-09:基类中以title自动匹配功能序号,子类不必再处理并屏蔽此项工作 - // 比如: 某型设备的“颜色模式”功能号为1,则 setting_map_[HG_BASE_SETTING_INDEX_COLOR_MODE] = 1 - // 如果设备的“颜色模式”配置逻辑与基类预定义的不同, - // 则 setting_map_[HG_BASE_SETTING_INDEX_COLOR_MODE] = -1,在子类重载的set_setting_value方法中处理 - // - // 2022-06-28: 属性处理函数改用map结构存储,只须处理set_setting_map函数即可 - // int setting_map_[HG_BASE_SETTING_INDEX_MAX]; - //virtual void init_setting_map(int* setting_map, int count); - std::map setting_map_; - int invoke_setting_xxx(int(hg_scanner::* func)(void*, long*), void* data, long* len); - - int setting_restore(void* data, long* len); - int setting_help(void* data, long* len); - int setting_color_mode(void* data, long* len); - int setting_multi_out(void* data, long* len); - int setting_multi_out_type(void* data, long* len); - int setting_rid_color(void* data, long* len); - int setting_rid_multi_red(void* data, long* len); - int setting_rid_answer_red(void* data, long* len); - int setting_erase_background(void* data, long* len); - int setting_erase_background_range(void* data, long* len); - int setting_noise_optimize(void* data, long* len); - int setting_noise_optimize_range(void* data, long* len); - int setting_paper(void* data, long* len); - int setting_paper_check(void* data, long* len); - int setting_page(void* data, long* len); - int setting_page_omit_empty(void* data, long* len); - int setting_resolution(void* data, long* len); - int setting_exchagnge(void* data, long* len); - int setting_split_image(void* data, long* len); - int setting_automatic_skew(void* data, long* len); - int setting_rid_hole(void* data, long* len); - int setting_rid_hoe_range(void* data, long* len); - int setting_bright(void* data, long* len); - int setting_contrast(void* data, long* len); - int setting_gamma(void* data, long* len); - int setting_sharpen(void* data, long* len); - int setting_dark_sample(void* data, long* len); - int setting_erase_black_frame(void* data, long* len); - int setting_threshold(void* data, long* len); - int setting_anti_noise(void* data, long* len); - int setting_margin(void* data, long* len); - int setting_filling_background(void* data, long* len); - int setting_is_permeate(void* data, long* len); - int setting_is_permeate_lv(void* data, long* len); - int setting_remove_morr(void* data, long* len); - int setting_error_extention(void* data, long* len); - int setting_remove_texture(void* data, long* len); - int setting_ultrasonic_check(void* data, long* len); - int setting_go_on_when_double_checked(void* data, long* len); - int setting_staple_check(void* data, long* len); - int setting_scan_mode(void* data, long* len); - int setting_scan_count(void* data, long* len); - int setting_text_direction(void* data, long* len); - int setting_rotate_bkg_180(void* data, long* len); - int setting_fractate_check(void* data, long* len); - int setting_fractate_check_level(void* data, long* len); - int setting_skew_check(void* data, long* len); - int setting_skew_check_level(void* data, long* len); - int setting_is_custom_gamma(void* data, long* len); - int setting_custom_gamma_data(void* data, long* len); - int setting_is_custom_area(void* data, long* len); - int setting_custom_area_left(void* data, long* len); - int setting_custom_area_top(void* data, long* len); - int setting_custom_area_right(void* data, long* len); - int setting_custom_area_bottom(void* data, long* len); - int setting_img_quality(void* data, long* len); - int setting_color_fill(void* data, long* len); - int setting_keep_watermark(void* data, long* len); - int setting_black_white_threshold(void* data, long* len); - int setting_white_pixel_0(void* data, long* len); - int setting_feedmode(void* data, long* len); - int setting_sleeptime(void* data, long* len); - int setting_auto_pick_paper(void* data, long* len); - int setting_auto_pick_paper_threshold(void* data, long* len); - int setting_auto_paper_scan(void* data, long* len); - int setting_isremove_left_hole(void* data, long* len); - int setting_isremove_right_hole(void* data, long* len); - int setting_isremove_top_hole(void* data, long* len); - int setting_isremove_low_hole(void* data, long* len); - int setting_isremove_left_hole_threshold(void* data, long* len); - int setting_isremove_right_hole_threshold(void* data, long* len); - int setting_isremove_top_hole_threshold(void* data, long* len); - int setting_isremove_low_hole_threshold(void* data, long* len); - int setting_fold_type(void* data, long* len); - int setting_color_correction(void* data, long* len); - int setting_auto_paper_scan_exit_time(void* data, long* len); - int setting_get_dev_vid(void* data, long* len); - int setting_get_dev_pid(void* data, long* len); - int setting_get_dev_family(void* data, long* len); - int setting_get_dev_name(void* data, long* len); - int setting_get_dev_sn(void* data, long* len); - int setting_get_dev_fmver(void* data, long* len); - int setting_get_dev_ip(void* data, long* len); - int setting_get_roller_count(void* data, long* len); - int setting_get_history_count(void* data, long* len); - int setting_get_devs_log(void* data, long* len); - int setting_set_language(void* data, long* len); - int setting_get_motor_ver(void* data, long* len); - int setting_get_initial_boot_time(void* data, long* len); - int setting_set_discardblank(void* data, long* len); - - virtual void on_device_reconnected(void); - virtual int on_scanner_closing(bool force); - - virtual int on_color_mode_changed(int& color_mode) = 0; // COLOR_MODE_xxx - virtual int on_paper_changed(int& paper) = 0; // PAPER_xxx - virtual int on_paper_check_changed(bool& check)=0; - virtual int on_resolution_changed(int& dpi)=0; - virtual int on_ultrasonic_check_changed(bool& check)=0; - virtual int on_staple_check_changed(bool& check) = 0; - virtual int on_skew_check_changed(bool& check) = 0; - virtual int on_skew_check_level_changed(int& check) = 0; - virtual int on_get_feedmode(int& feedmode) = 0; //获取分纸强度 - virtual int on_set_feedmode(int feedmode) = 0; //设置分纸强度 - virtual int on_pic_type(bool& pic) = 0; //照片模式或者文本模式 - virtual int on_pick_paper(bool autostrength) = 0; //设置搓纸使能 - virtual int on_pick_paper_threshold(double threshold) = 0; //设置搓纸阈值 - virtual int on_is_auto_paper(bool isautopaper) = 0; //待纸扫描 - virtual int on_cis_get_image(bool type) = 0; -protected: - - virtual int set_setting_value(const char* name, void* data, long* len); - - virtual void thread_handle_usb_read(void) = 0; - virtual void thread_handle_islock_read(); - int hg_version_init_handle(); - int set_server_blacklist_lock(); // 0:不锁定 1:锁定 - void hg_version_free_handle(); - // adjust color or apply custom gamma - void adjust_color(hg_imgproc::HIMGPRC handle); - hg_imgproc::IMGPRCPARAM get_image_process_object(int model); - SANE_Image_Statu last_usb_image_statu(int err); - hg_imgproc::HIMGPRC ImagePrc_pHandle_; -protected: - ScannerSerial serial_; - volatile bool is_checksum_strat_scan; //设备锁定时,通过校验码来进行扫描 - volatile bool run_; - volatile bool is_read_int; - volatile bool user_cancel_; - platform_event wait_usb_; - platform_event wait_img_; - platform_event wait_usb_result_; - platform_event wait_devsislock_; - platform_event wait_read_int; - usb_io* io_; - std::mutex io_lock_; - std::string firmware_ver_; - bool online_; - int status_; - bool async_io_; - bool cb_mem_; - bool test_1_paper_; // 是否为单张扫描模式 - std::vector erase_depend_; //需要删除父依赖项 - - IMGPRCFIXPARAM image_prc_param_; - int erase_bkg_range_; // 背景移除像素范围 - int noise_range_; // 噪点优化尺寸 - TwSS paper_size_; - int omit_empty_level_; // 跳过空白页灵敏度 - int resolution_; // 分辨率 - double rid_hole_range_; // 穿孔移除范围 - int bright_; // 亮度 - int contrast_; // 对比度 - double gamma_; // 伽玛 - int threshold_; // 阈值 - int anti_noise_; // 背景搞噪等级 - int margin_; // 边缘缩进 - int fractate_level_; // 折角检测复杂度 - int scan_count_; // 扫描张数,各实例化类在重载set_setting_value中,如果发现该设置项对该参数有影响时,需要对此值作更改 - bool is_auto_matic_color;// 自动颜色识别 - int is_quality_; // 画质设置 0 - 速度优先;1 - 画质优先 - bool is_color_fill; // 色彩填充 - bool is_multiout; // 多流输出 - - int bw_threshold_; // 黑白图像阈值 (added on 2022-06-28) - int feedmode_; // 分纸强度 - int sleeptime_; // 睡眠时间 - bool is_auto_paper_scan; // 待纸扫描 - bool auto_scan_prev_; // 保留待纸扫描程序改变状态之前的值 - 2023-10-16: 智学网根据扫描张数来打开或关闭待纸扫描 - bool auto_scan_restore_; // 是否需要恢复待纸扫描状态 - 2023-10-16: 智学网根据扫描张数来打开或关闭待纸扫描 - bool size_check; // 尺寸检测 - - bool save_feedmode_type_; //保存分支强度狀態 - bool save_sleeptime_type_; //保存休眠時間 - - bool isremove_left_hole; //设置左边除穿孔 - bool isremove_right_hole; //设置右边除穿孔 - bool isremove_top_hole; //设置上边除穿孔 - bool isremove_low_hole; //设置下边除穿孔 - double isremove_left_hole_threshold; //设置左边除穿孔阈值 - double isremove_right_hole_threshold; //设置右边除穿孔阈值 - double isremove_top_hole_threshold; //设置上边除穿孔阈值 - double isremove_low_hole_threshold; //设置下边除穿孔阈值 - int fold_type_; //对折类型 - bool is_cis_image; //设置cis获取原图 - bool is_dpi_color_check; //纵向DPI、色差检测 ,畸变自动计算 - float save_dpi_color_check_val; //保存纵向DPI、色差检测 ,畸变自动计算 的值 - bool is_auto_falt; //是否进行平场校正 - bool color_correction_; //是否色彩校正 - int is_auto_paper_scan_exit_time; //待纸扫描退出时间 - bool is_auto_feedmode_; //是否启用自动分纸强度 - bool is_discardblank; //是否启动跳过空白页 - bool lateral_ = false; - - SANE_DISTORTION_VAL distortion_val; //畸变修正结构体保存 - - - - int split3399_; //3399设备正面和反面图像是相对的,所以对折时反面需要进行特殊处理 - int pid_; - - /////////不同的固件号版本支持 - //bool is_kernelsnap_239_220830_; //此版本支持,手动睡眠唤醒,分纸强度 - //bool is_kernelsnap_239_211209_; //获取固件版本号是否是新旧版本 - //bool is_kernelsnap_239_221027_; //此版本一下不支持拆分模式 pc实现 - - //bool is_kernelsnap3288_221106_; //G300 3288 在221106版本支持真实300dpi - //bool is_kernelsnap3288_230210_; //G300 3288 在230210版本支持真实600dpi - - //bool is_kernelsnap3288_230303_; //G300 3288 支持清除历史扫描张数 - - //bool is_kernelsnap_devsislock; //支持设备锁的版本 - //bool is_kernelsnap_239_3C_; //支持偏色校正的版本,自适应配置 - //bool is_kernelsnap_439_3C0606; //支持偏色校正的版本 - //bool is_kernelsnap_239_220500_; //支持双张保留的版本 - - //bool is_kernelsnap_239_220429_; //第一个安陆版本,支持设备日志导出 - //bool is_kernelsnap_239_220430_; //待纸扫描 - // bool is_kernelsnap_211227_; //此版本以下,不支持真实dpi ,只设置1下去 - - - bool firmware_sup_wait_paper_; //固件支持 待纸扫描 139 239-3B0431, 439-3B0629 - bool firmware_sup_pick_strength_; //固件支持 分纸强度 139 239-3B0830 - bool firmware_sup_log_export_; //固件支持 日志导出 139 239-3B0429 - bool firmware_sup_color_corr_; //固件支持 偏色校正 139 239 439-3C - bool firmware_sup_wake_device_; //固件支持 唤醒设备 139 239-3B0830 - bool firmware_sup_double_img; //固件支持 双张保留 139 239-3C - bool firmware_sup_devs_lock_; //固件支持 设备锁定 139 239-3b0500, 439-3C, 302_402-2023/3/15 - bool firmware_sup_dpi_300; //固件支持 真实DPI300 139 239-21227,此版本以下,不支持真实dpi,dpi设置1 //3288 G300 用到 - bool firmware_sup_dpi_600; //固件支持 真实DPI600 139 239-21227,此版本以下,不支持真实dpi,dpi设置1 - bool firmware_sup_auto_speed_; //固件支持 自适应速度 139 239 439 -3C - bool firmware_sup_morr_; //固件支持 摩尔纹 139 239-3C0518 - bool firmware_sup_color_fill_; //固件支持 色彩填充 139 239 439 -3C - bool firmware_sup_history_cnt; //固件支持 清除历史张数 3288 G300 220303 - - SCANCONF img_conf_; //此参数外部不做任何改变,请在writedown_image_configuration做修改 - std::string img_type_; - - std::string dump_usb_path_; // 诊断模式,输出USB原始图像 - final_img_queue final_imgs_; // JPG ... - unsigned int usb_img_index_; - unsigned int final_img_index_; - std::string final_path_; - unsigned long long memory_size_; - bool isx86_Advan_; - int stop_fatal_; - BlockingQueue> imgs_; - - uint32_t fetching_id_; // for sane read image ext info. added on 2023-01-13 - - void init_settings(const char* json_setting_text); - int init_settings(int pid); - int on_scann_error(int err); // 返回“0”忽略错误继续执行,其它值则停止后续工作 - int try_third_app_handle_start(bool& handled); - int try_third_app_after_start(int err); - std::shared_ptr aquire_memory(int size, bool from_usb = true); - - // callback to ui ... - int notify_ui_working_status(const char* msg, int ev = SANE_EVENT_STATUS, int status = SCANNER_ERR_OK); - bool waiting_for_memory_enough(unsigned need_bytes); - - void copy_to_sane_image_header(SANE_Parameters* header, int w, int h, int line_bytes, int channels, int bits); - int save_usb_data(std::shared_ptr data); - int save_final_image(hg_imgproc::LPIMGHEAD head, void* buf, uint32_t id = -1); - - void adjust_filling_hole(LPSCANCONF conf); - int wait_one_image_from_start(bool& handled); - - //////////////////////////////////////////////////////////////// - // 新增自定义伽玛曲线及扫描区域属性 - 2022-05-05 - bool custom_gamma_; // 为true时,应用custom_gamma_val_阵列调整图像色彩;为false时,保持原来的处理方式 - SANE_Gamma *custom_gamma_val_; // 当为RGB或者彩色时,为三组256字节的数据;当为黑白或灰度时,只有一组256字节 - bool custom_area_; // 是否启用自定义区域,为true时才使用下列4个数据;为false时保持原来的处理方式 - double custom_area_lt_x_; // 自定义区域左上角x坐标 - double custom_area_lt_y_; // 自定义区域左上角y坐标 - double custom_area_br_x_; // 自定义区域右下角x坐标 - double custom_area_br_y_; // 自定义区域右下角y坐标 - SIZE paper_size_mm_; // 当前纸张尺寸(mm) - // 新增自定义伽玛曲线及扫描区域属性 - END - //////////////////////////////////////////////////////////////// - - // 2022-07-23 新增双张之后留图继续扫描 - int double_paper_handle_; // 汉王要求出现双张的时候可保留 - bool keep_watermark_; // 汉王要求图像处理过程中保留水印 - 是否与背景移除、背景填充相关??? - - // 2022-08-31 新增黑白图像是否反色输出(PNM黑白像素与BMP黑白像素相反) - bool is_white_0_; // 是否‘0’代表白色 - -public: - int start(void); - int stop(void); - - void set_ui_callback(sane_callback cb, bool enable_async_io); - void set_image_processor(imgproc_mgr* proc); - void set_dev_family(const char* family); - void set_read_over_with_no_data(bool no_data); - int reset_io(usb_io* io); - int io_disconnected(void); - int get_pid(void); - int get_vid(void); - int close(bool force); - int set_setting(const char* name, void* data); - int get_setting(const char* name, char* buf, int* len); - int hgpaper_to_devspaper(Paper_Map papermap[], int len, int& paper, bool* exact, TwSS* type); - int image_configuration(SCANCONF &ic); - std::string name(void); - int status(void); - bool is_online(void); - - enum thread_running - { - THREAD_RUNNING_IDLE = 0, - THREAD_RUNNING_USB = 1 << 0, - THREAD_RUNNING_IMAGE = 1 << 1, - }; - int is_running(void); // return thread_running - -public: - virtual int do_start(void) = 0; - virtual int do_stop(void) = 0; - virtual int get_image_info(SANE_Parameters* ii); - virtual int read_image_data(unsigned char* buf, int* len); - virtual int reset(void); - virtual int device_io_control(unsigned long code, void* data, unsigned* len); - virtual int discard_all_images(void) = 0; - virtual int get_roller_life(void); // 获取滚轴最大寿命 - -public: - hg_scanner(ScannerSerial serial, const char* dev_name, const char* model, usb_io* io,int pid); virtual ~hg_scanner(); - static std::string temporary_file(char* tail = NULL, char* head = NULL); - static int save_2_tempory_file(std::shared_ptr> data, std::string* path_file, unsigned int index = 0); + // scanner operation ... public: - - //////////////固定的硬件信息设置或获取////////////// - virtual std::string get_firmware_version(void); - virtual std::string get_serial_num(void); - virtual std::string get_ip(void); - virtual std::string get_device_model(void); - - virtual int set_device_model(string str); - virtual int set_serial_num(string str) = 0; //设置序列号 - virtual int set_vid_pid(int data) = 0; //设置vidpid - virtual int get_vid_pid(int& data) = 0; //获取vidpid - - /////////////成功返回:SCANNER_ERR_OK ///////////// - /////////////失败返回:IO错误码 ///////////// - virtual int set_leaflet_scan(void) = 0; //单张扫描 - virtual int get_abuot_info(void); //获取软件关于信息 (基类实现) - virtual int restore_default_setting(void); //恢复默认设置 (基类实现) - virtual int set_final_image_format(SANE_FinalImgFormat* fmt);//设置图像处理最终输出(final())的图像数据格式 (基类实现) *** - - - virtual int get_compression_format(void); //获取支持的压缩格式 不支持 - virtual int set_compression_format(void); //设置图像数据最终输出的压缩格式 不支持 - - virtual int set_auto_color_type(void); //设置自动匹配颜色模式 (基类实现) - virtual int set_clear_roller_num(void) = 0; //清除滚轴计数 - virtual int set_clear_history_num(void) = 0; //清除历史张数 - - virtual int get_device_code(void); //获取设备编码 不支持 - - virtual int get_scanner_paperon(SANE_Bool& type)=0; //获取设备有无纸张 /*/ type : false无纸(不正常状态false) true有纸 */ - - virtual int get_scan_is_sleep(SANE_Bool& type) = 0; //获取设备是否休眠当中 /*/ type : false休眠(不正常状态false) true未休眠*/ - virtual int get_sleep_time(int& data) = 0; //获取功耗模式(休眠) /*/ data > 0*/ - virtual int set_sleep_time(int data) = 0; //设置功耗模式(休眠) /*/ data > 0*/ - virtual int get_history_scan_count(int &data) = 0; //获取历史扫描张数 /*/ data > 0*/ - virtual int get_roller_num(int &data) = 0; //获取滚轮张数 /*/ data > 0*/ - virtual int set_notify_sleep(void) = 0; //唤醒设备 - virtual int get_device_log(string &log) = 0; //获取设备日志 /*/ log :储存路径*/ - virtual int set_devreboot(int data) = 0; //设置设备重启 /*/ data:0 reboot data:1 1进入loader,0普通重启 - virtual int set_devshtudown() = 0; //设置设备关机 - virtual int set_scan_islock(SANE_Bool type) = 0; //设置设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int get_scan_islock(SANE_Bool& type) = 0; //获取设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int set_scan_lock_check_val(string str) = 0; //获取设备是否锁定 /*/ str:校验码*/ - virtual int set_firmware_upgrade(std::string str) = 0; //固件升级 /*/ str:文件名路径*/ - virtual int set_clean_paper_road() = 0; //清理纸道 - virtual int get_dev_islock_file(int &data) = 0; //获取设备文件 /*/ data:0 未上锁,1 上锁。-1 未发现黑名单列表 -2列表没有信息*/ - virtual int set_dev_islock_file(int data) = 0; //设置设备文件 /*/ data:0 未上锁,1 上锁*/ - virtual int get_scan_mode(bool& type) ; //获取设备是否计数模式 /*/ type:false计数模式 true非计数模式 - virtual int set_speed_mode(int data) = 0; //设置速度模式 /*/ 设备不同值不同,详情见子类注释 - virtual int get_speed_mode(int &data) = 0; //获取速度模式 /*/ 设备不同值不同,详情见子类注释 - - virtual int set_distortion_image(bool type); //设置畸变校正图 /*/ 基类处理 - virtual int get_distortion_check_val(int &val); //获取自动计算畸变校正值 /*/ 基类处理 - - virtual int set_devs_distortion_check_val(float data) = 0; //设置畸变矫正值 float; - virtual int get_devs_distortion_check_val(float& data) = 0; //获取设备畸变值 float; - - virtual int set_auto_flat(int data) = 0; //设置自动平场校正 - // data:0(ALL) 1(200dpi、gray) 2(200dpi、color) 3(300dpi、gray) 4(300dpi、color) 5(600dpi、gray) 6(600dpi、color) - virtual int set_updata0303(void) ; - virtual int get_motor_board_ver(string &ver); //获取G239电机板的固件号 //3399设备支持 - - virtual int set_devs_time(string times); //设置设备时间 //3399设备支持 - virtual int get_devs_time(string ×); //获取设备时间 //3399设备支持 - - // sane_opt_provider -public: - virtual char* get_value(const char* name, void* value, size_t* size, int* err = nullptr) override; - virtual int set_value(const char* name, void* val) override; - virtual void enable(const char* name, bool able) override; - + int start(void); + int stop(void); + int close(void); + int re_connect(void); + int get_image_info(SANE_Parameters* pii); + int read_image_data(uint8_t* buf, size_t* len); + int status(void); + std::string status_message(void); + bool is_online(void); + device_option* get_device_opt(void); }; - - - //TEST 测试GIT切换 - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// NEW diff --git a/hgdriver/hgdev/hg_scanner_200.cpp b/hgdriver/hgdev/hg_scanner_200.cpp deleted file mode 100644 index ef83f3d..0000000 --- a/hgdriver/hgdev/hg_scanner_200.cpp +++ /dev/null @@ -1,1063 +0,0 @@ -#include "hg_scanner_200.h" - -#include "../../sdk/hginclude/utils.h" -#include - -#if defined(WIN32) || defined(_WIN64) -#include "scanner_manager.h" -#endif - -static std::string jsontext1("{\"global\":{\"device_type\":\"G100-G200\",\"option_count\":65},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":128,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout!=true\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a"); -static std::string jsontext2("\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":40,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"size\":50,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":1,\"max\":600,\"step\":1}},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u"); -static std::string jsontext3("4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_or\":[\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"is-staple\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"is-check-askew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"askew-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"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\",\"cur\":3,\"default\":3,\"size\":4,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend_or\":[\"is-check-askew==true\"]}}"); - -namespace settingsdsp_200 -{ - scanner_err device_status_to_hg_err(int usbdata, bool *fatal) - { - scanner_err code = SCANNER_ERR_OK; - - if (fatal) - *fatal = true; - switch (usbdata) - { - case setting3288dsp::HAVE_IMAGE: - code = SCANNER_ERR_OK; - if (fatal) - *fatal = false; - break; - case setting3288dsp::STOP_SCAN: - case setting3288dsp::SCAN_STOP: - case setting3288dsp::USER_STOP: - if (fatal) - *fatal = false; - code = SCANNER_ERR_DEVICE_STOPPED; - break; - case setting3288dsp::COUNT_MODE: - code = SCANNER_ERR_DEVICE_COUNT_MODE; - break; - case setting3288dsp::NO_FEED: - code = SCANNER_ERR_DEVICE_NO_PAPER; - break; - case setting3288dsp::OPEN_COVER: - code = SCANNER_ERR_DEVICE_COVER_OPENNED; - break; - case setting3288dsp::FEED_IN_ERROR: - code = SCANNER_ERR_DEVICE_FEEDING_PAPER; - break; - case setting3288dsp::PAPER_JAM: - code = SCANNER_ERR_DEVICE_PAPER_JAMMED; - break; - case setting3288dsp::DETECT_DOUBLE_FEED: - code = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; - break; - case setting3288dsp::DETECT_STAPLE: - code = SCANNER_ERR_DEVICE_STAPLE_ON; - break; - case setting3288dsp::PAPER_SKEW: - code = SCANNER_ERR_DEVICE_PAPER_SKEW; - break; - case setting3288dsp::HARDWARE_ERROR: - code = SCANNER_ERR_DEVICE_NOT_SUPPORT; - break; - case setting3288dsp::PC_SCAN_BUSY_or_ERROR: - code = SCANNER_ERR_DEVICE_PC_BUSY; - break; - case setting3288dsp::SIZE_ERROR: - code = SCANNER_ERR_DEVICE_SIZE_CHECK; - break; - case setting3288dsp::AUTO_FLAT_FINISHED: - code = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; - break; - case setting3288dsp::AUTO_FLATTING: - code = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - break; - default: - if (fatal) - *fatal = false; - break; - } - - return code; - } -} -hg_scanner_200::hg_scanner_200(const char* dev_name, const char* model,int pid, usb_io* io) : hg_scanner(G100Serial, dev_name, model, io,pid) -{ - //pid_ = pid; - initdevice(); - - dsp_config_.value = 0; -#ifndef MAPPING_FUNCTION_IN_BASE - init_setting_map(setting_map_, ARRAY_SIZE(setting_map_));//优先初始化 -#endif - if (init_settings(0x200)) - init_settings((jsontext1 + jsontext2 + jsontext3).c_str()); -} -hg_scanner_200::~hg_scanner_200() -{} -void hg_scanner_200::discard_prev(void) -{ - USBCB usb = { 0 }; - int ret = get_scanner_status(usb), - imgs = 0, - packets = 0, - normal = 0; - - while (ret == SCANNER_ERR_OK) - { - if (usb.u32_Data == setting3288dsp::HAVE_IMAGE) - { - pop_image(); - imgs++; - normal = 0; - packets++; - } - else if (usb.u32_Data == setting3288dsp::NORMAL) - { - if(normal++ > 10) - break; - } - else - packets++; - ret = get_scanner_status(usb); - } - if (imgs || packets) - utils::to_log(LOG_LEVEL_DEBUG, "discard prev-scanning %d packets and %d images.\n", packets, imgs); -} -int hg_scanner_200::on_scanner_closing(bool force) -{ - return SCANNER_ERR_OK; -} -int hg_scanner_200::discard_all_images(void) -{ - discard_prev(); - return SCANNER_ERR_OK; -} -int hg_scanner_200::get_roller_life(void) -{ - return 450000; -} -void hg_scanner_200::thread_handle_usb_read(void) -{ - int ret = SCANNER_ERR_OK, - prev_err = SCANNER_ERR_OK; - StopWatch sw; - bool first = true; - - while (run_) - { - if (sw.elapsed_s() > 30 && !is_auto_falt) - { - // no any data in 30 seconds, we giveup the work ... - status_ = prev_err != SCANNER_ERR_OK ? prev_err : SCANNER_ERR_TIMEOUT; - break; - } - - USBCB usb = {0}; - ret = get_scanner_status(usb); - - if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) - { - is_auto_falt = false; - - status_ = ret; - std::string msg; - int count = usb.u32_Count; - msg.resize(count); - { - std::lock_guard lock(io_lock_); - ret = io_->read_bulk(&msg[0], &count); - } - if (ret == SCANNER_ERR_OK) - notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); - else - status_ = ret; - - break; - } - else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) - { - sw.reset(); - status_ = ret; - - std::string msg; - int count = usb.u32_Count; - msg.resize(count); - { - std::lock_guard lock(io_lock_); - ret = io_->read_bulk(&msg[0], &count); - } - if (ret == SCANNER_ERR_OK) - { - status_ = ret = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - char buf[1024]; - strcpy(buf, msg.c_str()); - notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); - } - else - { - status_ = ret; - break; - } - } - if (ret == SCANNER_ERR_DEVICE_NOT_FOUND) - { - // device left, the work is no meanning ... - status_ = ret; - break; - } - else if (usb.u32_Data == setting3288dsp::HAVE_IMAGE) - { - ret = get_img_data(usb.u32_Count); - if (ret == SCANNER_ERR_INSUFFICIENT_MEMORY) - { - status_ = ret; - break; - } - - io_->set_timeout(200); - pop_image(); - sw.reset(); - first = false; - } - else if (ret == SCANNER_ERR_DEVICE_STOPPED) - { - status_ = prev_err; - break; - } - else if(ret != SCANNER_ERR_OK && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) - { - if (prev_err == SCANNER_ERR_OK) - { - if (first) - { - SANE_Image_Statu imgst = last_usb_image_statu(ret); - - // if the error occurs at the 2nd paper, then the first normal paper maybe lost, we delay 2 seconds here ... - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - get_scanner_status(usb); - if (usb.u32_Data == setting3288dsp::HAVE_IMAGE) - { - if(get_img_data(usb.u32_Count, imgst) == SCANNER_ERR_INSUFFICIENT_MEMORY) - { - status_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - break; - } - io_->set_timeout(200); - pop_image(); - sw.reset(); - first = false; - prev_err = ret; - continue; - } - - status_ = ret; - break; - } - } - else - { - // notify_ui_working_status(hg_scanner::error_description((scanner_err)prev_err).c_str(), SANE_EVENT_ERROR, prev_err); - - } - status_ = prev_err = ret; - break; //dsp 设备错误消息不会发stop - } - this_thread::sleep_for(chrono::milliseconds(2)); - } - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "USB thread exit with code: %s, status = %s\n", hg_scanner_err_name(ret, errbuf), hg_scanner_err_description(status_)); -} -int hg_scanner_200::do_start(void) -{ - bool handled = false; - int ret = try_third_app_handle_start(handled), - count = -1; - char errbuf[40] = { 0 }; - - // for third-sane-app invoking, added on 2022-05-19 - if (handled) - return ret; - - //discard_prev(); - user_cancel_ = false; - imgs_.Clear(); // move from scanning done - final_imgs_.clear(); // move from scanning done - ret = writedown_device_configuration(true); - if (ret == SCANNER_ERR_OK) - writedown_image_configuration(); - else - { - status_ = ret; - return ret; - } - printf_devconfig(); - SANE_Bool type = false; - ret = get_scanner_paperon(type); - if (!type) - { - status_ = ret = SCANNER_ERR_DEVICE_NO_PAPER; - //notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_NO_PAPER, SANE_EVENT_ERROR, status_); - utils::to_log(LOG_LEVEL_WARNING, "device start status is(%s)\n", from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_NO_PAPER, nullptr)); - return ret; - } - - USBCB usb = { setting3288dsp::START_COMMAND, img_conf_.scannum, 0 }; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usb); - io_->set_timeout(500); - } - utils::to_log(LOG_LEVEL_WARNING, "write start command = %s\n", hg_scanner_err_name(ret, errbuf)); - - if(ret == SCANNER_ERR_OK) - { - wait_usb_.notify(); - std::this_thread::sleep_for(std::chrono::milliseconds(300)); - ret = try_third_app_after_start(ret); - } - else - status_ = ret; - utils::to_log(LOG_LEVEL_WARNING, "start result: %s\n", hg_scanner_err_name(ret, errbuf)); - - return ret; -} -int hg_scanner_200::do_stop(void) -{ - int ret = SCANNER_ERR_OK; - - USBCB usbcb = { setting3288dsp::STOP, 0, 0}; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - } - user_cancel_ = true; - if (ret == SCANNER_ERR_DEVICE_BUSY) - { - utils::log_info("stop status is busy\r\n", LOG_LEVEL_DEBUG); - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - } - else if (ret == SCANNER_ERR_OK) - { - status_ = SCANNER_ERR_DEVICE_STOPPED; - } - return status_; -} -int hg_scanner_200::writeusb(USBCB &usb) -{ - int ret = SCANNER_ERR_OK; - int len = sizeof(usb); - - ret = io_->write_bulk(&usb,&len); - if (ret) - { - status_ = ret; - } - - return ret; -} -int hg_scanner_200::readusb(USBCB &usb) -{ - int ret = SCANNER_ERR_OK; - int len = sizeof(USBCB); - - ret = io_->read_bulk(&usb,&len); - if (ret) - { - status_ = ret; - } - - return ret; -} -int hg_scanner_200::pop_image() -{ - std::lock_guard lock(io_lock_); - - int ret = SCANNER_ERR_OK; - - USBCB usbcb = { setting3288dsp::POP_IMAGE, 0, 0 }; - ret = writeusb(usbcb); - - return ret; -} -int hg_scanner_200::get_scanner_status(USBCB &usb) -{ - std::lock_guard lock(io_lock_); - - int ret = SCANNER_ERR_OK; - - usb = { setting3288dsp::GET_DSP_STATUS, 0, 0 }; - - ret = writeusb(usb); - if (ret != SCANNER_ERR_OK) - return ret; - - io_->set_timeout(500); - - ret = readusb(usb); - if (ret != SCANNER_ERR_OK) - { - status_ = ret; - return ret; - } - - return settingsdsp_200::device_status_to_hg_err(usb.u32_Data, nullptr); -} -int hg_scanner_200::get_img_data(unsigned int bytes, SANE_Image_Statu statu) -{ - int total = bytes, - ret = SCANNER_ERR_OK, - index = 0, - block = total; - std::shared_ptr imagedata(aquire_memory(total)); - - if (!imagedata.get()) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - - USBCB usb{ setting3288dsp::GET_IMAGE, 0, total }; - - imagedata->set_image_statu(statu); - { - std::lock_guard lock(io_lock_); - - ret = writeusb(usb); - if (ret != SCANNER_ERR_OK) - { - status_ = ret; - return ret; - } - io_->set_timeout(500); - - while (total > 0) - { - block = 512 * 1024; - - if (total < block) - block = total; - - unsigned int size = block; - void* buf = imagedata->data(index, &size); - if (!buf) - { - utils::to_log(LOG_LEVEL_FATAL, "memory(0x%08x + %u) fatal when read USB image %d !!!\n", index, block, usb_img_index_); - ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - break; - } - block = size; - ret = io_->read_bulk(buf, &block); - io_->set_timeout(500); //不能删除可能会导致IO超时 - if (ret != SCANNER_ERR_OK) - break; - - index += block; - total -= block; - } - } - if (ret == SCANNER_ERR_OK) - { - ret = save_usb_data(imagedata); - } - - return ret; -} -int hg_scanner_200::writedown_device_configuration(bool type,setting_hardware::HGSCANCONF_DSP *d) -{ - if (!type) - return SCANNER_ERR_OK; - - int ret = SCANNER_ERR_OK, - len = 0; - char errbuf[40] = { 0 }; - - if (!d) - d = &dsp_config_; - if (is_multiout) - { - d->params_dsp.color = image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW ? 0 : 1; - } - else if ((image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY - || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) - && image_prc_param_.bits.rid_color != RID_COLOR_NONE) - { - d->params_dsp.color = 1; - } - - { - std::lock_guard lock(io_lock_); - - USBCB usbcb = { setting3288dsp::CONFIGURED_DATA, d->value, 0 }; - len = sizeof(USBCB); - ret = io_->write_bulk(&usbcb, &len); - } - - utils::to_log(LOG_LEVEL_WARNING, "writedown_device_configuration is .(%s)\n", hg_scanner_err_name(ret, errbuf)); - - return ret; -} -int hg_scanner_200::on_color_mode_changed(int& color_mode) -{ - dsp_config_.params_dsp.color = (color_mode == COLOR_MODE_BLACK_WHITE || color_mode == COLOR_MODE_256_GRAY) ? 0 : 1; - return SCANNER_ERR_OK; -} -int hg_scanner_200::on_paper_changed(int& paper) -{ - bool exact = true; - int ind = hgpaper_to_devspaper(paper_map_dsp, ARRAY_SIZE(paper_map_dsp), paper, &exact, &paper_size_), - ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT; - - if (dsp_config_.params_dsp.paper != paper_map_dsp[ind].dev_value) - { - int old = dsp_config_.params_dsp.paper; - - dsp_config_.params_dsp.paper = paper_map_dsp[ind].dev_value; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config_.params_dsp.paper = old; - for (int i = 0; i < ARRAY_SIZE(paper_map_dsp); ++i) - { - if (paper_map_dsp[i].dev_value == old) - { - paper = paper_map_dsp[i].paper; - break; - } - } - } - else if (!exact) - ret = SCANNER_ERR_NOT_EXACT; - } - return ret; -} -int hg_scanner_200::on_paper_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - if(dsp_config_.params_dsp.enable_sizecheck ^ check) - { - dsp_config_.params_dsp.enable_sizecheck = check; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config_.params_dsp.enable_sizecheck = !check; - check = dsp_config_.params_dsp.enable_sizecheck; - } - } - return ret; -} -int hg_scanner_200::on_resolution_changed(int& dpi) -{ - int ret = SCANNER_ERR_OK; - dsp_config_.params_dsp.dpi = 1; - ret = writedown_device_configuration(); - return ret; -} -int hg_scanner_200::on_ultrasonic_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dsp_config_.params_dsp.double_feed_enbale ^ check) - { - dsp_config_.params_dsp.double_feed_enbale = check; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config_.params_dsp.double_feed_enbale = !check; - check = dsp_config_.params_dsp.double_feed_enbale; - } - } - - return ret; -} -int hg_scanner_200::on_staple_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dsp_config_.params_dsp.stable_enbale ^ check) - { - dsp_config_.params_dsp.stable_enbale = check; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config_.params_dsp.stable_enbale = !check; - check = dsp_config_.params_dsp.stable_enbale; - } - } - - return ret; -} -int hg_scanner_200::on_skew_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dsp_config_.params_dsp.screw_detect_enable ^ check) - { - dsp_config_.params_dsp.screw_detect_enable = check; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config_.params_dsp.screw_detect_enable = !check; - check = dsp_config_.params_dsp.screw_detect_enable; - } - } - - return ret; -} -int hg_scanner_200::on_skew_check_level_changed(int& check) -{ - int ret = SCANNER_ERR_OK, - val = check, - old = dsp_config_.params_dsp.screw_detect_level; - setting_hardware::HGSCANCONF_DSP cf; - - cf.params_dsp.screw_detect_level = -1; - - if (val < 0) - { - val = 0; - ret = SCANNER_ERR_NOT_EXACT; - } - else if (val > cf.params_dsp.screw_detect_level) - { - val = cf.params_dsp.screw_detect_level; - ret = SCANNER_ERR_NOT_EXACT; - } - if (val != dsp_config_.params_dsp.screw_detect_level) - { - dsp_config_.params_dsp.screw_detect_level = val; - ret = writedown_device_configuration(); - if (ret) - check = dsp_config_.params_dsp.screw_detect_level = old; - } - if (ret == SCANNER_ERR_OK && val != check) - { - check = val; - ret = SCANNER_ERR_NOT_EXACT; - } - - return ret; -} -int hg_scanner_200::on_set_feedmode(int feedmode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::on_pic_type(bool& pic) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::on_pick_paper(bool autostrength) -{ - return 0; -} -int hg_scanner_200::on_pick_paper_threshold(double threshold) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::on_is_auto_paper(bool isautopaper) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::on_cis_get_image(bool isautopaper) -{ - is_cis_image = isautopaper; - dsp_config_.params_dsp.isCorrect = isautopaper == true ? 0 : 1; //0设置获取cis原图,1校正之后的图 - return writedown_device_configuration(); -} -int hg_scanner_200::on_get_feedmode(int &feedmode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::initdevice() -{ - setting_hardware::HGSCANCONF_DSP ds; - ds.params_dsp.paper = 0; - ds.params_dsp.color = 0; - ds.params_dsp.double_feed_enbale =0; - ds.params_dsp.dpi = 0; - ds.params_dsp.enable_sizecheck=0; - ds.params_dsp.pc_correct=0; - ds.params_dsp.screw_detect_enable=0; - ds.params_dsp.screw_detect_level = 0; - ds.params_dsp.stable_enbale = 0; - ds.params_dsp.unused_one = 0; - ds.params_dsp.unused_two = 0; - writedown_device_configuration(true,&ds); - printf_devconfig(&ds); - - return SCANNER_ERR_OK; -} -void hg_scanner_200::writedown_image_configuration(void) -{ - SCANCONF ic; - int len = sizeof(ic); - - bzero(&ic, len); - - ic.contrast = contrast_; - ic.brightness = bright_; - - if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO) - ic.imageRotateDegree = image_prc_param_.bits.text_direction; - else - ic.imageRotateDegree = 0; - if (test_1_paper_) - { - utils::log_info("scanning mode: testing ONE paper ...\n", LOG_LEVEL_DEBUG); - ic.scannum = 1; - } - else - ic.scannum = scan_count_; - ic.en_sizecheck = dsp_config_.params_dsp.enable_sizecheck; - ic.hardwarecaps.en_skrewdetect = dsp_config_.params_dsp.screw_detect_enable; - ic.hardwarecaps.en_doublefeed = dsp_config_.params_dsp.double_feed_enbale; - ic.hardwarecaps.en_stapledetect = dsp_config_.params_dsp.stable_enbale; - ic.hardwarecaps.skrewdetectlevel = dsp_config_.params_dsp.screw_detect_level; - // ic.hardwarecaps.is_autopaper = dsp_config_.params_dsp.is_autopaper; - ic.hardwarecaps.capturepixtype = 0; //暂无参数 获取图像类型 - ic.hardwarecaps.lowpowermode = LowPowerMode::Min_None; //暂无参数 设置休眠时间 两个参数3399未使用 - - image_configuration(ic); - //agreement(); -} -void hg_scanner_200::printf_devconfig(setting_hardware::HGSCANCONF_DSP *d) -{ - io_->set_timeout(200); - if (!d) - d = &dsp_config_; - - utils::to_log(LOG_LEVEL_DEBUG,"\r\ndsp_config.params_dsp.color:%d\r\n",d->params_dsp.color); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.double_feed_enbale:%d\r\n",d->params_dsp.double_feed_enbale); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.dpi:%d\r\n",d->params_dsp.dpi); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.enable_sizecheck:%d\r\n",d->params_dsp.enable_sizecheck); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.paper:%d\r\n",d->params_dsp.paper); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.pc_correct:%d\r\n",d->params_dsp.pc_correct); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.screw_detect_enable:%d\r\n",d->params_dsp.screw_detect_enable); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.screw_detect_level:%d\r\n",d->params_dsp.screw_detect_level); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.stable_enbale:%d\r\n",d->params_dsp.stable_enbale); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.unused_one:%d\r\n",d->params_dsp.unused_one); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.unused_two:%d\r\n",d->params_dsp.unused_two); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config_.params_dsp.value:%d\r\n",d->value); -} -std::string hg_scanner_200::get_firmware_version() -{ - char buf[20] = { 0 }; - int ret = SCANNER_ERR_OK, - len = 8; //协议定义长度为8 300 400 =10 - USBCB cmd = { setting3288dsp::GET_FW_VERSION, len, 0 }; - - { - std::lock_guard lock(io_lock_); - ret = writeusb(cmd); - if (ret == SCANNER_ERR_OK) - { - ret = io_->read_bulk(buf, &len); - } - } - - return buf; -} -std::string hg_scanner_200::get_serial_num() - { - char buf[20] = { 0 }; - int ret = SCANNER_ERR_OK, - len = 12; //协议定义长度为8 300 400 =10 - USBCB cmd = { setting3288dsp::GET_SERIAL, len, 0 }; - - { - std::lock_guard lock(io_lock_); - ret = writeusb(cmd); - if (ret == SCANNER_ERR_OK) - { - ret = io_->read_bulk(buf, &len); - } - } - - return buf; - } -std::string hg_scanner_200::get_ip(void) -{ - return ""; -} -int hg_scanner_200::set_serial_num(string str) -{ - std::lock_guard lock(io_lock_); - - USBCB usbcb = { setting3288dsp::SEND_SERIAL,0,14 }; - int len = sizeof(usbcb), - ret = SCANNER_ERR_OK; - ret = io_->write_bulk(&usbcb, &len); - if (ret == SCANNER_ERR_OK) - { - len = str.size(); - - ret = io_->write_bulk(&str, &len); - } - return ret; - -} -int hg_scanner_200::set_vid_pid(int data) -{ - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::SET_USB_INFOR_VIDPID,0,0 }; - int len = sizeof(usbcb); - return io_->write_bulk(&usbcb, &len); -} -int hg_scanner_200::get_vid_pid(int& data) -{ - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::GET_USB_INFOR_VIDPID,0,0 }; - int ret = SCANNER_ERR_OK, - len = sizeof(usbcb); - - io_->read_bulk(&usbcb, &len); - if (ret == SCANNER_ERR_OK) - { - data = usbcb.u32_Data; - } - return ret; -} -int hg_scanner_200::agreement() -{ - int ret = SCANNER_ERR_OK; - ret = writedown_device_configuration(true); - return ret; -} -int hg_scanner_200::set_leaflet_scan(void) -{ - int ret = SCANNER_ERR_OK; - test_1_paper_ = true; - - ret = start(); - return ret; -} - - -int hg_scanner_200::set_clear_roller_num(void) -{ - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::CLR_ROLLER_NUM,0,4 }; - return writeusb(usbcb); -} -int hg_scanner_200::set_clear_history_num(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::get_device_code(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::get_sleep_time(int& data ) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::GET_SLEEP_TIME, 0, 0 }; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - len = sizeof(usbcb); - ret = io_->read_bulk(&usbcb, &len); - } - printf("usbcb.u32_Data = %d\r\n",usbcb.u32_Data); - if (ret == SCANNER_ERR_OK) - { - data = usbcb.u32_Data; - } - return ret; -} -int hg_scanner_200::set_sleep_time(int data) -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK; - USBCB usbcb = { setting3288dsp::SET_SLEEP_TIME,data, 0 }; - ret = writeusb(usbcb); - return ret; -} - -int hg_scanner_200::get_scanner_paperon(SANE_Bool& type) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::GET_PAPERFEEDER_STATUS, 0, 0 }; - { - std::lock_guard lock(io_lock_); - len = sizeof(USBCB); - ret = writeusb(usbcb); - - if (ret == SCANNER_ERR_OK) - { - ret = io_->read_bulk(&usbcb, &len); - type = usbcb.u32_Data == 0 ? false : true; - } - } - //if (usbcb.u32_Data == 0) - // ret = SCANNER_ERR_DEVICE_NO_PAPER; - //else - // ret = SCANNER_ERR_OK; - return ret; -} - -int hg_scanner_200::get_scan_is_sleep(SANE_Bool& type) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::ACTIVE_SCANNER, 0, 0 }; - len = sizeof(USBCB); - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - if (ret == SCANNER_ERR_OK) - { - ret = io_->read_bulk(&usbcb, &len); - } - } - if (ret == SCANNER_ERR_OK) - { - if (usbcb.u32_Data == 0x10) - type = true; - //return SCANNER_ERR_OK; - else if (usbcb.u32_Data == 0x100) - type = false; - //return SCANNER_ERR_DEVICE_SLEEPING; - } - - return ret; -} -int hg_scanner_200::get_device_log(string &log) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::set_devreboot(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::set_devshtudown() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::set_scan_islock(SANE_Bool type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::get_scan_islock(SANE_Bool& type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::set_scan_lock_check_val(string str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::set_firmware_upgrade(std::string str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::set_clean_paper_road() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::get_dev_islock_file(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::set_dev_islock_file(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT;; -} -int hg_scanner_200::set_speed_mode(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -int hg_scanner_200::get_speed_mode(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -int hg_scanner_200::set_devs_distortion_check_val(float data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -int hg_scanner_200::get_devs_distortion_check_val(float& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} - -int hg_scanner_200::set_auto_flat(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - - char errbuf[40] = { 0 }; - USBCB usbcb = { setting3288dsp::START_FLAT,data,0 }; - int len = sizeof(usbcb); - int ret = SCANNER_ERR_OK; - - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - } - - if (ret == SCANNER_ERR_OK) - { - wait_usb_.notify(); - std::this_thread::sleep_for(std::chrono::milliseconds(300)); - ret = try_third_app_after_start(ret); - } - else - status_ = ret; - utils::to_log(LOG_LEVEL_WARNING, "set_auto_flat ret: %s\n", hg_scanner_err_name(ret, errbuf)); - return ret; -} - -int hg_scanner_200::set_notify_sleep() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_200::get_history_scan_count(int& num) -{ - int ret = SCANNER_ERR_OK, - len = 0; - USBCB usbcb = { setting3288dsp::GET_SCANN_NUM,0, 0 }; - len = sizeof(usbcb); - { - std::lock_guard lock(io_lock_); - ret = io_->write_bulk(&usbcb, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - ret = io_->read_bulk(&usbcb, &len); - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - num = usbcb.u32_Data; - return ret; -} -int hg_scanner_200::get_roller_num(int& val) -{ - int ret = SCANNER_ERR_OK, - len = 0; - USBCB usbcb = { setting3288dsp::GET_ROLLER_NUM,0, 0 }; - len = sizeof(usbcb); - { - std::lock_guard lock(io_lock_); - ret = io_->write_bulk(&usbcb, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - ret = io_->read_bulk(&usbcb, &len); - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - val = usbcb.u32_Data; - return ret; -} \ No newline at end of file diff --git a/hgdriver/hgdev/hg_scanner_200.h b/hgdriver/hgdev/hg_scanner_200.h deleted file mode 100644 index bfab67c..0000000 --- a/hgdriver/hgdev/hg_scanner_200.h +++ /dev/null @@ -1,115 +0,0 @@ -#pragma once - -// hg_scanner is the base class of kinds of scanners -// -// created on 2022-01-30 -// -#include -#include -#include -#include - -#include "hg_scanner.h" - -//#ifdef OEM_HANWANG -//#define hg_scanner_200 hw_scanner_200 -//#elif defined(OEM_LISICHENG) -//#define hg_scanner_200 lsc_scanner_200 -//#endif - - -class hg_scanner_200 : public hg_scanner -{ - void discard_prev(void); -protected: - virtual void thread_handle_usb_read(void) override; - virtual int on_scanner_closing(bool force) override; - virtual int discard_all_images(void) override; - virtual int get_roller_life(void) override; - -protected: - virtual int on_color_mode_changed(int& color_mode) override; // COLOR_MODE_xxx - virtual int on_paper_changed(int& paper) override; // PAPER_xxx - virtual int on_paper_check_changed(bool& check) override; - virtual int on_resolution_changed(int& dpi) override; - virtual int on_ultrasonic_check_changed(bool& check) override; - virtual int on_staple_check_changed(bool& check) override; - virtual int on_skew_check_changed(bool& check) override; - virtual int on_skew_check_level_changed(int& check) override; - virtual int on_get_feedmode(int& feedmode) override; //获取分纸强度 - virtual int on_set_feedmode(int feedmode) override; //设置分纸强度 - virtual int on_pic_type(bool& pic) override; //照片模式或者文本模式 - virtual int on_pick_paper(bool autostrength)override; //设置搓纸使能 - virtual int on_pick_paper_threshold(double threshold) override; //设置搓纸阈值 - virtual int on_is_auto_paper(bool isautopaper) override; //待纸扫描 - virtual int on_cis_get_image(bool isautopaper) override; //获取cis原图 -public: - hg_scanner_200(const char* dev_name, const char* model,int vid, usb_io* io); - ~hg_scanner_200(); - -public: - virtual int do_start(void) override; - virtual int do_stop(void) override; - -private: - int initdevice(); - int writeusb(USBCB &usb); - int readusb(USBCB &usb); - int pop_image(); - int get_scanner_status(USBCB &usb); - int get_img_data(unsigned int bytes, SANE_Image_Statu statu = IMG_STATUS_OK); - int writedown_device_configuration(bool type =false,setting_hardware::HGSCANCONF_DSP *d = NULL); - void writedown_image_configuration(void); - void printf_devconfig(setting_hardware::HGSCANCONF_DSP *d = NULL); - - setting_hardware::HGSCANCONF_DSP dsp_config_; - int agreement(); - -public: - //////////////固定的硬件信息设置或获取////////////// - virtual std::string get_firmware_version(void)override; - virtual std::string get_serial_num(void)override; - virtual std::string get_ip(void)override; - - virtual int set_serial_num(string str) override; //设置序列号 - virtual int set_vid_pid(int data) override; //设置vidpid - virtual int get_vid_pid(int& data)override; //获取vidpid - - /////////////////成功返回:SCANNER_ERR_OK ///////////// - /////////////////失败返回:IO错误码 ///////////// - virtual int set_leaflet_scan(void) override; //单张扫描 - - - virtual int set_clear_roller_num(void) override; //清除滚轴计数 - virtual int set_clear_history_num(void) override; //清除历史张数 - - virtual int get_device_code(void); //获取设备编码 不支持 - - virtual int get_scanner_paperon(SANE_Bool& type) override; //获取设备有无纸张 /*/ type : 0无纸 1有纸 */ - - virtual int get_scan_is_sleep(SANE_Bool& type) override; //获取设备是否休眠当中 /*/ type : 0休眠 1唤醒状态*/ - virtual int get_sleep_time(int& data) override; //获取功耗模式(休眠) /*/ data > 0*/ - virtual int set_sleep_time(int data) override; //设置功耗模式(休眠) /*/ data > 0*/ - virtual int get_history_scan_count(int& data) override; //获取历史扫描张数 /*/ data > 0*/ - virtual int get_roller_num(int& data) override; //获取滚轮张数 /*/ data > 0*/ - virtual int set_notify_sleep(void) override; //唤醒设备 - virtual int get_device_log(string& log) override; //获取设备日志 /*/ log :储存路径*/ - virtual int set_devreboot(int data) override; //设置设备重启 - virtual int set_devshtudown() override; //设置设备关机 - virtual int set_scan_islock(SANE_Bool type) override; //设置设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int get_scan_islock(SANE_Bool& type) override; //获取设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int set_scan_lock_check_val(string str) override; //获取设备是否锁定 /*/ str:校验码*/ - virtual int set_firmware_upgrade(std::string str) override; //固件升级 /*/ str:文件名路径*/ - virtual int set_clean_paper_road() override; //清理纸道 - virtual int get_dev_islock_file(int& data) override; //获取设备文件 /*/ data:0 未上锁,1 上锁。-1 未发现黑名单列表 -2列表没有信息*/ - virtual int set_dev_islock_file(int data) override; //设置设备文件 /*/ data:0 未上锁,1 上锁*/ - virtual int set_speed_mode(int data) override; //设置速度模式 /*/ 不支持 - virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ 不支持 - - virtual int set_devs_distortion_check_val(float data) override; //设置畸变矫正 - virtual int get_devs_distortion_check_val(float& data) override; //获取设备畸变值 - - virtual int set_auto_flat(int data); //设置自动平场校正 - // data:0(ALL) 1(200dpi、gray) 2(200dpi、color) 3(300dpi、gray) 4(300dpi、color) 5(600dpi、gray) 6(600dpi、color) - -}; diff --git a/hgdriver/hgdev/hg_scanner_239.cpp b/hgdriver/hgdev/hg_scanner_239.cpp deleted file mode 100644 index 7f13fc5..0000000 --- a/hgdriver/hgdev/hg_scanner_239.cpp +++ /dev/null @@ -1,2167 +0,0 @@ -#include "hg_scanner_239.h" - -#include "../../sdk/hginclude/utils.h" -#include -#include "filetools.h" -#include "../../sdk/json/gb_json.h" -#include - -#if defined(WIN32) || defined(_WIN64) -#include "scanner_manager.h" -#endif - -//100 200 3399 -//static std::string jsontext1("{\"global\":{\"device_type\":\"G139-G239\",\"option_count\":78},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout!=true\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\"); -//static std::string jsontext2("u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"is-size-check\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\\u4e0e\\u8bbe\\u7f6e\\u662f\\u5426\\u5339\\u914d\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"paper==A3\",\"==A4\",\"==A4\\u6a2a\\u5411\",\"==A5\",\"==A5\\u6a2a\\u5411\",\"==A6\",\"==A6\\u6a2a\\u5411\",\"==B4\",\"==B5\",\"==B5\\u6a2a\\u5411\",\"==B6\",\"==B6\\u6a2a\\u5411\",\"==Double Letter\",\"==LEGAL\",\"==Letter\",\"==Letter\\u6a2a\\u5411\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":40,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"discardblank\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\",\"desc\":\"\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"==true\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"size\":50,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":600,\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"size\":24,\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend_or\":[\"resolution>=300\"]},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"color-correction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u504f\\u6821\\u6b63\",\"desc\":\"\\u8272\\u5f69\\u8fd8\\u539f\\u5ea6\\u77eb\\u6b63\\u529f\\u80fd\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":2,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"fiel"); -//static std::string jsontext3("d\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-wait-scan\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"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\",\"cur\":false,\"default\":false,\"size\":4},\"wait-scan-exit\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\\u9000\\u51fa\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u7ed3\\u675f\\u5f85\\u7eb8\\u626b\\u63cf\\u7684\\u65f6\\u95f4\",\"type\":\"string\",\"cur\":\"60s\",\"default\":\"60s\",\"size\":24,\"range\":[\"15s\",\"30s\",\"60s\",\"2min\",\"4min\",\"8min\"],\"depend_or\":[\"is-wait-scan==true\"]},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"],\"depend_or\":[\"is-wait-scan==false\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_or\":[\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"double-feed\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53cc\\u5f20\\u56fe\\u7247\\u5904\\u7406\",\"desc\":\"\\u68c0\\u6d4b\\u5230\\u53cc\\u5f20\\u8fdb\\u7eb8\\u540e\\u7684\\u5904\\u7406\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"default\":\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"size\":40,\"range\":[\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"\\u4e0a\\u4f20\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\"],\"depend_or\":[\"is-ultrosonic==true\"]},\"is-staple\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"is-check-askew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"askew-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"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\",\"cur\":3,\"default\":3,\"size\":4,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend_or\":[\"is-check-askew==true\"]},\"is-check-dog-ear\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u6587\\u7a3f\\u662f\\u5426\\u5b58\\u5728\\u6298\\u89d2\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"dog-ear-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"type\":\"int\",\"cur\":70,\"default\":70,\"size\":4,\"range\":{\"min\":10,\"max\":300,\"step\":1},\"depend_or\":[\"is-check-dog-ear==true\"]},\"is-auto-strength\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u81ea\\u52a8\\u4fee\\u6b63\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"feed-strength-value\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8fdb\\u7eb8\\u5931\\u8d25\\u7387\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u503c\\u65f6\\u626b\\u63cf\\u4eea\\u5c06\\u8c03\\u6574\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.100000,\"max\":0.900000,\"step\":0.080000},\"depend_or\":[\"is-auto-strength==true\"]},\"feed-strength\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"string\",\"cur\":\"\\u4e00\\u822c\",\"default\":\"\\u4e00\\u822c\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\"],\"depend_or\":[\"is-auto-strength!=true\"]},\"time-to-sleep\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f11\\u7720\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u4f11\\u7720\\u65f6\\u95f4\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u4f11\\u7720\",\"default\":\"\\u4e0d\\u4f11\\u7720\",\"size\":24,\"range\":[\"\\u4e0d\\u4f11\\u7720\",\"\\u4e94\\u5206\\u949f\",\"\\u5341\\u5206\\u949f\",\"\\u534a\\u5c0f\\u65f6\",\"\\u4e00\\u5c0f\\u65f6\",\"\\u4e24\\u5c0f\\u65f6\",\"\\u56db\\u5c0f\\u65f6\"]}}"); -// -////G439 -//static std::string jsontext4("{\"global\":{\"device_type\":\"G439\",\"option_count\":70},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout!=true\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":10,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57"); -//static std::string jsontext5("df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"is-size-check\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\\u4e0e\\u8bbe\\u7f6e\\u662f\\u5426\\u5339\\u914d\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"paper==A3\",\"==A4\",\"==A4\\u6a2a\\u5411\",\"==A5\",\"==A5\\u6a2a\\u5411\",\"==A6\",\"==A6\\u6a2a\\u5411\",\"==B4\",\"==B5\",\"==B5\\u6a2a\\u5411\",\"==B6\",\"==B6\\u6a2a\\u5411\",\"==Double Letter\",\"==LEGAL\",\"==Letter\",\"==Letter\\u6a2a\\u5411\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":40,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"size\":50,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":600,\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"size\":24,\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend_or\":[\"resolution>=300\"]},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"color-correction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u504f\\u6821\\u6b63\",\"desc\":\"\\u8272\\u5f69\\u8fd8\\u539f\\u5ea6\\u77eb\\u6b63\\u529f\\u80fd\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==24\\u4f4d\\u5f69\\u8272\"]},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"ca"); -//static std::string jsontext6("t\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":[0.500000,0.050000,0.000000],\"depend_and\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":[0.500000,0.050000,0.000000],\"depend_and\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":[0.500000,0.050000,0.000000],\"depend_and\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":[0.500000,0.050000,0.000000],\"depend_and\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-wait-scan\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"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\",\"cur\":false,\"default\":false,\"size\":4},\"wait-scan-exit\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\\u9000\\u51fa\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u7ed3\\u675f\\u5f85\\u7eb8\\u626b\\u63cf\\u7684\\u65f6\\u95f4\",\"type\":\"string\",\"cur\":\"60s\",\"default\":\"60s\",\"size\":24,\"range\":[\"15s\",\"30s\",\"60s\",\"2min\",\"4min\",\"8min\"],\"depend_or\":[\"is-wait-scan==true\"]},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"],\"depend_and\":[\"is-wait-scan==false\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_and\":[\"is-wait-scan==false\",\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"is-check-dog-ear\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u6587\\u7a3f\\u662f\\u5426\\u5b58\\u5728\\u6298\\u89d2\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"dog-ear-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"type\":\"int\",\"cur\":70,\"default\":70,\"size\":4,\"range\":{\"min\":10,\"max\":300,\"step\":1},\"depend_or\":[\"is-check-dog-ear==true\"]},\"time-to-sleep\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f11\\u7720\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u4f11\\u7720\\u65f6\\u95f4\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u4f11\\u7720\",\"default\":\"\\u4e0d\\u4f11\\u7720\",\"size\":70,\"range\":[\"\\u4e0d\\u4f11\\u7720\",\"\\u4e94\\u5206\\u949f\",\"\\u5341\\u5206\\u949f\",\"\\u534a\\u5c0f\\u65f6\",\"\\u4e00\\u5c0f\\u65f6\",\"\\u4e24\\u5c0f\\u65f6\",\"\\u56db\\u5c0f\\u65f6\"]}}"); - -static std::string device_opt_json[] = { - "{\"restore\":{\"cat\":\"base\",\"group\":\"\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"fix-id\":34921,\"auth\":0,\"size\":4,\"auto\":false},\"help\":{\"cat\":\"base\",\"group\":\"\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"fix-id\":34897,\"auth\":0,\"size\":4,\"auto\":false},\"is-multiout\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34817,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"multiout-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"fix-id\":34818,\"auth\":0,\"enabled\":false,\"size\":66,\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend\":\"is-multiout==true\"},\"mode\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"fix-id\":34819,\"auth\":0,\"size\":24,\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend\":\"is-multiout!=true\"},\"binary-threshold\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"fix-id\":34870,\"auth\":0,\"size\":4,\"cur\":127,\"default\":127,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend\":\"(multiout-type.enabled&&multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6) || (mode.enabled && mode==\\u9ed1\\u767d)\"},\"reverse-bw\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"fix-id\":34878,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"(multiout-type.enabled&&multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6) || (mode.enabled && mode==\\u9ed1\\u767d)\"},\"filter\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"fix-id\":34820,\"auth\":0,\"enabled\":false,\"size\":42,\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend\":\"mode.enabled && (mode==256\\u7ea7\\u7070\\u5ea6 || mode==\\u9ed1\\u767d)\"},\"is-rid-multiout-red\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34821,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled && mode==24\\u4f4d\\u5f69\\u8272\"},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34822,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled && mode==24\\u4f4d\\u5f69\\u8272\"},\"is-erase-bkg\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"fix-id\":34823,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled && mode==24\\u4f4d\\u5f69\\u8272\"},\"bkg-color-range\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"fix-id\":34824,\"auth\":0,\"enabled\":false,\"size\":4,\"cur\":20,\"default\":20,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend\":\"is-erase-bkg==true\"},\"sharpen\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"fix-id\":34825,\"auth\":0,\"size\":20,\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend\":\"mode.enabled&&(mode==24\\u4f4d\\u5f69\\u8272 || mode==256\\u7ea7\\u7070\\u5ea6)\"},\"is-rid-morr\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"fix-id\":34826,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"resolution<500&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207 && mode.enabled&&(mode==24\\u4f4d\\u5f69\\u8272 || mode==256\\u7ea7\\u7070\\u5ea6)\"},\"is-rid-grid\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"fix-id\":34827,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"resolution<500&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207 && mode.enabled&&(mode==24\\u4f4d\\u5f69\\u8272 || mode==256\\u7ea7\\u7070\\u5ea6)\"},\"is-err-extension\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34828,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled&&mode==\\u9ed1\\u767d\"},\"is-noise-optimize\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"fix-id\":34829,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled&&mode==\\u9ed1\\u767d\"},\"noise-size\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"fix-id\":34830,\"auth\":0,\"size\":4,\"cur\":10,\"default\":10,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend\":\"is-noise-optimize==true\"},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"fix-id\":34831,\"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\"}]},\"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,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"visible\":1,\"size\":8,\"auto\":false,\"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,\"auth\":0,\"unit\":\"mm\",\"readonly\":true,\"visible\":1,\"size\":8,\"auto\":false,\"cur\":297.000000,\"default\":297.000000},\"lateral\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u6a2a\\u5411\",\"desc\":\"\\u6a2a\\u5411\\u653e\\u7f6e\\u7eb8\\u5f20\",\"type\":\"bool\",\"fix-id\":34924,\"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\"},\"is-custom-area\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"fix-id\":34832,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"},\"tl-x\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5", - "750\\u6807\",\"type\":\"float\",\"fix-id\":34833,\"auth\":0,\"unit\":\"mm\",\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.000000,\"max\":\"br-x\",\"step\":0.010000},\"depend\":\"is-custom-area==true && is-custom-area.enabled\"},\"br-x\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34834,\"auth\":0,\"unit\":\"mm\",\"size\":8,\"cur\":210.000000,\"default\":210.000000,\"range\":{\"min\":\"tl-x\",\"max\":\"paper-w\",\"step\":0.010000},\"depend\":\"is-custom-area==true && is-custom-area.enabled\"},\"tl-y\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34835,\"auth\":0,\"unit\":\"mm\",\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.000000,\"max\":\"br-y\",\"step\":0.010000},\"depend\":\"is-custom-area==true && is-custom-area.enabled\"},\"br-y\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34836,\"auth\":0,\"unit\":\"mm\",\"size\":8,\"cur\":297.000000,\"default\":297.000000,\"range\":{\"min\":\"tl-y\",\"max\":\"paper-h\",\"step\":0.010000},\"depend\":\"is-custom-area==true && is-custom-area.enabled\"},\"is-size-check\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\\u4e0e\\u8bbe\\u7f6e\\u662f\\u5426\\u5339\\u914d\",\"type\":\"bool\",\"fix-id\":34837,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper==A3||paper==A4||paper==A5||paper==A6||paper==B4||paper==B5||paper==B6||paper==Double Letter||paper==LEGAL||paper==Letter\"},\"page\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"fix-id\":34838,\"auth\":0,\"size\":12,\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"range\":[\"\\u6b63\\u9762\",\"\\u80cc\\u9762\",\"\\u53cc\\u9762\",\"\\u5bf9\\u6298\"]},\"discardblank\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\",\"desc\":\"\",\"type\":\"bool\",\"fix-id\":34919,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"blank-sensitivity\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"fix-id\":34839,\"auth\":0,\"size\":4,\"cur\":30,\"default\":30,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend\":\"discardblank==true\"},\"fold-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"fix-id\":34887,\"auth\":0,\"size\":16,\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend\":\"page==\\u5bf9\\u6298\"},\"resolution\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"fix-id\":34840,\"auth\":0,\"size\":4,\"cur\":200,\"default\":200,\"range\":{\"min\":100,\"max\":{\"default\":600,\"paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207 || paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8 || paper==\\u4e09\\u8054\\u8bd5\\u5377\":500},\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"type\":\"string\",\"fix-id\":34841,\"auth\":0,\"size\":16,\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend\":\"resolution>=300\"},\"is-exchange\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"fix-id\":34842,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page==\\u53cc\\u9762\"},\"is-custom-gamma\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"fix-id\":34845,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"brightness\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"fix-id\":34846,\"auth\":0,\"size\":4,\"cur\":128,\"default\":128,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend\":\"is-custom-gamma==false\"},\"contrast\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"fix-id\":34847,\"auth\":0,\"size\":4,\"cur\":4,\"default\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend\":\"is-custom-gamma==false\"},\"gamma\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"fix-id\":34848,\"auth\":0,\"size\":8,\"cur\":1.000000,\"default\":1.000000,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend\":\"is-custom-gamma==false\"},\"color-correction\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8272\\u504f\\u6821\\u6b63\",\"desc\":\"\\u8272\\u5f69\\u8fd8\\u539f\\u5ea6\\u77eb\\u6b63\\u529f\\u80fd\",\"type\":\"bool\",\"fix-id\":34888,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"fmw-ver.mid(4,2)>=3C\"},\"is-anti-skew\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34844,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true,\"depend\":\"page!=\\u5bf9\\u6298\"},\"is-split\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34843,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298\"},\"is-erase-black-frame\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"fix-id\":34849,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"bkg-fill-mode\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"fix-id\":34854,\"auth\":0,\"size\":16,\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend\":\"is-erase-black-frame==true\"},\"is-fill-color\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"fix-id\":34859,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"is-erase-black-frame==true\"},\"threshold\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"fix-id\":34851,\"auth\":0,\"size\":4,\"cur\":40,\"default\":40,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"anti-noise-level\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"fix-id\":34852,\"auth\":0,\"size\":4,\"cur\":8,\"default\":8,\"range\":{\"min\":2,\"max\":20,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"margin\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"fix-id\":34853,\"auth\":0,\"size\":4,\"cur\":5,\"default\":5,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"is-dark-sample\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"fix-id\":34850,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298&&is-erase-black-frame!=true&&paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a", - "\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207&&is-anti-skew!=true\"},\"is-anti-permeate\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"fix-id\":34855,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"permeate-level\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"fix-id\":34856,\"auth\":0,\"size\":12,\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend\":\"is-anti-permeate==true\"},\"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,\"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,\"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,\"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,\"auth\":0,\"size\":4,\"cur\":-1,\"default\":-1,\"depend\":\"scan-mode.enabled&&scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"},\"direction\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"fix-id\":34864,\"auth\":0,\"size\":32,\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"fix-id\":34865,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298&&direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"},\"is-ultrosonic\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"fix-id\":34860,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"double-feed\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u56fe\\u7247\\u5904\\u7406\",\"desc\":\"\\u68c0\\u6d4b\\u5230\\u53cc\\u5f20\\u8fdb\\u7eb8\\u540e\\u7684\\u5904\\u7406\\u65b9\\u5f0f\",\"type\":\"string\",\"fix-id\":34872,\"auth\":0,\"size\":32,\"cur\":\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"default\":\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"range\":[\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"\\u4e0a\\u4f20\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\"],\"depend\":\"is-ultrosonic==true\"},\"is-staple\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"type\":\"bool\",\"fix-id\":34861,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"is-check-askew\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"type\":\"bool\",\"fix-id\":34868,\"auth\":0,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"base\",\"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,\"auth\":0,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend\":\"is-check-askew==true\"},\"is-check-dog-ear\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u6587\\u7a3f\\u662f\\u5426\\u5b58\\u5728\\u6298\\u89d2\",\"type\":\"bool\",\"fix-id\":34866,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"dog-ear-size\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"type\":\"int\",\"fix-id\":34867,\"auth\":0,\"size\":4,\"cur\":70,\"default\":70,\"range\":{\"min\":10,\"max\":300,\"step\":1},\"depend\":\"is-check-dog-ear==true\"},\"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,\"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,\"auth\":0,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"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,\"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,\"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\"]},\"total-cnt\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u5386\\u53f2\\u6eda\\u8f74\\u8ba1\\u6570\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u4f7f\\u7528\\u4ee5\\u6765\\u626b\\u63cf\\u7eb8\\u5f20\\u603b\\u6570\",\"type\":\"int\",\"fix-id\":34889,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"ownread\":true,\"cur\":0,\"default\":0},\"dev-vid\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"USB-VID\",\"desc\":\"\\u8bbe\\u5907\\u5236\\u9020\\u5546\\u5728USB\\u7ec4\\u7ec7\\u7684ID\",\"type\":\"int\",\"fix-id\":34898,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"dev-pid\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"USB-PID\",\"desc\":\"\\u8bbe\\u5907\\u5728USB\\u7ec4\\u7ec7\\u4e2d\\u7684\\u4ea7\\u54c1ID\",\"type\":\"int\",\"fix-id\":34899,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"dev-name\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"desc\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34900,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"dev-model\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u4ea7\\u54c1\\u7cfb\\u5217\",\"desc\":\"\\u8bbe\\u5907\\u6240\\u5c5e\\u4ea7\\u54c1\\u7cfb\\u5217\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34901,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"dev-sn\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u5e8f\\u5217\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u5e8f\\u5217\\u53f7\",\"type\":\"string\",\"fix-id\":34902,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"},\"fmw-ver\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u56fa\\u4ef6\\u7248\\u672c\",\"desc\":\"\\u8bbe\\u5907\\u56fa\\u4ef6\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"fix-id\":34903,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"G2393B0500\",\"default\":\"G2393B0500\"},\"ip-addr\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"IP\",\"desc\":\"\\u8bbe\\u5907\\u8054\\u7f51\\u65f6\\u6240\\u5206\\u914d\\u7684IP\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34904,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"},\"mac-addr\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"MAC\",\"desc\":\"\\u8bbe\\u5907\\u7f51\\u5361\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34905,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"},\"roller-life\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u6eda\\u8f74\\u5bff\\u547d\",\"desc\":\"\\u8be5\\u8bbe\\u5907\\u6eda\\u8f74\\u8fc7\\u7eb8\\u7684\\u6700\\u5927\\u5f20", - "\\u6570\",\"type\":\"int\",\"fix-id\":34907,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"paper-on\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u6709\\u7eb8\",\"desc\":\"\\u8bbe\\u5907\\u4e0a\\u662f\\u5426\\u6709\\u7eb8\",\"type\":\"bool\",\"fix-id\":34912,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"ownread\":true,\"cur\":false,\"default\":false},\"roll-cnt\":{\"cat\":\"base\",\"group\":\"\\u7528\\u6237\",\"title\":\"\\u6eda\\u8f74\\u8ba1\\u6570\",\"desc\":\"\\u5f53\\u524d\\u6eda\\u8f74\\u5df2\\u7ecf\\u8fc7\\u7eb8\\u5f20\\u6570\",\"type\":\"int\",\"fix-id\":39170,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"ownread\":true,\"cur\":0,\"default\":0},\"devs-log\":{\"cat\":\"base\",\"group\":\"\\u7528\\u6237\",\"title\":\"\\u8bbe\\u5907\\u65e5\\u5fd7\",\"desc\":\"\\u8bbe\\u5907\\u5de5\\u4f5c\\u65e5\\u5fd7\",\"type\":\"string\",\"fix-id\":39172,\"auth\":0,\"visible\":1,\"size\":256,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"}}" -}; - -// fix this JSON, plz. -static std::string device_opt_json439[] = { - "{\"restore\":{\"cat\":\"base\",\"group\":\"\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"fix-id\":34921,\"size\":4},\"help\":{\"cat\":\"base\",\"group\":\"\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"fix-id\":34897,\"size\":4},\"is-multiout\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34817,\"size\":4,\"cur\":false,\"default\":false},\"multiout-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"fix-id\":34818,\"enabled\":false,\"size\":66,\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend\":\"is-multiout==true\"},\"mode\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"fix-id\":34819,\"size\":54,\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend\":\"is-multiout!=true\"},\"binary-threshold\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"fix-id\":34870,\"size\":4,\"cur\":127,\"default\":127,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend\":\"(multiout-type.enabled&&multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6) || (mode.enabled && mode==\\u9ed1\\u767d)\"},\"reverse-bw\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"fix-id\":34878,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"(multiout-type.enabled&&multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6) || (mode.enabled && mode==\\u9ed1\\u767d)\"},\"filter\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"fix-id\":34820,\"enabled\":false,\"size\":42,\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend\":\"mode.enabled && (mode==256\\u7ea7\\u7070\\u5ea6 || mode==\\u9ed1\\u767d)\"},\"is-rid-multiout-red\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34821,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled && mode==24\\u4f4d\\u5f69\\u8272\"},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34822,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled && mode==24\\u4f4d\\u5f69\\u8272\"},\"is-erase-bkg\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"fix-id\":34823,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled && mode==24\\u4f4d\\u5f69\\u8272\"},\"bkg-color-range\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"fix-id\":34824,\"enabled\":false,\"size\":4,\"cur\":20,\"default\":20,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend\":\"is-erase-bkg==true\"},\"sharpen\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"fix-id\":34825,\"size\":48,\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend\":\"mode.enabled&&(mode==24\\u4f4d\\u5f69\\u8272 || mode==256\\u7ea7\\u7070\\u5ea6)\"},\"is-rid-morr\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"fix-id\":34826,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"resolution<500&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207 && mode.enabled&&(mode==24\\u4f4d\\u5f69\\u8272 || mode==256\\u7ea7\\u7070\\u5ea6)\"},\"is-rid-grid\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"fix-id\":34827,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"resolution<500&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207 && mode.enabled&&(mode==24\\u4f4d\\u5f69\\u8272 || mode==256\\u7ea7\\u7070\\u5ea6)\"},\"is-err-extension\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34828,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled&&mode==\\u9ed1\\u767d\"},\"is-noise-optimize\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"fix-id\":34829,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode.enabled&&mode==\\u9ed1\\u767d\"},\"noise-size\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"fix-id\":34830,\"size\":4,\"cur\":10,\"default\":10,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend\":\"is-noise-optimize==true\"},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"fix-id\":34831,\"size\":96,\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",{\"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\"}]},\"is-custom-area\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"fix-id\":34832,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"},\"tl-x\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34833,\"unit\":\"mm\",\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend\":\"is-custom-area==true\"},\"br-x\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34834,\"unit\":\"mm\",\"size\":8,\"cur\":210.000000,\"default\":210.000000,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend\":\"is-custom-area==true\"},\"tl-y\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34835,\"unit\":\"mm\",\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend\":\"is-custom-area==true\"},\"br-y\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u6", - "3cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"fix-id\":34836,\"unit\":\"mm\",\"size\":8,\"cur\":297.000000,\"default\":297.000000,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend\":\"is-custom-area==true\"},\"is-size-check\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\\u4e0e\\u8bbe\\u7f6e\\u662f\\u5426\\u5339\\u914d\",\"type\":\"bool\",\"fix-id\":34837,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper==A3||paper==A4||paper==A4\\u6a2a\\u5411||paper==A5||paper==A5\\u6a2a\\u5411||paper==A6||paper==A6\\u6a2a\\u5411||paper==B4||paper==B5||paper==B5\\u6a2a\\u5411||paper==B6||paper==B6\\u6a2a\\u5411||paper==Double Letter||paper==LEGAL||paper==Letter||paper==Letter\\u6a2a\\u5411\"},\"page\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"fix-id\":34838,\"size\":78,\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"discardblank\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\",\"desc\":\"\",\"type\":\"bool\",\"fix-id\":34919,\"size\":4,\"cur\":false,\"default\":false},\"blank-sensitivity\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"fix-id\":34839,\"size\":4,\"cur\":30,\"default\":30,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend\":\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09||page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09||discardblank==true\"},\"fold-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"fix-id\":34887,\"size\":42,\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend\":\"page==\\u5bf9\\u6298\"},\"resolution\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"fix-id\":34840,\"size\":4,\"cur\":200,\"default\":200,\"range\":{\"min\":100,\"max\":{\"default\":600,\"paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207 || paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8 || paper==\\u4e09\\u8054\\u8bd5\\u5377\":500},\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"type\":\"string\",\"fix-id\":34841,\"size\":42,\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend\":\"resolution>=300\"},\"is-exchange\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"fix-id\":34842,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5355\\u9762\"},\"is-custom-gamma\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"fix-id\":34845,\"size\":4,\"cur\":false,\"default\":false},\"brightness\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"fix-id\":34846,\"size\":4,\"cur\":128,\"default\":128,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend\":\"is-custom-gamma==false\"},\"contrast\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"fix-id\":34847,\"size\":4,\"cur\":4,\"default\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend\":\"is-custom-gamma==false\"},\"gamma\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"fix-id\":34848,\"size\":8,\"cur\":1.000000,\"default\":1.000000,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend\":\"is-custom-gamma==false\"},\"color-correction\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8272\\u504f\\u6821\\u6b63\",\"desc\":\"\\u8272\\u5f69\\u8fd8\\u539f\\u5ea6\\u77eb\\u6b63\\u529f\\u80fd\",\"type\":\"bool\",\"fix-id\":34888,\"size\":4,\"cur\":false,\"default\":false},\"is-anti-skew\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34844,\"size\":4,\"cur\":true,\"default\":true,\"depend\":\"page!=\\u5bf9\\u6298\"},\"is-split\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34843,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298&&page!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09&&page!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"},\"is-erase-black-frame\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"fix-id\":34849,\"size\":4,\"cur\":true,\"default\":true},\"bkg-fill-mode\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"fix-id\":34854,\"size\":42,\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend\":\"is-erase-black-frame==true\"},\"is-fill-color\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"fix-id\":34859,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"is-erase-black-frame==true\"},\"threshold\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"fix-id\":34851,\"size\":4,\"cur\":40,\"default\":40,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"anti-noise-level\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"fix-id\":34852,\"size\":4,\"cur\":8,\"default\":8,\"range\":{\"min\":2,\"max\":20,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"margin\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"fix-id\":34853,\"size\":4,\"cur\":5,\"default\":5,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"is-dark-sample\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"fix-id\":34850,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298&&is-erase-black-frame!=true&&paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207&&is-anti-skew!=true\"},\"is-anti-permeate\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"fix-id\":34855,\"size\":4,\"cur\":false,\"default\":false},\"permeate-level\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"fix-id\":34856,\"size\":30,\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend\":\"is-anti-permeate==true\"},\"is-rid-hole-l\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u", - "5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"fix-id\":34879,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-l\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"fix-id\":34880,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-l==true\"},\"is-rid-hole-r\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"fix-id\":34881,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-r\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"fix-id\":34882,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-r==true\"},\"is-rid-hole-t\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"fix-id\":34883,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-t\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"fix-id\":34884,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-t==true\"},\"is-rid-hole-b\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"fix-id\":34885,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-b\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"fix-id\":34886,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-b==true\"},\"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,\"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,\"size\":42,\"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,\"size\":54,\"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,\"size\":4,\"cur\":1,\"default\":1,\"depend\":\"scan-mode.enabled&&scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"},\"direction\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"fix-id\":34864,\"size\":72,\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"fix-id\":34865,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5355\\u9762&&page!=\\u5bf9\\u6298&&direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"},\"is-ultrosonic\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"fix-id\":34860,\"size\":4,\"cur\":true,\"default\":true},\"is-check-dog-ear\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u6587\\u7a3f\\u662f\\u5426\\u5b58\\u5728\\u6298\\u89d2\",\"type\":\"bool\",\"fix-id\":34866,\"size\":4,\"cur\":false,\"default\":false},\"dog-ear-size\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"type\":\"int\",\"fix-id\":34867,\"size\":4,\"cur\":70,\"default\":70,\"range\":{\"min\":10,\"max\":300,\"step\":1},\"depend\":\"is-check-dog-ear==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,\"size\":36,\"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\"]},\"total-cnt\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u5386\\u53f2\\u6eda\\u8f74\\u8ba1\\u6570\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u4f7f\\u7528\\u4ee5\\u6765\\u626b\\u63cf\\u7eb8\\u5f20\\u603b\\u6570\",\"type\":\"int\",\"fix-id\":34889,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"dev-vid\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u8bbe\\u5907ID\",\"desc\":\"\\u8bbe\\u5907\\u5927\\u7c7bID\",\"type\":\"int\",\"fix-id\":34898,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"dev-pid\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"USB-PID\",\"desc\":\"\\u8bbe\\u5907\\u5728USB\\u4e2d\\u7684\\u4ea7\\u54c1ID\",\"type\":\"int\",\"fix-id\":34899,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"dev-name\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"desc\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34900,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"dev-model\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u4ea7\\u54c1\\u7cfb\\u5217\",\"desc\":\"\\u8bbe\\u5907\\u6240\\u5c5e\\u4ea7\\u54c1\\u7cfb\\u5217\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34901,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"dev-sn\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u5e8f\\u5217\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u5e8f\\u5217\\u53f7\",\"type\":\"string\",\"fix-id\":34902,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"fmw-ver\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u56fa\\u4ef6\\u7248\\u672c\",\"desc\":\"\\u8bbe\\u5907\\u56fa\\u4ef6\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"fix-id\":34903,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"ip-addr\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"IP\",\"desc\":\"\\u8bbe\\u5907\\u8054\\u7f51\\u65f6\\u6240\\u5206\\u914d\\u7684IP\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34904,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"mac-addr\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"MAC\",\"desc\":\"\\u8bbe\\u5907\\u7f51\\u5361\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34905,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"},\"roller-life\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u6eda\\u8f74\\u5bff\\u547d\",\"desc\":\"\\u8be5\\u8bbe\\u5907\\u6eda\\u8f74\\u8fc7\\u7eb8\\u7684\\u6700\\u5927\\u5f20\\u6570\",\"type\":\"int\",\"fix-id\":34907,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"paper-on\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u6709\\u7eb8\",\"desc\":\"\\u8bbe\\u5907\\u4e0a\\u662f\\u5426\\u6709\\u7eb8\",\"type\":\"bool\",\"fix-id\":34912,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":false,\"default\":false},\"roll-cnt\":{\"cat\":\"base\",\"group\":\"\\u53ea\\u8bfb\\u5c5e\\u6027\",\"title\":\"\\u6eda\\u8f74\\u8ba1\\u6570\",\"desc\":\"\\u5f53\\u524d\\u6eda\\u8f74\\u5df2\\u7ecf\\u8fc7\\u7eb8\\u5f20\\u6570\",\"type\":\"int\",\"fix-id\":39170,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":0,\"default\":0},\"devs-log\":{\"cat\":\"base\",\"group\":\"\\u9ad8\\u7ea7\\u8bbe\\u7f6e\",\"title\":\"\\u8bbe\\u5907\\u65e5\\u5fd7\",\"desc\":\"\\u8bbe\\u5907\\u5de5\\u4f5c\\u65e5\\u5fd7\",\"type\":\"string\",\"fix-id\":39172,\"visible\":1,\"size\":256,\"auto\":false,\"cur\":\"0\",\"default\":\"0\"}}" -}; - -namespace settings -{ - scanner_err device_status_to_hg_err(setting3399::HGEIntInfo* ds) - { - scanner_err code = SCANNER_ERR_OK; - - if (ds->From == setting3399::HGType::FPGA) - code = SCANNER_ERR_OK; - else if (ds->From == setting3399::HGType::MtBoard) - { - switch (ds->Code) - { - case 0x00002: - code = SCANNER_ERR_DEVICE_NO_PAPER; - break; - case 0x00004: - code = SCANNER_ERR_DEVICE_COVER_OPENNED; - break; - case 0x00008: - code = SCANNER_ERR_DEVICE_FEEDING_PAPER; - break; - case 0x00010: - code = SCANNER_ERR_DEVICE_PAPER_JAMMED; - break; - case 0x00020: - code = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; - break; - case 0x00040: - code = SCANNER_ERR_DEVICE_STAPLE_ON; - break; - case 0x00080: - code = SCANNER_ERR_DEVICE_PAPER_SKEW; - break; - case 0x10000: - case 0x80000: - code = SCANNER_ERR_TIMEOUT; - break; - case 0x20000: - code = SCANNER_ERR_DEVICE_SIZE_CHECK; - break; - case 0x00100: - code = SCANNER_ERR_DEVICE_ISLOCK; - break; - default: - break; - } - } - else if (ds->From == setting3399::HGType::IMG) - { - if (ds->Code == 1) - code = SCANNER_ERR_DEVICE_DOGEAR; - else if (ds->Code == 2) - code = SCANNER_ERR_DEVICE_SIZE_CHECK; - } - else if (ds->From == setting3399::HGType::V4L2) - { - if (ds->Code == 0) - code = SCANNER_ERR_DEVICE_SCANN_ERROR; - else if (ds->Code == 1) - code = SCANNER_ERR_DEVICE_NO_IMAGE; - } - else if (ds->From == setting3399::HGType::STOPSCAN) - code = SCANNER_ERR_DEVICE_STOPPED; - else if (ds->From == setting3399::HGType::AutoCorrect) - { - if (ds->Code == 4) - code = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; - else - code = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - } - - - return code; - } - - // resolution - static struct - { - float resolution; - int dev_value; - }resolution_map[] = - { - {100.0f, 1}, - {150.0f, 1}, - {200.0f, 1}, - {240.0f, 1}, - {300.0f, 0}, - {600.0f, 1} //临时版本? 原来? - }; - bool is_equal(float l, float r) - { - return fabs(l - r) < .000001f; - } - int match_best_resolution(int resolution, bool* exact) - { - int rsl = resolution, - ind = 0; - bool good = true, *r = exact ? exact : &good; - - if (rsl <= resolution_map[0].resolution) - { - ind = 0; - } - else if (rsl >= resolution_map[ARRAY_SIZE(resolution_map) - 1].resolution) - { - ind = ARRAY_SIZE(resolution_map) - 1; - } - else - { - for (int i = 1; i < ARRAY_SIZE(resolution_map); ++i) - { - if (is_equal(rsl, resolution_map[i].resolution)) - { - ind = i; - break; - } - if (rsl < resolution_map[i].resolution) - { - float dif_l = rsl - resolution_map[i - 1].resolution, - dif_r = resolution_map[i].resolution - rsl; - - if (dif_l > dif_r) - ind = i; - else - ind = i - 1; - break; - } - } - } - - *r = is_equal(rsl, resolution_map[ind].resolution); - - return ind; - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// class ... -hg_scanner_239::hg_scanner_239(const char* dev_name, const char* model, int pid,usb_io* io) : hg_scanner(G20039Serial, dev_name, model, io,pid) - , rewrite_conf_(false), reset_(false),is_start_status(false) -{ - init_version(); - //pid_ = pid; - utils::to_log(LOG_LEVEL_DEBUG, "hg_scanner_239(%p) constructing ...\n", this); - dev_conf_.value = 0; -#ifndef MAPPING_FUNCTION_IN_BASE - init_setting_map(setting_map_, ARRAY_SIZE(setting_map_)); -#endif - if (init_settings(pid_)) - { - std::string text(""); - if (pid_ == 0x239) - { - //init_settings((jsontext1 + jsontext2 + jsontext3).c_str()); - - for (auto& v : device_opt_json) - text += v; - } - else - { - // init_settings((jsontext4 + jsontext5 + jsontext6).c_str()); - for (auto& v : device_opt_json439) - text += v; - } - init_settings(text.c_str()); - } - hg_version_init_handle(); - string str; - get_devs_time(str); -#ifdef OEM_HUAGAO - wait_devsislock_.notify(); -#endif - //wait_read_int.notify(); -} -hg_scanner_239::~hg_scanner_239() -{ - utils::to_log(LOG_LEVEL_DEBUG, "hg_scanner_239(%p) destroyed.\n", this); -} -int hg_scanner_239::read_register(int addr, int* val) -{ - int l = sizeof(*val), - ret = io_->control_io(0x0c0, USB_REQ_GET_DEV_REGS, addr, 0, val, &l); - - if (ret) - status_ = ret; - - return ret; -} -int hg_scanner_239::write_register(int addr, int val) -{ - int l = sizeof(val), - ret = io_->control_io(0x040, USB_REQ_SET_DEV_REGS, addr, 0, &val, &l); - - if (ret) - status_ = ret; - - return ret; -} -int hg_scanner_239::write_command(int cmd) -{ - return write_register(0, cmd); -} -std::string hg_scanner_239::control_fetch(int addr, int val, int size) -{ - int l = sizeof(val), - ret = 0; - std::string data(""); - char errbuf[40] = { 0 }; - - ret = write_register(addr, val); - if (ret == SCANNER_ERR_OK) - { - l = size + 1; - data.resize(size + 2); - bzero(&data[0], size + 2); - ret = io_->read_bulk(&data[0], &l); - if (ret || l == 0) - { - utils::to_log(LOG_LEVEL_DEBUG, "control_fetch(%d, %d) - read_bulk %d byte(s) = %s\n", addr, val, l, hg_scanner_err_name(ret, errbuf)); - data.clear(); - } - } - else - utils::to_log(LOG_LEVEL_DEBUG, "control_fetch(%d, %d) = %s\n", addr, val, hg_scanner_err_name(ret, errbuf)); - - return data; -} -std::string hg_scanner_239::get_fpga(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_MBVERSION_LENGHT, &val); - std::string fpga(""); - - if (ret == SCANNER_ERR_OK) - { - fpga.resize(val + 2); - bzero(&fpga[0], val + 2); - - return control_fetch(setting3399::SR_GET_MBVERSION, 0, val); - } - - return fpga; -} -int hg_scanner_239::get_scan_mode(bool &type) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_OS, &val); //val == 1计数模式 - type =val == 1 ? false : true; - - utils::to_log(LOG_LEVEL_DEBUG, "get_scan_mode: %s\n", type ? hg_scanner_err_description(SCANNER_ERR_DEVICE_COUNT_MODE) : hg_scanner_err_description(SCANNER_ERR_OK)); - - return ret; -} -int hg_scanner_239::set_speed_mode(int data) -{ - std::lock_guard lock(io_lock_); - - return write_register(setting3399::SR_SET_SPEEDMODE, data); -} -int hg_scanner_239::get_speed_mode(int& data) -{ - std::lock_guard lock(io_lock_); - - return read_register(setting3399::SR_GET_SPEEDMODE, &data); -} -int hg_scanner_239::set_devs_distortion_check_val(float data) -{ - std::lock_guard lock(io_lock_); - - int val = *(int*)&data; - setting3399::Scanner_Reg_Defs ratio = setting3399::SR_SET_V_RATIO; //华凌畸变设置 - - if (firmware_sup_log_export_)//敦南畸变设置 - { - if (resolution_ <= 200) - ratio = setting3399::SR_SET_V_200_RATIO; - else if (resolution_ > 200 && resolution_ <= 300) - ratio = setting3399::SR_SET_V_300_RATIO; - else if (resolution_ > 300 && resolution_ <= 600) - ratio = setting3399::SR_SET_V_600_RATIO; - } - - - return write_register(ratio, val); -} -int hg_scanner_239::get_devs_distortion_check_val(float& data) -{ - std::lock_guard lock(io_lock_); - - int val = 0; - setting3399::Scanner_Reg_Defs ratio = setting3399::SR_GET_V_RATIO; - if (firmware_sup_log_export_) - { - if (resolution_ <= 200) - ratio = setting3399::SR_GET_V_200_RATIO; - else if (resolution_ > 200 && resolution_ <= 300) - ratio = setting3399::SR_GET_V_300_RATIO; - else if (resolution_ > 300 && resolution_ <= 600) - ratio = setting3399::SR_GET_V_600_RATIO; - } - - int ret = read_register(ratio, &val); - - data = *(float*)&val; - return ret; -} -int hg_scanner_239::set_auto_flat(int data) -{ - int ret = SCANNER_ERR_OK; - auto fw = get_firmware_version(); - if (fw.empty()) - { - return SCANNER_ERR_NO_DATA; - } - if ((fw[5] == 'A' && atoi(fw.substr(6, 4).c_str()) <= 9999)) - { - data = data == 1 ? 1 : 0; //暂时没有用�? - } - if (!wait_usb_.is_waiting()) - { - return SCANNER_ERR_DEVICE_BUSY; - } - else - { - std::lock_guard lock(io_lock_); - - ret = write_register(setting3399::SC_AUTOCORRECT, data); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - //status_ = SCANNER_ERR_DEVICE_BUSY; - wait_usb_.notify(); - std::this_thread::sleep_for(std::chrono::milliseconds(300)); - ret = try_third_app_after_start(ret); - } - - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_WARNING, "set_auto_flat ret: %s\n", hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner_239::get_motor_board_ver(string &ver) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_MBVERSION_LENGHT, &val); - - ver = control_fetch(setting3399::SR_GET_MBVERSION, 0, val); - return ret; -} -int hg_scanner_239::set_devs_time(string times) -{ - string path = "/usr/local/huago/PC_TIMES.txt"; - return write_control_device_files(path, times); -} -int hg_scanner_239::get_devs_time(string& times) -{ - string path = "/usr/local/huago/PC_TIMES.txt"; - char buf[128] = {0}; - int ret = read_control_device_files(path, times); - if (ret == SCANNER_ERR_NO_DATA) - { - strcpy(buf, utils::format_current_time().c_str()); - - ret = write_control_device_files(path,buf); - if (ret == SCANNER_ERR_OK) - { - ret = read_control_device_files(path, times); - } - } - if (ret != SCANNER_ERR_OK) - { - times = ""; - } - return ret; -} -int hg_scanner_239::get_status(void) -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = read_register(setting3399::SR_STATUS, &val); - char errbuf[40] = { 0 }; - - if (ret) - { - utils::to_log(LOG_LEVEL_DEBUG, "get status error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return -1; - } - else - return val; -} -bool hg_scanner_239::is_dev_image_process_done(void) -{ - std::lock_guard lock(io_lock_); - char errbuf[40] = { 0 }; - - int val = 0, - ret = read_register(setting3399::SR_GET_IMAGEPROCESSDONE, &val); - - if (ret) - { - utils::to_log(LOG_LEVEL_DEBUG, "is_dev_image_process_done() error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return true; - } - else - return val; -} -bool hg_scanner_239::is_dev_image_keep_last_paper(void) -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = read_register(setting3399::SR_GET_KEEP_LAST_PAPER, &val); - char errbuf[40] = { 0 }; - - if (ret) - { - utils::to_log(LOG_LEVEL_DEBUG, "is_dev_image_keep_last_paper() error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return true; - } - else - return val; -} -int hg_scanner_239::get_image_count(void) -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = read_register(setting3399::SR_IM_COUNT, &val); - - //utils::to_log(LOG_LEVEL_DEBUG, "Gets The image queue in the 'DEVICE':[%d]\n", val); - - if (ret == SCANNER_ERR_OK) - return val; - else - return -1; -} -int hg_scanner_239::get_front_data_size(void) -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = read_register(setting3399::SR_IM_FRONT_SIZE, &val); - char errbuf[40] = { 0 }; - - if (ret == SCANNER_ERR_OK) - return val; - else - { - utils::to_log(LOG_LEVEL_DEBUG, "get_front_data_size = %s\n", hg_scanner_err_name(ret, errbuf)); - return -1; - } -} -void hg_scanner_239::init_version(void) -{ - - std::string fv(get_firmware_version()), - sn(get_serial_num()); - if (fv.empty() || sn.empty()) - return; - - string dev = fv.substr(0, 2); - string ver = fv.substr(2, 3); - string date = fv.substr(5, 5); - string year = fv.substr(4, 2); - string devType; - string year_date = fv.substr(4, 6); - - if (dev == "G1" || dev == "G2") - { - firmware_sup_wait_paper_ = year_date.compare("3B0431") >= 0 ? true : false; - firmware_sup_log_export_ = year_date.compare("3B0429") >= 0 ? true : false; - firmware_sup_pick_strength_ = year_date.compare("3B0830") >= 0 ? true : false; - firmware_sup_wake_device_ = year_date.compare("3B0830") >= 0 ? true : false; - firmware_sup_color_corr_ = year.compare("3C") >= 0 ? true : false; - firmware_sup_double_img = year.compare("3C") >= 0 ? true : false; - firmware_sup_devs_lock_ = year_date.compare("3B0500") >= 0 ? true : false; - firmware_sup_dpi_300 = false; - firmware_sup_dpi_600 = date.compare("A1227") >= 0 ? true : false; - firmware_sup_auto_speed_ = year.compare("3C") >= 0 ? true : false; - firmware_sup_morr_ = year_date.compare("3C0518") >= 0 ? true : false; - firmware_sup_color_fill_ = year.compare("3B03C830") >= 0 ? true : false; - } - else - { - firmware_sup_wait_paper_ = year_date.compare("3B0629") >= 0 ? true : false; - firmware_sup_log_export_ = true; - firmware_sup_pick_strength_ = false; //不支? - firmware_sup_wake_device_ = year_date.compare("3C0518") >= 0 ? true : false; - firmware_sup_color_corr_ = year.compare("3C") >= 0 ? true : false; - firmware_sup_double_img = false; //不支? - firmware_sup_devs_lock_ = year.compare("3C") >= 0 ? true : false; - firmware_sup_dpi_300 = false; - firmware_sup_dpi_600 = true; - firmware_sup_auto_speed_ = year.compare("3C") >= 0 ? true : false; - firmware_sup_morr_ = year_date.compare("3C0518") >= 0 ? true : false; - firmware_sup_color_fill_ = year.compare("3C") >= 0 ? true : false; - } - - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_wait_paper_:%s\r\n", firmware_sup_wait_paper_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_log_export_:%s\r\n", firmware_sup_log_export_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_pick_strength_:%s\r\n", firmware_sup_pick_strength_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_color_corr_:%s\r\n", firmware_sup_color_corr_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_double_img:%s\r\n", firmware_sup_double_img ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_devs_lock_:%s\r\n", firmware_sup_devs_lock_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_dpi_300:%s\r\n", firmware_sup_dpi_300 ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_dpi_600:%s\r\n", firmware_sup_dpi_600 ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_auto_speed_:%s\r\n", firmware_sup_auto_speed_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_morr_:%s\r\n", firmware_sup_morr_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware_sup_color_fill_:%s\r\n", firmware_sup_color_fill_ ? "enable" : "close"); - utils::to_log(LOG_LEVEL_DEBUG, "Firmware version: %s\n", fv.c_str()); - - //is_kernelsnap_239_220429_ = date >= "B0429" ? true : false; - //is_kernelsnap_239_220430_ = date >= "B0430" ? true : false; - - //if (dev == "G1" || dev == "G2" ) - //{ - // is_kernelsnap_239_211209_ = date >= "A1209" ? (is_kernelsnap_239_211209_ = atoi(get_fpga().c_str()) >= 35211210) : false;//基本用不到了 - // is_kernelsnap_239_220830_ = date >= "B0830" ? true: false; - // is_kernelsnap_239_221027_ = date >= "B1027" ? true : false; - // is_kernelsnap_239_3C_ = year >= "3C" ? true : false; - // - // is_kernelsnap_239_220500_ = date >= "B0500" ? true : false; - - // is_kernelsnap_211227_ = date <= "A1227" ? true : false; - - //} - //else - //{ - // //is_kernelsnap_439_3C0606 = date >= "C0606" ? true : false; - // is_kernelsnap_239_3C_ = date >= "C0606" ? true : false; - // - - //} - - -} -int hg_scanner_239::writedown_device_configuration(bool type, setting_hardware::HGSCANCONF_3399* dev_conf) -{ - std::lock_guard lock(io_lock_); - - int ret = SCANNER_ERR_OK; - if (!type) - return ret; - if (!dev_conf) - dev_conf = &dev_conf_; - - if (is_multiout) - { - dev_conf->params_3399.color = image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW ? 0 : 1; - } - else if ((image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY - || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) - && image_prc_param_.bits.rid_color != RID_COLOR_NONE) - { - dev_conf->params_3399.color = 1; - } - - if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH - || image_prc_param_.bits.paper == PAPER_MAX_SIZE - || image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP - || image_prc_param_.bits.paper == PAPER_TRIGEMINY - || image_prc_param_.bits.paper == PAPER_16K - || image_prc_param_.bits.paper == PAPER_8K - || image_prc_param_.bits.paper == PAPER_16K_LATERAL - ) - { - dev_conf->params_3399.enable_sizecheck = false; - } - if (firmware_sup_auto_speed_ && image_prc_param_.bits.paper == PAPER_AUTO_MATCH) - { - dev_conf->params_3399.is_fixedpaper = false; - dev_conf->params_3399.en_autosize = true; - } - if (!firmware_sup_auto_speed_ && image_prc_param_.bits.paper == PAPER_AUTO_MATCH)//3399 ,?C之前的版?匹配原始尺寸设置 12 - { - dev_conf->params_3399.paper = 12; - } - - ret = write_register(setting3399::SR_CONFIG_SCAN_PARAM, dev_conf->value); - - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "Writedown scanner configuration(0x%x) = %s\n", dev_conf->value, hg_scanner_err_name(ret, errbuf)); - - return ret; -} -int hg_scanner_239::writedown_image_configuration(void) -{ - int ret = 0; - - if (ret != SCANNER_ERR_OK) - return ret; - - SCANCONF ic; - int len = sizeof(ic); - - bzero(&ic, len); - if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO) - ic.imageRotateDegree = (float)image_prc_param_.bits.text_direction; - else - ic.imageRotateDegree = 0; - - ic.imageRotateDegree *= 90.0f; - ic.en_sizecheck = dev_conf_.params_3399.enable_sizecheck; - ic.hardwarecaps.en_skrewdetect = dev_conf_.params_3399.screw_detect_enable; - ic.hardwarecaps.en_doublefeed = dev_conf_.params_3399.ultrasonic_enable; - ic.hardwarecaps.en_stapledetect = dev_conf_.params_3399.staple_enbale; - ic.hardwarecaps.skrewdetectlevel = dev_conf_.params_3399.screw_detect_level; - if (test_1_paper_) - { - utils::log_info("scanning mode: testing ONE paper ...\n", LOG_LEVEL_DEBUG); - ic.scannum = ic.is_duplex ? 2 : 1; - } - else - { - if (scan_count_ == -1 || is_auto_paper_scan) - ic.scannum = -1; - else - ic.scannum = ((image_prc_param_.bits.page != PAGE_SINGLE) ? scan_count_ * 2 : scan_count_); - } - ic.contrast = (contrast_ - 4) * 333.0; - ic.brightness = (bright_ - 128) * (2000.0 / 254.0); - image_configuration(ic); - - { - std::lock_guard lock(io_lock_); - ret = write_register(setting3399::SR_CONFIF_IMGPROCPARAM, sizeof(SCANCONF)); - ret = io_->write_bulk(&ic, &len); - - this_thread::sleep_for(chrono::milliseconds(500)); - io_->set_timeout(2000);//必要延时 - } - return ret; -} -int hg_scanner_239::pop_first_image(void) -{ - std::lock_guard lock(io_lock_); - char errbuf[40] = { 0 }; - - int ret = write_register(setting3399::SR_IM_POP, 1); - if (ret) - { - utils::to_log(LOG_LEVEL_DEBUG, "popup first image = %s\n", hg_scanner_err_name(ret, errbuf)); - } - return ret; -} -int hg_scanner_239::read_one_image_from_usb(SANE_Image_Statu statu) -{ - int r = 0, - total = get_front_data_size(), - off = 0, - ret = SCANNER_ERR_OK; - bool is_scanner_err_ok = false; - char errbuf[40] = { 0 }; - - if (!waiting_for_memory_enough(total)) - { - status_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - - return status_; - } - if (total == -1) - ret = status_; - else - { - std::lock_guard lock(io_lock_); - - std::shared_ptr buf(aquire_memory(total)); - if (!buf.get()) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - - // write reading command - - ret = write_register(setting3399::SR_IM_TX, 1); - - buf->set_image_statu(statu); - - if (ret == SCANNER_ERR_OK) - { - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - r = total; - { - - unsigned int size = r; - void* buff = buf->data(off, &size); - int block = 0; - if (!buff) - { - utils::to_log(LOG_LEVEL_FATAL, "memory(0x%08x + %u) fatal when read USB image %d !!!\n", off, r, usb_img_index_); - ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - } - else - { - r = size; - while (r > 0) - { - block = 512 * 1024; - - if (r < block) - block = r; - - unsigned int size = block; - void* buff = buf->data(off, &size); - if (!buf) - { - //utils::to_log(LOG_LEVEL_FATAL, "memory(0x%08x + %u) fatal when read USB image %d !!!\n", index, block, usb_img_index_); - ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - break; - } - block = size; - ret = io_->read_bulk(buff, &block); //可能会出现TIME_OUT 然后只能退出去,下一次再来取 - - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_FATAL, "read_one_image_from_usb read_data:%s!!! read data[%d/:%d]\n", hg_scanner_err_name(ret, errbuf),size, block); - break; - } - - off += block; - r -= block; - } - } - } - if (r > 0) - { - utils::to_log(LOG_LEVEL_FATAL, "read_one_image_from_usb 'total' is %d, 'left' total len is:%d!!!\n", total, r); - } - - if (ret == SCANNER_ERR_OK) - { - ret = save_usb_data(buf); - if (ret == SCANNER_ERR_OK) - { - is_scanner_err_ok = true; - } - } - else - { - utils::to_log(LOG_LEVEL_FATAL, "Read image data from USB err: %s\n", hg_scanner_err_name(ret, errbuf)); - } - } - } - if (is_scanner_err_ok) - { - pop_first_image(); - } - return ret; -} -int hg_scanner_239::discard_all_images(void) -{ - int block = 1024 * 512, - oto = 0, pre_img = 0, - pre_int = 0, - ret = SCANNER_ERR_OK; - string str; - str.resize(block); - { - char buf[64]; - int size = sizeof(buf), to = io_->set_timeout(50); - ret = SCANNER_ERR_OK; - setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; - { - std::lock_guard lock(io_lock_); - ret = io_->read_interrupt(buf, &size); - } - while (ret == SCANNER_ERR_OK && size) - { - pre_int++; - if (info->From == setting3399::IMG) - { - while (get_image_count() > 0) - { - pop_first_image(); - pre_img++; - } - } - - size = sizeof(buf); - { - std::lock_guard lock(io_lock_); - ret = io_->read_interrupt(buf, &size); - } - } - io_->set_timeout(to); - } - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - - if (pre_int) - utils::to_log(LOG_LEVEL_DEBUG, "prev-connection has left %d interrupt packet(s) && %d image(s).\n", pre_int, pre_img); - return 0; -} -int hg_scanner_239::get_roller_life(void) -{ - return 450000; -} -int hg_scanner_239::on_color_mode_changed(int& color_mode) -{ - - dev_conf_.params_3399.color = (color_mode == COLOR_MODE_BLACK_WHITE || color_mode == COLOR_MODE_256_GRAY) ? 0 : 1; - - return SCANNER_ERR_OK; - - /*int ret = SCANNER_ERR_OK; - - if ((((color_mode == COLOR_MODE_24_BITS || color_mode == COLOR_MODE_AUTO_MATCH) && !dev_conf_.params_3399.color) || - ((color_mode != COLOR_MODE_24_BITS && color_mode != COLOR_MODE_AUTO_MATCH) && dev_conf_.params_3399.color)) && color_mode != -1) - { - dev_conf_.params_3399.color ^= 1; - ret = writedown_device_configuration(); - if(ret) - dev_conf_.params_3399.color ^= 1; - } - if(color_mode == COLOR_MODE_AUTO_MATCH) - { - dev_conf_.params_3399.color = 1; - } - return ret;*/ -} -int hg_scanner_239::on_paper_changed(int& paper) -{ - bool exact = true; - int ind = hgpaper_to_devspaper(paper_map_3399, ARRAY_SIZE(paper_map_3399),paper, &exact, &paper_size_), - ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT; - - if (dev_conf_.params_3399.paper != paper_map_3399[ind].dev_value) - { - int old = dev_conf_.params_3399.paper; - - dev_conf_.params_3399.paper = paper_map_3399[ind].dev_value; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.paper = old; - for (int i = 0; i < ARRAY_SIZE(paper_map_3399); ++i) - { - if (paper_map_3399[i].dev_value == old) - { - paper = paper_map_3399[i].paper; - break; - } - } - } - else if (!exact) - ret = SCANNER_ERR_NOT_EXACT; - } - return ret; -} -int hg_scanner_239::on_paper_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.enable_sizecheck ^ check) - { - dev_conf_.params_3399.enable_sizecheck = check; - size_check = check; - ret = writedown_device_configuration(); - - if (ret) - { - dev_conf_.params_3399.enable_sizecheck = !check; - check = dev_conf_.params_3399.enable_sizecheck; - } - } - return ret; -} -int hg_scanner_239::on_resolution_changed(int& dpi) -{ - if (!firmware_sup_dpi_600) - dev_conf_.params_3399.dpi = 1; - else - dev_conf_.params_3399.dpi = dpi >= 500 ? 3 : (dpi < 500 && dpi> 299) ? 2 : 1; - - //dev_conf_.params_3399.dpi = 1; //dpi 华凌cis和敦南cis 默认?无需改变 - int ret = writedown_device_configuration(); - return ret; -} -int hg_scanner_239::on_ultrasonic_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.ultrasonic_enable ^ check) - { - dev_conf_.params_3399.ultrasonic_enable = check; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.ultrasonic_enable = !check; - check = dev_conf_.params_3399.ultrasonic_enable; - } - } - - return ret; -} -int hg_scanner_239::on_staple_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.staple_enbale ^ check) - { - dev_conf_.params_3399.staple_enbale = check; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.staple_enbale = !check; - check = dev_conf_.params_3399.staple_enbale; - } - } - - return ret; -} -int hg_scanner_239::on_skew_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.screw_detect_enable ^ check) - { - dev_conf_.params_3399.screw_detect_enable = check; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.screw_detect_enable = !check; - check = dev_conf_.params_3399.screw_detect_enable; - } - } - - return ret; -} -int hg_scanner_239::on_skew_check_level_changed(int& check) -{ - int ret = SCANNER_ERR_OK, - val = check - 1,//上面设置的是1 - 5 ,接受范围值为0 - 4,默? - old = dev_conf_.params_3399.screw_detect_level; - setting_hardware::HGSCANCONF_3399 cf; - - if (val < 0 && val>5) - { - check = 3; - ret = SCANNER_ERR_NOT_EXACT; - } - if (val != dev_conf_.params_3399.screw_detect_level) - { - dev_conf_.params_3399.screw_detect_level = val; - ret = writedown_device_configuration(); - if (ret) - { - check = dev_conf_.params_3399.screw_detect_level = old; - check += 1; - } - - } - - - /*cf.params_3399.screw_detect_level = -1; - - if (val < 0) - { - val = 0; - ret = SCANNER_ERR_NOT_EXACT; - } - else if (val > cf.params_3399.screw_detect_level) - { - val = cf.params_3399.screw_detect_level; - ret = SCANNER_ERR_NOT_EXACT; - } - if (val != dev_conf_.params_3399.screw_detect_level) - { - dev_conf_.params_3399.screw_detect_level = val; - ret = writedown_device_configuration(); - if (ret) - check = dev_conf_.params_3399.screw_detect_level = old; - } - if (ret == SCANNER_ERR_OK && val != check) - { - check = val; - ret = SCANNER_ERR_NOT_EXACT; - }*/ - - return ret; -} -int hg_scanner_239::on_get_feedmode(int &feedmode)//获取分纸强度 -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK, - val = 0; - - ret = read_register(setting3399::SR_GET_FEEDMODE,&feedmode); - - if (ret == SCANNER_ERR_OK) - { - save_feedmode_type_ = true; - } - return ret; -} -int hg_scanner_239::on_set_feedmode(int feedmode)//设置分纸强度 -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK, - val = 0; - - ret = write_register(setting3399::SR_SET_FEEDMODE,feedmode); - - return ret; -} -int hg_scanner_239::on_pic_type(bool& pic) -{ - dev_conf_.params_3399.is_textcorrect = pic; - - int ret = writedown_device_configuration(); - return ret; -} -int hg_scanner_239::on_pick_paper(bool autostrength) -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = write_register(setting3399::SR_SET_AUTOMATICCONTROLFEEDMODE_ENABLE, autostrength); - if (ret != SCANNER_ERR_OK) - return ret; - - ret = read_register(setting3399::SR_GET_AUTOMATICCONTROLFEEDMODE_ENABLE,&val); - - return ret; -} -int hg_scanner_239::on_pick_paper_threshold(double threshold) -{ - float f = threshold; - //threshold *= 10; - int val = *(int*)&f; - int ret = write_register(setting3399::SR_SET_AUTOMATICCONTROLFEEDMODE_THRESHOLD, val); - if (ret != SCANNER_ERR_OK) - return ret; - - ret = read_register(setting3399::SR_GET_AUTOMATICCONTROLFEEDMODE_THRESHOLD,&val); - float v = *(float*)&val; - return ret; -} -int hg_scanner_239::on_is_auto_paper(bool isautopaper) -{ - int val = 0, - ret = SCANNER_ERR_OK; - dev_conf_.params_3399.is_autopaper = isautopaper; - - return ret; -} -int hg_scanner_239::on_cis_get_image(bool isautopaper) -{ - is_cis_image = isautopaper; - dev_conf_.params_3399.pc_correct = isautopaper; - - return SCANNER_ERR_OK; -} -void hg_scanner_239::on_device_reconnected(void) -{ - int ret = writedown_device_configuration(); - init_version(); - - rewrite_conf_ = ret != SCANNER_ERR_OK; - if (reset_) - { - reset_ = false; - start(); - } -} -int hg_scanner_239::on_scanner_closing(bool force) -{ - return SCANNER_ERR_OK; -} -void hg_scanner_239::thread_correction(void) -{ - StopWatch sw; - char buf[64]; - setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; - int size = sizeof(buf), - ret = SCANNER_ERR_OK; - char errbuf[40] = { 0 }; - - while (run_) - { - size = sizeof(buf); - { - std::lock_guard lock(io_lock_); - - ret = io_->read_interrupt(buf, &size); - io_->set_timeout(1000); - printf("size:%d\r\n",size); - } - if (ret == SCANNER_ERR_TIMEOUT) - { - if (sw.elapsed_s() > 10) - { - is_auto_falt = false; - status_ = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; - //notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_FAIL_OUTTIME), SANE_EVENT_ERROR, ret); // 通信超时 - utils::to_log(LOG_LEVEL_DEBUG, "设备校正超时 '%s'\n", hg_scanner_err_name(status_, errbuf)); - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - continue; - } - if (size == sizeof(buf)) - { - if (setting3399::AutoCorrect ==info->From) - { - std::lock_guard lock(io_lock_); - status_ == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - sw.reset(); - std::string sinfo; - int len = info->Img_Index; - sinfo.resize(len); - - io_->read_bulk(&sinfo[0],&len); - char buf[2048]; - strcpy(buf, sinfo.c_str()); - notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); - printf("%s\r\n", sinfo.c_str()); - - if (info->Code == 4) - { - is_auto_falt = false; - status_ = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; - //notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); - break; - } - //break; - } - } - - this_thread::sleep_for(chrono::milliseconds(10)); - } -} -int hg_scanner_239::read_control_device_files(std::string file_path, std::string& file_str) -{ - std::lock_guard lock(io_lock_); - - string path = file_path; - if (path.empty()) - { - utils::to_log(LOG_LEVEL_DEBUG, "read_control_device_files is fail path is %s\n", path.empty() ? "NULL" : path.c_str()); - return SCANNER_ERR_NO_DATA; - } - - int ret = SCANNER_ERR_OK, - len = path.size(), - lenstr = file_str.size(), - get_buffer_size = 0; - - io_->set_timeout(3000); - - ret = write_register(setting3399::SR_SET_JSON_PATH, len); - if (ret == SCANNER_ERR_OK) - { - ret = io_->write_bulk(&path[0], &len); - } - - if (ret == SCANNER_ERR_OK) - { - ret = read_register(setting3399::SR_GET_JSON_SIZE, &get_buffer_size); - } - - if (ret == SCANNER_ERR_OK) - { - ret = write_register(setting3399::SR_GET_JSON, get_buffer_size); - } - - if (ret == SCANNER_ERR_OK) - { - file_str.resize(get_buffer_size); - ret = io_->read_bulk(&file_str[0], &get_buffer_size); - if (file_str.empty()) - { - utils::to_log(LOG_LEVEL_DEBUG, "read_control_device_files get buffer is NULL %d\n", get_buffer_size); - return SCANNER_ERR_NO_DATA; - } - } - return ret; -} -int hg_scanner_239::write_control_device_files(std::string file_path, std::string file_str) -{ - std::lock_guard lock(io_lock_); - - string path = file_path; - string str = file_str; - if (path.empty() || str.empty()) - { - utils::to_log(LOG_LEVEL_DEBUG," write_control_device_files is fail path is %s str is %s\n", path.empty() ? "NULL" : path.c_str(), str.empty() ? "NULL":str.c_str()); - return SCANNER_ERR_INVALID_PARAMETER; - } - - int ret = SCANNER_ERR_OK; - int len = path.size(), - lenstr = str.size(); - - io_->set_timeout(2000); - ret = write_register(setting3399::SR_SET_JSON_PATH, len); - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_DEBUG,"write_control_device_files write_register [SR_SET_JSON_PATH] is fail \n"); - return ret; - } - ret = io_->write_bulk(&path[0], &len); - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_DEBUG, "write_control_device_files write_bulk path is fail \n"); - return ret; - } - ret = write_register(setting3399::SR_SET_JSON, lenstr); - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_DEBUG, "write_control_device_files write_register [SR_SET_JSON] is fail \n"); - return ret; - } - ret = io_->write_bulk(&str[0], &lenstr); - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_DEBUG, "write_control_device_files write_bulk str is fail \n"); - return ret; - } - //VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "log path:%s ret:%s buffersize: %d\n", logpath.c_str(), hg_scanner_err_name(ret, errbuf), buffersize); - //return ret; - return SCANNER_ERR_OK; -} -void hg_scanner_239::thread_get_dves_image(void) -{ - char buf[64]; - setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; - int size = sizeof(buf), - ret = SCANNER_ERR_OK, - count = 0; - int auoto_paper_indx = 0; - char errbuf[40] = { 0 }; - - svdevs_err_.clear(); - StopWatch sw; - while (run_)//&& !user_cancel_ - { - size = sizeof(buf); - { - std::lock_guard lock(io_lock_); - - memset(buf, 0, size); - ret = io_->read_interrupt(buf, &size); - io_->set_timeout(1000); - } - - if (ret == SCANNER_ERR_TIMEOUT) - { - std::this_thread::sleep_for(std::chrono::milliseconds(400)); - if (sw.elapsed_s() > 60 && !is_auto_paper_scan) - { - status_ = ret; - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_GET_IMAGE_OUTTIME), SANE_EVENT_ERROR, ret); // 取图通信超时 - utils::to_log(LOG_LEVEL_DEBUG, "get image time out:%s\n", hg_scanner_err_name(status_, errbuf)); - break; - } - - if (is_auto_paper_scan && sw.elapsed_s() >= is_auto_paper_scan_exit_time && is_auto_paper_scan_exit_time != 0) - { - do_stop(); - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_EXIT_WAIT_SCAN), SANE_EVENT_ERROR, status_); - utils::to_log(LOG_LEVEL_DEBUG, "auto paper scan exit :%s\n", from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_EXIT_WAIT_SCAN)); - } - - if ((get_status() & 0x03) == 0) - { - status_ = SCANNER_ERR_OK; - //break; - } - - if (user_cancel_ && is_auto_paper_scan) //其他直接跳过当此循坏 - { - size = sizeof(buf); - memset(buf, 0, size); - info->From = setting3399::STOPSCAN; - utils::log_info("User cancelled (checked when read INT timeout), we faked a 'STOP' messag to enter exiting process ...\n", LOG_LEVEL_DEBUG); - } - else - continue; - - } - else if (ret != SCANNER_ERR_OK) - { - status_ = ret; - break; - } - sw.reset(); - - if (size == sizeof(buf)) - { - status_ = settings::device_status_to_hg_err(info); - if (status_) - { - utils::to_log(LOG_LEVEL_DEBUG, "status from interrupt point is '%s'\n", hg_scanner_err_description(status_)); - } - if (status_ != SCANNER_ERR_OK - && status_ != SCANNER_ERR_TIMEOUT - && status_ != SCANNER_ERR_DEVICE_STOPPED - && status_ != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER - && status_ != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO - ) - { - if (!is_dev_image_process_done() || (double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG)) - { - int st = status_, count = 0, statu = last_usb_image_statu(st); - while (!is_dev_image_process_done()) - std::this_thread::sleep_for(std::chrono::milliseconds(30)); - - StopWatch delay; - if ((double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG) && st == SCANNER_ERR_DEVICE_DOUBLE_FEEDING) - { - int wait = 3000 + (img_conf_.resolution_dst / 200 * 10000); - while (get_image_count() == 0) - { - std::this_thread::sleep_for(std::chrono::milliseconds(30)); - if (delay.elapsed_ms() > wait) - break; - } - } -////239 暂时先关闭双张存图弹窗提示,待到固件更新再确认是否需要弹? - //while ((count = get_image_count()) > 0) - //{ - // int s = IMG_STATUS_OK; - // if (count <= 2) - // { - // if (image_prc_param_.bits.page == PAGE_SINGLE) - // s = count == 1 ? statu : s; - // else - // s = statu; - // } - // ret = read_one_image_from_usb((SANE_Image_Statu)s); - // count++; - // if (ret != SCANNER_ERR_OK - // && ret != SCANNER_ERR_CREATE_FILE_FAILED - // && ret != SCANNER_ERR_WRITE_FILE_FAILED) - // break; - //} - //status_ = st; - //break; - } - svdevs_err_.push_back(status_); - //break; - //这个时候退出的话消息就还没读完,错误信息先保存下来,只有获取到stop时才退出,如果没获取完退出,可能会导致第二次扫描直接返回扫描完成 - } - - if (info->From == setting3399::IMG) - { - int s = get_status(); - // if (s > 0 && s < 4) // running ... - { - while (get_image_count() > 0) - { - - ret = read_one_image_from_usb(); - count++; - if (ret != SCANNER_ERR_OK - && ret != SCANNER_ERR_CREATE_FILE_FAILED - && ret != SCANNER_ERR_WRITE_FILE_FAILED) - break; - } - } - //else - // utils::to_log(LOG_LEVEL_DEBUG, "status(0x%x) is not accept in usb thread\n", status); - } - else if (info->From == setting3399::STOPSCAN)//固件版本:3B0326获取无纸时,下面中断信息会先发无纸在停止扫描,然后在发无纸 - { //此时int端点还要信息没有读取完,而且退出点击继续扫描,下面设备还未结束扫描 - if (!svdevs_err_.empty()) - { - status_ = svdevs_err_.front(); - } - utils::log_info("received 'STOPSCAN' message in usb thread, check remaining image and finish scanning ...\n", LOG_LEVEL_DEBUG); - - // fetch all buffered images and exit ... - //while(!is_dev_image_process_done()) - if (img_conf_.resolution_dst > 200 && is_quality_ == IMG_QUALITY) //删除这段代码,你可能需要考虑一下后? - std::this_thread::sleep_for(std::chrono::milliseconds(5000)); - else - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - - int rest = 0; - while (get_image_count() > 0) - { - ret = read_one_image_from_usb(); - rest++; - if (ret != SCANNER_ERR_OK - && ret != SCANNER_ERR_CREATE_FILE_FAILED - && ret != SCANNER_ERR_WRITE_FILE_FAILED) - break; - } - count += rest; - if (rest) - { - utils::to_log(LOG_LEVEL_DEBUG, "STOPSCAN message is ahead of %d image(s)!\n", rest); - } - - if (user_cancel_ && !is_auto_paper_scan) - { - if (status_ && status_ != SCANNER_ERR_DEVICE_STOPPED) // thread_handle_image_process maybe call stop() when insufficient memory occurs . - ret = status_; - else - status_ = ret = SCANNER_ERR_USER_CANCELED; - - utils::to_log(LOG_LEVEL_DEBUG, "%s\n", from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_GET_USER_CANCEL_SCAN, nullptr)); - auoto_paper_indx = 0; - break; - } - if (count == 0) - { - //std::lock_guard lock(io_lock_); - - //utils::log_info(LOG_LEVEL_DEBUG, "First message received from USB is 'STOPSCAN'\n"); - // notify_ui_working_status(STATU_DESC_DEVICE_RESET); - // reset_ = true; - // ret = io_->reset(); - // status_ = SCANNER_ERR_IO; - } - else if (status_ == SCANNER_ERR_TIMEOUT || status_ == SCANNER_ERR_IO || status_ == SCANNER_ERR_DEVICE_STOPPED) - status_ = SCANNER_ERR_OK; - - int s = get_status(); - - if (count == 0 || (s & 3) == 0) - { - utils::log_info("Really stopped ^_^\n", LOG_LEVEL_DEBUG); - - string str = from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_ROUND_SACN_OVER, nullptr); - str += ":" + to_string(++auoto_paper_indx); - - if (!user_cancel_ && is_auto_paper_scan && svdevs_err_.empty()) - notify_ui_working_status(str.c_str(), SANE_EVENT_ERROR, status_); - else - break; - } - } - else if (info->From == setting3399::V4L2) - { - utils::to_log(LOG_LEVEL_WARNING, "V4L2 message received, code = %d, index = %d\n", info->Code, info->Img_Index); - // stop(); - break; - } - else if (info->From == setting3399::AutoCorrect) - { - std::string devs_info; - int len = info->Img_Index; - devs_info.resize(len); - ret = io_->read_bulk(&info[0], &len); - if (ret == SCANNER_ERR_OK) - { - notify_ui_working_status(devs_info.c_str(), SANE_EVENT_STATUS, status_); - } - if (status_ == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) - break; - } - else - { - // error handling ... - utils::to_log(LOG_LEVEL_DEBUG, "Read HGEIntInfo: From = %d, Code = %d, Img_Index = %d, status = %s\n", info->From, info->Code, info->Img_Index, hg_scanner_err_description(status_)); - } - } - this_thread::sleep_for(chrono::milliseconds(10)); - } - - // stop 通过int端点返回 如果不反回则是固件问题,软件不做处理 - utils::to_log(LOG_LEVEL_DEBUG, "USB thread exit with code: %s, status = %s\n", hg_scanner_err_name(ret, errbuf), hg_scanner_err_description(status_)); -} -void hg_scanner_239::thread_handle_usb_read(void) -{ - if (is_auto_falt) - thread_correction(); - else - thread_get_dves_image(); -} - -int hg_scanner_239::do_start(void) -{ - bool handled = false; - int ret = try_third_app_handle_start(handled), - val = 0; - char errbuf[40] = { 0 }; - - // for third-sane-app invoking, added on 2022-05-19 - if (handled) - return ret; - - - user_cancel_ = false; - - split3399_ = 0; - - cb_mem_ = true; - utils::to_log(LOG_LEVEL_DEBUG, "scanner status: 0x%x\n", get_status()); - - reset(); - - //211220固件版本不支持返? - ret = get_scan_is_sleep(val); - if (!val && ret == SCANNER_ERR_OK) - { - status_ = SCANNER_ERR_DEVICE_SLEEPING; - utils::to_log(LOG_LEVEL_WARNING, "device start status is(%s)\n", from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_SLEEPING, nullptr)); - - set_notify_sleep(); - - return status_; - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - bool type = true; - ret = get_scan_mode(type); - if (!type && ret == SCANNER_ERR_OK) - { - status_ = SCANNER_ERR_DEVICE_COUNT_MODE; - return status_; - } - - if(ret == SCANNER_ERR_OK) - { - ret = writedown_device_configuration(true); - } - if(ret == SCANNER_ERR_OK) - { - ret = writedown_image_configuration(); - } - - if (ret) - { - utils::to_log(LOG_LEVEL_WARNING, "Write down image process parameters fail is(%s), the result will be unpredictable.\n", hg_scanner_err_name(ret, errbuf)); - } - - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_WARNING, "start status01 is(%s), the result will be unpredictable.\n", hg_scanner_err_name(ret, errbuf)); - return ret; - } - -#ifdef OEM_HUAGAO - if (is_checksum_strat_scan) - { - std::string str("C34E58CD5F3F2FF703E1AA24892FBD69"); - set_scan_lock_check_val(str); - } -#endif - - ret = write_command(setting3399::SC_START); - - io_->set_timeout(1000); - if (ret == SCANNER_ERR_OK) - { - wait_usb_.notify(); - this_thread::sleep_for(chrono::milliseconds(100)); - ret = try_third_app_after_start(ret); - } - else - { - status_ = ret; - utils::to_log(LOG_LEVEL_WARNING, "(Thread 0x%x)Send start command = %s\n", GetCurrentProcessId(), hg_scanner_err_name(ret, errbuf)); - } - utils::to_log(LOG_LEVEL_WARNING, "----------Main start scan status : %s----------\n", hg_scanner_err_description(ret)); - - return ret; -} -int hg_scanner_239::do_stop(void) -{ - int ret = SCANNER_ERR_OK; - - ret = write_command(setting3399::SC_STOP); - io_->set_timeout(500); - - return ret; -} -int hg_scanner_239::reset(void) -{ - imgs_.Clear(); // move from scanning done - final_imgs_.clear(); - discard_all_images(); - - return status_; -} -int hg_scanner_239::device_io_control(unsigned long code, void* data, unsigned* len) -{ - int ret = SCANNER_ERR_OUT_OF_RANGE; - - if (IO_CTRL_CODE_TEST_SINGLE == code) - { - test_1_paper_ = true; - ret = start(); - } - else - ret = hg_scanner::device_io_control(code, data, len); - - return ret; -} -std::string hg_scanner_239::get_firmware_version(void) -{ - std::lock_guard lock(io_lock_); - return control_fetch(setting3399::SR_GET_FWVERSION, 0, 20); -} -std::string hg_scanner_239::get_serial_num(void) -{ - std::lock_guard lock(io_lock_); - int len = 0; - read_register(setting3399::SR_GET_SERIAL_LEN, &len);///??? - if (len > 30) - { - len = 30; - } - return control_fetch(setting3399::SR_GET_SERIALNUM, 0, len).substr(0,len); -} -std::string hg_scanner_239::get_ip(void) -{ - std::lock_guard lock(io_lock_); - int len = 20; - //read_register(setting3399::SR_GET_SERIAL_LEN, &len); - return control_fetch(setting3399::SR_GET_IPADDR, 0, len); -} -std::string hg_scanner_239::get_device_model(void) -{ - string device_model = "/home/linaro/microtek_sn"; - string str; - - int ret = SCANNER_ERR_OK; - int buffersize = 0; - int len = device_model.size(); - - read_control_device_files(device_model, str); - - return str; -} -int hg_scanner_239::set_device_model(string str) -{ - if (str.empty()) - { - return SCANNER_ERR_NO_DATA; - } - - string device_model = "/home/linaro/microtek_sn"; - - return write_control_device_files(device_model, str); -} -int hg_scanner_239::set_serial_num(string str) -{ - std::lock_guard lock(io_lock_); - int len = str.size(), - ret = write_register(setting3399::SR_SET_SERIALNUM, len); - if (ret == SCANNER_ERR_OK) - { - ret = io_->write_bulk(&str[0],&len); - } - return ret; -} -int hg_scanner_239::set_vid_pid(int data) -{ - std::lock_guard lock(io_lock_); - return write_register(setting3399::SR_SET_USBVIDPID, data); -} -int hg_scanner_239::get_vid_pid(int& data) -{ - std::lock_guard lock(io_lock_); - return read_register(setting3399::SR_GET_USBVIDPID, &data); -} -int hg_scanner_239::get_history_scan_count(int &val) -{ - std::lock_guard lock(io_lock_); - int ret = read_register(setting3399::SR_GET_SCANN_NUM, &val); - return ret; -} -int hg_scanner_239::set_clear_roller_num(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_CLR_ROLLER_NUM, &val); - - return ret; -} -int hg_scanner_239::set_clear_history_num(void) -{ - int ret = SCANNER_ERR_OK; - - if (pid_ == 0x439) - { - string json_path = "/usr/local/huago/scannerinfo.json"; - string str; - int buffersize = 0; - int len = json_path.size(); - ret = read_control_device_files(json_path, str); - - std::string str2; - gb_json* jsn = new gb_json(); - - jsn->attach_text(&str[0]); - if (jsn->get_value("TotalScanned", len)) - { - jsn->set_value("TotalScanned", 0); - str2 = jsn->to_string(); - } - jsn->release(); - - if (ret == SCANNER_ERR_OK) - { - ret = write_control_device_files(json_path, str2); - } - } - else - { - std::lock_guard lock(io_lock_); - int val = 0; - ret = read_register(setting3399::SR_CLR_SCANN_NUM, &val); - } - - return ret; -} -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int hg_scanner_239::set_leaflet_scan(void) -{ - //std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK; - test_1_paper_ = true; - - ret = start(); - return ret; -} - -int hg_scanner_239::get_device_code(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_239::get_sleep_time(int& data) -{ - std::lock_guard lock(io_lock_); - int val = 0; - int ret = read_register(setting3399::SR_GET_SLEEPTIME, &val); - char errbuf[40] = { 0 }; - - if (ret == SCANNER_ERR_OK) - { - save_sleeptime_type_ = true; - data = val; - } - - utils::to_log(LOG_LEVEL_DEBUG, "get_sleep_time = %d with %s\n", data,hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner_239::set_sleep_time(int setsleepime) -{ - std::lock_guard lock(io_lock_); - char errbuf[40] = { 0 }; - - int ret = write_register(setting3399::SR_SET_SLEEPTIME, setsleepime); - - utils::to_log(LOG_LEVEL_DEBUG, "set sleep time to %d = %s\n", setsleepime, hg_scanner_err_name(ret, errbuf)); - - return ret; -} - - -int hg_scanner_239::get_scanner_paperon(SANE_Bool& type) -{ - std::lock_guard lock(io_lock_); - - int val = 0; - int ret = read_register(setting3399::SR_GET_PAPERON, &val); //0无纸 1有纸 - if (ret == SCANNER_ERR_OK) - { - type = val == 0 ? false : true; - } - utils::to_log(LOG_LEVEL_WARNING, "get_scanner_paperon is(%s)\n", !type ? hg_scanner_err_description(SCANNER_ERR_DEVICE_NO_PAPER) : hg_scanner_err_description(SCANNER_ERR_OK)); - - return ret; -} - -int hg_scanner_239::get_scan_is_sleep(SANE_Bool& type) -{ - std::lock_guard lock(io_lock_); - - int ret = 0,val; - ret = read_register(setting3399::SR_GET_SLEEP_STAUTUS, &val); //0休眠 1唤醒状�? - if (ret == SCANNER_ERR_OK) - { - type = val == 1 ? true : false; - } - utils::to_log(LOG_LEVEL_WARNING, "get_scanner_paperon is(%s)\n", !type ? hg_scanner_err_description(SCANNER_ERR_DEVICE_SLEEPING) : hg_scanner_err_description(SCANNER_ERR_OK)); - - return ret; -} -int hg_scanner_239::set_notify_sleep() -{ - if (!firmware_sup_wake_device_) - { - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - std::lock_guard lock(io_lock_); - - int val = 0; - return write_register(setting3399::SR_NOTIFY_SLEEP, val); -} -int hg_scanner_239::get_roller_num(int &num) -{ - std::lock_guard lock(io_lock_); - - int ret = read_register(setting3399::SR_GET_ROLLER_NUM, &num); - return ret; -} -int hg_scanner_239::get_device_log(string &logpath) -{ - char errbuf[40] = { 0 }; - - if (!firmware_sup_log_export_) - { - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - std::lock_guard lock(io_lock_); - - string save_path = utils::temporary_path() + PATH_SEPARATOR + "device.log"; - string device_log_path = "/var/log/syslog"; - string str ; - - int ret = SCANNER_ERR_OK; - int buffersize = 0; - int len = device_log_path.size(); - - io_->set_timeout(3000); - ret = write_register(setting3399::SR_SET_JSON_PATH, len); - if (ret != SCANNER_ERR_OK) - return ret; - - ret = io_->write_bulk(&device_log_path[0],&len); - if (ret != SCANNER_ERR_OK) - return ret; - - ret = read_register(setting3399::SR_GET_JSON_SIZE,&buffersize); - if (ret != SCANNER_ERR_OK || buffersize <= 0) - return ret; - - ret = write_register(setting3399::SR_GET_JSON,buffersize); - if (ret != SCANNER_ERR_OK || buffersize <= 0) - return ret; - - str.resize(buffersize); - int block = buffersize, - total = buffersize, - index = 0; - - while (total > 0) - { - block = 512 * 1024; - if (total< block) - { - block = total; - } - ret = io_->read_bulk(&str[index], &block); - if (ret != SCANNER_ERR_OK) - return ret; - - index += block; - total -= block; - } - - if (ret != SCANNER_ERR_OK) - return ret; - - std::ofstream f; - f.open(save_path,ios::out | ios::trunc); - if (!f.is_open()) - return SCANNER_ERR_CREATE_FILE_FAILED; - - f << str << endl; - f.close(); - logpath = save_path; - utils::to_log(LOG_LEVEL_DEBUG, "log path:%s ret:%s buffersize: %d\n", logpath.c_str(),hg_scanner_err_name(ret, errbuf),buffersize); - return ret; -} -int hg_scanner_239::set_devreboot(int data) -{ - std::lock_guard lock(io_lock_); - - return write_register(setting3399::SR_REBOOT, data); -} -int hg_scanner_239::set_devshtudown() -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = write_register(setting3399::SR_POWEROFF, val); - - if (ret != SCANNER_ERR_OK) - return ret; -} -int hg_scanner_239::set_scan_islock(SANE_Bool set_islock) -{ - std::lock_guard lock(io_lock_); - - if (!firmware_sup_devs_lock_) - { - utils::to_log(LOG_LEVEL_DEBUG, "devs lock:%s \n", hg_scanner_err_description(SCANNER_ERR_DEVICE_NOT_SUPPORT)); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - - if (set_islock != 0 && set_islock != 1) - { - utils::to_log(LOG_LEVEL_DEBUG, "devs lock:%s \n", hg_scanner_err_description(SCANNER_ERR_INVALID_PARAMETER)); - return SCANNER_ERR_INVALID_PARAMETER; - } - - int val = 0, - ret = write_register(setting3399::SR_SET_LOCK_STATES, set_islock); - utils::to_log(LOG_LEVEL_DEBUG, "Set scanner is lock:%d\r\n", set_islock); - - return ret; -} -int hg_scanner_239::get_scan_islock(SANE_Bool& islock) -{ - std::lock_guard lock(io_lock_); - - if (!firmware_sup_devs_lock_) - { - utils::to_log(LOG_LEVEL_DEBUG, "devs lock:%s \n", hg_scanner_err_description(SCANNER_ERR_DEVICE_NOT_SUPPORT)); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - - int val = 0, - ret = read_register(setting3399::SR_GET_LOCK_STATES, &val); - - if (ret != SCANNER_ERR_OK) - return ret; - - islock = val; - ret = islock ? SCANNER_ERR_DEVICE_ISLOCK : SCANNER_ERR_OK; - - utils::to_log(LOG_LEVEL_DEBUG, "Get scanner is lock:%d\r\n", ret); - return ret; -} -int hg_scanner_239::set_scan_lock_check_val(string check_str) -{ - if (!firmware_sup_devs_lock_) - { - utils::to_log(LOG_LEVEL_DEBUG, "devs lock:%s \n", hg_scanner_err_description(SCANNER_ERR_DEVICE_NOT_SUPPORT)); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - -#if defined(WIN32) || defined(_WIN64) - std::string encoded; - std::string cipher; - std::string keys = check_str; - //string sn = "G2396021071101"; - string sn = get_serial_num(); - if (sn.empty()) - { - return SCANNER_ERR_INVALID_PARAMETER; - } - int num = 32 - keys.size(); //保持32位下? - if (num > 0) - { - std::string str(num, '0'); - keys += str; - } - else - keys = keys.substr(0, 32); - - unsigned char key[CryptoPP::AES::DEFAULT_KEYLENGTH] = { 0 }; - for (int i = 0; i < 16; i++) - { - key[i] = _strtoi64(keys.substr(i * 2, 2).c_str(), nullptr, 16); - } - - CryptoPP::ECB_Mode::Encryption encode; - encode.SetKey(key, 16); - - CryptoPP::StringSink* str_cip = new CryptoPP::StringSink(cipher); - CryptoPP::StreamTransformationFilter* ecb_filter = new CryptoPP::StreamTransformationFilter(encode, str_cip, CryptoPP::BlockPaddingSchemeDef::W3C_PADDING); - CryptoPP::StringSource* source_plain = new CryptoPP::StringSource(sn, true, ecb_filter); - encoded.clear(); - CryptoPP::StringSink* str_encode = new CryptoPP::StringSink(encoded); - CryptoPP::HexEncoder* hex_encode = new CryptoPP::HexEncoder(str_encode); - CryptoPP::StringSource* source_cipher = new CryptoPP::StringSource(cipher, true, hex_encode); - - int len = encoded.length(); - - int ret = SCANNER_ERR_OK; - { - std::lock_guard lock(io_lock_); - ret = write_register(setting3399::SR_DECODE_TOKEN, len); - if (ret == SCANNER_ERR_OK) - { - ret = io_->write_bulk(&encoded[0], &len); - } - } - - SAFE_DELETE(source_plain); - //SAFE_DELETE(ecb_filter); - //SAFE_DELETE(strcip); - //SAFE_DELETE(source_cipher) - //SAFE_DELETE(hex_encode); - SAFE_DELETE(str_encode); - return ret; -#endif -} -int hg_scanner_239::set_firmware_upgrade(std::string filename) -{ - std::lock_guard lock(io_lock_); - - std::ifstream fwname; - int ret = SCANNER_ERR_OK; - - fwname.open(filename, std::ios_base::in | std::ios_base::binary); - if (!fwname.is_open()) - { - return SCANNER_ERR_OPEN_FILE_FAILED; - } - fwname.seekg(0, std::ios::end); - int total = fwname.tellg();//记录总长? - fwname.seekg(0, std::ios::beg); - int pos = fwname.tellg();//记录pos位置 - - ret = write_register(setting3399::SR_UPDATA_START,total); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - int block = total; - while (total > 0) - { - block = 512 * 1024; - - if (total < block) - block = total; - - std::vectordata; - data.resize(block + 1); - fwname.read(data.data(), block); - - io_->write_bulk(data.data(), &block); - if (ret != SCANNER_ERR_OK) - return ret; - - pos += block; - total -= block; - fwname.seekg(pos); - } - this_thread::sleep_for(std::chrono::milliseconds(200)); - - int val = 0; - ret = read_register(setting3399::SR_UPDATA_STAUTUS, &val); - if (ret != SCANNER_ERR_OK) - return ret; - else if (!val) - return SCANNER_ERR_DEVICE_UPGRADE_FAIL; - - int to_cnt = 0; - // 到这个位置已经能够升级成功了 后面对升级结果做下判? - auto now = std::chrono::steady_clock::now(); - while (std::chrono::duration(std::chrono::steady_clock::now() - now).count() < 70) - { - int ret = read_register(setting3399::SR_UPDATA_MD5_RELUST, &val); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - if (val == 2) - { - int ret = read_register(setting3399::SR_UPDATA_REBOOT, &val); - return ret; - } - else if(val ==3) - { - int ret = read_register(setting3399::SR_UPDATA_RECOVERY, &val); - return ret; - } - else if (val == 6) - { - return false; - } - this_thread::sleep_for(std::chrono::milliseconds(20)); - } - return ret; -} -int hg_scanner_239::set_clean_paper_road() -{ - std::lock_guard lock(io_lock_); - - int ret = 0, len = 0; - ret = write_register(setting3399::SR_CLEAN_PAPER_ROAD, len); - return ret; -} -int hg_scanner_239::get_dev_islock_file(int& islockfile) -{ - if (!firmware_sup_devs_lock_) - { - utils::to_log(LOG_LEVEL_DEBUG, "devs lock:%s \n", hg_scanner_err_description(SCANNER_ERR_DEVICE_NOT_SUPPORT)); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - - string device_log_path = "/var/log/black_list_file.txt"; - string str; - int buffersize; - - int ret = read_control_device_files(device_log_path, str); - - if (ret == SCANNER_ERR_OK && str.size() > 0) - islockfile = std::stoi(str); - else - islockfile = -1; - - buffersize = str.length(); - utils::to_log(LOG_LEVEL_DEBUG, "get list file is:%s ret:%s buffersize: %d\n", device_log_path.c_str(), hg_scanner_err_description(ret), buffersize); - return ret; -} -int hg_scanner_239::set_dev_islock_file(int islockfile) -{ - if (!firmware_sup_devs_lock_) - { - utils::to_log(LOG_LEVEL_DEBUG, "devs lock:%s \n", hg_scanner_err_description(SCANNER_ERR_DEVICE_NOT_SUPPORT)); - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - if (islockfile != 0 && islockfile != 1) - { - return SCANNER_ERR_INVALID_PARAMETER; //这个地方设置的参数必须保证正? - } - string device_log_path = "/var/log/black_list_file.txt"; - string str = std::to_string(islockfile); - - return write_control_device_files(device_log_path, str); -} diff --git a/hgdriver/hgdev/hg_scanner_239.h b/hgdriver/hgdev/hg_scanner_239.h deleted file mode 100644 index 2504510..0000000 --- a/hgdriver/hgdev/hg_scanner_239.h +++ /dev/null @@ -1,146 +0,0 @@ -#pragma once - -// hg_scanner is the base class of kinds of scanners -// -// created on 2022-01-30 -// -#include -#include -#include -#include -#include -#include -#include "hg_scanner.h" -//#include - -//#ifdef OEM_HANWANG -//#define hg_scanner_239 hw_scanner_239 -//#elif defined(OEM_LISICHENG) -//#define hg_scanner_239 lsc_scanner_239 -//#endif - -class hg_scanner_239 : public hg_scanner -{ - //BlockingQueue>> final_imgs_; // JPG ... -// image_data final_imgs_; // JPG .. - - setting_hardware::HGSCANCONF_3399 dev_conf_; - bool rewrite_conf_; - bool reset_; - bool is_start_status; - std::list svdevs_err_; - - std::string control_fetch(int addr, int val, int size); - std::string get_fpga(void); - int get_status(void); - int get_image_count(void); - int get_front_data_size(void); - int read_register(int addr, int* val); - int write_register(int addr, int val); - int write_command(int cmd); - int writedown_device_configuration(bool type = false, setting_hardware::HGSCANCONF_3399* dev_conf = NULL);//false 在start再把type置为true,其他做设置时不发 - int writedown_image_configuration(void); - int pop_first_image(void); - int read_one_image_from_usb(SANE_Image_Statu statu = IMG_STATUS_OK); - bool is_dev_image_process_done(void); - bool is_dev_image_keep_last_paper(void); - - void init_version(void); - void thread_get_dves_image(void); - void thread_correction(void); - - int write_control_device_files(std::string file_path,std::string file_str); - int read_control_device_files(std::string file_path, std::string &file_str); -protected: - virtual void on_device_reconnected(void) override; - virtual int on_scanner_closing(bool force) override; - virtual void thread_handle_usb_read(void) override; - - virtual int discard_all_images(void); -protected: - virtual int on_color_mode_changed(int& color_mode) override; //颜色切换 - virtual int on_paper_changed(int& paper) override; //纸张大小设置 - virtual int on_paper_check_changed(bool& check) override; //尺寸检? - virtual int on_resolution_changed(int& dpi) override; //分辨率设? - virtual int on_ultrasonic_check_changed(bool& check) override; //设置超声波检? - virtual int on_staple_check_changed(bool& check) override; //设置订书针检? - virtual int on_skew_check_changed(bool& check) override; //设置歪斜检? - virtual int on_skew_check_level_changed(int& check) override; //设置歪斜检测强? - virtual int on_get_feedmode(int& feedmode) override; //获取分纸强度 - virtual int on_set_feedmode(int feedmode) override; //设置分纸强度 - virtual int on_pic_type(bool& pic)override; //照片模式或者文本模? - virtual int on_pick_paper(bool autostrength)override; //自动分纸强度 - virtual int on_pick_paper_threshold(double threshold)override; - virtual int on_is_auto_paper(bool isautopaper)override; //待纸扫描 - virtual int on_cis_get_image(bool isautopaper) override; //cis 原图获取 - - -public: - hg_scanner_239(const char* dev_name, const char* model, int pid,usb_io* io); - ~hg_scanner_239(); - -public: - //virtual int get_image_info(IMG_PARAM* ii) override; - //virtual int read_image_data(unsigned char* buf, int* len) override; - virtual int do_start(void) override; - virtual int do_stop(void) override; - virtual int reset(void) override; - virtual int device_io_control(unsigned long code, void* data, unsigned* len) override; - virtual int get_roller_life(void) override; - -public: - //////////////固定的硬件信息设置或获取////////////// - virtual std::string get_firmware_version(void)override; - virtual std::string get_serial_num(void)override; - virtual std::string get_ip(void)override; - virtual std::string get_device_model(void); - - virtual int set_device_model(string str); - virtual int set_serial_num(string str) override; //设置序列? - virtual int set_vid_pid(int data) override; //设置vidpid - virtual int get_vid_pid(int& data)override; //获取vidpid - - /////////////////成功返回:SCANNER_ERR_OK ///////////// - /////////////////失败返回:IO错误?or SCANNER_ERR_DEVICE_NOT_SUPPORT ///////////// - virtual int set_leaflet_scan(void) override; //单张扫描 - - virtual int set_clear_roller_num(void) override; //清除滚轴计数 - virtual int set_clear_history_num(void) override; //清除历史张数 - - virtual int get_device_code(void); //获取设备编码 不支? - - virtual int get_scanner_paperon(SANE_Bool& type) override; //获取设备有无纸张 /*/ type : 0无纸 1有纸 */ - - virtual int get_scan_is_sleep(SANE_Bool& type) override; //获取设备是否休眠当中 /*/ type : 0休眠 1唤醒状?/ - virtual int get_sleep_time(int& data) override; //获取功耗模式(休眠? /*/ data > 0*/ - virtual int set_sleep_time(int data) override; //设置功耗模式(休眠? /*/ data > 0*/ - virtual int get_history_scan_count(int& data) override; //获取历史扫描张数 /*/ data > 0*/ - virtual int get_roller_num(int& data) override; //获取滚轮张数 /*/ data > 0*/ - virtual int set_notify_sleep(void) override; //唤醒设备 - virtual int get_device_log(string& log) override; //获取设备日志 /*/ log :储存路径*/ - virtual int set_devreboot(int data) override; //设置设备重启 - virtual int set_devshtudown() override; //设置设备关机 - virtual int set_scan_islock(SANE_Bool type) override; //设置设备是否锁定 /*/ type:0解锁?锁定*/ - virtual int get_scan_islock(SANE_Bool& type) override; //获取设备是否锁定 /*/ type:0解锁?锁定*/ - virtual int set_scan_lock_check_val(string str) override; //获取设备是否锁定 /*/ str:校验?/ - virtual int set_firmware_upgrade(std::string str) override; //固件升级 /*/ str:文件名路?/ - virtual int set_clean_paper_road() override; //清理纸道 - virtual int get_dev_islock_file(int& data) override; //获取设备文件 /*/ data:0 未上锁,1 上锁?1 未发现黑名单列表 -2列表没有信息*/ - virtual int set_dev_islock_file(int data) override; //设置设备文件 /*/ data:0 未上锁,1 上锁*/ - virtual int get_scan_mode(bool& type); //获取是否是计数模? /*/ type : fasle计数模式 true非计?*/ - - virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:100,110,120 - virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:100,110,120 - - virtual int set_devs_distortion_check_val(float data) override; //设置畸变矫正? - virtual int get_devs_distortion_check_val(float &data) override; //获取畸变矫正? - - virtual int set_auto_flat(int data); //设置自动平场校正 - // data:0(ALL) 1(200dpi、gray) 2(200dpi、color) 3(300dpi、gray) 4(300dpi、color) 5(600dpi、gray) 6(600dpi、color) - - virtual int get_motor_board_ver(string &ver); - - virtual int set_devs_time(string times); //设置设备时间 //3399设备支持 - virtual int get_devs_time(string& times); //获取设备时间 //3399设备支持 -}; - diff --git a/hgdriver/hgdev/hg_scanner_300.cpp b/hgdriver/hgdev/hg_scanner_300.cpp deleted file mode 100644 index 6e8df95..0000000 --- a/hgdriver/hgdev/hg_scanner_300.cpp +++ /dev/null @@ -1,1443 +0,0 @@ -#include "hg_scanner_300.h" - -#include "../../sdk/hginclude/utils.h" -#include -#include - -#if defined(WIN32) || defined(_WIN64) -#include "scanner_manager.h" -#endif -//G300 -static std::string jsontext1("{\"global\":{\"device_type\":\"G300\",\"option_count\":64},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout==false\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":40,\"range\":[\"A4\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B5\",\"B6\",\"B6\\u6a2a\\u5411\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"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\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true"); -static std::string jsontext2(",\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"is-size-check\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\\u4e0e\\u8bbe\\u7f6e\\u662f\\u5426\\u5339\\u914d\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"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\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":50,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"size\":50,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":600,\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"size\":200,\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend_or\":[\"resolution>=300\"]},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\""); -static std::string jsontext3(":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_or\":[\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4}}"); - -//G400 -static std::string jsontext4("{\"global\":{\"device_type\":\"G400\",\"option_count\":63},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout==false\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"A4\",\"A4\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"flo"); -static std::string jsontext5("at\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":50,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"default\":\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"size\":200,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":600,\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"size\":200,\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend_or\":[\"resolution>=300\"]},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0."); -static std::string jsontext6("000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_or\":[\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4}}"); - -namespace settingsdsp_300 -{ - scanner_err device_status_to_hg_err(int usbdata) - { - scanner_err code = SCANNER_ERR_NO_DATA; - switch (usbdata) - { - case setting3288dsp::HAVE_IMAGE: - code = SCANNER_ERR_OK; - break; - case setting3288dsp::STOP_SCAN: - code = SCANNER_ERR_DEVICE_STOPPED; - break; - case setting3288dsp::COUNT_MODE: - code = SCANNER_ERR_DEVICE_COUNT_MODE; - break; - case setting3288dsp::NO_FEED: - code = SCANNER_ERR_DEVICE_NO_PAPER; - break; - case setting3288dsp::OPEN_COVER: - code = SCANNER_ERR_DEVICE_COVER_OPENNED; - break; - case setting3288dsp::FEED_IN_ERROR: - code = SCANNER_ERR_DEVICE_FEEDING_PAPER; - break; - case setting3288dsp::PAPER_JAM: - code = SCANNER_ERR_DEVICE_PAPER_JAMMED; - break; - case setting3288dsp::DETECT_DOUBLE_FEED: - code = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; - break; - case setting3288dsp::DETECT_STAPLE: - code = SCANNER_ERR_DEVICE_STAPLE_ON; - break; - case setting3288dsp::PAPER_SKEW: - code = SCANNER_ERR_DEVICE_PAPER_SKEW; - break; - case setting3288dsp::HARDWARE_ERROR: - code = SCANNER_ERR_DEVICE_NOT_SUPPORT; - break; - case setting3288dsp::PC_SCAN_BUSY_or_ERROR: - code = SCANNER_ERR_DEVICE_PC_BUSY; - break; - case setting3288dsp::SIZE_ERROR: - code = SCANNER_ERR_DEVICE_SIZE_CHECK; - break; - case setting3288dsp::AUTO_FLAT_FINISHED: - code = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; - break; - case setting3288dsp::AUTO_FLATTING: - code = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - break; - case setting3288dsp::HAVE_HOLE: - code = SCANNER_ERR_DEVICE_MAYBE_IS_HOLE; - break; - default: - code = SCANNER_ERR_NO_DATA; - break; - } - - return code; - } -} -hg_scanner_300::hg_scanner_300(const char* dev_name, const char* model,int pid, usb_io* io) : - hg_scanner(G100Serial, dev_name, model, io,pid) - ,papersize(pid) - ,is_devs_sleep_(false) - ,pdata(NULL) - ,index_ (0) -{ - dsp_config.value = 0; - dsp_config.params_3288.enableLed = 1; //默认值 - dsp_config.params_3288.isCorrect = 1; - initdevice(); -#ifndef MAPPING_FUNCTION_IN_BASE - init_setting_map(setting_map_, ARRAY_SIZE(setting_map_));//优先初始化 -#endif - if (init_settings(pid_)) - { - if (pid_ == 0x300) - init_settings((jsontext1 + jsontext2 + jsontext3).c_str()); - else - init_settings((jsontext4 + jsontext5 + jsontext6).c_str()); - } - - //wait_read_int.notify(); -} -hg_scanner_300::~hg_scanner_300() -{} -int hg_scanner_300::on_scanner_closing(bool force) -{ - return SCANNER_ERR_OK; -} -void hg_scanner_300::thread_handle_usb_read(void) -{ - int ret = SCANNER_ERR_OK, - status = SCANNER_ERR_OK; - StopWatch sw; - sw.reset(); - SANE_Image_Statu statu = IMG_STATUS_OK; - int img_num = 0; - savestatus_.clear(); - while (run_) - { - USBCB usb={0}; - ret = get_scanner_status(usb); - if (ret && ret != SCANNER_ERR_NO_DATA) - { - utils::to_log(LOG_LEVEL_DEBUG, "status from bulk point is '%s'\n", hg_scanner_err_description(ret)); - } - - //printf("usb.u32_Data = %d ret = %d\r\n",usb.u32_Data,ret); - //如果设备出现卡纸 或者双张等设备信息问题,需要等到设备进行发送stop才能停止。 所以始终以 "停止" 消息为结束信号 - //如果有图的情况下,并且卡纸或双张等,设备会先发送卡纸双张信息。所以接受到错误信息之后,仍需要把图像取出来。 - if (ret == SCANNER_ERR_DEVICE_STOPPED) - { - status_ = !savestatus_.empty() ? savestatus_[0] : SCANNER_ERR_OK;//以第一个消息为准 - savestatus_.clear(); - if (user_cancel_) - { - if (status_ && status_ != SCANNER_ERR_DEVICE_STOPPED) // thread_handle_image_process maybe call stop() when insufficient memory occurs . - ret = status_; - else - status_ = ret = SCANNER_ERR_USER_CANCELED; - utils::to_log(LOG_LEVEL_DEBUG, "%s\n", hg_scanner_err_description(status_)); - } - utils::to_log(LOG_LEVEL_DEBUG, "'STOPSCAN' message in usb thread:%s\n" , hg_scanner_err_description(status_)); - - break; - } - if (ret != SCANNER_ERR_OK && - ret != SCANNER_ERR_DEVICE_STOPPED && - ret != SCANNER_ERR_NO_DATA && - ret != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO && - ret != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) - { - //statu = last_usb_image_statu(ret); - savestatus_.push_back(ret); - } - else if (ret != SCANNER_ERR_NO_DATA && - ret != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER && - ret != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) - { - statu = IMG_STATUS_OK; - } - else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) - { - is_auto_falt = false; - status_ = ret; - std::string msg; - int count = usb.u32_Count; - msg.resize(count); - - { - std::lock_guard lock(io_lock_); - ret = io_->read_bulk(&msg[0], &count); - } - if (ret == SCANNER_ERR_OK) - notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); - else - status_ = ret; - - break; - } - else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) - { - sw.reset(); - status_ = ret; - - std::string msg; - int count = usb.u32_Count; - msg.resize(count); - ret = io_->read_bulk(&msg[0], &count); - if (ret == SCANNER_ERR_OK) - { - status_= ret = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - char buf[1024]; - strcpy(buf, msg.c_str()); - notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); - msg.clear(); - } - else - { - status_ = ret; - break; - } - } - else if (ret == SCANNER_ERR_IO) - { - status_ = ret; - utils::to_log(LOG_LEVEL_DEBUG, "%s\n", hg_scanner_err_description(status_)); - break; - } - if (sw.elapsed_ms() > 30000 && img_conf_.resolution_dst != 600)//防止状态信息一直取不上来导致卡死 - { - if ((img_conf_.papertype == TwSS::MaxSize || img_conf_.papertype == TwSS::USStatement) && pid_ == 0x0300 && firmware_sup_dpi_600) - { - utils::log_info("while 30S\n", LOG_LEVEL_WARNING); - } - else - { - if (!savestatus_.empty())//以第一个消息为准 - { - status_ = savestatus_[0]; - } - savestatus_.clear(); - utils::log_info("Get Status TimeOut,get image out 30S\n", LOG_LEVEL_WARNING); - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_GET_IMAGE_OUTTIME, nullptr), SANE_EVENT_ERROR, status_); // 取图通信超时 - break; - } - } - if (sw.elapsed_s() > 130) - { - if (!savestatus_.empty())//以第一个消息为准 - { - status_ = savestatus_[0]; - } - savestatus_.clear(); - utils::log_info("MaxSize TimeOut,Get Image 130s\n", LOG_LEVEL_WARNING); - notify_ui_working_status(from_default_language(STATU_DESC_SCANNER_ERR_DEVICE_GET_IMAGE_OUTTIME, nullptr), SANE_EVENT_ERROR, status_); // 取图通信超时 - break; - } - if (ret == SCANNER_ERR_OK && usb.u32_Count > 0) - { - int totalNum = usb.u32_Count & 0x3fffffff; // 2022-08-04: 兼容Android,默认图片大小均在1GB以内 - utils::to_log(LOG_LEVEL_WARNING, "Get Scaner Image Size:%d bytes,Image Num[%d]\n", totalNum,img_num); - img_num++; - if (totalNum) - { - std::shared_ptr imagedata(aquire_memory(totalNum)); - - if (!imagedata.get()) - { - status_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - break; - } - - imagedata->set_image_statu(statu); - ret = get_img_data(imagedata); - //io_->set_timeout(200); - - if (ret == SCANNER_ERR_OK) - { - ret = pop_image(); - sw.reset(); - if (ret != SCANNER_ERR_OK) - { - status_ = ret; - break; - } - } - else - { - status_ = ret; - break; - } - } - } - this_thread::sleep_for(chrono::milliseconds(10)); - } - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "USB thread exit with code: %s, status = %s\n", hg_scanner_err_name(ret, errbuf), hg_scanner_err_description(status_)); -} -int hg_scanner_300::discard_all_images(void) -{ - int block = 1024 * 512, len = block; - uint8_t* buf = new uint8_t[block]; - - if(buf) - { - std::lock_guard lock(io_lock_); - int cnt = 0, ret = SCANNER_ERR_OK; - - io_->set_timeout(1000); - while ((ret = io_->read_bulk(buf, &len)) == SCANNER_ERR_OK) - { - len = block; - this_thread::sleep_for(chrono::milliseconds(10)); - if (cnt++ > 10) - { - break; - } - } - delete[] buf; - } - - - //if (is_read_int) - //{ - // initdevice(); - //} - return SCANNER_ERR_OK; -} -int hg_scanner_300::get_roller_life(void) -{ - return pid_ == 300 ? 150000 : 200000; -} -int hg_scanner_300::do_start(void) -{ - bool handled = false; - int ret = try_third_app_handle_start(handled), //sane调用是每次都会调用一次start和stop - count = -1, - val = 1; - - user_cancel_ = false; - - // for third-sane-app invoking, added on 2022-05-19 - if (handled) - return ret; - - final_imgs_.clear(); - imgs_.Clear(); // move from scanning done - - //if (is_read_int) - //{ - // utils::to_log(LOG_LEVEL_WARNING, "device status is(%s)\n", STATU_DESC_SCANNER_ERR_DEVICE_DEVS_BOOTING); - // return SCANNER_ERR_DEVICE_DEVS_BOOTING; - //} - ret = get_scan_is_sleep(val); - if (!val && ret == SCANNER_ERR_OK) - { - status_ = SCANNER_ERR_DEVICE_SLEEPING; - - return status_; - } - ret = get_scanner_paperon(val); - if (!val && ret == SCANNER_ERR_OK) - { - status_ = SCANNER_ERR_DEVICE_NO_PAPER; - - return status_; - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - if (is_devs_sleep_)//设备在睡眠的状态当中获取固件是失败的,所以在这个地方进行标志位设置。(总感觉不保险) - { - is_devs_sleep_ = false; - set_kernelsnap_ver(); - int paper = image_prc_param_.bits.paper; - on_paper_changed(paper); - int dpi = resolution_; - on_resolution_changed(dpi); - } - ret = writedown_device_configuration(true); - if (ret == SCANNER_ERR_OK) - writedown_image_configuration(); - else - { - status_ = ret; - return ret; - } - printf_devconfig(); - USBCB usb = { setting3288dsp::START_COMMAND, img_conf_.scannum, 0}; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usb); - } - - if(ret == SCANNER_ERR_OK) - { - wait_usb_.notify(); - std::this_thread::sleep_for(std::chrono::milliseconds(300)); - ret = try_third_app_after_start(ret); - } - else - status_ = ret; - utils::to_log(LOG_LEVEL_WARNING, "----------Main start scan status : %s----------\n", hg_scanner_err_description(ret)); - return ret; -} -int hg_scanner_300::do_stop(void) -{ - int ret = SCANNER_ERR_OK; - - USBCB usbcb = { setting3288dsp::STOP, 0, 0}; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - } - - if (status_ == SCANNER_ERR_DEVICE_BUSY) - { - utils::log_info("stop status is busy\r\n", LOG_LEVEL_DEBUG); - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - } - user_cancel_ = true; - if (ret == SCANNER_ERR_OK) - { - status_ = SCANNER_ERR_DEVICE_STOPPED; - } - //final_imgs_.clear(); - - return status_; -} -int hg_scanner_300::writeusb(USBCB &usb) -{ - int ret = SCANNER_ERR_OK; - int len = sizeof(usb); - - ret = io_->write_bulk(&usb,&len); - if (ret) - { - status_ = ret; - } - - return ret; -} -int hg_scanner_300::readusb(USBCB &usb) -{ - int ret = SCANNER_ERR_OK; - int len = sizeof(USBCB); - - ret = io_->read_bulk(&usb,&len); - if (ret) - { - status_ = ret; - } - - return ret; -} -int hg_scanner_300::pop_image() -{ - int ret = SCANNER_ERR_OK; - - USBCB usbcb = { setting3288dsp::POP_IMAGE, 0, 0}; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - } - - return ret; -} -int hg_scanner_300::get_scanner_status(USBCB &usb) -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK; - char errbuf[40] = { 0 }; - - usb = { setting3288dsp::GET_DSP_STATUS, 0, 0}; - io_->set_timeout(2000); - ret = writeusb(usb); - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_WARNING, "get_scanner_status write usb: %s\n", hg_scanner_err_name(ret, errbuf)); - return ret; - } - ret = readusb(usb); - - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_WARNING, "get_scanner_status read usb: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - return ret; - } - scanner_err code = settingsdsp_300::device_status_to_hg_err(usb.u32_Data); - return code ; -} -int hg_scanner_300::get_img_data(std::shared_ptr &imagedata) -{ - int total = imagedata->size(), - ret = SCANNER_ERR_OK, - index = 0, - block = total; - char errbuf[40] = { 0 }; - - USBCB usb{ setting3288dsp::GET_IMAGE, 0, total}; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usb); - if (ret != SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_WARNING, "get_img_data setting3288dsp::GET_IMAGE write usb: %s\n", hg_scanner_err_name(ret, errbuf)); - } - else - { - utils::to_log(LOG_LEVEL_FATAL, "get_img_data get data total len is:%d\n", total); - while (total > 0) - { - block = 512 * 1024; - - if (total < block) - block = total; - - unsigned int size = block; - void* buf = imagedata->data(index, &size); - if (!buf) - { - utils::to_log(LOG_LEVEL_FATAL, "memory(0x%08x + %u) fatal when read USB image %d !!!\n", index, block, usb_img_index_); - ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - break; - } - block = size; - ret = io_->read_bulk(buf, &block); - - if (ret != SCANNER_ERR_OK && ret != SCANNER_ERR_TIMEOUT) - { - utils::to_log(LOG_LEVEL_FATAL, "get_img_data read_data:%s!!! \n", hg_scanner_err_name(ret, errbuf)); - break; - } - else if (ret == SCANNER_ERR_TIMEOUT && io_->get_timeout() > 3000) - { - utils::to_log(LOG_LEVEL_FATAL, "get_img_data read_data:%s!!! ,get_timeout is %d\n", hg_scanner_err_name(ret, errbuf), io_->get_timeout()); - break; - } - - index += block; - total -= block; - } - } - } - if (ret == SCANNER_ERR_OK) - { - ret = save_usb_data(imagedata); - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "Read image data from USB err: %s\n", hg_scanner_err_name(ret, errbuf)); - stop(); - string str = STATU_DESC_SCANNER_ERR_DEVICE_GET_IMAGE_ERR; - str = str + '-' + STATU_DESC_SCANNER_ERR_DEVICE_STOPPED; - notify_ui_working_status(str.c_str(), SANE_EVENT_ERROR, ret); - } - - return status_ = ret; -} -int hg_scanner_300::get_img_data_7010(std::shared_ptr& imagedata) -{ - int total = imagedata->size(), - ret = SCANNER_ERR_OK, - index = 0, - block = total; - - USBCB usb{ setting3288dsp::GET_IMAGE, 0, total }; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usb); - - - setting3288dsp::HG_JpegCompressInfo info; - - int len = sizeof(int) * 7; - ret = io_->read_bulk(&info, &len); - - std::vector jpgdata; - - jpgdata.resize(info.DataLength); - ret = io_->read_bulk(&jpgdata[0], (int*)&info.DataLength); - - int width = info.width; - int hegiht = info.height; - int frame_total = info.index_frame; - if (info.first_frame) - { - pdata = (char*)malloc(width * hegiht * frame_total); - index_ = 0; - } - - cv::ImreadModes rmc = cv::IMREAD_GRAYSCALE; - - cv::Mat mat(cv::imdecode(jpgdata, rmc)); - //cv::imwrite("C://Users//modehua//Desktop//image//opencv"+to_string(cnt)+".jpg", mat); - //cnt++; - if (!pdata) - { - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - memcpy(pdata + index_, (void*)mat.data, mat.total() * mat.elemSize()); - index_ += mat.total() * mat.elemSize(); - - if (info.last_frame) - { - cv::Mat mat = cv::Mat(hegiht * frame_total, width, CV_8UC1, pdata, cv::Mat::AUTO_STEP); - //cv::imwrite("C://Users//modehua//Desktop//image//2_opencv.jpg", mat); - if (mat.empty()) - { - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - int width = mat.cols; - int height = mat.rows; - cv::Mat m_dst = mat; - if (image_prc_param_.bits.color_mode == 2) - { - width = mat.cols / 3; - height = mat.rows; - m_dst = cv::Mat(height, width, CV_8UC3); - std::vector m_items; - - for (size_t i = 0; i < 3; i++) - { - cv::Mat t_item(mat(cv::Rect(width * i, 0, width, height))); - m_items.push_back(t_item); - } - cv::merge(m_items, m_dst); - } - - cv::imwrite("C://Users//modehua//Desktop//image//1_opencv.jpg", m_dst); - std::shared_ptr image_data_(aquire_memory(width * hegiht * frame_total)); - - unsigned int size = width * hegiht * frame_total;// bmpdata.size(); - void* l = image_data_->data(0, &size); - memcpy(l, m_dst.data, width * hegiht * frame_total); - - //ret = save_usb_data(image_data_); - index_ = 0; - if (pdata) - { - free(pdata); - } - } - return SCANNER_ERR_OK; - } -} -int hg_scanner_300::writedown_device_configuration(bool type,setting_hardware::HGSCANCONF_3288 *d) -{ - if (!type) - return SCANNER_ERR_OK; - - int ret = SCANNER_ERR_OK, - len = 0; - SIZE size; - setting_hardware::HGSCANCONF_3288 p = dsp_config; - if (!d) - { - p.params_3288.lutmode = keep_watermark_; - d = &p; - } - if (is_multiout) - { - d->params_3288.isColor = image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW ? 0 : 1; - } - else if ((image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY - || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) - && image_prc_param_.bits.rid_color != RID_COLOR_NONE) - { - d->params_3288.isColor = 1; - } - if (paper_size_ == TwSS::USStatement || paper_size_ == TwSS::MaxSize) - { - //d->params_3288.pageSize = setting3288dsp::G400_MAXSIZE; - } - - if ((is_quality_ == IMG_SPEED) && (resolution_ >= 300)) - { - utils::to_log(LOG_LEVEL_WARNING, "writedown_device_configuration is_quality_ is .(%d)\n", is_quality_); - d->params_3288.dpi = 1; - } - if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH - || image_prc_param_.bits.paper == PAPER_MAX_SIZE - || image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP - || image_prc_param_.bits.paper == PAPER_TRIGEMINY - || image_prc_param_.bits.paper == PAPER_16K - || image_prc_param_.bits.paper == PAPER_8K - || image_prc_param_.bits.paper == PAPER_16K_LATERAL - ) - { - d->params_3288.enableSizeDetect = false; - } - size = papersize.GetPaperSize(TwSS::A4, 200, img_conf_.paperAlign); - dsp_config.params_3288.dstHeight = (int)((size.cy + 200) / 100); - - USBCB usbcb = { setting3288dsp::CONFIGURED_DATA, d->value, 0}; - len = sizeof(USBCB); - { - std::lock_guard lock(io_lock_); - ret = io_->write_bulk(&usbcb, &len); - } - if (type) - { - printf_devconfig(d); - } - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_WARNING, "writedown_device_configuration is .(%s)\n", hg_scanner_err_name(ret, errbuf)); - - return ret; -} -int hg_scanner_300::on_color_mode_changed(int& color_mode) -{ - dsp_config.params_3288.isColor = (color_mode == COLOR_MODE_BLACK_WHITE || color_mode == COLOR_MODE_256_GRAY) ? 0 : 1; - return SCANNER_ERR_OK; -} -int hg_scanner_300::on_paper_changed(int& paper) -{ - bool exact = true; - Paper_Map* papermap = pid_ == 0x0300 && firmware_sup_dpi_600 ? paper_map_3288_600dpi : paper_map_3288; - int paperlen = pid_ == 0x0300 && firmware_sup_dpi_600 ? ARRAY_SIZE(paper_map_3288_600dpi) : ARRAY_SIZE(paper_map_3288); - - int ind = hgpaper_to_devspaper(papermap, paperlen, paper, &exact, &paper_size_), - ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT; - - if (dsp_config.params_3288.pageSize != papermap[ind].dev_value) - { - int old = dsp_config.params_3288.pageSize; - - dsp_config.params_3288.pageSize = papermap[ind].dev_value; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config.params_3288.pageSize = old; - for (int i = 0; i < paperlen; ++i) - { - if (papermap[i].dev_value == old) - { - paper = papermap[i].paper; - break; - } - } - } - else if (!exact) - ret = SCANNER_ERR_NOT_EXACT; - } - return ret; -} -int hg_scanner_300::on_paper_check_changed(bool& check) -{ - if (!firmware_sup_dpi_600 && check) - { - check = false; - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - int ret = SCANNER_ERR_OK; - if(dsp_config.params_3288.enableSizeDetect ^ check) - { - dsp_config.params_3288.enableSizeDetect = check; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config.params_3288.enableSizeDetect = !check; - check = dsp_config.params_3288.enableSizeDetect; - } - } - return ret; -} -int hg_scanner_300::on_resolution_changed(int& dpi) -{ - int ret = SCANNER_ERR_OK; - if (firmware_sup_dpi_600) - dsp_config.params_3288.dpi = dpi == 600 ? 3 : (dpi < 599 && dpi>=300) ? 2 : 1; - else if (firmware_sup_dpi_300) - dsp_config.params_3288.dpi = (dpi >= 300) ? 2 : 1; - else - dsp_config.params_3288.dpi = 1; - - utils::to_log(LOG_LEVEL_WARNING, "on_resolution_changed is dpi:%d .set device dpi(%d),firmware_sup_dpi_300 is :%d\n", dpi, dsp_config.params_3288.dpi, firmware_sup_dpi_300); - - ret = writedown_device_configuration(); - return ret; -} -int hg_scanner_300::on_ultrasonic_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dsp_config.params_3288.doubleFeeded ^ check) - { - dsp_config.params_3288.doubleFeeded = check; - ret = writedown_device_configuration(); - if (ret) - { - dsp_config.params_3288.doubleFeeded = !check; - check = dsp_config.params_3288.doubleFeeded; - } - } - return ret; -} -int hg_scanner_300::set_kernelsnap_ver() -{ - int ret = SCANNER_ERR_OK; - - string fw = get_firmware_version(); - if (!fw.empty()) - { - if (atoi(fw.substr(4, 6).c_str()) >= 221106 && atoi(fw.substr(4, 6).c_str()) < 230210) - firmware_sup_dpi_300 = true; - else if (atoi(fw.substr(4, 6).c_str()) >= 230210) - firmware_sup_dpi_600 = true; - else - { - firmware_sup_dpi_300 = false; - firmware_sup_dpi_600 = false; - } - firmware_sup_history_cnt = atoi(fw.substr(4, 6).c_str()) >= 220303 ? true : false; - } - else - { - ret = SCANNER_ERR_NO_DATA; - } - - utils::to_log(LOG_LEVEL_WARNING, "hg_scanner_300 firmware_sup_dpi_300 :%d ,firmware_sup_dpi_600:%d\n", firmware_sup_dpi_300, firmware_sup_dpi_600); - return SCANNER_ERR_OK; -} -int hg_scanner_300::agreement(TwSS tw,int align) -{ - int ret = SCANNER_ERR_OK; - SIZE size; - setting_hardware::HGSCANCONF_3288 d = dsp_config; - size = papersize.GetPaperSize(TwSS::A4,200,align); - dsp_config.params_3288.dstHeight = (int)((size.cy + 200)/100); - ret = writedown_device_configuration(true,&d); - return ret; -} -int hg_scanner_300::initdevice() -{ - io_->set_timeout(2000); - - int val = 0, - ret = SCANNER_ERR_OK; - int cnt = 0; - - ret = get_scan_is_sleep(val); - if (!val && ret == SCANNER_ERR_OK) - { - is_devs_sleep_ = status_ = SCANNER_ERR_DEVICE_SLEEPING; - } - if (status_ != SCANNER_ERR_DEVICE_SLEEPING) - { - string fw = get_firmware_version(); - if (!fw.empty()) - { - if (fw.substr(4, 6) == "230303") - { - string scanner_path(utils::get_module_full_path(MODULE_NAME_SCANNER)); - size_t pos = scanner_path.rfind(PATH_SEPARATOR[0]); - if(pos++ == std::string::npos) - pos = 0; - scanner_path.erase(pos); - scanner_path += "update.zip"; - set_firmware_upgrade(scanner_path); - return SCANNER_ERR_OK; - } - } - } - if (status_ != SCANNER_ERR_DEVICE_SLEEPING) - { - set_kernelsnap_ver(); - is_devs_sleep_ = false; // 睡眠唤醒 客户提前点击设置这边固件版本号 还没有做判断的 - } - return SCANNER_ERR_OK; -} -void hg_scanner_300::writedown_image_configuration(void) -{ - SCANCONF ic; - int len = sizeof(ic); - - bzero(&ic, len); - - ic.contrast = contrast_; - ic.brightness = bright_; - if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO) - ic.imageRotateDegree = image_prc_param_.bits.text_direction; - else - ic.imageRotateDegree = 0; - if (test_1_paper_) - { - utils::log_info("scanning mode: testing ONE paper ...\n", LOG_LEVEL_DEBUG); - ic.scannum = 1; - } - else - ic.scannum = scan_count_; - ic.en_sizecheck = dsp_config.params_3288.enableSizeDetect; - ic.hardwarecaps.en_skrewdetect = 0; - ic.hardwarecaps.en_doublefeed = dsp_config.params_3288.doubleFeeded; - ic.hardwarecaps.en_stapledetect = 0; - ic.hardwarecaps.skrewdetectlevel = 0; - - // ic.hardwarecaps.is_autopaper = dsp_config_.params_dsp.is_autopaper; - ic.hardwarecaps.capturepixtype = 0; //暂无参数 获取图像类型 - ic.hardwarecaps.lowpowermode = LowPowerMode::Min_None; //暂无参数 设置休眠时间 两个参数3399未使用 - image_configuration(ic); -} -void hg_scanner_300::printf_devconfig(setting_hardware::HGSCANCONF_3288 *d) -{ - if (!d) - d = &dsp_config; - - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.doubleFeeded:%d\r\n",d->params_3288.doubleFeeded); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.dpi:%d\r\n",d->params_3288.dpi); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.dstHeight:%d\r\n",d->params_3288.dstHeight); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.enableLed:%d\r\n",d->params_3288.enableLed); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.enableStable:%d\r\n",d->params_3288.enableStable); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.isColor:%d\r\n",d->params_3288.isColor); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.isCorrect:%d\r\n",d->params_3288.isCorrect); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.pageSize:%d\r\n",d->params_3288.pageSize); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.reversed1:%d\r\n",d->params_3288.reversed1); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.reversed2:%d\r\n",d->params_3288.reversed2); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.enableSizeDetect:%d\r\n",d->params_3288.enableSizeDetect); - utils::to_log(LOG_LEVEL_DEBUG,"dsp_config.params_3288.value:%d\r\n",d->value); -} -std::string hg_scanner_300::get_firmware_version() -{ - char buf[20] = { 0 }; - int ret = SCANNER_ERR_OK, - len = 10; //协议定义长度为10 100 200 =8 - USBCB cmd = { setting3288dsp::GET_FW_VERSION,len,0,}; - - { - std::lock_guard lock(io_lock_); - ret = writeusb(cmd); - if(ret == SCANNER_ERR_OK) - ret = io_->read_bulk(buf, &len); - } - string fw = buf; - utils::to_log(LOG_LEVEL_WARNING, "get_firmware_version:%s\n", !fw.empty() ? fw.c_str() : "not find devs firmware_version"); - - return buf; -} - std::string hg_scanner_300::get_serial_num() - { - string SerialNum = ""; - int ret = SCANNER_ERR_OK, - len = 14; - SerialNum.resize(len); - - USBCB cmd = { setting3288dsp::GET_SERIAL,len,0,}; - { - std::lock_guard lock(io_lock_); - ret = writeusb(cmd); - if(ret == SCANNER_ERR_OK) - ret = io_->read_bulk(&SerialNum[0], &len); - } - - utils::to_log(LOG_LEVEL_WARNING, "get_serial_num:%s\n", !SerialNum.empty() ? SerialNum.c_str() : "not find devs get_serial_num"); - return SerialNum; - } - std::string hg_scanner_300::get_ip(void) - { - return ""; - } -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int hg_scanner_300::set_leaflet_scan(void) -{ - int ret = SCANNER_ERR_OK; - test_1_paper_ = true; - - ret = start(); - return ret; -} - -int hg_scanner_300::set_clear_roller_num(void) -{ - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::CLR_ROLLER_NUM,0,4 }; - return writeusb(usbcb); -} -int hg_scanner_300::set_clear_history_num(void) -{ - if (!firmware_sup_history_cnt) - { - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - } - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::CLR_SCAN_NUM,0,4 }; - return writeusb(usbcb); -} -int hg_scanner_300::get_device_code(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::get_sleep_time(int &data) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::GET_SLEEP_TIME, 0, 0 }; - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - len = sizeof(usbcb); - ret = io_->read_bulk(&usbcb, &len); - } - if (ret == SCANNER_ERR_OK) - { - data = (SANE_Power)usbcb.u32_Data; - } - utils::to_log(LOG_LEVEL_WARNING, "get_sleep_time:%d\n", data); - return ret; -} -int hg_scanner_300::set_sleep_time(int data) -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK; - USBCB usbcb = { setting3288dsp::SET_SLEEP_TIME,data, 0}; - ret = writeusb(usbcb); - return ret; -} - -int hg_scanner_300::get_scanner_paperon(SANE_Bool& type) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::GET_PAPERFEEDER_STATUS, 0, 0}; - len = sizeof(USBCB); - - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - if (ret == SCANNER_ERR_OK) - { - ret = io_->read_bulk(&usbcb, &len); - type = usbcb.u32_Data == 0 ? false : true; - } - } - //if (usbcb.u32_Data == 0) - // ret = SCANNER_ERR_DEVICE_NO_PAPER; - //else - // ret = SCANNER_ERR_OK; - utils::to_log(LOG_LEVEL_WARNING, "get_scanner_paperon is(%s)\n", !type ? hg_scanner_err_description(SCANNER_ERR_DEVICE_NO_PAPER) : hg_scanner_err_description(SCANNER_ERR_OK)); - return ret; -} - -int hg_scanner_300::get_scan_is_sleep(SANE_Bool& type) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::ACTIVE_SCANNER, 0, 0 }; - len = sizeof(USBCB); - { - std::lock_guard lock(io_lock_); - - ret = writeusb(usbcb); - if (ret == SCANNER_ERR_OK) - { - ret = io_->read_bulk(&usbcb, &len); - } - } - if (ret == SCANNER_ERR_OK) - { - if (usbcb.u32_Data == 0x10) - type = true; - //return SCANNER_ERR_OK; - else if (usbcb.u32_Data == 0x100) - type = false; - //return SCANNER_ERR_DEVICE_SLEEPING; - } - utils::to_log(LOG_LEVEL_WARNING, "get_scan_is_sleep is(%s)\n", !type ? hg_scanner_err_description(SCANNER_ERR_DEVICE_SLEEPING) : hg_scanner_err_description(SCANNER_ERR_OK)); - return ret; -} -///此款设备无此功能 -int hg_scanner_300::on_staple_check_changed(bool& check) -{ - return SCANNER_ERR_OK; -} -int hg_scanner_300::on_skew_check_changed(bool& check) -{ - return SCANNER_ERR_OK; -} -int hg_scanner_300::on_skew_check_level_changed(int& check) -{ - return SCANNER_ERR_OK; -} -int hg_scanner_300::on_set_feedmode(int feedmode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::on_pic_type(bool& pic) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::on_pick_paper(bool autostrength) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::on_pick_paper_threshold(double threshold) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::on_is_auto_paper(bool isautopaper) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::on_cis_get_image(bool isautopaper) -{ - is_cis_image = isautopaper; - dsp_config.params_3288.isCorrect = isautopaper == true ? 0 : 1; - return writedown_device_configuration(); -} -int hg_scanner_300::on_get_feedmode(int &feedmode) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::get_device_log(string &log) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::set_devreboot(int data) -{ - USBCB usbcb = { setting3288dsp::REBOOT, data ,0 }; - return writeusb(usbcb); -} -int hg_scanner_300::set_devshtudown() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::set_scan_islock(SANE_Bool type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::get_scan_islock(SANE_Bool& type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::set_scan_lock_check_val(string str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::set_firmware_upgrade(std::string str) -{ - std::lock_guard lock(io_lock_); - - std::ifstream filename; - int ret = SCANNER_ERR_OK; - int block = 1024 * 1024; - char* sendbuf = new char[block]; - - filename.open(str, std::ios_base::in | std::ios_base::binary); - if (!filename.is_open()) - { - return SCANNER_ERR_NO_DATA; - } - - filename.seekg(0, std::ios::end); - size_t total = filename.tellg(); - - filename.seekg(0, std::ios::beg); - - USBCB pre = { setting3288dsp::PRE_UPGRADE,0,total }; - int len = sizeof(pre); - ret = io_->write_bulk(&pre, &len); //先告诉下面总字节数 - if (ret != SCANNER_ERR_OK) - { - return ret; - } - USBCB update = { setting3288dsp::START_UPGRADE,0,total }; - len = sizeof(update); - - while (total > 0) - { - memset(sendbuf, 0, block); - block = 1024 * 1024; - if (total < block) - { - block = total; - } - io_->write_bulk(&update, &len);//数据分段写,每次都要先告诉下面? - - filename.read(sendbuf, block); - - //size_t pos = filename.tellg(); - - io_->write_bulk(sendbuf,&block); - - ret = io_->read_bulk(&update, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - total -= block; - this_thread::sleep_for(std::chrono::milliseconds(10)); - } - if (sendbuf) - { - delete[]sendbuf; - } - USBCB updatefinished = { setting3288dsp::UPDATE_FINISHED,0,0 }; - len = sizeof(updatefinished); - ret = io_->write_bulk(&updatefinished, &len); - - StopWatch sw; - - USBCB result = { setting3288dsp::GET_UPDATE_RESULT,0,0 }; - len = sizeof(result); - while (sw.elapsed_s() < 60) - { - this_thread::sleep_for(std::chrono::milliseconds(1000)); - io_->set_timeout(3000); - ret = io_->write_bulk(&result, &len); - - ret = io_->read_bulk(&result, &len); - //this_thread::sleep_for(std::chrono::milliseconds(1000)); - - if (ret != SCANNER_ERR_OK) - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_WARNING, "updata result read_bulk:%s\n", hg_scanner_err_name(ret, errbuf)); - //return ret; - } - if (result.u32_Data == 2 || result.u32_Data == 3) - { - utils::to_log(LOG_LEVEL_WARNING, "updata result:%d\n", result.u32_Data); - break; - } - } - return ret; -} -int hg_scanner_300::set_clean_paper_road() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::get_dev_islock_file(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::set_dev_islock_file(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::set_speed_mode(int data) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::SET_SPEED_MODE,data,0 }; - len = sizeof(usbcb); - ret = io_->write_bulk(&usbcb, &len); - return 0; -} -int hg_scanner_300::get_speed_mode(int& data) -{ - int ret = SCANNER_ERR_OK, - len = 0; - - USBCB usbcb = { setting3288dsp::GET_SPEED_MODE,0,0 }; - len = sizeof(usbcb); - ret = io_->write_bulk(&usbcb, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - ret = io_->read_bulk(&usbcb, &len); - if (ret == SCANNER_ERR_OK) - { - data = usbcb.u32_Data; - } - return ret; -} -int hg_scanner_300::set_devs_distortion_check_val(float data) -{ - int val = *(int*)&data; //float to int send - int ret = SCANNER_ERR_OK, - len = 0; - - int protocol_dpi = resolution_ == 200 ? 1 : (resolution_ == 300 ? 2 : 3); - USBCB usbcb = { setting3288dsp::SET_JUST_COF_V ,val,protocol_dpi }; - len = sizeof(usbcb); - float f = *(float*)&(val); - utils::to_log(LOG_LEVEL_WARNING, "set_devs_distortion_check_val dpi is:%d,config dpi = %d,distortion_check_val(%f)\n", resolution_, protocol_dpi,f); - io_->set_timeout(5000); - { - std::lock_guard lock(io_lock_); - ret = io_->write_bulk(&usbcb, &len); - } - return ret; -} -int hg_scanner_300::get_devs_distortion_check_val(float& data) -{ - int ret = SCANNER_ERR_OK, - len = 0, - val = 0; - - int protocol_dpi = resolution_ == 200 ? 1 : (resolution_ == 300 ? 2 : 3); - USBCB usbcb = { setting3288dsp::GET_JUST_COF_V ,0,protocol_dpi }; - len = sizeof(usbcb); - { - std::lock_guard lock(io_lock_); - - ret = io_->write_bulk(&usbcb, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - - io_->set_timeout(3000); - ret = io_->read_bulk(&usbcb, &len); - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - - val = usbcb.u32_Data; - data = *(float *) &val; - - utils::to_log(LOG_LEVEL_WARNING, "get_distortion_check_val dpi is:%d,protocol_dpi = %d get_distortion_check_val(%f)\n", resolution_, protocol_dpi, data); - return ret; -} -int hg_scanner_300::set_auto_flat(int data) -{ - if (data < 0 && data >6) - { - data = 0; - } - USBCB usbcb = { setting3288dsp::START_FLAT,data,0 }; - int len = sizeof(usbcb); - int ret = SCANNER_ERR_OK; - - { - std::lock_guard lock(io_lock_); - ret = writeusb(usbcb); - } - - if (ret == SCANNER_ERR_OK && wait_usb_.is_waiting()) - { - //status_ = SCANNER_ERR_DEVICE_BUSY; - wait_usb_.notify(); - std::this_thread::sleep_for(std::chrono::milliseconds(300)); - ret = try_third_app_after_start(ret); - } - else - status_ = ret; - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_WARNING, "set_auto_flat ret: %s\n", hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner_300::set_updata0303(void) -{ - string fw = get_firmware_version(); - if (!fw.empty()) - { - if (fw.substr(4, 6) == "230303") - { - string scanner_path = utils::get_module_full_path(MODULE_NAME_SCANNER); - size_t pos = scanner_path.rfind(PATH_SEPARATOR[0]); - if(pos++ == std::string::npos) - pos = 0; - scanner_path.erase(pos); - scanner_path += "update.zip"; - set_firmware_upgrade(scanner_path); - } - } - return 0; -} -int hg_scanner_300::set_serial_num(string str) -{ - std::lock_guard lock(io_lock_); - - USBCB usbcb = { setting3288dsp::SEND_SERIAL,0,14 }; - int len = sizeof(usbcb), - ret = SCANNER_ERR_OK; - ret = io_->write_bulk(&usbcb, &len); - if (ret == SCANNER_ERR_OK) - { - len = str.size(); - - ret = io_->write_bulk(&str, &len); - } - return ret; -} -int hg_scanner_300::set_vid_pid(int data) -{ - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::SET_USB_INFOR_VIDPID,data,0 }; - int len = sizeof(usbcb); - return io_->write_bulk(&usbcb, &len); -} -int hg_scanner_300::get_vid_pid(int& data) -{ - std::lock_guard lock(io_lock_); - USBCB usbcb = { setting3288dsp::GET_USB_INFOR_VIDPID,0,0 }; - int ret = SCANNER_ERR_OK, - len = sizeof(usbcb); - io_->write_bulk(&usbcb, &len); - io_->read_bulk(&usbcb, &len); - if (ret == SCANNER_ERR_OK) - { - data = usbcb.u32_Data; - } - return ret; -} -int hg_scanner_300::set_notify_sleep() -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_300::get_history_scan_count(int& num) -{ - int ret = SCANNER_ERR_OK, - len = 0; - USBCB usbcb = { setting3288dsp::GET_SCANN_NUM,0, 0 }; - len = sizeof(usbcb); - { - std::lock_guard lock(io_lock_); - - ret = io_->write_bulk(&usbcb, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - ret = io_->read_bulk(&usbcb, &len); - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - num = usbcb.u32_Data; - return ret; -} -int hg_scanner_300::get_roller_num(int& val) -{ - int ret = SCANNER_ERR_OK, - len = 0; - USBCB usbcb = { setting3288dsp::GET_ROLLER_NUM,0, 0 }; - len = sizeof(usbcb); - { - std::lock_guard lock(io_lock_); - - ret = io_->write_bulk(&usbcb, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - ret = io_->read_bulk(&usbcb, &len); - } - if (ret != SCANNER_ERR_OK) - { - return ret; - } - val = usbcb.u32_Data; - return ret; -} diff --git a/hgdriver/hgdev/hg_scanner_300.h b/hgdriver/hgdev/hg_scanner_300.h deleted file mode 100644 index eb82adb..0000000 --- a/hgdriver/hgdev/hg_scanner_300.h +++ /dev/null @@ -1,119 +0,0 @@ -#pragma once - -// hg_scanner is the base class of kinds of scanners -// -// created on 2022-01-30 -// -#include -#include -#include -#include - -#include "hg_scanner.h" -#include "PaperSize.h" - -//#ifdef OEM_HANWANG -//#define hg_scanner_300 hw_scanner_300 -//#elif defined(OEM_LISICHENG) -//#define hg_scanner_300 lsc_scanner_300 -//#endif - - -class hg_scanner_300 : public hg_scanner -{ -protected: - virtual int on_scanner_closing(bool force) override; - virtual void thread_handle_usb_read(void) override; - virtual int discard_all_images(void) override; - virtual int get_roller_life(void) override; - -protected: - virtual int on_color_mode_changed(int& color_mode) override; //颜色切换 - virtual int on_paper_changed(int& paper) override; //纸张大小设置 - virtual int on_paper_check_changed(bool& check) override; //尺寸检测 - virtual int on_resolution_changed(int& dpi) override; //分辨率设置 - virtual int on_ultrasonic_check_changed(bool& check) override; //设置超声波检测 - virtual int on_staple_check_changed(bool& check) override; //设置订书针检测 - virtual int on_skew_check_changed(bool& check) override; //设置歪斜检测 - virtual int on_skew_check_level_changed(int& check) override; //设置歪斜检测强度 - virtual int on_get_feedmode(int& feedmode) override; //获取分纸强度 - virtual int on_set_feedmode(int feedmode) override; //设置分纸强度 - virtual int on_pic_type(bool& pic)override; //照片模式或者文本模式 - virtual int on_pick_paper(bool autostrength)override; //自动分纸强度 - virtual int on_pick_paper_threshold(double threshold)override; - virtual int on_is_auto_paper(bool isautopaper)override; //待纸扫描 - virtual int on_cis_get_image(bool isautopaper) override; //cis 原图获取 - -public: - hg_scanner_300(const char* dev_name, const char* model,int pid, usb_io* io); - ~hg_scanner_300(); -public: - virtual int do_start(void) override; - virtual int do_stop(void) override; - -private: - int set_kernelsnap_ver(); - int agreement(TwSS tw,int align); - int initdevice(); - int writeusb(USBCB &usb); - int readusb(USBCB &usb); - int pop_image(void); - int get_scanner_status(USBCB &usb); - int get_img_data(std::shared_ptr &imagedata); - int get_img_data_7010(std::shared_ptr& imagedata); - int writedown_device_configuration(bool type =false,setting_hardware::HGSCANCONF_3288 *d = NULL); - void writedown_image_configuration(void); - void printf_devconfig(setting_hardware::HGSCANCONF_3288 *d = NULL); -private: - std::vector savestatus_; - setting_hardware::HGSCANCONF_3288 dsp_config; - Device::PaperSize papersize; - bool is_devs_sleep_; - int index_; - char* pdata; -public: - //////////////固定的硬件信息设置或获取////////////// - virtual std::string get_firmware_version(void)override; - virtual std::string get_serial_num(void)override; - virtual std::string get_ip(void)override; - - virtual int set_serial_num(string str) override; //设置序列号 - virtual int set_vid_pid(int data) override; //设置vidpid - virtual int get_vid_pid(int& data)override; //获取vidpid - - /////////////////成功返回:SCANNER_ERR_OK ///////////// - /////////////////失败返回:IO错误码 ///////////// - virtual int set_leaflet_scan(void) override; //单张扫描 - - - virtual int set_clear_roller_num(void) override; //清除滚轴计数 - virtual int set_clear_history_num(void) override; //清除历史张数 0303固件版本才支持 - - virtual int get_device_code(void); //获取设备编码 不支持 - - virtual int get_scanner_paperon(SANE_Bool& type) override; //获取设备有无纸张 /*/ type : 0无纸 1有纸 */ - - virtual int get_scan_is_sleep(SANE_Bool& type) override; //获取设备是否休眠当中 /*/ type : 0休眠 1唤醒状态*/ - virtual int get_sleep_time(int& data) override; //获取功耗模式(休眠) /*/ data > 0*/ - virtual int set_sleep_time(int data) override; //设置功耗模式(休眠) /*/ data > 0*/ - virtual int get_history_scan_count(int& data) override; //获取历史扫描张数 /*/ data > 0*/ - virtual int get_roller_num(int& data) override; //获取滚轮张数 /*/ data > 0*/ - virtual int set_notify_sleep(void) override; //唤醒设备 - virtual int get_device_log(string& log) override; //获取设备日志 /*/ log :储存路径*/ - virtual int set_devreboot(int data) override; //设置设备重启 - virtual int set_devshtudown() override; //设置设备关机 - virtual int set_scan_islock(SANE_Bool type) override; //设置设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int get_scan_islock(SANE_Bool& type) override; //获取设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int set_scan_lock_check_val(string str) override; //获取设备是否锁定 /*/ str:校验码*/ - virtual int set_firmware_upgrade(std::string str) override; //固件升级 /*/ str:文件名路径*/ - virtual int set_clean_paper_road() override; //清理纸道 - virtual int get_dev_islock_file(int& data) override; //获取设备文件 /*/ data:0 未上锁,1 上锁。-1 未发现黑名单列表 -2列表没有信息*/ - virtual int set_dev_islock_file(int data) override; //设置设备文件 /*/ data:0 未上锁,1 上锁* - virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,70 - virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:40,50,60,70 - virtual int set_devs_distortion_check_val(float data) override; //设置畸变矫正 - virtual int get_devs_distortion_check_val(float& data)override;//获取设备畸变值 float to int; - virtual int set_auto_flat(int data)override; //设置自动平场校正 - // data:0(ALL) 1(200dpi、gray) 2(200dpi、color) 3(300dpi、gray) 4(300dpi、color) 5(600dpi、gray) 6(600dpi、color) - virtual int set_updata0303(void)override; -}; diff --git a/hgdriver/hgdev/hg_scanner_302.cpp b/hgdriver/hgdev/hg_scanner_302.cpp deleted file mode 100644 index 86678be..0000000 --- a/hgdriver/hgdev/hg_scanner_302.cpp +++ /dev/null @@ -1,1409 +0,0 @@ -#include "hg_scanner_302.h" - -#include "../../sdk/hginclude/utils.h" -#include -#include "filetools.h" - -#if defined(WIN32) || defined(_WIN64) -#include "scanner_manager.h" -#endif -//302 -static std::string jsontext1("{\"global\":{\"device_type\":\"G302\",\"option_count\":62},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout==false\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":32,\"range\":[\"A4\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"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\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4"); -static std::string jsontext2("fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":50,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"size\":24,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":1,\"max\":600,\"step\":1}},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u976"); -static std::string jsontext3("2\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_or\":[\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4}}"); - -//402 -static std::string jsontext4("{\"global\":{\"device_type\":\"G402\",\"option_count\":63},\"restore\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"none\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"cat\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-multiout\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"multiout-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"size\":32,\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend_or\":[\"is-multiout==true\"]},\"mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend_or\":[\"is-multiout==false\"]},\"binary-threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"type\":\"int\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=24\\u4f4d\\u5f69\\u8272\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-multiout-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-erase-bkg\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=256\\u7ea7\\u7070\\u5ea6\",\"!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"bkg-color-range\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"type\":\"int\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"type\":\"string\",\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"size\":24,\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-morr\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"resolution<500\",\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"is-noise-optimize\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==\\u9ed1\\u767d\"]},\"noise-size\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"A4\",\"A4\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\"]},\"is-custom-area\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u4e09\\u8054\\u8bd5\\u5377\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"type\":\"float\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"type\":\"float\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"type\""); -static std::string jsontext5(":\"float\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend_and\":[\"is-custom-area==true\"]},\"page\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"size\":40,\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"blank-sensitivity\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"]},\"fold-type\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"type\":\"string\",\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"size\":200,\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend_or\":[\"page==\\u5bf9\\u6298\"]},\"resolution\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"type\":\"int\",\"cur\":200,\"default\":200,\"size\":4,\"range\":{\"min\":100,\"max\":600,\"step\":1}},\"is-exchange\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"base\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\"]},\"grp-2\":{\"cat\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"is-custom-gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"brightness\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"contrast\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"type\":\"int\",\"cur\":4,\"default\":4,\"size\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"gamma\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"light\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"type\":\"float\",\"cur\":1.000000,\"default\":1.000000,\"size\":4,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend_or\":[\"is-custom-gamma==false\",\"is-multiout==true\",\"mode==\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"grp-3\":{\"cat\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"color-correction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u504f\\u6821\\u6b63\",\"desc\":\"\\u8272\\u5f69\\u8fd8\\u539f\\u5ea6\\u77eb\\u6b63\\u529f\\u80fd\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"mode==24\\u4f4d\\u5f69\\u8272\"]},\"is-anti-skew\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-split\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"page!=\\u5bf9\\u6298\"]},\"is-erase-black-frame\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4},\"bkg-fill-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"size\":40,\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-erase-black-frame==true\"]},\"threshold\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"type\":\"int\",\"cur\":40,\"default\":40,\"size\":4,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"anti-noise-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"type\":\"int\",\"cur\":8,\"default\":8,\"size\":4,\"range\":{\"min\":1,\"max\":20,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"margin\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"type\":\"int\",\"cur\":5,\"default\":5,\"size\":4,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5bf9\\u6298\",\"is-erase-black-frame!=true\",\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"is-anti-skew!=true\"]},\"is-anti-permeate\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"type\":\"string\",\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend_or\":[\"is-anti-permeate==true\"]},\"is-rid-hole-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-l\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-r\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":"); -static std::string jsontext6("\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-t\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"search-hole-range-b\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"imgproc\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"type\":\"float\",\"cur\":0.100000,\"default\":0.100000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend_or\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"cat\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"field\":\"Common\",\"pos\":0,\"visible\":true,\"unit\":\"None\"},\"scan-mode\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"type\":\"string\",\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"size\":32,\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"scan-count\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"type\":\"int\",\"cur\":-1,\"default\":-1,\"size\":4,\"depend_or\":[\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"]},\"direction\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"type\":\"string\",\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"size\":40,\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"page!=\\u5355\\u9762\",\"!=\\u5bf9\\u6298\",\"direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-ultrosonic\":{\"cat\":\"base\",\"readonly\":false,\"affect\":0,\"group\":\"feeder\",\"visible\":true,\"field\":\"Common\",\"pos\":0,\"unit\":\"None\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"type\":\"bool\",\"cur\":true,\"default\":true,\"size\":4}}"); - - - -namespace settings302 -{ - // device status to scanner_err - scanner_err device_status_to_hg_err(setting3399::HGEIntInfo* ds) - { - scanner_err code = SCANNER_ERR_OK; - - if (ds->From == setting3399::HGType::FPGA) - code = SCANNER_ERR_OK; - else if (ds->From == setting3399::HGType::MtBoard) - { - switch (ds->Code) - { - case 0x00002: - code = SCANNER_ERR_DEVICE_NO_PAPER; - break; - case 0x00004: - code = SCANNER_ERR_DEVICE_COVER_OPENNED; - break; - case 0x00008: - code = SCANNER_ERR_DEVICE_FEEDING_PAPER; - break; - case 0x00010: - code = SCANNER_ERR_DEVICE_PAPER_JAMMED; - break; - case 0x00020: - code = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; - break; - case 0x00040: - code = SCANNER_ERR_DEVICE_STAPLE_ON; - break; - case 0x00080: - code = SCANNER_ERR_DEVICE_PAPER_SKEW; - break; - case 0x10000: - case 0x80000: - code = SCANNER_ERR_TIMEOUT; - break; - case 0x20000: - code = SCANNER_ERR_DEVICE_SIZE_CHECK; - break; - default: - break; - } - } - else if (ds->From == setting3399::HGType::IMG) - { - if (ds->Code == 1) - code = SCANNER_ERR_DEVICE_DOGEAR; - else if (ds->Code == 2) - code = SCANNER_ERR_DEVICE_SIZE_CHECK; - } - else if (ds->From == setting3399::HGType::V4L2) - { - if (ds->Code == 0) - code = SCANNER_ERR_DEVICE_SCANN_ERROR; - else if (ds->Code == 1) - code = SCANNER_ERR_DEVICE_NO_IMAGE; - } - else if (ds->From == setting3399::HGType::STOPSCAN) - code = SCANNER_ERR_DEVICE_STOPPED; - - return code; - } - - // resolution - static struct - { - float resolution; - int dev_value; - }resolution_map[] = - { - {100.0f, 1}, - {150.0f, 1}, - {200.0f, 1}, - {240.0f, 1}, - {300.0f, 0}, - {600.0f, 1} //涓存椂鐗堟湰? 鍘熸潵鍙? - }; - bool is_equal(float l, float r) - { - return fabs(l - r) < .000001f; - } - int match_best_resolution(int resolution, bool* exact) - { - int rsl = resolution, - ind = 0; - bool good = true, *r = exact ? exact : &good; - - if (rsl <= resolution_map[0].resolution) - { - ind = 0; - } - else if (rsl >= resolution_map[ARRAY_SIZE(resolution_map) - 1].resolution) - { - ind = ARRAY_SIZE(resolution_map) - 1; - } - else - { - for (int i = 1; i < ARRAY_SIZE(resolution_map); ++i) - { - if (is_equal(rsl, resolution_map[i].resolution)) - { - ind = i; - break; - } - if (rsl < resolution_map[i].resolution) - { - float dif_l = rsl - resolution_map[i - 1].resolution, - dif_r = resolution_map[i].resolution - rsl; - - if (dif_l > dif_r) - ind = i; - else - ind = i - 1; - break; - } - } - } - - *r = is_equal(rsl, resolution_map[ind].resolution); - - return ind; - } - - // paper - - - //int match_best_paper(int& paper, bool* exact, TwSS* type) - //{ - // int ind = 0; - // bool good = true, * r = exact ? exact : &good; - - // for (int i = 0; i < ARRAY_SIZE(paper_map_3399); ++i) - // { - // if (paper == paper_map_3399[i].paper) - // { - // ind = i; - // break; - // } - // } - - // if (paper == paper_map_3399[ind].paper) - // *r = true; - // else - // *r = false; - // utils::to_log(LOG_LEVEL_DEBUG, "Paper '%s' index = %d, device value = %d\n", paper_string(paper).c_str(), ind, paper_map_3399[ind].dev_value); - // paper = paper_map_3399[ind].paper; - // if (type) - // *type = paper_map_3399[ind].type; - - // return ind; - //} -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// class ... -hg_scanner_302::hg_scanner_302(const char* dev_name, const char* model, int pid, usb_io* io) : hg_scanner(G20039Serial, dev_name, model, io, pid) - , rewrite_conf_(false), reset_(false) -{ - //pid_ = pid; - utils::to_log(LOG_LEVEL_DEBUG, "hg_scanner_302(%p) constructing ...\n", this); - dev_conf_.value = 0; -#ifndef MAPPING_FUNCTION_IN_BASE - init_setting_map(setting_map_, ARRAY_SIZE(setting_map_)); -#endif - if (init_settings(pid_)) - { - if (pid_ == 0x302) - init_settings((jsontext1 + jsontext2 + jsontext3).c_str()); - else - init_settings((jsontext4 + jsontext5 + jsontext6).c_str()); - } - //writedown_device_configuration(); // initialize the hardware settings - init_version(); -} -hg_scanner_302::~hg_scanner_302() -{ - utils::to_log(LOG_LEVEL_DEBUG, "hg_scanner_302(%p) destroyed.\n", this); -} -int hg_scanner_302::read_register(int addr, int* val) -{ - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - int l = sizeof(*val), - ret = io_->control_io(0x0c0, USB_REQ_GET_DEV_REGS, addr, 0, val, &l); - - if (ret) - status_ = ret; - - return ret; -} -int hg_scanner_302::write_register(int addr, int val) -{ - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - int l = sizeof(val), - ret = io_->control_io(0x040, USB_REQ_SET_DEV_REGS, addr, 0, &val, &l); - - if (ret) - status_ = ret; - - return ret; -} -int hg_scanner_302::write_command(int cmd) -{ - return write_register(0, cmd); -} -std::string hg_scanner_302::control_fetch(int addr, int val, int size) -{ - int l = sizeof(val), - ret = 0; - std::string data(""); - char errbuf[40] = { 0 }; - - ret = write_register(addr, val); - if (ret == SCANNER_ERR_OK) - { - l = size + 1; - data.resize(size + 2); - bzero(&data[0], size + 2); - ret = io_->read_bulk(&data[0], &l); - if (ret == SCANNER_ERR_OK) - { - utils::to_log(LOG_LEVEL_DEBUG, "control_fetch(%d, %d) - read_bulk %d bytes\n", addr, val, l); - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "control_fetch(%d, %d) - read_bulk = %s\n", addr, val, hg_scanner_err_name(ret, errbuf)); - data.clear(); - } - } - else - utils::to_log(LOG_LEVEL_DEBUG, "control_fetch(%d, %d) = %s\n", addr, val, hg_scanner_err_name(ret, errbuf)); - - return data; -} -std::string hg_scanner_302::get_fpga(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_MBVERSION_LENGHT, &val); - std::string fpga(""); - - if (ret == SCANNER_ERR_OK) - { - fpga.resize(val + 2); - bzero(&fpga[0], val + 2); - - return control_fetch(setting3399::SR_GET_MBVERSION, 0, val); - } - - return fpga; -} -int hg_scanner_302::clr_roller_num(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_CLR_ROLLER_NUM, &val); - - if (ret == SCANNER_ERR_OK) - return val; - else - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "clr_roller_num = %s\n", hg_scanner_err_name(ret, errbuf)); - return -1; - } -} -int hg_scanner_302::get_sleep_time(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_SLEEPTIME, &val); - - if (ret == SCANNER_ERR_OK) - return val; - else - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "get_sleep_time = %s\n", hg_scanner_err_name(ret, errbuf)); - return -1; - } -} -int hg_scanner_302::get_scan_mode(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_OS, &val); - - if (ret) - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "get scan mode error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return -1; - } - else - return val; -} -int hg_scanner_302::get_status(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_STATUS, &val); - - if (ret) - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "get status error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return -1; - } - else - return val; -} -bool hg_scanner_302::is_dev_tx(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_STATUS, &val); - - if (ret) - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "is_dev_tx() error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return false; - } - else - return val; -} -bool hg_scanner_302::is_dev_image_process_done(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_IMAGEPROCESSDONE, &val); - - if (ret) - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "is_dev_image_process_done() error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return true; - } - else - return val; -} -bool hg_scanner_302::is_dev_image_keep_last_paper(void) -{ - std::lock_guard lock(io_lock_); - - int val = 0, - ret = read_register(setting3399::SR_GET_KEEP_LAST_PAPER, &val); - - if (ret) - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "is_dev_image_keep_last_paper() error: %s\n", hg_scanner_err_name(ret, errbuf)); - status_ = ret; - - return true; - } - else - return val; -} -int hg_scanner_302::get_scanned_count(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_SCANN_NUM, &val); - - if (ret == SCANNER_ERR_OK) - return val; - else - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "get_scanned_count = %s\n", hg_scanner_err_name(ret, errbuf)); - return -1; - } -} -int hg_scanner_302::get_image_count(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_IM_COUNT, &val); - char errbuf[40] = { 0 }; - - utils::to_log(LOG_LEVEL_DEBUG, "get_image_count() = %d, error: %s\n", val, hg_scanner_err_name(ret, errbuf)); - - if (ret == SCANNER_ERR_OK) - return val; - else - return -1; -} -int hg_scanner_302::get_front_data_size(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_IM_FRONT_SIZE, &val); - - if (ret == SCANNER_ERR_OK) - return val; - else - { - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "get_front_data_size = %s\n", hg_scanner_err_name(ret, errbuf)); - return -1; - } -} -void hg_scanner_302::init_version(void) -{ - std::string fv(get_firmware_version()), - sn(get_serial_num()); - if (fv.empty() || sn.empty()) - return; - utils::to_log(LOG_LEVEL_DEBUG, "Firmware version: %s\n", fv.c_str()); - utils::to_log(LOG_LEVEL_DEBUG, "Serial number: %s\n", sn.c_str()); - //utils::to_log(LOG_LEVEL_DEBUG, " HG3399 IP: %s\n", get_ip().c_str()); - - //if (fv.length() >= 10 && (fv[5] > 'A' || atoi(fv.substr(6, 4).c_str()) >= 1209)) - //{ - // is_kernelsnap_239_211209_ = atoi(get_fpga().c_str()) >= 35211210; - //} - //else - // is_kernelsnap_239_211209_ = false; -} -int hg_scanner_302::get_device_sleep_stautus(void) -{ - std::lock_guard lock(io_lock_); - int ret =read_register(setting3399::SR_GET_SLEEP_STAUTUS,0); - return ret; -} -int hg_scanner_302::get_device_paperon_stautus(void) -{ - std::lock_guard lock(io_lock_); - int ret =read_register(setting3399::SR_GET_PAPERON,0); - return ret; -} -int hg_scanner_302::writedown_device_configuration(bool type,setting_hardware::HGSCANCONF_3399 *dev_conf) -{ - int ret = SCANNER_ERR_OK; - if (!type) - return ret; - if (!dev_conf) - { - dev_conf_.params_3399.is_textcorrect = !keep_watermark_; - dev_conf = &dev_conf_; - } - if (is_multiout) - { - dev_conf->params_3399.color = image_prc_param_.bits.multi_out == MULTI_GRAY_AND_BW ? 0 : 1; - } - else if ((image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY - || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE) - && image_prc_param_.bits.rid_color != RID_COLOR_NONE) - { - dev_conf->params_3399.color = 1; - } - - - if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH - || image_prc_param_.bits.paper == PAPER_MAX_SIZE - || image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP - || image_prc_param_.bits.paper == PAPER_TRIGEMINY - || image_prc_param_.bits.paper == PAPER_16K - || image_prc_param_.bits.paper == PAPER_8K - || image_prc_param_.bits.paper == PAPER_16K_LATERAL - ) - { - dev_conf->params_3399.enable_sizecheck = false; - } - { - std::lock_guard lock(io_lock_); - ret = write_register(setting3399::SR_CONFIG_SCAN_PARAM, dev_conf->value); - } - - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "Writedown scanner configuration(0x%x) = %s\n", dev_conf->value, hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner_302::writedown_image_configuration(void) -{ - int ret = SCANNER_ERR_OK; - SCANCONF ic; - int len = sizeof(ic); - - bzero(&ic, len); - - if (image_prc_param_.bits.text_direction != TEXT_DIRECTION_AUTO) - ic.imageRotateDegree = (float)image_prc_param_.bits.text_direction; - else - ic.imageRotateDegree = 0; - ic.en_sizecheck = dev_conf_.params_3399.enable_sizecheck; - ic.hardwarecaps.en_skrewdetect = dev_conf_.params_3399.screw_detect_enable; - ic.hardwarecaps.en_doublefeed = dev_conf_.params_3399.ultrasonic_enable; - ic.hardwarecaps.en_stapledetect = dev_conf_.params_3399.staple_enbale; - ic.hardwarecaps.skrewdetectlevel = dev_conf_.params_3399.screw_detect_level; - if (test_1_paper_) - { - utils::log_info("scanning mode: testing ONE paper ...\n", LOG_LEVEL_DEBUG); - ic.scannum = /*ic.is_duplex ? 2 :*/ 1; - } - else - { - if (scan_count_ == -1) - ic.scannum = -1; - else - ic.scannum = (ic.is_duplex ? scan_count_ * 2 : scan_count_); - } - ic.contrast = contrast_;//(contrast_ - 4) * 333.0; - ic.brightness = bright_;// (bright_ - 128)* (2000.0 / 254.0); - image_configuration(ic); - - { - //std::lock_guard lock(io_lock_); - - //ret = io_->write_bulk(&ic, &len); - - //this_thread::sleep_for(chrono::milliseconds(500)); - //io_->set_timeout(2000);//蹇呰寤舵椂 - } - return ret; -} -int hg_scanner_302::pop_first_image(void) -{ - std::lock_guard lock(io_lock_); - int ret = write_register(setting3399::SR_IM_POP, 1); - char errbuf[40] = { 0 }; - - utils::to_log(LOG_LEVEL_DEBUG, "popup first image = %s\n", hg_scanner_err_name(ret, errbuf)); - - return ret; -} -int hg_scanner_302::read_one_image_from_usb(SANE_Image_Statu statu) -{ - int r = 0, - total = get_front_data_size(), - off = 0, - ret = SCANNER_ERR_OK; - bool popimg = false; - char errbuf[40] = { 0 }; - - utils::to_log(LOG_LEVEL_ALL, "New image size: %u\n", total); - if (!waiting_for_memory_enough(total)) - { - status_ = SCANNER_ERR_INSUFFICIENT_MEMORY; - - return status_; - } - //if (user_cancel_) - //return SCANNER_ERR_USER_CANCELED; - - if (total == -1) - ret = status_; - else - { - std::lock_guard lock(io_lock_); - std::shared_ptr buf(aquire_memory(total)); - if (!buf.get()) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - - // write reading command - buf->set_image_statu(statu); - ret = write_register(setting3399::SR_IM_TX, 1); - - if (ret == SCANNER_ERR_OK) - { - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - r = total; - { - void* buff = buf->data(off, (unsigned int*)&r); - - ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - while (buff) - { - ret = io_->read_bulk(buff, &r); - if (ret != SCANNER_ERR_OK) - break; - - off += r; - if (off >= total) - break; - - r = total - off; - buff = buf->data(off, (unsigned int*)&r); - } - } - utils::to_log(LOG_LEVEL_DEBUG, "Read image from USB = %s\n", hg_scanner_err_name(ret, errbuf)); - if (ret == SCANNER_ERR_OK) - { - //{ - // char f[128] = { 0 }; - // sprintf(f, "/tmp/usb_%02d.jpg", usb_img_index_); - // buf->to_file(f); - //} - ret = save_usb_data(buf); - if (ret == SCANNER_ERR_OK) - { - popimg = true; - } - else - { - utils::to_log(LOG_LEVEL_FATAL, "save usb data failed: %s\n", hg_scanner_err_name(ret, errbuf)); - } - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "Read image data from USB err: %s\n", hg_scanner_err_name(ret, errbuf)); - } - } - else - { - utils::to_log(LOG_LEVEL_FATAL, "write command SR_IM_TX failed: %s\n", hg_scanner_err_name(ret, errbuf)); - } - } - if(popimg) - pop_first_image(); - - return ret; -} -int hg_scanner_302::discard_all_images(void) -{ - char buf[32]; - setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; - int size = sizeof(buf), - oto = 0, - pre_img = 0, - pre_int = 0, - ret = SCANNER_ERR_OK; - - { - std::lock_guard lock(io_lock_); - oto = io_->get_timeout(); - io_->set_timeout(100); - ret = io_->read_interrupt(buf, &size); - } - while (ret == SCANNER_ERR_OK && size) - { - pre_int++; - if (info->From == setting3399::IMG) - { - while (get_image_count() > 0) - { - pop_first_image(); - pre_img++; - } - } - - size = sizeof(buf); - { - std::lock_guard lock(io_lock_); - ret = io_->read_interrupt(buf, &size); - } - } - { - std::lock_guard lock(io_lock_); - io_->set_timeout(oto); - } - if (pre_int) - utils::to_log(LOG_LEVEL_DEBUG, "prev-connection has left %d interrupt packet(s) && %d image(s).\n", pre_int, pre_img); - return 0; -} -int hg_scanner_302::get_roller_life(void) -{ - return pid_ == 302 ? 150000 : 200000; -} -int hg_scanner_302::on_color_mode_changed(int& color_mode) -{ - - dev_conf_.params_3399.color = (color_mode == COLOR_MODE_BLACK_WHITE || color_mode == COLOR_MODE_256_GRAY) ? 0 : 1; - - return SCANNER_ERR_OK; - - /*int ret = SCANNER_ERR_OK; - - if ((((color_mode == COLOR_MODE_24_BITS || color_mode == COLOR_MODE_AUTO_MATCH) && !dev_conf_.params_3399.color) || - ((color_mode != COLOR_MODE_24_BITS && color_mode != COLOR_MODE_AUTO_MATCH) && dev_conf_.params_3399.color)) && color_mode != -1) - { - dev_conf_.params_3399.color ^= 1; - ret = writedown_device_configuration(); - if (ret) - dev_conf_.params_3399.color ^= 1; - } - if (color_mode == COLOR_MODE_AUTO_MATCH) - { - dev_conf_.params_3399.color = 1; - } - return ret;*/ -} -int hg_scanner_302::on_paper_changed(int& paper) -{ - bool exact = true; - int ind = hgpaper_to_devspaper(paper_map_3399, ARRAY_SIZE(paper_map_3399), paper, &exact, &paper_size_), - ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT; - - if (dev_conf_.params_3399.paper != paper_map_3399[ind].dev_value) - { - int old = dev_conf_.params_3399.paper; - - dev_conf_.params_3399.paper = paper_map_3399[ind].dev_value; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.paper = old; - for (int i = 0; i < ARRAY_SIZE(paper_map_3399); ++i) - { - if (paper_map_3399[i].dev_value == old) - { - paper = paper_map_3399[i].paper; - break; - } - } - } - else if (!exact) - ret = SCANNER_ERR_NOT_EXACT; - } - - return ret; -} -int hg_scanner_302::on_paper_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.enable_sizecheck ^ check) - { - dev_conf_.params_3399.enable_sizecheck = check; - ret = writedown_device_configuration(); - - if (ret) - { - dev_conf_.params_3399.enable_sizecheck = !check; - check = dev_conf_.params_3399.enable_sizecheck; - } - } - if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH - ||image_prc_param_.bits.paper == PAPER_MAX_SIZE - ||image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP - ||image_prc_param_.bits.paper == PAPER_TRIGEMINY - ||image_prc_param_.bits.paper == PAPER_16K - ||image_prc_param_.bits.paper == PAPER_8K - ||image_prc_param_.bits.paper == PAPER_16K_LATERAL - ) - { - setting_hardware::HGSCANCONF_3399 *d = &dev_conf_; - d->params_3399.enable_sizecheck = false; - ret = writedown_device_configuration(d); - } - - - return ret; -} -int hg_scanner_302::on_resolution_changed(int& dpi) -{ - dev_conf_.params_3399.dpi = 1; //dpi 鍗庡噷cis鍜屾暒鍗梒is 榛樿鍙?鏃犻渶鏀瑰彉 - int ret = writedown_device_configuration(); - return ret; -} -int hg_scanner_302::on_ultrasonic_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.ultrasonic_enable ^ check) - { - dev_conf_.params_3399.ultrasonic_enable = check; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.ultrasonic_enable = !check; - check = dev_conf_.params_3399.ultrasonic_enable; - } - } - - return ret; -} -int hg_scanner_302::on_staple_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.staple_enbale ^ check) - { - dev_conf_.params_3399.staple_enbale = check; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.staple_enbale = !check; - check = dev_conf_.params_3399.staple_enbale; - } - } - - return ret; -} -int hg_scanner_302::on_skew_check_changed(bool& check) -{ - int ret = SCANNER_ERR_OK; - - if (dev_conf_.params_3399.screw_detect_enable ^ check) - { - dev_conf_.params_3399.screw_detect_enable = check; - ret = writedown_device_configuration(); - if (ret) - { - dev_conf_.params_3399.screw_detect_enable = !check; - check = dev_conf_.params_3399.screw_detect_enable; - } - } - - return ret; -} -int hg_scanner_302::on_skew_check_level_changed(int& check) -{ - int ret = SCANNER_ERR_OK, - val = check, - old = dev_conf_.params_3399.screw_detect_level; - setting_hardware::HGSCANCONF_3399 cf; - - cf.params_3399.screw_detect_level = -1; - - if (val < 0) - { - val = 0; - ret = SCANNER_ERR_NOT_EXACT; - } - else if (val > cf.params_3399.screw_detect_level) - { - val = cf.params_3399.screw_detect_level; - ret = SCANNER_ERR_NOT_EXACT; - } - if (val != dev_conf_.params_3399.screw_detect_level) - { - dev_conf_.params_3399.screw_detect_level = val; - ret = writedown_device_configuration(); - if (ret) - check = dev_conf_.params_3399.screw_detect_level = old; - } - if (ret == SCANNER_ERR_OK && val != check) - { - check = val; - ret = SCANNER_ERR_NOT_EXACT; - } - - return ret; -} -int hg_scanner_302::on_get_feedmode(int &feedmode)//鑾峰彇鍒嗙焊寮哄? -{ - int ret = SCANNER_ERR_OK, - val = 0; - - ret = read_register(setting3399::SR_GET_FEEDMODE,&feedmode); - return ret; -} -int hg_scanner_302::on_set_feedmode(int feedmode)//璁剧疆鍒嗙焊寮哄? -{ - int ret = SCANNER_ERR_OK, - val = 0; - - ret = write_register(setting3399::SR_SET_FEEDMODE,feedmode); - - return ret; -} -int hg_scanner_302::on_pic_type(bool& pic) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::on_pick_paper(bool autostrength) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::on_pick_paper_threshold(double threshold) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::on_is_auto_paper(bool isautopaper) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::on_cis_get_image(bool isautopaper) -{ - is_cis_image = isautopaper; - dev_conf_.params_3399.pc_correct = isautopaper; - return writedown_device_configuration(); -} -void hg_scanner_302::on_device_reconnected(void) -{ - int ret = writedown_device_configuration(); - init_version(); - - rewrite_conf_ = ret != SCANNER_ERR_OK; - if (reset_) - { - reset_ = false; - start(); - } -} -int hg_scanner_302::on_scanner_closing(bool force) -{ - return SCANNER_ERR_OK; -} -void hg_scanner_302::thread_handle_usb_read(void) -{ - char buf[32] = { 0 }; - setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; - int size = sizeof(buf), - ret = SCANNER_ERR_OK, - to_cnt = 0, - count = 0; - bool go = true; - char errbuf[40] = { 0 }; - - while (run_ && go) - { - size = sizeof(buf); - memset(buf, 0, size); - { - std::lock_guard lock(io_lock_); - - ret = io_->read_interrupt(buf, &size); - } - if (ret != SCANNER_ERR_OK && ret != SCANNER_ERR_TIMEOUT) - { - utils::to_log(LOG_LEVEL_DEBUG, "read-INT = %s: From(%d), Code(%d), Index(%d), size = %d\n", hg_scanner_err_name(ret, errbuf), - info->From, info->Code, info->Img_Index, size); - } - - if (ret != SCANNER_ERR_OK) - { - if (ret == SCANNER_ERR_TIMEOUT) - { - if (to_cnt++ < 30) - { - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - //int statu = get_status(); - //if ((statu & 0x03) == 0) - //{ - // utils::to_log(LOG_LEVEL_FATAL, "USB thread over with status: 0x%x\n", statu); - // status_ = SCANNER_ERR_OK; - // break; - //} - continue; - } - } - status_ = ret; - break; - } - - to_cnt = 0; - if (size == sizeof(buf)) - { - ret = settings302::device_status_to_hg_err(info); - utils::to_log(LOG_LEVEL_DEBUG, "status from interrupt point is '%s'\n", hg_scanner_err_name(status_, errbuf)); - - if (ret != SCANNER_ERR_OK && ret != SCANNER_ERR_TIMEOUT && ret != SCANNER_ERR_DEVICE_STOPPED) - { - //if (!is_dev_image_process_done()) - { - int st = ret, count = 0, statu = last_usb_image_statu(st); - //while (!is_dev_image_process_done()) - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - - while ((count = get_image_count()) > 0) - { - int s = IMG_STATUS_OK; - if (count <= 2) - { - if (image_prc_param_.bits.page == PAGE_SINGLE) - s = count == 1 ? statu : s; - else - s = statu; - } - ret = read_one_image_from_usb((SANE_Image_Statu)s); - count++; - if (ret != SCANNER_ERR_OK - && ret != SCANNER_ERR_CREATE_FILE_FAILED - && ret != SCANNER_ERR_WRITE_FILE_FAILED) - break; - } - status_ = st; - } - - utils::to_log(LOG_LEVEL_WARNING, "\346\211\253\346\217\217\345\244\261\350\264\245, read interrupt\350\277\224\345\233\236\347\212\266\346\200\201\344\270\272\357\274\232%s\n", hg_scanner_err_description(status_)); - break; - } - - switch (info->From) - { - case setting3399::IMG: - if (get_image_count() > 0) - { - read_one_image_from_usb(); - } - else - { - utils::to_log(LOG_LEVEL_DEBUG, "receive IMG event but no image count(%d)!", get_image_count()); - } - break; - case setting3399::V4L2: - utils::to_log(LOG_LEVEL_FATAL, "V4L2 error: %d\n", info->Code); - { - bool cancel = user_cancel_; - do_stop(); - user_cancel_ = cancel; - go = false; - } - break; - case setting3399::STOPSCAN: - go = false; - utils::log_info("Received STOPSCAN event ...\n", LOG_LEVEL_ALL); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - while (get_image_count() > 0) // lost IMG message, check image count to receive rest images (BUG-228)... - { - ret = read_one_image_from_usb(); - if (ret != SCANNER_ERR_OK) - { - status_ = ret; - break; - } - } - break; - default: - break; - } - if (!go) - break; - } - else - utils::to_log(LOG_LEVEL_DEBUG, "read %d bytes, sizeof(buf) = %d\n", size, sizeof(buf)); - - this_thread::sleep_for(chrono::milliseconds(10)); - } - utils::to_log(LOG_LEVEL_DEBUG, "USB thread exit with code: %s, status = %s\n", hg_scanner_err_name(ret, errbuf), hg_scanner_err_name(status_, errbuf)); -} -int hg_scanner_302::do_start(void) -{ - - bool handled = false; - int ret = try_third_app_handle_start(handled), - val = 0; - char errbuf[40] = { 0 }; - - // for third-sane-app invoking, added on 2022-05-19 - if (handled) - return ret; - - user_cancel_ = false; - split3399_ = 0; - cb_mem_ = true; - utils::to_log(LOG_LEVEL_DEBUG, "scanner status: 0x%x\n", get_status()); - - reset(); - - ret = writedown_device_configuration(true); - if (ret == SCANNER_ERR_OK) - writedown_image_configuration(); - else - { - status_ = ret; - return ret; - } - val = 0; - { - std::lock_guard lock(io_lock_); - ret = read_register(/*SR_GET_ANDROID_STATE*/0x1001, &val); - } - - while (val) - { - if (val == 1) - ret = status_ = SCANNER_ERR_DEVICE_COVER_OPENNED; - else if (val == 2) - ret = status_ = SCANNER_ERR_DEVICE_PAPER_JAMMED; - else if (val == 3) - ret = status_ = SCANNER_ERR_DEVICE_NO_PAPER; - else if (val == 5) - ret = status_ = SCANNER_ERR_DEVICE_ISLOCK; - else - { - ret = status_ = SCANNER_ERR_DEVICE_UNKNOWN_STATUS; - utils::to_log(LOG_LEVEL_WARNING, "The device is abnormal(%d) and can not be scanned : %s\n", val, hg_scanner_err_name(ret, errbuf)); - //break; - } - - utils::to_log(LOG_LEVEL_WARNING, "failed on SR_GET_ANDROID_STATE(%d) result: %s\n", val, hg_scanner_err_name(ret, errbuf)); - return ret; - } - - int count = scan_count_; - if (test_1_paper_) - count = 1; - - { - std::lock_guard lock(io_lock_); - write_register(0x1000, count); - ret = write_command(setting3399::SC_START); - } - utils::to_log(LOG_LEVEL_WARNING, "start result: %s\n", hg_scanner_err_name(ret, errbuf)); - - if (ret == SCANNER_ERR_OK) - { - wait_usb_.notify(); - this_thread::sleep_for(chrono::milliseconds(100)); - ret = try_third_app_after_start(ret); - } - else - { - status_ = ret; - utils::to_log(LOG_LEVEL_WARNING, "(Thread 0x%x)Send start command = %s\n", GetCurrentThreadId(), hg_scanner_err_name(ret, errbuf)); - } - - return ret; -} -int hg_scanner_302::do_stop(void) -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK; - - user_cancel_ = true; - ret = write_command(setting3399::SC_STOP); -// io_->set_timeout(500); - //final_imgs_.clear(); - - return ret; -} -int hg_scanner_302::reset(void) -{ - imgs_.Clear(); // move from scanning done - final_imgs_.clear(); - discard_all_images(); - - return status_; -} -int hg_scanner_302::device_io_control(unsigned long code, void* data, unsigned* len) -{ - int ret = SCANNER_ERR_OUT_OF_RANGE; - - if (IO_CTRL_CODE_TEST_SINGLE == code) - { - test_1_paper_ = true; - ret = start(); - } - else - ret = hg_scanner::device_io_control(code, data, len); - - return ret; -} -std::string hg_scanner_302::get_firmware_version(void) -{ - std::lock_guard lock(io_lock_); - return control_fetch(setting3399::SR_GET_FWVERSION, 0, 512); -} -std::string hg_scanner_302::get_serial_num(void) -{ - std::lock_guard lock(io_lock_); - return control_fetch(setting3399::SR_GET_SERIALNUM, 0, 512); -} -std::string hg_scanner_302::get_ip(void) -{ - std::lock_guard lock(io_lock_); - return control_fetch(setting3399::SR_GET_IPADDR, 0, 512); -} - -int hg_scanner_302::set_clear_roller_num(void) -{ - //std::lock_guard lock(io_lock_); - //int val = 0, - // ret = read_register(setting3399::SR_CLR_ROLLER_NUM, &val); - - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_clear_history_num(void) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_CLR_SCANN_NUM, &val); - - return ret; -} -int hg_scanner_302::set_serial_num(string str) -{ - std::lock_guard lock(io_lock_); - int len = str.size(), - ret = write_register(setting3399::SR_SET_SERIALNUM, len); - if (ret == SCANNER_ERR_OK) - { - ret = io_->write_bulk(&str[0], &len); - } - return ret; -} -int hg_scanner_302::set_vid_pid(int data) -{ - std::lock_guard lock(io_lock_); - return write_register(setting3399::SR_SET_USBVIDPID, data); -} -int hg_scanner_302::get_vid_pid(int& data) -{ - std::lock_guard lock(io_lock_); - return read_register(setting3399::SR_GET_USBVIDPID, &data); -} -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int hg_scanner_302::set_leaflet_scan(void) -{ - int ret = SCANNER_ERR_OK; - test_1_paper_ = true; - - ret = start(); - return ret; -} - -int hg_scanner_302::get_device_code(void) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::get_sleep_time(int& data) -{ - std::lock_guard lock(io_lock_); - int val = 0; - int ret = read_register(setting3399::SR_GET_SLEEPTIME, &val); - - if (ret == SCANNER_ERR_OK) - { - save_sleeptime_type_ = true; - data = val; - } - - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "get_sleep_time = %d with %s\n", data, hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner_302::set_sleep_time(int setsleepime) -{ - std::lock_guard lock(io_lock_); - int ret = write_register(setting3399::SR_SET_SLEEPTIME, setsleepime); - - char errbuf[40] = { 0 }; - utils::to_log(LOG_LEVEL_DEBUG, "set sleep time to %d = %s\n", setsleepime, hg_scanner_err_name(ret, errbuf)); - - return ret; -} - -int hg_scanner_302::get_scanner_paperon(SANE_Bool& type) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = read_register(setting3399::SR_GET_PAPERON, &val); - - if (ret == SCANNER_ERR_OK) - { - type = val == 0 ? false : true;; - } - return ret; -} - -int hg_scanner_302::get_scan_is_sleep(SANE_Bool& type) -{ - std::lock_guard lock(io_lock_); - int ret = 0, val; - ret = read_register(setting3399::SR_GET_SLEEP_STAUTUS, &val); //0浼戠? 1鍞ら啋鐘舵€? - if (ret == SCANNER_ERR_OK) - { - type = val == 1 ? true : false; - } - return ret; -} -int hg_scanner_302::get_device_log(string &log) -{ - std::lock_guard lock(io_lock_); - int ret = SCANNER_ERR_OK; - char errbuf[40] = { 0 }; - - int len = log.size(); - ret = write_register(setting3399::SR_SET_JSON_PATH, len); - if (ret == SCANNER_ERR_OK) - ret = io_->write_bulk(&log[0],&len); - - utils::to_log(LOG_LEVEL_DEBUG, "log path:%s ret:%s\n", log.c_str(),hg_scanner_err_name(ret, errbuf)); - return ret; -} -int hg_scanner_302::set_devreboot(int data) -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = write_register(setting3399::SR_REBOOT, val); - - if (ret != SCANNER_ERR_OK) - return ret; -} -int hg_scanner_302::set_devshtudown() -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = write_register(setting3399::SR_POWEROFF, val); - - if (ret != SCANNER_ERR_OK) - return ret; -} -int hg_scanner_302::set_scan_islock(SANE_Bool type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::get_scan_islock(SANE_Bool& type) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_scan_lock_check_val(string str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_firmware_upgrade(std::string str) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_clean_paper_road() -{ - std::lock_guard lock(io_lock_); - int ret = 0, len = 0; - ret = write_register(setting3399::SR_CLEAN_PAPER_ROAD, len); - return ret; -} -int hg_scanner_302::get_dev_islock_file(int& data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_dev_islock_file(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_speed_mode(int data) -{ - return write_register(setting3399::SR_SET_SPEEDMODE, data); -} -int hg_scanner_302::get_speed_mode(int& data) -{ - return read_register(setting3399::SR_SET_SPEEDMODE, &data); -} -int hg_scanner_302::set_devs_distortion_check_val(float data) -{ - std::lock_guard lock(io_lock_); - setting3399::Scanner_Reg_Defs retio = setting3399::SR_SET_V_200_RATIO; - if (resolution_ <= 200) - retio = setting3399::SR_SET_V_200_RATIO; - else if (resolution_ > 200 && resolution_ <= 300) - retio = setting3399::SR_SET_V_200_RATIO; - else if (resolution_ > 300 && resolution_ <= 600) - retio = setting3399::SR_SET_V_200_RATIO; - - return write_register(retio, *(int*)&save_dpi_color_check_val); -} -int hg_scanner_302::get_devs_distortion_check_val(float& data) -{ - std::lock_guard lock(io_lock_); - int val = 0; - setting3399::Scanner_Reg_Defs ratio = setting3399::SR_GET_V_200_RATIO; - if (resolution_ <= 200) - ratio = setting3399::SR_GET_V_200_RATIO; - else if (resolution_ > 200 && resolution_ <= 300) - ratio = setting3399::SR_GET_V_200_RATIO; - else if (resolution_ > 300 && resolution_ <= 600) - ratio = setting3399::SR_GET_V_200_RATIO; - - int ret = read_register(ratio, &val); - data = *(float*)&val; - return ret; -} -int hg_scanner_302::set_auto_flat(int data) -{ - return SCANNER_ERR_DEVICE_NOT_SUPPORT; -} -int hg_scanner_302::set_notify_sleep() -{ - std::lock_guard lock(io_lock_); - int val = 0, - ret = write_register(setting3399::SR_NOTIFY_SLEEP, val); - - return ret; -} -int hg_scanner_302::get_roller_num(int& num) -{ - std::lock_guard lock(io_lock_); - int ret = read_register(setting3399::SR_GET_ROLLER_NUM, &num); - return ret; -} -int hg_scanner_302::get_history_scan_count(int& val) -{ - std::lock_guard lock(io_lock_); - int ret = read_register(setting3399::SR_GET_SCANN_NUM, &val); - return ret; -} \ No newline at end of file diff --git a/hgdriver/hgdev/hg_scanner_302.h b/hgdriver/hgdev/hg_scanner_302.h deleted file mode 100644 index 2079d6f..0000000 --- a/hgdriver/hgdev/hg_scanner_302.h +++ /dev/null @@ -1,135 +0,0 @@ -#pragma once - -// hg_scanner is the base class of kinds of scanners -// -// created on 2022-01-30 -// -#include -#include -#include -#include -#include - -#include "hg_scanner.h" - -//#ifdef OEM_HANWANG -//#define hg_scanner_302 hw_scanner_302 -//#elif defined(OEM_LISICHENG) -//#define hg_scanner_302 lsc_scanner_302 -//#endif - -class hg_scanner_302 : public hg_scanner -{ - //BlockingQueue>> final_imgs_; // JPG ... -// image_data final_imgs_; // JPG .. - - setting_hardware::HGSCANCONF_3399 dev_conf_; - bool rewrite_conf_; - bool reset_; - - int read_register(int addr, int* val); - int write_register(int addr, int val); - int write_command(int cmd); - std::string control_fetch(int addr, int val, int size); - - std::string get_fpga(void); - int clr_roller_num(void); - int get_sleep_time(void); - int get_scan_mode(void); - int get_status(void); - bool is_dev_tx(void); - bool is_dev_image_process_done(void); - bool is_dev_image_keep_last_paper(void); - int get_scanned_count(void); - int get_image_count(void); - int get_front_data_size(void); - void init_version(void); - int get_device_sleep_stautus(void); - int get_device_paperon_stautus(void); - - int writedown_device_configuration(bool type =false,setting_hardware::HGSCANCONF_3399 *dev_conf = NULL); - int writedown_image_configuration(void); - int pop_first_image(void); - - int read_one_image_from_usb(SANE_Image_Statu statu = IMG_STATUS_OK); - virtual int discard_all_images(); - virtual int get_roller_life(void) override; - -protected: - virtual void on_device_reconnected(void) override; - virtual int on_scanner_closing(bool force) override; - virtual void thread_handle_usb_read(void) override; -protected: - virtual int on_color_mode_changed(int& color_mode) override; //颜色切换 - virtual int on_paper_changed(int& paper) override; //纸张大小设置 - virtual int on_paper_check_changed(bool& check) override; //尺寸检测 - virtual int on_resolution_changed(int& dpi) override; //分辨率设置 - virtual int on_ultrasonic_check_changed(bool& check) override; //设置超声波检测 - virtual int on_staple_check_changed(bool& check) override; //设置订书针检测 - virtual int on_skew_check_changed(bool& check) override; //设置歪斜检测 - virtual int on_skew_check_level_changed(int& check) override; //设置歪斜检测强度 - virtual int on_get_feedmode(int& feedmode) override; //获取分纸强度 - virtual int on_set_feedmode(int feedmode) override; //设置分纸强度 - virtual int on_pic_type(bool& pic)override; //照片模式或者文本模式 - virtual int on_pick_paper(bool autostrength)override; //自动分纸强度 - virtual int on_pick_paper_threshold(double threshold)override; - virtual int on_is_auto_paper(bool isautopaper)override; //待纸扫描 - virtual int on_cis_get_image(bool isautopaper) override; //cis 原图获取 - - -public: - hg_scanner_302(const char* dev_name, const char* model, int pid,usb_io* io); - ~hg_scanner_302(); - -public: - virtual int do_start(void) override; - virtual int do_stop(void) override; - - virtual int reset(void) override; - virtual int device_io_control(unsigned long code, void* data, unsigned* len) override; - -public: - //////////////固定的硬件信息设置或获取////////////// - virtual std::string get_firmware_version(void)override; - virtual std::string get_serial_num(void)override; - virtual std::string get_ip(void)override; - - virtual int set_serial_num(string str) override; //设置序列号 - virtual int set_vid_pid(int data) override; //设置vidpid - virtual int get_vid_pid(int& data)override; //获取vidpid - - /////////////////成功返回:SCANNER_ERR_OK ///////////// - /////////////////失败返回:IO错误码 ///////////// - virtual int set_leaflet_scan(void) override; //单张扫描 - - virtual int set_clear_roller_num(void) override; //清除滚轴计数 - virtual int set_clear_history_num(void) override; //清除历史张数 - - virtual int get_device_code(void); //获取设备编码 不支持 - - virtual int get_scanner_paperon(SANE_Bool& type) override; //获取设备有无纸张 /*/ type : 0无纸 1有纸 */ - - virtual int get_scan_is_sleep(SANE_Bool& type) override; //获取设备是否休眠当中 /*/ type : 0休眠 1唤醒状态*/ - virtual int get_sleep_time(int& data) override; //获取功耗模式(休眠) /*/ data > 0*/ - virtual int set_sleep_time(int data) override; //设置功耗模式(休眠) /*/ data > 0*/ - virtual int get_history_scan_count(int& data) override; //获取历史扫描张数 /*/ data > 0*/ - virtual int get_roller_num(int& data) override; //获取滚轮张数 /*/ data > 0*/ - virtual int set_notify_sleep(void) override; //唤醒设备 - virtual int get_device_log(string& log) override; //获取设备日志 /*/ log :储存路径*/ - virtual int set_devreboot(int data) override; //设置设备重启 - virtual int set_devshtudown() override; //设置设备关机 - virtual int set_scan_islock(SANE_Bool type) override; //设置设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int get_scan_islock(SANE_Bool& type) override; //获取设备是否锁定 /*/ type:0解锁,1锁定*/ - virtual int set_scan_lock_check_val(string str) override; //获取设备是否锁定 /*/ str:校验码*/ - virtual int set_firmware_upgrade(std::string str) override; //固件升级 /*/ str:文件名路径*/ - virtual int set_clean_paper_road() override; //清理纸道 - virtual int get_dev_islock_file(int& data) override; //获取设备文件 /*/ data:0 未上锁,1 上锁。-1 未发现黑名单列表 -2列表没有信息*/ - virtual int set_dev_islock_file(int data) override; //设置设备文件 /*/ data:0 未上锁,1 上锁*/ - virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,70 - virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:40,50,60,70 - virtual int set_devs_distortion_check_val(float data) override; //设置畸变矫正 - virtual int get_devs_distortion_check_val(float& data) override; //获取设备畸变值 - virtual int set_auto_flat(int data) override; //设置自动平场校正 - // data:0(ALL) 1(200dpi、gray) 2(200dpi、color) 3(300dpi、gray) 4(300dpi、color) 5(600dpi、gray) 6(600dpi、color) - -}; diff --git a/hgdriver/hgdev/image_process.cpp b/hgdriver/hgdev/image_process.cpp deleted file mode 100644 index ec2ee65..0000000 --- a/hgdriver/hgdev/image_process.cpp +++ /dev/null @@ -1,2017 +0,0 @@ -#include "image_process.h" - -#include "../../sdk/hginclude/utils.h" -#include "../../sdk/hginclude/huagaoxxx_warraper_ex.h" -#include - -#include -#include -#if !defined(WIN32) && !defined(_WIN64) -#include -#define BI_RGB 0 -#define MAKEWORD(a, b) (((a) & 0x0ff) | (((b) & 0x0ff) << 8)) -#define MAKELONG(a, b) (((a) & 0x0ffff) | (((b) & 0x0ffff) << 16)) -#else -#include -#include -#pragma comment(lib, "Shell32.lib") -#pragma comment(lib, "hanwangOCRdetect.lib") -#endif -#include -#include "ImageMatQueue.h" - -#include "ImageMultiOutput.h" -#include "PaperSize.h" -#include "imgproc/HGOCR.h" -#if defined(WIN32) || defined(_WIN64) -#include "scanner_manager.h" -#include "ocr/hanwangOCRdetect.h" -#else -#include -extern "C" -{ - #include "ocr/hanwangOCRdetect.h" -} -#endif -#include "hg_ipc.h" -#include "../ImageProcess/G4Tiff.h" -#include "base/HGImage.h" -#include -#define CV_MAT_DEPTH_SET(flags, depth) (((flags) & ~(CV_MAT_DEPTH_MASK)) | (depth & CV_MAT_DEPTH_MASK)) - - -using namespace std; -#define GET_BYTE(a) ((a) & 0x0ff) -#define MAKE_INT(a, b, c, d) (GET_BYTE(a) | (GET_BYTE(b) << 8) | (GET_BYTE(c) << 16) | (GET_BYTE(d) << 24)) -#define IMAGE_DATA_BUF_CVMAT (void*)MAKE_INT('M', 'T', 'R', 'X') -#define IMAGE_DATA_BUF_CHAR (void*)MAKE_INT('C', 'H', 'A', 'R') - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// functional ... -//////////////////////////////////////////////////////////////////////////////// -// -#ifndef WIN32 -#define __stdcall -#endif - -#define SAFE_DELETE(p){ \ -if (NULL != (p)) {delete []p; \ - (p) = NULL; \ -}\ -} - -#if defined(WIN32) || defined(_WIN64) -static int load_dll(const wchar_t* path_dll, HMODULE* dll) -{ - - HMODULE h = LoadLibraryW(path_dll); - int ret = GetLastError(); - wchar_t info[128] = { 0 }; - - swprintf_s(info, _countof(info) - 1, L" = %d\r\n", ret); - OutputDebugStringW((L"[TWAIN]Load: " + std::wstring(path_dll) + info).c_str()); - if (!h && ret == ERROR_MOD_NOT_FOUND) - { - std::wstring dir(path_dll); - size_t pos = dir.rfind(L'\\'); - wchar_t path[MAX_PATH] = { 0 }; - - GetDllDirectoryW(_countof(path) - 1, path); - if (pos != std::wstring::npos) - dir.erase(pos); - OutputDebugStringW((L"[TWAIN]Load: try change directory to " + dir + L"\r\n").c_str()); - SetDllDirectoryW(dir.c_str()); - h = LoadLibraryW(path_dll); - ret = GetLastError(); - swprintf_s(info, _countof(info) - 1, L" = %d\r\n", ret); - OutputDebugStringW((L"[TWAIN]Load: " + std::wstring(path_dll) + info).c_str()); - OutputDebugStringW((L"[TWAIN]Load: restore directory to " + std::wstring(path) + L"\r\n").c_str()); - SetDllDirectoryW(path); - } - - if (dll) - *dll = h; - - return ret; -} - -static int strToWchar(string str, wchar_t* s) -{ - if (str.empty() || !s) - { - return -1; - } - size_t size = str.length(); - //获取缓冲区大小,并申请空间,缓冲区大小按字符计算 - int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), size, NULL, 0); - wchar_t* buffer = new wchar_t[size + 1]; - MultiByteToWideChar(CP_ACP, 0, str.c_str(), size, buffer, len); - buffer[len] = '\0'; - wcscpy(s, buffer); - if (!buffer || !s) - return -1; - delete []buffer; - buffer = NULL; - return 0; -} -#endif -namespace hg_imgproc -{ - typedef union - { - unsigned char ch; - struct - { - unsigned char bit0 : 1; - unsigned char bit1 : 1; - unsigned char bit2 : 1; - unsigned char bit3 : 1; - unsigned char bit4 : 1; - unsigned char bit5 : 1; - unsigned char bit6 : 1; - unsigned char bit7 : 1; - }bits; - }BITS; - class bit_stream - { - unsigned char* byte_stream_; - bool lsb_first_; // whether the Lowest_bit is first pop ... - int offset_; - - public: - bit_stream(unsigned char* data, bool lsb_first = true) : byte_stream_(data), lsb_first_(lsb_first) - , offset_(0) - {} - ~bit_stream() - {} - - public: - void reset(int off = 0) - { - offset_ = off; - } - unsigned char get(void) - { - unsigned char ret = 0; - - if (lsb_first_) - ret = (byte_stream_[offset_ / 8] >> (offset_ % 8)) & 1; - else - ret = (byte_stream_[offset_ / 8] >> (7 - (offset_ % 8))) & 1; - - offset_++; - - return ret; - } - }; - - typedef unsigned int (__stdcall *SDKHGImgProc_InitOCR_)(unsigned int ocrtype, void** pstOcrHandle); - typedef unsigned int (__stdcall *SDKHGImgProc_FreeImage_)(void* pstOcrHandle); - typedef unsigned int (__stdcall *SDKHGImgProc_GetTextDir_)(void* pstOcrHandle, void* image, unsigned int* pDirect); - - typedef unsigned int (__stdcall *SDKHGBase_CreateImage_)(void* data, void* imageinfo, void* image); - typedef unsigned int (__stdcall *SDKHGBase_FreeImage_)(void* image); - class imgproc - { - bool isx86_Advan_ = true; - std::string my_path_; - IMGPRCPARAM param_; - SCANCONF img_conf_; - std::shared_ptr raw_data_; - std::shared_ptr> buffer_; - std::vector mats_; - int pid_; - Device::PaperSize papersize_; - SANE_Image_Statu img_statu_; - - SDKHGImgProc_InitOCR_ ocrinit_; - SDKHGImgProc_GetTextDir_ ocrgetdirectimage_; - SDKHGImgProc_FreeImage_ ocrexit_; - - SDKHGBase_CreateImage_ HGBase_CreatImg; - SDKHGBase_FreeImage_ HGBase_FreeImg; - - void* Auto_Txt_pHanld; -#ifndef WIN32 - void *Dynamicopen_HGBase_pHandle_; - void *Dynamicopen_HGImageprc_pHandle_; -#else - HINSTANCE Dynamicopen_HGBase_pHandle_; - HINSTANCE Dynamicopen_HGImageprc_pHandle_; -#endif - - void swap_rgb(cv::Mat& mat) - { - unsigned char* first = (unsigned char*)mat.data, - * oper = first; - int line_bytes = mat.rows ? mat.total() * mat.channels() / mat.rows : mat.cols * mat.channels(); - for (int i = 0; i < mat.rows; ++i) - { - oper = first; - for (int j = 0; j < mat.cols; ++j) - { - unsigned char ch = oper[0]; - oper[0] = oper[2]; - oper[2] = ch; - oper += 3; - } - first += line_bytes; - } - } - // construction - public: - imgproc(int pid, bool isx86_Advan) : pid_(pid),papersize_(pid_) - , img_statu_(IMG_STATUS_OK) - , my_path_(utils::get_module_full_path()) - ,ocrinit_(NULL),ocrgetdirectimage_(NULL) - ,ocrexit_(NULL),HGBase_CreatImg(NULL) - ,HGBase_FreeImg(NULL),Auto_Txt_pHanld(NULL) - ,Dynamicopen_HGBase_pHandle_(NULL) - ,Dynamicopen_HGImageprc_pHandle_(NULL),isx86_Advan_(isx86_Advan) - { - size_t pos = my_path_.rfind(PATH_SEPARATOR[0]); - if(pos++ == std::string::npos) - pos = 0; - my_path_.erase(pos); - - cv::setUseOptimized(isx86_Advan_); //开关cpu高级指令? - } - ~imgproc() - { - free_auto_txt_hanld(); -#ifdef FREE_GLOBAL_OBJECTS - cv::unload(); -#endif - } - - // load data - public: - int load_raw_data(std::shared_ptr buff) - { - int ret = SCANNER_ERR_INSUFFICIENT_MEMORY; - - buffer_.reset(new std::vector(buff->size())); - if (buffer_.get()) - { - unsigned int total = buff->size(), - off = 0, size = total; - unsigned char* mem = buff->data(off, &size); - while (mem) - { - memcpy(buffer_->data(), mem, size); - off += size; - if (off >= total) - { - ret = SCANNER_ERR_OK; - break; - } - - size = total - off; - mem = buff->data(off, &size); - } - } - mats_.clear(); - img_statu_ = (SANE_Image_Statu)buff->get_image_statu(); - - return ret; - } - int load_file(const char* path_file) - { - mats_.clear(); - - FILE* src = fopen(path_file, "rb"); - if (!src) - return SCANNER_ERR_OPEN_FILE_FAILED; - - long len = 0; - fseek(src, 0, SEEK_END); - len = ftell(src); - fseek(src, 0, SEEK_SET); - if (len > 1 * 1024 * 1024 * 1024) - { - fclose(src); - - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - raw_data_.reset(new std::string()); - raw_data_->resize(len); - fread(&(*raw_data_)[0], 1, len, src); - fclose(src); - - return SCANNER_ERR_OK; - } - // image-processing - public: - int init_auto_txt_hanld() - { - int ret = 0; - string scanner_path = utils::get_module_full_path(MODULE_NAME_SCANNER); - size_t pos = scanner_path.rfind(PATH_SEPARATOR[0]); - - if (scanner_path.empty()) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - if(pos++ == std::string::npos) - pos = 0; - scanner_path.erase(pos); - -#ifndef WIN32 - string HGImagePrclib_path = scanner_path + IMGPRC_LIBNANE; - string HGBaselib_path = scanner_path + HGBASE_LIBNAME; - - printf("get auto txt path is:%s\r\n", scanner_path.c_str()); - - if (access(HGBaselib_path.c_str(), F_OK) != 0 && access(HGImagePrclib_path.c_str(), F_OK) != 0) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - printf("HGBaselib_path?s HGImagePrclib_path:%s\r\n",HGBaselib_path.c_str(),HGImagePrclib_path.c_str()); - - Dynamicopen_HGImageprc_pHandle_ = dlopen(HGImagePrclib_path.c_str(), RTLD_LAZY); - Dynamicopen_HGBase_pHandle_ = dlopen(HGBaselib_path.c_str(), RTLD_LAZY); - - if (!Dynamicopen_HGBase_pHandle_ || !Dynamicopen_HGImageprc_pHandle_) - { - utils::to_log(LOG_LEVEL_DEBUG, "auto txt open dll is error: %s\n", "SCANNER_ERR_INSUFFICIENT_MEMORY"); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - ocrinit_ = (SDKHGImgProc_InitOCR_)dlsym(Dynamicopen_HGImageprc_pHandle_, "HGImgProc_CreateOCRMgr"); - ocrgetdirectimage_ = (SDKHGImgProc_GetTextDir_)dlsym(Dynamicopen_HGImageprc_pHandle_, "HGImgProc_ImageTextDirectOCR"); - ocrexit_ = (SDKHGImgProc_FreeImage_)dlsym(Dynamicopen_HGImageprc_pHandle_, "HGImgProc_DestroyOCRMgr"); - - HGBase_CreatImg = (SDKHGBase_CreateImage_)dlsym(Dynamicopen_HGBase_pHandle_,"HGBase_CreateImageWithData"); - HGBase_FreeImg = (SDKHGBase_FreeImage_)dlsym(Dynamicopen_HGBase_pHandle_,"HGBase_DestroyImage"); - -#else - //string scanner_path = hg_log::get_module_full_path("scanner.dll"); - //scanner_path = scanner_path.substr(0, scanner_path.size() - strlen("scanner.dll")); - - string HGImagePrclib_path = scanner_path + IMGPRC_LIBNANE; - string HGBaselib_path = scanner_path + HGBASE_LIBNAME; - - wchar_t* Prclibbuffer = new wchar_t[HGImagePrclib_path.length() + 1]; - wchar_t* Baselibbuffer = new wchar_t[HGBaselib_path.length() + 1]; - - ret = strToWchar(HGImagePrclib_path, Prclibbuffer); - if (ret == -1 ) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - ret = strToWchar(HGBaselib_path, Baselibbuffer); - if (ret == -1) - return SCANNER_ERR_INSUFFICIENT_MEMORY; - - load_dll(Baselibbuffer, &Dynamicopen_HGBase_pHandle_); //先加载后释放 - load_dll(Prclibbuffer, &Dynamicopen_HGImageprc_pHandle_); //windows下可能会找不到他所在的依赖库导致直接打开动态库的时候找不到模块 - - SAFE_DELETE(Prclibbuffer); - SAFE_DELETE(Baselibbuffer); - - //int l = GetLastError(); - - if (!Dynamicopen_HGBase_pHandle_ || !Dynamicopen_HGImageprc_pHandle_) - { - utils::to_log(LOG_LEVEL_DEBUG, "auto txt open dll is error: %s\n", "SCANNER_ERR_INSUFFICIENT_MEMORY"); - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - ocrinit_ = (SDKHGImgProc_InitOCR_)GetProcAddress(Dynamicopen_HGImageprc_pHandle_, "HGImgProc_CreateOCRMgr"); - ocrgetdirectimage_ = (SDKHGImgProc_GetTextDir_)GetProcAddress(Dynamicopen_HGImageprc_pHandle_, "HGImgProc_ImageTextDirectOCR"); - ocrexit_ = (SDKHGImgProc_FreeImage_)GetProcAddress(Dynamicopen_HGImageprc_pHandle_, "HGImgProc_DestroyOCRMgr"); - - HGBase_CreatImg = (SDKHGBase_CreateImage_)GetProcAddress(Dynamicopen_HGBase_pHandle_, "HGBase_CreateImageWithData"); - HGBase_FreeImg = (SDKHGBase_FreeImage_)GetProcAddress(Dynamicopen_HGBase_pHandle_, "HGBase_DestroyImage"); - - -#endif - ocrinit_(HGIMGPROC_OCRALGO_TESSERACT, &Auto_Txt_pHanld); - - return ret; - } - int free_auto_txt_hanld() - { - int ret = 0; - if (Auto_Txt_pHanld) - { - int ret = ocrexit_(Auto_Txt_pHanld); - Auto_Txt_pHanld = NULL; - } - if (Dynamicopen_HGImageprc_pHandle_) - { -#if (!defined WIN32) - ret = dlclose(Dynamicopen_HGImageprc_pHandle_); -#else - ret = FreeLibrary(Dynamicopen_HGImageprc_pHandle_); -#endif - Dynamicopen_HGImageprc_pHandle_ = NULL; - } - - if (Dynamicopen_HGBase_pHandle_) - { -#if (!defined WIN32) - ret = dlclose(Dynamicopen_HGBase_pHandle_); -#else - ret = FreeLibrary(Dynamicopen_HGBase_pHandle_); //貌似加载顺序不对,会导致这个地方的死锁??? -#endif - Dynamicopen_HGBase_pHandle_ = NULL; - } - - - return ret; - } - int fillhole1(std::vector& v, float top, float low, float l, float r) - { - int ret = SCANNER_ERR_OK; - - float scale = img_conf_.fillhole.fillholeratio / 100.0; - float val = img_conf_.resolution_dst / 10; - cv::Vec4f edgeScale; - edgeScale[0] = top; - edgeScale[1] = low; - edgeScale[2] = l; - edgeScale[3] = r; - CImageApplyOutHole outh(val, edgeScale, 50); - outh.apply(v, true); - if (v.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - - int decode(int pid, LPSCANCONF img_param, LPIMGPRCPARAM param) - { - if (!buffer_) - return SCANNER_ERR_NO_DATA; - pid_ = pid; - img_conf_ = *img_param; - param_ = *param; - size_t origin = buffer_->size(); - std::vector>> buffs; - if(pid == 0x100 || pid == 0x200) - buffs = G200Decode(buffer_,img_conf_.is_duplex,img_conf_.is_switchfrontback).getImageBuffs(); - else if(pid == 0x139 || pid == 0x239 ||pid == 0x439) - buffs = GRawDecode(buffer_).getImageBuffs(); - else if(pid == 0x300 || pid == 0x400 ||pid == 0x402 || pid == 0x302) - buffs = G400Decode(buffer_,img_conf_.is_duplex).getImageBuffs(); - - if(buffs.empty()) - return -1; - - buffer_.reset(new std::vector()); - int i=0; - vectorTemp_mat; - for (auto& buf : buffs) - { - i++; - cv::ImreadModes rmc = param_.channels > 1 ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE; - try - { - if (buf->at(0) == -119 && buf->at(1) == 0x50 && buf->at(2) == 0x4e && buf->at(3) == 0x47) - { - rmc = cv::IMREAD_GRAYSCALE; - param_.black_white = true; - } - else - param_.black_white = false; - - if((pid == 0x100 || pid == 0x200 || pid == 0x300 || pid == 0x400|| pid == 0x402 ||pid == 0x302) - && (img_conf_.filter != 3 - || img_conf_.multiOutput == 1 - || img_conf_.multiOutput == 2 - || img_conf_.multiOutput == 0)&& img_conf_.pixtype == COLOR_MODE_24_BITS) - - { - rmc = cv::IMREAD_COLOR; - } - cv::Mat mat(cv::imdecode(*buf, rmc)); - //cv::imwrite("C:\\Users\\modehua\\Desktop\\image\\imdecode.jpg",mat); - - if (mat.empty()) - { - utils::log_info("decode image data error\n", LOG_LEVEL_FATAL); - continue; - } - if (param_.cis_image) - { - Temp_mat.push_back(mat); - } - else if (pid == 0x100 || pid == 0x200 || pid == 0x139 || pid == 0x239 || pid_ == 0x439) - { - Temp_mat.push_back(mat); - //cv::imwrite("C:\\Users\\modehua\\Desktop\\image\\decode1.jpg",mat); - } - else if (pid == 0x300 || pid == 0x400 || pid == 0x402 || pid == 0x302) - { - Temp_mat.push_back(mat(cv::Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows))); //front - Temp_mat.push_back(mat(cv::Rect(0, 0, mat.cols / 2, mat.rows))); //back - } - - buffer_.reset(new std::vector()); - } - catch (const std::exception& e) - { - utils::log_info(e.what(), LOG_LEVEL_FATAL); - throw(e); // 继续抛到上层处理? - } - } - - buffs.clear(); - if (Temp_mat.empty()) - { - return SCANNER_ERR_NO_DATA; - } - - if (pid_ == 0x100 || pid_ == 0x200 || pid_ == 0x300 || pid_ == 0x400 || pid == 0x402 || pid == 0x302) - { - //////除穿孔算法移至解压图像之? - double left = img_conf_.fillholeratio_left / 100.0; - double right = img_conf_.fillholeratio_right / 100.0; - double top = img_conf_.fillholeratio_up / 100.0; - double low = img_conf_.fillholeratio_down / 100.0; - if (left > 0 || right > 0 || top > 0 || low > 0) - fillhole1(Temp_mat, top, low, left, right); - - utils::to_log(LOG_LEVEL_DEBUG, "Remove hole is '%s',Hole image buffer size is:%d\n", !Temp_mat.empty() ? "enable" : "close", Temp_mat.size()); - if (param_.cis_image) - { - mats_ = Temp_mat; - } - else - { - if (img_conf_.is_duplex) - { - mats_.push_back(img_conf_.is_switchfrontback ? Temp_mat[1] : Temp_mat[0]); - mats_.push_back(img_conf_.is_switchfrontback ? Temp_mat[0] : Temp_mat[1]); - } - else - mats_.push_back(Temp_mat[0]); - } - if (mats_.size() % 2 == 0 - && ((CImageApplyRotation::RotationType)img_conf_.imageRotateDegree == CImageApplyRotation::RotationType::Rotate_90_clockwise - || (CImageApplyRotation::RotationType)img_conf_.imageRotateDegree == CImageApplyRotation::RotationType::Rotate_90_anti_clockwise)) - { - cv::flip(mats_[1], mats_[1], 0); - cv::flip(mats_[1], mats_[1], 1); - } - - - } - else - { - mats_ = Temp_mat; - } - - Temp_mat.clear(); - - utils::to_log(LOG_LEVEL_DEBUG, "Decode %u bytes to %u picture(s)\n", origin, mats_.size()); - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - public: - int correct_text(void) - { - std::string sample(my_path_ + "/data/img/osd.traineddata"); - CImageApplyRotation rot(CImageApplyRotation::RotationType::AutoTextOrientation, false, param_.dpi, sample.c_str()); - - rot.apply(mats_, img_conf_.is_duplex); - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int split(int split3399) - { - std::vector mats(mats_); - mats_.clear(); - - int colormode = 1; //Ĭ��1 - if (img_conf_.filter == 3) - colormode = img_conf_.pixtype; - - CImageApplySplit split(img_conf_.multiOutput, img_conf_.splitImage, img_conf_.multi_output_red, colormode); - auto matexs = split.SplitMats(mats, img_conf_.is_duplex); - - std::string filename ; - int rotation01_ = 1; - int rotation02_ = 1; - if(((pid_ == 0x139 || pid_ == 0x239 || pid_ == 0x439) && (split3399 % 2 ==0) && img_conf_.is_duplex ) || pid_ == 0x200 || pid_== 0x100) - { - rotation01_ = 0; - rotation02_ = 1; - } - int i = 0; - for(auto &matex : matexs) - { - cv::flip(matex.mat, matex.mat, rotation01_); - cv::flip(matex.mat,matex.mat,rotation02_); - if (i > 1 && (pid_ == 0x402 || pid_ == 0x100 || pid_ == 0x400 || pid_== 0x302 || pid_ == 0x300)) - { - cv::flip(matex.mat,matex.mat,-1); - } - if(!matex.mat.empty()) - mats_.push_back(matex.mat); - i++; - } - CImageApplyRotation::RotationType rotatetype = CImageApplyRotation::RotationType::Invalid; - - if (pid_ == 0x402 || pid_ == 0x400 || pid_ == 0x239 || pid_ == 0x439 || pid_ == 0x302 || pid_ == 0x300) - rotatetype = CImageApplyRotation::RotationType::Rotate_90_clockwise; - else if(pid_ == 0x100) - rotatetype = CImageApplyRotation::RotationType::Rotate_90_anti_clockwise; - - CImageApplyRotation Rotation(rotatetype,false,img_conf_.resolution_native,"./tessdata"); - Rotation.apply(mats_,img_conf_.is_duplex); - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int fadeback() - { - std::vector mats(mats_); - - mats_.clear(); - - CImageApplyFadeBackGroudColor fade(40,0, img_conf_.fadebackrange); - for(size_t i = 0; i < mats.size();i++) - { - fade.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - - // std::string filename = "/home/huagao/Desktop/fadeback("+std::to_string(num++)+").jpg"; - // cv::imwrite(filename,mats_[i]); - - // printf("fadeback.size :%d ,filename is =%s\r\n",mats_.size(),filename.c_str()); - - } - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int multi_out(int out_type) - { - std::vector mats(mats_); - std::vector mat; - mats_.clear(); - - IMageMulti output(out_type); - - for(size_t i = 0;i < mats.size();i++) - { - mat = output.apply(mats[i]); - for(size_t j = 0;j < mat.size();j++) - { - //if (out_type != MULTI_COLOR_AND_GRAY && i == mats.size() - 1) - // mats_.push_back(convert_8bit_2_1bit(mat[j], 127, false, false)); - //else - mats_.push_back(mat[j]); - // std::string filename = "multi_out("+std::to_string(num++)+").jpg"; - // cv::imwrite(filename,mat[j]); - } - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int multi_out_red() - { - std::vector mats(mats_); - std::vector mat; - mats_.clear(); - mat.clear(); - - ImageMultiOutputRed outred(2); - - for(size_t i = 0;i < mats.size();i++) - { - mat = outred.apply(mats[i]); - for(size_t j = 0;j < mat.size();j++) - { - mats_.push_back(mat[j]); - } - - // std::string filename = "/home/huagao/Desktop/multi_out_red("+std::to_string(num++)+").jpg"; - // cv::imwrite(filename,mats_[i]); - // printf("fadeback.size :%d ,filename is =%s\r\n",mats_.size(),filename.c_str()); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int auto_matic_color(int color_type) - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - for(size_t i = 0;i < mats.size();i++) - { - CImageApplyColorRecognition ColorRecognition(color_type==1? - CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray : - CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono); - - ColorRecognition.apply(mats[i],img_conf_.is_duplex); - - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - /*pixtype 0 colcor; 1 gray; 2 bw*/ - int auto_crop(float dpi) - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - SIZE temp_Size = papersize_.GetPaperSize(img_conf_.papertype, dpi,img_conf_.paperAlign); - cv::Size cvSize(temp_Size.cx, temp_Size.cy); - CImageApplyAutoCrop crop(img_conf_.is_autocrop,img_conf_.autodescrew,img_conf_.fillbackground,cvSize,img_conf_.is_convex,img_conf_.isfillcolor); - - crop.apply(mats,img_conf_.is_duplex); - mats_ = mats; - //cv::imwrite("/home/huagao/Desktop/mats_.jpg",mats_[0]); - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int fillhole(float top,float low,float l,float r) - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - float scale = img_conf_.fillhole.fillholeratio / 100.0; - float val = img_conf_.resolution_dst / 10; - cv::Vec4f edgeScale; - edgeScale[0] = top; - edgeScale[1] = low; - edgeScale[2] = l; - edgeScale[3] = r; - CImageApplyOutHole outh(val, edgeScale,50); - - outh.apply(mats,img_conf_.is_duplex); - mats_ = mats; - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - - int resolution_change(float dpi3288) - { - int ret = SCANNER_ERR_OK; - CImageApplyFilter::FilterMode sharpenType = CImageApplyFilter::FilterMode::None; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyResize::ResizeType resizeType; - double ratio = 1.0; - SIZE reSize = papersize_.GetPaperSize(img_conf_.papertype, img_conf_.resolution_dst,img_conf_.paperAlign); - cv::Size cvSize(reSize.cx, reSize.cy); - if (img_conf_.is_autocrop || img_conf_.cropRect.enable) - { - resizeType = CImageApplyResize::ResizeType::RATIO; - ratio = img_conf_.resolution_dst / dpi3288; - } - else - resizeType = CImageApplyResize::ResizeType::DSIZE; - - - CImageApplyResize resize(resizeType,cvSize,ratio,ratio); - resize.apply(mats,img_conf_.is_duplex); - - if (mats.empty()) - { - return SCANNER_ERR_NO_DATA; - } - mats_ = mats; - return SCANNER_ERR_OK; - } - int croprect() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyCustomCrop rect(cv::Rect(img_conf_.cropRect.x, img_conf_.cropRect.y, img_conf_.cropRect.width, img_conf_.cropRect.height)); - for (size_t i = 0; i < mats.size(); ++i) - { - rect.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int channel() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyChannel chl((CImageApplyChannel::channel)(img_conf_.filter)); - - for (size_t i = 0; i < mats.size(); i++) - { - chl.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int adjust_color(unsigned char* gamma_table = nullptr, int tableLength = 0) - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - //utils::to_log(LOG_LEVEL_DEBUG, "adjust_color: table len = %d, brightness = %f, contrast = %f, gamma = %f\n", tableLength - // , img_conf_.brightness, img_conf_.contrast, img_conf_.gamma); - if (gamma_table && tableLength && img_conf_.pixtype != COLOR_MODE_AUTO_MATCH) - { - CImageApplyCustomGamma gamme(gamma_table, tableLength); - - gamme.apply(mats, img_conf_.is_duplex); - } - else if (pid_ != 0x0239 && pid_ != 0x439 && pid_ != 0x0139) - { - - if (img_conf_.brightness != 128 ||img_conf_.contrast != 4 || ((img_conf_.gamma < (1.0f - 1e-2)) || (img_conf_.gamma > (1.0f + 1e-2))) ) - { - int temp_contrast = (img_conf_.contrast - 4) * 12; - CImageApplyAdjustColors justColors(img_conf_.brightness - 128, temp_contrast, img_conf_.gamma); - for (size_t i = 0; i < mats.size(); ++i) - { - justColors.apply(mats[i],img_conf_.is_duplex); - } - } - //cv::imwrite("/home/huagao/Desktop/customgamma2.jpg",mats_[0]); - } - mats_ = mats; - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int antiInflow(int permeate_lv) - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyRefuseInflow Inflow(permeate_lv); - for (size_t i = 0; i < mats.size(); ++i) - { - Inflow.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int colorCorrection() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyAutoContrast con; - con.apply(mats,img_conf_.is_duplex); - mats_= mats; - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int orentation() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - mats_.resize(mats.size()); - - CImageApplyRotation::RotationType rotatetype = CImageApplyRotation::RotationType::Invalid; - - switch ((CImageApplyRotation::RotationType)img_conf_.imageRotateDegree) - { - case CImageApplyRotation::RotationType::Rotate_90_clockwise: - rotatetype = CImageApplyRotation::RotationType::Rotate_90_clockwise; - break; - case CImageApplyRotation::RotationType::Rotate_180: - rotatetype = CImageApplyRotation::RotationType::Rotate_180; - break; - case CImageApplyRotation::RotationType::Rotate_90_anti_clockwise: - rotatetype = CImageApplyRotation::RotationType::Rotate_90_anti_clockwise; - break; - default: - break; - } - - if (img_conf_.is_autotext) - rotatetype = CImageApplyRotation::RotationType::AutoTextOrientation; - - unsigned char back180 = false; - if (img_conf_.splitImage) - unsigned char back180 = false; - else - back180 = img_conf_.is_backrotate180; - - CImageApplyRotation Rotation(rotatetype, back180,img_conf_.resolution_native,"./tessdata"); - - Rotation.apply(mats,img_conf_.is_duplex); - mats_ = mats; - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int textureRemove() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyTextureRemoval Removal; - - Removal.apply(mats,img_conf_.is_duplex); - mats_ = mats; - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int remove_morr() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyFilter::FilterMode sharpenType = CImageApplyFilter::FilterMode::BilateralFilter; - CImageApplyFilter Filte(sharpenType); - for (size_t i = 0; i < mats.size(); ++i) - { - Filte.apply(mats[i], img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - - int sharpenType() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyFilter::FilterMode sharpenType = (CImageApplyFilter::FilterMode)img_conf_.sharpen; - CImageApplyFilter Filte(sharpenType); - for (size_t i = 0; i < mats.size(); ++i) - { - Filte.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int nosieDetach() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyDetachNoise Noise(img_conf_.detachnoise.detachnoise); - for (size_t i = 0; i < mats.size(); ++i) - { - Noise.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - - } - int errorextention() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyBWBinaray::ThresholdType thrtype; - if(img_conf_.errorExtention) - thrtype = CImageApplyBWBinaray::ThresholdType::ERROR_DIFFUSION; - else - thrtype = CImageApplyBWBinaray::ThresholdType::THRESH_BINARY; - - CImageApplyBWBinaray BWBinaray(thrtype); - for (size_t i = 0; i < mats.size(); ++i) - { - BWBinaray.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int discardBlank() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - double threshold = 40; - int edge = 30; - int dis = img_conf_.discardblank_percent; - if (img_conf_.is_autodiscradblank_vince) - dis *= 1.5; - CImageApplyDiscardBlank discardblank(threshold, edge, dis); - - discardblank.apply(mats, mats.size()); - - for (size_t i = 0; i < mats.size(); ++i) - { - if (!mats[i].empty()) - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int answerSheetFilterRed() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyHSVCorrect correct((CImageApplyHSVCorrect::Red_Removal)); - for (size_t i = 0; i < mats.size(); ++i) - { - correct.apply(mats[i],img_conf_.is_duplex); - mats_.push_back(mats[i]); - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int fold() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - CImageApplyConcatenation fold((CImageApplyConcatenation::ConcatMode)img_conf_.fold_concatmode); - fold.apply(mats,img_conf_.is_duplex); - mats_= mats; - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int quality(int dpi_dst) - { - int ret = SCANNER_ERR_OK; - - //std::vector mats(mats_); - //mats_.clear(); - //mats_.resize(mats.size()); - float xy = (float)dpi_dst/200.0; - - for (size_t i = 0; i < mats_.size(); ++i) - { - //cv::Mat out; - cv::resize(mats_[i], mats_[i], cv::Size(),xy,xy); - //mats_.push_back(out); - } - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int ocr_auto_txtdirect() - { - std::vector mats(mats_); - mats_.clear(); - - int pDirect = -1, - ret = SCANNER_ERR_OK; - void* pHanld = NULL; - - typedef int (* SDKInitialize)(void** ppstOcrHandle); - typedef void(* SDKExit)(void* pstOcrHandle); - typedef int (* SDKGetFileDirectImage)(BYTE* pbImage, int nWidth, int nHeight, TColorType nColorType, void* pstHandle, int* pDirect); - - SDKInitialize ocrinit = NULL; - SDKGetFileDirectImage ocrgetdirectimage = NULL; - SDKExit ocrexit = NULL; - - #ifndef WIN32 - string scanner_path = utils::get_module_full_path(MODULE_NAME_SCANNER); - - if(scanner_path.empty()) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - size_t pos = scanner_path.rfind(PATH_SEPARATOR[0]); - if(pos++ == std::string::npos) - pos = 0; - scanner_path.erase(pos); - scanner_path+="libhwocrdetect.so"; - printf("hwlib path:%s\r\n",scanner_path.c_str()); - - if(access(scanner_path.c_str(),F_OK) != 0) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - #endif - #if ((!defined x86_64) && (!defined WIN32)) - //linux x86_64 - - void *hanlde = dlopen(scanner_path.c_str(),RTLD_LAZY); - if(!hanlde) - { - return SCANNER_ERR_OUT_OF_RANGE; - } - ocrinit = (SDKInitialize)dlsym(hanlde , "HWOCR_SDKInitialize"); - ocrgetdirectimage = (SDKGetFileDirectImage)dlsym(hanlde , "HWOCR_GetFileDirectImage"); - ocrexit= (SDKExit)dlsym(hanlde , "HWOCR_SDKExit"); - - #else - #ifdef _WIN32 - HINSTANCE handle = LoadLibrary(L"hanwangOCRdetect.dll"); - if (handle) - { - ocrinit = (SDKInitialize)GetProcAddress(handle, "HWOCR_SDKInitialize"); - ocrgetdirectimage = (SDKGetFileDirectImage)GetProcAddress(handle, "HWOCR_GetFileDirectImage"); - ocrexit = (SDKExit)GetProcAddress(handle, "HWOCR_SDKExit"); - } - #endif // WIN32 - #endif - int r = ocrinit(&pHanld); - for (size_t i = 0; i < mats.size(); i++) - { - r = ocrgetdirectimage(const_cast(mats[i].data), mats[i].cols, mats[i].rows, mats[i].channels() == 1 ? TColorType::EGray256 : TColorType::EColor16M, pHanld, &pDirect); - - if (pDirect == 1) - pDirect = 3; - else if (pDirect == 3) - pDirect = 1; - - CImageApplyRotation(CImageApplyRotation::RotationType(pDirect)).apply(mats[i], false); - mats_.push_back(mats[i]); - } - ocrexit(pHanld); - #if ((!defined x86_64) && (!defined WIN32)) - dlclose(hanlde); - #else - - #endif - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int tesseract_auto_txtdirect() - { - if (!Auto_Txt_pHanld) - { - return SCANNER_ERR_NO_DATA; - } - std::vector mats(mats_); - mats_.clear(); - - unsigned int pDirect = 0, - ret = SCANNER_ERR_OK; - - HGImage image; - - if (ocrinit_ && ocrgetdirectimage_ && ocrexit_) - { - for (size_t i = 0; i < mats.size(); i++) - { - HGImage b = opencv_to_hgbase_image(mats[i]); - ret = ocrgetdirectimage_(Auto_Txt_pHanld, b, &pDirect); - HGBase_FreeImg(b); - //HGBase_DestroyImage(b); - - switch (pDirect) - { - case HGIMGPROC_OCRTEXTDIRECT_ORI: - pDirect = (unsigned int)CImageApplyRotation::RotationType::Invalid; - break; - case HGIMGPROC_OCRTEXTDIRECT_RIGHT: - pDirect = (unsigned int)CImageApplyRotation::RotationType::Rotate_90_anti_clockwise; - break; - case HGIMGPROC_OCRTEXTDIRECT_LEFT: - pDirect = (unsigned int)CImageApplyRotation::RotationType::Rotate_90_clockwise; - break; - case HGIMGPROC_OCRTEXTDIRECT_180: - pDirect = (unsigned int)CImageApplyRotation::RotationType::Rotate_180; - break; - default: - pDirect = (int)CImageApplyRotation::RotationType::Invalid; - break; - } - CImageApplyRotation(CImageApplyRotation::RotationType(pDirect)).apply(mats[i], false); - mats_.push_back(mats[i]); - } - } - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return SCANNER_ERR_OK; - } - int size_detection() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - CImageApplySizeDetection paper(img_conf_.papertype); - for (size_t i = 0; i < mats.size(); ++i) - { - ret = paper.apply(mats[i]); - mats_.push_back(mats[i]); - } - if(ret == 1) - { - return SCANNER_ERR_DEVICE_SIZE_CHECK; - } - return SCANNER_ERR_OK; - - } - int cis_test_image(CISTestImageProcess::CISTestResult &res) - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - - for (size_t i = 0; i < mats.size(); ++i) - { - //cv::imwrite(to_string(i) + "cis_test_image.jpg", mats[i]); - - CISTestImageProcess::test(mats[i], res); - mats_.push_back(mats[i]); - //cv::imwrite("CISTestImageProcess.jpg",mats[i]); - return ret; - - } - - } - int color_cast_correction() - { - int ret = SCANNER_ERR_OK; - std::vector mats(mats_); - mats_.clear(); - CImageApplyColorCastCorrect ColorCastCorrect(1); - - //cv::imwrite(to_string(i) + "cis_test_image.jpg", mats[i]); - - ColorCastCorrect.apply(mats,true); - mats_ = mats; - - if (mats_.empty()) - { - return SCANNER_ERR_NO_DATA; - } - return ret; - //cv::imwrite("CISTestImageProcess.jpg",mats[i]); - } - HGImage opencv_to_hgbase_image(const cv::Mat& mats) - { - HGImage image; - HGImageInfo info; - info.height = mats.rows; - info.width = mats.cols; - info.origin = HGBASE_IMGORIGIN_TOP; - int bits = mats.channels() == 1 ? 8 : 24; - info.widthStep = mats.step; //opencv原始? - info.type = mats.channels() == 1 ? HGBASE_IMGTYPE_GRAY : HGBASE_IMGTYPE_BGR; - - int ret = HGBase_CreatImg(const_cast(mats.data), &info, &image); - - //int ret = HGBase_CreateImageWithData(const_cast(mats.data), &info, &image); - - return image; - } - - - /// - /// 8位图?位图 - /// - /// 8bit?/param> - /// 阈值,建议默认127 - /// true为反色,即黑0?;反之亦?/param> - /// true为四字节对齐 - /// 1位图 - /// - static cv::Mat convert_8bit_2_1bit(const cv::Mat& image, uchar threshold, bool reverse, bool align) - { - if (image.channels() != 1) - return cv::Mat(); - - int cols = align ? (((image.cols + 7) / 8 + 3) / 4 * 4) : ((image.cols + 7) / 8); - int rows = image.rows; - - uchar tableData[256]; - memset(tableData, reverse ? 0 : 1, 256); - memset(tableData, reverse ? 1 : 0, threshold); - - int* index_dst = new int[image.cols]; - int* index_carry = new int[image.cols]; - - for (size_t i = 0; i < image.cols; i++) - { - index_dst[i] = i / 8; - index_carry[i] = 7 - (i % 8); - } - - cv::Mat dst = cv::Mat::zeros(rows, cols, CV_8UC1); - uchar* ptr_src, * ptr_dst; - for (size_t y = 0; y < rows; y++) - { - ptr_dst = dst.ptr(y); - ptr_src = const_cast(image.ptr(y)); - for (size_t x = 0; x < image.cols; x++) - ptr_dst[index_dst[x]] += tableData[ptr_src[x]] << index_carry[x]; - } - - delete[] index_dst; - delete[] index_carry; - return dst; - } - // final - public: - int final(void) - { - std::vector mats(mats_); - - mats_.clear(); - for (size_t i = 0; i < mats.size(); ++i) - { - if (mats[i].empty()) - continue; - - int bpp = param_.black_white ? 8 : param_.bits * param_.channels; - MatEx out(mats[i], bpp); - - if (out.mat.channels() == 3) - swap_rgb(out.mat); - mats_.push_back(out.mat); - //cv::imwrite(std::to_string(i++)+"_final.jpg",out.mat); - } - - return SCANNER_ERR_OK; - } - int get_final_data(LPIMGHEAD pimh, void** buf, int index) - { - if ((index < 0 || index >= mats_.size())) - return SCANNER_ERR_NO_DATA; - - pimh->width = mats_[index].cols; - pimh->height = mats_[index].rows; - pimh->bits = 8; //mats_[index].depth - pimh->channels = mats_[index].channels(); - - pimh->total_bytes = mats_[index].total() * pimh->channels; - pimh->line_bytes = pimh->height ? pimh->total_bytes / pimh->height : pimh->width * pimh->channels; - *buf = mats_[index].data; - pimh->statu = img_statu_; - - //printf("pimh->channels = %d \r\n",pimh->channels); - return SCANNER_ERR_OK; - } - int get_final_data(LPIMGHEAD pimh, std::vector* buf, int index) - { - if ((index < 0 || index >= mats_.size())) - return SCANNER_ERR_NO_DATA; - - pimh->width = mats_[index].cols; - pimh->height = mats_[index].rows; - pimh->bits = 8; //mats_[index].depth - pimh->channels = mats_[index].channels(); - pimh->statu = img_statu_; - - if((pimh->width * pimh->channels) % 4) - { - int len = pimh->width * pimh->channels; - pimh->line_bytes = (len + 3) / 4 * 4; - pimh->total_bytes = pimh->line_bytes * pimh->height; - buf->resize(pimh->total_bytes); - - //printf("pimh->total_bytes=%d pimh->line_bytes=%d\r\n",pimh->total_bytes,pimh->line_bytes); - unsigned char* src = mats_[index].data, *dst = buf->data(); - for(int i = 0; i < pimh->height; ++i) - { - memcpy(dst, src, len); - dst += pimh->line_bytes; - src += len; - } - } - else - { - pimh->total_bytes = mats_[index].total() * pimh->channels; - pimh->line_bytes = pimh->height ? pimh->total_bytes / pimh->height : pimh->width * pimh->channels; - buf->resize(pimh->total_bytes); - memcpy(buf->data(), mats_[index].data, pimh->total_bytes); - //cv::imwrite(to_string(index)+"_final.jpg",mats_[index]); - } - - //printf("pimh->channels_01 = %d \r\n",pimh->channels); - return SCANNER_ERR_OK; - } - int imgtypechange(std::string img_type_,void *buf,std::vector &bmpdata) - { - int ret = SCANNER_ERR_OK; - if(!buf) - { - return SCANNER_ERR_NO_DATA; - } - cv::imencode(img_type_,*((cv::Mat*)buf),bmpdata); - return ret; - } - void dump_2_file(const char* local_file) - { - if (mats_.size()) - { - cv::imwrite(local_file, mats_[0]); - if (mats_.size() > 1) - { - std::string path(local_file), name(""), ext(""); - size_t pos = path.rfind(PATH_SEPARATOR[0]); - char sn[20] = { 0 }; - - if (pos++ != std::string::npos) - { - name = path.substr(pos); - path.erase(pos); - pos = name.rfind('.'); - if (pos != std::string::npos) - { - ext = name.substr(pos); - name.erase(pos); - } - } - for (size_t i = 1; i < mats_.size(); ++i) - { - sprintf(sn, "(%d)", i); - cv::imwrite((path + name + sn + ext).c_str(), mats_[i]); - } - } - } - else - { - utils::log_info("No image output in image_process!\n", LOG_LEVEL_ALL); - } - } - }; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // api ... - HIMGPRC init(int pid,bool isx86_Advan_) - { - imgproc* obj = new imgproc(pid, isx86_Advan_); - - return (HIMGPRC)obj; - } - int load_buffer(HIMGPRC himg, std::shared_ptr buff) - { - return ((imgproc*)himg)->load_raw_data(buff); - } - int load_file(HIMGPRC himg, const char* path_file) - { - return ((imgproc*)himg)->load_file(path_file); - } - int decode(HIMGPRC himg, int pid, LPSCANCONF img_param, LPIMGPRCPARAM param) - { - return ((imgproc*)himg)->decode(pid, img_param, param); - } - int init_auto_txt_hanld(HIMGPRC himg) - { - return ((imgproc*)himg)->init_auto_txt_hanld(); - } - int free_auto_txt_hanld(HIMGPRC himg) - { - return ((imgproc*)himg)->free_auto_txt_hanld(); - } - int correct_text(HIMGPRC himg) - { - return ((imgproc*)himg)->correct_text(); - } - int split(HIMGPRC himg,int split3399) - { - return ((imgproc*)himg)->split(split3399); - } - int fadeback(HIMGPRC himg) - { - return ((imgproc*)himg)->fadeback(); - } - int multi_out(HIMGPRC himg,int out_type) - { - return ((imgproc*)himg)->multi_out(out_type); - } - int multi_out_red(HIMGPRC himg) - { - return ((imgproc*)himg)->multi_out_red(); - } - int auto_matic_color(HIMGPRC himg,int color_type) - { - return ((imgproc*)himg)->auto_matic_color(color_type); - } - int auto_crop(HIMGPRC himg,float dpi) - { - return ((imgproc*)himg)->auto_crop(dpi); - } - int fillhole(HIMGPRC himg, float top, float low, float l, float r) - { - return ((imgproc*)himg)->fillhole(top, low, l,r); - } - int resolution_change(HIMGPRC himg,float dpi3288) - { - return ((imgproc*)himg)->resolution_change(dpi3288); - } - int croprect(HIMGPRC himg) - { - return ((imgproc*)himg)->croprect(); - } - int channel(HIMGPRC himg) - { - return ((imgproc*)himg)->channel(); - } - int adjust_color(HIMGPRC himg, unsigned char* table, int tableLength) - { - return ((imgproc*)himg)->adjust_color(table, tableLength); - } - int antiInflow(HIMGPRC himg,int permeate_lv) - { - return ((imgproc*)himg)->antiInflow(permeate_lv); - } - int colorCorrection(HIMGPRC himg) - { - return ((imgproc*)himg)->colorCorrection(); - } - int orentation(HIMGPRC himg) - { - return ((imgproc*)himg)->orentation(); - } - int textureRemove(HIMGPRC himg) - { - return ((imgproc*)himg)->textureRemove(); - } - int remove_morr(HIMGPRC himg) - { - return ((imgproc*)himg)->remove_morr(); - } - int sharpenType(HIMGPRC himg) - { - return ((imgproc*)himg)->sharpenType(); - } - int nosieDetach(HIMGPRC himg) - { - return ((imgproc*)himg)->nosieDetach(); - } - int errorextention(HIMGPRC himg) - { - return ((imgproc*)himg)->errorextention(); - } - int discardBlank(HIMGPRC himg) - { - return ((imgproc*)himg)->discardBlank(); - } - int answerSheetFilterRed(HIMGPRC himg) - { - return ((imgproc*)himg)->answerSheetFilterRed(); - } - //img_type_ = jpg png bmp - int imgtypechange(HIMGPRC himg,std::string img_type_,void *buf,std::vector &bmpdata) - { - return ((imgproc*)himg)->imgtypechange(img_type_,buf,bmpdata); - } - int fold(HIMGPRC himg) - { - return ((imgproc*)himg)->fold(); - } - int quality(HIMGPRC himg,int dpi) - { - return ((imgproc*)himg)->quality(dpi); - } - int ocr_auto_txtdirect(HIMGPRC himg) - { - return ((imgproc*)himg)->ocr_auto_txtdirect(); - } - int tesseract_auto_txtdirect(HIMGPRC himg) - { - return ((imgproc*)himg)->tesseract_auto_txtdirect(); - } - int size_detection(HIMGPRC himg) - { - return ((imgproc*)himg)->size_detection(); - } - int cis_test_image(HIMGPRC himg, CISTestImageProcess::CISTestResult &res) - { - return ((imgproc*)himg)->cis_test_image(res); - } - int color_cast_correction(HIMGPRC himg) - { - return ((imgproc*)himg)->color_cast_correction(); - } - int final(HIMGPRC himg) - { - return ((imgproc*)himg)->final(); - } - int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, void** buf, int index) - { - return ((imgproc*)himg)->get_final_data(pimh, buf, index); - } - int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, std::vector* buf, int index) - { - return ((imgproc*)himg)->get_final_data(pimh, buf, index); - } - void dump_2_file(HIMGPRC himg, const char* local_file) - { - ((imgproc*)himg)->dump_2_file(local_file); - } - void release(HIMGPRC himg) - { - imgproc* obj = (imgproc*)himg; - - delete obj; - } - // seperate utilites ... - static cv::Mat from_bmp_file_bits(const BITMAPINFOHEADER& bih, unsigned char* data, bool line_reverse, bool bw_reverse) - { - cv::Mat m; - int bytes = 0, align = 0; - unsigned char *dst = NULL; - - m.create(bih.biHeight, bih.biWidth, bih.biBitCount > 8 ? CV_8UC3 : CV_8UC1); - dst = m.ptr(); - bytes = (bih.biBitCount * bih.biWidth + 7) / 8; - align = (bytes + 3) / 4 * 4; - if (line_reverse) - { - data += align * (bih.biHeight - 1); - align *= -1; - } - if (bih.biBitCount >= 8) - { - if (bih.biBitCount == 8 && bw_reverse) - { - for (int i = 0; i < bih.biHeight; ++i) - { - for (int j = 0; j < bytes; ++j) - dst[j] = data[j] ^ 0x0ff; - dst += bytes; - data += align; - } - } - else - { - for (int i = 0; i < bih.biHeight; ++i) - { - memcpy(dst, data, bytes); - dst += bytes; - data += align; - } - } - } - else // if (bih.biBitCount == 1) - { - unsigned char bw[] = { !bw_reverse - 1, bw_reverse - 1}; - bytes = bih.biWidth; - for (int i = 0; i < bih.biHeight; ++i) - { - bit_stream bs(data, false); - for (int j = 0; j < bih.biWidth; ++j) - dst[j] = bw[bs.get()]; - dst += bytes; - data += align; - } - } - - return m; - } - int convert_image_file(SANE_ImageFormatConvert* conv) - { - if (conv->src.fmt.img_format != SANE_IMAGE_TYPE_BMP && - conv->src.fmt.compress.compression != SANE_COMPRESSION_NONE) - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - if(conv->dst.fmt.img_format != SANE_IMAGE_TYPE_JFIF && - conv->dst.fmt.img_format != SANE_IMAGE_TYPE_TIFF && - conv->dst.fmt.compress.compression != SANE_COMPRESSION_NONE && - conv->dst.fmt.compress.compression != SANE_COMPRESSION_GROUP4) - return SCANNER_ERR_DEVICE_NOT_SUPPORT; - - int fh = sizeof(BITMAPFILEHEADER); - BITMAPINFOHEADER bih = { 0 }; - unsigned char *bits = NULL; - std::shared_ptr> data; - - if (conv->src.is_file) - { - BITMAPFILEHEADER bfh = { 0 }; - FILE* src = fopen(conv->src.data, "rb"); - long len = 0; - if (!src) - return SCANNER_ERR_OPEN_FILE_FAILED; - - fseek(src, 0, SEEK_END); - len = ftell(src); - if (len <= fh + sizeof(bih)) - { - fclose(src); - - return SCANNER_ERR_DATA_DAMAGED; - } - - fseek(src, 0, SEEK_SET); - fread(&bfh, sizeof(bfh), 1, src); - fread(&bih, sizeof(bih), 1, src); - if (len < bfh.bfOffBits || len < bfh.bfSize) - { - fclose(src); - - return SCANNER_ERR_DATA_DAMAGED; - } - - // we consider pallete as gray, discard pallete here ... - fseek(src, bfh.bfOffBits, SEEK_SET); - // len -= bfh.bfOffBits; - data.reset(new std::vector(len)); - fread(&(*data.get())[0], 1, len, src); - fclose(src); - bits = data.get()->data(); - } - else - { - memcpy(&bih, conv->src.data + fh, sizeof(bih)); - bits = (unsigned char*)conv->src.data + ((BITMAPFILEHEADER*)conv->src.data)->bfOffBits; - } - - bool tiff = conv->dst.fmt.img_format == SANE_IMAGE_TYPE_TIFF; - int resolution = bih.biXPelsPerMeter / 39.37f + .5f, - threshold = (int)(long)conv->dst.fmt.compress.detail; - cv::Mat imsg = from_bmp_file_bits(bih, data->data(), tiff || conv->dst.fmt.img_format == SANE_IMAGE_TYPE_JFIF, tiff && conv->dst.fmt.compress.compression != SANE_COMPRESSION_GROUP4); - data.reset(); - if (tiff) - { - if (bih.biBitCount == 24) - { - if (conv->dst.fmt.compress.compression == SANE_COMPRESSION_GROUP4) - cvtColor(imsg, imsg, cv::COLOR_RGB2GRAY); - else - { - for (int y = 0; y < bih.biHeight; ++y) - { - uint8_t* row = imsg.ptr(y); - for (int x = 0; x < bih.biWidth; ++x) - { - uint8_t t = row[x * 3 + 0]; - row[x * 3 + 0] = row[x * 3 + 2]; - row[x * 3 + 2] = t; - } - } - } - } - int compression = conv->dst.fmt.compress.compression == SANE_COMPRESSION_GROUP4 ? COMPRESSION_CCITT_T6 : COMPRESSION_NONE; - if (conv->dst.is_file) - { - G4Tiff tiff(imsg, G4Tiff::Mode::FileMode, conv->dst.data, threshold, resolution, compression); - tiff.SaveG4Tiff(); - } - else - { - G4Tiff tiff(imsg, G4Tiff::Mode::MemoryMode, "", threshold, resolution, compression); - size_t bytes = 0; - conv->dst.data = (SANE_String_Const)tiff.get_compressed_data(&bytes, allocate_memory); - conv->dst.data_len = bytes; - } - } - else if (conv->dst.fmt.img_format == SANE_IMAGE_TYPE_JFIF) - { - // MSB word[7] and word[8] are x and y resolutions - std::vector cpr; - unsigned short jpeg_r = (resolution << 8) | ((resolution >> 8) & 0x0ff); - int resolution_y = bih.biYPelsPerMeter / 39.37f + .5f; - - cpr.push_back(CV_IMWRITE_JPEG_QUALITY); - cpr.push_back((int)(long)conv->dst.fmt.detail); - cpr.push_back(CV_IMWRITE_JPEG_RESOLUTION_UNIT); - cpr.push_back(1); - cpr.push_back(CV_IMWRITE_JPEG_RESOLUTION_X); - cpr.push_back(resolution); - cpr.push_back(CV_IMWRITE_JPEG_RESOLUTION_Y); - cpr.push_back(resolution_y); - if (conv->dst.is_file) - { - std::string tmp(conv->dst.data); - cv::imwrite((tmp + ".jpg").c_str(), imsg, cpr); - rename((tmp + ".jpg").c_str(), tmp.c_str()); - - //FILE* f = fopen(conv->dst.data, "rb+"); - //if (f) - //{ - // fseek(f, 0x0e, SEEK_SET); - // fwrite(&jpeg_r, sizeof(jpeg_r), 1, f); - // fwrite(&jpeg_r, sizeof(jpeg_r), 1, f); - // fclose(f); - //} - } - else - { - std::string tmpf(utils::temporary_path() + PATH_SEPARATOR + "imgtrans.jpg"); - cv::imwrite(tmpf.c_str(), imsg, cpr); - size_t bytes = 0; - conv->dst.data = (SANE_String_Const)G4Tiff::load_mini_file(tmpf.c_str(), &bytes, allocate_memory); - conv->dst.data_len = bytes; - remove(tmpf.c_str()); - //if (conv->dst.data_len > 0x20) - // ((unsigned short*)conv->dst.data)[7] = ((unsigned short*)conv->dst.data)[8] = jpeg_r; - } - } - else if (conv->dst.fmt.compress.compression == SANE_COMPRESSION_GROUP4) - { - std::vector cmp; - - if (bih.biBitCount == 24) - cvtColor(imsg, imsg, cv::COLOR_RGB2GRAY); - - if (conv->dst.is_file) - { - G4Tiff tiff(imsg, G4Tiff::Mode::FileMode, conv->dst.data, threshold, resolution); - tiff.SaveG4Tiff(); - } - else - { - G4Tiff tiff(imsg, G4Tiff::Mode::MemoryMode, "", threshold, resolution); - size_t bytes = 0; - conv->dst.data = (SANE_String_Const)tiff.get_compressed_data(&bytes, allocate_memory); - conv->dst.data_len = bytes; - } - } - return SCANNER_ERR_OK; - } - int save_2_bmp_file(const char* bmp_file, LPIMGHEAD head, void* buf, int resolution) - { - BITMAPINFOHEADER bih = { 0 }; - BITMAPFILEHEADER fh = { 0 }; - int pal_size = 0, line_len = (head->channels * head->bits * head->width + 31) / 32 * 4; - FILE *dst = fopen(bmp_file, "wb"); - - if (!dst) - return errno; - - bih.biSize = sizeof(bih); - bih.biWidth = head->width; - bih.biBitCount = head->channels * head->bits; - bih.biSizeImage = head->height * line_len; - bih.biPlanes = 1; - bih.biHeight = head->height; - bih.biCompression = BI_RGB; - bih.biXPelsPerMeter = bih.biYPelsPerMeter = resolution * 39.37f + .5f; - - if (bih.biBitCount == 1) - pal_size = 2 * sizeof(int); - else if (bih.biBitCount == 8) - pal_size = 256 * sizeof(int); - - fh.bfType = MAKEWORD('B', 'M'); - fh.bfOffBits = sizeof(fh) + sizeof(bih) + pal_size; - fh.bfSize = fh.bfOffBits + bih.biSizeImage; - - fwrite(&fh, sizeof(fh), 1, dst); - fwrite(&bih, sizeof(bih), 1, dst); - if (bih.biBitCount == 1) - { - int pal[] = { 0, 0x0ffffff }; - fwrite(pal, sizeof(pal), 1, dst); - } - else if (bih.biBitCount == 8) - { - static unsigned int g_bmp8_pallete[256] = { 0 }; - if (g_bmp8_pallete[1] == 0) - { - for (int i = 1; i < _countof(g_bmp8_pallete); ++i) - g_bmp8_pallete[i] = MAKELONG(MAKEWORD(i, i), MAKEWORD(i, 0)); - } - fwrite(g_bmp8_pallete, sizeof(g_bmp8_pallete), 1, dst); - } - - if (line_len == head->line_bytes) - fwrite(buf, 1, head->total_bytes, dst); - else - { - unsigned char* ptr = (unsigned char*)buf; - unsigned int pad = 0; - int pad_l = 4 - (head->line_bytes % 4), step = head->line_bytes; - - if (1) - { - ptr += head->total_bytes - head->line_bytes; - step *= -1; - } - for (int i = 0; i < head->height; ++i) - { - fwrite(ptr, head->line_bytes, 1, dst); - fwrite(&pad, 1, pad_l, dst); - ptr += step; - } - } - fclose(dst); - - return 0; - } - static unsigned char reverse_bit(unsigned char v) - { - unsigned char r = 0; - - for (int i = 0; i < 8; ++i) - { - r <<= 1; - r |= v & 1; - v >>= 1; - } - - return r; - } - std::string bmp8_2_1bit(const unsigned char* data, int w, int h, int line_len, int threshold, bool reverse, bool align) - { - cv::Mat m; - unsigned char* dst = NULL; - - m.create(h, w, CV_8UC1); - dst = m.ptr();// +w * (h - 1); - for (int i = 0; i < h; ++i) - { - memcpy(dst, data, w); - dst += w; - data += line_len; - } - - cv::Mat bw = imgproc::convert_8bit_2_1bit(m, threshold, reverse, align); - //std::string ret(""); - - //dst = bw.ptr(); - //for (int i = 0; i < bw.total(); ++i) - // dst[i] = reverse_bit(dst[i]); - - return std::string((char*)bw.ptr(), bw.total()); - } -} - - - diff --git a/hgdriver/hgdev/image_process.h b/hgdriver/hgdev/image_process.h deleted file mode 100644 index 5425e3d..0000000 --- a/hgdriver/hgdev/image_process.h +++ /dev/null @@ -1,226 +0,0 @@ -#pragma once - -// API for image process -// -// created on 2022-03-01 -// -#include "huagao/hgscanner_error.h" -#include "common_setting.h" -#include -#include -#include -#include "../ImageProcess/ImageApplyHeaders.h" -//#include -class tiny_buffer; -namespace hg_imgproc -{ - typedef struct _img_data - { - int img_fmt; // 图片格式(BMP、PNG……,暂时未用) - int width; // 行宽度(像素数) - int height; // 高度(像素数) - int line_bytes; // 每行的字节数 - int bits; // 每个像素的位深 - bool is_bw; // 是否为黑白图片,由图像处理模块设置 - unsigned bytes; // 图像数据字节数(buf中的字节数) - void* ip_data; // 图像处理模块的自定义数据,调用者不要随意更改此值!!! - void* buf; // 图像数据信息 - }IMGDATA, *LPIMGDATA; - - // 用于释放图像处理模块返回的各种动态内存, mem[i] == NULL 时终止,下列相同参数均照此规则 - void imgproc_free_memory(LPIMGDATA* mem); - - // 所有函数均返回“int”值,代表错误代码, 0为成功,其它错误码由图像处理模块开发者定义 - - // Function: 用于将原始数据(如图像文件内容),解码为target_fmt指定的图像格式 - // - // Parameters: raw - 原始的图像数据 - // - // bytes - raw中数据字节数 - // - // bits - 位深 - // - // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 - // - // Return: 错误码 - // - // NOTE: 该函数返回的out结构体中,buf为图像处理的中间数据类型(如cv::mat*),要想获取最终的图片数据, - // 需要再调用 imgproc_final 函数进行转换 - int imgproc_decode(void* buf, unsigned bytes, int bits, LPIMGDATA** out); - - // Function: 将倾斜的文本校正 - // - // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 - // - // [out]: 最终的图像数据 - // - // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 - // - // dpi - 图片DPI - // - // double_face - 是否双面 - // - // Return: 错误码 - int imgproc_correct_text(LPIMGDATA** raw, int dpi, bool double_face); // 适用于raw从其它图像处理函数返回的情况 - int imgproc_correct_text(LPIMGDATA* raw, LPIMGDATA** out, int dpi, bool double_face); // 适用于raw从文件或者内存中转换而来 - - // Function: 自动匹配颜色 - // - // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 - // - // [out]: 最终的图像数据 - // - // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 - // - // double_face - 是否双面 - // - // Return: 错误码 - int imgproc_auto_adjust_color(LPIMGDATA** raw, bool double_face); // 适用于raw从其它图像处理函数返回的情况 - int imgproc_auto_adjust_color(LPIMGDATA* raw, LPIMGDATA** out, bool double_face); // 适用于raw从文件或者内存中转换而来 - - // Function: 图像拆分 - // - // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 - // - // [out]: 最终的图像数据 - // - // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 - // - // Return: 错误码 - int imgproc_split(LPIMGDATA** raw); // 适用于raw从其它图像处理函数返回的情况 - int imgproc_split(LPIMGDATA* raw, LPIMGDATA** out); // 适用于raw从文件或者内存中转换而来 - - // Function: 多流输出 - // - // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 - // - // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 - // - // dpi - 图片DPI - // - // double_face - 是否双面 - // - // Return: 错误码 - int imgproc_multi_out(LPIMGDATA* raw, LPIMGDATA** out, int dpi, bool double_face); - - enum - { - TARGET_FORMAT_GRAY = 1 << 0, - TARGET_FORMAT_BLACK_WHITE = 1 << 1, - TARGET_FORMAT_RGB = 1 << 2, - }; - // Function: 用于将图像处理过程的中间态数据,转换为最终的图片数据 - // - // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止,通常该变量是由其它图像处理函数返回的 - // - // [out]: 最终的图像数据 - // - // target_fmt - 预期解码到的格式,TARGET_FORMAT_xxx - // - // Return: 错误码 - int imgproc_final(LPIMGDATA** raw, int target_fmt, int dpi); - - - - //////////////////////////////////////////////////////////////////////////////// - // NEW,flow ... - // - // 1 - call init to initialize an image processing object handle HIMGPRC - // - // 2 - call load_buffer or load_file to load raw data - // - // 3 - call image-processing methods - // - // 4 - repeat step-3 - // - // 5 - call final to got outputing data - // - // 6 - call get_final_data to get outputing data, while return SCANNER_ERR_NO_DATA - // - // 7 - call release to free the HIMGPRC handle - // - //////////////////////////////////////////////////////////////////////////////// - typedef void* HIMGPRC; - typedef struct _img_proc_param - { - int dpi; - int bits; // 单分量位深 - int channels; - int color_mode; - bool double_side; - bool black_white; - bool cis_image; //设置原图 - }IMGPRCPARAM, *LPIMGPRCPARAM; - typedef struct _img_header - { - int width; // in pixel - int height; // in pixel - int bits; // per channel - int channels; // RGB - 3; GRAY - 1; ... - int line_bytes; // bytes of ONE line - unsigned total_bytes;// total bytes - SANE_Image_Statu statu; // added on 2022-07-23 - }IMGHEAD, *LPIMGHEAD; - - - HIMGPRC init(int pid, bool isx86Advan_); - int load_buffer(HIMGPRC himg,std::shared_ptr buff); - int load_file(HIMGPRC himg, const char* path_file); - - //图像数据转换 - int decode(HIMGPRC himg,int pid, LPSCANCONF img_param, LPIMGPRCPARAM param); - int correct_text(HIMGPRC himg); - - int init_auto_txt_hanld(HIMGPRC himg); - int free_auto_txt_hanld(HIMGPRC himg); - //拆分 - int split(HIMGPRC himg,int split3399); - int fadeback(HIMGPRC himg); - int multi_out(HIMGPRC himg,int out_type); - int multi_out_red(HIMGPRC himg); - int auto_matic_color(HIMGPRC himg,int color_type); - int auto_crop(HIMGPRC himg, float dpi); - int fillhole(HIMGPRC himg, float top, float low, float r, float l); - int resolution_change(HIMGPRC himg,float dpi3288); - int croprect(HIMGPRC himg); - int channel(HIMGPRC himg); - int adjust_color(HIMGPRC himg, unsigned char* table = nullptr, int tableLength = 0/*default value is to adjust color, or apply custom gamma*/); - int antiInflow(HIMGPRC himg,int permeate_lv); - int colorCorrection(HIMGPRC himg); - int orentation(HIMGPRC himg); - int textureRemove(HIMGPRC himg); - int remove_morr(HIMGPRC himg); - int sharpenType(HIMGPRC himg); - int nosieDetach(HIMGPRC himg); - int errorextention(HIMGPRC himg); - int discardBlank(HIMGPRC himg); - int answerSheetFilterRed(HIMGPRC himg); - int imgtypechange(HIMGPRC himg,std::string img_type_,void *buf,std::vector &bmpdata); - int fold(HIMGPRC himg); - int quality(HIMGPRC himg,int dpi); - int ocr_auto_txtdirect(HIMGPRC himg); - int tesseract_auto_txtdirect(HIMGPRC himg); - int size_detection(HIMGPRC himg); - int cis_test_image(HIMGPRC himg, CISTestImageProcess::CISTestResult& res); - int color_cast_correction(HIMGPRC himg); - int final(HIMGPRC himg); - - // pimh must not to be NULL, and pimh->total_bytes indicates the length of 'buf' - // - // if 'buf' was NULL, then return SCANNER_ERR_INSUFFICIENT_MEMORY - // - // index is ZERO-base, if index is valid, fill the 'pimh' first, and copy data to buf if it was not NULL - // return SCANNER_ERR_NO_DATA if it was out of range - // - // return SCANNER_ERR_OK if index has valid image data and buf is large enough - int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, void** buf, int index = 0); - int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, std::vector* buf, int index); - void dump_2_file(HIMGPRC himg, const char* local_file); - void release(HIMGPRC himg); - - // seperate utilites ... - int convert_image_file(SANE_ImageFormatConvert* conv); - int save_2_bmp_file(const char* bmp_file, LPIMGHEAD head, void* buf, int resolution); - - std::string bmp8_2_1bit(const unsigned char* data, int w, int h, int line_len, int threshold, bool reverse, bool align); -} diff --git a/hgdriver/hgdev/imgproc-pak/fill_hole.cpp b/hgdriver/hgdev/imgproc-pak/fill_hole.cpp index 52aa371..9b07c31 100644 --- a/hgdriver/hgdev/imgproc-pak/fill_hole.cpp +++ b/hgdriver/hgdev/imgproc-pak/fill_hole.cpp @@ -3,7 +3,7 @@ #include #include #include - +#include diff --git a/hgdriver/hgdev/scanner/async_usb_host.cpp b/hgdriver/hgdev/scanner/async_usb_host.cpp new file mode 100644 index 0000000..bab7eeb --- /dev/null +++ b/hgdriver/hgdev/scanner/async_usb_host.cpp @@ -0,0 +1,844 @@ +#include "async_usb_host.h" + + + + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// async_usb_host +async_usb_host::async_usb_host(std::function cmd_handler) + : handler_(cmd_handler), usb_dev_(nullptr), usb_handle_(nullptr), run_(true), cancel_write_(false), writing_(false) + , head_enc_type_(ENCRYPT_CMD_NONE), payload_enc_type_(ENCRYPT_NONE), enc_data_(0), buf_coef_(1) +{ + memset(&bulk_in_, -1, sizeof(bulk_in_)); + memset(&bulk_out_, -1, sizeof(bulk_out_)); + bulk_in_.claimed = bulk_out_.claimed = 0; +} +async_usb_host::~async_usb_host() +{ + stop(); +} + +int async_usb_host::enum_usb_endpoints(libusb_device* dev, std::vector& eps) +{ + libusb_device_descriptor desc; + libusb_config_descriptor* conf = NULL; + int ret = libusb_get_device_descriptor(dev, &desc); + bool found_ep = false; + + for (int i = 0; i < (int)desc.bNumConfigurations; ++i) + { + if (libusb_get_config_descriptor(dev, i, &conf)) + continue; + + for (int j = 0; j < conf->bNumInterfaces; ++j) + { + for (int k = 0; k < conf->interface[j].num_altsetting; ++k) + { + for (int l = 0; l < conf->interface[j].altsetting[k].bNumEndpoints; ++l) + { + USBEP ep; + + ep.iconf = i; + ep.iface = j; + ep.type = conf->interface[j].altsetting[k].endpoint[l].bmAttributes; + ep.port = conf->interface[j].altsetting[k].endpoint[l].bEndpointAddress & (LIBUSB_ENDPOINT_IN | LIBUSB_ENDPOINT_OUT | 3); + ep.claimed = 0; + ep.max_packet = conf->interface[j].altsetting[k].endpoint[l].wMaxPacketSize; + eps.push_back(std::move(ep)); + } + } + } + libusb_free_config_descriptor(conf); + } + + return ret; +} +dyn_mem_ptr async_usb_host::base_packet(int cmd, uint32_t id, uint32_t encrypt) +{ + dyn_mem_ptr data(dyn_mem::memory(sizeof(PACK_BASE))), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + data->set_len(sizeof(PACK_BASE)); + BASE_PACKET_REPLY(*pack, cmd, id, 0); + enc = packet_encrypt(data, encrypt); + data->release(); + data = enc; + + return data; +} + +int async_usb_host::start(libusb_device* dev) +{ + std::vector eps; + int ret = stop(); + + if (ret) + return ret; + + ret = libusb_open(dev, &usb_handle_); + if (ret) + return ret; + + ret = async_usb_host::enum_usb_endpoints(dev, eps); + if (ret) + { + libusb_close(usb_handle_); + return ret; + } + + std::sort(eps.begin(), eps.end()); + for (auto& v : eps) + { + if (v.type == LIBUSB_TRANSFER_TYPE_BULK) + { + if (v.port & LIBUSB_ENDPOINT_IN) + { + bulk_in_ = v; + } + else + { + bulk_out_ = v; + } + } + } + if (bulk_in_.port == (uint8_t)-1 || bulk_out_.port == (uint8_t)-1) + { + stop(); + + return ENOENT; + } + + ret = libusb_claim_interface(usb_handle_, bulk_in_.iface); + if (ret) + { + stop(); + + return ret; + } + bulk_in_.claimed = 1; + if (bulk_in_.iface != bulk_out_.iface) + { + ret = libusb_claim_interface(usb_handle_, bulk_out_.iface); + if (ret) + { + stop(); + + return ret; + } + + bulk_out_.claimed = 1; + } + + run_ = true; + libusb_ref_device(dev); + usb_dev_ = dev; + + create_worker_threads(); + + return ret; +} +int async_usb_host::stop(void) +{ + dyn_mem_ptr data = nullptr; + data_source_ptr out = nullptr; + + run_ = false; + stop_worker_threads(); + in_que_.trigger(); + while (in_que_.take(data)) + data->release(); + out_que_.trigger(); + while (out_que_.take(out)) + out->release(); + + if (usb_handle_) + { + if (bulk_in_.claimed) + libusb_release_interface(usb_handle_, bulk_in_.iface); + if(bulk_out_.claimed) + libusb_release_interface(usb_handle_, bulk_out_.iface); + + libusb_close(usb_handle_); + usb_handle_ = nullptr; + } + if (usb_dev_) + { + libusb_unref_device(usb_dev_); + usb_dev_ = nullptr; + } + memset(&bulk_in_, -1, sizeof(bulk_in_)); + memset(&bulk_out_, -1, sizeof(bulk_out_)); + bulk_in_.claimed = bulk_out_.claimed = 0; + + return 0; +} + +uint32_t& async_usb_host::encrypt_type_packet_head(void) +{ + return head_enc_type_; // = ENCRYPT_CMD_NONE; +} +uint32_t& async_usb_host::encrypt_type_payload(void) +{ + return payload_enc_type_; +} +uint8_t& async_usb_host::encrypt_data(void) +{ + return enc_data_; +} + +void async_usb_host::thread_read_bulk(void) +{ + size_t buf_size = buf_coef_ * bulk_in_.max_packet; + dyn_mem_ptr mem = dyn_mem::memory(buf_size); + + utils::to_log(LOG_LEVEL_ALL, "thread_read_bulk working ...\r\n"); + while (run_) + { + int r = 0, + err = libusb_bulk_transfer(usb_handle_, bulk_in_.port, mem->ptr(), buf_size, &r, -1); + + if (err) + { + if (err == LIBUSB_ERROR_TIMEOUT || err == LIBUSB_ERROR_INTERRUPTED) + { + continue; + } + else + { + // handle the error ... + utils::to_log(LOG_LEVEL_FATAL, "thread_read_bulk FATAL error: %d\r\n", err); + break; + } + } + + mem->set_len(r); + in_que_.save(mem, true); + buf_size = buf_coef_ * bulk_in_.max_packet; + mem = dyn_mem::memory(buf_size); + } + + if (mem) + mem->release(); + utils::to_log(LOG_LEVEL_ALL, "thread_read_bulk exited.\r\n"); +} +void async_usb_host::thread_write_bulk(void) +{ + utils::to_log(LOG_LEVEL_ALL, "thread_write_bulk working ...\r\n"); + while (run_) + { + data_source_ptr data = nullptr; + if (out_que_.take(data, true) && data) + { + int err = 0; + + if(!cancel_write_) + inner_write_bulk(data, &err); + data->release(); + if (err && err != ECANCELED) + { + // handle the error ... + utils::to_log(LOG_LEVEL_FATAL, "thread_write_bulk FATAL error: %d\r\n", err); + break; + } + } + } + utils::to_log(LOG_LEVEL_ALL, "thread_write_bulk exited.\r\n"); +} +void async_usb_host::thread_pump_task(void) +{ + dyn_mem_ptr prev = nullptr, data = nullptr, reply = nullptr; + bool in_err_statu = false; + uint32_t required = 0, used = 0, restore_err_cnt = 0; + data_holder* dh = nullptr; + LPPACK_BASE pack = nullptr; + + utils::to_log(LOG_LEVEL_ALL, "thread_pump_task working ...\r\n"); + while (run_) + { + data = nullptr; + if (in_que_.take(data, true) && data) + { + if (prev) + { + *prev += *data; + data->release(); + data = prev; + prev = nullptr; + } + + do + { + packet_data_base_ptr pack_data = nullptr; + data_source_ptr ds = nullptr; + + if (dh == nullptr) + { + if (data->get_rest() < sizeof(PACK_BASE)) + break; + else + { + used = data->get_rest(); + reply = handle_data_in(data, &used, &pack_data); + if (pack_data) + { + dh = dynamic_cast(pack_data); + if (!dh) + { + ds = dynamic_cast(pack_data); + if (!ds) + pack_data->release(); + } + } + } + } + else + { + uint32_t len = data->get_rest(); + int err = dh->put_data(data->ptr(), &len); + + if (dh->is_complete() || err) + { + //reply = dyn_mem::memory(sizeof(PACK_BASE)); + //pack = (LPPACK_BASE)reply->ptr(); + //BASE_PACKET_REPLY(*pack, dh->get_packet_command() + 1, dh->get_packet_id(), err); + //reply->set_len(sizeof(PACK_BASE)); + + dh->release(); + dh = nullptr; + } + used = len; + + if (err) + { + in_err_statu = true; + restore_err_cnt = 0; + } + } + + // first reply the packet ... + if (reply) + { + post_2_write_bulk_thread(dynamic_cast(reply)); + reply->release(); + reply = nullptr; + } + + // second send appendix data ... + if (ds) + { + post_2_write_bulk_thread(ds); + ds->release(); + ds = nullptr; + } + + data->used(used); + } while (used && data->get_rest()); + + if (data->get_rest()) + prev = data; + else + data->release(); + } + } + if (prev) + prev->release(); + if (data) + data->release(); + if (reply) + reply->release(); + if (dh) + dh->release(); + utils::to_log(LOG_LEVEL_ALL, "thread_pump_task exited.\r\n"); +} +void async_usb_host::create_worker_threads(void) +{ + thread_w_.reset(new std::thread(&async_usb_host::thread_write_bulk, this)); + thread_r_.reset(new std::thread(&async_usb_host::thread_read_bulk, this)); + thread_p_.reset(new std::thread(&async_usb_host::thread_pump_task, this)); +} +void async_usb_host::stop_worker_threads(void) +{ +#define WAIT_THREAD(t) \ + if(t.get() && t->joinable()) \ + t->join(); + + WAIT_THREAD(thread_w_); + WAIT_THREAD(thread_r_); + WAIT_THREAD(thread_p_); +} + +int async_usb_host::bulk_write_buf(uint8_t* buf, int* len) +{ + int bulk_size = bulk_out_.max_packet * buf_coef_, + total = 0, + l = bulk_size <= *len ? bulk_size : *len, + s = 0, + err = 0; + + do + { + while ((err = libusb_bulk_transfer(usb_handle_, bulk_out_.port, buf, l, &s, 1000)) == 0) + { + if (cancel_write_) + { + err = ECANCELED; + break; + } + + total += s; + if (total >= *len) + break; + + buf += s; + if (*len - total < bulk_size) + l = *len - total; + else + l = bulk_size; + } + } while (err == LIBUSB_ERROR_INTERRUPTED); // should pay more attention to this error !!! + *len = total; + + return err; +} +int async_usb_host::inner_write_bulk(data_source_ptr data, int* err) +{ + unsigned char* ptr = data->ptr(); + size_t bulk_size = bulk_out_.max_packet * buf_coef_, + total = data->get_rest(); + int e = 0, s = 0; + + writing_ = true; + if (data->is_memory_block()) + { + s = total; + e = bulk_write_buf(ptr, &s); + if (err) + *err = e; + total = s; + } + else + { + dyn_mem_ptr twin[] = { dyn_mem::memory(bulk_size), dyn_mem::memory(bulk_size) }, + buf = twin[0]; + int ind = 0; + uint32_t len = bulk_size; + + if (err) + *err = 0; + total = 0; + while ((e = data->fetch_data(buf->ptr(), &len)) == 0) + { + buf->set_len(len); + if (len == 0) + utils::to_log(LOG_LEVEL_WARNING, "ZERO byte content fetched!\r\n"); + + do + { + if (e) + utils::to_log(LOG_LEVEL_WARNING, "Write failed at + 0x%08X with error 0x%x, we try again ...\r\n", total, e); + + ptr = buf->ptr(); + s = len; + e = bulk_write_buf(ptr, &s); + } while (e == LIBUSB_ERROR_INTERRUPTED || e == LIBUSB_ERROR_TIMEOUT); + + if (e) + { + utils::to_log(LOG_LEVEL_ALL, "Write failed at +0x%08X with error: 0x%x. (Rest: %u)\r\n", total, e, data->get_rest()); + if (err) + *err = e; + break; + } + else + total += s; + + if (data->get_rest() == 0) + break; + len = bulk_size; + ind ^= 1; + buf = twin[ind]; + } + twin[0]->release(); + twin[1]->release(); + } + writing_ = false; + + return total; +} +void async_usb_host::post_2_write_bulk_thread(data_source_ptr data) +{ + data->add_ref(); + out_que_.save(data, true); +} +dyn_mem_ptr async_usb_host::handle_data_in(dyn_mem_ptr& data, uint32_t* used, packet_data_base_ptr* more) +{ + dyn_mem_ptr decrypt = packet_decrypt(data); + + if (decrypt) + { + data->release(); + data = decrypt; + + return handler_(data, used, more); + } + else + { + *used = data->get_rest(); + *more = nullptr; + + return nullptr; + } +} + +int async_usb_host::get_peer_protocol_version(uint16_t* ver) +{ + uint16_t v = 0; + int err = libusb_control_transfer(usb_handle_, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN + , USB_REQ_EP0_GET_PROTO_VER, 0, 0 + , (unsigned char*)&v, sizeof(v) + , 1000); + + if (ver) + *ver = v; + + return err == sizeof(v) ? 0 : EFAULT; +} +int async_usb_host::get_peer_status(LPEP0REPLYSTATUS status) +{ + return libusb_control_transfer(usb_handle_, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN + , USB_REQ_EP0_GET_STATUS, 0, 0 + , (unsigned char*)status, sizeof(*status) + , 1000) == sizeof(*status) ? 0 : EFAULT; +} +int async_usb_host::restart_peer_bulk(uint32_t timeout) +{ + EP0REPLYSTATUS status = { 0 }; + chronograph tc; + int ok = 0, + w = 0, + err = libusb_control_transfer(usb_handle_, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN + , USB_REQ_EP0_RESET_BULK, 0, 0 + , (unsigned char*)&ok, sizeof(ok) + , 1000); + + tc.reset(); + while ((err = get_peer_status(&status)) == 0 && ok == 0) + { + if (status.in_status == BULK_STATUS_IDLE) + break; + + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + if (tc.elapse_ms() > timeout) + { + err = ETIMEDOUT; + break; + } + } + + return err ? err : ok; +} +int async_usb_host::reset_io_buffer_size(unsigned short size) +{ + libusb_control_transfer(usb_handle_, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT + , USB_REQ_EP0_SET_BULK_BUFFER, 0, size + , nullptr, 0 + , 1000); + { + buf_coef_ = size; + + return 0; + } + + return EFAULT; +} +int async_usb_host::get_io_buffer_size(void) +{ + return buf_coef_; +} +int async_usb_host::set_gadget_encrypting_method(uint32_t cmd_enc, uint32_t payload_enc, uint8_t enc_data) +{ + dyn_mem_ptr ptr(dyn_mem::memory(sizeof(PACK_BASE))); + LPPACK_BASE pack = (LPPACK_BASE)ptr->ptr(); + int err = 0; + + pack->size = sizeof(*pack); + pack->enc_cmd = cmd_enc; + pack->encrypt = payload_enc; + pack->enc_data = enc_data; + err = libusb_control_transfer(usb_handle_, LIBUSB_REQUEST_TYPE_VENDOR, USB_REQ_EP0_SET_ENCRYPT, 0, 0 + , (unsigned char*)pack, sizeof(*pack) + , 1000); + ptr->release(); + + return err; +} + +int async_usb_host::send_heart_beat(uint32_t pack_id) +{ + dyn_mem_ptr data(async_usb_host::base_packet(PACK_CMD_HEART_BEAT, pack_id, head_enc_type_)); + + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::get_settings(uint32_t pack_id) +{ + dyn_mem_ptr data(async_usb_host::base_packet(PACK_CMD_SETTING_GET, pack_id, head_enc_type_)); + + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::get_setting_val(uint32_t pack_id, const char* name) +{ + dyn_mem_ptr data(dyn_mem::memory(sizeof(PACK_BASE) + strlen(name) + 1)), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + BASE_PACKET_REPLY(*pack, PACK_CMD_SETTING_GET_CUR, pack_id, 0); + pack->payload_len = strlen(name) + 1; + strcpy(pack->payload, name); + data->set_len(sizeof(PACK_BASE) + strlen(name) + 1); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::set_setting(uint32_t pack_id, const char* name, int type, void* val, size_t size, size_t size0) +{ + int base = sizeof(PACK_BASE), + datal = sizeof(CFGVAL) + strlen(name) + 1 + size; + dyn_mem_ptr data(dyn_mem::memory(base + datal)), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + LPCFGVAL param = (LPCFGVAL)pack->payload; + + BASE_PACKET_REPLY(*pack, PACK_CMD_SETTING_SET, pack_id, 0); + pack->payload_len = datal; + param->type = type; + param->name_off = 0; + param->max_size = size0; + param->val_size = size; + param->val_off = strlen(name) + 1; + strcpy(param->data, name); + memcpy(param->data + param->val_off, val, size); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} + +int async_usb_host::scan_start(uint32_t pack_id) +{ + dyn_mem_ptr data(async_usb_host::base_packet(PACK_CMD_SCAN_START, pack_id, head_enc_type_)); + + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::scan_stop(uint32_t pack_id) +{ + dyn_mem_ptr data(async_usb_host::base_packet(PACK_CMD_SCAN_STOP, pack_id, head_enc_type_)); + + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} + +int async_usb_host::file_send(uint32_t pack_id, const char* remote_path, uint64_t size, uint64_t off) +{ + int base = sizeof(PACK_BASE), + datal = sizeof(TXFILE) + strlen(remote_path) + 1; + dyn_mem_ptr data = dyn_mem::memory(base + datal), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + LPTXFILE ptxf = (LPTXFILE)pack->payload; + + BASE_PACKET_REPLY(*pack, PACK_CMD_FILE_WRITE_REQ, pack_id, 0); + pack->payload_len = datal; + ptxf->offset = off; + ptxf->size = size; + strcpy(ptxf->path, remote_path); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::file_get(uint32_t pack_id, const char* remote_path, uint64_t off) +{ + int base = sizeof(PACK_BASE), + datal = sizeof(TXFILE) + strlen(remote_path) + 1; + dyn_mem_ptr data = dyn_mem::memory(base + datal), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + LPTXFILE ptxf = (LPTXFILE)pack->payload; + + BASE_PACKET_REPLY(*pack, PACK_CMD_FILE_READ_REQ, pack_id, 0); + pack->payload_len = datal; + ptxf->offset = off; + ptxf->size = 0; + strcpy(ptxf->path, remote_path); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::file_move(uint32_t pack_id, const char* from_path, const char* to_path) +{ + int base = sizeof(PACK_BASE), + datal = strlen(from_path) + 1 + strlen(to_path) + 1; + dyn_mem_ptr data = dyn_mem::memory(base + datal), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + BASE_PACKET_REPLY(*pack, PACK_CMD_FILE_MOVE, pack_id, 0); + pack->payload_len = datal; + strcpy(pack->payload, from_path); + strcpy(pack->payload + strlen(from_path) + 1, to_path); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::file_remove(uint32_t pack_id, const char* file) +{ + int base = sizeof(PACK_BASE), + datal = strlen(file) + 1; + dyn_mem_ptr data = dyn_mem::memory(base + datal), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + BASE_PACKET_REPLY(*pack, PACK_CMD_FILE_REMOVE, pack_id, 0); + pack->payload_len = datal; + strcpy(pack->payload, file); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} + +int async_usb_host::program_start(uint32_t pack_id, const char* pe_path, const char* param) +{ + int base = sizeof(PACK_BASE), + datal = strlen(pe_path) + 1 + strlen(param ? param : "") + 1; + dyn_mem_ptr data = dyn_mem::memory(base + datal), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + if (!param) + param = ""; + BASE_PACKET_REPLY(*pack, PACK_CMD_PROCESS_START, pack_id, 0); + pack->payload_len = datal; + strcpy(pack->payload, pe_path); + strcpy(pack->payload + strlen(param) + 1, param); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::program_stop(uint32_t pack_id, uint64_t pid) +{ + std::string id(std::to_string(pid)); + int base = sizeof(PACK_BASE), + datal = id.length() + 1; + dyn_mem_ptr data = dyn_mem::memory(base + datal), enc = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + BASE_PACKET_REPLY(*pack, PACK_CMD_PROCESS_STOP, pack_id, 0); + pack->payload_len = datal; + strcpy(pack->payload, id.c_str()); + data->set_len(base + datal); + enc = packet_encrypt(data, head_enc_type_, payload_enc_type_, enc_data_); + if (enc) + { + data->release(); + data = enc; + } + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} +int async_usb_host::program_reboot(uint32_t pack_id) +{ + dyn_mem_ptr data(async_usb_host::base_packet(PACK_CMD_PROCESS_REBOOT, pack_id, head_enc_type_)); + + post_2_write_bulk_thread(data); + data->release(); + + return 0; +} + +int async_usb_host::cancel_write(void) +{ + data_source_ptr data = nullptr; + + cancel_write_ = true; + while (out_que_.take(data)) + data->release(); + while (writing_) + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + cancel_write_ = false; + + return 0; +} +int async_usb_host::raw_control(uint8_t type, uint8_t req, uint16_t ind, uint16_t val, uint16_t len, void* data) +{ + return libusb_control_transfer(usb_handle_, type + , req, val, ind + , (unsigned char*)data, len + , 1000); +} +int async_usb_host::send_bulk_raw_data(dyn_mem_ptr data) +{ + post_2_write_bulk_thread(data); + + return 0; +} diff --git a/hgdriver/hgdev/scanner/async_usb_host.h b/hgdriver/hgdev/scanner/async_usb_host.h new file mode 100644 index 0000000..45759e1 --- /dev/null +++ b/hgdriver/hgdev/scanner/async_usb_host.h @@ -0,0 +1,109 @@ +// async_usb_host +// +// created on 2023-03-24 +// +#pragma once + +#include + +#include +#include +#include +#include +#include + + +typedef struct _usb_ep +{ + uint8_t iconf; + uint8_t iface; + uint8_t type; + uint8_t port; + uint8_t claimed; + uint16_t max_packet; + + bool operator<(const struct _usb_ep& r) + { + return iface < r.iface; + } +}USBEP; + +class async_usb_host : public refer +{ + std::function handler_; + volatile bool run_; + volatile bool writing_; + volatile bool cancel_write_; + volatile int buf_coef_; + libusb_device_handle* usb_handle_; + libusb_device* usb_dev_; + USBEP bulk_in_; + USBEP bulk_out_; + safe_fifo in_que_; + safe_fifo out_que_; + std::unique_ptr thread_w_; + std::unique_ptr thread_r_; + std::unique_ptr thread_p_; + + uint32_t head_enc_type_; + uint32_t payload_enc_type_; + uint8_t enc_data_; + + void thread_read_bulk(void); + void thread_write_bulk(void); + void thread_pump_task(void); + void create_worker_threads(void); + void stop_worker_threads(void); + + int bulk_write_buf(uint8_t* buf, int* len); // return error code + int inner_write_bulk(data_source_ptr data, int* err); + void post_2_write_bulk_thread(data_source_ptr data); + dyn_mem_ptr handle_data_in(dyn_mem_ptr& data, uint32_t* used, packet_data_base_ptr* more); + +public: + async_usb_host(std::function cmd_handler = std::function()); + +protected: + virtual ~async_usb_host(); + +public: + static int enum_usb_endpoints(libusb_device* dev, std::vector& eps); + static dyn_mem_ptr base_packet(int cmd, uint32_t id, uint32_t encrypt = ENCRYPT_CMD_NONE); + +public: + int start(libusb_device* dev); + int stop(void); + + uint32_t& encrypt_type_packet_head(void); + uint32_t& encrypt_type_payload(void); + uint8_t& encrypt_data(void); + +public: + int get_peer_protocol_version(uint16_t* ver); + int get_peer_status(LPEP0REPLYSTATUS status); + int restart_peer_bulk(uint32_t timeout = 1000/*ms*/); + int reset_io_buffer_size(unsigned short size); + int get_io_buffer_size(void); + int set_gadget_encrypting_method(uint32_t cmd_enc = ENCRYPT_CMD_NONE, uint32_t payload_enc = ENCRYPT_NONE, uint8_t enc_data = 0); + + int send_heart_beat(uint32_t pack_id); + int get_settings(uint32_t pack_id); + int get_setting_val(uint32_t pack_id, const char* name); + int set_setting(uint32_t pack_id, const char* name, int type, void* val, size_t size/*value size*/, size_t size0/*max size*/); + + int scan_start(uint32_t pack_id); + int scan_stop(uint32_t pack_id); + + int file_send(uint32_t pack_id, const char* remote_path, uint64_t size, uint64_t off = 0); + int file_get(uint32_t pack_id, const char* remote_path, uint64_t off = 0); + int file_move(uint32_t pack_id, const char* from_path, const char* to_path); + int file_remove(uint32_t pack_id, const char* file); + + int program_start(uint32_t pack_id, const char* pe_path, const char* param); + int program_stop(uint32_t pack_id, uint64_t pid); + int program_reboot(uint32_t pack_id); + + int cancel_write(void); + int raw_control(uint8_t type, uint8_t req, uint16_t ind, uint16_t val, uint16_t len, void* data); + int send_bulk_raw_data(dyn_mem_ptr data); +}; diff --git a/hgdriver/hgdev/scanner/scanner_handler.cpp b/hgdriver/hgdev/scanner/scanner_handler.cpp new file mode 100644 index 0000000..8795339 --- /dev/null +++ b/hgdriver/hgdev/scanner/scanner_handler.cpp @@ -0,0 +1,840 @@ +#include "scanner_handler.h" + + +#include "async_usb_host.h" + + + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cmd_result + +MUTEX cmd_result::lock_; +uint32_t cmd_result::pack_id_ = 1; + +cmd_result::cmd_result(std::function call, + std::function clean, + std::function roger, + void* param, uint32_t id) + : wait_(new platform_event("wait_reply")), id_(id == 0 ? cmd_result::gen_pack_id() : id) + , call_(call), clean_(clean), roger_(roger), param_(param), err_(0), to_(1000), over_(false) +{ +} +cmd_result::~cmd_result() +{ + wait_->release(); +} + +uint32_t cmd_result::gen_pack_id(void) +{ + SIMPLE_LOCK(cmd_result::lock_); + + return cmd_result::pack_id_++; +} + +uint32_t cmd_result::get_id(void) +{ + return id_; +} +uint32_t cmd_result::set_timeout(uint32_t timeout) +{ + uint32_t prev = to_; + + to_ = timeout; + + return prev; +} +void* cmd_result::get_param(void) +{ + return param_; +} +void* cmd_result::set_param(void* param) +{ + void* r = param_; + + param_ = param; + + return r; +} +bool cmd_result::wait(void) +{ + return wait_->wait(to_); +} +void cmd_result::trigger(void) +{ + over_ = true; + wait_->trigger(); +} +bool cmd_result::is_over(void) +{ + return over_; +} +int cmd_result::get_error_code(void) +{ + return err_; +} +void cmd_result::set_error_code(int err) +{ + err_ = err; +} + +int cmd_result::call(void) +{ + int ret = call_(this); + + if (ret == 0) + { + if (wait()) + { + ret = err_; + } + else + { + ret = ETIMEDOUT; + } + } + + return ret; +} +dyn_mem_ptr cmd_result::roger(dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more) +{ + SIMPLE_LOCK(locker_); + dyn_mem_ptr ret = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + err_ = pack->data; + ret = roger_(data, used, more, this); +// trigger(); + + return ret; +} +int cmd_result::clean(void) +{ + SIMPLE_LOCK(locker_); + + over_ = true; + return clean_(this); +} + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// though all command transferred by BULK are asychronous in transffer level, +// make BLOCKED in this layer +#define WAIT_COMMAND(call, clean, roger, param) \ + cmd_result * r = gen_reply(call, clean, roger, param); \ + int ret = r->call(); \ + r->clean(); \ + r->release(); \ + return ret; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// scanner_handler +scanner_handler::scanner_handler(void) : usb_(nullptr), status_(SCANNER_STATUS_NOT_OPEN) + , img_receiver_(std::function()) + , status_notify_(std::function()) +{ + auto on_reply = [&](dyn_mem_ptr reply, uint32_t* used, packet_data_base_ptr* more) ->dyn_mem_ptr + { + LPPACK_BASE pack = (LPPACK_BASE)reply->ptr(); + cmd_result* cmd = take_reply(pack->pack_id); + dyn_mem_ptr ret = nullptr; + + *used = reply->get_rest(); + *more = nullptr; + if (cmd) + { + ret = cmd->roger(reply, used, more); + if (cmd->is_over()) + cmd->release(); + else if (status_ != SCANNER_STATUS_RESET_BULK) + { + SIMPLE_LOCK(lock_reply_); + + reply_.push_back(cmd); + } + } + else if (status_ == SCANNER_STATUS_RESET_BULK) + { + if (pack->size == sizeof(PACK_BASE) && + pack->cmd == PACK_CMD_SYNC_ROGER && + pack->payload_len == 0) + status_ = SCANNER_STATUS_READY; + } + else if (pack->size == sizeof(PACK_BASE)) + { + if (pack->cmd == PACK_CMD_SCAN_IMG_ROGER) + { + uint32_t off = sizeof(PACK_BASE) + sizeof(PACKIMAGE); + if (*used < off) + { + *used = 0; + } + else + { + LPPACKIMAGE pimg = (LPPACKIMAGE)pack->payload; + data_holder_ptr receiver = nullptr; + + if(img_receiver_) + receiver = img_receiver_(pimg, pimg->info_size + pimg->data_size); + + if (!receiver) + { + // usb_->cancel_command(pack->cmd, pack->pack_id); + receiver = dynamic_cast(new empty_holer(pimg->info_size + pimg->data_size)); + } + + *used = off; + *more = dynamic_cast(receiver); + } + } + else if (pack->cmd == PACK_CMD_SCAN_PAPER_ROGER) + { + if (img_receiver_) + { + data_holder_ptr receiver = img_receiver_(IMG_RECEIVER_PAPER_CNT, pack->data); + if (receiver) + receiver->release(); + } + *used = sizeof(PACK_BASE); + } + else if (pack->cmd == PACK_CMD_SCAN_FINISHED_ROGER) + { + if (img_receiver_) + { + data_holder_ptr receiver = img_receiver_(IMG_RECEIVER_FINISHED, pack->data); + if (receiver) + receiver->release(); + } + *used = sizeof(PACK_BASE); + status_ = pack->data; + } + else if (pack->cmd == PACK_CMD_STATUS_ROGER) + { + *used = sizeof(PACK_BASE); + status_ = pack->data; + if (status_notify_) + status_notify_(status_); + } + else if (pack->cmd == PACK_CMD_FILE_WRITE_REQ_ROGER) + { + *used = sizeof(PACK_BASE); + utils::to_log(LOG_LEVEL_DEBUG, "Send file finished with error: %d\r\n", pack->data); + } + else + { + // unknown packet ... + uint8_t* ptr = reply->ptr(); + utils::to_log(LOG_LEVEL_DEBUG, "Unhandled packet: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X ...\r\n" + , ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7] + , ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); + } + } + else + { + // unknown packet ... + uint8_t* ptr = reply->ptr(); + utils::to_log(LOG_LEVEL_DEBUG, "Unknown packet received: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X ...\r\n" + , ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7] + , ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); + } + + return ret; + }; + + usb_ = new async_usb_host(on_reply); +} +scanner_handler::~scanner_handler() +{ + usb_->stop(); + + for (auto& v : reply_) + v->release(); + usb_->release(); +} + +cmd_result* scanner_handler::gen_reply(std::function call, + std::function clean, + std::function roger, + void* param, uint32_t id) +{ + cmd_result* reply = new cmd_result(call, clean, roger, param, id); + + { + SIMPLE_LOCK(lock_reply_); + + reply_.push_back(reply); + } + reply->add_ref(); // for reply_ queue storing + + return reply; +} +cmd_result* scanner_handler::take_reply(uint32_t id) +{ + cmd_result* reply = nullptr; + SIMPLE_LOCK(lock_reply_); + + for (size_t i = 0; i < reply_.size(); ++i) + { + if (reply_[i]->get_id() == id) + { + reply = reply_[i]; + reply_.erase(reply_.begin() + i); + break; + } + } + + return reply; +} +int scanner_handler::wait_result(cmd_result* reply) +{ + if (reply->wait()) + { + return reply->get_error_code(); + } + else + { + cmd_result* q = take_reply(reply->get_id()); + + if (q) + { + q->release(); + } + else + { + // take out by reply just now ? try again ... + reply->set_timeout(500); + if (reply->wait()) + return reply->get_error_code(); + } + + return ETIMEDOUT; + } +} + +int scanner_handler::get_protocol_version(uint16_t* ver) +{ + if (!is_scanner_available()) + return ENODEV; + + return usb_->get_peer_protocol_version(ver); +} +int scanner_handler::get_scanner_status(LPEP0REPLYSTATUS status) +{ + if (!is_scanner_available()) + return ENODEV; + + return usb_->get_peer_status(status); +} +int scanner_handler::restart_peer_bulk(uint32_t timeout) +{ + if (!is_scanner_available()) + return ENODEV; + + return usb_->restart_peer_bulk(timeout); +} +int scanner_handler::set_io_buffer_size(unsigned short size) +{ + if (!is_scanner_available()) + return ENODEV; + + return usb_->reset_io_buffer_size(size); +} +int scanner_handler::get_io_buffer_size(void) +{ + if (!is_scanner_available()) + return 1; + + return usb_->get_io_buffer_size(); +} + +int scanner_handler::option_get_all(std::string& json_opts) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->get_settings(cmd->get_id()); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + std::string *ret = (std::string*)cmd->get_param(); + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + if (data->get_rest() < sizeof(PACK_BASE) + pack->payload_len) + *used = 0; + else + { + if(!cmd->is_over()) + *(std::string*)cmd->get_param() = std::string(pack->payload, pack->payload_len); + *used = sizeof(*pack) + pack->payload_len; + cmd->trigger(); + } + *more = nullptr; + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, &json_opts); +} +int scanner_handler::option_value_get(const char* name, void* buf, uint32_t size) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->get_setting_val(cmd->get_id(), name); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + LPCFGVAL cfg = (LPCFGVAL)pack->payload; + + if (data->get_rest() < sizeof(PACK_BASE) + pack->payload_len) + *used = 0; + else + { + if (!cmd->is_over()) + memcpy(cmd->get_param(), cfg->data + cfg->val_off, cfg->val_size); + *used = sizeof(*pack) + pack->payload_len; + cmd->trigger(); + } + *more = nullptr; + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, buf); +} +int scanner_handler::option_value_set(const char* name, uint32_t type, void* buf, uint32_t size, uint32_t val_size, uint8_t* after) +{ + struct + { + void* buf; + uint8_t* after; + }param; + auto call = [&](cmd_result* cmd) -> int + { + memcpy(¶m, cmd->get_param(), sizeof(param)); + return usb_->set_setting(cmd->get_id(), name, type, param.buf, val_size, size); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + struct + { + void* buf; + uint8_t* after; + }*result = nullptr; + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + LPCFGVAL cfg = (LPCFGVAL)pack->payload; + + if (data->get_rest() < sizeof(PACK_BASE) + pack->payload_len) + *used = 0; + else + { + if (!cmd->is_over()) + { + *(void**)&result = cmd->get_param(); + memcpy(result->buf, cfg->data + cfg->val_off, cfg->val_size); + *result->after = cfg->after_do; + } + *used = sizeof(*pack) + pack->payload_len; + cmd->trigger(); + } + *more = nullptr; + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + param.buf = buf; + param.after = after; + WAIT_COMMAND(call, clean, roger, ¶m); +} +int scanner_handler::status_get(void) +{ + return status_; +} + +void scanner_handler::set_image_receiver(std::function img) +{ + img_receiver_ = img; +} +void scanner_handler::set_status_notifyer(std::function stntf) +{ + status_notify_ = stntf; +} +int scanner_handler::scan_start(void) +{ + auto call = [&](cmd_result* cmd) -> int + { + cmd->set_timeout(4000); + return usb_->scan_start(cmd->get_id()); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + *used = sizeof(PACK_BASE); + *more = nullptr; + status_ = SCANNER_STATUS_START_SCANNING; + cmd->trigger(); + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, nullptr); +} +int scanner_handler::scan_stop(void) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->scan_stop(cmd->get_id()); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + *used = sizeof(PACK_BASE); + *more = nullptr; + cmd->trigger(); + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, nullptr); +} + +int scanner_handler::file_transfer(const char* local_path, const char* remote_path, bool to_device, PROGRESS_NOTIFYER progress, uint64_t local_off, uint64_t remote_off) +{ + if (!is_scanner_available()) + return ENODEV; + + if (to_device) + { + uint64_t size = 0; + FILE *src = fopen(local_path, "rb"); + + if (!src) + return errno; + FSEEK(src, 0, SEEK_END); + size = FTELL(src); + FSEEK(src, local_off, SEEK_SET); + if (size <= local_off) + { + fclose(src); + + return EOVERFLOW; + } + size -= local_off; + utils::to_log(LOG_LEVEL_DEBUG, "Send '%s' to '%s' ...\r\n", local_path, remote_path); + + auto call = [&](cmd_result* cmd) -> int + { + return usb_->file_send(cmd->get_id(), remote_path, size, remote_off); + }; + auto clean = [&](cmd_result* cmd) -> int + { + FILE* src = (FILE*)cmd->get_param(); + + if (src) + fclose(src); + + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + dyn_mem_ptr ret = nullptr; + + *used = sizeof(PACK_BASE); + *more = nullptr; + utils::to_log(LOG_LEVEL_DEBUG, "Send file - Roger of send file result: %d\r\n", pack->data); + + if (pack->data == 0) + { + if (cmd->is_over()) + { + reset_message_que(); + } + else + { + file_reader_ptr freader = new file_reader(); + + int err = freader->attach((FILE*)cmd->set_param(nullptr)); + freader->set_progress_notify(progress); + if (err) + { + // cancel tx-file ... + cmd->set_error_code(err); + freader->release(); + reset_message_que(); + utils::to_log(LOG_LEVEL_DEBUG, "Send file - Attach to source file failed: %d\r\n", err); + } + else + { + *more = dynamic_cast(freader); + status_ = SCANNER_STATUS_BUSY; + utils::to_log(LOG_LEVEL_DEBUG, "Send file - beginning ...\r\n"); + } + } + } + cmd->trigger(); + + return ret; + }; + + WAIT_COMMAND(call, clean, roger, src); + } + else + { + auto call = [&](cmd_result* cmd) -> int + { + return usb_->file_get(cmd->get_id(), remote_path, remote_off); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + LPTXFILE pfi = (LPTXFILE)pack->payload; + + *used = sizeof(PACK_BASE) + pack->payload_len; + *more = nullptr; + utils::to_log(LOG_LEVEL_DEBUG, "Receive file - Roger result: %d\r\n", pack->data); + if (pack->data == 0) + { + if (cmd->is_over()) + { + utils::to_log(LOG_LEVEL_DEBUG, "Receive file - timeout, user cancelled\r\n"); + reset_message_que(); + } + else + { + file_saver* fsaver = new file_saver(); + int err = fsaver->open(local_path, pfi->size); + fsaver->set_progress_notify(progress); + if (err) + { + // cancel tx-file ... + cmd->set_error_code(err); + fsaver->release(); + reset_message_que(); + utils::to_log(LOG_LEVEL_DEBUG, "Receive file - open local file failed: %d\r\n", err); + } + else + { + *more = dynamic_cast(fsaver); + status_ = SCANNER_STATUS_BUSY; + utils::to_log(LOG_LEVEL_DEBUG, "Receive file - beginning ...\r\n"); + } + } + } + cmd->trigger(); + + return nullptr; + }; + + utils::to_log(LOG_LEVEL_DEBUG, "Receive '%s' to '%s' ...\r\n", remote_path, local_path); + + WAIT_COMMAND(call, clean, roger, (void*)local_path); + } +} +int scanner_handler::file_move(const char* rfrom, const char* rto) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->file_move(cmd->get_id(), rfrom, rto); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + *used = sizeof(PACK_BASE); + *more = nullptr; + cmd->trigger(); + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, nullptr); +} +int scanner_handler::file_delete(const char* remote) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->file_remove(cmd->get_id(), remote); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + *used = sizeof(PACK_BASE); + *more = nullptr; + cmd->trigger(); + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, nullptr); +} + +int scanner_handler::program_start(const char* remote_pe, const char* param, uint64_t* pid) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->program_start(cmd->get_id(), remote_pe, param); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + LPPACK_BASE pack = (LPPACK_BASE)data->ptr(); + + if (pack->data == 0 && !cmd->is_over()) + *(uint64_t*)cmd->get_param() = *(uint64_t*)pack->payload; + *used = sizeof(PACK_BASE) + pack->payload_len; + *more = nullptr; + cmd->trigger(); + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, pid); +} +int scanner_handler::program_stop(uint64_t pid) +{ + auto call = [&](cmd_result* cmd) -> int + { + return usb_->program_stop(cmd->get_id(), pid); + }; + auto clean = [&](cmd_result* cmd) -> int + { + return 0; + }; + auto roger = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more, cmd_result* cmd) ->dyn_mem_ptr + { + *used = sizeof(PACK_BASE); + *more = nullptr; + cmd->trigger(); + + return nullptr; + }; + + if (!is_scanner_available()) + return ENODEV; + + WAIT_COMMAND(call, clean, roger, nullptr); +} + +int scanner_handler::open_usb_scanner(libusb_device* dev) +{ + int ret = close(); + + if (ret == 0) + { + ret = usb_->start(dev); + if(ret == 0) + status_ = SCANNER_STATUS_READY; + //usb_->set_gadget_encrypting_method(ENCRYPT_CMD_XOR_PID); + } + + return ret; +} +int scanner_handler::close(void) +{ + int ret = usb_->stop(); + + { + SIMPLE_LOCK(lock_reply_); + for (auto& v : reply_) + v->release(); + reply_.clear(); + } + if(ret == 0) + status_ = SCANNER_STATUS_NOT_OPEN; + + return ret; +} +int scanner_handler::reset_message_que(void) +{ + int err = usb_->cancel_write(); + + status_ = SCANNER_STATUS_RESET_BULK; + utils::to_log(LOG_LEVEL_DEBUG, "reset_message_que - send reset command ...\r\n"); + err = usb_->restart_peer_bulk(); + utils::to_log(LOG_LEVEL_DEBUG, "reset_message_que - send reset command = %d\r\n", err); + if (err == 0) + { + EP0REPLYSTATUS s; + dyn_mem_ptr raw(dyn_mem::memory(sizeof(PACK_BASE))); + LPPACK_BASE pack = (LPPACK_BASE)raw->ptr(); + + BASE_PACKET_REPLY(*pack, PACK_CMD_SYNC, 0, 0); + raw->set_len(sizeof(PACK_BASE)); + utils::to_log(LOG_LEVEL_DEBUG, "reset_message_que - wait 100ms ...\r\n"); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + utils::to_log(LOG_LEVEL_DEBUG, "reset_message_que - send SYNC packet ...\r\n"); + usb_->send_bulk_raw_data(raw); + raw->release(); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + if (status_ == SCANNER_STATUS_RESET_BULK) + err = EFAULT; + utils::to_log(LOG_LEVEL_DEBUG, "reset_message_que - final status = %d\r\n", status_); + } + + return err; +} +bool scanner_handler::is_scanner_available(void) +{ + return status_ != SCANNER_STATUS_NOT_OPEN + && status_ != SCANNER_STATUS_LOST_CONNECT + && status_ != SCANNER_STATUS_RESET_BULK; +} diff --git a/hgdriver/hgdev/scanner/scanner_handler.h b/hgdriver/hgdev/scanner/scanner_handler.h new file mode 100644 index 0000000..7926d66 --- /dev/null +++ b/hgdriver/hgdev/scanner/scanner_handler.h @@ -0,0 +1,133 @@ +// scanner business handler +// +// created on 2023-03-27 +// +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +#define IMG_RECEIVER_FINISHED ((LPPACKIMAGE)NULL) +#define IMG_RECEIVER_PAPER_CNT ((LPPACKIMAGE)1) + +class async_usb_host; +struct libusb_device; + +class cmd_result : public refer +{ + std::function call_; + std::function clean_; + std::function roger_; + + MUTEX locker_; + uint32_t id_; + platform_event *wait_; + void* param_; + int err_; + uint32_t to_; + bool over_; + + static MUTEX lock_; + static uint32_t pack_id_; + + static uint32_t gen_pack_id(void); + +public: + cmd_result(std::function call, + std::function clean, + std::function roger, + void* param, uint32_t id = 0); + +protected: + ~cmd_result(); + +public: + uint32_t get_id(void); + uint32_t set_timeout(uint32_t timeout = 1000/*WAIT_INFINITE*/); // return previous + void* get_param(void); + void* set_param(void* param); // return previous + bool wait(void); + void trigger(void); + bool is_over(void); + int get_error_code(void); + void set_error_code(int err); + +public: + int call(void); + dyn_mem_ptr roger(dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* more); + int clean(void); +}; + + +class scanner_handler : public refer +{ + MUTEX lock_reply_; + std::vector reply_; + async_usb_host* usb_; + volatile uint32_t status_; + + std::function status_notify_; + std::function img_receiver_; + + cmd_result* gen_reply(std::function call, + std::function clean, + std::function roger, + void* param, uint32_t id = 0); + cmd_result* take_reply(uint32_t id); + int wait_result(cmd_result* reply); + + typedef struct _set_opt_result + { + uint32_t err; + uint8_t after_do; + char val[0]; + }SORET, *LPSORET; + +public: + scanner_handler(void); + +protected: + ~scanner_handler(); + + // I/O ... +public: + // following methods transferred by EP0 + int get_protocol_version(uint16_t* ver); + int get_scanner_status(LPEP0REPLYSTATUS status); + int restart_peer_bulk(uint32_t timeout = 1000/*ms*/); + int set_io_buffer_size(unsigned short size); + int get_io_buffer_size(void); + + // following methods transferred by Bulk, blocked ... + int option_get_all(std::string& json_opts); + int option_value_get(const char* name, void* buf, uint32_t size/*buffer size of 'buf'*/); + int option_value_set(const char* name, uint32_t type, void* buf, uint32_t size/*buffer size of 'buf'*/, uint32_t val_size, uint8_t* after); + int status_get(void); + + void set_image_receiver(std::function img); + void set_status_notifyer(std::function stntf); + int scan_start(void); + int scan_stop(void); + + int file_transfer(const char* local_path, const char* remote_path, bool to_device + , PROGRESS_NOTIFYER progress = PROGRESS_NOTIFYER() + , uint64_t local_off = 0, uint64_t remote_off = 0); + int file_move(const char* rfrom, const char* rto); + int file_delete(const char* remote); + + int program_start(const char* remote_pe, const char* param = nullptr, uint64_t* pid = nullptr); + int program_stop(uint64_t pid); + + // methods ... +public: + int open_usb_scanner(libusb_device* dev); + int close(void); + int reset_message_que(void); + bool is_scanner_available(void); +}; diff --git a/hgdriver/hgdev/scanner_manager.cpp b/hgdriver/hgdev/scanner_manager.cpp index 5112e94..2b17955 100644 --- a/hgdriver/hgdev/scanner_manager.cpp +++ b/hgdriver/hgdev/scanner_manager.cpp @@ -1,140 +1,32 @@ #include "scanner_manager.h" -#include "../../sdk/hginclude/utils.h" +#include #include #include #include #include -#include "../../../sdk/include/huagao/brand.h" +#include +#include "hg_scanner.h" #include "user-opt/user.h" #include "user-opt/offline_opt.h" #include #include -#if !defined(WIN32) && !defined(_WIN64) -#endif // kinds of scanners ... #define SCAN_PTR(ptr) ((hg_scanner*)ptr) -#include "hg_scanner_200.h" -#include "hg_scanner_239.h" -#include "hg_scanner_300.h" -#include "hg_scanner_302.h" -/// -/// supporting devices : -/// -#define GET_LANG(str,b) from_default_language(str,b) -static struct +static struct _scanner_device { - uint16_t vid; // vendor ID - uint16_t pid; // product ID - std::string name; // product name - type - std::string family; // product model - family. In the TWAIN protocol, grouping is based on this value - std::string rsc; // USB resource, version-addr. e.g. "USB2.0-1" - hg_scanner* (* create_scanner)(const char*/*name*/, const char*/*model*/, usb_io*, scanner_handle*); -} -g_supporting_devices[] = { -#ifdef OEM_LISICHENG - {0x31c9, 0x8200, PRODUCT_NAME_LSC_G42, PRODUCT_FAMILY_LSC_G42, "", &hg_scanner_mgr::create_scanner_g300} - , {0x31c9, 0x8420, PRODUCT_NAME_LSC_G42, PRODUCT_FAMILY_LSC_G42, "", &hg_scanner_mgr::create_scanner_g300} - , {0x31c9, 0x8429, PRODUCT_NAME_LSC_G42, PRODUCT_FAMILY_LSC_G42, "", &hg_scanner_mgr::create_scanner_empty} - , {0x31c9, 0x8520, PRODUCT_NAME_LSC_G52, PRODUCT_FAMILY_LSC_G52, "", &hg_scanner_mgr::create_scanner_g400} - , {0x31c9, 0x8529, PRODUCT_NAME_LSC_G52, PRODUCT_FAMILY_LSC_G52, "", &hg_scanner_mgr::create_scanner_g439} - , {0x31c9, 0x8620, PRODUCT_NAME_LSC_G62, PRODUCT_FAMILY_LSC_G62, "", &hg_scanner_mgr::create_scanner_g100} - , {0x31c9, 0x8629, PRODUCT_NAME_LSC_G62, PRODUCT_FAMILY_LSC_G62, "", &hg_scanner_mgr::create_scanner_g239} - , {0x31c9, 0x8730, PRODUCT_NAME_LSC_G73, PRODUCT_FAMILY_LSC_G73, "", &hg_scanner_mgr::create_scanner_g100} - , {0x31c9, 0x8739, PRODUCT_NAME_LSC_G73, PRODUCT_FAMILY_LSC_G73, "", &hg_scanner_mgr::create_scanner_g239} - -#elif defined(OEM_HANWANG) - {0x2903, 0x1000, PRODUCT_NAME_HW_G1000, PRODUCT_FAMILY_HW_G1000, "",& hg_scanner_mgr::create_scanner_g300} // "HW-1060A" - , {0x2903, 0x1002, PRODUCT_NAME_HW_G1002, PRODUCT_FAMILY_HW_G1002, "", &hg_scanner_mgr::create_scanner_g302} // "HW-1060A" - , {0x2903, 0x7000, PRODUCT_NAME_HW_G7000, PRODUCT_FAMILY_HW_G7000, "", &hg_scanner_mgr::create_scanner_g400} // "HW-74x0WA" - , {0x2903, 0x7002, PRODUCT_NAME_HW_G7002, PRODUCT_FAMILY_HW_G7002, "", &hg_scanner_mgr::create_scanner_g402} // "HW-7002" - , {0x2903, 0x7039, PRODUCT_NAME_HW_G7039, PRODUCT_FAMILY_HW_G7039, "", &hg_scanner_mgr::create_scanner_g439} // "HW-7039F" - , {0x2903, 0x8000, PRODUCT_NAME_HW_G8000, PRODUCT_FAMILY_HW_G8000, "", &hg_scanner_mgr::create_scanner_g239} // "HW-8090F" - , {0x2903, 0x9000, PRODUCT_NAME_HW_G9000, PRODUCT_FAMILY_HW_G9000, "", &hg_scanner_mgr::create_scanner_g239} // "HW-9110E" -#elif defined(OEM_CANGTIAN) - {0x3072, 0x0303, PRODUCT_NAME_CT_6005, PRODUCT_FAMILY_CT_6005, "", &hg_scanner_mgr::create_scanner_g300} - , {0x3072, 0x0403, PRODUCT_NAME_CT_138, PRODUCT_FAMILY_CT_138, "", &hg_scanner_mgr::create_scanner_g439} - , {0x3072, 0x0138, PRODUCT_NAME_CT_138, PRODUCT_FAMILY_CT_138, "", &hg_scanner_mgr::create_scanner_g239} - , {0x3072, 0x0238, PRODUCT_NAME_CT_138, PRODUCT_FAMILY_CT_138, "", &hg_scanner_mgr::create_scanner_g239} - - , {0x3308, 0x0138, PRODUCT_NAME_CT_138, PRODUCT_FAMILY_CT_138, "", &hg_scanner_mgr::create_scanner_g239} - , {0x3308, 0x0238, PRODUCT_NAME_CT_238, PRODUCT_FAMILY_CT_238, "", &hg_scanner_mgr::create_scanner_g239} - , {0x3308, 0x6005, PRODUCT_NAME_CT_6005, PRODUCT_FAMILY_CT_6005, "", &hg_scanner_mgr::create_scanner_g300} - , {0x3308, 0x6006, PRODUCT_NAME_CT_6006, PRODUCT_FAMILY_CT_6006, "", &hg_scanner_mgr::create_scanner_g239} - - - -#elif defined(OEM_ZHONGJING) - {0X05DA, 0x9220, PRODUCT_NAME_ZJ_9200, PRODUCT_FAMILY_ZJ_9200, "",& hg_scanner_mgr::create_scanner_g439} -#elif defined(OEM_ZIGUANG) - {0x32ec, 0x0200, PRODUCT_NAME_ZG_200, PRODUCT_FAMILY_ZG_200, "", & hg_scanner_mgr::create_scanner_g239} - , {0x32ec, 0x0210, PRODUCT_NAME_ZG_210, PRODUCT_FAMILY_ZG_210, "", &hg_scanner_mgr::create_scanner_g402} - #elif defined(OEM_NEUTRAL) - {0x3072, 0x100, PRODUCT_NAME_NEU_100, PRODUCT_FAMILY_NEU_100, "",& hg_scanner_mgr::create_scanner_g100} - , {0x3072, 0x139, PRODUCT_NAME_NEU_100, PRODUCT_FAMILY_NEU_100, "",&hg_scanner_mgr::create_scanner_g239} - , {0x3072, 0x200, PRODUCT_NAME_NEU_200, PRODUCT_FAMILY_NEU_200, "",&hg_scanner_mgr::create_scanner_g100} - , {0x3072, 0x239, PRODUCT_NAME_NEU_200, PRODUCT_FAMILY_NEU_200, "",&hg_scanner_mgr::create_scanner_g239} - , {0x3072, 0x300, PRODUCT_NAME_NEU_300, PRODUCT_FAMILY_NEU_300, "",&hg_scanner_mgr::create_scanner_g300} - , {0x3072, 0x302, PRODUCT_NAME_NEU_300, PRODUCT_FAMILY_NEU_300, "",&hg_scanner_mgr::create_scanner_g302} - , {0x3072, 0x339, PRODUCT_NAME_NEU_300, PRODUCT_FAMILY_NEU_300, "",&hg_scanner_mgr::create_scanner_empty} - , {0x3072, 0x400, PRODUCT_NAME_NEU_400, PRODUCT_FAMILY_NEU_400, "",&hg_scanner_mgr::create_scanner_g400} - , {0x3072, 0x402, PRODUCT_NAME_NEU_400, PRODUCT_FAMILY_NEU_400, "",&hg_scanner_mgr::create_scanner_g402} - , {0x3072, 0x439, PRODUCT_NAME_NEU_400, PRODUCT_FAMILY_NEU_400, "",&hg_scanner_mgr::create_scanner_g439} - , {0x064B, 0x7823, PRODUCT_NAME_NEU_200, PRODUCT_FAMILY_NEU_200, "",& hg_scanner_mgr::create_scanner_g100} - - , {0x31c9, 0x8200, PRODUCT_NAME_LSC_G42, PRODUCT_FAMILY_LSC_G42, "",& hg_scanner_mgr::create_scanner_g300} - , {0x31c9, 0x8420, PRODUCT_NAME_LSC_G42, PRODUCT_FAMILY_LSC_G42, "",& hg_scanner_mgr::create_scanner_g300} - , {0x31c9, 0x8429, PRODUCT_NAME_LSC_G42, PRODUCT_FAMILY_LSC_G42, "",& hg_scanner_mgr::create_scanner_empty} - , {0x31c9, 0x8520, PRODUCT_NAME_LSC_G52, PRODUCT_FAMILY_LSC_G52, "",& hg_scanner_mgr::create_scanner_g400} - , {0x31c9, 0x8529, PRODUCT_NAME_LSC_G52, PRODUCT_FAMILY_LSC_G52, "",& hg_scanner_mgr::create_scanner_g439} - , {0x31c9, 0x8620, PRODUCT_NAME_LSC_G62, PRODUCT_FAMILY_LSC_G62, "",& hg_scanner_mgr::create_scanner_g100} - , {0x31c9, 0x8629, PRODUCT_NAME_LSC_G62, PRODUCT_FAMILY_LSC_G62, "",& hg_scanner_mgr::create_scanner_g239} - , {0x31c9, 0x8730, PRODUCT_NAME_LSC_G73, PRODUCT_FAMILY_LSC_G73, "",& hg_scanner_mgr::create_scanner_g100} - , {0x31c9, 0x8739, PRODUCT_NAME_LSC_G73, PRODUCT_FAMILY_LSC_G73, "", &hg_scanner_mgr::create_scanner_g239} - - , {0x32ec, 0x0200, PRODUCT_NAME_ZG_200, PRODUCT_FAMILY_ZG_200, "",& hg_scanner_mgr::create_scanner_g239} - , {0x32ec, 0x0210, PRODUCT_NAME_ZG_210, PRODUCT_FAMILY_ZG_210, "", &hg_scanner_mgr::create_scanner_g402} - - , {0X05DA, 0x9220, PRODUCT_NAME_ZJ_9200, PRODUCT_FAMILY_ZJ_9200, "",&hg_scanner_mgr::create_scanner_g439} - - , {0x3308, 0x0138, PRODUCT_NAME_CT_138, PRODUCT_FAMILY_CT_138, "", &hg_scanner_mgr::create_scanner_g239} - , {0x3308, 0x0238, PRODUCT_NAME_CT_238, PRODUCT_FAMILY_CT_238, "", &hg_scanner_mgr::create_scanner_g239} - , {0x3072, 0x0303, PRODUCT_NAME_CT_6005, PRODUCT_FAMILY_CT_6005, "", &hg_scanner_mgr::create_scanner_g300} - , {0x3308, 0x6005, PRODUCT_NAME_CT_6005, PRODUCT_FAMILY_CT_6005, "", &hg_scanner_mgr::create_scanner_g300} - , {0x3308, 0x6006, PRODUCT_NAME_CT_6006, PRODUCT_FAMILY_CT_6006, "",& hg_scanner_mgr::create_scanner_g239} -#else - {0x3072, 0x100, PRODUCT_NAME_HG_G100, PRODUCT_FAMILY_HG_G100, "",& hg_scanner_mgr::create_scanner_g100} - , {0x3072, 0x139, PRODUCT_NAME_HG_G100, PRODUCT_FAMILY_HG_G100, "",&hg_scanner_mgr::create_scanner_g239} - , {0x3072, 0x200, PRODUCT_NAME_HG_G200, PRODUCT_FAMILY_HG_G200, "",&hg_scanner_mgr::create_scanner_g100} - , {0x3072, 0x239, PRODUCT_NAME_HG_G200, PRODUCT_FAMILY_HG_G200, "",&hg_scanner_mgr::create_scanner_g239} - , {0x3072, 0x300, PRODUCT_NAME_HG_G300, PRODUCT_FAMILY_HG_G300, "",&hg_scanner_mgr::create_scanner_g300} - , {0x3072, 0x302, PRODUCT_NAME_HG_G300, PRODUCT_FAMILY_HG_G300, "",&hg_scanner_mgr::create_scanner_g302} - , {0x3072, 0x339, PRODUCT_NAME_HG_G300, PRODUCT_FAMILY_HG_G300, "",&hg_scanner_mgr::create_scanner_empty} - , {0x3072, 0x400, PRODUCT_NAME_HG_G400, PRODUCT_FAMILY_HG_G400, "",&hg_scanner_mgr::create_scanner_g400} - , {0x3072, 0x402, PRODUCT_NAME_HG_G400, PRODUCT_FAMILY_HG_G400, "",&hg_scanner_mgr::create_scanner_g402} - , {0x3072, 0x439, PRODUCT_NAME_HG_G400, PRODUCT_FAMILY_HG_G400, "",& hg_scanner_mgr::create_scanner_g439} - - , {0x064B, 0x7823,PRODUCT_NAME_HG_G300, PRODUCT_FAMILY_HG_G300, "",& hg_scanner_mgr::create_scanner_g300} - , {0x064B, 0x7823,PRODUCT_NAME_HG_G200, PRODUCT_FAMILY_HG_G200, "",& hg_scanner_mgr::create_scanner_g100} - , {0x064B, 0x7823,PRODUCT_NAME_HG_G400, PRODUCT_FAMILY_HG_G400, "", &hg_scanner_mgr::create_scanner_g400} -#endif - }; -bool islang = false; -//static std::string g_vendor = GET_LANG(COMPANY_NAME, &islang); - -#define BRAND_LOGO_SIZE 8 * 1024 - -#define MOVE_TO_NEXT_STR(str) str += strlen(str) + 1 -/// - - + int vid; + int pid; + std::string family; + std::string name; +} g_supporting_devices[] = { ALL_FAMILIES }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // language option ... @@ -250,9 +142,14 @@ hg_scanner_mgr::~hg_scanner_mgr() std::lock_guard lock(mutex_dev_); for (auto& v : online_devices_) { + if (v.scanner) + { + v.scanner->close(); + v.scanner->release(); + v.scanner = nullptr; + } + libusb_unref_device(v.dev); - if (v.dev_opts) - v.dev_opts->release(); } online_devices_.clear(); } @@ -381,76 +278,6 @@ uint32_t hg_scanner_mgr::unique_id(int type) return -1; } -hg_scanner* hg_scanner_mgr::create_scanner_empty(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - if (h) - *h = nullptr; - - return nullptr; -} -hg_scanner* hg_scanner_mgr::create_scanner_g100(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_200* s = new hg_scanner_200(name, family, 0x100, io); - - if (h) - *h = s; - - return dynamic_cast(s); -} -hg_scanner* hg_scanner_mgr::create_scanner_g239(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_239* s = new hg_scanner_239(name, family, 0x239, io); - - if (h) - *h = s; - - return dynamic_cast(s); -} -hg_scanner* hg_scanner_mgr::create_scanner_g300(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_300* s = new hg_scanner_300(name, family, 0x300, io); - - if (h) - *h = s; - - return dynamic_cast(s); -} -hg_scanner* hg_scanner_mgr::create_scanner_g400(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_300* s = new hg_scanner_300(name, family, 0x400, io); - - if (h) - *h = s; - - return dynamic_cast(s); -} -hg_scanner* hg_scanner_mgr::create_scanner_g302(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_302* s = new hg_scanner_302(name, family, 0x302, io); // image_process needs PID 402, we should add 302 ... - - if (h) - *h = s; - - return dynamic_cast(s); -} -hg_scanner* hg_scanner_mgr::create_scanner_g402(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_302* s = new hg_scanner_302(name, family, 0x402, io); - - if (h) - *h = s; - - return dynamic_cast(s); -} -hg_scanner* hg_scanner_mgr::create_scanner_g439(const char* name, const char* family, usb_io* io, scanner_handle* h) -{ - hg_scanner_239* s = new hg_scanner_239(name, family, 0x439, io); - - if (h) - *h = s; - - return dynamic_cast(s); -} void hg_scanner_mgr::usb_event_handle(usb_event ev, libusb_device* device, int vid, int pid, int usb_ver_h, int usb_ver_l, bool* retry, void* user) // usb_ver_h.usb_ver_l { hg_scanner_mgr* obj = (hg_scanner_mgr*)user; @@ -463,7 +290,7 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v char model[40], vendor[40]; SANE_Device_Ex de; - int ev_ui = 0; + int ev_ui = 0, addr = 0; scanner_handle h = NULL; unsigned int len = sizeof(de); std::string name(""), type(""); @@ -476,13 +303,13 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v de.family = NULL; de.vendor = vendor; de.openned = SANE_FALSE; + addr = libusb_get_device_address(device); if (ev == USB_EVENT_DEVICE_ARRIVED) { int index = -1; for (int i = 0; i < _countof(g_supporting_devices); ++i) { - // 064B 澶氬彴璁惧浣跨敤杩欎釜vid锛屾墍浠ュ姞杞芥椂涓嶄細娓呮瑕佹墦寮€鍝竴鍙拌澶囷紝鍙湁閫氳繃澶栭儴杩涜鍔犺浇鏀瑰彉瀹炰�? if (g_supporting_devices[i].vid == vid && g_supporting_devices[i].pid == pid) { index = i; @@ -510,20 +337,22 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v size_t i = 0; for (; i < online_devices_.size(); ++i) { - if (online_devices_[i].dev == device) // 姝ゅ鍋囧畾鍚屼竴鍙拌澶囬噸鏂拌繛鎺ュ悗锛岃澶囧璞♀€渄evice鈥濅繚鎸佷笉鍙橈紱濡傛灉鍋囪涓嶆垚绔嬶紝浼氬鑷磋澶囬噸杩炴秷鎭笉鑳芥甯告帴鏀讹紝缁戝畾鍒拌璁惧鐨剆canner瀵硅薄寰椾笉鍒伴噴鏀? + if (online_devices_[i].dev == device) { - online_devices_[i].ind = index; add = false; break; } + + + + } - if (add) // 澶勭悊瀵硅薄鈥渄evice鈥濇敼鍙樼殑鎯呮�? + if (add) { i = 0; for (auto& v : online_devices_) { - if (v.ind == index && - (v.scanner && !v.scanner->is_online())) + if (v.scanner && !v.scanner->is_online()) { add = false; break; @@ -534,31 +363,30 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v if (add) { - OLSCANNER ols; + ONLNSCANNER ols; + ols.vid = vid; + ols.pid = pid; + ols.addr = addr; ols.dev = device; - ols.ind = index; - ols.scanner = NULL; - ols.dev_opts = nullptr; - ols.imgproc = nullptr; - ols.display_name = g_supporting_devices[ols.ind].name; - if (std::find(online_devices_.begin(), online_devices_.end(), ols.ind) != online_devices_.end()) + ols.scanner = nullptr; + ols.family = g_supporting_devices[index].family; + ols.display_name = g_supporting_devices[index].name; + if (std::find(online_devices_.begin(), online_devices_.end(), ols.display_name.c_str()) != online_devices_.end()) { - char buf[40]; - - sprintf(buf, " - %u", same_ind_++); - ols.display_name += buf; + int sn = 0; + while (std::find(online_devices_.begin(), online_devices_.end(), (ols.display_name + " - " + std::to_string(++sn)).c_str()) != online_devices_.end()); + + ols.display_name += " - " + std::to_string(sn); } libusb_ref_device(ols.dev); // ref to the device of queue online_devices_ online_devices_.push_back(ols); name = ols.display_name; utils::to_log(LOG_LEVEL_DEBUG, "%s connected.\n", name.c_str()); - type = g_supporting_devices[ols.ind].family; + type = g_supporting_devices[index].family; } - else if (online_devices_[i].scanner && !online_devices_[i].scanner->is_online()) + else if (i < online_devices_.size() && online_devices_[i].scanner && !online_devices_[i].scanner->is_online()) { - usb_io* io = NULL; - name = online_devices_[i].display_name; type = g_supporting_devices[index].family; if (online_devices_[i].dev) @@ -568,32 +396,29 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v h = online_devices_[i].scanner; if (pid == 0x300 || pid == 0x400) std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - len = usb_manager::instance()->open(device, &io); - utils::to_log(LOG_LEVEL_WARNING, "[%04x:%04x]%s re-connected.\n", pid, vid, online_devices_[i].display_name.c_str()); + //len = usb_manager::instance()->open(device, &io); + utils::to_log(LOG_LEVEL_WARNING, "[%04x:%04x]%s re-connected.\n", vid, pid, online_devices_[i].display_name.c_str()); + len = online_devices_[i].scanner->re_connect(); if (len == SCANNER_ERR_OK) { - online_devices_[i].scanner->reset_io(io); + //online_devices_[i].scanner->reset_io(io); de.openned = SANE_TRUE; } - if (io) - io->release(); add = false; } } } else if (ev == USB_EVENT_DEVICE_LEFT) { - std::vector::iterator it = std::find(online_devices_.begin(), online_devices_.end(), device); + std::vector::iterator it = std::find(online_devices_.begin(), online_devices_.end(), device); if (it != online_devices_.end()) { ev_ui = SANE_EVENT_DEVICE_LEFT; name = it->display_name; - type = g_supporting_devices[it->ind].family; + type = it->family; h = it->scanner; utils::to_log(LOG_LEVEL_DEBUG, "%s Dis-connected.\n", name.c_str()); - if (it->scanner) - it->scanner->io_disconnected(); - else + if (!it->scanner) { libusb_unref_device(it->dev); // unref the device of queue online_devices_ online_devices_.erase(it); @@ -608,7 +433,7 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v hg_scanner_mgr::ui_default_callback(h, ev_ui, &de, &len, NULL); } } -void hg_scanner_mgr::get_online_devices(std::vector& devs) +void hg_scanner_mgr::get_online_devices(std::vector& devs) { std::lock_guard lock(mutex_dev_); @@ -631,181 +456,6 @@ void hg_scanner_mgr::init_debug_config(const char* cfg_file) } } -void hg_scanner_mgr::set_appendix_info_for_about(SANE_About* about, char*& ptr, int& count, const char* key, const char* info, const char* url) -{ -#ifdef BRAND_DISPLAY_ALL_EXPAND - if (!info || *info == 0) - info = GET_LANG(BRAND_COMMUNICATION_FAIL,&islang); -#endif - - if (info && strlen(info)) - { - about->appendix[count].key = ptr; - strcpy(ptr, key); - MOVE_TO_NEXT_STR(ptr); - - about->appendix[count].content = ptr; - strcpy(ptr, info); - MOVE_TO_NEXT_STR(ptr); - - if (url) - { - about->appendix[count++].url = ptr; - strcpy(ptr, url); - MOVE_TO_NEXT_STR(ptr); - } - else - { - about->appendix[count].url = NULL; - count++; - } - } -} -scanner_err hg_scanner_mgr::get_about_info(scanner_handle h, void* data, unsigned* len) -{ - hg_scanner* scanner = (hg_scanner*)h; - unsigned bytes = sizeof(SANE_About) + 40; - SANE_About tmp; - size_t append_cnt = 1; - - - //bytes += sizeof(g_logo); - bytes += strlen(GET_LANG(BRAND_APP_NAME, &islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITLE_VERSION,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITLE_COPYRIGHT,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_COPYRIGHT,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITE_MANUFACTOR,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITLE_URL,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(url_en.c_str(), &islang)) + 8; append_cnt++; - - - bytes += strlen(GET_LANG(url_link_en.c_str(), &islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITLE_TEL,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_COMPANY_TEL,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITLE_ADDRESS,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_COMPANY_ADDRESS,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_TITLE_GPS,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_COMPANY_GPS,&islang)) + 8; append_cnt++; - bytes += strlen(GET_LANG(BRAND_URL_GPS,&islang)) + 8; append_cnt++; - // bytes += 5 * sizeof(tmp.appendix[0]); - -#ifndef BRAND_DISPLAY_ALL_EXPAND - if (scanner) -#endif - { - bytes += sizeof(tmp.appendix[0]) + BRAND_INFO_MAX_LENGTH + 8 + strlen(GET_LANG(BRAND_SOFTWARE_VERSION, &islang)) + 8; - bytes += sizeof(tmp.appendix[0]) + BRAND_INFO_MAX_LENGTH + 8 + strlen(GET_LANG(BRAND_TITLE_DEVICE_MODEL, &islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]) + BRAND_INFO_MAX_LENGTH + 8 + strlen(GET_LANG(BRAND_TITLE_FIRM_VERSION,&islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]) + BRAND_INFO_MAX_LENGTH + 8 + strlen(GET_LANG(BRAND_TITLE_SERIAL_NUM,&islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]) + BRAND_INFO_MAX_LENGTH + 8 + strlen(GET_LANG(BRAND_TITLE_IP,&islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]) + 28 + strlen(GET_LANG(BRAND_TITLE_ROLLER_COUNT,&islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]) + 28 + strlen(GET_LANG(BRAND_TITLE_HISTORY_COUNT,&islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]) + 28 + strlen(GET_LANG(BRAND_TITLE_DEVICE_INITIAL_POWER_ON_TIME, &islang)) + 8; append_cnt++; - bytes += sizeof(tmp.appendix[0]); append_cnt++; - } - - if (!data || *len < bytes) - { - *len = bytes; - - return SCANNER_ERR_INSUFFICIENT_MEMORY; - } - - // filling info to flat buffer ... - SANE_About* about = (SANE_About*)data; - std::string info(""); - char* ptr = (char*)data + sizeof(SANE_About) + append_cnt * sizeof(about->appendix[0]); - - about->title = ptr; - strcpy(ptr, GET_LANG(BRAND_APP_NAME,&islang)); - MOVE_TO_NEXT_STR(ptr); - - about->version = ptr; - sprintf(ptr, "%d.%d.%d.%d", hg_scanner_mgr::ver_major_, hg_scanner_mgr::ver_minor_, hg_scanner_mgr::ver_build_, hg_scanner_mgr::ver_patch_); - MOVE_TO_NEXT_STR(ptr); - - about->copyright = ptr; - std::string s = GET_LANG(BRAND_COPYRIGHT, &islang); - strcpy(ptr, s.c_str()); - MOVE_TO_NEXT_STR(ptr); - - //about->logo_bytes = sizeof(g_logo);; - //about->logo = ptr; - //memcpy(ptr, g_logo, about->logo_bytes); - ptr += about->logo_bytes + 1; - - int count = 0, rolls = 0, ret = SCANNER_ERR_OK; -#ifdef TEST - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_SOFTWARE_VERSION, &islang), BRAND_SOFTWARE_VERSION_TEST, NULL); -#endif - std::string g_vendor = GET_LANG(COMPANY_NAME, &islang); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITE_MANUFACTOR,&islang), g_vendor.c_str(), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_URL,&islang), GET_LANG(url_en.c_str(), &islang), GET_LANG(url_link_en.c_str(), &islang)); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_TEL,&islang), GET_LANG(BRAND_COMPANY_TEL,&islang), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_ADDRESS,&islang), GET_LANG(BRAND_COMPANY_ADDRESS,&islang), NULL); - if (strlen(BRAND_TITLE_GPS) > 1) - { - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_GPS, &islang), GET_LANG(BRAND_COMPANY_GPS, &islang), GET_LANG(BRAND_URL_GPS, &islang)); - - } - - if (scanner) - { - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_FIRM_VERSION,&islang), scanner->get_firmware_version().c_str(), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_SERIAL_NUM,&islang), scanner->get_serial_num().c_str(), NULL); - info = scanner->get_ip(); - if (info.length() > 10 && !info.empty()) - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_IP,&islang), info.c_str(), NULL); - info.clear(); - info = scanner->get_device_model(); - if (!info.empty()) - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_DEVICE_MODEL, &islang), info.c_str(), NULL); - ret = scanner->get_devs_time(info); - if (ret == SCANNER_ERR_OK && !info.empty()) - { - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_ROLLER_COUNT, &islang), info.c_str(), NULL); - } - ret = scanner->get_roller_num(rolls); - if (ret == SCANNER_ERR_OK) - { - char buf[40]; - sprintf(buf, "%u", rolls); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_ROLLER_COUNT,&islang), buf, NULL); - } -#ifdef BRAND_DISPLAY_ALL_EXPAND - else - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_ROLLER_COUNT,&islang), rolls == -1 ? GET_LANG(BRAND_COMMUNICATION_FAIL,&islang) : GET_LANG(BRAND_DEVICE_NOT_SUPPORT,&islang), NULL); -#endif - - ret = scanner->get_history_scan_count(rolls); - if (ret == SCANNER_ERR_OK) - { - char buf[40]; - sprintf(buf, "%u", rolls); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_HISTORY_COUNT,&islang), buf, NULL); - } -#ifdef BRAND_DISPLAY_ALL_EXPAND - else - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_HISTORY_COUNT,&islang), rolls == -1 ? GET_LANG(BRAND_COMMUNICATION_FAIL,&islang) : GET_LANG(BRAND_DEVICE_NOT_SUPPORT,&islang), NULL); -#endif - } -#ifdef BRAND_DISPLAY_ALL_EXPAND - else - { - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_FIRM_VERSION,&islang), GET_LANG(BRAND_NO_DEVICE,&islang), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_SERIAL_NUM,&islang), GET_LANG(BRAND_NO_DEVICE,&islang), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_IP,&islang), GET_LANG(BRAND_NO_DEVICE,&islang), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_ROLLER_COUNT,&islang), GET_LANG(BRAND_NO_DEVICE,&islang), NULL); - set_appendix_info_for_about(about, ptr, count, GET_LANG(BRAND_TITLE_HISTORY_COUNT,&islang), GET_LANG(BRAND_NO_DEVICE,&islang), NULL); - } -#endif - - about->appendix[count].key = NULL; - about->appendix[count].content = NULL; - about->appendix[count].url = NULL; - - return SCANNER_ERR_OK; -} imgproc_mgr* hg_scanner_mgr::create_image_processor(device_option* devopts) { imgproc_mgr* proc = new imgproc_mgr(devopts, dump_img_, dump_img_path_.c_str()); @@ -825,7 +475,7 @@ imgproc_mgr* hg_scanner_mgr::create_image_processor(device_option* devopts) scanner_err hg_scanner_mgr::hg_scanner_enum(ScannerInfo* scanner_list, long* count, bool local_only) { - std::vector devusbuf; + std::vector devusbuf; long size = *count; scanner_err ret = SCANNER_ERR_OK; std::string g_vendor(from_default_language(COMPANY_NAME, nullptr)); @@ -839,11 +489,10 @@ scanner_err hg_scanner_mgr::hg_scanner_enum(ScannerInfo* scanner_list, long* cou { for (size_t i = 0; i < devusbuf.size(); i++) { - scanner_list->vid = g_supporting_devices[devusbuf[i].ind].vid; - scanner_list->pid = g_supporting_devices[devusbuf[i].ind].pid; + scanner_list->vid = devusbuf[i].vid; + scanner_list->pid = devusbuf[i].pid; strcpy(scanner_list->name, devusbuf[i].display_name.c_str()); - strcpy(scanner_list->model, g_supporting_devices[devusbuf[i].ind].family.c_str()); - strcpy(scanner_list->type, g_supporting_devices[devusbuf[i].ind].name.c_str()); + strcpy(scanner_list->model, devusbuf[i].family.c_str()); strcpy(scanner_list->vendor, g_vendor.c_str()); scanner_list++; } @@ -853,67 +502,31 @@ scanner_err hg_scanner_mgr::hg_scanner_enum(ScannerInfo* scanner_list, long* cou } scanner_err hg_scanner_mgr::hg_scanner_open(scanner_handle* h, const char* name, bool shared, const char* user, const char* pwd, const char* check, char* rsc) { - std::vector devs; - std::vector::iterator it; - usb_io* io = NULL; + std::vector::iterator it; scanner_err ret = SCANNER_ERR_DEVICE_NOT_FOUND; + SIMPLE_LOCK(mutex_dev_); *h = NULL; - get_online_devices(devs); - it = std::find(devs.begin(), devs.end(), name); - if (it != devs.end()) + it = std::find(online_devices_.begin(), online_devices_.end(), name); + if (it != online_devices_.end()) { - hg_scanner_mgr::last_open_msg_ = ""; - ret = (scanner_err)usb_manager::instance()->open(it->dev, &io, &hg_scanner_mgr::last_open_msg_); - if (ret == SCANNER_ERR_OK) + std::vector cnst; + cnst.push_back(offline_); + cnst.push_back(g_language); + + it->scanner = new hg_scanner(&(*it), nullptr, user_, &cnst); + if (it->scanner->status() == SCANNER_ERR_OK) { - hg_scanner* scanner = g_supporting_devices[it->ind].create_scanner(it->display_name.c_str(), g_supporting_devices[it->ind].family.c_str(), io, h); - - if (scanner) - { - scanner->set_ui_callback(&hg_scanner_mgr::ui_default_callback, hg_scanner_mgr::async_io_enabled_); - scanner->set_dev_family(g_supporting_devices[it->ind].family.c_str()); - scanner->set_read_over_with_no_data(hg_scanner_mgr::read_over_with_eof_); - } - { - std::lock_guard lock(mutex_dev_); - std::vector::iterator ptr = std::find(online_devices_.begin(), online_devices_.end(), name); - if (ptr != online_devices_.end()) - { - if (ptr->scanner) - ptr->scanner->release(); - ptr->scanner = (hg_scanner*)*h; - - auto userpriv = [this](int priv) -> bool - { - return user_->has_privilege(priv); - }; - auto logger = [this](const char* msg) -> void - { - utils::to_log(LOG_LEVEL_DEBUG, "%s", msg); - }; - - utils::to_log(LOG_LEVEL_DEBUG, "---Initialize device options ...\n"); - if (ptr->dev_opts) - ptr->dev_opts->clear(); - else - ptr->dev_opts = new device_option(userpriv, logger); - ptr->dev_opts->add(dynamic_cast(offline_)); - ptr->dev_opts->add(dynamic_cast(g_language)); - ptr->dev_opts->add(ptr->scanner); - - ptr->imgproc = create_image_processor(ptr->dev_opts); - ptr->scanner->set_image_processor(ptr->imgproc); - ptr->dev_opts->add(ptr->imgproc); - utils::to_log(LOG_LEVEL_DEBUG, "---Initialize %d device options OVER.\n", ptr->dev_opts->count()); - } - } + *h = it->scanner; + } + else + { + ret = (scanner_err)it->scanner->status(); + hg_scanner_mgr::last_open_msg_ = it->scanner->status_message(); + it->scanner->close(); + it->scanner->release(); + it->scanner = nullptr; } - else if(hg_scanner_mgr::last_open_msg_.length()) - hg_scanner_mgr::ui_default_callback(nullptr, SANE_EVENT_ERROR, (void*)hg_scanner_mgr::last_open_msg_.c_str(), (unsigned int*)&ret, nullptr); - - if(io) - io->release(); } return *h ? SCANNER_ERR_OK : ret; @@ -926,26 +539,14 @@ scanner_err hg_scanner_mgr::hg_scanner_close(scanner_handle h, bool force) { if (v.scanner == h) { + v.scanner->close(/*force*/); + v.scanner->release(); v.scanner = nullptr; - if (v.dev_opts) - { - v.dev_opts->clear(); - v.dev_opts->release(); - v.dev_opts = nullptr; - } - if (v.imgproc) - v.imgproc->release(); - v.imgproc = nullptr; - break; } } } - SCAN_PTR(h)->close(force); - SCAN_PTR(h)->release(); - //delete SCAN_PTR(h); - return SCANNER_ERR_OK; } scanner_err hg_scanner_mgr::hg_scanner_get_parameter(scanner_handle h, const char* name, char* data, long* len, int type) @@ -970,9 +571,7 @@ scanner_err hg_scanner_mgr::hg_scanner_get_parameter(scanner_handle h, const cha { if (v.scanner == h) { - tmp = v.dev_opts; - if (tmp) - tmp->add_ref(); + tmp = v.scanner->get_device_opt(); break; } } @@ -1033,9 +632,7 @@ scanner_err hg_scanner_mgr::hg_scanner_set_parameter(scanner_handle h, const cha { if (v.scanner == h) { - tmp = v.dev_opts; - if (tmp) - tmp->add_ref(); + tmp = v.scanner->get_device_opt(); break; } } @@ -1130,8 +727,8 @@ scanner_err hg_scanner_mgr::hg_scanner_stop(scanner_handle h) scanner_err err = (scanner_err)SCAN_PTR(h)->stop(); // call from APP, block when all working-threads stopped - added on 2023-10-18 when handled double-feeding in SANE - while (SCAN_PTR(h)->is_running() != hg_scanner::THREAD_RUNNING_IDLE) - std::this_thread::sleep_for(std::chrono::milliseconds(3)); + //while (SCAN_PTR(h)->is_running() != hg_scanner::THREAD_RUNNING_IDLE) + // std::this_thread::sleep_for(std::chrono::milliseconds(3)); return err; } @@ -1144,8 +741,8 @@ scanner_err hg_scanner_mgr::hg_scanner_read_img_data(scanner_handle h, unsigned if (!len) return SCANNER_ERR_INVALID_PARAMETER; - int l = *len, - err = SCAN_PTR(h)->read_image_data(data, &l); + size_t l = *len, + err = SCAN_PTR(h)->read_image_data(data, &l); *len = l; @@ -1157,34 +754,11 @@ scanner_err hg_scanner_mgr::hg_scanner_get_status(scanner_handle h, int setstuta } scanner_err hg_scanner_mgr::hg_scanner_reset(scanner_handle h) { - return (scanner_err)SCAN_PTR(h)->reset(); + return SCANNER_ERR_OK; // (scanner_err)SCAN_PTR(h)->reset(); } scanner_err hg_scanner_mgr::hg_scanner_control(scanner_handle h, unsigned long code, void* data, unsigned* len) { - //if (!len && code != IO_CTRL_CODE_TEST_SINGLE) - // return SCANNER_ERR_INVALID_PARAMETER; - - if (code == IO_CTRL_CODE_ABOUT_INFO) - return get_about_info(h, data, len); - else if (code == IO_CTRL_CODE_GET_LOG_FILE && len && *len == LOG_FILE_DRIVER) - { - if (!data) - return SCANNER_ERR_INVALID_PARAMETER; - - std::string f(utils::temporary_path() + PATH_SEPARATOR + "scanner-tmplog.txt"); - - int ret = utils::copy_log_file_to(f.c_str()); - if (ret) - *((char*)data) = 0; - else - strcpy((char*)data, f.c_str()); - - return (scanner_err)ret; - } - else if (!h) - return SCANNER_ERR_INVALID_PARAMETER; - else - return (scanner_err)SCAN_PTR(h)->device_io_control(code, data, len); + return SCANNER_ERR_DEVICE_NOT_SUPPORT; } void hg_scanner_mgr::on_language_changed(void) @@ -1192,8 +766,12 @@ void hg_scanner_mgr::on_language_changed(void) std::lock_guard lock(mutex_dev_); for (auto& v: online_devices_) { - if (v.dev_opts) - v.dev_opts->update_data(nullptr, nullptr, false); + if (v.scanner) + { + device_option* opt = v.scanner->get_device_opt(); + opt->update_data(nullptr, nullptr, false); + opt->release(); + } } } const char* hg_scanner_mgr::last_open_message(void) diff --git a/hgdriver/hgdev/scanner_manager.h b/hgdriver/hgdev/scanner_manager.h index 0e01412..b9b57ff 100644 --- a/hgdriver/hgdev/scanner_manager.h +++ b/hgdriver/hgdev/scanner_manager.h @@ -1,6 +1,6 @@ #pragma once -#include "../../sdk/hginclude/huagaoxxx_warraper_ex.h" +#include #include "usb_manager.h" #include #include @@ -42,32 +42,11 @@ class offline_opts; class device_option; class sane_opt_provider; class imgproc_mgr; +struct _online_scanner; class hg_scanner_mgr { - typedef struct _online_scanner - { - libusb_device* dev; // the unique usb device - int ind; // index in supporting scanners queue - hg_scanner* scanner; - device_option* dev_opts; - imgproc_mgr* imgproc; - std::string display_name; - - bool operator==(const libusb_device* d) - { - return d == dev; - } - bool operator==(const int& index) - { - return ind == index; - } - bool operator==(const char* name) - { - return display_name == name; - } - }OLSCANNER; - std::vector online_devices_; + std::vector<_online_scanner> online_devices_; std::mutex mutex_dev_; unsigned int same_ind_; @@ -98,11 +77,9 @@ class hg_scanner_mgr static void usb_event_handle(usb_event ev, libusb_device* device, int vid, int pid, int usb_ver_h, int usb_ver_l, bool* retry, void* user); // usb_ver_h.usb_ver_l void on_hgscanner_pnp(usb_event ev, libusb_device* device, int vid, int pid, int usb_ver_h, int usb_ver_l, bool* retry); // usb_ver_h.usb_ver_l - void get_online_devices(std::vector& devs); + void get_online_devices(std::vector<_online_scanner>& devs); void init_debug_config(const char* cfg_file); - void set_appendix_info_for_about(SANE_About* about, char*& ptr, int& count, const char* key, const char* info, const char* url); - scanner_err get_about_info(scanner_handle h, void* data, unsigned* len); imgproc_mgr* create_image_processor(device_option* devopts); string cf_name; @@ -126,15 +103,6 @@ public: }; static uint32_t unique_id(int type = UNIQUE_ID_IMG); - static hg_scanner* create_scanner_empty(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g100(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g239(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g300(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g302(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g400(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g402(const char* name, const char* family, usb_io* io, scanner_handle* h); - static hg_scanner* create_scanner_g439(const char* name, const char* family, usb_io* io, scanner_handle* h); - public: scanner_err hg_scanner_enum(ScannerInfo* scanner_list, long* count, bool local_only); scanner_err hg_scanner_open(scanner_handle* h, const char* name, bool shared, const char* user, const char* pwd, const char* check, char* rsc); diff --git a/hgdriver/hgdev/scanner_setting.cpp b/hgdriver/hgdev/scanner_setting.cpp deleted file mode 100644 index e1a0f54..0000000 --- a/hgdriver/hgdev/scanner_setting.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "scanner_setting.h" -#include -#include -#include - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// DEFINE ... -#define SSFH_VER_MAIN 1 -#define SSFH_VER_MINOR 0 - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// base64 util .. -static char base64_default_table[] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" }; - -base64::base64() : padding_char_('=') -{ - base64_ind_[0] = base64_char_[0] = 0; - - initialize_base64_table(base64_default_table); -} -base64::~base64() -{} - -bool base64::is_valid_base64_table(const char* table) -{ - bool valid = false; - - if (table && strlen(table) >= 64) - { - char repeat[4] = { 0 }; - - valid = true; - for (int i = 0; i < 63; ++i) - { - repeat[0] = table[i]; - if (strstr(table + i + 1, repeat)) - { - valid = false; - break; - } - } - } - - return valid; -} -bool base64::initialize_base64_table(const char* table) -{ - if (!table || strlen(table) < 64) - { - if (memcmp(base64_default_table, base64_char_, 64) == 0) - { - return !table; - } - - memcpy(base64_char_, base64_default_table, 64); - } - else - { - if (memcmp(base64_char_, table, 64) == 0) - { - return true; - } - else if (!is_valid_base64_table(table)) - return false; - - memcpy(base64_char_, table, 64); - } - base64_char_[64] = base64_char_[65] = 0; - - // initialize base64_index - memset(base64_ind_, 0, sizeof(base64_ind_)); - for (int i = 0; i < 64; ++i) - { - base64_ind_[base64_char_[i]] = i; - } - - // padding char - padding_char_ = '='; - if (base64_ind_[padding_char_]) - { - for (padding_char_ = 0x21; padding_char_ < 0x7e && base64_ind_[padding_char_] && padding_char_ != base64_char_[0]; ++padding_char_); - } - - return padding_char_ < 0x7e; -} - -bool base64::set_base64_table(const char* table) -{ - return initialize_base64_table(table ? table : base64_default_table); -} -std::string base64::encode(const char* data, size_t bytes, unsigned int line_bytes, bool need_padding) -{ - char* str = (char*)malloc(bytes * 2 + 3); - unsigned char c1 = 0, c2 = 0, c3 = 0; - unsigned long line_len = 0; - unsigned long words = bytes / 3; - int rest = bytes % 3, - pos = 0; - std::string ret(""); - - for (unsigned long i = 0; i < words; ++i) - { - // fetch 3 letters - c1 = *data++; - c2 = *data++; - c3 = *data++; - - // encoding into 4-bytes - str[pos++] = base64_char_[c1 >> 2]; - str[pos++] = base64_char_[((c1 << 4) | (c2 >> 4)) & 0x3f]; - str[pos++] = base64_char_[((c2 << 2) | (c3 >> 6)) & 0x3f]; - str[pos++] = base64_char_[c3 & 0x3f]; - line_len += 4; - - // new line ... - if ((unsigned int)line_len > line_bytes - 4) - { - str[pos++] = '\r'; - str[pos++] = '\n'; - line_len = 0; - } - } - - // rest ... - if (rest == 1) - { - c1 = *data++; - str[pos++] = base64_char_[(c1 & 0xfc) >> 2]; - str[pos++] = base64_char_[((c1 & 0x03) << 4)]; - if (need_padding) - { - str[pos++] = padding_char_; - str[pos++] = padding_char_; - } - } - else if (rest == 2) - { - c1 = *data++; - c2 = *data++; - str[pos++] = base64_char_[(c1 & 0xfc) >> 2]; - str[pos++] = base64_char_[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)]; - str[pos++] = base64_char_[((c2 & 0x0f) << 2)]; - if (need_padding) - { - str[pos++] = padding_char_; - } - } - if (pos > 0) - { - str[pos++] = 0; - ret = std::string(str, pos - 1); - } - free(str); - - return ret; -} -std::string base64::decode(const char* data, size_t bytes) -{ - char* str = (char*)malloc(bytes + 1); - int pos = 0, - shifts = 18, - value = 0; - std::string ret(""); - - for (int i = 0; i < (int)bytes; ++i) - { - if (*data != '\r' && *data != '\n') - { - if (*data == padding_char_) - { - break; - } - - value += base64_ind_[*data] << shifts; - if (shifts == 0) - { - shifts = 18; - str[pos++] = (value >> 16) & 0x0ff; - str[pos++] = (value >> 8) & 0x0ff; - str[pos++] = (value >> 0) & 0x0ff; - value = 0; - } - else - { - shifts -= 6; - } - } - data++; - } - - if (shifts == 12 || shifts == 6) - { - str[pos++] = (value >> 16) & 0x0ff; - } - else if (shifts == 0) - { - str[pos++] = (value >> 16) & 0x0ff; - str[pos++] = (value >> 8) & 0x0ff; - } - - if (pos > 0) - { - str[pos++] = 0; - ret = std::string(str, pos - 1); - } - free(str); - - return ret; -} - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// check sum .. -unsigned int simple_checksum(const char* data, size_t len) -{ - unsigned int chk = -1; - - while (len >= sizeof(chk)) - { - chk ^= *((unsigned int*)data); - data += sizeof(chk); - len -= sizeof(chk); - } - if (len) - { - unsigned int rest = *((unsigned int*)data), mask = (1 << (len * 8)) - 1; - - rest &= mask; - chk ^= rest; - } - - return chk; -} - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// exporting .. -int load_scanner_setting(const char* file, std::string& jsn) -{ - FILE* src = fopen(file, "rb"); - long len = 0; - char* buf = nullptr; - SSFILEH ssfh = { 0 }; - - if (!src) - return errno; - - fseek(src, 0, SEEK_END); - len = ftell(src); - fseek(src, 0, SEEK_SET); - if (len < sizeof(ssfh)) - { - fclose(src); - - return EBADF; - } - - buf = new char[len]; - if (!buf) - { - fclose(src); - - return ENOMEM; - } - - memset(buf, 0, len); - fread(&ssfh, sizeof(ssfh), 1, src); - len -= sizeof(ssfh); - fread(buf, 1, len, src); - fclose(src); - if (ssfh.ver_main != 1 || - ssfh.ver_sub != 0 || - simple_checksum(buf, len) != (ssfh.checksum ^ ssfh.timestamp) || - ssfh.length != len + sizeof(ssfh)) - { - delete[] buf; - - return EBADF; - } - - base64 b64; - jsn = b64.decode(buf, len); - delete[] buf; - - return 0; -} -int save_scanner_setting(const char* file, const std::string& jsn) -{ - SSFILEH ssfh = { 0 }; - base64 b64; - std::string str(b64.encode(jsn.c_str(), jsn.length())); - - ssfh.ver_main = SSFH_VER_MAIN; - ssfh.ver_sub = SSFH_VER_MINOR; - ssfh.length = str.length() + sizeof(ssfh); - ssfh.timestamp = time(NULL); - ssfh.checksum = simple_checksum(str.c_str(), str.length()); - - FILE *dst = fopen(file, "wb"); - - bool ok = false; - if (!dst) - return ENFILE; - - ssfh.checksum ^= ssfh.timestamp; - if (fwrite(&ssfh, sizeof(ssfh), 1, dst) == 1) - ok = fwrite(str.c_str(), 1, str.length(), dst) == str.length(); - fclose(dst); - if (!ok) - { - remove(file); - - return EFAULT; - } - - return 0; -} diff --git a/hgdriver/hgdev/scanner_setting.h b/hgdriver/hgdev/scanner_setting.h deleted file mode 100644 index acbb05e..0000000 --- a/hgdriver/hgdev/scanner_setting.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -// For: check and load scanner configuration json -// -// Date: 2022-08-12 -// -// FileName: 0239.hsc -// -// Location: same parent path of scanner component, rel: ./settings -// -// Format: 0: short - 1.2, version of the file format -// -// 2: int - total length of the whole file, include this head -// -// 6: unsigned - checksum of content -// -// 10: BASE64 of the json content - -#include - -#pragma pack(push) -#pragma pack(1) - -typedef struct _scanner_setting_file_head -{ - unsigned char ver_main; - unsigned char ver_sub; - unsigned int length; // whole file length, include this head - unsigned int checksum; // checksum of BASE64 content - unsigned int timestamp; // time(NULL) - char base64_content[0]; -}SSFILEH, *LPSSFILEH; - -#pragma pack(pop) - -class base64 -{ - char base64_ind_[128]; - char base64_char_[80]; - char padding_char_; - - bool is_valid_base64_table(const char* table); - bool initialize_base64_table(const char* table); - -public: - base64(); - ~base64(); - -public: - bool set_base64_table(const char* table = nullptr); - std::string encode(const char* data, size_t bytes, unsigned int line_bytes = -1, bool need_padding = true); - std::string decode(const char* data, size_t bytes); -}; - -// return 0 for success, otherwise error code -int load_scanner_setting(const char* file, std::string& jsn); -int save_scanner_setting(const char* file, const std::string& jsn); diff --git a/hgdriver/hgdev/threadpool.h b/hgdriver/hgdev/threadpool.h deleted file mode 100644 index 906cabf..0000000 --- a/hgdriver/hgdev/threadpool.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef THREAD_POOL_H -#define THREAD_POOL_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class ThreadPool { -public: - ThreadPool(); - ThreadPool(size_t); - template - auto enqueue(F&& f, Args&&... args) - -> std::future::type>; - ~ThreadPool(); -private: - // need to keep track of threads so we can join them - std::vector< std::thread > workers; - // the task queue - std::queue< std::function > tasks; - - // synchronization - std::mutex queue_mutex; - std::condition_variable condition; - bool stop; -}; - -// the constructor just launches some amount of workers -inline ThreadPool::ThreadPool(size_t threads) - : stop(false) -{ - for(size_t i = 0;i task; - - { - std::unique_lock lock(this->queue_mutex); - this->condition.wait(lock, - [this]{ return this->stop || !this->tasks.empty(); }); - if(this->stop && this->tasks.empty()) - return; - task = std::move(this->tasks.front()); - this->tasks.pop(); - } - - task(); - } - } - ); -} - -// add new work item to the pool -template -auto ThreadPool::enqueue(F&& f, Args&&... args) - -> std::future::type> -{ - using return_type = typename std::result_of::type; - - auto task = std::make_shared< std::packaged_task >( - std::bind(std::forward(f), std::forward(args)...) - ); - - std::future res = task->get_future(); - { - std::unique_lock lock(queue_mutex); - - // don't allow enqueueing after stopping the pool - if(stop) - throw std::runtime_error("enqueue on stopped ThreadPool"); - - tasks.emplace([task](){ (*task)(); }); - } - condition.notify_one(); - return res; -} - -// the destructor joins all threads -inline ThreadPool::~ThreadPool() -{ - { - std::unique_lock lock(queue_mutex); - stop = true; - } - condition.notify_all(); - for(std::thread &worker: workers) - worker.join(); -} - -#endif diff --git a/hgdriver/hgdev/usb_manager.cpp b/hgdriver/hgdev/usb_manager.cpp index e720ecf..a9359a4 100644 --- a/hgdriver/hgdev/usb_manager.cpp +++ b/hgdriver/hgdev/usb_manager.cpp @@ -1,7 +1,6 @@ #include "usb_manager.h" -#include "../../sdk/hginclude/utils.h" -#include "../../sdk/hginclude/huagaoxxx_warraper_ex.h" +#include #include #include @@ -46,7 +45,7 @@ usb_manager::usb_manager() : run_(true) usb_manager::~usb_manager() { run_ = false; - wait_pnp_.notify(); + wait_pnp_.trigger(); libusb_context* ctx = nullptr; #if defined(WIN32) || defined(_WIN64) ctx = context_; @@ -302,7 +301,7 @@ int usb_manager::on_usb_pnp_event(libusb_context *ctx, libusb_device *device, li if (ms > 1000) { pnp_events_.Put(pd, sizeof(pd)); - wait_pnp_.notify(); + wait_pnp_.trigger(); } else { diff --git a/hgdriver/hgdev/usb_manager.h b/hgdriver/hgdev/usb_manager.h index ab04faf..9a963fa 100644 --- a/hgdriver/hgdev/usb_manager.h +++ b/hgdriver/hgdev/usb_manager.h @@ -20,7 +20,7 @@ #include "huagao/hgscanner_error.h" #include "BlockingQueue.h" -#include "hg_ipc.h" +#include struct usb_dev diff --git a/hgdriver/hgdev/user-opt/offline_opt.cpp b/hgdriver/hgdev/user-opt/offline_opt.cpp index d3df15f..741f30d 100644 --- a/hgdriver/hgdev/user-opt/offline_opt.cpp +++ b/hgdriver/hgdev/user-opt/offline_opt.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include "../scanner_manager.h" // for version #include "user.h" diff --git a/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp b/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp index 9932278..4e6247d 100644 --- a/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp +++ b/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp @@ -1,12 +1,12 @@ -#include "../../sdk/hginclude/huagaoxxx_warraper_ex.h" +#include -#include "../../../sdk/include/huagao/brand.h" -#include "../../sdk/hginclude/utils.h" +#include +#include #include "../hgdev/scanner_manager.h" #include #include -#include "../hgdev/common_setting.h" +#include #if defined(WIN32) || defined(_WIN64) #include @@ -162,7 +162,27 @@ extern "C" scanner_err hg_scanner_open(scanner_handle* h, const char* name, bool shared, const char* user, const char* pwd, const char* check, char* rsc) { - return hg_scanner_mgr::instance()->hg_scanner_open(h, name, shared, user, pwd, check, rsc); + //return hg_scanner_mgr::instance()->hg_scanner_open(h, name, shared, user, pwd, check, rsc); + try + { + return hg_scanner_mgr::instance()->hg_scanner_open(h, name, shared, user, pwd, check, rsc); + } + catch (std::exception& e) + { + if (h) + *h = nullptr; + utils::to_log(LOG_LEVEL_FATAL, "Exception occurs when open '%s': %s.\n", name, e.what()); + + return SCANNER_ERR_DATA_DAMAGED; + } + catch (...) + { + if (h) + *h = nullptr; + utils::to_log(LOG_LEVEL_FATAL, "Exception occurs when open '%s'!\n", name); + + return SCANNER_ERR_DATA_DAMAGED; + } } scanner_err hg_scanner_close(scanner_handle h, bool force) diff --git a/hgsane/entry.cpp b/hgsane/entry.cpp index b41fd83..34f846c 100644 --- a/hgsane/entry.cpp +++ b/hgsane/entry.cpp @@ -1,7 +1,7 @@ #include "sane_hg_mdw.h" -#include "../sdk/hginclude/huagaoxxx_warraper_ex.h" // for log-api -#include "../sdk/hginclude/utils.h" // for log-level +#include // for log-api +#include // for log-level /// /// SANE API entrance ... diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index 9ae166a..38994ca 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -19,12 +19,13 @@ #include #endif -#include "../../sdk/include/sane/sane_option_definitions.h" +#include #include "sane_option.h" #include -#include "../sdk/hginclude/utils.h" +#include #include -#include "../sdk/sane_opt_json/device_opt.h" // for readable_text(SANE_Value_Type type, void* value) +#include // for readable_text(SANE_Value_Type type, void* value) +#include #ifndef SIGUSR1 #define SIGUSR1 10 diff --git a/hgsane/sane_hg_mdw.h b/hgsane/sane_hg_mdw.h index a6c5408..281d36d 100644 --- a/hgsane/sane_hg_mdw.h +++ b/hgsane/sane_hg_mdw.h @@ -1,7 +1,7 @@ #pragma once #include "sane/sane_ex.h" -#include "../sdk/hginclude/huagaoxxx_warraper_ex.h" +#include #include #include diff --git a/sdk/base/data.cpp b/sdk/base/data.cpp new file mode 100644 index 0000000..c032438 --- /dev/null +++ b/sdk/base/data.cpp @@ -0,0 +1,512 @@ +#include "data.h" + + +#include + +#if defined(WIN32) || defined(_WIN64) +#include + +namespace sys_util +{ + int get_disk_size(const char* path, uint64_t* total, uint64_t* avail, uint64_t* blocksize) + { + std::string disk(path); + size_t pos = disk.find("\\"); + DWORD spc = 0, bps = 0, avc = 0, tot = 0; + + if (pos++ != std::string::npos) + disk.erase(pos); + if (GetDiskFreeSpaceA(disk.c_str(), &spc, &bps, &avc, &tot)) + { + if (total) + { + *total = tot; + *total *= bps * spc; + } + if (avail) + { + *avail = avc; + *avail *= bps * spc; + } + if (blocksize) + { + *blocksize = bps; + *blocksize *= spc; + } + + return 0; + } + else + { + return GetLastError(); + } + } +} +#else +#include "common/sys_util.h" +#include +#include +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +packet_data_base::packet_data_base() : pack_cmd_(0), pack_id_(0) + , progress_notify_(PROGRESS_NOTIFYER()), user_data_(nullptr) +{} +packet_data_base::~packet_data_base() +{} + +int packet_data_base::notify_progress(uint64_t total, uint64_t cur_size, uint32_t err) +{ + if (progress_notify_) + progress_notify_(total, cur_size, err, user_data_); + else + return ENOENT; +} + +void packet_data_base::set_packet_param(uint32_t cmd, uint32_t id) +{ + pack_cmd_ = cmd; + pack_id_ = id; +} +int packet_data_base::get_packet_command(void) +{ + return pack_cmd_; +} +int packet_data_base::get_packet_id(void) +{ + return pack_id_; +} + +void packet_data_base::set_progress_notify(PROGRESS_NOTIFYER notify, void* param) +{ + progress_notify_ = notify; + user_data_ = param; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +data_holder::data_holder() +{} +data_holder::~data_holder() +{} + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +mem_holder::mem_holder(size_t size) : space_(size) +{ + buf_ = (uint8_t*)malloc(size); + if (buf_) + memset(buf_, 0, size); +} +mem_holder::~mem_holder() +{ + if (buf_) + free(buf_); + buf_ = nullptr; +} + +int mem_holder::put_data(const void* data, uint32_t* size) +{ + if (*size > space_ - wpos_) + *size = space_ - wpos_; + + memcpy(buf_ + wpos_, data, *size); + wpos_ += *size; + + return 0; +} +bool mem_holder::is_complete(void) +{ + return wpos_ >= space_; +} +uint32_t mem_holder::get_required(void) +{ + if (wpos_ >= space_) + return 0; + else + return space_ - wpos_; +} + +size_t mem_holder::data_length(void) +{ + return wpos_; +} +uint8_t* mem_holder::data(void) +{ + return buf_; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +empty_holer::empty_holer(uint64_t size) : size_(size), put_(0) +{} +empty_holer::~empty_holer() +{} + +int empty_holer::put_data(const void* data, uint32_t* size) +{ + if (*size >= size_ - put_) + { + *size -= size_ - put_; + put_ = size_; + } + else + { + put_ += *size; + } + notify_progress(size_, put_, 0); + + return 0; +} +bool empty_holer::is_complete(void) +{ + return size_ == put_; +} +uint32_t empty_holer::get_required(void) +{ + return size_ - put_; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +file_saver::file_saver(void) : size_(0), wrote_(0), path_(""), check_(""), dst_(nullptr), pack_cmd_(0), pack_id_(0) +{} +file_saver::~file_saver() +{ + close(); +} + +void file_saver::close(void) +{ + if(dst_) + fclose(dst_); + dst_ = nullptr; + + size_ = wrote_ = pack_cmd_ = pack_id_ = 0; + path_ = check_ = ""; +} + +int file_saver::open(const char* path, uint64_t size, const char* check) +{ + int err = 0; + + close(); + dst_ = fopen(path, "wb"); + if(dst_) + { + uint64_t space = 0; + + err = sys_util::get_disk_size(path, nullptr, &space, nullptr); + if (err || space < size * 1.5) + { + fclose(dst_); + dst_ = nullptr; + remove(path); + if (err == 0) + err = ENOSPC; + } + else + { + path_ = path; + size_ = size; + check_ = check ? check : ""; + } + } + else + { + err = errno; + } + + return err; +} + +int file_saver::put_data(const void* data, uint32_t* size/*[in] - total bytes of data; [out] - used bytes*/) +{ + if(!dst_) + return ENOENT; + + int w = *size > size_ - wrote_ ? size_ - wrote_ : *size, + real_w = fwrite(data, 1, w, dst_), // should handle error here ! + err = 0; + + *size = real_w; + wrote_ += real_w; + if(wrote_ >= size_) + { + fclose(dst_); + dst_ = nullptr; + } + else if (real_w < w) // what happens ? + { + err = ferror(dst_); + } + notify_progress(size_, wrote_, err); + + return 0; +} +bool file_saver::is_complete(void) +{ + return wrote_ >= size_; +} +uint32_t file_saver::get_required(void) +{ + return size_ - wrote_; +} + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +data_source::data_source() +{} +data_source::~data_source() +{} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// dyn_mem +uint64_t dyn_mem::mem_used_bytes_ = 0; +MUTEX dyn_mem::mem_lock_; + +dyn_mem::dyn_mem(size_t size) : buf_(nullptr), len_(0), space_(ALIGN_INT(size, 16)) +{ + buf_ = (uint8_t*)malloc(space_); + if (buf_) + { + SIMPLE_LOCK(dyn_mem::mem_lock_); + dyn_mem::mem_used_bytes_ += space_; + memset(buf_, 0, space_); + } +} +dyn_mem::dyn_mem(void* buf, size_t size) : buf_((uint8_t*)buf), space_(size), len_(size) +{ + +} + +dyn_mem::~dyn_mem() +{ + if (buf_) + { + free(buf_); + { + SIMPLE_LOCK(dyn_mem::mem_lock_); + dyn_mem::mem_used_bytes_ -= space_; + } + } +} + +uint64_t dyn_mem::mem_used(void) +{ + return dyn_mem::mem_used_bytes_; +} +dyn_mem_ptr dyn_mem::memory(size_t size) +{ + return new dyn_mem(size); +} + +uint32_t dyn_mem::space(void) +{ + return space_; +} +bool dyn_mem::set_len(size_t len) +{ + if (len > space_) + return false; + + len_ = len; + + return true; +} +int dyn_mem::put(const void* data, int len) +{ + if (len + len_ > space_) + len = space_ - len; + + if (len > 0) + { + memcpy(buf_ + len_, data, len); + len_ += len; + } + else + len = 0; + + return len; +} +void* dyn_mem::detach(size_t* size) +{ + void* buf = buf_; + + if (size) + *size = space_; + space_ = len_ = 0; + buf_ = nullptr; + + return buf; +} + +size_t dyn_mem::used(size_t len) +{ + if (len >= len_) + { + len_ = 0; + } + else if (len) + { + memcpy(buf_, buf_ + len, len_ - len); + len_ -= len; + } + + return len_; +} +dyn_mem& dyn_mem::operator+=(dyn_mem& r) +{ + if (len_ + r.get_rest() > space_) + { + size_t size = ALIGN_INT(len_ + r.get_rest(), 16); + uint8_t* buf = (uint8_t*)malloc(size); + memcpy(buf, buf_, len_); + free(buf_); + buf_ = buf; + { + SIMPLE_LOCK(dyn_mem::mem_lock_); + dyn_mem::mem_used_bytes_ += size - space_; + } + space_ = size; + } + memcpy(buf_ + len_, r.buf_, r.get_rest()); + len_ += r.get_rest(); + + return *this; +} + +bool dyn_mem::is_memory_block(void) +{ + return true; +} +uint32_t dyn_mem::get_rest(void) +{ + return len_; +} + +// following API valid when is_memory_block() return true +uint8_t* dyn_mem::ptr(void) +{ + return buf_; +} + +// following API valid when is_memory_block() return false +int dyn_mem::fetch_data(void* buf, uint32_t* size) +{ + if (*size >= len_) + { + memcpy(buf, buf_, len_); + *size = len_; + len_ = 0; + } + else + { + memcpy(buf, buf_, *size); + used(*size); + } + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +file_reader::file_reader() : len_(0), src_(nullptr), path_(""), consume_(0) +{} +file_reader::~file_reader() +{ + if(src_) + fclose(src_); +} + +int file_reader::open(const char* file) +{ + if(src_) + fclose(src_); + + src_ = fopen(file, "rb"); + if(!src_) + return errno; + + FSEEK(src_, 0, SEEK_END); + len_ = FTELL(src_); + FSEEK(src_, 0, SEEK_SET); + path_ = file; + consume_ = 0; + + return 0; +} +int file_reader::attach(FILE* f) +{ + if (src_) + { + fclose(src_); + src_ = nullptr; + } + + uint64_t cur = FTELL(f); + + FSEEK(f, 0, SEEK_END); + len_ = FTELL(f); + FSEEK(f, cur, SEEK_SET); + if (len_ <= cur) + return EINVAL; + + src_ = f; + len_ -= cur; + consume_ = 0; + + return 0; +} +FILE* file_reader::detach(void) +{ + FILE* ret = src_; + + src_ = nullptr; + len_ = 0; + path_ = ""; + + return ret; +} + +bool file_reader::is_memory_block(void) +{ + return false; +} +uint32_t file_reader::get_rest(void) +{ + return len_ - consume_; +} + +// following API valid when is_memory_block() return true +uint8_t* file_reader::ptr(void) +{ + return nullptr; +} + +// following API valid when is_memory_block() return false +int file_reader::fetch_data(void* buf, uint32_t* size) +{ + if (!src_) + return ENODATA; + + size_t r = fread(buf, 1, *size, src_); // fix me if ERROR occurs !!! + + consume_ += r; + *size = r; + if (consume_ >= len_) + { + fclose(src_); + src_ = nullptr; + } + notify_progress(len_, consume_, 0); + + return 0; +} diff --git a/sdk/base/data.h b/sdk/base/data.h new file mode 100644 index 0000000..e3e6a50 --- /dev/null +++ b/sdk/base/data.h @@ -0,0 +1,260 @@ +#pragma once + +// Objects IO +// +// created on 2023-03-10 + +#include "utils.h" +#include "packet.h" + +#include +#include + +#define CLS_PTR(cls) typedef cls* cls##_ptr; + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +/* packet parameter keeper, parameter of corresponding packet +*/ +#define PROGRESS_NOTIFYER std::function + +class packet_data_base : public refer +{ + PROGRESS_NOTIFYER progress_notify_; + void* user_data_; + +protected: + uint32_t pack_cmd_; + uint32_t pack_id_; + +public: + packet_data_base(); + +protected: + virtual ~packet_data_base(); + int notify_progress(uint64_t total, uint64_t cur_size, uint32_t err); + +public: + void set_packet_param(uint32_t cmd, uint32_t id); + int get_packet_command(void); + int get_packet_id(void); + + void set_progress_notify(PROGRESS_NOTIFYER notify = PROGRESS_NOTIFYER(), void* param = nullptr); +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +/* data_holder, used when data is also required for a certain packet +*/ +class data_holder : public packet_data_base +{ +public: + data_holder(); +protected: + virtual ~data_holder(); + +public: + virtual int put_data(const void* data, uint32_t* size/*[in] - total bytes of data; [out] - used bytes*/) = 0; // return error code + virtual bool is_complete(void) = 0; + virtual uint32_t get_required(void) = 0; +}; + +class mem_holder : public data_holder +{ + uint8_t* buf_ = nullptr; + size_t space_ = 0; + size_t wpos_ = 0; + +public: + mem_holder(size_t size); + +protected: + ~mem_holder(); + + // data_holder +public: + virtual int put_data(const void* data, uint32_t* size/*[in] - total bytes of data; [out] - used bytes*/) override; // return error code + virtual bool is_complete(void) override; + virtual uint32_t get_required(void) override; + +public: + size_t data_length(void); + uint8_t* data(void); +}; + +class empty_holer : public data_holder +{ + uint64_t size_; + uint64_t put_; + +public: + empty_holer(uint64_t size); +protected: + ~empty_holer(); + + +public: + virtual int put_data(const void* data, uint32_t* size/*[in] - total bytes of data; [out] - used bytes*/) override; // return error code + virtual bool is_complete(void) override; + virtual uint32_t get_required(void) override; +}; + +class file_saver : public data_holder +{ + uint64_t size_; + uint64_t wrote_; + std::string path_; + std::string check_; + FILE *dst_; + uint32_t pack_cmd_; + uint32_t pack_id_; + + void close(void); + +public: + file_saver(void); +protected: + ~file_saver(); + +public: + int open(const char* path, uint64_t size, const char* check = nullptr); + +public: + virtual int put_data(const void* data, uint32_t* size/*[in] - total bytes of data; [out] - used bytes*/) override; + virtual bool is_complete(void) override; + virtual uint32_t get_required(void) override; +}; + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +/* data_source, can be a memory block or STREAM object +*/ +class data_source : public packet_data_base +{ + uint32_t pack_cmd_; + uint32_t pack_id_; + +public: + data_source(); + +protected: + virtual ~data_source(); + +public: + virtual bool is_memory_block(void) = 0; + virtual uint32_t get_rest(void) = 0; + + // following API valid when is_memory_block() return true + virtual uint8_t* ptr(void) = 0; + + // following API valid when is_memory_block() return false. return error code + virtual int fetch_data(void* buf, uint32_t* size) = 0; +}; + + +class dyn_mem : public data_source +{ + uint8_t* buf_; // data buf + size_t space_; // occupy space in bytes + size_t len_; // data length in bytes + + static MUTEX mem_lock_; + static uint64_t mem_used_bytes_; + +public: + dyn_mem(size_t size); + dyn_mem(void* buf, size_t size); + + static uint64_t mem_used(void); + static dyn_mem* memory(size_t size); + +protected: + ~dyn_mem(); + +public: + uint32_t space(void); + bool set_len(size_t len); + int put(const void* data, int len); + void* detach(size_t* size); // for constructed from dyn_mem(void* buf, size_t size) + + size_t used(size_t len); // used len bytes content, move following data to head and set data length, return rest data length + dyn_mem& operator+=(dyn_mem& r); + + // data_source +public: + virtual bool is_memory_block(void) override; + virtual uint32_t get_rest(void) override; + + // following API valid when is_memory_block() return true + virtual uint8_t* ptr(void) override; + + // following API valid when is_memory_block() return false + virtual int fetch_data(void* buf, uint32_t* size) override; +}; + +class file_reader : public data_source +{ + size_t len_; + size_t consume_; + FILE *src_; + std::string path_; + +public: + file_reader(); + +protected: + ~file_reader(); + +public: + int open(const char* file); + int attach(FILE* f); + FILE* detach(void); + +public: + virtual bool is_memory_block(void) override; + virtual uint32_t get_rest(void) override; + + // following API valid when is_memory_block() return true + virtual uint8_t* ptr(void) override; + + // following API valid when is_memory_block() return false + virtual int fetch_data(void* buf, uint32_t* size) override; +}; + +CLS_PTR(packet_data_base); +CLS_PTR(data_holder); +CLS_PTR(mem_holder); +CLS_PTR(data_source); +CLS_PTR(dyn_mem); +CLS_PTR(file_reader); + + +// callback proto +// +// parameters: usb_functionfs_event* - the function event ptr +// +// dyn_mem_ptr - the packet buffer, read-only +// +// uint32_t* - to return how many data in bytes the handler consumed, the most high bit is to indicate whether should notify the returned packet has sent +// +// normally, the value should be sizeof(PACK_BASE) + PACK_BASE::payload_len, i.e. the handler consume all data of an entire packet +// +// when invalid packet, suggest use the entire data +// +// packet_data_base_ptr* - return data_holder or data_source or nullptr The number of bytes required for this packet, 0 is over for this packet +// +// data_holder: the packet/command need more data than dyn_mem_ptr provides to complete the business. such as 'write a large file' +// +// data_source: the reply content may be a large data (a large file content) +// +// return value of all routines is the reply packet, nullptr if the packet need not reply +// +// NOTE: when parameter uint32_t* and packet_data_base_ptr* both are nullptr, it is notifying the command reply packet has sent, callback should return nullptr only +// +#define FUNCTION_PROTO_PARAMETERS dyn_mem_ptr, uint32_t*, packet_data_base_ptr* +#define FUNCTION_PROTO_COMMAND_HANDLE dyn_mem_ptr(FUNCTION_PROTO_PARAMETERS) + diff --git a/sdk/base/encrypt.cpp b/sdk/base/encrypt.cpp new file mode 100644 index 0000000..2bcb000 --- /dev/null +++ b/sdk/base/encrypt.cpp @@ -0,0 +1,133 @@ +#include "encrypt.h" + + + + + + + + + + + + + + + + + + + + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// exporting api: +dyn_mem_ptr packet_encrypt(dyn_mem_ptr packet, uint32_t cmd_type, uint32_t type, uint8_t enc_data) +{ + dyn_mem_ptr ret = packet; + LPPACK_BASE pack = (LPPACK_BASE)packet->ptr(); + + ret->add_ref(); + if (cmd_type == ENCRYPT_CMD_XOR_PID) + pack->cmd ^= pack->pack_id; + else if (cmd_type == ENCRYPT_CMD_ADD_PID) + pack->cmd += pack->pack_id; + else if (cmd_type == ENCRYPT_CMD_SUB_PID) + pack->cmd -= pack->pack_id; + + pack->enc_cmd = cmd_type; + if (type != ENCRYPT_NONE) + { + std::string cont(""); + if (type == ENCRYPT_BASE64) + { + + } + else if (type == ENCRYPT_AES) + { + + } + else if (type == ENCRYPT_ZIP) + { + + } + + if (cont.length()) + { + // space is enough ? + if (cont.length() + sizeof(PACK_BASE) > packet->space()) + { + ret->release(); + ret = dyn_mem::memory(sizeof(PACK_BASE) + cont.length()); + memcpy(ret->ptr(), packet->ptr(), sizeof(PACK_BASE)); + pack = (LPPACK_BASE)ret->ptr(); + } + + // copy cipher text and set encrypt type ... + memcpy(pack->payload, cont.c_str(), cont.length()); + ret->set_len(sizeof(PACK_BASE) + cont.length()); + pack->payload_len = cont.length(); + pack->encrypt = type; + pack->enc_data = enc_data; + } + } + + return ret; +} +dyn_mem_ptr packet_decrypt(dyn_mem_ptr packet) +{ + dyn_mem_ptr ret = packet; + LPPACK_BASE pack = (LPPACK_BASE)packet->ptr(); + + ret->add_ref(); + if (pack->enc_cmd == ENCRYPT_CMD_XOR_PID) + pack->cmd ^= pack->pack_id; + else if (pack->enc_cmd == ENCRYPT_CMD_ADD_PID) + pack->cmd -= pack->pack_id; + else if (pack->enc_cmd == ENCRYPT_CMD_SUB_PID) + pack->cmd += pack->pack_id; + + if (pack->encrypt != ENCRYPT_NONE && pack->payload_len && packet->get_rest() >= sizeof(PACK_BASE) + pack->payload_len) + { + std::string cont(""); + if (pack->encrypt == ENCRYPT_BASE64) + { + + } + else if (pack->encrypt == ENCRYPT_AES) + { + + } + else if (pack->encrypt == ENCRYPT_ZIP) + { + + } + + if (cont.length()) + { + // have out-packet data ? + if (packet->get_rest() > sizeof(PACK_BASE) + pack->payload_len) + cont += std::string(pack->payload + pack->payload_len, packet->get_rest() - (sizeof(PACK_BASE) + pack->payload_len)); + + // space is enough ? + if (cont.length() + sizeof(PACK_BASE) > packet->space()) + { + ret->release(); + ret = dyn_mem::memory(sizeof(PACK_BASE) + cont.length()); + memcpy(ret->ptr(), packet->ptr(), sizeof(PACK_BASE)); + pack = (LPPACK_BASE)ret->ptr(); + } + + // copy plain text and set encrypt type to none ... + memcpy(pack->payload, cont.c_str(), cont.length()); + ret->set_len(sizeof(PACK_BASE) + cont.length()); + pack->encrypt = ENCRYPT_NONE; + pack->payload_len = cont.length(); + } + } + + return ret; +} + diff --git a/sdk/base/encrypt.h b/sdk/base/encrypt.h new file mode 100644 index 0000000..ffe1bb9 --- /dev/null +++ b/sdk/base/encrypt.h @@ -0,0 +1,45 @@ +#pragma once + +// Objects for encrypting/decrypting +// +// created on 2023-04-04 + + +#include "data.h" + + +enum encryptor +{ + ENCRYPT_NONE = 0, + ENCRYPT_BASE64, + ENCRYPT_AES, + ENCRYPT_ZIP, +}; +enum encrypt_cmd +{ + ENCRYPT_CMD_NONE = 0, + ENCRYPT_CMD_XOR_PID, // cmd ^= pack_id + ENCRYPT_CMD_ADD_PID, // cmd += pack_id + ENCRYPT_CMD_SUB_PID, // cmd -= pack_id +}; + +// Function: encrypting & decrypting packet +// +// Parameters: packet - pointer to the base packet +// +// data - cipher/plain data +// +// size - [in]: bytes of source 'data'; +// +// cmd_type - member 'cmd' encrypting method +// +// type - payload encrypting method +// +// enc_data - encrypting data for payload encrypting method +// +// Return: 'cmd' returned on origin packet, and returning value is for payload only. nullptr on failure +// +// NOTE: nullptr also returned if data was nullptr or size was ZERO +// +dyn_mem_ptr packet_encrypt(dyn_mem_ptr packet, uint32_t cmd_type = ENCRYPT_CMD_NONE, uint32_t type = ENCRYPT_NONE, uint8_t enc_data = 0); +dyn_mem_ptr packet_decrypt(dyn_mem_ptr packet); diff --git a/sdk/hginclude/huagaoxxx_warraper_ex.h b/sdk/base/huagaoxxx_warraper_ex.h similarity index 99% rename from sdk/hginclude/huagaoxxx_warraper_ex.h rename to sdk/base/huagaoxxx_warraper_ex.h index d3f63b4..2a092ad 100644 --- a/sdk/hginclude/huagaoxxx_warraper_ex.h +++ b/sdk/base/huagaoxxx_warraper_ex.h @@ -167,7 +167,7 @@ typedef struct _device // 参考命名:名称+资源,如“HG200 USB1” char vendor[MAX_NAME_LEN]; // 设备制造商 char model[MAX_NAME_LEN]; // model name - family - char type[MAX_NAME_LEN]; // device type + //char type[MAX_NAME_LEN]; // device type }ScannerInfo; // hg_scanner_control 控制码及参数 diff --git a/sdk/hginclude/ini_file.cpp b/sdk/base/ini_file.cpp similarity index 100% rename from sdk/hginclude/ini_file.cpp rename to sdk/base/ini_file.cpp diff --git a/sdk/hginclude/ini_file.h b/sdk/base/ini_file.h similarity index 100% rename from sdk/hginclude/ini_file.h rename to sdk/base/ini_file.h diff --git a/sdk/base/packet.h b/sdk/base/packet.h new file mode 100644 index 0000000..e40ae4c --- /dev/null +++ b/sdk/base/packet.h @@ -0,0 +1,379 @@ +#pragma once + +// packet structures and command +// +// created on 2022-12-06 +// +#if !defined(WIN32) +#include +#endif +#include + +#define TEMPORARY_API + +/////////////////////////////////////////////////////////////////////////////// +// definitions ... +#define CONFIG_NAME_MAX_LEN 32 // max bytes of configuration name +#define FLOAT_PRECISION .000001f +#define IS_FLOAT_EQUAL(x, y) (-FLOAT_PRECISION <= (x) - (y) && (x) - (y) <= FLOAT_PRECISION) +#define MAKE_WORD(b0, b1) (((b0) & 0xff) | (((b1) << 8) & 0x0ff00)) +#define MAKE_STR(str) #str +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +#define ROGER(cmd) cmd##_ROGER +#define PAIR_COMMAND(cmd) \ + cmd, \ + cmd##_ROGER + +#define RETURN_STR_ENUM(v, e) \ + if(v == e) \ + return #e; + +#define STRUCT_CONSTRUCTOR(st_name) \ + st_name() \ + { \ + memset(this, 0, sizeof(st_name));\ + } + +// protocol version, The first thing to do after connecting is to check whether the field is compatible !!! +#define PROTOCOL_VER MAKE_WORD(0, 1) + +// NOTE: All text transmitted by pack cmd is in UTF-8 format !!! + + +enum ep0_req +{ + USB_REQ_EP0_GET_PROTO_VER = 100, // get protocol version (PROTOCOL_VER), req = me, ind = 0, val = 0, len = 2 + USB_REQ_EP0_GET_STATUS, // 获取各工作线程状态, return EP0REPLYSTATUS. req = me, ind = 0, val = 0, len = sizeof(EP0REPLYSTATUS) + USB_REQ_EP0_RESET_BULK, // 关闭并重新打开BULK端点, return error number (uint32_t). req = me, ind = 0, val = 0, len = sizeof(uint32_t) + USB_REQ_EP0_CANCEL_CMD, // 取消当前指令的继续执行(一般用于中止大数据的传输). req = me, ind = 0, val = 0, len = sizeof(uint32_t) * 2 [(uint32_t)cmd + (uint32_t)pack-id] + USB_REQ_EP0_SET_ENCRYPT, // 设置加密方式, req = me, ind = 0, val = 0, len = sizeof(PACK_BASE) + USB_REQ_EP0_SET_BULK_BUFFER, // 设置bulk缓冲区大小系数, req = me, ind = coef, val = 0, len = 0 +}; +enum bulk_status +{ + BULK_STATUS_NOT_START = 0, // has not initialized + BULK_STATUS_IDLE, // wait IO + BULK_STATUS_IO, // in reading or writing + BULK_STATUS_ERROR, // error occurs + BULK_STATUS_RESET, // in reset(close and reopen) process +}; + +enum packet_cmd +{ + PACK_CMD_NULL, + + PAIR_COMMAND(PACK_CMD_HEART_BEAT), // notify peers you are still alive, receiver should reply the same pack + PAIR_COMMAND(PACK_CMD_INVALID), // reply when received an invalid packet + PAIR_COMMAND(PACK_CMD_SYNC), + + // attributes get/set, all content in PACK_BASE::payload should be in JSON style - all readonly attributes move to readonly SANE-options on 2023-03-20 + //PACK_CMD_ATTR_SYS_VER_GET = 10, // get system version on device, [in]: PACK_BASE, [out] PACK_BASE::payload - {"os":"linux", "ver":"4.4.194", ...} + //PACK_CMD_ATTR_FIRMWARE_VER_GET, // get firmware version, [in]: PACK_BASE, [out] PACK_BASE::payload - {"firmware":"G2393A1234", "CIS":"CIS-123", ...} + //PACK_CMD_ATTR_SERIAL_NUM_GET, // get device serial num, [in]: PACK_BASE, [out] PACK_BASE::payload - {"serial":"20221206001"} + //PACK_CMD_ATTR_SERIAL_NUM_SET, // set device serial num, [in]: PACK_BASE::payload - {"serial":"20221206001"}, [out] PACK_BASE + //PACK_CMD_ATTR_MAC_GET, // get mac address, [in]: PACK_BASE, [out] PACK_BASE::payload - {"mac":"12:34:56:78:9a:bc"} + //PACK_CMD_ATTR_IP_GET, // get ip address, [in]: PACK_BASE, [out] PACK_BASE::payload - {"ipv4":"192.168.1.123", "ipv6":"::1"} + //PACK_CMD_ATTR_HARDWARE_INFO_GET, // get hardwares information on device, [in]: PACK_BASE, [out] PACK_BASE::payload - {"CPU":"ARM x86", "mem":"16GB", ...} + //PACK_CMD_ATTR_HISTORY_COUNT_GET, // get history count, [in]: PACK_BASE, [out] PACK_BASE::payload - {"history-count":12345, ...} + //PACK_CMD_ATTR_ROLLER_COUNT_GET, // get roller count, [in]: PACK_BASE, [out] PACK_BASE::payload - {"roller-count":2345} + //PACK_CMD_ATTR_ROLLER_COUNT_SET, // set roller count, [in]: PACK_BASE::payload - {"roller-count":2345}, [out] PACK_BASE + + // configuration get/set + PACK_CMD_STATUS_ROGER = 100, // device -> host. PACK_BASE::result -> status + PAIR_COMMAND(PACK_CMD_SETTING_GET), // get all settings supported by the device, [in]: PACK_BASE, [out]: PACK_BASE::payload - configuration JSON, see SANE-configuration format + PAIR_COMMAND(PACK_CMD_SETTING_GET_CUR), // get current value of given setting, [in]: PACK_BASE::payload - (char*)name, [out]: PACK_BASE::payload - LPCFGVAL + PAIR_COMMAND(PACK_CMD_SETTING_SET), // set value of given setting, [in]: PACK_BASE::payload - LPCFGVAL, [out]: PACK_BASE::payload - LPCFGVAL + PAIR_COMMAND(PACK_CMD_SETTING_RESTORE), // restore given settings, [in]: PACK_BASE::payload - LPCFGVAL, [out]: PACK_BASE::payload - LPCFGVAL + + // scan command + PACK_CMD_SCAN_BASE = 200, + PAIR_COMMAND(PACK_CMD_SCAN_START), // start scanning, [in]: PACK_BASE, [out]: PACK_BASE + PAIR_COMMAND(PACK_CMD_SCAN_IMG), // device -> host, PACK_BASE::payload - LPPACKIMAGE + PAIR_COMMAND(PACK_CMD_SCAN_PAPER), // device -> host, ONE paper has passed through the CIS. PACK_BASE::data - index of this paper + PACK_CMD_SCAN_FINISHED_ROGER, // device -> host, PACK_BASE::data is scanner_status + PAIR_COMMAND(PACK_CMD_SCAN_STOP), // stop scanning, [in]: PACK_BASE, [out]: PACK_BASE + //PAIR_COMMAND(PACK_CMD_SCAN_IMAGE_REQ), // get image request, [in]: PACK_BASE, [out] PACK_BASE on error, or PACK_BASE::payload - LPPACKIMAGE + //PAIR_COMMAND(PACK_CMD_SCAN_STATUS), // get scanner status, [in]: PACK_BASE, [out] PACK_BASE::result is status code + + // file operation + PACK_CMD_FILE_BASE = 300, + //PAIR_COMMAND(PACK_CMD_FILE_QUERY), // query file information, [in]: PACK_BASE::payload - (char*)file-path, [out] PACK_BASE::payload - LPFILEINFO + PAIR_COMMAND(PACK_CMD_FILE_READ_REQ), // read file content, [in]: PACK_BASE::payload - LPTXFILE, [out] PACK_BASE::payload - LPTXFILE + PAIR_COMMAND(PACK_CMD_FILE_WRITE_REQ), // write a file, [in]: PACK_BASE::payload - LPTXFILE, [out] PACK_BASE + PAIR_COMMAND(PACK_CMD_FILE_MOVE), // move/rename a file, [in]: PACK_BASE::payload - src\0dst\0\0, [out] PACK_BASE + PAIR_COMMAND(PACK_CMD_FILE_REMOVE), // delete a file, [in]: PACK_BASE::payload - (char*)file-path, [out] PACK_BASE + + // process operation + PACK_CMD_PROCESS_BASE = 400, + PAIR_COMMAND(PACK_CMD_PROCESS_START), // start a program [in]: PACK_BASE::payload - (char*)pe\0param\0\0, [out]: PACK_BASE::payload - (uint64_t)process-id on success or PACK_BASE on failure + PAIR_COMMAND(PACK_CMD_PROCESS_STOP), // kill a process [in]: PACK_BASE::payload - (char*)process-id, [out]: PACK_BASE + PAIR_COMMAND(PACK_CMD_PROCESS_REBOOT), // reboot system, [in]: PACK_BASE, [out]: PACK_BASE + //PAIR_COMMAND(PACK_CMD_PROCESS_EXEC_RESULT), // get result of a command, [in]: PACK_BASE::payload - (char*)command string, [out]: PACK_BASE::payload - (char*)execute result. popen(), fgets ... + //PAIR_COMMAND(PACK_CMD_PROCESS_QUERY), // query process information [in]: PACK_BASE::payload - (char*)process-id(-1 for all), [out]: LPPROCINFO + + PACK_CMD_TOKEN_GET = 900, // Obtain the token of the required command, [in] PACK_BASE, [out] - PACK_BASE::payload - LPOPERTOKEN +}; + +enum img_cb_type +{ + IMG_CB_IMAGE = 0, + IMG_CB_STATUS, + IMG_CB_STOPPED, +}; + +enum scanner_status +{ + SCANNER_STATUS_READY = 0x10000, // status beginning, avoiding conficts with standards/system error code + SCANNER_STATUS_NOT_OPEN, + SCANNER_STATUS_LOST_CONNECT, + SCANNER_STATUS_RESET_BULK, + SCANNER_STATUS_START_SCANNING, // start ok, but scanning-thread not working + SCANNER_STATUS_SCANNING, // start ok, and scanning-thread is working + SCANNER_STATUS_SCAN_FINISHED, // not a persistance status + SCANNER_STATUS_BUSY, // doing task exclude scanning + SCANNER_STATUS_COVER_OPENNED, + SCANNER_STATUS_COVER_CLOSED, + SCANNER_STATUS_SLEEPING, + SCANNER_STATUS_WAKED_UP, + SCANNER_STATUS_COUNT_MODE, + SCANNER_STATUS_DOUBLE_FEEDED, + SCANNER_STATUS_PAPER_JAMMED, + SCANNER_STATUS_PAPER_ASKEW, + SCANNER_STATUS_FEED_FAILED, + SCANNER_STATUS_NO_PAPER, + SCANNER_STATUS_PAPER_ON, + SCANNER_STATUS_STAPLE_ON, + SCANNER_STATUS_SIZE_ERR, + SCANNER_STATUS_DOGEAR, + SCANNER_STATUS_CFG_CHANGED, // PACK_BASE::payload - LPCFGVAL +}; + +// option affection if value changed, see SANE_INFO_xxx +enum opt_affect +{ + OPT_AFFECT_NONE = 0, + OPT_AFFECT_INEXACT = 1, + OPT_AFFECT_OTHERS = 2, + OPT_AFFECT_IMG_PARAM = 4, +}; + +enum img_format +{ + IMG_FMT_UNKNOWN = 0, // unknown format + IMG_FMT_TIFF, + IMG_FMT_BMP, + IMG_FMT_JPEG, + IMG_FMT_PNG, + IMG_FMT_SVG, + IMG_FMT_WEBP, + IMG_FMT_GIF, +}; +enum img_compression +{ + IMG_COMPRESSION_NONE = 0, + IMG_COMPRESSION_GROUP4, + IMG_COMPRESSION_RLE4, + IMG_COMPRESSION_RLE8, + IMG_COMPRESSION_LZW, + IMG_COMPRESSION_ZIP, +}; +enum img_status +{ + IMG_STATUS_OK = 0, // normal + IMG_STATUS_DOUBLE = 1 << 0, // double-feeded paper + IMG_STATUS_JAM = 1 << 1, // jammed paper + IMG_STATUS_STAPLE = 1 << 2, // staples on the paper + IMG_STATUS_SIZE_ERR = 1 << 3, // size check failed + IMG_STATUS_DOGEAR = 1 << 4, // paper has dogear - common + IMG_STATUS_DOGEAR_PARTIAL = 1 << 5, // dogear - scanned partial + IMG_STATUS_BLANK = 1 << 6, // blank image +}; +enum data_type +{ + DATA_TYPE_BOOL = 0, // (bool*) + DATA_TYPE_INT4, // (uint32_t*) + DATA_TYPE_FLOAT, // (double*) + DATA_TYPE_STRING, // (char*) with max_len space. befor and include me, keep same with SANE_TYPE_BOOL, SANE_TYPE_xxx ... + + DATA_TYPE_INT1, // (uint8_t*) + DATA_TYPE_INT2, // (uint16_t*) + DATA_TYPE_INT8, // (uint64_t*) + DATA_TYPE_CUSTOM, +}; + +enum paper_side +{ + PAPER_SIDE_FRONT = 0, // single side, this is front + PAPER_SIDE_BACK, // single side, this is back + PAPER_SIDE_TOP, // VERT-compound sides, and front side is at top + PAPER_SIDE_BOTTOM, // VERT-compound sides, and front side is at bottom + PAPER_SIDE_LEFT, // HORZ-compound sides, and front side is at left + PAPER_SIDE_RIGHT, // HORZ-compound sides, and front side is at right + + PAPER_SIDE_DSP, // a special type +}; +enum rot_angle +{ + ROT_ANGLE_0 = 0, + ROT_ANGLE_90, + ROT_ANGLE_180, + ROT_ANGLE_270, +}; +enum clr_channel +{ + COLOR_CHANNEL_RGB = 0, + COLOR_CHANNEL_RGBA, + COLOR_CHANNEL_GRAY, + COLOR_CHANNEL_RED, + COLOR_CHANNEL_GREEN, + COLOR_CHANNEL_BLUE, + COLOR_CHANNEL_ALPHA, +}; +enum color_mode +{ + COLOR_MODE_BW = 0, + COLOR_MODE_GRAY, + COLOR_MODE_RGB, +}; + +#pragma pack(push) +#pragma pack(1) +typedef struct _ep0_reply +{ + uint8_t in_status; // BULK-IN status, enum bulk_statu + uint8_t out_status; // BULK-OUT status, enum bulk_statu + uint16_t in_err; // valid if in_statu == BULK_STATU_ERROR + uint16_t out_err; // valid if out_statu == BULK_STATU_ERROR + uint16_t task_cnt; // tasks in command queue + uint32_t task_cmd; // the cmd of the task thread is doing + uint32_t task_pack_id; // packet id of the cmd + uint32_t task_required_bytes; // required byte of this packet + uint32_t packets_to_sent; // how many packets in sent queue + uint32_t bytes_to_sent; // how many bytes data is waiting for be sent in one replying packet +}EP0REPLYSTATUS, *LPEP0REPLYSTATUS; + +typedef struct _pack_base // A piece of data has only one header +{ + uint32_t enc_cmd : 2; // encrypting type, for 'cmd' + uint32_t encrypt : 3; // encrypting type, for payload content. the payload must cotains self-check if was encrypted packet + uint32_t enc_data : 5; // data for encrypt + uint32_t size : 6; // bytes of this structure + uint32_t cmd : 16; // packet command + uint32_t data; // simple data in command packet depends 'cmd', or error code in reply packet + uint32_t pack_id; // maintain by the initiator, the reply packet use the same id + uint32_t payload_len; // total bytes of payload of this command packet (the data in the range will sent in ONE 'write'), + // big data can be described in payload and independent communication, and this field should not include them. + // if encrypted packet, this field is the length after encrypting + char payload[0]; // payloads, according to 'cmd' + + STRUCT_CONSTRUCTOR(_pack_base) +}PACK_BASE, * LPPACK_BASE; +#define BASE_PACKET_REPLY(reply, command, id, err) \ + (reply).encrypt = 0; \ + (reply).enc_data = 0; \ + (reply).size = sizeof(reply); \ + (reply).data = err; \ + (reply).cmd = command; \ + (reply).pack_id = id; \ + (reply).payload_len = 0; + + +typedef struct _config_val +{ + uint8_t type; // same as SANE_Value_Type + uint8_t name_off; // name offset of the option in data, end with '\0' + uint8_t val_off; // option value offset in data + uint8_t after_do; // see SANE_INFO_xxx in sane.h + uint16_t val_size; // real size of value + uint16_t max_size; // max size of this option, this value has given in gb_json::size + char data[0]; // contains value and name. fetch them according name_off and val_off members. +}CFGVAL, *LPCFGVAL; + +typedef struct _img_pos +{ + uint64_t paper_ind : 32; // paper index in this turn/start, based ZERO. (image-collector set) + uint64_t new_img : 1; // 0 - partial data; 1 - new image data. (image-collector set) + uint64_t img_over : 1; // 0 - has data yet; 1 - END for the image. (image-collector set) + uint64_t paper_side : 3; // enum paper_side. front of paper(When scanning multiple sheets, the paper feeding side is the front side). (image-collector set) + uint64_t back_rot : 2; // back rotation angle, enum rot_angle. (image-collector set) + uint64_t channel_ind : 4; // index of color channel, enum clr_channel. (image-collector set) + uint64_t status : 7; // img_status. (image-collector set) + uint64_t split_ind : 7; // splitting order, from left to right and then top to bottom, based ZERO + uint64_t multiout_ind : 4; // index of multi-out + uint64_t reserved : 3; // reserved + + STRUCT_CONSTRUCTOR(_img_pos) +}IMGPOS, * LPIMGPOS; +typedef struct _pack_img +{ + IMGPOS pos; // image pos info ... + uint32_t width; // image width in pixel. (image-collector set) + uint32_t height; // image height in pixel. (image-collector set) + uint32_t resolution_x; // image horizontal reolution. (image-collector set) + uint32_t resolution_y; // image vertical reolution. (image-collector set) + uint32_t channels : 6; // image channels per pixel. (image-collector set) + uint32_t format : 6; // image format, see 'img_format'. (image-collector set) + uint32_t bpp : 6; // bits per pixel. (image-collector set) + uint32_t bppc : 6; // bits per pixel in this channel, equal to 'bpp' if pos.channel_ind == 0x0f. (image-collector set) + uint32_t compression : 6; // image data compression, see 'img_compression'. (image-collector set) + uint32_t reserve : 2; // unused now + uint32_t info_size; // image information size in bytes, information part is used for quality of JPEG, pallete of BMP .... (image-collector set) + uint64_t data_size; // image data size in 'data' with bytes. (image-collector set) +// char data[0]; // two parts: image info (info_size) + image data (data_size) + + STRUCT_CONSTRUCTOR(_pack_img) +}PACKIMAGE, * LPPACKIMAGE; + +typedef struct _oper_token +{ + uint32_t type; // token type + char data[128]; // token data +}OPERTOKEN, * LPOPERTOKEN; + +typedef struct _tx_file +{ + uint64_t size; // total size + uint64_t offset; // offset in the file + char path[2]; // file full path-name +}TXFILE, *LPTXFILE; +typedef struct _file_info +{ + OPERTOKEN token; // operation token, returned by command PACK_CMD_TOKEN_GET + uint64_t size; // file size + uint16_t name_len; // bytes of file name string + uint16_t create_time_len; // bytes of create time string: '2022-12-07 12:34:56.789', or target file path in command PACK_CMD_FILE_MOVE + uint16_t modify_time_len; + uint16_t version_len; // bytes of version string + char data[0]; // 4 parts: path-file(name_len) + create-time(create_time_len) + modify-time(modify_time_len) + version(version_len) + // or 5 parts in command PACK_CMD_FILE_WRITE, add content at the last part of bytes 'size' + + STRUCT_CONSTRUCTOR(_file_info) +}FILEINFO, * LPFILEINFO; + +typedef struct _proc_info +{ + OPERTOKEN token; // operation token, returned by command PACK_CMD_TOKEN_GET + uint32_t count; // number of elements in array proc + struct _info + { + uint16_t len; // bytes of this element, include this head + uint64_t pid; // process id + uint64_t ppid; // parent process id + uint64_t start; // started time in ns from 1970-01-01 00:00:00 + uint64_t mem; // memory usage, in bytes + uint64_t cpu_clk; // cpu clock + char path_name[4]; + }proc[1]; + + STRUCT_CONSTRUCTOR(_proc_info) +}PROCINFO, * LPPROCINFO; +#pragma pack(pop) + +//////////////////////////////////////////////////////////////////////////////////////////////// +// configurations ... +// +// 1 - App has whole set, group definitions +// +// 2 - device provides sub-set, or a customizing item +// diff --git a/sdk/hginclude/utils.cpp b/sdk/base/utils.cpp similarity index 68% rename from sdk/hginclude/utils.cpp rename to sdk/base/utils.cpp index 8a3067a..bca497a 100644 --- a/sdk/hginclude/utils.cpp +++ b/sdk/base/utils.cpp @@ -973,7 +973,7 @@ namespace utils { int ret = 0; -#if defined(WIN32) || defined(_WIN64) +#if OS_WIN ULARGE_INTEGER av = { 0 }, all = { 0 }; if (GetDiskFreeSpaceExA(path, &av, &all, NULL)) @@ -1019,7 +1019,7 @@ namespace utils unsigned int get_page_size(unsigned int* map_unit) { unsigned int ps = 1024; -#if defined(WIN32) || defined(_WIN64) +#if OS_WIN SYSTEM_INFO si = { 0 }; GetSystemInfo(&si); @@ -1123,6 +1123,210 @@ namespace utils return 0; } + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // base64 util .. + static char base64_default_table[] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" }; + + base64::base64() : padding_char_('=') + { + base64_ind_[0] = base64_char_[0] = 0; + + initialize_base64_table(base64_default_table); + } + base64::~base64() + {} + + bool base64::is_valid_base64_table(const char* table) + { + bool valid = false; + + if (table && strlen(table) >= 64) + { + char repeat[4] = { 0 }; + + valid = true; + for (int i = 0; i < 63; ++i) + { + repeat[0] = table[i]; + if (strstr(table + i + 1, repeat)) + { + valid = false; + break; + } + } + } + + return valid; + } + bool base64::initialize_base64_table(const char* table) + { + if (!table || strlen(table) < 64) + { + if (memcmp(base64_default_table, base64_char_, 64) == 0) + { + return !table; + } + + memcpy(base64_char_, base64_default_table, 64); + } + else + { + if (memcmp(base64_char_, table, 64) == 0) + { + return true; + } + else if (!is_valid_base64_table(table)) + return false; + + memcpy(base64_char_, table, 64); + } + base64_char_[64] = base64_char_[65] = 0; + + // initialize base64_index + memset(base64_ind_, 0, sizeof(base64_ind_)); + for (int i = 0; i < 64; ++i) + { + base64_ind_[base64_char_[i]] = i; + } + + // padding char + padding_char_ = '='; + if (base64_ind_[padding_char_]) + { + for (padding_char_ = 0x21; padding_char_ < 0x7e && base64_ind_[padding_char_] && padding_char_ != base64_char_[0]; ++padding_char_); + } + + return padding_char_ < 0x7e; + } + + bool base64::set_base64_table(const char* table) + { + return initialize_base64_table(table ? table : base64_default_table); + } + std::string base64::encode(const char* data, size_t bytes, unsigned int line_bytes, bool need_padding) + { + char* str = (char*)malloc(bytes * 2 + 3); + unsigned char c1 = 0, c2 = 0, c3 = 0; + unsigned long line_len = 0; + unsigned long words = bytes / 3; + int rest = bytes % 3, + pos = 0; + std::string ret(""); + + for (unsigned long i = 0; i < words; ++i) + { + // fetch 3 letters + c1 = *data++; + c2 = *data++; + c3 = *data++; + + // encoding into 4-bytes + str[pos++] = base64_char_[c1 >> 2]; + str[pos++] = base64_char_[((c1 << 4) | (c2 >> 4)) & 0x3f]; + str[pos++] = base64_char_[((c2 << 2) | (c3 >> 6)) & 0x3f]; + str[pos++] = base64_char_[c3 & 0x3f]; + line_len += 4; + + // new line ... + if ((unsigned int)line_len > line_bytes - 4) + { + str[pos++] = '\r'; + str[pos++] = '\n'; + line_len = 0; + } + } + + // rest ... + if (rest == 1) + { + c1 = *data++; + str[pos++] = base64_char_[(c1 & 0xfc) >> 2]; + str[pos++] = base64_char_[((c1 & 0x03) << 4)]; + if (need_padding) + { + str[pos++] = padding_char_; + str[pos++] = padding_char_; + } + } + else if (rest == 2) + { + c1 = *data++; + c2 = *data++; + str[pos++] = base64_char_[(c1 & 0xfc) >> 2]; + str[pos++] = base64_char_[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)]; + str[pos++] = base64_char_[((c2 & 0x0f) << 2)]; + if (need_padding) + { + str[pos++] = padding_char_; + } + } + if (pos > 0) + { + str[pos++] = 0; + ret = std::string(str, pos - 1); + } + free(str); + + return ret; + } + std::string base64::decode(const char* data, size_t bytes) + { + char* str = (char*)malloc(bytes + 1); + int pos = 0, + shifts = 18, + value = 0; + std::string ret(""); + + for (int i = 0; i < (int)bytes; ++i) + { + if (*data != '\r' && *data != '\n') + { + if (*data == padding_char_) + { + break; + } + + value += base64_ind_[*data] << shifts; + if (shifts == 0) + { + shifts = 18; + str[pos++] = (value >> 16) & 0x0ff; + str[pos++] = (value >> 8) & 0x0ff; + str[pos++] = (value >> 0) & 0x0ff; + value = 0; + } + else + { + shifts -= 6; + } + } + data++; + } + + if (shifts == 12 || shifts == 6) + { + str[pos++] = (value >> 16) & 0x0ff; + } + else if (shifts == 0) + { + str[pos++] = (value >> 16) & 0x0ff; + str[pos++] = (value >> 8) & 0x0ff; + } + + if (pos > 0) + { + str[pos++] = 0; + ret = std::string(str, pos - 1); + } + free(str); + + return ret; + } + }; @@ -1261,3 +1465,346 @@ void chronograph::reset() +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// event + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// windows event ... +#if OS_WIN +int __stdcall sem_init(sem_t* handle, int, int) +{ + if (!handle) + { + errno = EINVAL; + return -1; + } + + *handle = CreateEvent(NULL, TRUE, FALSE, NULL); + if (*handle) + return 0; + else + { + errno = GetLastError(); + + return -1; + } +} +void __stdcall sem_destroy(sem_t* handle) +{ + if (*handle) + { + CloseHandle(*handle); + *handle = NULL; + } +} +int __stdcall sem_trywait(sem_t* handle) +{ + return WaitForSingleObject(*handle, 1) == WAIT_TIMEOUT ? -1 : 0; +} +void __stdcall sem_wait(sem_t* handle) +{ + if (WaitForSingleObject(*handle, INFINITE) == WAIT_OBJECT_0) + ResetEvent(*handle); +} +int __stdcall sem_timedwait(sem_t* handle, struct timespec* to) +{ + DWORD elapse = to->tv_sec * 1000; + elapse += to->tv_nsec / (1000 * 1000); + + int ret = WaitForSingleObject(*handle, elapse) == WAIT_TIMEOUT ? -1 : 0; + + if (ret == 0) + ResetEvent(*handle); + + return ret; +} +void __stdcall sem_post(sem_t* handle) +{ + SetEvent(*handle); +} + +#endif + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// platform_event (base on semaphore) +platform_event::platform_event(const char* info) : waiting_(false), dbg_info_(info ? info : "") +{ + int err = sem_init(&sem_, 0, 0); + + if (err == -1) + { + err = errno; + utils::to_log(LOG_LEVEL_FATAL, "(%p)sem_init failed: %d\n", this, err); + } +} +platform_event::~platform_event() +{ + sem_destroy(&sem_); +} + +bool platform_event::try_wait(void) +{ + return sem_trywait(&sem_) == 0; +} +bool platform_event::wait(unsigned timeout) +{ + bool waited = true; + + utils::to_log(LOG_LEVEL_DEBUG, "platform_event(%p - %s) --> waiting...\n", this, dbg_info_.c_str()); + waiting_ = true; + if (timeout == USB_TIMEOUT_INFINITE) + sem_wait(&sem_); + else + { + struct timespec to; + to.tv_sec = timeout / 1000; + to.tv_nsec = (long)((timeout % 1000) * 1000 * 1000); + waited = sem_timedwait(&sem_, &to) == 0; + } + utils::to_log(LOG_LEVEL_DEBUG, "platform_event(%p - %s) --> %s.\n", this, dbg_info_.c_str(), waited ? "waited" : "wait timeout"); + waiting_ = false; + + return waited; +} +void platform_event::trigger(void) +{ + sem_post(&sem_); +} +bool platform_event::is_waiting(void) +{ + return waiting_; +} +void platform_event::set_debug_info(const char* info) +{ + dbg_info_ = info ? info : ""; +} + + + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// shared_memory +shared_memory::shared_memory(unsigned long long key, size_t size) : key_(key), obj_((void*)-1), first_(true), bytes_(size), len_(0) +{ + unsigned int* ptr = (unsigned int*)&key_; + utils::to_log(LOG_LEVEL_DEBUG, "shared memory key = 0x%x%08x\n", ptr[1], ptr[0]); + + init(); +} +shared_memory::~shared_memory() +{ + clear(); +} + +void shared_memory::init(void) +{ +#if OS_WIN + char name[40] = { 0 }; + DWORD* key = (DWORD*)&key_; + HANDLE h = NULL; + + sprintf(name, "scanner_0x%08x-%08x", key[1], key[0]); + h = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, bytes_, name); + if (h == NULL) + return; + + first_ = !(GetLastError() == ERROR_ALREADY_EXISTS); + obj_ = (void*)h; +#else + int obj = shmget(key_, bytes_, IPC_EXCL | IPC_CREAT | 0666); + if (obj < 0) + { + unsigned int* v = (unsigned int*)&key_; + if (errno == EEXIST) + { + first_ = false; + obj = shmget(key_, bytes_, 0600); + if (obj == -1) + obj = shmget(key_, bytes_, 0); + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "open existing: shmget(0x%x%08x) = %d\n", v[1], v[0], obj); + obj_ = (void*)obj; + + std::string prev(read()), proc(""); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "shared memory content: %s\n", prev.c_str()); + if (prev.length()) + { + proc = prev; + size_t pos = proc.find("pid: "); + if (pos != std::string::npos) + proc.erase(0, pos + 5); + pos = proc.find(")"); + if (pos != std::string::npos) + proc.erase(pos); + proc = shared_memory::get_proc_name_by_pid(atoi(proc.c_str())); + if (proc.length()) + { + pos = prev.find("("); + if (pos == std::string::npos) + pos = prev.length(); + if (strcasecmp(proc.c_str(), prev.substr(0, pos).c_str())) + proc = ""; + } + } + if (proc.empty()) + { + first_ = true; + clear(); + obj = shmget(key_, bytes_, IPC_EXCL | IPC_CREAT | 0600); + VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "%s is not existing and reopen it\n", prev.c_str()); + } + } + else + { + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "shmget(0x%x%08x) = %d\n", v[1], v[0], errno); + return; + } + } + obj_ = (void*)obj; + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "shared memory id = %d[%s], \n", obj, first_ ? "created" : "opened"); +#endif + + if (first_) + { + pid_t pid = getpid(); + std::string me(""); + char buf[40] = { 0 }; + unsigned int* pn = (unsigned int*)&pid; + + if (sizeof(pid) > 4 && pn[1]) + sprintf(buf, "(pid: 0x%x%08x)", pn[1], pn[0]); + else + sprintf(buf, "(pid: %u)", pn[0]); + + me = utils::get_module_full_path(); + pid = me.rfind(PATH_SEPARATOR[0]); + if ((size_t)pid != std::string::npos) + me.erase(0, pid + 1); + + me += buf; + write(me.c_str(), me.length()); + } +} +void shared_memory::clear(void) +{ + if (obj_ != (void*)-1) +#if OS_WIN + CloseHandle((HANDLE)obj_); +#else + { + if (first_) + { + struct shmid_ds ds = { 0 }; + int* h = (int*)&obj_; + shmctl(*h, IPC_RMID, &ds); + } + } +#endif + + obj_ = (void*)-1; +} +char* shared_memory::get_buf(void) +{ +#if OS_WIN + char* buf = (char*)MapViewOfFile((HANDLE)obj_, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); + if (!buf) + buf = (char*)-1; +#else + int* h = (int*)&obj_; + char* buf = (char*)shmat(*h, 0, 0); + VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "shared memory %d buffer = %s, error = %d\n", *h, hg_log::format_ptr(buf).c_str(), errno); +#endif + + return buf; +} +void shared_memory::release_buf(void* buf) +{ +#if OS_WIN + UnmapViewOfFile(buf); +#else + shmdt(buf); +#endif +} + +#if !OS_WIN +std::string shared_memory::get_proc_name_by_pid(pid_t pid) +{ + char path[512] = { 0 }; + unsigned int* v = (unsigned int*)&pid; + std::string ret(""); + + if (sizeof(pid) > 4 && v[1]) + sprintf(path, "/proc/%lld/status", pid); + else + sprintf(path, "/proc/%u/status", pid); + + FILE* src = fopen(path, "rb"); + if (src) + { + char val[512] = { 0 }; + + memset(path, 0, sizeof(path)); + fgets(path, sizeof(path) - 1, src); + fclose(src); + sscanf(path, "%*s %s", val); + ret = val; + } + if (sizeof(pid) > 4 && v[1]) + { + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "PID(%lld) name is: %s\n", pid, ret.c_str()); + } + else + { + VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "PID(%u) name is: %s\n", pid, ret.c_str()); + } + + return ret; +} +#endif + +bool shared_memory::is_ok(void) +{ + return obj_ != (void*)-1; +} +bool shared_memory::is_first(void) +{ + return is_ok() && first_; +} +std::string shared_memory::read(void) +{ + if (obj_ == (void*)-1) + return ""; + + char* buf = get_buf(); + if (buf == (char*)-1) + return ""; + + std::string ret(""); + size_t len = 0; + int off = 4; // sizeof(size_t); + + memcpy(&len, buf, off); + ret = std::string(buf + off, len); + release_buf(buf); + + return ret; +} +int shared_memory::write(const char* data, size_t len) +{ + if (len > bytes_) + return E2BIG; + + char* buf = get_buf(); + int off = 4; // sizeof(len); + if (buf == (char*)-1) + return errno; + + memcpy(buf, &len, off); + memcpy(buf + off, data, len); + len_ = len; + release_buf(buf); + + return 0; +} + + diff --git a/sdk/hginclude/utils.h b/sdk/base/utils.h similarity index 64% rename from sdk/hginclude/utils.h rename to sdk/base/utils.h index 19dc6f6..7532dfb 100644 --- a/sdk/hginclude/utils.h +++ b/sdk/base/utils.h @@ -9,6 +9,10 @@ #include #include #include +#include +#include +#include +#include enum log_type { @@ -87,6 +91,40 @@ namespace utils log_api(buf.get(), (log_level)level); } } + + template + T swap_half(T v) + { + T mask = (1 << (sizeof(T) * 4)) - 1, + h = v & mask; + + v >>= sizeof(T) * 4; + v &= mask; + h <<= sizeof(T) * 4; + v |= h; + + return v; + } + + + class base64 + { + char base64_ind_[128]; + char base64_char_[80]; + char padding_char_; + + bool is_valid_base64_table(const char* table); + bool initialize_base64_table(const char* table); + + public: + base64(); + ~base64(); + + public: + bool set_base64_table(const char* table = nullptr); + std::string encode(const char* data, size_t bytes, unsigned int line_bytes = -1, bool need_padding = true); + std::string decode(const char* data, size_t bytes); + }; }; #if OS_WIN @@ -153,3 +191,125 @@ public: uint64_t elapse_us(void); void reset(void); }; + +// event +class platform_event : public refer +{ + sem_t sem_; + volatile bool waiting_; + std::string dbg_info_; + +public: + platform_event(const char* info = ""); + ~platform_event(); + +public: + bool try_wait(void); + bool wait(unsigned timeout = USB_TIMEOUT_INFINITE/*ms*/); // USB_TIMEOUT_INFINITE is waiting unfinite, true when watied and false for wait timeout + void trigger(void); + bool is_waiting(void); + + void set_debug_info(const char* info); +}; + +// share memory +class shared_memory : public refer +{ + unsigned long long key_; + void* obj_; + bool first_; + size_t bytes_; + size_t len_; + + void init(void); + void clear(void); + char* get_buf(void); + void release_buf(void* buf); + +#if !defined(WIN32) && !defined(_WIN64) + static std::string get_proc_name_by_pid(pid_t pid); +#endif + +public: + shared_memory(unsigned long long key, size_t size = 1024); + +protected: + ~shared_memory(); + +public: + bool is_ok(void); + bool is_first(void); + std::string read(void); + int write(const char* data, size_t len); +}; + + +template +class safe_fifo +{ + MUTEX lock_; + std::deque que_; + platform_event* wait_; + +public: + safe_fifo() : wait_(new platform_event("fifo")) + {} + ~safe_fifo() + { + wait_->release(); + } + +public: + size_t save(const T& t, bool notify = false) + { + SIMPLE_LOCK(lock_); + size_t cnt = que_.size(); + + que_.push_back(std::move(t)); + if (notify) + wait_->trigger(); + + return cnt + 1; + } + bool take(T& t, bool wait = false) + { + if (wait && size() == 0) + { + wait_->wait(); + } + + { + SIMPLE_LOCK(lock_); + + if (que_.size()) + { + t = std::move(que_.front()); + que_.pop_front(); + + return true; + } + else + { + return false; + } + } + } + size_t size(void) + { + SIMPLE_LOCK(lock_); + + return que_.size(); + } + void clear(void) + { + SIMPLE_LOCK(lock_); + + que_.clear(); + } + void trigger(void) + { + wait_->trigger(); + } +}; + + diff --git a/sdk/imgprc/img_processor.h b/sdk/imgprc/img_processor.h index 8de2134..df3193c 100644 --- a/sdk/imgprc/img_processor.h +++ b/sdk/imgprc/img_processor.h @@ -11,32 +11,6 @@ #include #include "../../hgdriver/3rdparty/opencv/include/opencv2/opencv.hpp" -enum paper_side -{ - PAPER_SIDE_UNKNOWN = 0, - PAPER_SIDE_FRONT, // single side, this is front - PAPER_SIDE_BACK, // single side, this is back - PAPER_SIDE_TOP, // VERT-compound sides, and front side is at top - PAPER_SIDE_BOTTOM, // VERT-compound sides, and front side is at bottom - PAPER_SIDE_LEFT, // HORZ-compound sides, and front side is at left - PAPER_SIDE_RIGHT, // HORZ-compound sides, and front side is at right - - PAPER_SIDE_DSP, // G100/200 DSP data -}; -/* -enum img_status -{ - IMG_STATUS_OK = 0, // normal - IMG_STATUS_DOUBLE = 1 << 0, // double-feeded paper - IMG_STATUS_JAM = 1 << 1, // jammed paper - IMG_STATUS_STAPLE = 1 << 2, // staples on the paper - IMG_STATUS_SIZE_ERR = 1 << 3, // size check failed - IMG_STATUS_DOGEAR = 1 << 4, // paper has dogear - common - IMG_STATUS_DOGEAR_PARTIAL = 1 << 5, // dogear - scanned partial - IMG_STATUS_BLANK = 1 << 6, // blank image -}; -*/ - #pragma pack(push) #pragma pack(1) typedef struct _hg_img_info diff --git a/sdk/imgprc/imgprc_mgr.cpp b/sdk/imgprc/imgprc_mgr.cpp index ad0b164..eab34be 100644 --- a/sdk/imgprc/imgprc_mgr.cpp +++ b/sdk/imgprc/imgprc_mgr.cpp @@ -3,8 +3,8 @@ #include #include #include "../../../sdk/include/huagao/hgscanner_error.h" -#include -#include +#include +#include #include #include diff --git a/sdk/imgprc/imgprc_mgr.h b/sdk/imgprc/imgprc_mgr.h index f29beb0..4556ae1 100644 --- a/sdk/imgprc/imgprc_mgr.h +++ b/sdk/imgprc/imgprc_mgr.h @@ -9,7 +9,7 @@ // NOTE: the interface is for all algorithms are in ONE module #include "img_processor.h" -#include // for refer +#include // for refer #include typedef std::shared_ptr> dcptr; diff --git a/sdk/sane_opt_json/base_opt.h b/sdk/sane_opt_json/base_opt.h index 89a6f47..c6ce6e6 100644 --- a/sdk/sane_opt_json/base_opt.h +++ b/sdk/sane_opt_json/base_opt.h @@ -7,8 +7,8 @@ #include #include -#include // for refer -#include "../../../sdk/include/sane/sane_ex.h" +#include // for refer +#include class sane_opt_provider : public refer { diff --git a/sdk/sane_opt_json/device_opt.cpp b/sdk/sane_opt_json/device_opt.cpp index 146dd04..87e2851 100644 --- a/sdk/sane_opt_json/device_opt.cpp +++ b/sdk/sane_opt_json/device_opt.cpp @@ -1,7 +1,7 @@ #include "device_opt.h" #include -#include +#include #include "base_opt.h" #include #include diff --git a/sdk/sane_opt_json/device_opt.h b/sdk/sane_opt_json/device_opt.h index 575c175..88cb087 100644 --- a/sdk/sane_opt_json/device_opt.h +++ b/sdk/sane_opt_json/device_opt.h @@ -16,7 +16,7 @@ #include "simple_logic.h" #include -#include +#include class sane_opt_provider; diff --git a/twain/ds/huagaods.cpp b/twain/ds/huagaods.cpp index 364b3e9..cbf31dd 100644 --- a/twain/ds/huagaods.cpp +++ b/twain/ds/huagaods.cpp @@ -1001,12 +1001,19 @@ Result huagao_ds::identityOpenDs(const Identity& id) double_check_mode_ = get_config_number("twain-app", "double-check"); if (double_check_mode_ == 0) { - char pe[MAX_PATH] = { 0 }, * name = NULL; + char pe[MAX_PATH] = { 0 }, * name = NULL; + std::string utf8(""); + GetModuleFileNameA(NULL, pe, _countof(pe) - 1); name = strrchr(pe, '\\'); if (name++ == NULL) name = pe; - if (STRICMP(name, "\u597D\u5206\u6570\u9605\u5377\u626B\u63CF\u7AEF.exe") == 0) +#ifdef WIN32 + utf8 = utils::ansi2utf8(name); +#else + utf8 = name; +#endif + if (STRICMP(utf8.c_str(), "\345\245\275\345\210\206\346\225\260\351\230\205\345\215\267\346\211\253\346\217\217\347\253\257.exe") == 0) double_check_mode_ = DOUBLE_CHECK_ULTRASONIC; else double_check_mode_ = DOUBLE_CHECK_TWAIN; @@ -1017,11 +1024,18 @@ Result huagao_ds::identityOpenDs(const Identity& id) if (nobd == -1) { char pe[MAX_PATH] = { 0 }, * name = NULL; + std::string utf8(""); + GetModuleFileNameA(NULL, pe, _countof(pe) - 1); name = strrchr(pe, '\\'); if (name++ == NULL) name = pe; - if (STRICMP(name, "\u519B\u961F\u626B\u63CF2.0.exe") == 0) // 军队扫描2.0.exe +#ifdef WIN32 + utf8 = utils::ansi2utf8(name); +#else + utf8 = name; +#endif + if (STRICMP(name, "\345\206\233\351\230\237\346\211\253\346\217\2172.0.exe") == 0) // 军队扫描2.0.exe nobd = 1; else nobd = 0; diff --git a/twain/ds/huagaods.hpp b/twain/ds/huagaods.hpp index 1992a9d..4f3fcf2 100644 --- a/twain/ds/huagaods.hpp +++ b/twain/ds/huagaods.hpp @@ -9,7 +9,7 @@ #include #include #include "twpp.hpp" -#include "../../sdk/hginclude/utils.h" +#include #include "s2t_api.h" namespace std { diff --git a/twain/ds/sane_helper.cpp b/twain/ds/sane_helper.cpp index b751b33..33e5141 100644 --- a/twain/ds/sane_helper.cpp +++ b/twain/ds/sane_helper.cpp @@ -1,6 +1,6 @@ #include "sane_helper.h" #include "huagao/brand.h" -#include "../../sdk/hginclude/utils.h" +#include #include diff --git a/twain/ds/scanned_img.cpp b/twain/ds/scanned_img.cpp index a056d0e..f2126ed 100644 --- a/twain/ds/scanned_img.cpp +++ b/twain/ds/scanned_img.cpp @@ -1,7 +1,7 @@ #include "scanned_img.h" #include "sane_helper.h" -#include "../../sdk/hginclude/utils.h" +#include #include diff --git a/twain/ds/scanned_img.h b/twain/ds/scanned_img.h index 195481e..67a8b1a 100644 --- a/twain/ds/scanned_img.h +++ b/twain/ds/scanned_img.h @@ -3,7 +3,7 @@ #include #include -#include "../../sdk/hginclude/utils.h" +#include class image_buf diff --git a/twain/ds/scanner.cpp b/twain/ds/scanner.cpp index e7cb8f6..8349931 100644 --- a/twain/ds/scanner.cpp +++ b/twain/ds/scanner.cpp @@ -13,7 +13,7 @@ #include #include #include "sane_helper.h" -#include "../../sdk/hginclude/utils.h" +#include #define START_SCAN_IN_THREAD