#include"test_base.h" #include #include #include #include #include #include "huagao/hgscanner_error.h" static 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; } static std::wstring set_test_name_ =L""; class test { ui_helper* helper_; int fw_; public: static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param) { if (!hdev && !param) { return -1; } ui_helper* h= (ui_helper*)param; std::wstring wstr = L""; size_t l = 0; bool type = true; int ret = str_to_wchar((char*)data, (wchar_t*)wstr.c_str(), &l); if (ret == ERROR_INSUFFICIENT_BUFFER) ret = str_to_wchar((char*)data, (wchar_t*)wstr.c_str(), &l); if (ret == ERROR_INSUFFICIENT_BUFFER) { type = false; h->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)wstr.c_str(), type); return -1; } switch (code) { case SANE_EVENT_SCAN_FINISHED: { SANE_Bool io_type = false; unsigned int io_len = sizeof(SANE_Bool); if (wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_SKEW_DETECTION) == 0) { type = strcmp((char*)data, STATU_DESC_SCANNER_ERR_DEVICE_PAPER_SKEW) == 0 ? true : false; } else if (wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_CIS_ORIGINAL_IMAGE) == 0) { h->io_control(IO_CTRL_CODE_SET_CIS_IMAGE, &io_type, &io_len); } else if (wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_DISTORTION) == 0) { int ret = h->io_control(IO_CTRL_CODE_GET_DPI_COLOR_CHECK_VAL, &io_type, &io_len); if (strcmp((char*)data, STATU_DESC_SCAN_STOPPED) == 0) { h->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_DISTORTION, (void*)L"畸变修正完成,是否进行单页扫描测试", type); return 0; } } h->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)wstr.c_str(), type); } break; case SANE_EVENT_ERROR: { h->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)wstr.c_str(), false); } break; case SANE_EVENT_IMAGE_OK: { if ( wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_CIS_ORIGINAL_IMAGE) == 0 ||wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_IMAGE_QUALITY) == 0 ||wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_DISTORTION) == 0) { h->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_HAVE_IMAGE, data, true); } } break; } return 0; } test(ui_helper* helper) :helper_(helper), fw_(0) { helper->register_sane_callback(sane_ex_callback, NULL); init_test_map_(); std::string fw1(get_firmware_version()); if (fw1.size() > 5) { if ("G1" == fw1.substr(0, 2)) fw_ = 1; else if ("G2" == fw1.substr(0, 2)) fw_ = 2; else if ("G3" == fw1.substr(0, 2)) fw_ = 3; else if ("G4" == fw1.substr(0, 2)) fw_ = 4; } } ~test() {} struct ptrcmp { bool operator()(const wchar_t* NAME1, const wchar_t* NAME2)const { return wcscmp(NAME1, NAME2) < 0; } }; std::map test_map_; void init_test_map_() { test_map_[HGPDTTOOLDB_NAME_DIAL_SWITCH] = &test::test_dial_switch; test_map_[HGPDTTOOLDB_NAME_ROCKER_SWITCH] = &test::test_pocker_switch; test_map_[HGPDTTOOLDB_NAME_BOOT_STATUS] = &test::test_boot_status; test_map_[HGPDTTOOLDB_NAME_LCD_DISPLAY] = &test::test_lcd_display; test_map_[HGPDTTOOLDB_NAME_CLEAR_PAPER_PATH] = &test::tset_clear_paper_path; test_map_[HGPDTTOOLDB_NAME_KEY_FUNCTION] = &test::test_key_funtion; test_map_[HGPDTTOOLDB_NAME_COUNTING_MODE] = &test::test_count_mode; test_map_[HGPDTTOOLDB_NAME_SKEW_DETECTION] = &test::test_skew_detection; test_map_[HGPDTTOOLDB_NAME_SEPARATER_MOTOR] = &test::test_separater_motor; test_map_[HGPDTTOOLDB_NAME_CIS_ORIGINAL_IMAGE] = &test::test_cis__original_image; test_map_[HGPDTTOOLDB_NAME_HOST_FAN] = &test::test_host_fan; test_map_[HGPDTTOOLDB_NAME_ULTRASONIC_MODULE] = &test::test_ultrasonic_module; test_map_[HGPDTTOOLDB_NAME_LED_LIGHT] = &test::test_led_light; test_map_[HGPDTTOOLDB_NAME_RESET] = &test::test_reset; test_map_[HGPDTTOOLDB_NAME_PAPER_FEED] = &test::test_paper_feed; test_map_[HGPDTTOOLDB_NAME_COVER_SENSOR] = &test::test_cover_sensor; test_map_[HGPDTTOOLDB_NAME_SCANNING_SENSOR] = &test::test_scanning_sensor; test_map_[HGPDTTOOLDB_NAME_CONFIGURE_SPEED_MODE] = &test::test_configure_speed_mode; test_map_[HGPDTTOOLDB_NAME_PLACE_CORRECTION_PAPER] = &test::test_place_correction_paper; test_map_[HGPDTTOOLDB_NAME_AUTO_FLAT_FIELD] = &test::test_auto_flat_field; test_map_[HGPDTTOOLDB_NAME_REBOOT_DEVICE] = &test::test_reboot_device; test_map_[HGPDTTOOLDB_NAME_IMAGE_QUALITY] = &test::test_image_quality; test_map_[HGPDTTOOLDB_NAME_COLORCARD_IMAGEING_QUALITY] = &test::test_colorcard_imageing_quality; test_map_[HGPDTTOOLDB_NAME_COLORCARD_BIAS_IMAGEING_QUALITY] = &test::test_colorcard_bias_imageing_quality; test_map_[HGPDTTOOLDB_NAME_CLARITY_QUALITY] = &test::test_clarity_quality; test_map_[HGPDTTOOLDB_NAME_DISTORTION] = &test::test_distortion; test_map_[HGPDTTOOLDB_NAME_DORMANCY] = &test::test_dormancy; test_map_[HGPDTTOOLDB_NAME_SKEW_GEAR] = &test::test_skew_gear; test_map_[HGPDTTOOLDB_NAME_PAPER_SEPARATION_STRENGTH] = &test::test_paper_separation_strength; test_map_[HGPDTTOOLDB_NAME_MECH_PAPER_FEEDING_INCLINATION] = &test::test_mech_paper_feeding_inclination; test_map_[HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_1] = &test::test_single_page_test_1; test_map_[HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_2] = &test::test_single_page_test_2; test_map_[HGPDTTOOLDB_NAME_SINGLE_PAGE_TEST_3] = &test::test_single_page_test_3; test_map_[HGPDTTOOLDB_NAME_PRESSUER_TEST] = &test::test_pressuer_test; test_map_[HGPDTTOOLDB_NAME_CLEAR_ROLLER_COUNT] = &test::test_clear_roller_count; } int set_test(const wchar_t* str) { if (!str) return SCANNER_ERR_NO_DATA; set_test_name_ = str; int ret = SCANNER_ERR_OK; auto it = test_map_.find(str); if (it != test_map_.end()) { ret = (this->*test_map_[str])((void *)str); } else { helper_->test_callback(str, ui_helper::TEST_EVENT_NOT_FIND_TEST, NULL, false); return ret; } if (ret != SCANNER_ERR_OK) { helper_->test_callback(str, ui_helper::TEST_EVENT_IO_FAIL, NULL, ret); } return ret; } public: /*获取固件版本号*/ std::string get_firmware_version() { std::string fw = ""; unsigned int len = 0; int ret = helper_->io_control(IO_CTRL_CODE_GET_HARDWARE_VERSION, &fw[0], &len); fw.resize(len); ret = helper_->io_control(IO_CTRL_CODE_GET_HARDWARE_VERSION, &fw[0], &len); return fw; } /* 拨码开关校验 */ int test_dial_switch(void *data) { return SCANNER_ERR_DEVICE_NOT_SUPPORT; } /* 检查船型开关功能 */ int test_pocker_switch(void *data) { return SCANNER_ERR_DEVICE_NOT_SUPPORT; } /* 设备上电并观察开机状态 */ int test_boot_status(void *data) { return SCANNER_ERR_DEVICE_NOT_SUPPORT; } /* 检查液晶显示 */ int test_lcd_display(void *data) { return SCANNER_ERR_DEVICE_NOT_SUPPORT; } /* 清理纸道功能确认 */ int tset_clear_paper_path(void *data) { int ret = helper_->io_control(IO_CTRL_CODE_GET_CLEAN_PAPER_ROAD, NULL, NULL); if (ret != SCANNER_ERR_OK) { return ret; } helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_MANUAL_CONFIRMATION, (void*)L"请确认是否清理纸道成功", true); return ret; } /* 按键功能检测 */ int test_key_funtion(void *data) { return SCANNER_ERR_DEVICE_NOT_SUPPORT; } /* 计数模式检测 */ int test_count_mode(void *data) { SANE_Bool ismode = false; unsigned int len = sizeof(SANE_Bool); int ret = helper_->io_control(IO_CTRL_CODE_GET_IS_MODE, &ismode, &len); if (ret != SCANNER_ERR_OK) { return ret; } helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_MANUAL_CONFIRMATION, (void*)L"请确认与液晶面板是否匹配", ismode); return ret; } /* 歪斜检测 */ int test_skew_detection(void *data) { const wchar_t* NAME = (wchar_t*)data; SANE_Bool type = true; unsigned int len = sizeof(SANE_Bool); int num = 0; void* get_data = NULL; parameter * ptr = helper_->get_user_input(ui_helper::DATA_FROM_USER, ui_helper::VAL_TYPE_INT, NAME,L"请歪斜放纸...设置阈值:1 - 5,值越小越容易检测"); if (ptr) { get_data = ptr->get_data(); if (!get_data) { helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_RESULT, (void*)L"已退出歪斜检测流程", false); return -1; } num = *((int*)get_data); } if (num == 0) num = 1; int ret = helper_->io_control(IO_CTRL_CODE_SET_SKEW_CHECK, &type, &len); if (ret != SCANNER_ERR_OK) { return ret; } ret = helper_->io_control(IO_CTRL_CODE_SET_SKEW_CHECK_VAL, &num, &len); if (ret != SCANNER_ERR_OK) { return ret; } ret = helper_->io_control(IO_CTRL_CODE_TEST_SINGLE, NULL, NULL); return ret; } /* 分纸电机检测 */ int test_separater_motor(void *data) { return SCANNER_ERR_OK; } /* cis原图初检 */ int test_cis__original_image(void *data) { const wchar_t* NAME = (wchar_t*)data; SANE_Bool type = true; unsigned int len = sizeof(SANE_Bool); int ret = SCANNER_ERR_OK; ret = helper_->io_control(IO_CTRL_CODE_SET_CIS_IMAGE, &type, &len); if (ret != SCANNER_ERR_OK) { return ret; } ret = helper_->io_control(IO_CTRL_CODE_TEST_SINGLE, NULL, NULL); if (ret != SCANNER_ERR_OK) { return ret; } return ret; } /* 主机风扇功能检测 */ int test_host_fan(void *data) { return SCANNER_ERR_OK; } /* 超声波模块检验 */ int test_ultrasonic_module(void *data) { const wchar_t* NAME = (wchar_t*)data; SANE_Bool type = true; unsigned int len = sizeof(SANE_Bool); void* get_data = NULL; int ret = SCANNER_ERR_OK; parameter* ptr = helper_->get_user_input(ui_helper::DATA_FROM_USER, ui_helper::VAL_TYPE_BOOL, NAME, L"请确认是否已放双张测试纸..."); if (ptr) { get_data = ptr->get_data(); if (!get_data || (*((bool*)get_data) == false)) { helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_RESULT, (void*)L"已退出超声波模块检测流程", false); return -1; } } ret = helper_->io_control(IO_CTRL_CODE_SET_ULTRASONIC_MODULE, &type, &len); if (ret != SCANNER_ERR_OK) { return ret; } ret = helper_->io_control(IO_CTRL_CODE_TEST_SINGLE, NULL, NULL); return ret; } /* led灯状态检查 */ int test_led_light(void *data) { return SCANNER_ERR_OK; } /* 复位检查 */ int test_reset(void *data) { return SCANNER_ERR_OK; } /* 走纸检查 */ int test_paper_feed(void *data) //使用单张扫描测试 { return helper_->io_control(IO_CTRL_CODE_TEST_SINGLE, NULL, NULL); } /* 开盖传感器检查 */ int test_cover_sensor(void *data) //int端点返回 使用单张扫描测试 { const wchar_t* NAME = (wchar_t*)data; SANE_Bool type = true; unsigned int len = sizeof(SANE_Bool); void* get_data = NULL; int ret = SCANNER_ERR_OK; parameter* ptr = helper_->get_user_input(ui_helper::DATA_FROM_USER, ui_helper::VAL_TYPE_BOOL, NAME, L"请确认是否已打开扫描仪盖..."); if (ptr) { get_data = ptr->get_data(); if (!get_data || (*((bool*)get_data) == false)) { helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_RESULT, (void*)L"已退出开盖传感器检测流程", false); return -1; } } return helper_->io_control(IO_CTRL_CODE_TEST_SINGLE, NULL, NULL); } /* 扫描传感器检查 */ int test_scanning_sensor(void *data) { return SCANNER_ERR_OK; } /* 配置速度模式 */ int test_configure_speed_mode(void *data) { const wchar_t* NAME = (wchar_t*)data; unsigned int len = sizeof(int); int speed_mode = 0; void* get_data = NULL; bool type = false; ui_helper::_INFOTIPS info_; const wchar_t *range=L""; const wchar_t G139[6] = { 70,80,90,110}; const wchar_t G239[6] = { 100,110,120,130}; const wchar_t G300[6] = { 40,50,60,70 }; const wchar_t G400[6] = { 40,50,60,70,80}; wchar_t info[128] = L"请设置速度模式,值越大速度越快."; info_.info = info; if (fw_ == 1)info_.desc = G139; else if(fw_ == 2)info_.desc = G239; else if(fw_ == 3)info_.desc = G300; else if(fw_ == 4)info_.desc = G400; parameter* ptr = helper_->get_user_input(ui_helper::DATA_FROM_USER, ui_helper::VAL_TYPE_TIPS_VAL,NAME, (wchar_t *) &info_); if (ptr) { get_data = ptr->get_data(); if (!get_data) { type = false; helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_RESULT, (void*)L"速度模式设置失败...", type); return -1; } speed_mode = *((int*)get_data); if (fw_ == 3 || fw_ == 4 && speed_mode >= 40 && speed_mode <= 80) //3288设置速度模式为1 2 3 4 5 { if (speed_mode == 40)speed_mode = 1; else if (speed_mode == 50)speed_mode = 2; else if (speed_mode == 60)speed_mode = 3; else if (speed_mode == 70)speed_mode = 4; else if (speed_mode == 80)speed_mode = 5; else speed_mode = 1; } } else { type = false; helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_RESULT, (void*)L"已退出--->设置速度模式...", type); return -1; } int ret = helper_->io_control(IO_CTRL_CODE_SET_SPEED_MODE, &speed_mode, &len); if (ret != SCANNER_ERR_OK) { return ret; } SANE_Int num = 0; unsigned int l = sizeof(SANE_Int); ret = helper_->io_control(IO_CTRL_CODE_GET_SPEED_MODE, &num, &l); int save_num = 0; wchar_t buf[128]; if (fw_ == 3 || fw_ == 4 && num > 0 && num < 6) { if (num == 1)save_num = 40; else if (num == 2)save_num = 50; else if (num == 3)save_num = 60; else if (num == 4)save_num = 70; else if (num == 5)save_num = 80; } else save_num = num; if (num != speed_mode) { type = false; wcscat(buf, L"设置速度模式失败...现在速度是:"); wcscat(buf, (wchar_t *)save_num); } else { type = true; wcscat(buf, L"设置速度模式成功...现在速度是:"); wcscat(buf, (wchar_t*)save_num); } helper_->test_callback((wchar_t*)data, ui_helper::TEST_EVENT_RESULT, (void*)buf, type); return SCANNER_ERR_OK; } /* 放置校正纸 */ int test_place_correction_paper(void *data) { return SCANNER_ERR_OK; } /* 自动平场校正 */ int test_auto_flat_field(void *data) { return SCANNER_ERR_OK; } /* 重启设备 */ int test_reboot_device(void *data) { return SCANNER_ERR_OK; } /* 扫描图像质量确认 */ int test_image_quality(void *data) { const wchar_t* NAME = (wchar_t*)data; SANE_Bool type = false; unsigned int len = sizeof(SANE_Bool); int ret = helper_->io_control(IO_CTRL_CODE_SET_SKEW_CHECK, &type, &len); if (ret != SCANNER_ERR_OK) { return ret; } ret = helper_->io_control(IO_CTRL_CODE_GET_IMAGE, NULL, NULL); return ret; } /* 色卡纸成像质量评估 */ int test_colorcard_imageing_quality(void *data) { return SCANNER_ERR_OK; } /* 色卡纸偏色成像质量评估 */ int test_colorcard_bias_imageing_quality(void *data) { return SCANNER_ERR_OK; } /* 清晰度质量评估 */ int test_clarity_quality(void *data) { return SCANNER_ERR_OK; } /* 畸变修正 */ int test_distortion(void *data) { const wchar_t* NAME = (wchar_t*)data; SANE_Bool type = true; unsigned int len = sizeof(SANE_Bool); return helper_->io_control(IO_CTRL_CODE_GET_DPI_COLOR_CHECK_VAL, &type, &len); } /* 设置休眠 */ int test_dormancy(void *data) { return SCANNER_ERR_OK; } /* 歪斜挡位检测 */ int test_skew_gear(void *data) { return SCANNER_ERR_OK; } /* 分纸强度检测 */ int test_paper_separation_strength(void *data) { return SCANNER_ERR_OK; } /* 机械走纸倾斜检测 */ int test_mech_paper_feeding_inclination(void *data) { return SCANNER_ERR_OK; } /* 单张测试1 */ int test_single_page_test_1(void *data) { return SCANNER_ERR_OK; } /* 单张测试2 */ int test_single_page_test_2(void *data) { return SCANNER_ERR_OK; } /* 单张测试3 */ int test_single_page_test_3(void *data) { return SCANNER_ERR_OK; } /* 压力测试2轮 */ int test_pressuer_test(void *data) { return SCANNER_ERR_OK; } /* 清除滚轴计数 */ int test_clear_roller_count(void *data) { return SCANNER_ERR_OK; } private: }; //test static std::string jsontext1("{\"1\":{\"NAME\":\"test-8\",\"ver\":1}}"); bool have_img_ = false; DECL_API(int) func_test_init(void* init) { return 0; } DECL_API(int) func_test_get_list(wchar_t* buf, size_t* len) { return str_to_wchar(jsontext1, buf, len); } DECL_API(int) func_test_go(const wchar_t* NAME, const wchar_t* oper, ui_helper* helper) { if (!NAME || !oper || !helper) { return -1; } //helper->add_ref(void *data); int ret = 0; SANE_Bool type = false; unsigned int len = sizeof(SANE_Bool); test ts(helper); ret = ts.set_test(NAME); if (ret != SCANNER_ERR_OK) { return ret; } ret = helper->io_control(IO_CTRL_CODE_RESTORE_SETTINGS, NULL, NULL);//结束恢复默认 return ret; } DECL_API(int) func_test_uninit(void* uninit) { return 0; }