添加用户权限管理;添加BMP文件头函数;restore不判断auto属性
This commit is contained in:
parent
be23610bae
commit
8f294f8bf6
|
@ -20,9 +20,9 @@
|
|||
FpgaComm::controller::controller()
|
||||
{
|
||||
status_.reset(new Gpio(PORT_STATUS));
|
||||
reload_.reset(new GpioOut(PORT_RELOAD));
|
||||
cfg_.reset(new Gpio(PORT_CONFIG));
|
||||
reset_.reset(new GpioOut(PORT_RESET));
|
||||
reload_.reset(new Gpio(PORT_RELOAD));
|
||||
reset_.reset(new Gpio(PORT_RESET));
|
||||
}
|
||||
FpgaComm::controller::~controller()
|
||||
{}
|
||||
|
@ -56,16 +56,21 @@ void FpgaComm::controller::reload(void)
|
|||
utils::to_log(LOG_LEVEL_DEBUG, "FPGA-reload set High after 3 seconds: %d\n", status_->getValue());
|
||||
}
|
||||
|
||||
FpgaComm::FpgaComm(int bauds) : bauds_(bauds)
|
||||
FpgaComm::FpgaComm(int bauds, bool query) : bauds_(bauds)
|
||||
{
|
||||
controller_.reset(new controller());
|
||||
m_regsAccess.reset(new UartRegsAccess(FPGA_UART, bauds_, 0x03, 0x83));
|
||||
update();
|
||||
if(query)
|
||||
return;
|
||||
|
||||
Reg(AledR).sample = 256;
|
||||
WR_Reg(AledR);
|
||||
ok_ = update();
|
||||
if(ok_)
|
||||
{
|
||||
Reg(AledR).sample = 256;
|
||||
WR_Reg(AledR);
|
||||
|
||||
controller_->reset();
|
||||
controller_->reset();
|
||||
}
|
||||
}
|
||||
|
||||
bool FpgaComm::read(unsigned int addr, unsigned int& val) {
|
||||
|
@ -319,13 +324,25 @@ void FpgaComm::setDelayTime(int value) {
|
|||
WR_Reg(DelayTime);
|
||||
}
|
||||
|
||||
void FpgaComm::update()
|
||||
bool FpgaComm::update()
|
||||
{
|
||||
// spends 6.5s
|
||||
bool good = true;
|
||||
chronograph watch;
|
||||
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "Read %u FpgaComm registers ...\n", MAX_REGS);
|
||||
for(int i = 0; i < MAX_REGS; i++)
|
||||
{
|
||||
read(i, fpgaParams.regs[i]);
|
||||
good = read(i, fpgaParams.regs[i]);
|
||||
if(!good)
|
||||
{
|
||||
utils::to_log(LOG_LEVEL_FATAL, " FATAL: Register %d(0x%08x) timeout.\n", i, fpgaParams.regs[i]);
|
||||
break;
|
||||
}
|
||||
utils::to_log(LOG_LEVEL_DEBUG, " reg(%02d) = 0x%08x\n", i, fpgaParams.regs[i]);
|
||||
}
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "Read FpgaComm registers over.\n");
|
||||
|
||||
return good;
|
||||
}
|
||||
|
||||
void FpgaComm::enableJamCheck(bool b){
|
||||
|
@ -403,3 +420,8 @@ void FpgaComm::resetADC() {
|
|||
fpgaParams.mode.adcB = 0;
|
||||
WR_Reg(mode);
|
||||
}
|
||||
|
||||
bool FpgaComm::is_ok(void)
|
||||
{
|
||||
return ok_;
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
#ifdef HAS_UV
|
||||
#define MAX_REGS 0x0e
|
||||
#else
|
||||
#define MAX_REGS 0x0d
|
||||
#define MAX_REGS 0x10
|
||||
#endif
|
||||
|
||||
typedef struct Frame_FPGA
|
||||
|
@ -114,7 +114,7 @@ typedef union Fpga_Params
|
|||
unsigned int DelayTime; //0x0c
|
||||
CisLedUv UVLed;
|
||||
};
|
||||
unsigned int regs[14];
|
||||
unsigned int regs[MAX_REGS];
|
||||
} FpgaParams;
|
||||
|
||||
#define FPGA_UART "/dev/ttyUSB0"
|
||||
|
@ -136,7 +136,8 @@ class Gpio;
|
|||
|
||||
class FpgaComm : public IRegsAccess
|
||||
{
|
||||
int bauds_ = 921600;
|
||||
int bauds_ = 921600;
|
||||
bool ok_ = true;
|
||||
|
||||
class controller
|
||||
{
|
||||
|
@ -148,9 +149,9 @@ class FpgaComm : public IRegsAccess
|
|||
PORT_RESET = 232,
|
||||
};
|
||||
std::unique_ptr<Gpio> status_; // status reader - port 69
|
||||
std::unique_ptr<GpioOut> reload_; // codes reload - port 70
|
||||
std::unique_ptr<Gpio> reload_; // codes reload - port 70
|
||||
std::unique_ptr<Gpio> cfg_; // configuration reload - port 71
|
||||
std::unique_ptr<GpioOut> reset_; // circuit reset - port Fpga_Reset
|
||||
std::unique_ptr<Gpio> reset_; // circuit reset - port Fpga_Reset
|
||||
|
||||
public:
|
||||
controller();
|
||||
|
@ -163,7 +164,7 @@ class FpgaComm : public IRegsAccess
|
|||
std::unique_ptr<controller> controller_;
|
||||
|
||||
public:
|
||||
FpgaComm(int bauds = 921600);
|
||||
FpgaComm(int bauds = 921600, bool query = false);
|
||||
virtual ~FpgaComm(){}
|
||||
|
||||
enum { CIS_SECTOR_COUNT = 6 }; // how many sectors of ONE CIS
|
||||
|
@ -212,12 +213,14 @@ public:
|
|||
void setDelayTime(int value);
|
||||
void setTrigMode(bool isArmMode);
|
||||
|
||||
void update();
|
||||
bool update();
|
||||
void enableJamCheck(bool b);
|
||||
void resetADC();
|
||||
virtual bool write(unsigned int addr, unsigned int val);
|
||||
virtual bool read(unsigned int addr, unsigned int& val);
|
||||
|
||||
bool is_ok(void);
|
||||
|
||||
private:
|
||||
FpgaParams fpgaParams;
|
||||
std::shared_ptr<IRegsAccess> m_regsAccess;
|
||||
|
|
|
@ -221,7 +221,6 @@ void gVideo::uninit_device(void)
|
|||
struct v4l2_requestbuffers req;
|
||||
CLEAR(req);
|
||||
req.count = 0;
|
||||
LOG_TRACE(utils::format_string("frame count: %d\n", req.count));
|
||||
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
req.memory = V4L2_MEMORY_USERPTR;
|
||||
|
||||
|
@ -232,6 +231,10 @@ void gVideo::uninit_device(void)
|
|||
else
|
||||
utils::to_log(LOG_LEVEL_FATAL, "VIDIOC_REQBUFS\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_TRACE(utils::format_string("rest frame count: %d\n", req.count));
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_buffers; ++i)
|
||||
free(buffers[i].start);
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -69,6 +69,7 @@ class scanner_hw : public sane_opt_provider
|
|||
|
||||
|
||||
void init(void);
|
||||
void init_version(std::string& text);
|
||||
void thread_image_capture(void);
|
||||
bool is_scan_fatal(void);
|
||||
void retrieve_v4l2_mem(safe_fifo<int>* mem, int* used);
|
||||
|
@ -90,6 +91,7 @@ public:
|
|||
int start_scan(void);
|
||||
int stop_scan(void);
|
||||
int close(void);
|
||||
bool is_scanning(void);
|
||||
};
|
||||
// {
|
||||
// "mode": {
|
||||
|
@ -556,5 +558,34 @@ public:
|
|||
// "step": 1
|
||||
// },
|
||||
// "depend": "is-check-askew==true"
|
||||
// },
|
||||
// "motor-ver": {
|
||||
// "cat": "none",
|
||||
// "group": "关于",
|
||||
// "title": "电机驱动版本",
|
||||
// "desc": "电机板驱动程序版本号",
|
||||
// "type": "string",
|
||||
// "fix-id": 34909,
|
||||
// "ui-pos": 16,
|
||||
// "auth": 0,
|
||||
// "readonly": true,
|
||||
// "size": 24,
|
||||
// "auto": false,
|
||||
// "cur": "",
|
||||
// "default": ""
|
||||
// },
|
||||
// "fpga-ver": {
|
||||
// "cat": "none",
|
||||
// "group": "关于",
|
||||
// "title": "CIS控制器版本",
|
||||
// "desc": "镜头参数控制驱动程序版本号",
|
||||
// "type": "string",
|
||||
// "ui-pos": 17,
|
||||
// "auth": 0,
|
||||
// "readonly": true,
|
||||
// "size": 24,
|
||||
// "auto": false,
|
||||
// "cur": "",
|
||||
// "default": ""
|
||||
// }
|
||||
// }
|
||||
|
|
|
@ -13,10 +13,18 @@
|
|||
static const std::string loggername = "MotorBoard";
|
||||
|
||||
|
||||
MotorBoard::MotorBoard()
|
||||
: devPort(MOTOR_UART),
|
||||
m_glue({nullptr, nullptr, nullptr,nullptr,nullptr,nullptr})
|
||||
MotorBoard::MotorBoard(std::function<void(int, unsigned int)> cbev)
|
||||
: devPort(MOTOR_UART)
|
||||
, cb_event_(cbev)
|
||||
{
|
||||
auto cb_null = [&](int type, unsigned int val) -> void
|
||||
{
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "motorboard event %d value: 0x%08x\n", type, val);
|
||||
};
|
||||
|
||||
if(!cb_event_)
|
||||
cb_event_ = cb_null;
|
||||
|
||||
m_uartEnable.reset(new GpioOut(152));
|
||||
m_uartEnable->setDirection(Gpio::out);
|
||||
// m_uartEnable->setEdge(Gpio::rising);
|
||||
|
@ -33,6 +41,8 @@ static int paperinnum = 0;
|
|||
void MotorBoard::start()
|
||||
{
|
||||
keep_last_paper=false;
|
||||
paperinnum = 0 ;
|
||||
|
||||
unsigned int val;
|
||||
SMBCONFIG *smbc = (SMBCONFIG *)(&val);
|
||||
read(0, val);
|
||||
|
@ -40,7 +50,6 @@ void MotorBoard::start()
|
|||
write(0, val);
|
||||
smbc->enable = 1;
|
||||
write(0, val);
|
||||
paperinnum =0 ;
|
||||
}
|
||||
|
||||
void MotorBoard::stop()
|
||||
|
@ -253,55 +262,50 @@ std::shared_ptr<IRegsAccess> MotorBoard::regs()
|
|||
static int pinindex=0;
|
||||
void MotorBoard::pin_call(unsigned int pinNum)
|
||||
{
|
||||
static int index = 0;
|
||||
utils::to_log(LOG_LEVEL_DEBUG, utils::format_string("pin %d", index++).c_str());
|
||||
int os_m = os_mode();
|
||||
if (m_os_mode != os_m)
|
||||
{
|
||||
m_os_mode = os_m;
|
||||
cv_os_mode.notify_all();
|
||||
if (m_glue.m_os_mode_call)
|
||||
m_glue.m_os_mode_call(m_os_mode);
|
||||
cb_event_(MOTOR_BORD_EVENT_MODE, m_os_mode);
|
||||
}
|
||||
|
||||
if (m_os_mode)
|
||||
{
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "not scan mode");
|
||||
// utils::to_log(LOG_LEVEL_DEBUG, "not scan mode");
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int val;
|
||||
SMBSTATUS *smb_status = (SMBSTATUS *)&val;
|
||||
if (!read(PORT_STATUS, val))
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "read error");
|
||||
utils::to_log(LOG_LEVEL_DEBUG, utils::format_string("status %08x", val).c_str());
|
||||
{
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "read motorboard status failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
utils::to_log(LOG_LEVEL_DEBUG, utils::format_string("motorboard status %08x\n", val).c_str());
|
||||
//printf("\n reg 1 val =%d",val);
|
||||
if(val & 0x800){
|
||||
//printf("\n keep_last_paper ");
|
||||
if(smb_status->keep_last_paper) // (val & 0x800)
|
||||
{
|
||||
keep_last_paper=true;
|
||||
}
|
||||
if(val & 0x1000)
|
||||
if(smb_status->sleep_set) // (val & 0x1000)
|
||||
{
|
||||
if(m_glue.m_set_sleepmode_call)
|
||||
m_glue.m_set_sleepmode_call(val & 0xf000);
|
||||
cb_event_(MOTOR_BORD_EVENT_SLEEP, smb_status->sleep_conf);
|
||||
}
|
||||
if(val & 0x80000)
|
||||
if(smb_status->ml_top_sin) // (val & 0x80000)
|
||||
{
|
||||
if(m_glue.m_mltop_call)
|
||||
m_glue.m_mltop_call(val);
|
||||
cb_event_(MOTOR_BORD_EVENT_LIFTER_READY, smb_status->ml_top_sin);
|
||||
}
|
||||
if(smb_status->paper_auto)
|
||||
{
|
||||
if(m_glue.m_auto_paper)
|
||||
m_glue.m_auto_paper(1);
|
||||
cb_event_(MOTOR_BORD_EVENT_PAPER_READY, smb_status->paper_auto);
|
||||
}
|
||||
if (val & 0xAFE)
|
||||
if (val & STATUS_ERROR_MASK)
|
||||
{
|
||||
cv_error.notify_all();
|
||||
if (m_glue.m_error_call)
|
||||
m_glue.m_error_call(val & 0x30efe); //0xefe index of 16:aquireimage error index of bit 17 :size check error
|
||||
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "error");
|
||||
cb_event_(MOTOR_BORD_EVENT_ERROR, val & STATUS_ERROR_MASK);
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
@ -309,23 +313,21 @@ void MotorBoard::pin_call(unsigned int pinNum)
|
|||
if (!smb_status->scan_pulse)
|
||||
{
|
||||
cv_paper_in.notify_all();
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "paper in");
|
||||
printf("\n paper pulse num = %d ", paperinnum++);
|
||||
paperinnum++;
|
||||
cb_event_(MOTOR_BORD_EVENT_PAPER_PASSING, 1);
|
||||
}
|
||||
|
||||
|
||||
if(smb_status->paper_left)
|
||||
{
|
||||
cv_paper_out.notify_all();
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "paper left");
|
||||
cb_event_(MOTOR_BORD_EVENT_PAPER_PASSING, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (val & 0x400)
|
||||
if (smb_status->motor_status) // (val & 0x400)
|
||||
{
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "done");
|
||||
cv_scan_done.notify_all();
|
||||
if (m_glue.m_scan_done_call)
|
||||
m_glue.m_scan_done_call();
|
||||
cb_event_(MOTOR_BORD_EVENT_SCAN_DONE, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -347,10 +349,6 @@ bool MotorBoard::read(unsigned int addr, unsigned int &val)
|
|||
return m_regsAccess->read(addr, val);
|
||||
}
|
||||
|
||||
void MotorBoard::set_callbacks(MotorBoardGlue glue)
|
||||
{
|
||||
m_glue = glue;
|
||||
}
|
||||
|
||||
bool MotorBoard::set_screw_inpect(bool enable)
|
||||
{
|
||||
|
|
|
@ -37,34 +37,44 @@ typedef struct SMB_CONFIG
|
|||
|
||||
typedef struct SMB_STATUS
|
||||
{
|
||||
unsigned int scan_pulse : 1;
|
||||
unsigned int m1_paper_sin : 1;
|
||||
unsigned int open_machine : 1;
|
||||
unsigned int pick_failed : 1;
|
||||
unsigned int stop_jam : 1; // 5
|
||||
unsigned int double_paper : 1;
|
||||
unsigned int staple : 1;
|
||||
unsigned int papertilted : 1;
|
||||
unsigned int count_pulse : 1;
|
||||
unsigned int scan_mode_change : 1; // 5
|
||||
unsigned int motor_status : 1;
|
||||
unsigned int keep_last_paper : 1;
|
||||
unsigned int sleep_set : 1;
|
||||
unsigned int sleep_conf : 3;
|
||||
unsigned int dsp_get_paper_error : 1;
|
||||
unsigned int paper_check_result : 1;
|
||||
unsigned int top_wuzhi : 1;
|
||||
unsigned int ml_top_sin : 1; // 10
|
||||
unsigned int paper_auto : 1;
|
||||
unsigned int paper_left : 1;
|
||||
unsigned int scan_pulse : 1; // 0x000001
|
||||
unsigned int m1_paper_sin : 1; // 0x000002
|
||||
unsigned int open_machine : 1; // 0x000004
|
||||
unsigned int pick_failed : 1; // 0x000008
|
||||
|
||||
unsigned int stop_jam : 1; // 5 // 0x000010
|
||||
unsigned int double_paper : 1; // 0x000020
|
||||
unsigned int staple : 1; // 0x000040
|
||||
unsigned int papertilted : 1; // 0x000080
|
||||
|
||||
unsigned int count_pulse : 1; // 0x000100
|
||||
unsigned int scan_mode_change : 1; // 5 // 0x000200
|
||||
unsigned int motor_status : 1; // 0x000400
|
||||
unsigned int keep_last_paper : 1; // 0x000800
|
||||
|
||||
unsigned int sleep_set : 1; // 0x001000
|
||||
unsigned int sleep_conf : 3; // 0x00e000
|
||||
|
||||
unsigned int dsp_get_paper_error : 1; // 0x010000
|
||||
unsigned int paper_check_result : 1; // 0x020000
|
||||
unsigned int top_wuzhi : 1; // 0x040000
|
||||
unsigned int ml_top_sin : 1; // 10 // 0x080000
|
||||
|
||||
unsigned int paper_auto : 1; // 0x100000
|
||||
unsigned int paper_left : 1; // 0x200000
|
||||
} SMBSTATUS;
|
||||
#define STATUS_ERROR_MASK 0x30EFE
|
||||
|
||||
typedef struct SMB_MODE
|
||||
{
|
||||
unsigned int scan_num : 14;
|
||||
unsigned int scan_mode : 2;
|
||||
|
||||
unsigned int feeding_paper_ready : 1;
|
||||
unsigned int work_status : 1;
|
||||
unsigned int paper_jammed_in : 2;
|
||||
|
||||
unsigned int paper_jammed_out : 1;
|
||||
} SMBMODE;
|
||||
|
||||
typedef struct SMB_CONFIG_EXT
|
||||
|
@ -75,30 +85,6 @@ typedef struct SMB_CONFIG_EXT
|
|||
unsigned int cuo_speed : 7;
|
||||
} SMBCONFIGEXT;
|
||||
|
||||
struct MotorBoardGlue
|
||||
{
|
||||
MotorBoardGlue(const std::function<void(unsigned int)> error_call,
|
||||
const std::function<void()> scan_done_call,
|
||||
const std::function<void(unsigned int)> os_mode_call,
|
||||
const std::function<void(unsigned int)> set_sleepmode_call,
|
||||
const std::function<void(unsigned int)> mltop_call,
|
||||
std::function<void(unsigned int)> auto_paper)
|
||||
: m_error_call(error_call),
|
||||
m_scan_done_call(scan_done_call),
|
||||
m_os_mode_call(os_mode_call),
|
||||
m_set_sleepmode_call(set_sleepmode_call),
|
||||
m_mltop_call(mltop_call),
|
||||
m_auto_paper(auto_paper)
|
||||
{
|
||||
}
|
||||
|
||||
std::function<void(unsigned int)> m_error_call;
|
||||
std::function<void()> m_scan_done_call;
|
||||
std::function<void(unsigned int)> m_os_mode_call;
|
||||
std::function<void(unsigned int)> m_set_sleepmode_call;
|
||||
std::function<void(unsigned int)> m_mltop_call;
|
||||
std::function<void(unsigned int)> m_auto_paper;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -116,10 +102,23 @@ enum
|
|||
SPEED_PPM_BASE_30,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOTOR_BORD_EVENT_MODE = 1, // os mode changed, value = new mode
|
||||
MOTOR_BORD_EVENT_SLEEP, //
|
||||
MOTOR_BORD_EVENT_LIFTER_READY, //
|
||||
MOTOR_BORD_EVENT_PAPER_READY,
|
||||
MOTOR_BORD_EVENT_PAPER_PASSING, // value = 0: paper left, 1: paper is passing through the sensor
|
||||
MOTOR_BORD_EVENT_SCAN_DONE,
|
||||
MOTOR_BORD_EVENT_ERROR, // value = SMBSTATUS
|
||||
};
|
||||
|
||||
class MotorBoard
|
||||
{
|
||||
std::function<void(int, unsigned int)> cb_event_;
|
||||
|
||||
public:
|
||||
MotorBoard();
|
||||
MotorBoard(std::function<void(int, unsigned int)> cbev = std::function<void(int, unsigned int)>());
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
|
@ -153,7 +152,6 @@ public:
|
|||
bool set_paper_inpect_info(unsigned int value);
|
||||
bool set_paper_inspect(bool enable = true);
|
||||
bool set_cuospeed(unsigned int speed);
|
||||
void set_callbacks(MotorBoardGlue glue);
|
||||
bool get_keeplastpaper();
|
||||
bool en_testbit(bool en);
|
||||
std::shared_ptr<IRegsAccess> regs();
|
||||
|
@ -179,6 +177,5 @@ private:
|
|||
AutoSemaphore cv_os_mode;
|
||||
unsigned int m_os_mode;
|
||||
volatile bool keep_last_paper;
|
||||
MotorBoardGlue m_glue;
|
||||
bool b_paperin;
|
||||
};
|
|
@ -14,6 +14,7 @@
|
|||
#include <huagao/hgscanner_error.h>
|
||||
#include "scanner_const_opts.h"
|
||||
#include <hardware.h>
|
||||
#include <base/user.h>
|
||||
|
||||
|
||||
|
||||
|
@ -30,7 +31,7 @@ async_scanner::async_scanner() : usb_(nullptr), cfg_mgr_(nullptr), scan_id_(0)
|
|||
{
|
||||
utils::init_log(LOG_TYPE_FILE);
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "System info: page-size = %u, mapping-page-size = %u, disk-cluster-size = %u.\n"
|
||||
, sys_info::page_size, sys_info::page_map_size, sys_info::cluster_size);
|
||||
, global_info::page_size, global_info::page_map_size, global_info::cluster_size);
|
||||
init();
|
||||
|
||||
auto bulk_handle = [&](dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* required) -> dyn_mem_ptr
|
||||
|
@ -52,18 +53,22 @@ async_scanner::async_scanner() : usb_(nullptr), cfg_mgr_(nullptr), scan_id_(0)
|
|||
|
||||
auto user = [&](int priv) -> bool
|
||||
{
|
||||
return true;
|
||||
return user_->has_privilege(priv);
|
||||
};
|
||||
auto on_log = [&](const char* msg) -> void
|
||||
{
|
||||
utils::log_info(msg, LOG_LEVEL_DEBUG);
|
||||
};
|
||||
|
||||
cfg_mgr_ = new device_option(true, user, on_log);
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "OPT - initializing ...\n");
|
||||
const_opts_ = new scanner_const_opts();
|
||||
user_ = new user_priv();
|
||||
|
||||
cfg_mgr_->add(const_opts_);
|
||||
cis_->set_value(SANE_FULL_NAME(DEVICE_MODEL), &cfg_mgr_->get_option_value(SANE_FULL_NAME(DEVICE_MODEL), SANE_ACTION_GET_VALUE)[0]);
|
||||
cfg_mgr_->add(cis_);
|
||||
cfg_mgr_->add(user_);
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "OPT - initialized %u options.\n", cfg_mgr_->count());
|
||||
|
||||
usb_ = new async_usb_gadget(bulk_handle, on_connect);
|
||||
|
@ -94,6 +99,7 @@ async_scanner::~async_scanner()
|
|||
v->release();
|
||||
send_files_.clear();
|
||||
const_opts_->release();
|
||||
user_->release();
|
||||
|
||||
utils::uninit();
|
||||
}
|
||||
|
@ -165,6 +171,22 @@ void async_scanner::init(void)
|
|||
{
|
||||
cis_ = new scanner_hw();
|
||||
}
|
||||
bool async_scanner::on_energy_conservation(bool normal)
|
||||
{
|
||||
bool enable = true;
|
||||
|
||||
if(normal)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if(cis_->is_scanning())
|
||||
enable = false;
|
||||
}
|
||||
|
||||
return enable;
|
||||
}
|
||||
|
||||
dyn_mem_ptr async_scanner::handle_simple_roger(LPPACK_BASE pack, uint32_t* used, packet_data_base_ptr* required)
|
||||
{
|
||||
|
@ -232,7 +254,8 @@ dyn_mem_ptr async_scanner::handle_get_opt_all(LPPACK_BASE pack, uint32_t* used,
|
|||
return reply;
|
||||
}
|
||||
dyn_mem_ptr async_scanner::handle_set_opt(LPPACK_BASE pack, uint32_t* used, packet_data_base_ptr* required)
|
||||
{ uint32_t base_head_size = sizeof(PACK_BASE);
|
||||
{
|
||||
uint32_t base_head_size = sizeof(PACK_BASE);
|
||||
dyn_mem_ptr reply = nullptr;
|
||||
LPPACK_BASE pk = nullptr;
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ class img_processor;
|
|||
class gb_json;
|
||||
class scanner_const_opts;
|
||||
class scanner_hw;
|
||||
class user_priv;
|
||||
|
||||
class async_scanner : public refer
|
||||
{
|
||||
|
@ -24,6 +25,7 @@ class async_scanner : public refer
|
|||
device_option *cfg_mgr_ = nullptr;
|
||||
scanner_const_opts *const_opts_ = nullptr;
|
||||
scanner_hw *cis_ = nullptr;
|
||||
user_priv *user_ = nullptr;
|
||||
|
||||
MUTEX locker_;
|
||||
volatile bool connected_ = false;
|
||||
|
@ -38,6 +40,7 @@ class async_scanner : public refer
|
|||
|
||||
dyn_mem_ptr handle_bulk_cmd(LPPACK_BASE pack, uint32_t* used, packet_data_base_ptr* required);
|
||||
void init(void);
|
||||
bool on_energy_conservation(bool normal/*true - working status; false - go to sleep*/); // return true to enable get into 'normal' status
|
||||
|
||||
dyn_mem_ptr handle_simple_roger(LPPACK_BASE pack, uint32_t* used, packet_data_base_ptr* required);
|
||||
dyn_mem_ptr handle_get_opt_value(LPPACK_BASE pack, uint32_t* used, packet_data_base_ptr* required);
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// option json:
|
||||
static std::string device_opt_json[] = {
|
||||
"{\"dev-vid\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"USB-VID\",\"desc\":\"\\u8bbe\\u5907\\u5236\\u9020\\u5546\\u5728USB\\u7ec4\\u7ec7\\u7684ID\",\"type\":\"string\",\"fix-id\":34898,\"ui-pos\":10,\"auth\":0,\"readonly\":true,\"size\":16,\"auto\":false,\"cur\":\"3072\",\"default\":\"3072\"},\"dev-pid\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"USB-PID\",\"desc\":\"\\u8bbe\\u5907\\u5728USB\\u7ec4\\u7ec7\\u4e2d\\u7684\\u4ea7\\u54c1ID\",\"type\":\"string\",\"fix-id\":34899,\"ui-pos\":11,\"auth\":0,\"readonly\":true,\"size\":16,\"auto\":false,\"cur\":\"0306\",\"default\":\"0306\"},\"dev-name\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"desc\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34900,\"ui-pos\":12,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"300NewTx\",\"default\":\"300NewTx\"},\"dev-model\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u4ea7\\u54c1\\u7cfb\\u5217\",\"desc\":\"\\u8bbe\\u5907\\u6240\\u5c5e\\u4ea7\\u54c1\\u7cfb\\u5217\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34901,\"ui-pos\":13,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"G300\",\"default\":\"G300\"},\"dev-sn\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u5e8f\\u5217\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u5e8f\\u5217\\u53f7\",\"type\":\"string\",\"fix-id\":34902,\"ui-pos\":14,\"auth\":0,\"readonly\":true,\"size\":32,\"auto\":false,\"ownread\":true,\"cur\":\"GB20231201\",\"default\":\"GB20231201\"},\"fmw-ver\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u56fa\\u4ef6\\u7248\\u672c\",\"desc\":\"\\u8bbe\\u5907\\u56fa\\u4ef6\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"fix-id\":34903,\"ui-pos\":15,\"auth\":0,\"readonly\":true,\"size\":32,\"auto\":false,\"cur\":\"G2393B0500\",\"default\":\"G2393B0500\"},\"roller-life\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u6eda\\u8f74\\u5bff\\u547d\",\"desc\":\"\\u8be5\\u8bbe\\u5907\\u6eda\\u8f74\\u8fc7\\u7eb8\\u7684\\u6700\\u5927\\u5f20\\u6570\",\"type\":\"int\",\"fix-id\":34907,\"ui-pos\":16,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":450000,\"default\":450000},\"ip-addr\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"IP\",\"desc\":\"\\u8bbe\\u5907\\u8054\\u7f51\\u65f6\\u6240\\u5206\\u914d\\u7684IP\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34904,\"ui-pos\":20,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"},\"mac-addr\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"MAC\",\"desc\":\"\\u8bbe\\u5907\\u7f51\\u5361\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34905,\"ui-pos\":21,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"}}"
|
||||
"{\"dev-vid\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"USB-VID\",\"desc\":\"\\u8bbe\\u5907\\u5236\\u9020\\u5546\\u5728USB\\u7ec4\\u7ec7\\u7684ID\",\"type\":\"string\",\"fix-id\":34898,\"ui-pos\":10,\"auth\":0,\"readonly\":true,\"size\":16,\"auto\":false,\"cur\":\"3072\",\"default\":\"3072\"},\"dev-pid\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"USB-PID\",\"desc\":\"\\u8bbe\\u5907\\u5728USB\\u7ec4\\u7ec7\\u4e2d\\u7684\\u4ea7\\u54c1ID\",\"type\":\"string\",\"fix-id\":34899,\"ui-pos\":11,\"auth\":0,\"readonly\":true,\"size\":16,\"auto\":false,\"cur\":\"0306\",\"default\":\"0306\"},\"dev-name\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"desc\":\"\\u8bbe\\u5907\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34900,\"ui-pos\":12,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"300NewTx\",\"default\":\"300NewTx\"},\"dev-model\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u4ea7\\u54c1\\u7cfb\\u5217\",\"desc\":\"\\u8bbe\\u5907\\u6240\\u5c5e\\u4ea7\\u54c1\\u7cfb\\u5217\\u540d\\u79f0\",\"type\":\"string\",\"fix-id\":34901,\"ui-pos\":13,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"cur\":\"G300\",\"default\":\"G300\"},\"dev-sn\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u5e8f\\u5217\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u5e8f\\u5217\\u53f7\",\"type\":\"string\",\"fix-id\":34902,\"ui-pos\":14,\"auth\":0,\"readonly\":true,\"size\":32,\"auto\":false,\"ownread\":true,\"cur\":\"GB20231201\",\"default\":\"GB20231201\"},\"fmw-ver\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u56fa\\u4ef6\\u7248\\u672c\",\"desc\":\"\\u8bbe\\u5907\\u56fa\\u4ef6\\u7248\\u672c\\u53f7\",\"type\":\"string\",\"fix-id\":34903,\"ui-pos\":15,\"auth\":0,\"readonly\":true,\"size\":32,\"auto\":false,\"cur\":\"G2393B0500\",\"default\":\"G2393B0500\"},\"roller-life\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u6eda\\u8f74\\u5bff\\u547d\",\"desc\":\"\\u8be5\\u8bbe\\u5907\\u6eda\\u8f74\\u8fc7\\u7eb8\\u7684\\u6700\\u5927\\u5f20\\u6570\",\"type\":\"int\",\"fix-id\":34907,\"ui-pos\":20,\"auth\":0,\"readonly\":true,\"size\":4,\"auto\":false,\"cur\":450000,\"default\":450000},\"ip-addr\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"IP\",\"desc\":\"\\u8bbe\\u5907\\u8054\\u7f51\\u65f6\\u6240\\u5206\\u914d\\u7684IP\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34904,\"ui-pos\":21,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"},\"mac-addr\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"MAC\",\"desc\":\"\\u8bbe\\u5907\\u7f51\\u5361\\u5730\\u5740\",\"type\":\"string\",\"fix-id\":34905,\"ui-pos\":22,\"auth\":0,\"readonly\":true,\"size\":96,\"auto\":false,\"ownread\":true,\"cur\":\"0\",\"default\":\"0\"}}"
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -125,7 +125,7 @@ public:
|
|||
// "desc": "该设备滚轴过纸的最大张数",
|
||||
// "type": "int",
|
||||
// "fix-id": 34907,
|
||||
// "ui-pos": 16,
|
||||
// "ui-pos": 20,
|
||||
// "auth": 0,
|
||||
// "readonly": true,
|
||||
// "size": 4,
|
||||
|
@ -140,7 +140,7 @@ public:
|
|||
// "desc": "设备联网时所分配的IP地址",
|
||||
// "type": "string",
|
||||
// "fix-id": 34904,
|
||||
// "ui-pos": 20,
|
||||
// "ui-pos": 21,
|
||||
// "auth": 0,
|
||||
// "readonly": true,
|
||||
// "size": 96,
|
||||
|
@ -156,7 +156,7 @@ public:
|
|||
// "desc": "设备网卡地址",
|
||||
// "type": "string",
|
||||
// "fix-id": 34905,
|
||||
// "ui-pos": 21,
|
||||
// "ui-pos": 22,
|
||||
// "auth": 0,
|
||||
// "readonly": true,
|
||||
// "size": 96,
|
||||
|
@ -165,4 +165,4 @@ public:
|
|||
// "cur": "0",
|
||||
// "default": "0"
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
|
|
@ -10,28 +10,6 @@
|
|||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// sys_info
|
||||
uint32_t sys_info::page_size = 0;
|
||||
uint32_t sys_info::page_map_size = 0;
|
||||
uint32_t sys_info::cluster_size = 0;
|
||||
|
||||
sys_info::sys_info()
|
||||
{
|
||||
sys_info::page_size = utils::get_page_size(&sys_info::page_map_size);
|
||||
|
||||
std::string path(utils::get_local_data_path());
|
||||
unsigned long long cluster = 0;
|
||||
|
||||
utils::get_disk_space(path.c_str(), nullptr, nullptr, &cluster);
|
||||
sys_info::cluster_size = cluster;
|
||||
|
||||
printf("Page size: %u\nMap size: %u\nCluster : %u\n", sys_info::page_size, sys_info::page_map_size, sys_info::cluster_size);
|
||||
}
|
||||
sys_info::~sys_info()
|
||||
{}
|
||||
|
||||
static sys_info g_si;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
|
|
@ -76,17 +76,6 @@ public:
|
|||
uint8_t* buffer(void);
|
||||
};
|
||||
|
||||
class sys_info
|
||||
{
|
||||
public:
|
||||
sys_info();
|
||||
~sys_info();
|
||||
|
||||
public:
|
||||
static uint32_t page_size;
|
||||
static uint32_t page_map_size;
|
||||
static uint32_t cluster_size;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
|
|
@ -126,33 +126,6 @@ enum img_cb_type
|
|||
IMG_CB_STOPPED,
|
||||
};
|
||||
|
||||
enum scanner_status
|
||||
{
|
||||
SCANNER_STATUS_READY = 0x10000, // status beginning, avoiding conficts with standards/system error code
|
||||
SCANNER_STATUS_NOT_OPEN,
|
||||
SCANNER_STATUS_LOST_CONNECT,
|
||||
SCANNER_STATUS_RESET_BULK,
|
||||
SCANNER_STATUS_START_SCANNING, // start ok, but scanning-thread not working
|
||||
SCANNER_STATUS_SCANNING, // start ok, and scanning-thread is working
|
||||
SCANNER_STATUS_SCAN_FINISHED, // not a persistance status
|
||||
SCANNER_STATUS_BUSY, // doing task exclude scanning
|
||||
SCANNER_STATUS_COVER_OPENNED,
|
||||
SCANNER_STATUS_COVER_CLOSED,
|
||||
SCANNER_STATUS_SLEEPING,
|
||||
SCANNER_STATUS_WAKED_UP,
|
||||
SCANNER_STATUS_COUNT_MODE,
|
||||
SCANNER_STATUS_DOUBLE_FEEDED,
|
||||
SCANNER_STATUS_PAPER_JAMMED,
|
||||
SCANNER_STATUS_PAPER_ASKEW,
|
||||
SCANNER_STATUS_FEED_FAILED,
|
||||
SCANNER_STATUS_NO_PAPER,
|
||||
SCANNER_STATUS_PAPER_ON,
|
||||
SCANNER_STATUS_STAPLE_ON,
|
||||
SCANNER_STATUS_SIZE_ERR,
|
||||
SCANNER_STATUS_DOGEAR,
|
||||
SCANNER_STATUS_CFG_CHANGED, // PACK_BASE::payload - LPCFGVAL
|
||||
};
|
||||
|
||||
// option affection if value changed, see SANE_INFO_xxx
|
||||
enum opt_affect
|
||||
{
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#define ALIGN_TO(v, align) (((v) + (align) - 1) / (align) * (align))
|
||||
#define ALIGN_INT(v) ALIGN_TO(v, sizeof(int))
|
||||
#define CLEAN_ARRAY(a) memset(a, 0, sizeof(a))
|
||||
#define BMP_LINE_BYTES(bits) (((bits) + 31) / 32 * 4)
|
||||
|
||||
#define RETURN_ENUM_STR(v, e) \
|
||||
if(v == e) \
|
||||
|
|
|
@ -0,0 +1,167 @@
|
|||
#include "user.h"
|
||||
|
||||
|
||||
|
||||
#include <huagao/hgscanner_error.h>
|
||||
#include <string.h>
|
||||
#include <base/ini_file.h>
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// json ...
|
||||
|
||||
static std::string device_opt_json[] = {
|
||||
"{\"user-name\":{\"cat\":\"none\",\"group\":\"\\u7528\\u6237\",\"title\":\"\\u7528\\u6237\\u540d\",\"desc\":\"\\u767b\\u5f55\\u7528\\u6237\\u8d26\\u53f7\",\"type\":\"string\",\"fix-id\":39173,\"ui-pos\":10,\"auth\":0,\"size\":32,\"cur\":\"\",\"default\":\"\"},\"user-pwd\":{\"cat\":\"none\",\"group\":\"\\u7528\\u6237\",\"title\":\"\\u5bc6\\u7801\",\"desc\":\"\\u767b\\u5f55\\u7528\\u6237\\u8d26\\u53f7\\u5bc6\\u7801\",\"type\":\"string\",\"fix-id\":39174,\"ui-pos\":11,\"auth\":0,\"size\":32,\"cur\":\"\",\"default\":\"\"},\"login\":{\"cat\":\"none\",\"group\":\"\\u7528\\u6237\",\"title\":\"\\u767b\\u5f55\",\"desc\":\"\\u7528\\u6237\\u767b\\u5f55\",\"type\":\"button\",\"fix-id\":39168,\"ui-pos\":20,\"auth\":0,\"affect\":6,\"size\":4,\"auto\":false},\"logout\":{\"cat\":\"none\",\"group\":\"\\u7528\\u6237\",\"title\":\"\\u6ce8\\u9500\",\"desc\":\"\\u7528\\u6237\\u767b\\u51fa\",\"type\":\"button\",\"fix-id\":39169,\"ui-pos\":21,\"auth\":0,\"affect\":6,\"size\":4,\"auto\":false},\"dev-sn\":{\"cat\":\"base\",\"group\":\"\\u5173\\u4e8e\",\"title\":\"\\u5e8f\\u5217\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u5e8f\\u5217\\u53f7\",\"type\":\"string\",\"pos\":100,\"fix-id\":34902,\"ui-pos\":14,\"auth\":0,\"size\":32,\"auto\":false,\"cur\":\"\",\"default\":\"\"}}"
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
std::string name;
|
||||
int priv;
|
||||
}g_user_priv[] = { {"user", USER_PRIVILEGE_COMMON}
|
||||
, {"admin", USER_PRIVILEGE_LOCAL_MGR}
|
||||
, {"owner", USER_PRIVILEGE_TECH_SUPPORTING}
|
||||
, {"developer", USER_PRIVILEGE_DEVLOPER}
|
||||
};
|
||||
|
||||
static std::string base64_table = "!@#$_~=;/+";
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// user_priv
|
||||
user_priv::user_priv()
|
||||
{
|
||||
simple_ini ini;
|
||||
std::string text("");
|
||||
|
||||
cfg_file_ = utils::get_local_data_path() + PATH_SEPARATOR + "config";
|
||||
utils::create_folder(cfg_file_.c_str());
|
||||
cfg_file_ += std::string(PATH_SEPARATOR) + "user.txt";
|
||||
|
||||
ini.load(cfg_file_.c_str());
|
||||
for(auto& v: g_user_priv)
|
||||
login_times_[v.name] = atoi(ini.get(v.name.c_str(), "login", "0").c_str());
|
||||
|
||||
set_where("user");
|
||||
for(auto& v : device_opt_json)
|
||||
text += v;
|
||||
set_opt_json_text(&text[0]);
|
||||
}
|
||||
user_priv::~user_priv()
|
||||
{
|
||||
simple_ini ini;
|
||||
|
||||
ini.load(cfg_file_.c_str());
|
||||
for(auto& v: login_times_)
|
||||
{
|
||||
if(v.second)
|
||||
ini.set(v.first.c_str(), "login", std::to_string(v.second).c_str());
|
||||
}
|
||||
ini.save(cfg_file_.c_str());
|
||||
}
|
||||
|
||||
bool user_priv::login(void)
|
||||
{
|
||||
bool ok = false;
|
||||
|
||||
for(auto& v: g_user_priv)
|
||||
{
|
||||
if(v.name == name_)
|
||||
{
|
||||
if(name_ == "user")
|
||||
{
|
||||
ok = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ok = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
void user_priv::reset_privilege(void)
|
||||
{
|
||||
priv_ = USER_PRIVILEGE_COMMON;
|
||||
for(auto& v : g_user_priv)
|
||||
{
|
||||
if(v.name == name_)
|
||||
{
|
||||
priv_ = v.priv;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// sane_opt_provider
|
||||
int user_priv::set_value(const char* name, void* val)
|
||||
{
|
||||
int ret = SCANNER_ERR_OK;
|
||||
|
||||
if(strcmp(name, SANE_FULL_NAME(USER_NAME)) == 0)
|
||||
{
|
||||
name_ = (char*)val;
|
||||
priv_ = USER_PRIVILEGE_COMMON;
|
||||
}
|
||||
else if(strcmp(name, SANE_FULL_NAME(USER_PASSWORD)) == 0)
|
||||
{
|
||||
pwd_ = (char*)val;
|
||||
priv_ = USER_PRIVILEGE_COMMON;
|
||||
}
|
||||
else if(strcmp(name, SANE_FULL_NAME(DEVICE_SERIAL_NO)) == 0)
|
||||
{
|
||||
dev_sn_ = (char*)val;
|
||||
utils::to_log(LOG_LEVEL_DEBUG, "set user device SN: %s\n", dev_sn_.c_str());
|
||||
priv_ = USER_PRIVILEGE_COMMON;
|
||||
}
|
||||
else if(strcmp(name, SANE_FULL_NAME(LOGIN)) == 0)
|
||||
{
|
||||
// login ...
|
||||
if(login_times_.count(name) == 0)
|
||||
{
|
||||
ret = SCANNER_ERR_INVALID_USER_NAME;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(login())
|
||||
{
|
||||
simple_ini ini;
|
||||
|
||||
ini.load(cfg_file_.c_str());
|
||||
login_times_[name]++;
|
||||
reset_privilege();
|
||||
ini.set(name, "login", std::to_string(login_times_[name]).c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = SCANNER_ERR_INVALID_PASSWORD;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(strcmp(name, SANE_FULL_NAME(LOGOUT)) == 0)
|
||||
{
|
||||
name_ = pwd_ = "";
|
||||
reset_privilege();
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = SCANNER_ERR_DEVICE_NOT_SUPPORT;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool user_priv::has_privilege(int priv)
|
||||
{
|
||||
return priv_ >= priv;
|
||||
}
|
||||
int user_priv::get_current_user_login_times(void)
|
||||
{
|
||||
if(login_times_.count(name_))
|
||||
return login_times_[name_];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
// user management
|
||||
//
|
||||
// Date: 2024-01-04
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <base/utils.h>
|
||||
#include <sane/sane_ex.h>
|
||||
#include <map>
|
||||
#include <sane_opt_json/base_opt.h>
|
||||
|
||||
|
||||
// name password time-limit
|
||||
//
|
||||
// developer calc(dev-sn + login-times) 6min
|
||||
//
|
||||
// owner calc(dev-sn + login-times) 30min
|
||||
//
|
||||
// admin dev-sn 1hour
|
||||
//
|
||||
// user none, default level always
|
||||
//
|
||||
|
||||
|
||||
class user_priv : public sane_opt_provider
|
||||
{
|
||||
std::map<std::string, int> login_times_;
|
||||
std::string cfg_file_;
|
||||
std::string dev_sn_ = "01234567AABBCCDDEE";
|
||||
std::string name_;
|
||||
std::string pwd_;
|
||||
|
||||
int priv_ = USER_PRIVILEGE_COMMON;
|
||||
|
||||
bool login(void);
|
||||
void reset_privilege(void);
|
||||
|
||||
public:
|
||||
user_priv();
|
||||
|
||||
protected:
|
||||
~user_priv();
|
||||
|
||||
// sane_opt_provider
|
||||
public:
|
||||
virtual int set_value(const char* name, void* val) override;
|
||||
|
||||
public:
|
||||
bool has_privilege(int priv);
|
||||
int get_current_user_login_times(void);
|
||||
};
|
||||
|
||||
// {
|
||||
// "user-name": {
|
||||
// "cat": "none",
|
||||
// "group": "用户",
|
||||
// "title": "用户名",
|
||||
// "desc": "登录用户账号",
|
||||
// "type": "string",
|
||||
// "fix-id": 39173,
|
||||
// "ui-pos": 10,
|
||||
// "auth": 0,
|
||||
// "size": 32,
|
||||
// "cur": "",
|
||||
// "default": ""
|
||||
// },
|
||||
// "user-pwd": {
|
||||
// "cat": "none",
|
||||
// "group": "用户",
|
||||
// "title": "密码",
|
||||
// "desc": "登录用户账号密码",
|
||||
// "type": "string",
|
||||
// "fix-id": 39174,
|
||||
// "ui-pos": 11,
|
||||
// "auth": 0,
|
||||
// "size": 32,
|
||||
// "cur": "",
|
||||
// "default": ""
|
||||
// },
|
||||
// "login": {
|
||||
// "cat": "none",
|
||||
// "group": "用户",
|
||||
// "title": "登录",
|
||||
// "desc": "用户登录",
|
||||
// "type": "button",
|
||||
// "fix-id": 39168,
|
||||
// "ui-pos": 20,
|
||||
// "auth": 0,
|
||||
// "affect": 6,
|
||||
// "size": 4,
|
||||
// "auto": false
|
||||
// },
|
||||
// "logout": {
|
||||
// "cat": "none",
|
||||
// "group": "用户",
|
||||
// "title": "注销",
|
||||
// "desc": "用户登出",
|
||||
// "type": "button",
|
||||
// "fix-id": 39169,
|
||||
// "ui-pos": 21,
|
||||
// "auth": 0,
|
||||
// "affect": 6,
|
||||
// "size": 4,
|
||||
// "auto": false
|
||||
// },
|
||||
// "dev-sn": {
|
||||
// "cat": "base",
|
||||
// "group": "关于",
|
||||
// "title": "序列号",
|
||||
// "desc": "设备序列号",
|
||||
// "type": "string",
|
||||
// "fix-id": 34902,
|
||||
// "ui-pos": 14,
|
||||
// "pos": 100,
|
||||
// "auth": 0,
|
||||
// "size": 32,
|
||||
// "auto": false,
|
||||
// "cur": "",
|
||||
// "default": ""
|
||||
// }
|
||||
// }
|
|
@ -606,7 +606,11 @@ namespace utils
|
|||
ldp += PATH_SEPARATOR;
|
||||
}
|
||||
#else
|
||||
#ifdef BUILD_AS_DEVICE
|
||||
const char* path = "/var/log";
|
||||
#else
|
||||
const char* path(getenv("HOME"));
|
||||
#endif
|
||||
|
||||
if (path)
|
||||
{
|
||||
|
@ -926,11 +930,11 @@ namespace utils
|
|||
HMODULE load_dll(const char* path_file, int flag)
|
||||
{
|
||||
#if OS_WIN
|
||||
HMODULE h = LoadLibraryA(path_file);
|
||||
int ret = GetLastError();
|
||||
HMODULE h = NULL; // LoadLibraryA(path_file);
|
||||
int ret = 0; // GetLastError();
|
||||
|
||||
utils::to_log(1, "[TWAIN]Load: LoadLibraryA(%s) = %d\r\n", path_file, ret);
|
||||
if (!h && (ret == ERROR_MOD_NOT_FOUND || ret == ERROR_BAD_EXE_FORMAT))
|
||||
// utils::to_log(1, "[TWAIN]Load: LoadLibraryA(%s) = %d\r\n", path_file, ret);
|
||||
// if (!h && (ret == ERROR_MOD_NOT_FOUND || ret == ERROR_BAD_EXE_FORMAT))
|
||||
{
|
||||
std::string dir(path_file);
|
||||
size_t pos = dir.rfind('\\');
|
||||
|
@ -1239,6 +1243,53 @@ namespace utils
|
|||
return 0;
|
||||
}
|
||||
|
||||
std::string bitmap_info_header(int pixel_w, int pixel_h, int bpp, int dpix, int dpiy)
|
||||
{
|
||||
BITMAPINFODEADER bih = {0};
|
||||
std::string stream("");
|
||||
|
||||
if(dpiy == 0)
|
||||
dpiy = dpix;
|
||||
bih.biSize = sizeof(bih);
|
||||
bih.biWidth = pixel_w;
|
||||
bih.biHeight = pixel_h;
|
||||
bih.biBitCount = bpp;
|
||||
bih.biSizeImage = BMP_LINE_BYTES(pixel_w * bpp) * pixel_h;
|
||||
bih.biPlanes = 1;
|
||||
bih.biCompression = BI_RGB;
|
||||
bih.biXPelsPerMeter = (LONG)(dpix * 39.37f + .5f);
|
||||
bih.biYPelsPerMeter = (LONG)(dpiy * 39.37f + .5f);
|
||||
stream = std::string((char*)&bih, sizeof(bih));
|
||||
if(bpp == 1)
|
||||
{
|
||||
int pal[] = { 0, 0x0ffffff };
|
||||
stream += std::string((char*)pal, sizeof(pal));
|
||||
bih.biClrUsed = _countof(pal);
|
||||
}
|
||||
else if(bpp == 8)
|
||||
{
|
||||
stream += std::string((char*)global_info::gray_pallete, sizeof(global_info::gray_pallete));
|
||||
bih.biClrUsed = _countof(global_info::gray_pallete);
|
||||
}
|
||||
|
||||
return std::move(stream);
|
||||
}
|
||||
std::string bitmap_file_header(BITMAPINFOHEADER *lpbi) // return BITMAPFILEHEADER
|
||||
{
|
||||
BITMAPFILEHEADER bfh = {0};
|
||||
int pal_size = 0;
|
||||
|
||||
bfh.bfType = MAKEWORD('B', 'M');
|
||||
if(lpbi->biBitCount == 1)
|
||||
pal_size = 2 * sizeof(int);
|
||||
else if(lpbi->biBitCount == 8)
|
||||
pal_size = 256 * sizeof(int);
|
||||
bfh.bfOffBits = sizeof(bfh) + sizeof(BITMAPINFOHEADER) + pal_size;
|
||||
bfh.bfSize = bfh.bfOffBits + lpbi->biSizeImage;
|
||||
|
||||
return std::move(std::string((char*)&bfh, sizeof(bfh)));
|
||||
}
|
||||
|
||||
#if OS_WIN
|
||||
bool run_get_message(HWND hwnd, UINT filter_min, UINT filter_max, std::function<bool(MSG*, bool*)> msghandler)
|
||||
{
|
||||
|
@ -1598,6 +1649,32 @@ void chronograph::reset()
|
|||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// global_info
|
||||
uint32_t global_info::page_size = 0;
|
||||
uint32_t global_info::page_map_size = 0;
|
||||
uint32_t global_info::cluster_size = 0;
|
||||
uint32_t global_info::gray_pallete[] = {0};
|
||||
|
||||
global_info::global_info()
|
||||
{
|
||||
global_info::page_size = utils::get_page_size(&global_info::page_map_size);
|
||||
|
||||
std::string path(utils::get_local_data_path());
|
||||
unsigned long long cluster = 0;
|
||||
|
||||
utils::get_disk_space(path.c_str(), nullptr, nullptr, &cluster);
|
||||
global_info::cluster_size = cluster;
|
||||
for(int i = 0; i < _countof(global_info::gray_pallete); ++i)
|
||||
global_info::gray_pallete[i] = MAKELONG(MAKEWORD(i, i), MAKEWORD(i, 0));
|
||||
|
||||
printf("Page size: %u\nMap size: %u\nCluster : %u\n", global_info::page_size, global_info::page_map_size, global_info::cluster_size);
|
||||
}
|
||||
global_info::~global_info()
|
||||
{}
|
||||
|
||||
static global_info g_si;
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -77,6 +77,10 @@ namespace utils
|
|||
int copy_log_file_to(const char* dst);
|
||||
int clear_log_file(void);
|
||||
|
||||
// bitmap header ...
|
||||
std::string bitmap_info_header(int pixel_w, int pixel_h, int bpp, int dpix, int dpiy = 0); // return BITMPINFOHEADER + pallete if need. dpiy same as dpix if was ZERO
|
||||
std::string bitmap_file_header(BITMAPINFOHEADER *lpbi); // return BITMAPFILEHEADER
|
||||
|
||||
#if OS_WIN
|
||||
// Function: pump message recycle (GetMessageW)
|
||||
//
|
||||
|
@ -232,6 +236,20 @@ public:
|
|||
void reset(void);
|
||||
};
|
||||
|
||||
// global info
|
||||
class global_info
|
||||
{
|
||||
public:
|
||||
global_info();
|
||||
~global_info();
|
||||
|
||||
public:
|
||||
static uint32_t page_size;
|
||||
static uint32_t page_map_size;
|
||||
static uint32_t cluster_size;
|
||||
static uint32_t gray_pallete[256];
|
||||
};
|
||||
|
||||
// event
|
||||
class platform_event : public refer
|
||||
{
|
||||
|
|
|
@ -43,6 +43,8 @@ enum scanner_err
|
|||
SCANNER_ERR_RELOAD_IMAGE_PARAM, // 配置成功,会影响图像参数,应用需要重新加载图像参数 - added on 2023-02-18 for XSANE修改影响图像参数的属性后扫描崩溃的问题
|
||||
SCANNER_ERR_RELOAD_OPT_PARAM, // SCANNER_ERR_CONFIGURATION_CHANGED + SCANNER_ERR_RELOAD_IMAGE_PARAM - added on 2023-02-18 for XSANE修改影响图像参数的属性后扫描崩溃的问题
|
||||
SCANNER_ERR_THROW_EXCEPTION, // catched exception
|
||||
SCANNER_ERR_INVALID_USER_NAME,
|
||||
SCANNER_ERR_INVALID_PASSWORD,
|
||||
|
||||
// 2:USB错误
|
||||
SCANNER_ERR_USB_INIT_FAILED = 0x5b00, // libusb_init 失败
|
||||
|
@ -80,6 +82,15 @@ enum scanner_err
|
|||
|
||||
SCANNER_ERR_DEVICE_NOT_READY, // 设备未准备好(执行某操作的前置条件未准备好)
|
||||
SCANNER_ERR_DEVICE_GET_STATUS_FAILED, // 获取电机板状态失败
|
||||
SCANNER_ERR_DEVICE_HD_001, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_002, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_003, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_004, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_005, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_006, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_007, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_008, // 设备硬件访问错误
|
||||
SCANNER_ERR_DEVICE_HD_009, // 设备硬件访问错误
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -218,6 +218,8 @@ enum opt_visible_level // "visible" field
|
|||
#define SANE_STD_OPT_NAME_CO_TEL "co-tel" // 公司电话
|
||||
#define SANE_STD_OPT_NAME_CO_ADDR "co-addr" // 公司地址
|
||||
#define SANE_STD_OPT_NAME_CO_GPS "co-gps" // 公司地图定位
|
||||
#define SANE_STD_OPT_NAME_USER_NAME "user-name" // 登录账号
|
||||
#define SANE_STD_OPT_NAME_USER_PASSWORD "user-pwd" // 登录密码
|
||||
#define SANE_STD_OPT_NAME_LOGIN "login" // 登录
|
||||
#define SANE_STD_OPT_NAME_LOGOUT "logout" // 登出
|
||||
#define SANE_STD_OPT_NAME_DRIVER_LOG "drv-log" // 驱动日志
|
||||
|
@ -225,6 +227,7 @@ enum opt_visible_level // "visible" field
|
|||
#define SANE_STD_OPT_NAME_ROLLER_LIFE "roller-life" // 滚轴最大寿命(过纸张数)
|
||||
#define SANE_STD_OPT_NAME_LANGUAGE "language" // 语言
|
||||
#define SANE_STD_OPT_NAME_MOTOR_VER "motor-ver" // 电机固件版本, data = char*
|
||||
#define SANE_STD_OPT_NAME_FPGA_VER "fpga-ver" // CIS控制器(FPGA)版本, data = char*
|
||||
#define SANE_STD_OPT_NAME_TRANSFORM_IMAGE_FORMAT "trans-img-fmt" // 图像格式转换, data - SANE_ImageFormatConvert*, dst.data 调用SANE_STD_OPT_NAME_FREE_BUFFER释放
|
||||
#define SANE_STD_OPT_NAME_FREE_BUFFER "free-buf" // 释放由驱动返回的内存, data - (void**)&buf
|
||||
#define SANE_STD_OPT_NAME_PAPER_ON "paper-on" // check whether paper is on
|
||||
|
@ -375,6 +378,8 @@ enum sane_option_id
|
|||
SANE_OPT_ID_ROLLER_COUNT = 0x9902,
|
||||
SANE_OPT_ID_DRIVER_LOG = 0x9903,
|
||||
SANE_OPT_ID_DEVICE_LOG = 0x9904,
|
||||
SANE_OPT_ID_USER_NAME = 0x9905,
|
||||
SANE_OPT_ID_USER_PASSWORD = 0x9906,
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
|
@ -1785,6 +1785,20 @@ int device_option::update_data(const char* name, void* value, bool reorder_if_ne
|
|||
|| (child->get_value("auth", err) && user_ && !user_(err)))
|
||||
{
|
||||
err = SCANNER_ERR_ACCESS_DENIED;
|
||||
|
||||
// following ...
|
||||
if (src_.count(name))
|
||||
{
|
||||
sane_opt_provider* opt = src_[name]->get_following(name);
|
||||
while(opt)
|
||||
{
|
||||
opt->set_value(name, value);
|
||||
|
||||
sane_opt_provider* next = opt->get_following(name);
|
||||
opt->release();
|
||||
opt = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1921,7 +1935,8 @@ int device_option::restore(sane_opt_provider* holder)
|
|||
while (child)
|
||||
{
|
||||
if ((!holder || src_.count(child->key()) && src_[child->key()] == holder)
|
||||
&& is_auto_restore_default(child))
|
||||
// && is_auto_restore_default(child)
|
||||
)
|
||||
{
|
||||
std::string val(device_option::option_value(child, true));
|
||||
update_data(child->key().c_str(), &val[0], false);
|
||||
|
|
|
@ -96,7 +96,7 @@ async_usb_gadget::async_usb_gadget(std::function<FUNCTION_PROTO_COMMAND_HANDLE>
|
|||
};
|
||||
|
||||
threads_.set_exception_handler(excep);
|
||||
unit_in_ = unit_out_ = sys_info::page_size; // dev_->get_max_packet();
|
||||
unit_in_ = unit_out_ = global_info::page_size; // dev_->get_max_packet();
|
||||
|
||||
// allocate 10MB for IO
|
||||
#ifdef MEM_POOL
|
||||
|
@ -852,6 +852,14 @@ int async_usb_gadget::stop(void)
|
|||
{
|
||||
run_ = false;
|
||||
|
||||
if(dev_)
|
||||
{
|
||||
dev_->pull_down();
|
||||
dev_->close_device();
|
||||
dev_->release();
|
||||
dev_ = nullptr;
|
||||
}
|
||||
|
||||
#ifdef MEM_POOL
|
||||
io_buf_->stop();
|
||||
#else
|
||||
|
@ -862,14 +870,6 @@ int async_usb_gadget::stop(void)
|
|||
cmd_que_.trigger();
|
||||
sent_que_.trigger();
|
||||
|
||||
if(dev_)
|
||||
{
|
||||
dev_->pull_down();
|
||||
dev_->close_device();
|
||||
dev_->release();
|
||||
dev_ = nullptr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
int async_usb_gadget::write_bulk(data_source_ptr data)
|
||||
|
|
|
@ -57,10 +57,11 @@ add_packagedirs("sdk")
|
|||
-- -- set_configvar("MOTOR_UART", "/dev/ttyUSB0")
|
||||
-- set_configvar("VIDEO_CLASS", has_config("isp1") and "GVideoISP1" or "gVideo")
|
||||
|
||||
add_defines("BUILD_AS_DEVICE")
|
||||
add_defines("VER_MAIN=2")
|
||||
add_defines("VER_FAMILY=300")
|
||||
add_defines("VER_DATE=20240103")
|
||||
add_defines("VER_BUILD=7")
|
||||
add_defines("VER_DATE=20240105")
|
||||
add_defines("VER_BUILD=3")
|
||||
|
||||
target("conf")
|
||||
set_kind("phony")
|
||||
|
|
Loading…
Reference in New Issue