添加异常图片处理协议

This commit is contained in:
gb 2023-10-07 12:41:50 +08:00
parent 96cbfed48d
commit 6f5bde5cc4
8 changed files with 52 additions and 10 deletions

View File

@ -785,7 +785,7 @@ void final_img_queue::clear(void)
mem_usage_ = 0; mem_usage_ = 0;
queue_.clear(); 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) , const char* tmp_path, const char* name_leading, const char* ext, int ind, uint32_t id)
{ {
IMGDT imgd; 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.line_bytes = line_bytes;
imgd.header.width = w; imgd.header.width = w;
imgd.header.src_id = id; imgd.header.src_id = id;
imgd.header.statu = statu;
imgd.offset = 0; imgd.offset = 0;
imgd.data.reset(new tiny_buffer(bytes, tmp_path, name_leading, ext, ind)); imgd.data.reset(new tiny_buffer(bytes, tmp_path, name_leading, ext, ind));

View File

@ -213,6 +213,7 @@ typedef struct _img_header
int bits; int bits;
int channels; int channels;
int line_bytes; int line_bytes;
int statu; // SANE_Image_Statu
unsigned bytes; unsigned bytes;
uint32_t src_id; uint32_t src_id;
}IMH; }IMH;
@ -236,7 +237,7 @@ public:
unsigned long long mem_usage(void); unsigned long long mem_usage(void);
size_t size(void); size_t size(void);
void clear(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); , const char* tmp_path, const char* name_leading, const char* ext, int ind, uint32_t id);
bool front(IMH* header); bool front(IMH* header);
void fetch_front(void* buf, int* len, bool* over); void fetch_front(void* buf, int* len, bool* over);

View File

@ -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); 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)) , final_path_.c_str(), "final", "dat", final_img_index_, id))
return SCANNER_ERR_OK; return SCANNER_ERR_OK;
else else
@ -3972,14 +3972,18 @@ int hg_scanner::start(void)
return status_; 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; int ret = SCANNER_ERR_OK;
IMH imh; IMH imh;
SANE_Image* iiex = len == sizeof(SANE_Image) ? (SANE_Image*)ii : nullptr;
fetching_id_ = -1; fetching_id_ = -1;
bzero(&imh, sizeof(imh)); memset(&imh, 0, sizeof(imh));
bzero(ii, sizeof(*ii)); memset(ii, 0, len);
if (iiex)
ii = &iiex->header;
while ((!wait_img_.is_waiting() || !wait_usb_.is_waiting()) && final_imgs_.size() <= 0) while ((!wait_img_.is_waiting() || !wait_usb_.is_waiting()) && final_imgs_.size() <= 0)
this_thread::sleep_for(chrono::milliseconds(10)); 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); copy_to_sane_image_header(ii, imh.width, imh.height, imh.line_bytes, imh.channels, imh.bits);
fetching_id_ = imh.src_id; 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 else
imh.bits = 8; imh.bits = 8;
if (iiex)
{
iiex->src_id = -1;
iiex->flag.statu = SANE_Image_Statu_OK;
iiex->flag.dpi = resolution_;
}
ret = SCANNER_ERR_OK; ret = SCANNER_ERR_OK;
} }
} }

View File

@ -475,7 +475,7 @@ public:
public: public:
virtual int start(void); 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 read_image_data(unsigned char* buf, int* len);
virtual int stop(void); virtual int stop(void);
virtual int reset(void); virtual int reset(void);

View File

