调整校正流程

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:
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;

View File

@ -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

View File

@ -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;

View File

@ -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); //设置自动平场校正
};

View File

@ -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 ...

View File

@ -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); //设置自动平场校正
};

View File

@ -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;
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_);
}
if (ret == SCANNER_ERR_NO_DATA && savestatus_.empty() && sw.elapsed_ms() > 5000)
else
{
status_ = ret;
break;
}
}
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();

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);
}
int hg_scanner_302::set_auto_flat(void)
{
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_302::set_notify_sleep()
{
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 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; //设置自动平场校正
};

View File

@ -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
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;
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 (!savestatus_.empty())
{
status_ = savestatus_[0];
}
else
{
status_ = SCANNER_ERR_TIMEOUT;
}
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;

View File

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