#pragma once #include "../../sdk/hginclude/huagaoxxx_warraper_ex.h" #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 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 online_devices_; std::mutex mutex_dev_; unsigned int same_ind_; static sane_callback event_callback_; static bool async_io_enabled_; 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 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& devs); 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); 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 set_exe_name(const char* path, const char* name); static std::string get_pe_name(std::string* path = nullptr); 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); scanner_err hg_scanner_set_parameter(scanner_handle h, const char* name, void* data, long len); 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); };