调整校正流程

This commit is contained in:
13038267101 2022-12-30 17:14:49 +08:00
parent 8b2045592f
commit 14c3b8494a
13 changed files with 236 additions and 33 deletions

View File

@ -1041,6 +1041,9 @@ void hg_scanner::working_done(void*)
case SCANNER_ERR_DEVICE_ISLOCK: case SCANNER_ERR_DEVICE_ISLOCK:
notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_ISLOCK, SANE_EVENT_SCAN_FINISHED, status_); notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_ISLOCK, SANE_EVENT_SCAN_FINISHED, status_);
break; 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: default:
notify_ui_working_status(user_cancel_ ? STATU_DESC_SCAN_CANCELED : STATU_DESC_SCAN_STOPPED, SANE_EVENT_SCAN_FINISHED, status_); notify_ui_working_status(user_cancel_ ? STATU_DESC_SCAN_CANCELED : STATU_DESC_SCAN_STOPPED, SANE_EVENT_SCAN_FINISHED, status_);
break; 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) else if (code == IO_CTRL_CODE_SET_AUTO_FALT)
{ {
return set_auto_flat(); return set_auto_flat();
} }
return SCANNER_ERR_DEVICE_NOT_SUPPORT; return SCANNER_ERR_DEVICE_NOT_SUPPORT;

View File

@ -476,7 +476,7 @@ public:
virtual int get_speed_mode(int &data) = 0; //获取速度模式 /*/ 设备不同值不同,详情见子类注释 virtual int get_speed_mode(int &data) = 0; //获取速度模式 /*/ 设备不同值不同,详情见子类注释
virtual int set_dpi_color_check(bool type); //获取畸变矫正 virtual int set_dpi_color_check(bool type); //获取畸变矫正
virtual int set_dpi_color_check_val(void) = 0; //设置畸变矫正值 virtual int set_dpi_color_check_val(void) = 0; //设置畸变矫正值
virtual int set_auto_flat(void) ; //设置自动平场校正 virtual int set_auto_flat(void) = 0; //设置自动平场校正
}; };
#ifdef UOS #ifdef UOS

View File