@ -407,14 +407,14 @@ void hg_scanner_mgr::on_hgscanner_pnp(usb_event ev, libusb_device* device, int v
size_t i = 0; size_t i = 0;
for (; i < online_devices_.size(); ++i) for (; i < online_devices_.size(); ++i)
{ {
if (online_devices_[i].dev == device) // 濮濄倕顦╅崑鍥х暰閸氬奔绔撮崣鎷岊啎婢跺洭鍣搁弬鎷岀箾閹恒儱鎮楅敍宀冾啎婢跺洤顕挒鈾€鈧竸evice閳ユ繀绻氶幐浣风瑝閸欐﹫绱辨俊鍌涚亯閸嬪洩顔曟稉宥嗗灇缁斿绱濇导姘嚤閼风顔曟径鍥櫢鏉╃偞绉烽幁顖欑瑝閼宠姤顒滅敮鍛婂复閺€璁圭礉缂佹垵鐣鹃崚鎷岊嚉鐠佹儳顦惃鍓哻anner鐎电钖勫妞剧瑝閸掍即鍣撮弨? if (online_devices_[i].dev == device) // 濮濄倕顦╅å´é<EFBFBD>¥Ñ…æš°é¸æ°¬å¥”ç»”æ®å´£éŽ·å²Šå•Žå©¢è·ºæ´­é<EFBFBD>£æ<EFBFBD><EFBFBD>弬鎷岀箾é¹æ<EFBFBD>儱鎮楅æ•<EFBFBD>宀冾啎婢跺洤顕æŒéˆ¾â¬éˆ§î„<EFBFBD>竸eviceé³ãƒ¦ç¹€ç»»æ°¶å¹<EFBFBD>浣风ç<EFBFBD>é¸æ¬<EFBFBD>﹫绱辨俊é<EFBFBD>Œæ¶šäº¯é¸å¬ªæ´©é¡”æŸç¨‰å®¥å——ç<EFBFBD>‡ç¼<EFBFBD>æ¿îƒç»±æ¿‡å¯¼å§˜î„‰åš¤é¼é£Žî—<EFBFBD>é¡”æŸå¾„é<EFBFBD>¥î„€æ«¢é<EFBFBD>‰â•ƒå<EFBFBD>žç»‰çƒ½å¹<EFBFBD>é¡æ¬ç<EFBFBD>é¼å® å§¤é¡æ»…æ•®é<EFBFBD>å©å¤<EFBFBD>éºâ¬ç<EFBFBD>圭礉ç¼ä½¹åžµé<EFBFBD>£é¹ƒå´šéŽ·å²Šåš‰é<EFBFBD> ä½¹å„³é¡¦î„„惃é<EFBFBD>“å“»anneré<EFBFBD>Žç”µî”Šéå«î‡¥å¦žå‰§ç<EFBFBD>é¸æŽ<EFBFBD>å<EFBFBD>³é<EFBFBD>£æ®å¼?
{ {
online_devices_[i].ind = index; online_devices_[i].ind = index;
add = false; add = false;
break; break;
} }
} }
if (add) // 婢跺嫮鎮婄€电钖勯垾娓別vice閳ユ繃鏁奸崣妯兼畱閹懏娅? if (add) // 婢跺嫮鎮婄â¬ç”µî”Šéå¯åž¾å¨“別viceé³ãƒ¦ç¹ƒé<EFBFBD><EFBFBD>奸崣妯兼畱é¹îˆšæ‡<EFBFBD>å¨?
{ {
i = 0; i = 0;
for (auto& v : online_devices_) 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) 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) scanner_err hg_scanner_mgr::hg_scanner_read_img_data(scanner_handle h, unsigned char* data, long* len)
{ {

View File

@ -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 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_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_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);
/// <summary> /// <summary>
/// 导出接口 /// 导出接口
@ -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); 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) 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); return inner_sane_ex_get_driver_version(hh, hl, lh, ll);

View File

@ -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); 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) SANE_Status hg_sane_middleware::start(SANE_Handle h, void* async_event)
{ {
LPDEVINST dev; LPDEVINST dev;
@ -2643,6 +2655,10 @@ extern "C" { // avoid compiler exporting name in C++ style !!!
return SANE_STATUS_GOOD; 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) void sanei_debug_msg(int level, int max_level, const char* be, const char* fmt, va_list ap)
{ {

View File

@ -223,6 +223,7 @@ public:
SANE_Status open_device(SANE_String_Const devicename, SANE_Handle* handle); SANE_Status open_device(SANE_String_Const devicename, SANE_Handle* handle);
SANE_Status close_device(SANE_Handle h); SANE_Status close_device(SANE_Handle h);
SANE_Status get_image_parameters(SANE_Handle handle, SANE_Parameters* params); 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 start(SANE_Handle h, void* async_event);
SANE_Status read(SANE_Handle h, void* buf, int* bytes); SANE_Status read(SANE_Handle h, void* buf, int* bytes);
SANE_Status stop(SANE_Handle h); SANE_Status stop(SANE_Handle h);