diff --git a/app/HGProductionTool/dialog_userinput.cpp b/app/HGProductionTool/dialog_userinput.cpp index cd9a1ec..a106be2 100644 --- a/app/HGProductionTool/dialog_userinput.cpp +++ b/app/HGProductionTool/dialog_userinput.cpp @@ -78,7 +78,7 @@ parameter *Dialog_UserInput::getParam() void Dialog_UserInput::setDistortValue(double value) { - ui->lineEdit->setText(QString::number(value, 'f')); + ui->lineEdit->setText(QString::number(value, 'f', 4)); ui->lineEdit->selectAll(); } diff --git a/app/HGProductionTool/form_maininterface.cpp b/app/HGProductionTool/form_maininterface.cpp index 2f1f5ca..0884684 100644 --- a/app/HGProductionTool/form_maininterface.cpp +++ b/app/HGProductionTool/form_maininterface.cpp @@ -273,46 +273,49 @@ void Form_mainInterface::on_testResultImg(void *img) HGBase_DestroyImage(image); } -void Form_mainInterface::on_testDistortion(SANE_DISTORTION_VAL data) +void Form_mainInterface::on_testDistortion(float width, float height, float distortion, bool verify) { ui->label_imgInfo->setVisible(true); - ui->label_destortionInfo_200dpi->setVisible(true); - ui->label_destortionInfo_300dpi->setVisible(true); - ui->label_imgInfo->setText(tr("image pixel: ") + QString::number((data.w > 0 && data.w < 9999) ? data.w : 0.0, 'f') + - " * " + QString::number((data.h > 0 && data.h < 9999) ? data.h : 0.0, 'f')); - if (200 == m_curDpi) + ui->label_destortionInfo_200dpi->setVisible(!verify); + ui->label_destortionInfo_300dpi->setVisible(!verify); + + ui->label_imgInfo->setText(tr("image pixel: ") + QString::number((width > 0 && width < 9999) ? width : 0.0, 'f', 4) + + " * " + QString::number((height > 0 && height < 9999) ? height : 0.0, 'f', 4)); + + if (!verify) { - m_distortion_200dpi = data.scaleXY > 0 ? data.scaleXY : 0; - ui->label_destortionInfo_200dpi->setText(" 200dpi" + tr("destortion value: ") + QString::number(m_distortion_200dpi, 'f')); - - if (m_hg != nullptr) + if (200 == m_curDpi) { - m_hg->setDistortValue(m_distortion_200dpi); + m_distortion_200dpi = distortion > 0 ? distortion : 0; + ui->label_destortionInfo_200dpi->setText(" 200dpi" + tr("destortion value: ") + QString::number(m_distortion_200dpi, 'f', 4)); + + if (m_hg != nullptr) + { + m_hg->setDistortValue(m_distortion_200dpi); + } + } + else if (300 == m_curDpi) + { + m_distortion_300dpi = distortion > 0 ? distortion : 0; + ui->label_destortionInfo_300dpi->setText(" 300dpi" + tr("destortion value: ") + QString::number(m_distortion_300dpi, 'f', 4)); + + if (m_hg != nullptr) + { + m_hg->setDistortValue(m_distortion_300dpi); + } + } + else if (600 == m_curDpi) + { + m_distortion_600dpi = distortion > 0 ? distortion : 0; + ui->label_destortionInfo_600dpi->setText(" 600dpi" + tr("destortion value: ") + QString::number(m_distortion_600dpi, 'f', 4)); + + if (m_hg != nullptr) + { + m_hg->setDistortValue(m_distortion_600dpi); + } } } - else if (300 == m_curDpi) - { - m_distortion_300dpi = data.scaleXY > 0 ? data.scaleXY : 0; - ui->label_destortionInfo_300dpi->setText(" 300dpi" + tr("destortion value: ") + QString::number(m_distortion_300dpi, 'f')); - - if (m_hg != nullptr) - { - m_hg->setDistortValue(m_distortion_300dpi); - } - } - else if (600 == m_curDpi) - { - m_distortion_600dpi = data.scaleXY > 0 ? data.scaleXY : 0; - ui->label_destortionInfo_600dpi->setText(" 600dpi" + tr("destortion value: ") + QString::number(m_distortion_600dpi, 'f')); - - if (m_hg != nullptr) - { - m_hg->setDistortValue(m_distortion_600dpi); - } - } - -// updateImgPixelInfo(); updateUiEnabled(true); m_isTesting = false; @@ -404,9 +407,9 @@ void Form_mainInterface::on_testGetDevdistortion(float dis_200dpi, float dis_300 { QString info; info.append(tr("The device distortion:") + "\n\n\t"); - info.append(tr("200dpi: %1").arg(QString::number(dis_200dpi, 'f', 6)) + "\n\t"); - info.append(tr("300dpi: %1").arg(QString::number(dis_300dpi, 'f', 6)) + "\n\t"); - info.append(tr("600dpi: %1").arg(QString::number(dis_600dpi, 'f', 6))); + info.append(tr("200dpi: %1").arg(QString::number(dis_200dpi, 'f', 4)) + "\n\t"); + info.append(tr("300dpi: %1").arg(QString::number(dis_300dpi, 'f', 4)) + "\n\t"); + info.append(tr("600dpi: %1").arg(QString::number(dis_600dpi, 'f', 4))); m_textTips->setViewContent(info); } @@ -958,13 +961,20 @@ void Form_mainInterface::on_pbtn_start_clicked() { resetCorrectItems(); } + if (name == HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL && title.contains("200dpi")) + { + ui->label_imgInfo->clear(); + ui->label_destortionInfo_200dpi->clear(); + ui->label_destortionInfo_300dpi->clear(); + ui->label_destortionInfo_600dpi->clear(); + } int dpi = 0; - if (title == "扫描图像彩色质量确认_200dpi" || title == "扫描图像灰度质量确认_200dpi" || title == "计算畸变修正值_200dpi" || title == "设置畸变修正值_200dpi") + if (title.contains("200dpi")) // == "扫描图像彩色质量确认_200dpi" || title == "扫描图像灰度质量确认_200dpi" || title == "计算畸变修正值_200dpi" || title == "设置畸变修正值_200dpi") dpi = 200; - else if (title == "扫描图像彩色质量确认_300dpi" || title == "扫描图像灰度质量确认_300dpi" || title == "计算畸变修正值_300dpi" || title == "设置畸变修正值_300dpi") + else if (title.contains("300dpi"))// == "扫描图像彩色质量确认_300dpi" || title == "扫描图像灰度质量确认_300dpi" || title == "计算畸变修正值_300dpi" || title == "设置畸变修正值_300dpi") dpi = 300; - else if (title == "扫描图像彩色质量确认_600dpi" || title == "扫描图像灰度质量确认_600dpi" || title == "计算畸变修正值_600dpi" || title == "设置畸变修正值_600dpi") + else if (title.contains("600dpi")) // == "扫描图像彩色质量确认_600dpi" || title == "扫描图像灰度质量确认_600dpi" || title == "计算畸变修正值_600dpi" || title == "设置畸变修正值_600dpi") dpi = 600; wchar_t buf[128] = {0}; diff --git a/app/HGProductionTool/form_maininterface.h b/app/HGProductionTool/form_maininterface.h index 5ab91c9..5073409 100644 --- a/app/HGProductionTool/form_maininterface.h +++ b/app/HGProductionTool/form_maininterface.h @@ -40,7 +40,7 @@ protected: signals: void testResult(QString text); void testResultImg(void* img); - void testDistortion(SANE_DISTORTION_VAL data); + void testDistortion(float width, float height, float distortion, bool verify); void testCorrectInfo(QString info); void testGetDevCfgInfo(int vid, int pid, int sleepTime, int speedMode, QString devSn, QString devFw, QString devModel); void testGetDevCpuDisk(int cpu, int disk); @@ -50,7 +50,7 @@ signals: private slots: void on_testResult(QString text); void on_testResultImg(void* img); - void on_testDistortion(SANE_DISTORTION_VAL data); + void on_testDistortion(float width, float height, float distortion, bool verify); void on_testCorrectInfo(QString info); void on_testGetDevCfgInfo(int vid, int pid, int sleepTime, int speedMode, QString devSn, QString devFw, QString devModel); void on_testGetDevCpuDisk(int cpu, int disk); diff --git a/app/HGProductionTool/hgscanner.cpp b/app/HGProductionTool/hgscanner.cpp index de1c6fc..342b27e 100644 --- a/app/HGProductionTool/hgscanner.cpp +++ b/app/HGProductionTool/hgscanner.cpp @@ -191,7 +191,16 @@ void hgscanner::test_callback(const wchar_t* name, test_event ev, void* data, si { if (m_interface != nullptr) { - emit m_interface->testDistortion(*((SANE_DISTORTION_VAL*)data)); + SANE_DISTORTION_VAL *value = (SANE_DISTORTION_VAL*)data; + float width = value->w; + float height = value->h; + float distortion = value->scaleXY; + + bool verify = false; + if (wcscmp(name, HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL) == 0) + verify = true; + + emit m_interface->testDistortion(width, height, distortion, verify); } } } diff --git a/app/HGProductionTool/mainwindow.cpp b/app/HGProductionTool/mainwindow.cpp index b2cba36..d51fa24 100644 --- a/app/HGProductionTool/mainwindow.cpp +++ b/app/HGProductionTool/mainwindow.cpp @@ -543,6 +543,8 @@ void MainWindow::on_sane_create_interface(SaneParams *saneParams) } } + func_test_distortion(); + mainInterface->getScanner()->cb_(saneParams->hdev, saneParams->code, saneParams->data, &saneParams->len, mainInterface->getScanner()); } } diff --git a/code/base/test_base.cpp b/code/base/test_base.cpp index aa24b5b..2e48e4d 100644 --- a/code/base/test_base.cpp +++ b/code/base/test_base.cpp @@ -392,7 +392,9 @@ static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int wcscpy(buf, L"平场校正失败, 原因--->"); } } - else if (wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_GET_DISTORTION_VAL) == 0 || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_CONFIRM_DISTORTION_VAL) == 0) + else if (wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_GET_DISTORTION_VAL) == 0 || + wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_CONFIRM_DISTORTION_VAL) == 0 || + wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL) == 0) { if (strcmp((char*)data, STATU_DESC_SCAN_STOPPED) != 0 || strcmp((char*)data, STATU_DESC_SCANNER_ERR_DEVICE_DISTORTION) == 0) { @@ -400,6 +402,7 @@ static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int is_distortion_get_image = false; is_distortion_get_image_abnormal = true; wcscpy(buf, L"畸变修正值获取失败,原因--->"); + break; } else { @@ -560,6 +563,7 @@ static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_IMAGE_GRAY_QUALITY) == 0 || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_GET_DISTORTION_VAL) == 0 || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_CONFIRM_DISTORTION_VAL) == 0 + || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL) == 0 || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_SCANNING_SENSOR) == 0 || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_COLORCARD_IMAGEING_QUALITY) == 0 || wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_COLORCARD_BIAS_IMAGEING_QUALITY) == 0 @@ -605,6 +609,10 @@ test::~test() m_waitCorrect.notify_all(); if (thread_dynamic_correct_handle.get() && thread_dynamic_correct_handle->joinable()) thread_dynamic_correct_handle->join(); + + m_waitDistortion.notify_all(); + if (thread_distortion_handle.get() && thread_distortion_handle->joinable()) + thread_distortion_handle->join(); } void test::init_test_map_() @@ -636,6 +644,7 @@ void test::init_test_map_() test_map_[HGPDTTOOLDB_NAME_GET_DISTORTION_VAL] = &test::test_get_auto_distortion; test_map_[HGPDTTOOLDB_NAME_SET_DISTORTION_VAL] = &test::test_set_auto_distortion; test_map_[HGPDTTOOLDB_NAME_CONFIRM_DISTORTION_VAL] = &test::test_confirm_auto_distortion; + test_map_[HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL] = &test::test_verify_auto_distortion; test_map_[HGPDTTOOLDB_NAME_DORMANCY] = &test::test_dormancy; 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; @@ -752,6 +761,35 @@ void test::thread_dynamic_correct(std::string correctData) } } +void test::thread_distortion() +{ + std::unique_lock lock(m_lock); + + SANE_Bool type = true; + unsigned int len = sizeof(int); + + int ret = helper_->io_control(IO_CTRL_CODE_SET_DISTORTION_IMAGE, &type, &len); + if (ret != SCANNER_ERR_OK) + { + helper_->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)L"自动计算畸变值获取失败", false); + } + + int cnt = 0; + SANE_DISTORTION_VAL dis = { 0 }; + + m_waitDistortion.wait(lock); + ret = helper_->io_control(IO_CTRL_CODE_GET_PC_DISTORTION_CHECK_VAL, &dis, &len); + + if (dis.h > 0 && dis.scaleXY < 10) + { + helper_->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_DISTORTION_VAL, (void*)&dis, true); + } + else + { + helper_->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)L"自动计算畸变值获取失败", false); + } +} + int test::set_init_cfg(void* data) { const wchar_t* p = (const wchar_t*)data; @@ -1188,38 +1226,11 @@ int test::test_get_auto_distortion(void* data) ret = helper_->io_control(IO_CTRL_CODE_SET_DISTORTION_DEVS_CHECK_VAL, &distortion, &len); - ret = helper_->io_control(IO_CTRL_CODE_SET_DISTORTION_IMAGE, &type, &len); - if (ret != SCANNER_ERR_OK) - { - return ret; - } - int cnt = 0; - SANE_DISTORTION_VAL dis = { 0 }; - while (ret == SCANNER_ERR_OK) - { - if (is_distortion_get_image) - { - ret = helper_->io_control(IO_CTRL_CODE_GET_PC_DISTORTION_CHECK_VAL, &dis, &llen); - break; - } - else if (cnt == 20) - break; + if (thread_distortion_handle.get() && thread_distortion_handle->joinable()) + thread_distortion_handle->join(); + thread_distortion_handle.reset(new std::thread(&test::thread_distortion, this)); - if (is_distortion_get_image_abnormal) - break; - - Sleep(1000); - cnt++; - } - if (dis.h > 0 && dis.scaleXY < 10) - { - helper_->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_DISTORTION_VAL, (void*)&dis, true); - } - else - { - helper_->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)L"自动计算畸变值获取失败", false); - } - return ret; + return SCANNER_ERR_OK; } int test::test_set_auto_distortion(void* data) { @@ -1326,6 +1337,52 @@ int test::test_confirm_auto_distortion(void* data) } return ret; } +/* 扫描验证畸变值 */ +int test::test_verify_auto_distortion(void* data) +{ + if (!data) + { + return SCANNER_ERR_DATA_DAMAGED; + } + wchar_t* p = (wchar_t*)data; + std::string str; + + int ret = SCANNER_ERR_OK, + dpi = 0; + SANE_Bool type = true; + unsigned int len = sizeof(SANE_Bool), + llen = sizeof(int); + size_t strl = 0; + ret = wchar_to_char(str, p, &strl); + if (ret == ERROR_INSUFFICIENT_BUFFER) + { + str.resize(strl); + ret = wchar_to_char(str, p, &strl); + if (str.empty()) + { + return SCANNER_ERR_DATA_DAMAGED; + } + dpi = atoi(str.c_str()); + } + + ret = helper_->io_control(IO_CTRL_CODE_GET_PAPER_ON, &type, &llen); + if (!type) + { + helper_->test_callback(set_test_name_.c_str(), ui_helper::TEST_EVENT_RESULT, (void*)L"自动计算畸变值获取失败: 无纸", false); + return ret; + } + + if (dpi > 0) + { + ret = helper_->io_control(IO_CTRL_CODE_SET_DPI, &dpi, &llen); + } + + if (thread_distortion_handle.get() && thread_distortion_handle->joinable()) + thread_distortion_handle->join(); + thread_distortion_handle.reset(new std::thread(&test::thread_distortion, this)); + + return SCANNER_ERR_OK; +} /* 分纸强度检测 */ int test::test_paper_separation_strength(void* data) { @@ -1900,3 +1957,14 @@ DECL_API(int) func_test_correct(bool isSuccess, int *currentIndex) test_->m_waitCorrect.notify_all(); return 0; } + +DECL_API(int) func_test_distortion() +{ + if (wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_GET_DISTORTION_VAL) == 0 || + wcscmp(set_test_name_.c_str(), HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL) == 0) + { + test_->m_waitDistortion.notify_all(); + } + + return 0; +} diff --git a/code/base/test_base.h b/code/base/test_base.h index 23b2bb4..9dd4410 100644 --- a/code/base/test_base.h +++ b/code/base/test_base.h @@ -186,6 +186,8 @@ #define HGPDTTOOLDB_NAME_SET_DISTORTION_VAL L"SET_DISTORTION_VAL" /* 确认畸变修正值 */ #define HGPDTTOOLDB_NAME_CONFIRM_DISTORTION_VAL L"CONFIRM_DISTORTION_VAL" +/* 扫描验证畸变修正值 */ +#define HGPDTTOOLDB_NAME_VERIFY_DISTORTION_VAL L"VERIFY_DISTORTION_VAL" /* 设置休眠 */ #define HGPDTTOOLDB_NAME_DORMANCY L"DORMANCY" /* 歪斜挡位检测 */ @@ -287,6 +289,7 @@ DECL_API(int) func_test_uninit(void*); // Return: error code DECL_API(int) func_test_correct(bool isSuccess, int* currentIndex); +DECL_API(int) func_test_distortion(); class test { @@ -296,6 +299,7 @@ public: std::map test_map_; std::condition_variable m_waitCorrect; + std::condition_variable m_waitDistortion; std::mutex m_lock; ui_helper* helper_; int fw_; @@ -310,6 +314,9 @@ private: std::unique_ptr thread_dynamic_correct_handle; void thread_dynamic_correct(std::string correctData); + std::unique_ptr thread_distortion_handle; + void thread_distortion(); + struct CorrectMode { int dpi; @@ -385,6 +392,7 @@ private: int test_get_auto_distortion(void* data); int test_set_auto_distortion(void* data); int test_confirm_auto_distortion(void* data); + int test_verify_auto_distortion(void* data); /* 分纸强度检测 */ int test_paper_separation_strength(void* data); /* 机械走纸倾斜检测 */