@ -63,6 +63,12 @@ namespace settingsdsp_200
case setting3288dsp::SIZE_ERROR: case setting3288dsp::SIZE_ERROR:
code = SCANNER_ERR_DEVICE_SIZE_CHECK; code = SCANNER_ERR_DEVICE_SIZE_CHECK;
break; 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: default:
if (fatal) if (fatal)
*fatal = false; *fatal = false;
@ -140,6 +146,42 @@ void hg_scanner_200::thread_handle_usb_read(void)
USBCB usb = {0}; USBCB usb = {0};
ret = get_scanner_status(usb); 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) if (ret == SCANNER_ERR_DEVICE_NOT_FOUND)
{ {
// device left, the work is no meanning ... // device left, the work is no meanning ...
@ -165,7 +207,7 @@ void hg_scanner_200::thread_handle_usb_read(void)
status_ = prev_err; status_ = prev_err;
break; 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) 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; 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() int hg_scanner_200::set_notify_sleep()
{ {
return SCANNER_ERR_DEVICE_NOT_SUPPORT; return SCANNER_ERR_DEVICE_NOT_SUPPORT;

View File

@ -98,4 +98,5 @@ public:
virtual int set_speed_mode(int data) override; //设置速度模式 /*/ 不支持 virtual int set_speed_mode(int data) override; //设置速度模式 /*/ 不支持
virtual int get_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_dpi_color_check_val(void) override; //设置畸变矫正
virtual int set_auto_flat(void); //设置自动平场校正
}; };

View File

@ -77,6 +77,14 @@ namespace settings
} }
else if (ds->From == setting3399::HGType::STOPSCAN) else if (ds->From == setting3399::HGType::STOPSCAN)
code = SCANNER_ERR_DEVICE_STOPPED; 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; return code;
} }
@ -282,6 +290,34 @@ int hg_scanner_239::get_dpi_color_check_val(int &data)
int ret = read_register(ratio, &data); int ret = read_register(ratio, &data);
return ret; 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 hg_scanner_239::get_status(void)
{ {
int val = 0, 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) void hg_scanner_239::thread_handle_usb_read(void)
{ {
char buf[64]; char buf[1024];
setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf; setting3399::HGEIntInfo* info = (setting3399::HGEIntInfo*)buf;
int size = sizeof(buf), int size = sizeof(buf),
ret = SCANNER_ERR_OK, 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); 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_)); 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)) 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)); std::this_thread::sleep_for(std::chrono::milliseconds(30));
StopWatch delay; StopWatch delay;
if((double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG) && if((double_paper_handle_ & DOUBLE_PAPER_SAVE_IMG) && st == SCANNER_ERR_DEVICE_DOUBLE_FEEDING)
st == SCANNER_ERR_DEVICE_DOUBLE_FEEDING)
{ {
int wait = 3000 + (img_conf_.resolution_dst / 200 * 10000); int wait = 3000 + (img_conf_.resolution_dst / 200 * 10000);
while (get_image_count() == 0) while (get_image_count() == 0)
@ -1079,6 +1119,19 @@ void hg_scanner_239::thread_handle_usb_read(void)
// stop(); // stop();
break; 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 else
{ {
// error handling ... // error handling ...

View File

@ -116,5 +116,6 @@ public:
virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:100,110,120 virtual int get_speed_mode(int& data)override; //获取速度模式 /*/ data:100,110,120
virtual int set_dpi_color_check_val(void) override; //设置畸变矫正值 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正值
virtual int get_dpi_color_check_val(int &data); //获取畸变矫正 virtual int get_dpi_color_check_val(int &data); //获取畸变矫正
virtual int set_auto_flat(void); //设置自动平场校正
}; };

View File

@ -122,44 +122,58 @@ void hg_scanner_300::thread_handle_usb_read(void)
statu = last_usb_image_statu(ret); statu = last_usb_image_statu(ret);
savestatus_.push_back(ret); savestatus_.push_back(ret);
} }
//else if (ret != SCANNER_ERR_NO_DATA) 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; statu = SANE_Image_Statu_OK;
//} }
else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER) else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_OVER)
{ {
status_ = ret;
std::string msg; std::string msg;
msg.resize(usb.u32_Count);
int count = usb.u32_Count; int count = usb.u32_Count;
io_->read_bulk(&msg[0], &count); msg.resize(count);
status_ = SCANNER_ERR_DEVICE_AUTO_FAIL_OVER;
//notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_); 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; break;
} }
else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO) else if (ret == SCANNER_ERR_DEVICE_AUTO_FAIL_INFO)
{ {
sw.reset();
status_ = ret;
std::string msg; std::string msg;
msg.resize(usb.u32_Count);
int count = usb.u32_Count; int count = usb.u32_Count;
io_->read_bulk(&msg[0], &count); msg.resize(count);
status_ = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; ret = io_->read_bulk(&msg[0], &count);
if (ret == SCANNER_ERR_OK)
{
char buf[1024]; char buf[1024];
strcpy(buf, msg.c_str()); strcpy(buf, msg.c_str());
notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); notify_ui_working_status(buf, SANE_EVENT_STATUS, status_);
} }
else
if (ret == SCANNER_ERR_NO_DATA && savestatus_.empty() && sw.elapsed_ms() > 5000)
{ {
status_ = ret;
break;
}
}
if (sw.elapsed_ms() > 20000)//防止状态信息一直取不上来导致卡死
{
//3288固件 获取有纸无纸问题的bug如果是打开盖子在start之前【主动】获取的话会先报无纸而不是开盖。
//但是在【端点】又获取不到有纸还是无纸的状态,所以只能通过等待超时,再来【主动】获取有无纸张。
SANE_Bool is_paperon = false; SANE_Bool is_paperon = false;
get_scanner_paperon(is_paperon); ret = get_scanner_paperon(is_paperon);
if (!is_paperon && !user_cancel_) if (!is_paperon && !user_cancel_ && ret == SCANNER_ERR_OK)
{ {
status_ = SCANNER_ERR_DEVICE_NO_PAPER; status_ = SCANNER_ERR_DEVICE_NO_PAPER;
break; break;
} }
}
if (sw.elapsed_ms() > 20000)//防止状态信息一直取不上来导致卡死
{
status_ = !savestatus_.empty() ? savestatus_[0] : SCANNER_ERR_TIMEOUT;//以第一个消息为准 status_ = !savestatus_.empty() ? savestatus_[0] : SCANNER_ERR_TIMEOUT;//以第一个消息为准
savestatus_.clear(); savestatus_.clear();
hg_log::log(LOG_LEVEL_WARNING, "get status timeout,get image out\n"); 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 len = sizeof(usbcb);
int ret = writeusb(usbcb); int ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK) if (ret == SCANNER_ERR_OK && wait_usb_.is_waiting())
{ {
//status_ = SCANNER_ERR_DEVICE_BUSY; //status_ = SCANNER_ERR_DEVICE_BUSY;
wait_usb_.notify(); wait_usb_.notify();

View File

@ -1276,6 +1276,10 @@ int hg_scanner_302::set_dpi_color_check_val(void)
return write_register(retio, *(int*)&save_dpi_color_check_val); 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 hg_scanner_302::set_notify_sleep()
{ {
int val = 0, int val = 0,

View File

@ -121,4 +121,5 @@ public:
virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,70 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 get_speed_mode(int& data)override; //获取速度模式 /*/ data:40,50,60,70
virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正
virtual int set_auto_flat(void) override; //设置自动平场校正
}; };

View File

@ -58,6 +58,12 @@ namespace settingsdsp_400
case setting3288dsp::SIZE_ERROR: case setting3288dsp::SIZE_ERROR:
code = SCANNER_ERR_DEVICE_SIZE_CHECK; code = SCANNER_ERR_DEVICE_SIZE_CHECK;
break; 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: default:
code = SCANNER_ERR_NO_DATA; code = SCANNER_ERR_NO_DATA;
break; break;
@ -118,18 +124,50 @@ void hg_scanner_400::thread_handle_usb_read(void)
statu = last_usb_image_statu(ret); statu = last_usb_image_statu(ret);
savestatus_.push_back(ret); savestatus_.push_back(ret);
} }
else 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; 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)
{
char buf[1024];
strcpy(buf, msg.c_str());
notify_ui_working_status(buf, SANE_EVENT_STATUS, status_);
}
else
{
status_ = ret;
break;
}
}
if (sw.elapsed_s() > 30)//防止状态信息一直取不上来导致卡死 if (sw.elapsed_s() > 30)//防止状态信息一直取不上来导致卡死
{ {
if (!savestatus_.empty()) status_ = !savestatus_.empty() ? savestatus_[0] : SCANNER_ERR_TIMEOUT;
{
status_ = savestatus_[0];
}
else
{
status_ = SCANNER_ERR_TIMEOUT;
}
savestatus_.clear(); savestatus_.clear();
hg_log::log(LOG_LEVEL_WARNING, "get status timeout,get image out\n"); hg_log::log(LOG_LEVEL_WARNING, "get status timeout,get image out\n");
break; break;
@ -817,6 +855,26 @@ int hg_scanner_400::set_dpi_color_check_val(void)
//int ratio = cmd.u32_Data; //int ratio = cmd.u32_Data;
return ret; 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() int hg_scanner_400::set_notify_sleep()
{ {
return SCANNER_ERR_DEVICE_NOT_SUPPORT; return SCANNER_ERR_DEVICE_NOT_SUPPORT;

View File

@ -103,4 +103,5 @@ public:
virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,7080 virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,7080
virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ data:40,50,60,7080 virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ data:40,50,60,7080
virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正
virtual int set_auto_flat(void); //设置自动平场校正
}; };

View File

@ -1236,6 +1236,10 @@ int hg_scanner_402::set_dpi_color_check_val(void)
return write_register(retio, *(int*)&save_dpi_color_check_val); 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 hg_scanner_402::set_notify_sleep()
{ {
int val = 0, int val = 0,

View File

@ -121,4 +121,5 @@ public:
virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,7080 virtual int set_speed_mode(int data) override; //设置速度模式 /*/ data:40,50,60,7080
virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ data:40,50,60,7080 virtual int get_speed_mode(int &data) override; //设置速度模式 /*/ data:40,50,60,7080
virtual int set_dpi_color_check_val(void) override; //设置畸变矫正 virtual int set_dpi_color_check_val(void) override; //设置畸变矫正
virtual int set_auto_flat(void) override; //设置自动平场校正
}; };