新增锁定功能

This commit is contained in:
13038267101 2022-10-28 11:01:01 +08:00
parent e6f800af7c
commit b4292a6d93
7 changed files with 165 additions and 107 deletions

View File

@ -875,6 +875,13 @@ namespace setting3399
SR_SET_AUTOMATICCONTROLFEEDMODE_THRESHOLD,
SR_GET_TRAYPOSITION,
SR_SET_TRAYPOSITION,
SR_GET_LOCK_STATES,
SR_SET_LOCK_STATES,
SR_GET_TOKEN,
SR_SET_TOKEN,
SR_GET_TOKEN_LENGHT,
SR_DECODE_TOKEN,
SR_GET_CUO_ERROR = 0x50,
SR_GET_DOU_ERROR,
SR_GET_JAM_ERROR,

View File

@ -856,11 +856,14 @@ void hg_scanner::working_done(void*)
notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_PC_BUSY, SANE_EVENT_SCAN_FINISHED, status_);
break;
case SCANNER_ERR_INSUFFICIENT_MEMORY:
notify_ui_working_status(STATU_DESC_SCANNER_ERR_INSUFFICIENT_MEMORY, SANE_EVENT_SCAN_FINISHED, status_);
break;
notify_ui_working_status(STATU_DESC_SCANNER_ERR_INSUFFICIENT_MEMORY, SANE_EVENT_SCAN_FINISHED, status_);
break;
case SCANNER_ERR_TIMEOUT:
notify_ui_working_status(STATU_DESC_SCANNER_ERR_TIMEOUT, SANE_EVENT_SCAN_FINISHED, status_);
break;
notify_ui_working_status(STATU_DESC_SCANNER_ERR_TIMEOUT, SANE_EVENT_SCAN_FINISHED, status_);
break;
case SCANNER_ERR_DEVICE_ISLOCK:
notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_ISLOCK, SANE_EVENT_SCAN_FINISHED, status_);
break;
default:
notify_ui_working_status(user_cancel_ ? STATU_DESC_SCAN_CANCELED : STATU_DESC_SCAN_STOPPED, SANE_EVENT_SCAN_FINISHED, status_);
break;
@ -3418,6 +3421,22 @@ int hg_scanner::device_io_control(unsigned long code, void* data, unsigned* len)
strcpy((char*)data, str.c_str());
return 0;
}
else if(code == IO_CTRL_CODE_SET_SCAN_LOCK_CHECK_VAL)
{
string str = (char*)data;
set_scan_lock_check_val(str);
}
else if (code == IO_CTRL_CODE_SET_SCAN_LOCK)
{
SANE_Bool set_islock = *((SANE_Bool *)data);
set_scan_islock(set_islock);
}
else if (code == IO_CTRL_CODE_GET_SCAN_ISLOCK)
{
SANE_Bool islock = *((SANE_Bool*)data);
get_scan_islock(&islock);
*((SANE_Bool*)data) = islock;
}
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
std::string hg_scanner::get_firmware_version(void)
@ -3456,7 +3475,18 @@ int hg_scanner::get_history_count(void)
{
return -2;
}
int hg_scanner::set_scan_islock(SANE_Bool set_islock)
{
return -2;
}
int hg_scanner::get_scan_islock(SANE_Bool* islock)
{
return -2;
}
int hg_scanner::set_scan_lock_check_val(string check_str)
{
return -2;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
int hg_scanner::set_leaflet_scan(void)
{

View File

@ -22,6 +22,7 @@
#include "PaperSize.h"
#if defined(WIN32) || defined(_WIN64)
#include <openssl/md5.h> //暂时linux 屏蔽
#else
#include <unistd.h>
#endif
@ -99,10 +100,8 @@ protected:
int setting_restore(int sn, void* data);
int setting_help(int sn, void* data);
int setting_color_mode(int sn, void* data);
int setting_multi_out(int sn, void*data);
int setting_multi_out_type(int sn, void*data);
int setting_rid_color(int sn, void* data);
int setting_rid_multi_red(int sn, void* data);
int setting_rid_answer_red(int sn, void* data);
@ -163,12 +162,10 @@ protected:
int setting_set_auto_pick_paper(int sn, void* data);
int setting_set_auto_pick_paper_threshold(int sn, void* data);
int setting_set_auto_paper_scan(int sn, void* data);
int setting_set_isremove_left_hole(int sn, void* data);
int setting_set_isremove_right_hole(int sn, void* data);
int setting_set_isremove_top_hole(int sn, void* data);
int setting_set_isremove_low_hole(int sn, void* data);
int setting_set_isremove_left_hole_threshold(int sn, void* data);
int setting_set_isremove_right_hole_threshold(int sn, void* data);
int setting_set_isremove_top_hole_threshold(int sn, void* data);
@ -350,27 +347,19 @@ public:
static int save_2_tempory_file(std::shared_ptr<std::vector<char>> data, std::string* path_file, unsigned int index = 0);
public:
///////////////////////////////新增 20220425//////////////////////////
virtual int set_leaflet_scan(void);//单张扫描
virtual int get_abuot_info(void);//获取软件关于信息 (基类实现)
virtual int restore_default_setting(void);//恢复默认设置 (基类实现)
virtual int set_final_image_format(SANE_FinalImgFormat* fmt); // 设置图像处理最终输出final())的图像数据格式 (基类实现) ***
virtual int get_compression_format(void);//获取支持的压缩格式 功能不支持
virtual int clear_roller_num(void); // 清除滚轴计数
virtual int set_compression_format(void);//设置图像数据最终输出的压缩格式
virtual int set_auto_color_type(void);// 设置自动匹配颜色模式 (基类实现) ***
virtual std::string get_firmware_version(void);
virtual std::string get_serial_num(void);
virtual std::string get_ip(void);
virtual int get_device_code(void);//获取设备编码
virtual int get_dogear_distance(void);//获取折角检测最小距离阈值
virtual int set_dogear_distance(void);// 设置折角检测最小距离阈值
virtual int get_scanner_paperon(SANE_Bool* paperon = NULL);//获取设备有无纸张
@ -378,19 +367,18 @@ public:
virtual int get_scan_when_paper_on(void);//设置是否为检测到进纸盘上有纸即开始扫描
virtual int get_scan_with_hole(void);// 获取是否为带孔扫描
virtual int set_scan_with_hole(void);// 设置是否为带孔扫描
virtual int get_scan_is_sleep(void);//获取设备是否休眠当中
virtual int get_sleep_time(int& getsleepime);//获取功耗模式(休眠)
virtual int set_sleep_time(int sleeptime);//设置功耗模式(休眠)
virtual int get_history_count(void);//获取历史扫描张数 -2设备不支持该功能-1与设备通信失败其它大于等于0的为正常
virtual int get_roller_num(void); //获取滚轮张数 -2设备不支持该功能-1与设备通信失败其它大于等于0的为正常
virtual int notify_sleep(void);//唤醒设备
virtual int get_device_log(string &log);//获取设备日志
virtual int set_devreboot();//设置设备重启
virtual int set_devshtudown();//设置设备关机
virtual int set_scan_islock(SANE_Bool set_islock);
virtual int get_scan_islock(SANE_Bool* islock);//获取设备是否锁定 -2设备不支持该功能它大于等于0的为正常
virtual int set_scan_lock_check_val(string check_str);//获取设备是否锁定 -2设备不支持该功能它大于等于0的为正常
};
#ifdef UOS

View File

@ -479,8 +479,6 @@ void hg_scanner_239::init_version(void)
sn(get_serial_num());
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Firmware version: %s\n", fv.c_str());
//VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, " HG3399 serial number: %s\n", sn.c_str());
//VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, " HG3399 IP: %s\n", get_ip().c_str());
if (fv.length() >= 10 && (fv[5] > 'A' || atoi(fv.substr(6, 4).c_str()) >= 1209))
{
@ -588,16 +586,6 @@ int hg_scanner_239::get_device_paperon_stautus(void)
int ret =read_register(setting3399::SR_GET_PAPERON,0);
return ret;
}
// int hg_scanner_239::writedown_device_configuration()
// {
// int ret = SCANNER_ERR_OK;
// ret = write_register(SR_CONFIG_SCAN_PARAM, dev_conf_.value);
// VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "Writedown scanner configuration(0x%x) = %s\n", dev_conf_.value, hg_scanner_err_name(ret));
// return ret;
// }
int hg_scanner_239::writedown_device_configuration(setting_hardware::HGSCANCONF_3399 *dev_conf)
{
@ -614,17 +602,11 @@ int hg_scanner_239::writedown_device_configuration(setting_hardware::HGSCANCONF_
{
dev_conf->params_3399.color = 1;
}
if(image_prc_param_.bits.rid_color != RID_COLOR_NONE
&& (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE))
{
dev_conf->params_3399.color = 1;
}
else if (image_prc_param_.bits.rid_color == RID_COLOR_NONE
&& (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE))
{
dev_conf->params_3399.color = 0;
}
else if (image_prc_param_.bits.rid_color == RID_COLOR_NONE
&& (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE))
{
dev_conf->params_3399.color = 0;
}
if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH
|| image_prc_param_.bits.paper == PAPER_MAX_SIZE
@ -658,8 +640,6 @@ int hg_scanner_239::writedown_image_configuration(void)
if (is_lateral(image_prc_param_.bits.paper))
ic.paperAlign = Rot270;
// else if (image_prc_param_.bits.text_direction == TEXT_DIRECTION_AUTO)
// ic.paperAlign = AutoTextOrientation;
else
ic.paperAlign = Rot0;
@ -671,7 +651,6 @@ int hg_scanner_239::writedown_image_configuration(void)
ic.imageRotateDegree = 0;
ic.imageRotateDegree *= 90.0f;
ic.is_duplex = (image_prc_param_.bits.page == PAGE_DOUBLE
|| image_prc_param_.bits.page == PAGE_OMIT_EMPTY
|| image_prc_param_.bits.page == PAGE_OMIT_EMPTY_RECEIPT
@ -680,7 +659,6 @@ int hg_scanner_239::writedown_image_configuration(void)
ic.en_fold = (image_prc_param_.bits.page == PAGE_FOLIO);
ic.pixtype = image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH ? 2 : image_prc_param_.bits.color_mode;
ic.automaticcolor = is_auto_matic_color;
ic.automaticcolortype = 1;// ic.pixtype; //存疑
if (resolution_ >= 300)
{
@ -909,17 +887,6 @@ int hg_scanner_239::pop_first_image(void)
int hg_scanner_239::read_one_image_from_usb(SANE_Image_Statu statu)
{
//if (is_dev_tx())
// return SCANNER_ERR_OK;
//if (!is_kernelsnap_211209_)
//{
// if (image_prc_param_.bits.page == PAGE_DOUBLE && !image_prc_param_.bits.fractate_check)
// if (get_image_count() < 3)
// return SCANNER_ERR_DEVICE_NO_IMAGE;
// if (get_image_count() < 2)
// return SCANNER_ERR_DEVICE_NO_IMAGE;
//}
int r = 0,
total = get_front_data_size(),
off = 0,
@ -931,9 +898,6 @@ int hg_scanner_239::read_one_image_from_usb(SANE_Image_Statu statu)
return status_;
}
//if (user_cancel_)
//return SCANNER_ERR_USER_CANCELED;
if (total == -1)
ret = status_;
else
@ -1320,14 +1284,10 @@ int hg_scanner_239::on_pick_paper_threshold(double threshold)
int hg_scanner_239::on_is_auto_paper(bool isautopaper)
{
dev_conf_.params_3399.is_autopaper = isautopaper;
printf("isautopaper:%d\r\n",isautopaper);
int ret = writedown_device_configuration();
if (isautopaper)
{
//notify_ui_working_status("待纸扫描状态中...", SANE_EVENT_WORKING, status_);
notify_ui_working_status("\345\276\205\347\272\270\346\211\253\346\217\217\347\212\266\346\200\201\344\270\255...", SANE_EVENT_WORKING, status_);
}
return ret;
}
@ -1623,13 +1583,6 @@ int hg_scanner_239::start(void)
VLOG_MINI_1(LOG_LEVEL_WARNING, "start status01 is(%s), the result will be unpredictable.\n", hg_scanner_err_name(ret));
return ret;
}
ret = get_scanner_paperon();
if (ret == SCANNER_ERR_DEVICE_NO_PAPER)
{
status_ = ret;
VLOG_MINI_1(LOG_LEVEL_WARNING, "device start status is(%s)\n", STATU_DESC_SCANNER_ERR_DEVICE_NO_PAPER);
return ret;
}
ret = write_command(setting3399::SC_START);
@ -1918,4 +1871,91 @@ int hg_scanner_239::set_devshtudown()
if (ret != SCANNER_ERR_OK)
return ret;
}
}
int hg_scanner_239::set_scan_islock(SANE_Bool set_islock)
{
if (set_islock != 0 && set_islock != 1)
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
int val = 0,
ret = write_register(setting3399::SR_SET_LOCK_STATES, set_islock);
if (ret != SCANNER_ERR_OK)
return ret;
}
int hg_scanner_239::get_scan_islock(SANE_Bool* islock)
{
std::string fv(get_firmware_version()),
sn(get_serial_num());
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Set_scan_islock ---> Firmware version: %s\n", fv.c_str());
if ((fv[5] == 'B') && (atoi(fv.substr(6, 4).c_str()) >= 1017))
{
int val = 0,
ret = read_register(setting3399::SR_GET_LOCK_STATES, &val);
if (ret == SCANNER_ERR_OK)
*islock = val;
if ( val == 1)
{
ret = SCANNER_ERR_DEVICE_ISLOCK;
}
return ret;
}
else
{
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
}
#define WIN32
int hg_scanner_239::set_scan_lock_check_val(string check_str)
{
if (check_str.empty())
{
return SCANNER_ERR_INVALID_PARAMETER;
}
std::string sn = get_serial_num(),
token = check_str + sn,
md5_to_hex = "";
char map[] = "0123456789abcdef";
unsigned char MD5result[16];
SANE_Bool islock;
int ret = SCANNER_ERR_OK;
ret = get_scan_islock(&islock);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
{
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, token.c_str(), token.size());
MD5_Final(MD5result, &ctx);//MD5result 返回一个标准的16字节数据
}
for (size_t i = 0; i < 16; i++)
{
md5_to_hex += map[MD5result[i] / 16];
md5_to_hex += map[MD5result[i] % 16];
}
if (md5_to_hex.empty())
{
return SCANNER_ERR_INVALID_PARAMETER;
}
ret = write_register(setting3399::SR_DECODE_TOKEN, md5_to_hex.length());
if (ret != SCANNER_ERR_OK)
{
return ret;
}
int len = md5_to_hex.length();
ret = io_->write_bulk(&md5_to_hex[0], &len);
return ret;
}
#endif

View File

@ -56,7 +56,7 @@ class hg_scanner_239 : public hg_scanner
void discard_all_images(void);
protected:
int on_color_mode_changed(int& color_mode) override;
int on_color_mode_changed(int& color_mode) override;
virtual int on_paper_changed(int& paper) override;
virtual int on_paper_check_changed(bool& check) override;
virtual int on_resolution_changed(int& dpi) override;
@ -127,5 +127,8 @@ public:
virtual int get_device_log(string &get_device_log);//获取设备日志
virtual int set_devreboot();//设置设备重启
virtual int set_devshtudown();//设置设备关机
virtual int set_scan_islock(SANE_Bool set_islock);
virtual int get_scan_islock(SANE_Bool* islock);
virtual int set_scan_lock_check_val(string check_str);
};

View File

@ -723,11 +723,25 @@ int hg_scanner_402::writedown_device_configuration(setting_hardware::HGSCANCONF_
int ret = SCANNER_ERR_OK;
if (!dev_conf)
{
dev_conf_.params_3399.is_textcorrect = !keep_watermark_;
dev_conf = &dev_conf_;
if (image_prc_param_.bits.rid_color != RID_COLOR_NONE
&& (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE))
{
dev_conf->params_3399.color = 1;
}
if (image_prc_param_.bits.paper == PAPER_AUTO_MATCH
|| image_prc_param_.bits.paper == PAPER_MAX_SIZE
|| image_prc_param_.bits.paper == PAPER_MAX_SIZE_CLIP
|| image_prc_param_.bits.paper == PAPER_TRIGEMINY
|| image_prc_param_.bits.paper == PAPER_16K
|| image_prc_param_.bits.paper == PAPER_8K
|| image_prc_param_.bits.paper == PAPER_16K_LATERAL
)
{
dev_conf->params_3399.enable_sizecheck = false;
}
ret = write_register(setting3399::SR_CONFIG_SCAN_PARAM, dev_conf->value);
VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "Writedown scanner configuration(0x%x) = %s\n", dev_conf->value, hg_scanner_err_name(ret));
@ -1123,48 +1137,23 @@ void hg_scanner_402::discard_all_images(void)
VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "prev-connection has left %d interrupt packet(s) && %d image(s).\n", pre_int, pre_img);
}
//color_mode =-1 除色选项
int hg_scanner_402::on_color_mode_changed(int& color_mode)
{
int ret = SCANNER_ERR_OK;
if ((((color_mode == COLOR_MODE_24_BITS || color_mode == COLOR_MODE_AUTO_MATCH) && !dev_conf_.params_3399.color) ||
((color_mode != COLOR_MODE_24_BITS && color_mode != COLOR_MODE_AUTO_MATCH) && dev_conf_.params_3399.color)) && color_mode != -1)
((color_mode != COLOR_MODE_24_BITS && color_mode != COLOR_MODE_AUTO_MATCH) && dev_conf_.params_3399.color)) && color_mode != -1)
{
dev_conf_.params_3399.color ^= 1;
ret = writedown_device_configuration();
if(ret)
if (ret)
dev_conf_.params_3399.color ^= 1;
}
if(color_mode == COLOR_MODE_AUTO_MATCH)
if (color_mode == COLOR_MODE_AUTO_MATCH)
{
dev_conf_.params_3399.color = 1;
}
setting_hardware::HGSCANCONF_3399 d = dev_conf_;
if (image_prc_param_.bits.rid_color != RID_COLOR_NONE
&&(image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE)
)
{
d.params_3399.color = 1;
ret = writedown_device_configuration(&d);
}
if(image_prc_param_.bits.rid_color != RID_COLOR_NONE
&& (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE)
&& color_mode == -1)
{
d.params_3399.color = 1;
}
else if (image_prc_param_.bits.rid_color == RID_COLOR_NONE
&& (image_prc_param_.bits.color_mode == COLOR_MODE_256_GRAY || image_prc_param_.bits.color_mode == COLOR_MODE_BLACK_WHITE)
&& color_mode == -1)
{
d.params_3399.color = 0;
}
if(color_mode == -1)
ret = writedown_device_configuration(&d);
return ret;
}

View File

@ -228,6 +228,7 @@ extern "C"
RETURN_IF(err, SCANNER_ERR_DEVICE_NO_IMAGE);
RETURN_IF(err, SCANNER_ERR_DEVICE_SCANN_ERROR);
RETURN_IF(err, SCANNER_ERR_DEVICE_PC_BUSY);
RETURN_IF(err, SCANNER_ERR_DEVICE_ISLOCK);
// NOTE: multi-thread unsafe here
static char g_unk_err[80] = { 0 };