From 6f5bde5cc41d121d362fc4b06f08732b645956ae Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Sat, 7 Oct 2023 12:41:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E5=B8=B8=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=A4=84=E7=90=86=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/hgdev/hg_ipc.cpp | 3 ++- hgdriver/hgdev/hg_ipc.h | 3 ++- hgdriver/hgdev/hg_scanner.cpp | 26 ++++++++++++++++++++++---- hgdriver/hgdev/hg_scanner.h | 2 +- hgdriver/hgdev/scanner_manager.cpp | 6 +++--- hgsane/main.c | 5 +++++ hgsane/sane_hg_mdw.cpp | 16 ++++++++++++++++ hgsane/sane_hg_mdw.h | 1 + 8 files changed, 52 insertions(+), 10 deletions(-) diff --git a/hgdriver/hgdev/hg_ipc.cpp b/hgdriver/hgdev/hg_ipc.cpp index f5122c2..fac9eba 100644 --- a/hgdriver/hgdev/hg_ipc.cpp +++ b/hgdriver/hgdev/hg_ipc.cpp @@ -785,7 +785,7 @@ void final_img_queue::clear(void) mem_usage_ = 0; queue_.clear(); } -bool final_img_queue::put(int w, int h, int bpp, int channels, int line_bytes, void* data, unsigned bytes +bool final_img_queue::put(int w, int h, int bpp, int channels, int line_bytes, void* data, unsigned bytes, int statu , const char* tmp_path, const char* name_leading, const char* ext, int ind, uint32_t id) { IMGDT imgd; @@ -799,6 +799,7 @@ bool final_img_queue::put(int w, int h, int bpp, int channels, int line_bytes, v imgd.header.line_bytes = line_bytes; imgd.header.width = w; imgd.header.src_id = id; + imgd.header.statu = statu; imgd.offset = 0; imgd.data.reset(new tiny_buffer(bytes, tmp_path, name_leading, ext, ind)); diff --git a/hgdriver/hgdev/hg_ipc.h b/hgdriver/hgdev/hg_ipc.h index 5226fa5..9a7b03a 100644 --- a/hgdriver/hgdev/hg_ipc.h +++ b/hgdriver/hgdev/hg_ipc.h @@ -213,6 +213,7 @@ typedef struct _img_header int bits; int channels; int line_bytes; + int statu; // SANE_Image_Statu unsigned bytes; uint32_t src_id; }IMH; @@ -236,7 +237,7 @@ public: unsigned long long mem_usage(void); size_t size(void); void clear(void); - bool put(int w, int h, int bpp, int channels, int line_bytes, void* data, unsigned bytes + bool put(int w, int h, int bpp, int channels, int line_bytes, void* data, unsigned bytes, int statu , const char* tmp_path, const char* name_leading, const char* ext, int ind, uint32_t id); bool front(IMH* header); void fetch_front(void* buf, int* len, bool* over); diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index 04ad15b..34a1c50 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -3615,7 +3615,7 @@ int hg_scanner::save_final_image(hg_imgproc::LPIMGHEAD head, void* buf, uint32_t return ui_ev_cb_((scanner_handle)this, SANE_EVENT_IMAGE_OK, &img, &final_img_index_, NULL); } - if (final_imgs_.put(head->width, head->height, head->bits, head->channels, head->line_bytes, buf, head->total_bytes + if (final_imgs_.put(head->width, head->height, head->bits, head->channels, head->line_bytes, buf, head->total_bytes, head->statu , final_path_.c_str(), "final", "dat", final_img_index_, id)) return SCANNER_ERR_OK; else @@ -3972,14 +3972,18 @@ int hg_scanner::start(void) return status_; } -int hg_scanner::get_image_info(SANE_Parameters* ii) +int hg_scanner::get_image_info(SANE_Parameters* ii, int len) { int ret = SCANNER_ERR_OK; IMH imh; + SANE_Image* iiex = len == sizeof(SANE_Image) ? (SANE_Image*)ii : nullptr; fetching_id_ = -1; - bzero(&imh, sizeof(imh)); - bzero(ii, sizeof(*ii)); + memset(&imh, 0, sizeof(imh)); + memset(ii, 0, len); + if (iiex) + ii = &iiex->header; + while ((!wait_img_.is_waiting() || !wait_usb_.is_waiting()) && final_imgs_.size() <= 0) this_thread::sleep_for(chrono::milliseconds(10)); @@ -3993,6 +3997,13 @@ int hg_scanner::get_image_info(SANE_Parameters* ii) { copy_to_sane_image_header(ii, imh.width, imh.height, imh.line_bytes, imh.channels, imh.bits); fetching_id_ = imh.src_id; + if (iiex) + { + iiex->src_id = imh.src_id; + iiex->flag.statu = imh.statu; + iiex->flag.dpi = resolution_; + iiex->bytes = imh.bytes; + } } } @@ -4016,6 +4027,13 @@ int hg_scanner::get_image_info(SANE_Parameters* ii) else imh.bits = 8; + if (iiex) + { + iiex->src_id = -1; + iiex->flag.statu = SANE_Image_Statu_OK; + iiex->flag.dpi = resolution_; + } + ret = SCANNER_ERR_OK; } } diff --git a/hgdriver/hgdev/hg_scanner.h b/hgdriver/hgdev/hg_scanner.h index 33de5c4..74ca872 100644 --- a/hgdriver/hgdev/hg_scanner.h +++ b/hgdriver/hgdev/hg_scanner.h @@ -475,7 +475,7 @@ public: public: virtual int start(void); - virtual int get_image_info(SANE_Parameters* ii); + virtual int get_image_info(SANE_Parameters* ii, int len); virtual int read_image_data(unsigned char* buf, int* len); virtual int stop(void); virtual int reset(void); diff --git a/hgdriver/hgdev/scanner_manager.cpp b/hgdriver/hgdev/scanner_manager.cpp index 8aff5ae..bacb681 100644 --- a/hgdriver/hgdev/scanner_manager.cpp +++ b/hgdriver/hgdev/scanner_manager.cpp @@ -407,14 +407,14 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v size_t i = 0; for (; i < online_devices_.size(); ++i) { - if (online_devices_[i].dev == device) // 濮濄倕顦╅崑鍥х暰閸氬奔绔撮崣鎷岊啎婢跺洭鍣搁弬鎷岀箾閹恒儱鎮楅敍宀冾啎婢跺洤顕挒鈾€鈧竸evice閳ユ繀绻氶幐浣风瑝閸欐﹫绱辨俊鍌涚亯閸嬪洩顔曟稉宥嗗灇缁斿绱濇导姘嚤閼风顔曟径鍥櫢鏉╃偞绉烽幁顖欑瑝閼宠姤顒滅敮鍛婂复閺€璁圭礉缂佹垵鐣鹃崚鎷岊嚉鐠佹儳顦惃鍓哻anner鐎电钖勫妞剧瑝閸掍即鍣撮弨? + if (online_devices_[i].dev == device) // 濮濄倕顦╅崑鍥х暰閸氬奔绔撮崣鎷岊啎婢跺洭鍣搁弬鎷岀箾閹恒儱鎮楅敍宀冾啎婢跺洤顕挒鈾€鈧竸evice閳ユ繀绻氶幐浣风瑝閸欐﹫绱辨俊鍌涚亯閸嬪洩顔曟稉宥嗗灇缁斿绱濇导姘嚤閼风顔曟径鍥櫢鏉╃偞绉烽幁顖欑瑝閼宠姤顒滅敮鍛婂复閺€璁圭礉缂佹垵鐣鹃崚鎷岊嚉鐠佹儳顦惃鍓哻anner鐎电钖勫妞剧瑝閸掍即鍣撮? { online_devices_[i].ind = index; add = false; break; } } - if (add) // 婢跺嫮鎮婄€电钖勯垾娓別vice閳ユ繃鏁奸崣妯兼畱閹懏娅? + if (add) // 婢跺嫮鎮婄€电钖勯垾娓別vice閳ユ繃鏁奸崣妯兼畱閹懏? { i = 0; for (auto& v : online_devices_) @@ -1060,7 +1060,7 @@ scanner_err hg_scanner_mgr::hg_scanner_stop(scanner_handle h) } scanner_err hg_scanner_mgr::hg_scanner_get_img_info(scanner_handle h, SANE_Parameters* bmi, long len) { - return (scanner_err)SCAN_PTR(h)->get_image_info(bmi); + return (scanner_err)SCAN_PTR(h)->get_image_info(bmi, (int)len); } scanner_err hg_scanner_mgr::hg_scanner_read_img_data(scanner_handle h, unsigned char* data, long* len) { diff --git a/hgsane/main.c b/hgsane/main.c index 9a53031..a3c62c2 100644 --- a/hgsane/main.c +++ b/hgsane/main.c @@ -26,6 +26,7 @@ extern SANE_Status inner_sane_io_control(SANE_Handle h, unsigned long code, void extern const char* inner_sane_err_desc(SANE_Status err); extern SANE_Status inner_sane_read_ext(SANE_Img_Ext_Info* ext_info, SANE_Int* len); extern SANE_Status inner_sane_ex_get_driver_version(SANE_Int* hh, SANE_Int* hl, SANE_Int* lh, SANE_Int* ll); +extern SANE_Status inner_sane_get_parameters_ex(SANE_Handle h, SANE_Image* info); /// /// 导出接口 @@ -115,6 +116,10 @@ SANE_Status sane_read_ext_info(SANE_Img_Ext_Info* ext_info, SANE_Int* len) { return inner_sane_read_ext(ext_info, len); } +SANE_Status sane_get_parameters_ex(SANE_Handle h, SANE_Image* info) +{ + return inner_sane_get_parameters_ex(h, info); +} int sane_ex_get_driver_version(int* hh, int* hl, int* lh, int* ll) { return inner_sane_ex_get_driver_version(hh, hl, lh, ll); diff --git a/hgsane/sane_hg_mdw.cpp b/hgsane/sane_hg_mdw.cpp index 538f204..e7aae27 100644 --- a/hgsane/sane_hg_mdw.cpp +++ b/hgsane/sane_hg_mdw.cpp @@ -1669,6 +1669,18 @@ SANE_Status hg_sane_middleware::get_image_parameters(SANE_Handle handle, SANE_Pa return local_utility::scanner_err_2_sane_statu(err); } +SANE_Status hg_sane_middleware::get_image_parameters_ex(SANE_Handle handle, SANE_Image* params) +{ + scanner_handle h = find_openning_device(handle); + scanner_err err = SCANNER_ERR_NOT_START; + + if (!params) + return SANE_STATUS_INVAL; + + err = hg_scanner_get_img_info(h, (SANE_Parameters*)params, sizeof(*params)); + + return local_utility::scanner_err_2_sane_statu(err); +} SANE_Status hg_sane_middleware::start(SANE_Handle h, void* async_event) { LPDEVINST dev; @@ -2643,6 +2655,10 @@ extern "C" { // avoid compiler exporting name in C++ style !!! return SANE_STATUS_GOOD; } + SANE_Status inner_sane_get_parameters_ex(SANE_Handle h, SANE_Image* info) + { + return hg_sane_middleware::instance()->get_image_parameters_ex(h, info); + } void sanei_debug_msg(int level, int max_level, const char* be, const char* fmt, va_list ap) { diff --git a/hgsane/sane_hg_mdw.h b/hgsane/sane_hg_mdw.h index 039f1fb..4d9458c 100644 --- a/hgsane/sane_hg_mdw.h +++ b/hgsane/sane_hg_mdw.h @@ -223,6 +223,7 @@ public: SANE_Status open_device(SANE_String_Const devicename, SANE_Handle* handle); SANE_Status close_device(SANE_Handle h); SANE_Status get_image_parameters(SANE_Handle handle, SANE_Parameters* params); + SANE_Status get_image_parameters_ex(SANE_Handle handle, SANE_Image* params); SANE_Status start(SANE_Handle h, void* async_event); SANE_Status read(SANE_Handle h, void* buf, int* bytes); SANE_Status stop(SANE_Handle h);