code_device/hgdriver/hgdev/hg_scanner.h

118 lines
3.2 KiB
C++

// scanner business handler
//
// created on 2023-03-27
//
#pragma once
#include <sane_opt_json/base_opt.h>
#include <sane/sane_ex.h>
#include <base/data.h>
class hg_scanner;
class imgproc_mgr;
class device_option;
class scanner_handler;
class hguser;
struct libusb_device;
typedef struct _online_scanner
{
int vid;
int pid;
int addr;
libusb_device *dev; // the unique usb device
hg_scanner *scanner;
std::string family;
std::string display_name; // unique. same device name should append sn
bool operator==(const libusb_device* d)
{
return d == dev;
}
bool operator==(const char* name)
{
return display_name == name;
}
bool operator==(const hg_scanner* s)
{
return s == scanner;
}
}ONLNSCANNER;
class hg_scanner : public sane_opt_provider
{
int status_;
std::string msg_;
std::string dump_path_;
ONLNSCANNER dev_;
device_option *dev_opts_ = nullptr;
imgproc_mgr *imgproc_ = nullptr;
shared_memory *singleton_ = nullptr;
scanner_handler *scanner_ = nullptr;
hguser *user_ = nullptr;
chronograph scan_time_;
int final_cnt_ = 0;
double tx_prg_ = .0f; // file transfer progress
std::function<void(int)> scan_over_notify_ = std::function<void(int)>(); // finish(err)
volatile bool cancelled_ = false;
volatile bool run_ = true;
safe_fifo<image_holder*> raw_imgs_;
safe_fifo<image_holder*> final_imgs_;
uint32_t cur_img_pos_ = 0; // transmission position of front image
uint32_t dpi_ = 200;
#ifdef USE_SAFE_THREAD
safe_thread imgpr_thread_;
#else
std::unique_ptr<std::thread> imgpr_thread_;
#endif
bool online_ = true;
std::map<int, std::string> img_prc_name_; // <position, key-name>
static shared_memory* create_device_singleton(int vid, int pid, int addr);
static image_holder_ptr make_finished_image_holder(int err);
static bool is_finished_image_holder(image_holder_ptr ptr, int* err);
void init(void);
void thread_image_processor(void);
void process_image(image_holder_ptr img);
image_holder_ptr wait_image(void);
public:
hg_scanner(ONLNSCANNER* dev, imgproc_mgr* imgproc = nullptr, hguser* user = nullptr, std::vector<sane_opt_provider*>* constopts = nullptr);
protected:
virtual ~hg_scanner();
// sane_opt_provider
public:
virtual char* get_value(const char* name, void* value, size_t* size, int* err = nullptr) override;
virtual int set_value(const char* name, void* val) override;
// scanner operation ...
public:
int start(std::string* devcfg, std::function<void(int)> over_cb = std::function<void(int)>());
int stop(void);
int close(void);
int re_connect(void);
int get_image_info(SANE_Parameters* pii);
int read_image_data(uint8_t* buf, size_t* len);
int get_resolution(void);
void clear_images(void);
int status(EP0REPLYSTATUS* ds = nullptr, bool en_dev_log = false/*enable device write log of this status*/);
std::string status_message(void);
bool is_online(void);
char* get_option_value(const char* name, void* value, size_t* size, int* err);
// advanced functions ...
public:
device_option* get_device_opt(void);
int get_peer_config(LPPEERCFG cfg);
int file_transfer(const char* local, const char* remote, bool to_remote); // get_value("tx-prog", (double*)percent) to query progress
};