149 lines
5.9 KiB
C++
149 lines
5.9 KiB
C++
#pragma once
|
||
|
||
#include "../../sdk/hginclude/huagaoxxx_warraper_ex.h"
|
||
#include "usb_manager.h"
|
||
#include <string>
|
||
#include <vector>
|
||
#include <algorithm>
|
||
#include <mutex>
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////
|
||
// 设备需要支持的特性 (2022-02-24)
|
||
//
|
||
// 1、每台设备应该有唯一的序列号,并可读取,用以精确定位连接到计算机上的每一台设备,
|
||
// 方便多台设备连接到计算机上时,插拔后实现机器状态(配置参数)的自动恢复
|
||
//
|
||
// 2、设备启动后,应该由设备上的驱动进行默认参数的设置,以支持按键扫描功能(由设备主动发起的扫描)
|
||
//
|
||
// 3、设备的所有配置参数都应该可读,以满足用户对设备实时状态的监控
|
||
//
|
||
// 4、设备要支持“reset”命令,以使设备在发生软硬件错误时,尽可能通过软件方式重置到正常状态
|
||
//
|
||
// 5、可以考虑在每一段数据的前面添加数据头信息,以表明这段数据的属性(状态数据、图片数据……),
|
||
// 为支持异步IO特性奠定基础
|
||
//
|
||
// 6、设备的基本通信(设备类型……信息访问)需要保持健壮,不能因为上位机的通信异常导致信息错乱
|
||
//
|
||
////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//#ifdef OEM_HANWANG
|
||
//#define hg_scanner hw_scanner
|
||
//#define hg_scanner_mgr hw_scanner_mgr
|
||
//#elif defined(OEM_LISICHENG)
|
||
//#define hg_scanner lsc_scanner
|
||
//#define hg_scanner_mgr lsc_scanner_mgr
|
||
//#elif defined(OEM_CANGTIAN)
|
||
//#define hg_scanner cts_scanner
|
||
//#define hg_scanner_mgr cts_scanner_mgr
|
||
//#endif
|
||
class hg_scanner;
|
||
class hguser;
|
||
class offline_opts;
|
||
class device_option;
|
||
class sane_opt_provider;
|
||
|
||
class hg_scanner_mgr
|
||
{
|
||
typedef struct _online_scanner
|
||
{
|
||
libusb_device* dev; // the unique usb device
|
||
int ind; // index in supporting scanners queue
|
||
hg_scanner* scanner;
|
||
std::string display_name;
|
||
|
||
bool operator==(const libusb_device* d)
|
||
{
|
||
return d == dev;
|
||
}
|
||
bool operator==(const int& index)
|
||
{
|
||
return ind == index;
|
||
}
|
||
bool operator==(const char* name)
|
||
{
|
||
return display_name == name;
|
||
}
|
||
}OLSCANNER;
|
||
std::vector<OLSCANNER> online_devices_;
|
||
std::mutex mutex_dev_;
|
||
unsigned int same_ind_;
|
||
|
||
hguser* user_;
|
||
offline_opts* offline_;
|
||
device_option* dev_opts_;
|
||
|
||
static sane_callback event_callback_;
|
||
static bool async_io_enabled_;
|
||
|
||
static std::string last_open_msg_;
|
||
static std::string pe_path_;
|
||
static std::string pe_name_;
|
||
static bool read_over_with_eof_;
|
||
|
||
static int ver_major_;
|
||
static int ver_minor_;
|
||
static int ver_build_;
|
||
static int ver_patch_;
|
||
|
||
static uint32_t unique_img_id_;
|
||
static std::mutex mutex_img_id;
|
||
|
||
static hg_scanner_mgr* inst_;
|
||
static void usb_event_handle(usb_event ev, libusb_device* device, int vid, int pid, int usb_ver_h, int usb_ver_l, bool* retry, void* user); // usb_ver_h.usb_ver_l
|
||
|
||
void on_hgscanner_pnp(usb_event ev, libusb_device* device, int vid, int pid, int usb_ver_h, int usb_ver_l, bool* retry); // usb_ver_h.usb_ver_l
|
||
void get_online_devices(std::vector<OLSCANNER>& devs);
|
||
void reset_device_opts(sane_opt_provider* scanner = nullptr);
|
||
|
||
void set_appendix_info_for_about(SANE_About* about, char*& ptr, int& count, const char* key, const char* info, const char* url);
|
||
scanner_err get_about_info(scanner_handle h, void* data, unsigned* len);
|
||
|
||
string cf_name;
|
||
string url_en;
|
||
string url_link_en;
|
||
protected:
|
||
hg_scanner_mgr();
|
||
~hg_scanner_mgr();
|
||
|
||
public:
|
||
static int ui_default_callback(scanner_handle, int, void*, unsigned int*, void*);
|
||
static hg_scanner_mgr* instance(sane_callback cb = NULL);
|
||
static void clear(void);
|
||
static void set_version(int hh, int hl, int lh, int ll);
|
||
static void get_version(int* hh, int* hl, int* lh, int* ll);
|
||
static void set_exe_name(const char* path, const char* name);
|
||
static std::string get_pe_name(std::string* path = nullptr);
|
||
enum
|
||
{
|
||
UNIQUE_ID_IMG = 0,
|
||
};
|
||
static uint32_t unique_id(int type = UNIQUE_ID_IMG);
|
||
|
||
static hg_scanner* create_scanner_empty(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g100(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g239(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g300(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g302(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g400(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g402(const char* name, usb_io* io, scanner_handle* h);
|
||
static hg_scanner* create_scanner_g439(const char* name, usb_io* io, scanner_handle* h);
|
||
|
||
public:
|
||
scanner_err hg_scanner_enum(ScannerInfo* scanner_list, long* count, bool local_only);
|
||
scanner_err hg_scanner_open(scanner_handle* h, const char* name, bool shared, const char* user, const char* pwd, const char* check, char* rsc);
|
||
scanner_err hg_scanner_close(scanner_handle h, bool force);
|
||
scanner_err hg_scanner_get_parameter(scanner_handle h, const char* name, char* data, long* len, int type);
|
||
scanner_err hg_scanner_set_parameter(scanner_handle h, const char* name, void* data, bool to_default);
|
||
scanner_err hg_scanner_start(scanner_handle h, void* async_event, int num);
|
||
scanner_err hg_scanner_stop(scanner_handle h);
|
||
scanner_err hg_scanner_get_img_info(scanner_handle h, SANE_Parameters* bmi, long len);
|
||
scanner_err hg_scanner_read_img_data(scanner_handle h, unsigned char* data, long* len);
|
||
scanner_err hg_scanner_get_status(scanner_handle h, int setstutas);
|
||
scanner_err hg_scanner_reset(scanner_handle h);
|
||
scanner_err hg_scanner_control(scanner_handle h, unsigned long code, void* data, unsigned* len);
|
||
|
||
void on_language_changed(void);
|
||
const char* last_open_message(void);
|
||
};
|
||
|