diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index 04042f2..58c3910 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -1041,6 +1041,9 @@ void hg_scanner::working_done(void*) case SCANNER_ERR_DEVICE_ISLOCK: notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_ISLOCK, SANE_EVENT_SCAN_FINISHED, status_); break; + case SCANNER_ERR_DEVICE_AUTO_FAIL_OVER: + notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_AUTO_FAIL_OVER, SANE_EVENT_SCAN_FINISHED, status_); + break; default: notify_ui_working_status(user_cancel_ ? STATU_DESC_SCAN_CANCELED : STATU_DESC_SCAN_STOPPED, SANE_EVENT_SCAN_FINISHED, status_); break; @@ -3386,6 +3389,7 @@ int hg_scanner::device_io_control(unsigned long code, void* data, unsigned* len) } else if (code == IO_CTRL_CODE_SET_AUTO_FALT) { + return set_auto_flat(); } return SCANNER_ERR_DEVICE_NOT_SUPPORT; diff --git a/hgdriver/hgdev/hg_scanner.h b/hgdriver/hgdev/hg_scanner.h index 4a11b60..d056bc0 100644 --- a/hgdriver/hgdev/hg_scanner.h +++ b/hgdriver/hgdev/hg_scanner.h @@ -476,7 +476,7 @@ public: virtual int get_speed_mode(int &data) = 0; //获取速度模式 /*/ 设备不同值不同,详情见子类注释 virtual int set_dpi_color_check(bool type); //获取畸变矫正 virtual int set_dpi_color_check_val(void) = 0; //设置畸变矫正值 - virtual int set_auto_flat(void) ; //设置自动平场校正 + virtual int set_auto_flat(void) = 0; //设置自动平场校正 }; #ifdef UOS diff --git a/hgdriver/hgdev/hg_scanner_200.cpp b/hgdriver/hgdev/hg_scanner_200.cpp index cb1634a..670b3ac 100644 --- a/hgdriver/hgdev/hg_scanner_200.cpp +++ b/hgdriver/hgdev/hg_scanner_200.cpp @@ -63,6 +63,12 @@ namespace settingsdsp_200 case setting3288dsp::SIZE_ERROR: code = SCANNER_ERR_DEVICE_SIZE_CHECK; break; + case setting3288dsp::AUTO_FLAT_FINISHED: + code = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; + break; + case setting3288dsp::AUTO_FLATTING: + code = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; + break; default: if (fatal) *fatal = false; @@ -140,6 +146,42 @@ void hg_scanner_200::thread_handle_usb_read(void) USBCB usb = {0}; ret = get_scanner_status(usb); + if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) + { + status_ = ret; + std::string msg; + int count = usb.u32_Count; + msg.resize(count); + + ret = io_->read_bulk(&msg[0], &count); + if (ret == SCANNER_ERR_OK) + notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); + else + status_ = ret; + + break; + } + else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) + { + sw.reset(); + status_ = ret; + + std::string msg; + int count = usb.u32_Count; + msg.resize(count); + ret = io_->read_bulk(&msg[0], &count); + if (ret == SCANNER_ERR_OK) + { + char buf[1024]; + strcpy(buf, msg.c_str()); + notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); + } + else + { + status_ = ret; + break; + } + } if (ret == SCANNER_ERR_DEVICE_NOT_FOUND) { // device left, the work is no meanning ... @@ -165,7 +207,7 @@ void hg_scanner_200::thread_handle_usb_read(void) status_ = prev_err; break; } - else if(ret != SCANNER_ERR_OK) + else if(ret != SCANNER_ERR_OK && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) { if (prev_err == SCANNER_ERR_OK) { @@ -850,6 +892,25 @@ int hg_scanner_200::set_dpi_color_check_val(void) return SCANNER_ERR_DEVICE_NOT_SUPPORT; } +int hg_scanner_200::set_auto_flat(void) +{ + USBCB usbcb = { setting3288dsp::START_FLAT,0,0 }; + int len = sizeof(usbcb); + int ret = writeusb(usbcb); + + if (ret == SCANNER_ERR_OK) + { + //status_ = SCANNER_ERR_DEVICE_BUSY; + wait_usb_.notify(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + ret = try_third_app_after_start(ret); + } + else + status_ = ret; + VLOG_MINI_1(LOG_LEVEL_WARNING, "set_auto_flat ret: %s\n", hg_scanner_err_name(ret)); + return ret; +} + int hg_scanner_200::set_notify_sleep() { return SCANNER_ERR_DEVICE_NOT_SUPPORT; diff --git a/hgdriver/hgdev/hg_scanner_200.h b/hgdriver/hgdev/hg_scanner_200.h index 431f2eb..6e74753 100644 --- a/hgdriver/hgdev/hg_scanner_200.h +++ b/hgdriver/hgdev/hg_scanner_200.h @@ -98,4 +98,5 @@ public: virtual int set_speed_mode(int data) override; //设置速度模式 /*/ 不支持 virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ 不支持 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 + virtual int set_auto_flat(void); //设置自动平场校正 }; diff --git a/hgdriver/hgdev/hg_scanner_239.cpp b/hgdriver/hgdev/hg_scanner_239.cpp index 858844e..fcc260e 100644 --- a/hgdriver/hgdev/hg_scanner_239.cpp +++ b/hgdriver/hgdev/hg_scanner_239.cpp @@ -77,6 +77,14 @@ namespace settings } else if (ds->From == setting3399::HGType::STOPSCAN) code = SCANNER_ERR_DEVICE_STOPPED; + else if (ds->From == setting3399::HGType::AutoCorrect) + { + if (ds->Code == 4) + code = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; + else + code = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; + } + return code; } @@ -282,6 +290,34 @@ int hg_scanner_239::get_dpi_color_check_val(int &data) int ret = read_register(ratio, &data); return ret; } +int hg_scanner_239::set_auto_flat(void) +{ + int color = 0, + ret = SCANNER_ERR_OK; + auto fw = get_firmware_version(); + if ((fw[5] == 'A' && atoi(fw.substr(6, 4).c_str()) <= 9999)) + { + color = 0 == 1 ? 1 : 0; //暂时没有用。 + } + if (!wait_usb_.is_waiting()) + { + return SCANNER_ERR_DEVICE_BUSY; + } + else + { + ret = write_register(setting3399::SC_AUTOCORRECT, color); + if (ret != SCANNER_ERR_OK) + { + return ret; + } + //status_ = SCANNER_ERR_DEVICE_BUSY; + wait_usb_.notify(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + ret = try_third_app_after_start(ret); + } + VLOG_MINI_1(LOG_LEVEL_WARNING, "set_auto_flat ret: %s\n", hg_scanner_err_name(ret)); + return ret; +} int hg_scanner_239::get_status(void) { int val = 0, @@ -889,7 +925,7 @@ int hg_scanner_239::on_scanner_closing(bool force) } void hg_scanner_239::thread_handle_usb_read(void) { - char buf[64]; + char buf[1024]; setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; int size = sizeof(buf), ret = SCANNER_ERR_OK, @@ -951,7 +987,12 @@ void hg_scanner_239::thread_handle_usb_read(void) status_ = settings::device_status_to_hg_err(info); VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "status from interrupt point is '%s'\n", hg_scanner_err_name(status_)); - if (status_ != SCANNER_ERR_OK && status_ != SCANNER_ERR_TIMEOUT && status_ != SCANNER_ERR_DEVICE_STOPPED) + if (status_ != SCANNER_ERR_OK + && status_ != SCANNER_ERR_TIMEOUT + && status_ != SCANNER_ERR_DEVICE_STOPPED + && status_ != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER + && status_ != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO + ) { if (!is_dev_image_process_done() || (double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG)) { @@ -960,8 +1001,7 @@ void hg_scanner_239::thread_handle_usb_read(void) std::this_thread::sleep_for(std::chrono::milliseconds(30)); StopWatch delay; - if((double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG) && - st == SCANNER_ERR_DEVICE_DOUBLE_FEEDING) + if((double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG) && st == SCANNER_ERR_DEVICE_DOUBLE_FEEDING) { int wait = 3000 + (img_conf_.resolution_dst / 200 * 10000); while (get_image_count() == 0) @@ -1079,6 +1119,19 @@ void hg_scanner_239::thread_handle_usb_read(void) // stop(); break; } + else if (info->From == setting3399::AutoCorrect) + { + std::string devs_info; + int len = info->Img_Index; + devs_info.resize(len); + ret = io_->read_bulk(&info[0], &len); + if (ret == SCANNER_ERR_OK) + { + notify_ui_working_status(devs_info.c_str(), SANE_EVENT_STATUS, status_); + } + if (status_ == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) + break; + } else { // error handling ... diff --git a/hgdriver/hgdev/hg_scanner_239.h b/hgdriver/hgdev/hg_scanner_239.h index 1870b32..9abfd59 100644 --- a/hgdriver/hgdev/hg_scanner_239.h +++ b/hgdriver/hgdev/hg_scanner_239.h @@ -116,5 +116,6 @@ public: virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:100,110,120 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正值 virtual int get_dpi_color_check_val(int &data); //获取畸变矫正 + virtual int set_auto_flat(void); //设置自动平场校正 }; diff --git a/hgdriver/hgdev/hg_scanner_300.cpp b/hgdriver/hgdev/hg_scanner_300.cpp index 4e52291..97deb26 100644 --- a/hgdriver/hgdev/hg_scanner_300.cpp +++ b/hgdriver/hgdev/hg_scanner_300.cpp @@ -122,44 +122,58 @@ void hg_scanner_300::thread_handle_usb_read(void) statu = last_usb_image_statu(ret); savestatus_.push_back(ret); } - //else if (ret != SCANNER_ERR_NO_DATA) - //{ - // statu = SANE_Image_Statu_OK; - //} + else if (ret != SCANNER_ERR_NO_DATA && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) + { + statu = SANE_Image_Statu_OK; + } else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) { + status_ = ret; std::string msg; - msg.resize(usb.u32_Count); int count = usb.u32_Count; - io_->read_bulk(&msg[0], &count); - status_ = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; - //notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); + msg.resize(count); + + ret = io_->read_bulk(&msg[0], &count); + if (ret == SCANNER_ERR_OK) + notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); + else + status_ = ret; + break; } else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) { + sw.reset(); + status_ = ret; + std::string msg; - msg.resize(usb.u32_Count); int count = usb.u32_Count; - io_->read_bulk(&msg[0], &count); - status_ = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; - char buf[1024]; - strcpy(buf, msg.c_str()); - notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); + msg.resize(count); + ret = io_->read_bulk(&msg[0], &count); + if (ret == SCANNER_ERR_OK) + { + char buf[1024]; + strcpy(buf, msg.c_str()); + notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); + } + else + { + status_ = ret; + break; + } } - if (ret == SCANNER_ERR_NO_DATA && savestatus_.empty() && sw.elapsed_ms() > 5000) + if (sw.elapsed_ms() > 20000)//防止状态信息一直取不上来导致卡死 { + //3288固件 获取有纸无纸问题的bug,如果是打开盖子在start之前【主动】获取的话,会先报无纸,而不是开盖。 + //但是在【端点】又获取不到有纸还是无纸的状态,所以只能通过等待超时,再来【主动】获取有无纸张。 SANE_Bool is_paperon = false; - get_scanner_paperon(is_paperon); - if (!is_paperon && !user_cancel_) + ret = get_scanner_paperon(is_paperon); + if (!is_paperon && !user_cancel_ && ret == SCANNER_ERR_OK) { status_ = SCANNER_ERR_DEVICE_NO_PAPER; break; } - } - if (sw.elapsed_ms() > 20000)//防止状态信息一直取不上来导致卡死 - { status_ = !savestatus_.empty() ? savestatus_[0] : SCANNER_ERR_TIMEOUT;//以第一个消息为准 savestatus_.clear(); hg_log::log(LOG_LEVEL_WARNING, "get status timeout,get image out\n"); @@ -842,7 +856,7 @@ int hg_scanner_300::set_auto_flat(void) int len = sizeof(usbcb); int ret = writeusb(usbcb); - if (ret == SCANNER_ERR_OK) + if (ret == SCANNER_ERR_OK && wait_usb_.is_waiting()) { //status_ = SCANNER_ERR_DEVICE_BUSY; wait_usb_.notify(); diff --git a/hgdriver/hgdev/hg_scanner_302.cpp b/hgdriver/hgdev/hg_scanner_302.cpp index cf75a9f..ec25cfd 100644 --- a/hgdriver/hgdev/hg_scanner_302.cpp +++ b/hgdriver/hgdev/hg_scanner_302.cpp @@ -1276,6 +1276,10 @@ int hg_scanner_302::set_dpi_color_check_val(void) return write_register(retio, *(int*)&save_dpi_color_check_val); } +int hg_scanner_302::set_auto_flat(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} int hg_scanner_302::set_notify_sleep() { int val = 0, diff --git a/hgdriver/hgdev/hg_scanner_302.h b/hgdriver/hgdev/hg_scanner_302.h index 0c31297..9a590fd 100644 --- a/hgdriver/hgdev/hg_scanner_302.h +++ b/hgdriver/hgdev/hg_scanner_302.h @@ -121,4 +121,5 @@ public: virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,70 virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:40,50,60,70 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 + virtual int set_auto_flat(void) override; //设置自动平场校正 }; diff --git a/hgdriver/hgdev/hg_scanner_400.cpp b/hgdriver/hgdev/hg_scanner_400.cpp index ba9a368..2b42037 100644 --- a/hgdriver/hgdev/hg_scanner_400.cpp +++ b/hgdriver/hgdev/hg_scanner_400.cpp @@ -58,6 +58,12 @@ namespace settingsdsp_400 case setting3288dsp::SIZE_ERROR: code = SCANNER_ERR_DEVICE_SIZE_CHECK; break; + case setting3288dsp::AUTO_FLAT_FINISHED: + code = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER; + break; + case setting3288dsp::AUTO_FLATTING: + code = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; + break; default: code = SCANNER_ERR_NO_DATA; break; @@ -118,18 +124,50 @@ void hg_scanner_400::thread_handle_usb_read(void) statu = last_usb_image_statu(ret); savestatus_.push_back(ret); } - else - statu = SANE_Image_Statu_OK; - if (sw.elapsed_s() > 30)//防止状态信息一直取不上来导致卡死 + else if (ret != SCANNER_ERR_NO_DATA && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_OVER && ret != SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) { - if (!savestatus_.empty()) + statu = SANE_Image_Statu_OK; + } + else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) + { + status_ = ret; + std::string msg; + int count = usb.u32_Count; + msg.resize(count); + + ret = io_->read_bulk(&msg[0], &count); + if (ret == SCANNER_ERR_OK) + notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); + else + status_ = ret; + + break; + } + else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) + { + sw.reset(); + status_ = ret; + + std::string msg; + int count = usb.u32_Count; + msg.resize(count); + ret = io_->read_bulk(&msg[0], &count); + if (ret == SCANNER_ERR_OK) { - status_ = savestatus_[0]; + char buf[1024]; + strcpy(buf, msg.c_str()); + notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); } else { - status_ = SCANNER_ERR_TIMEOUT; + status_ = ret; + break; } + } + + if (sw.elapsed_s() > 30)//防止状态信息一直取不上来导致卡死 + { + status_ = !savestatus_.empty() ? savestatus_[0] : SCANNER_ERR_TIMEOUT; savestatus_.clear(); hg_log::log(LOG_LEVEL_WARNING, "get status timeout,get image out\n"); break; @@ -817,6 +855,26 @@ int hg_scanner_400::set_dpi_color_check_val(void) //int ratio = cmd.u32_Data; return ret; } + +int hg_scanner_400::set_auto_flat(void) +{ + USBCB usbcb = { setting3288dsp::START_FLAT,0,0 }; + int len = sizeof(usbcb); + int ret = writeusb(usbcb); + + if (ret == SCANNER_ERR_OK && wait_usb_.is_waiting()) + { + //status_ = SCANNER_ERR_DEVICE_BUSY; + wait_usb_.notify(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + ret = try_third_app_after_start(ret); + } + else + status_ = ret; + VLOG_MINI_1(LOG_LEVEL_WARNING, "set_auto_flat ret: %s\n", hg_scanner_err_name(ret)); + return ret; +} + int hg_scanner_400::set_notify_sleep() { return SCANNER_ERR_DEVICE_NOT_SUPPORT; diff --git a/hgdriver/hgdev/hg_scanner_400.h b/hgdriver/hgdev/hg_scanner_400.h index 05bc318..30faa36 100644 --- a/hgdriver/hgdev/hg_scanner_400.h +++ b/hgdriver/hgdev/hg_scanner_400.h @@ -103,4 +103,5 @@ public: virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,70,80 virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ data:40,50,60,70,80 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 + virtual int set_auto_flat(void); //设置自动平场校正 }; diff --git a/hgdriver/hgdev/hg_scanner_402.cpp b/hgdriver/hgdev/hg_scanner_402.cpp index 5f55cb5..60dbef3 100644 --- a/hgdriver/hgdev/hg_scanner_402.cpp +++ b/hgdriver/hgdev/hg_scanner_402.cpp @@ -1236,6 +1236,10 @@ int hg_scanner_402::set_dpi_color_check_val(void) return write_register(retio, *(int*)&save_dpi_color_check_val); } +int hg_scanner_402::set_auto_flat(void) +{ + return SCANNER_ERR_DEVICE_NOT_SUPPORT; +} int hg_scanner_402::set_notify_sleep() { int val = 0, diff --git a/hgdriver/hgdev/hg_scanner_402.h b/hgdriver/hgdev/hg_scanner_402.h index 549a5b1..ff37a29 100644 --- a/hgdriver/hgdev/hg_scanner_402.h +++ b/hgdriver/hgdev/hg_scanner_402.h @@ -121,4 +121,5 @@ public: virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,70,80 virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ data:40,50,60,70,80 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 + virtual int set_auto_flat(void) override; //设置自动平场校正 };