diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index f5e3d4b..7e10ace 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -1944,7 +1944,10 @@ int hg_scanner::save_usb_data(std::shared_ptr data) wait_img_.notify(); } unsigned int bytes = data->size(); - ui_ev_cb_((scanner_handle)this, SANE_EVENT_USB_DATA_RECEIVED, NULL, &bytes, NULL); + int type = io_->get_pid() & 0x0ff; + + if(type != 0x39 || (usb_img_index_ & 1)) + ui_ev_cb_((scanner_handle)this, SANE_EVENT_USB_DATA_RECEIVED, NULL, &bytes, NULL); return ret; } diff --git a/hgdriver/hgdev/usb_manager.cpp b/hgdriver/hgdev/usb_manager.cpp index 8355975..9417e05 100644 --- a/hgdriver/hgdev/usb_manager.cpp +++ b/hgdriver/hgdev/usb_manager.cpp @@ -835,7 +835,6 @@ int usb_io::control_io(uint8_t type, uint8_t req, uint16_t val, uint16_t ind, vo int ret = libusb_control_transfer(handle_, type, req, val, ind, (unsigned char*)buf, *len, to_); - *len = 0; if (ret > 0) { *len = ret; @@ -855,7 +854,11 @@ int usb_io::control_io(uint8_t type, uint8_t req, uint16_t val, uint16_t ind, vo return last_err_; } + else + *len = 0; } + else + *len = 0; VLOG_MINI_5(LOG_LEVEL_DEBUG_INFO, "libusb_control_transfer(%x, %x, %d, %d) = %s\n", type, req, val, ind, libusb_error_name(ret)); last_err_ = usb_manager::usb_error_2_hg_err(ret); } diff --git a/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp b/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp index bf0946d..db1e0d2 100644 --- a/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp +++ b/hgdriver/wrapper/huagaoxxx_warraper_ex.cpp @@ -28,6 +28,48 @@ std::string g_scanner_path = ""; static std::string g_sane_name = ""; static std::string g_sane_ver = ""; +namespace err_map +{ + struct + { + int sane; + int scanner; + }g_err_map[] = + { {SANE_STATUS_GOOD, SCANNER_ERR_OK} + , {SANE_STATUS_UNSUPPORTED, SCANNER_ERR_DEVICE_NOT_SUPPORT} + , {SANE_STATUS_CANCELLED, SCANNER_ERR_USER_CANCELED} + , {SANE_STATUS_DEVICE_BUSY, SCANNER_ERR_DEVICE_BUSY} + , {SANE_STATUS_INVAL, SCANNER_ERR_INVALID_PARAMETER} + , {SANE_STATUS_EOF, SCANNER_ERR_NO_DATA} + , {SANE_STATUS_JAMMED, SCANNER_ERR_DEVICE_PAPER_JAMMED} + , {SANE_STATUS_NO_DOCS, SCANNER_ERR_DEVICE_NO_PAPER} + , {SANE_STATUS_COVER_OPEN, SCANNER_ERR_DEVICE_COVER_OPENNED} + , {SANE_STATUS_IO_ERROR, SCANNER_ERR_IO} + , {SANE_STATUS_NO_MEM, SCANNER_ERR_INSUFFICIENT_MEMORY} + , {SANE_STATUS_ACCESS_DENIED, SCANNER_ERR_ACCESS_DENIED} + }; + + static int sane_2_scanner(int sane) + { + for (size_t i = 0; i < _countof(g_err_map); ++i) + { + if (g_err_map[i].sane == sane) + return g_err_map[i].scanner; + } + + return sane; + } + static int scanner_2_sane(int scanner) + { + for (size_t i = 0; i < _countof(g_err_map); ++i) + { + if (g_err_map[i].scanner == scanner) + return g_err_map[i].sane; + } + + return scanner; + } +} extern "C" { scanner_err hg_scanner_initialize(sane_callback callback, void* reserve) @@ -200,6 +242,9 @@ extern "C" } const char* hg_scanner_err_description(int err) { + if (err < 0x100) + err = err_map::sane_2_scanner(err); + RETURN_DESC_IF(err, SCANNER_ERR_OK); RETURN_DESC_IF(err, SCANNER_ERR_DEVICE_NOT_SUPPORT); RETURN_DESC_IF(err, SCANNER_ERR_USER_CANCELED);