diff --git a/code/base/base.h b/code/base/base.h deleted file mode 100644 index b7f7c0e..0000000 --- a/code/base/base.h +++ /dev/null @@ -1,330 +0,0 @@ -#pragma once - -#include "sane/sane_ex.h" - -class ref -{ - volatile long ref_; -public: - ref() : ref_(1) - {} - -protected: - virtual ~ref() - {} - -public: - long add_ref(void) - { - return _InterlockedIncrement(&ref_); - } - long release(void) - { - long r = _InterlockedDecrement(&ref_); - - if (r == 0) - delete this; - - return r; - } -}; - -class parameter : public ref -{ -public: - parameter() - {} - -protected: - virtual ~parameter() - {} - -public: - virtual size_t get_size(void) = 0; - virtual void* get_data(void) = 0; // return data pointer, bool*, int*, double*, (wchar_t*) -}; - - -class ui_helper : public ref -{ -public: - ui_helper() - {} -protected: - virtual ~ui_helper() - {} - -public: - enum data_from - { - DATA_FROM_KNOWN = 0, // pre-defined data name, i.e. resulotion, paper, bright, ... - DATA_FROM_USER, // need a window for user inputing - }; - enum value_type - { - VAL_TYPE_BOOL = 0, - VAL_TYPE_INT, - VAL_TYPE_FLOAT, - VAL_TYPE_STRING, - VAL_TYPE_CUSTOM, // custom data, such as gamma table ... - }; - - // get testing parameter ... - virtual parameter* get_user_input(data_from from, value_type type - , const wchar_t* title // window title when from == DATA_FROM_USER, or parameter name when from == DATA_FROM_KNOWN - , const wchar_t* desc = NULL // description of the parameter if from was DATA_FROM_USER, unused in DATA_FROM_KNOWN - ) = 0; - - enum test_event - { - TEST_EVENT_TIPS = 0, // messages in testing process, data is (wchar_t*), flag is unused - TEST_EVENT_xxx, // should be complemented ... - TEST_EVENT_RESULT, // test result, data is (wchar_t*)description, flag is (bool)result, true - test pass - }; - virtual void test_callback(const wchar_t* name/*test name*/, test_event ev, void* data, size_t flag) = 0; - - // register/unregister sane callback, the sane_callback in UI module should dispatch the events to these registered callback - virtual int register_sane_callback(sane_callback cb, void* param) = 0; - virtual int unregister_sane_callback(sane_callback cb) = 0; - - // All IO operations are blocking - virtual int io_control(unsigned long code, void* data, unsigned* len) = 0; -}; - -#ifdef TEST_DLL -#define DECL_API(ret) __declspec(dllexport) ret __stdcall -#else -#define DECL_API(ret) __declspec(dllimport) ret __stdcall -#endif - -// Function: initialize module -DECL_API(int) func_test_init(void*); - -// Function: to get testing function list supported by this module/DLL -// -// Parameter: buf - to receive the list JSON -// -// len - [in] space of 'buf' in words, [out] words copied in buf, or less buffer size in words if return ERROR_INSUFFICIENT_BUFFER -// -// Return: ERROR_SUCCESS - JSON configuration has copied into buf -// ERROR_INSUFFICIENT_BUFFER - buffer is too small, and the minium size in words is stored in 'len' -// ERROR_INVALID_PARAMETER - NULL for parameter 'len' is not acceptable -DECL_API(int) func_test_get_list(wchar_t* buf // to receive the JSON text - , size_t* len); // [in] space of 'buf' in words, [out] words copied in buf, or less buffer size in words if return ERROR_INSUFFICIENT_BUFFER - -// Function: do ONE function test -// -// Parameter: name - function name -// -// oper - test operation, "start", "pause", "resume", "stop", ... -// -// helper - parameter and testing process callback -// -// Return: error code -DECL_API(int) func_test_go(const wchar_t* name // test name - , const wchar_t* oper // test oper - "start", "pause", "resume", "stop", ... - , ui_helper* helper); - -// Function: uninitialize module -DECL_API(int) func_test_uninit(void*); - - - -////////////////////////////////////////////////////////////////////////////////////////////////// -/*/ testing-DLL load code ... -#include -#include -#include -#include - -class json : public ref -{ -public: - json(); - -protected: - ~json(); - -public: - bool attach(const wchar_t* text); - bool get_value(const wchar_t* key, int& val); - bool get_value(const wchar_t* key, std::wstring& val); - bool get_value(const wchar_t* key, json*& val); -}; - -class test_factory -{ - typedef struct _test_func - { - std::wstring name; - int ver; - int(__stdcall* test_api)(const wchar_t*, const wchar_t*, ui_helper*); - - struct _test_func() - { - name = L""; - ver = 0; - test_api = NULL; - } - bool operator==(const wchar_t* n) - { - return name == n; - } - }TESTFUNC, *LPTESTFUNC; - std::vector test_; - - void add_api(const wchar_t* name, int ver, int(__stdcall* test_api)(const wchar_t*, const wchar_t*, ui_helper*)) - { - std::vector::iterator it = std::find(test_.begin(), test_.end(), name); - - if (it == test_.end()) - { - TESTFUNC tf; - - tf.name = name; - tf.ver = ver; - tf.test_api = test_api; - test_.push_back(tf); - } - else if (ver > it->ver) - { - it->test_api = test_api; - it->ver = ver; - } - } - void load_test_dll(const wchar_t* path_dll) - { - HMODULE mod = LoadLibraryW(path_dll); - int(__stdcall * init)(void*) = NULL; - int(__stdcall * get)(void*, size_t*) = NULL; - int(__stdcall * go)(const wchar_t*, const wchar_t*, ui_helper*) = NULL; - FARPROC* api = (FARPROC*)&init; - wchar_t* buf = NULL; - size_t len = 0; - json* root = NULL, * child = NULL; - - if (!mod) - return; - - *api = GetProcAddress(mod, "func_test_init"); - if (!api) - { - FreeLibrary(mod); - return; - } - init(NULL); - - api = (FARPROC*)&get; - *api = GetProcAddress(mod, "func_test_get_list"); - if(!api) - { - FreeLibrary(mod); - return; - } - - api = (FARPROC*)&go; - *api = GetProcAddress(mod, "func_test_go"); - if (!api) - { - FreeLibrary(mod); - return; - } - - if(get(buf, &len) != ERROR_INSUFFICIENT_BUFFER) - { - FreeLibrary(mod); - return; - } - - buf = new wchar_t[len + 8]; - memset(buf, 0, (len + 8) * 2); - if (get(buf, &len)) - { - delete[] buf; - FreeLibrary(mod); - return; - } - - // parse json ... - len = 0; - root = new json(); - if (root->attach(buf)) - { - for (int i = 1; 1; ++i) - { - swprintf_s(buf, 20, L"%d", i); - if (!root->get_value(buf, child) || !child) - break; - - std::wstring name(L""); - int ver = 0; - if (child->get_value(L"name", name) && child->get_value(L"ver", ver)) - { - add_api(name.c_str(), ver, go); - len++; - } - child->release(); - } - } - - root->release(); - delete[] buf; - if (len == 0) - FreeLibrary(mod); - } - void init(void) - { - wchar_t path[MAX_PATH] = { 0 }; - std::wstring dir(L""); - size_t pos = 0; - HANDLE hf = INVALID_HANDLE_VALUE; - WIN32_FIND_DATAW fd = { 0 }; - - GetModuleFileNameW(NULL, path, _countof(path) - 1); - dir = pos; - pos = dir.rfind(L'\\'); - if (pos++ == std::wstring::npos) - return; - - dir.erase(pos); - dir += L"dlls\\"; - hf = FindFirstFileW((dir + L"*.dll").c_str(), &fd); - if (hf != INVALID_HANDLE_VALUE) - { - do - { - load_test_dll((dir + fd.cFileName).c_str()); - } while (FindNextFileW(hf, &fd)); - - FindClose(hf); - } - } - -public: - test_factory() - { - init(); - } - ~test_factory() - { - - } - -public: - bool is_test_available(const wchar_t* name) // check if the test item with name 'name' is supported - { - std::vector::iterator it = std::find(test_.begin(), test_.end(), name); - - return it != test_.end(); - } - int test(const wchar_t* name, ui_helper* ui, const wchar_t* oper = L"start") - { - std::vector::iterator it = std::find(test_.begin(), test_.end(), name); - - if (it == test_.end()) - return ERROR_NOT_SUPPORTED; - - return it->test_api(name, oper, ui); - } -}; -/////////////////////////*//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/code/base/sane/sane_ex.h b/code/base/sane/sane_ex.h index c4c6627..dbc568d 100644 --- a/code/base/sane/sane_ex.h +++ b/code/base/sane/sane_ex.h @@ -373,7 +373,7 @@ extern "C" { // 则会在len中返回所需要的最小内存长度,并返回 SANE_STATUS_NO_MEM 错误 IO_CTRL_CODE_RESTORE_SETTINGS, // 恢复默认设置 data - NULL, len - NULL IO_CTRL_CODE_GET_DEFAULT_VALUE, // 获取设置项默认值 data - 同sane_control_option - SANE_ACTION_GET_VALUE时的定义, *len - [in] 设置项序号,同sane_control_option中option的值 - IO_CTRL_CODE_CLEAR_ROLLER_COUNT, // 清除滚轴计数 data - NULL, len - to receive current roller count, can be NULL + IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT, // 清除滚轴计数 data - NULL, len - to receive current roller count, can be NULL IO_CTRL_CODE_GET_FINAL_IMAGE_FORMAT, // 获取图像处理最终输出(final())的图像数据格式 data - (SANE_FinalImgFormat*), len - bytes of data IO_CTRL_CODE_SET_FINAL_IMAGE_FORMAT, // 设置图像处理最终输出(final())的图像数据格式 data - (SANE_FinalImgFormat*), len - bytes of data IO_CTRL_CODE_GET_FINAL_COMPRESSION, // 获取支持的压缩格式,data - (SANE_Int*), to receive supported SANE_CompressionType, data[0]: supported counts, data[1]: default value, data[2]: current value; data[3...]: all supported values diff --git a/code/base/test.sln b/code/base/test.sln new file mode 100644 index 0000000..5e8ebfb --- /dev/null +++ b/code/base/test.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32616.157 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcxproj", "{3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Debug|x64.ActiveCfg = Debug|x64 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Debug|x64.Build.0 = Debug|x64 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Debug|x86.ActiveCfg = Debug|Win32 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Debug|x86.Build.0 = Debug|Win32 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Release|x64.ActiveCfg = Release|x64 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Release|x64.Build.0 = Release|x64 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Release|x86.ActiveCfg = Release|Win32 + {3D2FC7CE-4033-48E9-BDC2-2DCBECB398DD}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C210926E-9DF8-4FEE-881F-C1173532BAA1} + EndGlobalSection +EndGlobal diff --git a/code/base/test.vcxproj b/code/base/test.vcxproj new file mode 100644 index 0000000..d38dc10 --- /dev/null +++ b/code/base/test.vcxproj @@ -0,0 +1,144 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {3d2fc7ce-4033-48e9-bdc2-2dcbecb398dd} + test + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS; + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/base/test.vcxproj.filters b/code/base/test.vcxproj.filters new file mode 100644 index 0000000..00324c1 --- /dev/null +++ b/code/base/test.vcxproj.filters @@ -0,0 +1,45 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + \ No newline at end of file diff --git a/code/base/test.vcxproj.user b/code/base/test.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/code/base/test.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/code/base/test_base.cpp b/code/base/test_base.cpp new file mode 100644 index 0000000..9dc870b --- /dev/null +++ b/code/base/test_base.cpp @@ -0,0 +1,237 @@ +#include"test_base.h" +#include +#include +#include +#include +#include + + +static struct Test_Map +{ + const wchar_t* name; //test-1 + const wchar_t* title; //"б" + const int ver; + io_code num; + const bool isbool; + const bool isint; + const bool isstring; +}Test_Map_NO[] = +{ + {HGPDTTOOLDB_NAME_DIAL_SWITCH ,HGPDTTOOLDB_TITLE_DIAL_SWITCH ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_ROCKER_SWITCH ,HGPDTTOOLDB_TITLE_ROCKER_SWITCH ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_BOOT_STATUS ,HGPDTTOOLDB_TITLE_BOOT_STATUS ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_LCD_DISPLAY ,HGPDTTOOLDB_TITLE_LCD_DISPLAY ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_KEY_FUNCTION ,HGPDTTOOLDB_TITLE_KEY_FUNCTION ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_CIS_ORIGINAL_IMAGE,HGPDTTOOLDB_TITLE_CIS_ORIGINAL_IMAGE ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_HOST_FAN ,HGPDTTOOLDB_TITLE_HOST_FAN ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_LED_LIGHT ,HGPDTTOOLDB_TITLE_LED_LIGHT ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_RESET ,HGPDTTOOLDB_TITLE_RESET ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_PAPER_FEED ,HGPDTTOOLDB_TITLE_PAPER_FEED ,0,IO_CTRL_CODE_BASE,false,false,false}, // + {HGPDTTOOLDB_NAME_SCANNING_SENSOR ,HGPDTTOOLDB_TITLE_SCANNING_SENSOR ,0,IO_CTRL_CODE_BASE,false,false,false},// + {HGPDTTOOLDB_NAME_PLACE_CORRECTION_PAPER,HGPDTTOOLDB_TITLE_PLACE_CORRECTION_PAPER ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_AUTO_FLAT_FIELD ,HGPDTTOOLDB_TITLE_AUTO_FLAT_FIELD ,0,IO_CTRL_CODE_BASE,false,false,false},// + {HGPDTTOOLDB_NAME_IMAGE_QUALITY ,HGPDTTOOLDB_TITLE_IMAGE_QUALITY ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_COLORCARD_IMAGEING_QUALITY ,HGPDTTOOLDB_TITLE_COLORCARD_IMAGEING_QUALITY ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_COLORCARD_BIAS_IMAGEING_QUALITY ,HGPDTTOOLDB_TITLE_COLORCARD_BIAS_IMAGEING_QUALITY ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_CLARITY_QUALITY ,HGPDTTOOLDB_TITLE_CLARITY_QUALITY ,0,IO_CTRL_CODE_BASE,false,false,false}, + {HGPDTTOOLDB_NAME_DISTORTION ,HGPDTTOOLDB_TITLE_DISTORTION ,0,IO_CTRL_CODE_BASE,false,false,false}, +}, +Test_Map_Bool[] +{ + {HGPDTTOOLDB_NAME_CLEAR_PAPER_PATH ,HGPDTTOOLDB_TITLE_CLEAR_PAPER_PATH ,0,IO_CTRL_CODE_GET_CLEAN_PAPER_ROAD,true,false,false}, + {HGPDTTOOLDB_NAME_COUNTING_MODE ,HGPDTTOOLDB_TITLE_COUNTING_MODE ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_SKEW_DETECTION ,HGPDTTOOLDB_TITLE_SKEW_DETECTION ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_SEPARATER_MOTOR ,HGPDTTOOLDB_TITLE_SEPARATER_MOTOR ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_ULTRASONIC_MODULE ,HGPDTTOOLDB_TITLE_ULTRASONIC_MODULE ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_COVER_SENSOR ,HGPDTTOOLDB_TITLE_COVER_SENSOR ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_REBOOT_DEVICE ,HGPDTTOOLDB_TITLE_REBOOT_DEVICE ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_MECH_PAPER_FEEDING_INCLINATION,HGPDTTOOLDB_TITLE_MECH_PAPER_FEEDING_INCLINATION ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_CLEAR_ROLLER_COUNT ,HGPDTTOOLDB_TITLE_CLEAR_ROLLER_COUNT,0,IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT,true,false,false}, +}, +Test_Map_String[] +{ + {HGPDTTOOLDB_NAME_PAPER_SEPARATION_STRENGTH ,HGPDTTOOLDB_TITLE_PAPER_SEPARATION_STRENGTH,0,IO_CTRL_CODE_BASE,false,false,true}, + {HGPDTTOOLDB_NAME_CLEAR_ROLLER_COUNT ,HGPDTTOOLDB_TITLE_CLEAR_ROLLER_COUNT,0,IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT,false,false,true}, +}, +Test_Map_Int[] +{ + {HGPDTTOOLDB_NAME_CONFIGURE_SPEED_MODE ,HGPDTTOOLDB_TITLE_CONFIGURE_SPEED_MODE ,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_DORMANCY ,HGPDTTOOLDB_TITLE_DORMANCY ,0,IO_CTRL_CODE_SET_POWER_LEVEL,true,false,false}, + {HGPDTTOOLDB_NAME_SKEW_GEAR ,HGPDTTOOLDB_TITLE_SKEW_GEAR,0,IO_CTRL_CODE_BASE,true,false,false}, + {HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_1 ,HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_1,0,IO_CTRL_CODE_TEST_SINGLE,true,false,false}, + {HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_2 ,HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_2,0,IO_CTRL_CODE_TEST_SINGLE,true,false,false}, + {HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_3 ,HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_3,0,IO_CTRL_CODE_TEST_SINGLE,true,false,false}, + {HGPDTTOOLDB_NAME_PRESSUER_TEST ,HGPDTTOOLDB_TITLE_PRESSUER_TEST ,0,IO_CTRL_CODE_BASE,true,false,false}, +}; +//test +static std::string jsontext1("{\"global\":{\"device_type\":\"G139-G239\",\"option_count\":75},\"restore\":{\"category\":\"base\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"help\":{\"category\":\"advanced\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"grp-1\":{\"category\":\"base\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\"},\"is-multiout\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"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\",\"cur\":127,\"default\":127,\"size\":4,\"range\":{\"min\":0,\"max\":255},\"depend_or\":[\"is-multiout==true\",\"mode==\\u9ed1\\u767d\"]},\"reverse-bw\":{\"category\":\"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\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"is-multiout==true\",\"mode==\\u9ed1\\u767d\"]},\"filter\":{\"category\":\"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\",\"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\":{\"category\":\"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\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"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\",\"cur\":20,\"default\":20,\"size\":4,\"range\":{\"min\":1,\"max\":128},\"depend_or\":[\"is-erase-bkg==true\"]},\"sharpen\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-rid-grid\":{\"category\":\"base\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_and\":[\"is-multiout!=true\",\"mode!=\\u9ed1\\u767d\",\"!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"is-err-extension\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"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\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":10,\"max\":50},\"depend_or\":[\"is-noise-optimize==true\"]},\"paper\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"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\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"category\":\"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\",\"cur\":210.000000,\"default\":210.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":210.000000},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"category\":\"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\",\"cur\":0.000000,\"default\":0.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000},\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"category\":\"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\",\"cur\":297.000000,\"default\":297.000000,\"size\":4,\"range\":{\"min\":0.000000,\"max\":297.000000},\"depend_and\":[\"is-custom-area==true\"]},\"is-size-check\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"type\":\"int\",\"cur\":50,\"default\":50,\"size\":4,\"range\":{\"min\":1,\"max\":100},\"depend_or\":[\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\"]},\"fold-type\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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}},\"image-quality\":{\"category\":\"base\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"type\":\"string\",\"cur\":\"\\u901f\\u5ea6\\u4f18\\u5148\",\"default\":\"\\u901f\\u5ea6\\u4f18\\u5148\",\"size\":24,\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend_or\":[\"resolution>=300\"]},\"is-exchange\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"title\":\"\\u4eae\\u5ea6\",\"type\":\"group\"},\"is-custom-gamma\":{\"category\":\"base\",\"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},\"brightness\":{\"category\":\"base\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"type\":\"int\",\"cur\":128,\"default\":128,\"size\":4,\"range\":{\"min\":1,\"max\":255},\"depend_and\":[\"is-custom-gamma==false\"]},\"contrast\":{\"category\":\"base\",\"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},\"depend_and\":[\"is-custom-gamma==false\"]},\"gamma\":{\"category\":\"base\",\"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},\"depend_and\":[\"is-custom-gamma==false\"]},\"grp-3\":{\"category\":\"base\",\"title\":\"\\u56fe\\u50cf\\u5904\\u7406\",\"type\":\"group\"},\"is-anti-skew\":{\"category\":\"base\",\"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\":{\"category\":\"b"); +static std::string jsontext2("ase\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"advanced\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"advanced\",\"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},\"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\":{\"category\":\"advanced\",\"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},\"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\":{\"category\":\"advanced\",\"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\":5,\"max\":30},\"depend_or\":[\"is-erase-black-frame==true\",\"paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"is-anti-skew==true\"]},\"is-dark-sample\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4},\"permeate-level\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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},\"depend_and\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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},\"depend_and\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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},\"depend_and\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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},\"depend_and\":[\"is-rid-hole-b==true\"]},\"grp-4\":{\"category\":\"base\",\"title\":\"\\u9001\\u7eb8\\u65b9\\u5f0f\\u8bbe\\u7f6e\",\"type\":\"group\"},\"is-wait-scan\":{\"category\":\"base\",\"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},\"scan-mode\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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},\"depend_or\":[\"is-check-askew==true\"]},\"is-check-dog-ear\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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\":0,\"max\":100},\"depend_or\":[\"is-check-dog-ear==true\"]},\"feed-strength\":{\"category\":\"base\",\"title\":\"\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u5206\\u7eb8\\u529b\\u5ea6\",\"type\":\"string\",\"cur\":\"\\u5f31\",\"default\":\"\\u5f31\",\"size\":16,\"range\":[\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\"]},\"time-to-sleep\":{\"category\":\"base\",\"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\"]},\"is-auto-strength\":{\"category\":\"base\",\"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\":{\"category\":\"base\",\"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},\"depend_or\":[\"is-auto-strength==true\"]}}"); + +int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param) +{ + switch (code) + { + case SANE_EVENT_DEVICE_ARRIVED: + { + SANE_Device* sane_dev = (SANE_Device*)data; + } + break; + case SANE_EVENT_DEVICE_LEFT: + { + SANE_Device* sane_dev = (SANE_Device*)data; + } + break; + case SANE_EVENT_WORKING: + { + std::string str = (char*)data; + } + break; + case SANE_EVENT_SCAN_FINISHED: + { + std::string str = (char*)data; + } + break; + case SANE_EVENT_STATUS: + { + std::string str = (char*)data; + } + break; + case SANE_EVENT_ERROR: + { + std::string str = (char*)data; + } + break; + case SANE_EVENT_IMAGE_OK: + { + SANE_Image* sane_img = (SANE_Image*)data; + } + break; + } + + return 0; +} +int str_to_wchar(std::string str, wchar_t* s, size_t* strlen) +{ + if (str.empty()) + return ERROR_INSUFFICIENT_BUFFER; + + size_t size = str.length(); + int len = 0; + len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0); + if (*strlen < len) + { + *strlen = len; + return ERROR_INSUFFICIENT_BUFFER; + } + MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, s, len); + return 0; +} +int get_json_config_file() +{ + int len = 0; + char exePath[256]; + char* buf = NULL; + GetModuleFileNameA(NULL, exePath, 255); + (strrchr(exePath, '\\'))[1] = 0; //ȥִеļ + + strcat(exePath, "DLLs\\G302.hsc"); + FILE* fp = fopen(exePath, "rb"); + if (fp == NULL) + { + return -1; + } + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fseek(fp, 0, SEEK_SET); + buf = new char[len]; + if (!buf) + { + fclose(fp); + return -1; + } + memset(buf, 0, len); + fread(buf, len, 1, fp); + fclose(fp); + std::cout << buf << std::endl; +} +int func_test_init(void* init) +{ + return 0; +} +int func_test_get_list(wchar_t* buf, size_t* len) +{ + return str_to_wchar(jsontext1+ jsontext2, buf, len); +} +int func_test_go(const wchar_t* name, const wchar_t* oper, ui_helper* helper) +{ + if (!name || !oper || !helper) + { + return -1; + } + helper->add_ref(); + helper->register_sane_callback(sane_ex_callback, NULL); + + bool flag = false; + wchar_t* des = NULL; + int ret = 0; + ui_helper::test_event ev = ui_helper::TEST_EVENT_TIPS; //ĿTEST_EVENT_TIPSԽTEST_EVENT_RESULT + + for (size_t i = 0; i < sizeof(Test_Map_Bool)/sizeof(Test_Map_Bool[0]); i++) + { + des = (wchar_t*)Test_Map_Bool[i].title; + if (wcscmp(name, Test_Map_Bool[i].name) == 0) //ֶDzᴫ + { + SANE_Bool map_bool = true; + unsigned int len = sizeof(SANE_Bool); + ret = helper->io_control(Test_Map_Bool[i].num,&map_bool, &len); + if (ret == SCANNER_ERR_OK) + { + ev = ui_helper::TEST_EVENT_RESULT; + helper->test_callback(Test_Map_Bool[i].name, ev, des, true); + map_bool = false; + ret = helper->io_control(Test_Map_Bool[i].num, &map_bool, &len); + + return SCANNER_ERR_OK; + } + } + else if(wcscmp(name, Test_Map_String[i].name) == 0) + { + if (wcscmp(name, HGPDTTOOLDB_NAME_PAPER_SEPARATION_STRENGTH) == 0) + { + + } + return SCANNER_ERR_OK; + } + else if (wcscmp(name, Test_Map_String[i].name) == 0) + { + return SCANNER_ERR_OK; + } + } + helper->release(); + helper->unregister_sane_callback(sane_ex_callback); + return SCANNER_ERR_OK; +} +int func_test_uninit(void* uninit) +{ + return 0; +} + + + + +int main() +{ + get_json_config_file(); + int ret = 0; + wchar_t* str_wchar = NULL; + size_t len = 0; + ret = func_test_get_list(str_wchar, &len); + if (ret == ERROR_INSUFFICIENT_BUFFER) + { + str_wchar = new wchar_t[len]; + ret = func_test_get_list(str_wchar, &len); + } + + ret = func_test_go(L"test-5",L"start",NULL); + //std::wcout << str_wchar << std::endl; +} \ No newline at end of file diff --git a/code/base/test_base.h b/code/base/test_base.h new file mode 100644 index 0000000..b11abd4 --- /dev/null +++ b/code/base/test_base.h @@ -0,0 +1,527 @@ +#pragma once +#include "string" +#include "sane/sane_ex.h" +//////////////////////////////////////TITLE////////////////////////////////////// +/* 拨码开关校验 */ +#define HGPDTTOOLDB_TITLE_DIAL_SWITCH L"拨码开关校验" +/* 检查船型开关功能 */ +#define HGPDTTOOLDB_TITLE_ROCKER_SWITCH L"检查船型开关功能" +/* 设备上电并观察开机状态 */ +#define HGPDTTOOLDB_TITLE_BOOT_STATUS L"设备上电并观察开机状态" +/* 检查液晶显示 */ +#define HGPDTTOOLDB_TITLE_LCD_DISPLAY L"检查液晶显示" +/* 清理纸道功能确认 */ +#define HGPDTTOOLDB_TITLE_CLEAR_PAPER_PATH L"清理纸道功能确认" +/* 按键功能检测 */ +#define HGPDTTOOLDB_TITLE_KEY_FUNCTION L"按键功能检测" +/* 计数模式检测 */ +#define HGPDTTOOLDB_TITLE_COUNTING_MODE L"计数模式检测" +/* 歪斜检测 */ +#define HGPDTTOOLDB_TITLE_SKEW_DETECTION L"歪斜检测" +/* 分纸电机检测 */ +#define HGPDTTOOLDB_TITLE_SEPARATER_MOTOR L"分纸电机检测" +/* CIS原图初检 */ +#define HGPDTTOOLDB_TITLE_CIS_ORIGINAL_IMAGE L"CIS原图初检" +/* 主机风扇功能检测 */ +#define HGPDTTOOLDB_TITLE_HOST_FAN L"主机风扇功能检测" +/* 超声波模块检验 */ +#define HGPDTTOOLDB_TITLE_ULTRASONIC_MODULE L"超声波模块检验" +/* LED灯状态检查 */ +#define HGPDTTOOLDB_TITLE_LED_LIGHT L"LED灯状态检查" +/* 复位检查 */ +#define HGPDTTOOLDB_TITLE_RESET L"复位检查" +/* 走纸检查 */ +#define HGPDTTOOLDB_TITLE_PAPER_FEED L"走纸检查" +/* 开盖传感器检查 */ +#define HGPDTTOOLDB_TITLE_COVER_SENSOR L"开盖传感器检查" +/* 扫描传感器检查 */ +#define HGPDTTOOLDB_TITLE_SCANNING_SENSOR L"扫描传感器检查" +/* 配置速度模式 */ +#define HGPDTTOOLDB_TITLE_CONFIGURE_SPEED_MODE L"配置速度模式" +/* 放置校正纸 */ +#define HGPDTTOOLDB_TITLE_PLACE_CORRECTION_PAPER L"放置校正纸" +/* 自动平场校正 */ +#define HGPDTTOOLDB_TITLE_AUTO_FLAT_FIELD L"自动平场校正" +/* 重启设备 */ +#define HGPDTTOOLDB_TITLE_REBOOT_DEVICE L"重启设备" +/* 扫描图像质量确认 */ +#define HGPDTTOOLDB_TITLE_IMAGE_QUALITY L"扫描图像质量确认" +/* 色卡纸成像质量评估 */ +#define HGPDTTOOLDB_TITLE_COLORCARD_IMAGEING_QUALITY L"色卡纸成像质量评估" +/* 色卡纸偏色成像质量评估 */ +#define HGPDTTOOLDB_TITLE_COLORCARD_BIAS_IMAGEING_QUALITY L"色卡纸偏色成像质量评估" +/* 清晰度质量评估 */ +#define HGPDTTOOLDB_TITLE_CLARITY_QUALITY L"清晰度质量评估" +/* 畸变修正 */ +#define HGPDTTOOLDB_TITLE_DISTORTION L"畸变修正" +/* 设置休眠 */ +#define HGPDTTOOLDB_TITLE_DORMANCY L"设置休眠" +/* 歪斜挡位检测 */ +#define HGPDTTOOLDB_TITLE_SKEW_GEAR L"歪斜挡位检测" +/* 分纸强度检测 */ +#define HGPDTTOOLDB_TITLE_PAPER_SEPARATION_STRENGTH L"分纸强度检测" +/* 机械走纸倾斜检测 */ +#define HGPDTTOOLDB_TITLE_MECH_PAPER_FEEDING_INCLINATION L"机械走纸倾斜检测" +/* 单张测试1 */ +#define HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_1 L"单张测试1" +/* 单张测试2 */ +#define HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_2 L"单张测试2" +/* 单张测试3 */ +#define HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_3 L"单张测试3" +/* 压力测试2轮 */ +#define HGPDTTOOLDB_TITLE_PRESSUER_TEST L"压力测试2轮" +/* 清除滚轴计数 */ +#define HGPDTTOOLDB_TITLE_CLEAR_ROLLER_COUNT L"清除滚轴计数" +//////////////////////////////////////NAME////////////////////////////////////// +/* 拨码开关校验 */ +#define HGPDTTOOLDB_NAME_DIAL_SWITCH L"test-1" +/* 检查船型开关功能 */ +#define HGPDTTOOLDB_NAME_ROCKER_SWITCH L"test-2" +/* 设备上电并观察开机状态 */ +#define HGPDTTOOLDB_NAME_BOOT_STATUS L"test-3" +/* 检查液晶显示 */ +#define HGPDTTOOLDB_NAME_LCD_DISPLAY L"test-4" +/* 清理纸道功能确认 */ +#define HGPDTTOOLDB_NAME_CLEAR_PAPER_PATH L"test-5" +/* 按键功能检测 */ +#define HGPDTTOOLDB_NAME_KEY_FUNCTION L"test-6" +/* 计数模式检测 */ +#define HGPDTTOOLDB_NAME_COUNTING_MODE L"test-7" +/* 歪斜检测 */ +#define HGPDTTOOLDB_NAME_SKEW_DETECTION L"test-8" +/* 分纸电机检测 */ +#define HGPDTTOOLDB_NAME_SEPARATER_MOTOR L"test-9" +/* CIS原图初检 */ +#define HGPDTTOOLDB_NAME_CIS_ORIGINAL_IMAGE L"test-10" +/* 主机风扇功能检测 */ +#define HGPDTTOOLDB_NAME_HOST_FAN L"test-11" +/* 超声波模块检验 */ +#define HGPDTTOOLDB_NAME_ULTRASONIC_MODULE L"test-12" +/* LED灯状态检查 */ +#define HGPDTTOOLDB_NAME_LED_LIGHT L"test-13" +/* 复位检查 */ +#define HGPDTTOOLDB_NAME_RESET L"test-14" +/* 走纸检查 */ +#define HGPDTTOOLDB_NAME_PAPER_FEED L"test-15" +/* 开盖传感器检查 */ +#define HGPDTTOOLDB_NAME_COVER_SENSOR L"test-16" +/* 扫描传感器检查 */ +#define HGPDTTOOLDB_NAME_SCANNING_SENSOR L"test-17" + +/* 配置速度模式 */ +#define HGPDTTOOLDB_NAME_CONFIGURE_SPEED_MODE L"test-18" +/* 放置校正纸 */ +#define HGPDTTOOLDB_NAME_PLACE_CORRECTION_PAPER L"test-19" +/* 自动平场校正 */ +#define HGPDTTOOLDB_NAME_AUTO_FLAT_FIELD L"test-20" +/* 重启设备 */ +#define HGPDTTOOLDB_NAME_REBOOT_DEVICE L"test-21" +/* 扫描图像质量确认 */ +#define HGPDTTOOLDB_NAME_IMAGE_QUALITY L"test-22" +/* 色卡纸成像质量评估 */ +#define HGPDTTOOLDB_NAME_COLORCARD_IMAGEING_QUALITY L"test-23" +/* 色卡纸偏色成像质量评估 */ +#define HGPDTTOOLDB_NAME_COLORCARD_BIAS_IMAGEING_QUALITY L"test-24" +/* 清晰度质量评估 */ +#define HGPDTTOOLDB_NAME_CLARITY_QUALITY L"test-25" +/* 畸变修正 */ +#define HGPDTTOOLDB_NAME_DISTORTION L"test-26" +/* 设置休眠 */ +#define HGPDTTOOLDB_NAME_DORMANCY L"test-27" +/* 歪斜挡位检测 */ +#define HGPDTTOOLDB_NAME_SKEW_GEAR L"test-28" +/* 分纸强度检测 */ +#define HGPDTTOOLDB_NAME_PAPER_SEPARATION_STRENGTH L"test-29" +/* 机械走纸倾斜检测 */ +#define HGPDTTOOLDB_NAME_MECH_PAPER_FEEDING_INCLINATION L"test-30" +/* 单张测试1 */ +#define HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_1 L"test-31" +/* 单张测试2 */ +#define HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_2 L"test-32" +/* 单张测试3 */ +#define HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_3 L"test-33" +/* 压力测试2轮 */ +#define HGPDTTOOLDB_NAME_PRESSUER_TEST L"test-34" +/* 清除滚轴计数 */ +#define HGPDTTOOLDB_NAME_CLEAR_ROLLER_COUNT L"test-35" +enum scanner_err +{ + SCANNER_ERR_OK = 0, // 成功,正常状态 + + // 1:软件逻辑错误 + SCANNER_ERR_INVALID_PARAMETER = 0x100, // 非法的参数调用 + SCANNER_ERR_USER_CANCELED, // 用户取消了操作 + SCANNER_ERR_INSUFFICIENT_MEMORY, // 分配的内存不足 + SCANNER_ERR_ACCESS_DENIED, // 访问被拒绝 + SCANNER_ERR_IO_PENDING, // 异步访问,数据稍后返回 + SCANNER_ERR_NOT_EXACT, // 数据不精确,精确的数据已经在同一缓存中返回 + SCANNER_ERR_CONFIGURATION_CHANGED, // 设备的配置项发生改变,需要重新加载显示 + SCANNER_ERR_NOT_OPEN, // 设备未打开 + SCANNER_ERR_NOT_START, // 设备没有启动 + SCANNER_ERR_NOT_ANY_MORE, // 用于回调返回,在本次扫描中,对相同操作不再回调 + SCANNER_ERR_NO_DATA, // 没有数据 + SCANNER_ERR_HAS_DATA_YET, // 有数据未被读取(异步操作中) + SCANNER_ERR_OUT_OF_RANGE, // 相关操作超出范围 + SCANNER_ERR_IO, // IO错误 + SCANNER_ERR_TIMEOUT, // 超时错误 + SCANNER_ERR_OPEN_FILE_FAILED, // 打开本地文件失败 + SCANNER_ERR_CREATE_FILE_FAILED, // 创建本地文件失败 + SCANNER_ERR_WRITE_FILE_FAILED, // 写本地文件失败 + SCANNER_ERR_DATA_DAMAGED, // 数据损坏(内置资源数据损坏) + SCANNER_ERR_OPENED_BY_OTHER_PROCESS, // 设备已经被其它进程打开占用 + + // 2:USB错误 + SCANNER_ERR_USB_INIT_FAILED = 0x5b00, // libusb_init 失败 + SCANNER_ERR_USB_REGISTER_PNP_FAILED, // 注册USB监听事件失败 + SCANNER_ERR_USB_CLAIM_INTERFACE_FAILED, // failed in calling libusb_claim_interface + + // 3:硬件错误 + SCANNER_ERR_DEVICE_NOT_FOUND = 0x0de00, // 设备未找到 + SCANNER_ERR_DEVICE_NOT_SUPPORT, // 设备不支持该操作 + SCANNER_ERR_DEVICE_BUSY, // 设备正忙,不能响应该操作 + SCANNER_ERR_DEVICE_SLEEPING, // 设备处于睡眠状态 + SCANNER_ERR_DEVICE_COUNT_MODE, // 设备处于计数扫描状态? + SCANNER_ERR_DEVICE_STOPPED, // 扫描停止 + SCANNER_ERR_DEVICE_COVER_OPENNED, // 扫描仪盖板呈打开状态 + SCANNER_ERR_DEVICE_NO_PAPER, // 没有纸张输入 + SCANNER_ERR_DEVICE_FEEDING_PAPER, // 搓纸失败 + SCANNER_ERR_DEVICE_DOUBLE_FEEDING, // 双张检测 + SCANNER_ERR_DEVICE_PAPER_JAMMED, // 卡纸 + SCANNER_ERR_DEVICE_STAPLE_ON, // 有钉书钉 + SCANNER_ERR_DEVICE_PAPER_SKEW, // 纸张倾斜 + SCANNER_ERR_DEVICE_SIZE_CHECK, // 尺寸检测错误 + SCANNER_ERR_DEVICE_DOGEAR, // 纸张有折角 + SCANNER_ERR_DEVICE_NO_IMAGE, // 设备没取到图 + SCANNER_ERR_DEVICE_SCANN_ERROR, // 设备扫图失败 + SCANNER_ERR_DEVICE_PC_BUSY, // PC繁忙或出错 + SCANNER_ERR_DEVICE_ISLOCK, // 设备被锁定 + SCANNER_ERR_DEVICE_UPGRADE_SUCCESSFUL, // 固件升级成功 + SCANNER_ERR_DEVICE_UPGRADE_FAIL // 固件升级失败 +}; + +class ref +{ + volatile long ref_; +public: + ref() : ref_(1) + {} + +protected: + virtual ~ref() + {} + +public: + long add_ref(void) + { + return _InterlockedIncrement(&ref_); + } + long release(void) + { + long r = _InterlockedDecrement(&ref_); + + if (r == 0) + delete this; + + return r; + } +}; + +class parameter : public ref +{ +public: + parameter() + {} + +protected: + virtual ~parameter() + {} + +public: + virtual size_t get_size(void) = 0; + virtual void* get_data(void) = 0; // return data pointer, bool*, int*, double*, (wchar_t*) +}; + + +class ui_helper : public ref +{ +public: + ui_helper() + {} +protected: + virtual ~ui_helper() + {} + +public: + enum data_from + { + DATA_FROM_KNOWN = 0, // pre-defined data name, i.e. resulotion, paper, bright, ... + DATA_FROM_USER, // need a window for user inputing + }; + enum value_type + { + VAL_TYPE_BOOL = 0, + VAL_TYPE_INT, + VAL_TYPE_FLOAT, + VAL_TYPE_STRING, + VAL_TYPE_CUSTOM, // custom data, such as gamma table ... + }; + + // get testing parameter ... + virtual parameter* get_user_input(data_from from, value_type type + , const wchar_t* title // window title when from == DATA_FROM_USER, or parameter name when from == DATA_FROM_KNOWN + , const wchar_t* desc = NULL // description of the parameter if from was DATA_FROM_USER, unused in DATA_FROM_KNOWN + ) = 0; + + enum test_event + { + TEST_EVENT_TIPS = 0, // messages in testing process, data is (wchar_t*), flag is unused + TEST_EVENT_xxx, // should be complemented ... + TEST_EVENT_RESULT, // test result, data is (wchar_t*)description, flag is (bool)result, true - test pass + }; + virtual void test_callback(const wchar_t* name/*test name*/, test_event ev, void* data, size_t flag) = 0; + + // register/unregister sane callback, the sane_callback in UI module should dispatch the events to these registered callback + virtual int register_sane_callback(sane_callback cb, void* param) = 0; + virtual int unregister_sane_callback(sane_callback cb) = 0; + + // All IO operations are blocking + virtual int io_control(unsigned long code, void* data, unsigned* len) = 0; +}; + +#ifdef TEST_DLL +#define DECL_API(ret) __declspec(dllexport) ret __stdcall +#else +#define DECL_API(ret) __declspec(dllimport) ret __stdcall +#endif + +// Function: initialize module +DECL_API(int) func_test_init(void*); + +// Function: to get testing function list supported by this module/DLL +// +// Parameter: buf - to receive the list JSON +// +// len - [in] space of 'buf' in words, [out] words copied in buf, or less buffer size in words if return ERROR_INSUFFICIENT_BUFFER +// +// Return: ERROR_SUCCESS - JSON configuration has copied into buf +// ERROR_INSUFFICIENT_BUFFER - buffer is too small, and the minium size in words is stored in 'len' +// ERROR_INVALID_PARAMETER - NULL for parameter 'len' is not acceptable +DECL_API(int) func_test_get_list(wchar_t* buf // to receive the JSON text + , size_t* len); // [in] space of 'buf' in words, [out] words copied in buf, or less buffer size in words if return ERROR_INSUFFICIENT_BUFFER + +// Function: do ONE function test +// +// Parameter: name - function name +// +// oper - test operation, "start", "pause", "resume", "stop", ... +// +// helper - parameter and testing process callback +// +// Return: error code +DECL_API(int) func_test_go(const wchar_t* name // test name + , const wchar_t* oper // test oper - "start", "pause", "resume", "stop", ... + , ui_helper* helper); + +// Function: uninitialize module +DECL_API(int) func_test_uninit(void*); + + + +////////////////////////////////////////////////////////////////////////////////////////////////// +/*/ testing-DLL load code ... +#include +#include +#include +#include + +class json : public ref +{ +public: + json(); + +protected: + ~json(); + +public: + bool attach(const wchar_t* text); + bool get_value(const wchar_t* key, int& val); + bool get_value(const wchar_t* key, std::wstring& val); + bool get_value(const wchar_t* key, json*& val); +}; + +class test_factory +{ + typedef struct _test_func + { + std::wstring name; + int ver; + int(__stdcall* test_api)(const wchar_t*, const wchar_t*, ui_helper*); + + struct _test_func() + { + name = L""; + ver = 0; + test_api = NULL; + } + bool operator==(const wchar_t* n) + { + return name == n; + } + }TESTFUNC, *LPTESTFUNC; + std::vector test_; + + void add_api(const wchar_t* name, int ver, int(__stdcall* test_api)(const wchar_t*, const wchar_t*, ui_helper*)) + { + std::vector::iterator it = std::find(test_.begin(), test_.end(), name); + + if (it == test_.end()) + { + TESTFUNC tf; + + tf.name = name; + tf.ver = ver; + tf.test_api = test_api; + test_.push_back(tf); + } + else if (ver > it->ver) + { + it->test_api = test_api; + it->ver = ver; + } + } + void load_test_dll(const wchar_t* path_dll) + { + HMODULE mod = LoadLibraryW(path_dll); + int(__stdcall * init)(void*) = NULL; + int(__stdcall * get)(void*, size_t*) = NULL; + int(__stdcall * go)(const wchar_t*, const wchar_t*, ui_helper*) = NULL; + FARPROC* api = (FARPROC*)&init; + wchar_t* buf = NULL; + size_t len = 0; + json* root = NULL, * child = NULL; + + if (!mod) + return; + + *api = GetProcAddress(mod, "func_test_init"); + if (!api) + { + FreeLibrary(mod); + return; + } + init(NULL); + + api = (FARPROC*)&get; + *api = GetProcAddress(mod, "func_test_get_list"); + if(!api) + { + FreeLibrary(mod); + return; + } + + api = (FARPROC*)&go; + *api = GetProcAddress(mod, "func_test_go"); + if (!api) + { + FreeLibrary(mod); + return; + } + + if(get(buf, &len) != ERROR_INSUFFICIENT_BUFFER) + { + FreeLibrary(mod); + return; + } + + buf = new wchar_t[len + 8]; + memset(buf, 0, (len + 8) * 2); + if (get(buf, &len)) + { + delete[] buf; + FreeLibrary(mod); + return; + } + + // parse json ... + len = 0; + root = new json(); + if (root->attach(buf)) + { + for (int i = 1; 1; ++i) + { + swprintf_s(buf, 20, L"%d", i); + if (!root->get_value(buf, child) || !child) + break; + + std::wstring name(L""); + int ver = 0; + if (child->get_value(L"name", name) && child->get_value(L"ver", ver)) + { + add_api(name.c_str(), ver, go); + len++; + } + child->release(); + } + } + + root->release(); + delete[] buf; + if (len == 0) + FreeLibrary(mod); + } + void init(void) + { + wchar_t path[MAX_PATH] = { 0 }; + std::wstring dir(L""); + size_t pos = 0; + HANDLE hf = INVALID_HANDLE_VALUE; + WIN32_FIND_DATAW fd = { 0 }; + + GetModuleFileNameW(NULL, path, _countof(path) - 1); + dir = pos; + pos = dir.rfind(L'\\'); + if (pos++ == std::wstring::npos) + return; + + dir.erase(pos); + dir += L"dlls\\"; + hf = FindFirstFileW((dir + L"*.dll").c_str(), &fd); + if (hf != INVALID_HANDLE_VALUE) + { + do + { + load_test_dll((dir + fd.cFileName).c_str()); + } while (FindNextFileW(hf, &fd)); + + FindClose(hf); + } + } + +public: + test_factory() + { + init(); + } + ~test_factory() + { + + } + +public: + bool is_test_available(const wchar_t* name) // check if the test item with name 'name' is supported + { + std::vector::iterator it = std::find(test_.begin(), test_.end(), name); + + return it != test_.end(); + } + int test(const wchar_t* name, ui_helper* ui, const wchar_t* oper = L"start") + { + std::vector::iterator it = std::find(test_.begin(), test_.end(), name); + + if (it == test_.end()) + return ERROR_NOT_SUPPORTED; + + return it->test_api(name, oper, ui); + } +}; +/////////////////////////*//////////////////////////////////////////////////////////////////////// \ No newline at end of file