#pragma once #include "string" #include "sane/sane_ex.h" #include "ui_helper.h" #include //////////////////////////////////////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"清理纸道功能确认" //1 /* 按键功能检测 */ #define HGPDTTOOLDB_TITLE_KEY_FUNCTION L"按键功能检测" /* 计数模式检测 */ #define HGPDTTOOLDB_TITLE_COUNTING_MODE L"计数模式检测"//1 /* 歪斜检测 */ #define HGPDTTOOLDB_TITLE_SKEW_DETECTION L"歪斜检测"//1 /* 分纸电机检测 */ #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" static struct Test_Map { const wchar_t* name; //test-1 const wchar_t* title; //"歪斜检测" const int ver; io_code num; }Test_Map_NO[] = { {HGPDTTOOLDB_NAME_DIAL_SWITCH ,HGPDTTOOLDB_TITLE_DIAL_SWITCH ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_ROCKER_SWITCH ,HGPDTTOOLDB_TITLE_ROCKER_SWITCH ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_BOOT_STATUS ,HGPDTTOOLDB_TITLE_BOOT_STATUS ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_LCD_DISPLAY ,HGPDTTOOLDB_TITLE_LCD_DISPLAY ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_KEY_FUNCTION ,HGPDTTOOLDB_TITLE_KEY_FUNCTION ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_COUNTING_MODE ,HGPDTTOOLDB_TITLE_COUNTING_MODE ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_CIS_ORIGINAL_IMAGE,HGPDTTOOLDB_TITLE_CIS_ORIGINAL_IMAGE ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_HOST_FAN ,HGPDTTOOLDB_TITLE_HOST_FAN ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_LED_LIGHT ,HGPDTTOOLDB_TITLE_LED_LIGHT ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_RESET ,HGPDTTOOLDB_TITLE_RESET ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_PAPER_FEED ,HGPDTTOOLDB_TITLE_PAPER_FEED ,0,IO_CTRL_CODE_BASE}, //不清楚 {HGPDTTOOLDB_NAME_SCANNING_SENSOR ,HGPDTTOOLDB_TITLE_SCANNING_SENSOR ,0,IO_CTRL_CODE_BASE},//不清楚 {HGPDTTOOLDB_NAME_PLACE_CORRECTION_PAPER,HGPDTTOOLDB_TITLE_PLACE_CORRECTION_PAPER ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_AUTO_FLAT_FIELD ,HGPDTTOOLDB_TITLE_AUTO_FLAT_FIELD ,0,IO_CTRL_CODE_BASE},//不清楚 {HGPDTTOOLDB_NAME_IMAGE_QUALITY ,HGPDTTOOLDB_TITLE_IMAGE_QUALITY ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_COLORCARD_IMAGEING_QUALITY ,HGPDTTOOLDB_TITLE_COLORCARD_IMAGEING_QUALITY ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_COLORCARD_BIAS_IMAGEING_QUALITY ,HGPDTTOOLDB_TITLE_COLORCARD_BIAS_IMAGEING_QUALITY ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_CLARITY_QUALITY ,HGPDTTOOLDB_TITLE_CLARITY_QUALITY ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_DISTORTION ,HGPDTTOOLDB_TITLE_DISTORTION ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_SEPARATER_MOTOR ,HGPDTTOOLDB_TITLE_SEPARATER_MOTOR ,0,IO_CTRL_CODE_BASE}, }, Test_Map_Bool[] { {HGPDTTOOLDB_NAME_CLEAR_PAPER_PATH ,HGPDTTOOLDB_TITLE_CLEAR_PAPER_PATH ,0,IO_CTRL_CODE_GET_CLEAN_PAPER_ROAD}, {HGPDTTOOLDB_NAME_SKEW_DETECTION ,HGPDTTOOLDB_TITLE_SKEW_DETECTION ,0,IO_CTRL_CODE_SET_SKEW_CHECK}, {HGPDTTOOLDB_NAME_ULTRASONIC_MODULE ,HGPDTTOOLDB_TITLE_ULTRASONIC_MODULE ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_COVER_SENSOR ,HGPDTTOOLDB_TITLE_COVER_SENSOR ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_REBOOT_DEVICE ,HGPDTTOOLDB_TITLE_REBOOT_DEVICE ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_MECH_PAPER_FEEDING_INCLINATION,HGPDTTOOLDB_TITLE_MECH_PAPER_FEEDING_INCLINATION ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_CLEAR_ROLLER_COUNT ,HGPDTTOOLDB_TITLE_CLEAR_ROLLER_COUNT,0,IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT}, {HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_1 ,HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_1,0,IO_CTRL_CODE_TEST_SINGLE}, }, Test_Map_String[] { {L"123" ,HGPDTTOOLDB_TITLE_CLEAR_ROLLER_COUNT,0,IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT}, }, Test_Map_Int[] { {HGPDTTOOLDB_NAME_PAPER_SEPARATION_STRENGTH ,HGPDTTOOLDB_TITLE_PAPER_SEPARATION_STRENGTH,0,IO_CTRL_CODE_SET_FEEDMODE}, {HGPDTTOOLDB_NAME_CONFIGURE_SPEED_MODE ,HGPDTTOOLDB_TITLE_CONFIGURE_SPEED_MODE ,0,IO_CTRL_CODE_BASE}, {HGPDTTOOLDB_NAME_DORMANCY ,HGPDTTOOLDB_TITLE_DORMANCY ,0,IO_CTRL_CODE_SET_POWER_LEVEL}, {HGPDTTOOLDB_NAME_SKEW_GEAR ,HGPDTTOOLDB_TITLE_SKEW_GEAR,0,IO_CTRL_CODE_SET_SKEW_CHECK_VAL}, {HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_2 ,HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_2,0,IO_CTRL_CODE_TEST_SINGLE}, {HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_3 ,HGPDTTOOLDB_TITLE_SINGLE_PAGE_TEST_3,0,IO_CTRL_CODE_TEST_SINGLE}, {HGPDTTOOLDB_NAME_PRESSUER_TEST ,HGPDTTOOLDB_TITLE_PRESSUER_TEST ,0,IO_CTRL_CODE_BASE}, }; #define TEST_DLL #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); } }; /////////////////////////*////////////////////////////////////////////////////////////////////////