#pragma once
#include
#include "usb_manager.h"
#include
#include
#include
#include
////////////////////////////////////////////////////////////////////////////////////////
// 设备需要支持的特性 (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 imgproc_mgr;
struct _online_scanner;
class hg_scanner_mgr
{
std::vector<_online_scanner> online_devices_;
std::mutex mutex_dev_;
unsigned int same_ind_;
hguser* user_;
offline_opts* offline_;
// debug configuration
bool dump_img_ = false;
std::string dump_img_path_ = "";
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<_online_scanner>& devs);
void init_debug_config(const char* cfg_file);
imgproc_mgr* create_image_processor(device_option* devopts);
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);
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);
};