code_device/hgdriver/hgdev/hg_scanner_200.cpp

1354 lines
56 KiB
C++
Raw Normal View History

2022-05-03 03:56:07 +00:00
#include "hg_scanner_200.h"
#include "../../sdk/hginclude/hg_log.h"
#ifdef WIN32
#include "scanner_manager.h"
#endif
2022-05-06 05:37:14 +00:00
static std::string jsontext("{\"device_type\":\"G100\",\"option_count\":53,\"1\":{\"category\":\"base\",\"name\":\"cfg-1\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"type\":\"button\",\"cur\":\"button\",\"default\":\"button\",\"size\":0},\"2\":{\"category\":\"advanced\",\"name\":\"cfg-2\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"type\":\"button\",\"cur\":\"true\",\"default\":\"true\",\"size\":4},\"3\":{\"category\":\"base\",\"name\":\"grp-1\",\"title\":\"\\u57fa\\u672c\\u8bbe\\u7f6e\",\"type\":\"group\"},\"4\":{\"category\":\"base\",\"name\":\"cfg-4\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u8bbe\\u7f6e\\u989c\\u8272\\u4f4d\\u6df1\",\"type\":\"string\",\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"size\":32,\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"5\":{\"category\":\"base\",\"name\":\"cfg-5\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\",\"desc\":\"\\u9664\\u53bb\\u56fe\\u50cf\\u5f69\\u8272\",\"type\":\"string\",\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"size\":24,\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend_or\":[\"4==256\\u7ea7\\u7070\\u5ea6\",\"4==\\u9ed1\\u767d\"]},\"6\":{\"category\":\"base\",\"name\":\"cfg-6\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u591a\\u901a\\u9053\\u8f93\\u51fa\\u4e2d\\uff0c\\u53bb\\u9664\\u7ea2\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"7\":{\"category\":\"base\",\"name\":\"cfg-7\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u7b54\\u9898\\u5361\\u626b\\u63cf\\u4e2d\\u53bb\\u9664\\u7ea2\\u8272\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"8\":{\"category\":\"base\",\"name\":\"cfg-8\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u5f69\\u8272\\u56fe\\u50cf\\u80cc\\u666f\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==24\\u4f4d\\u5f69\\u8272\"]},\"9\":{\"category\":\"base\",\"name\":\"cfg-9\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u8bbe\\u5b9a\\u80cc\\u666f\\u8272\\u5f69\\u7684\\u6d6e\\u52a8\\u8303\\u56f4\\uff0c\\u5728\\u8be5\\u8303\\u56f4\\u5185\\u7684\\u90fd\\u5f53\\u4f5c\\u80cc\\u666f\\u79fb\\u9664\",\"type\":\"int\",\"cur\":10,\"default\":10,\"size\":4,\"range\":{\"min\":1,\"max\":40},\"depend_or\":[\"8==true\"]},\"10\":{\"category\":\"base\",\"name\":\"cfg-10\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\",\"type\":\"bool\",\"cur\":false,\"default\":false,\"size\":4,\"depend_or\":[\"4==\\u9ed1\\u767d\"]},\"11\":{\"category\":\"base\",\"name\":\"cfg-11\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"type\":\"int\",\"cur\":30,\"default\":30,\"size\":4,\"range\":{\"min\":10,\"max\":50},\"depend_or\":[\"10==true\"]},\"12\":{\"category\":\"base\",\"name\":\"cfg-12\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u7eb8\\u5f20\\u5927\\u5c0f\",\"type\":\"string\",\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"size\":48,\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\"
2022-05-03 03:56:07 +00:00
namespace settingsdsp_200
{
hg_err device_status_to_hg_err(int usbdata, bool *fatal)
{
hg_err code = HG_ERR_OK;
if (fatal)
*fatal = true;
switch (usbdata)
{
case HAVE_IMAGE:
code = HG_ERR_OK;
if (fatal)
*fatal = false;
break;
case STOP_SCAN:
case SCAN_STOP:
case USER_STOP:
if (fatal)
*fatal = false;
code = HG_ERR_DEVICE_STOPPED;
break;
case COUNT_MODE:
code = HG_ERR_DEVICE_COUNT_MODE;
break;
case NO_FEED:
code = HG_ERR_DEVICE_NO_PAPER;
break;
case OPEN_COVER:
code = HG_ERR_DEVICE_COVER_OPENNED;
break;
case FEED_IN_ERROR:
code = HG_ERR_DEVICE_FEEDING_PAPER;
break;
case PAPER_JAM:
code = HG_ERR_DEVICE_PAPER_JAMMED;
break;
case DETECT_DOUBLE_FEED:
code = HG_ERR_DEVICE_DOUBLE_FEEDING;
break;
case DETECT_STAPLE:
code = HG_ERR_DEVICE_STAPLE_ON;
break;
case PAPER_SKEW:
code = HG_ERR_DEVICE_PAPER_SKEW;
break;
case HARDWARE_ERROR:
code = HG_ERR_DEVICE_NOT_SUPPORT;
break;
case PC_SCAN_BUSY_or_ERROR:
code = HG_ERR_DEVICE_PC_BUSY;
break;
case SIZE_ERROR:
code = HG_ERR_DEVICE_SIZE_CHECK;
break;
default:
if (fatal)
*fatal = false;
break;
}
return code;
}
static struct
{
int paper;
TwSS type;
int dev_value;
}paper_map[] =
{
{PAPER_A3, TwSS::A3, 0},
{PAPER_8K, TwSS::K8, 0},
{PAPER_A4, TwSS::A4, 1},
{PAPER_A4_LATERAL, TwSS::A4, 2},
{PAPER_16K, TwSS::K16, 0},
{PAPER_16K_LATERAL, TwSS::K16, 0},
{PAPER_A5, TwSS::A5, 2},
{PAPER_A5_LATERAL, TwSS::A5, 2},
{PAPER_A6, TwSS::A6, 2},
{PAPER_A6_LATERAL, TwSS::A6, 2},
{PAPER_B4, TwSS::B4, 0},
{PAPER_B5, TwSS::B5, 0},
{PAPER_B5_LATERAL, TwSS::B5, 1},
{PAPER_B6, TwSS::B6, 2},
{PAPER_B6_LATERAL, TwSS::B6, 2},
{PAPER_LETTER, TwSS::USLetter, 14},
{PAPER_LETTER_LATERAL, TwSS::USLetter, 1},
{PAPER_DOUBLE_LETTER, TwSS::USLedger, 2},
{PAPER_LEGAL, TwSS::USLegal, 0},
{PAPER_AUTO_MATCH, TwSS::None, 0},
{PAPER_MAX_SIZE_CLIP, TwSS::USStatement, 16},
{PAPER_MAX_SIZE, TwSS::MaxSize, 16},
{PAPER_TRIGEMINY, TwSS::Trigeminy, 16}
};
int match_best_paper(int& paper, bool* exact, TwSS* type)
{
int ind = 0;
bool good = true, * r = exact ? exact : &good;
for (int i = 0; i < ARRAY_SIZE(paper_map); ++i)
{
if (paper == paper_map[i].paper)
{
ind = i;
break;
}
}
if (paper == paper_map[ind].paper)
*r = true;
else
*r = false;
HG_VLOG_MINI_3(HG_LOG_LEVEL_DEBUG_INFO, "Paper '%s' index = %d, device value = %d\n", paper_string(paper).c_str(), ind, paper_map[ind].dev_value);
paper = paper_map[ind].paper;
if (type)
*type = paper_map[ind].type;
return ind;
}
}
enum hg_239_setting_item
{
HG_239_SETTING_RESTORE = 1, // 恢复默认设置
HG_239_SETTING_HELP, // 帮助
HG__239_SETTING_GROUP_1,
HG_239_SETTING_COLOR_MODE, // 颜色模式
HG_239_SETTING_ERASE_COLOR, // 除色
HG_239_SETTING_ERASE_MULTI_RED, // 多流输出除红
HG_239_SETTING_ERASE_ANSWER_RED, // 答题卡除红
HG_239_SETTING_ERASE_BACKGROUND, // 移除背景
HG_239_SETTING_ERASE_BKG_RANGE, // 移除背景范围
HG_239_SETTING_NOISE, // 黑白图像噪点优化
HG_239_SETTING_NOISE_SIZE, // 噪点优化尺寸
HG_239_SETTING_PAPER_SIZE, // 纸张尺寸
2022-05-06 05:37:14 +00:00
HG_200_SETTING_CUSTOM_AREA, // 自定义扫描区域
HG_200_SETTING_CUSTOM_AREA_LEFT, // 扫描区域左侧mm
HG_200_SETTING_CUSTOM_AREA_RIGHT, // 扫描区域右侧mm
HG_200_SETTING_CUSTOM_AREA_TOP, // 扫描区域上侧mm
HG_200_SETTING_CUSTOM_AREA_BOTTOM, // 扫描区域下侧mm
2022-05-03 03:56:07 +00:00
//HG_239_SETTING_PAPER_SIZE_CHECK, // 尺寸检测
HG_239_SETTING_PAGE, // 扫描页面
HG_239_SETTING_SKIP_NILL, // 跳过空白页灵敏度
HG_239_SETTING_RESOLUTION, // 分辨率
HG_239_SETTING_REVERSE, // 交换正反面
HG_239_SETTING_SPLIT, // 图像拆分
HG_239_SETTING_CORRECT, // 自动纠偏
HG_239_SETTING_ERASE_HOLE, // 穿孔移除
HG_239_SETTING_HOLE_SEARCH, // 穿孔搜索范围
HG__239_SETTING_GROUP_2,
2022-05-06 05:37:14 +00:00
HG_200_SETTING_CUSTOM_GAMMA, // 启用色调曲线
2022-05-03 03:56:07 +00:00
HG_239_SETTING_LIGHT, // 亮度
HG_239_SETTING_CONTRAST, // 对比度
HG_239_SETTING_GAMMA, // 伽玛
2022-05-06 05:37:14 +00:00
// HG_200_SETTING_CUSTOM_GAMMA_DATA, // 自定义伽玛 数据为SANE_Int[3 * 256]
2022-05-03 03:56:07 +00:00
HG__239_SETTING_GROUP_3,
HG_239_SETTING_SHARP, // 锐化与模糊
HG_239_SETTING_ERASE_BLACK_BORDER, // 消除黑框
HG_239_SETTING_SAMPLE, // 深色样张
HG_239_SETTING_THRESHOLD, // 阈值
HG_239_SETTING_ANTI_NOISE, // 背景抗噪等级
HG_239_SETTING_MARGIN, // 边缘缩进
HG_239_SETTING_FILLING, // 背景填充方式
HG_239_SETTING_PERMEATE, // 防止渗透
HG_239_SETTING_PERMEATE_lv, // 防止渗透等级
HG_239_SETTING_REMOVE_MORR, // 去除摩尔纹
HG_239_SETTING_ERROR_EXTENTION, // 错误扩散
HG_239_SETTING_REMOVE_TXTTURE, // 除网纹
HG__239_SETTING_GROUP_4,
HG_239_SETTING_ULTRASONIC, // 超声波检测
HG_239_SETTING_STAPLE, // 装订检测
HG_239_SETTING_SCAN_METHOD, // 连续扫描或扫描指定张数
HG_239_SETTING_SCAN_COUNT, // 扫描指定数量
HG_239_SETTING_DIRECTION, // 文稿方向 删除文稿自动识别
HG_239_SETTING_ROTATE, // 背面旋转180°
//HG_239_SETTING_FRACTATE, // 折角检测
//HG_239_SETTING_FRACTATE_COMPLEX, // 折角检测复杂度
HG_239_SETTING_SCREW, // 歪斜检测
HG_239_SETTING_SCREW_COMPLEX, // 歪斜检测复杂度
HG_239_SETTING_END,
//暂时屏蔽
HG_239_SETTING_MULTI_OUT = 500, // 多流输出
};
2022-05-06 05:37:14 +00:00
hg_scanner_200::hg_scanner_200(const char* dev_name,int pid, usb_io* io) : hg_scanner(G100Serial, dev_name, io), pid_(pid)
2022-05-03 03:56:07 +00:00
{
string fw = get_firmware_version();
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO, "get_firmware_version is: %s\n",fw.c_str());
2022-05-06 10:02:06 +00:00
initdevice();
2022-05-03 03:56:07 +00:00
dsp_config_.value = 0;
init_setting_map(setting_map_, ARRAY_SIZE(setting_map_));//优先初始化
init_settings(jsontext.c_str());
printf_devconfig();
}
hg_scanner_200::~hg_scanner_200()
{}
2022-05-03 03:56:07 +00:00
void hg_scanner_200::discard_prev(void)
{
USBCB usb = { 0 };
int ret = get_scanner_status(usb),
2022-05-03 03:56:07 +00:00
imgs = 0,
packets = 0,
normal = 0;
while (ret == HG_ERR_OK)
{
if (usb.u32_Data == HAVE_IMAGE)
2022-05-03 03:56:07 +00:00
{
pop_image();
imgs++;
normal = 0;
packets++;
}
else if (usb.u32_Data == NORMAL)
2022-05-03 03:56:07 +00:00
{
if(normal++ > 10)
break;
}
else
packets++;
ret = get_scanner_status(usb);
2022-05-03 03:56:07 +00:00
}
if (imgs || packets)
HG_VLOG_MINI_2(HG_LOG_LEVEL_DEBUG_INFO, "discard prev-scanning %d packets and %d images.\n", packets, imgs);
}
void hg_scanner_200::init_setting_map(int* setting_map, int count)
{
setting_map[HG_BASE_SETTING_INDEX_RESTORE_DEFAULT_SETTINGS] = HG_239_SETTING_RESTORE;
setting_map[HG_BASE_SETTING_INDEX_HELP] = HG_239_SETTING_HELP;
setting_map[HG_BASE_SETTING_INDEX_COLOR_MODE] = HG_239_SETTING_COLOR_MODE;
setting_map[HG_BASE_SETTING_MULTI_OUT] = HG_239_SETTING_MULTI_OUT;
setting_map[HG_BASE_SETTING_INDEX_ERASE_COLOR] = HG_239_SETTING_ERASE_COLOR;
setting_map[HG_BASE_SETTING_INDEX_ERASE_MULTI_OUT_RED] = HG_239_SETTING_ERASE_MULTI_RED;
setting_map[HG_BASE_SETTING_INDEX_ERASE_ANSWER_RED] = HG_239_SETTING_ERASE_ANSWER_RED;
setting_map[HG_BASE_SETTING_INDEX_ERASE_BACKGROUND] = HG_239_SETTING_ERASE_BACKGROUND;
setting_map[HG_BASE_SETTING_INDEX_ERASE_BACKGROUND_RANGE] = HG_239_SETTING_ERASE_BKG_RANGE;
setting_map[HG_BASE_SETTING_INDEX_NOISE_OPTIMIZE] = HG_239_SETTING_NOISE;
setting_map[HG_BASE_SETTING_INDEX_NOISE_OPTIMIZE_SIZE] = HG_239_SETTING_NOISE_SIZE;
setting_map[HG_BASE_SETTING_INDEX_PAPER] = HG_239_SETTING_PAPER_SIZE;
//setting_map[HG_BASE_SETTING_INDEX_PAPER_SIZE_CHECK] = HG_239_SETTING_PAPER_SIZE_CHECK;
2022-05-06 05:37:14 +00:00
setting_map[HG_BASE_SETTING_INDEX_IS_CUSTOM_AREA] = HG_200_SETTING_CUSTOM_AREA;
setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_LEFT] = HG_200_SETTING_CUSTOM_AREA_LEFT;
setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_RIGHT] = HG_200_SETTING_CUSTOM_AREA_RIGHT;
setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_TOP] = HG_200_SETTING_CUSTOM_AREA_TOP;
setting_map[HG_BASE_SETTING_INDEX_CUSTOM_AREA_BOTTOM] = HG_200_SETTING_CUSTOM_AREA_BOTTOM;
2022-05-03 03:56:07 +00:00
setting_map[HG_BASE_SETTING_INDEX_PAGE] = HG_239_SETTING_PAGE;
setting_map[HG_BASE_SETTING_INDEX_PAGE_OMIT_EMPTY_LEVEL] = HG_239_SETTING_SKIP_NILL;
setting_map[HG_BASE_SETTING_INDEX_RESOLUTION] = HG_239_SETTING_RESOLUTION;
setting_map[HG_BASE_SETTING_INDEX_EXCHANGE] = HG_239_SETTING_REVERSE;
setting_map[HG_BASE_SETTING_INDEX_SPLIT] = HG_239_SETTING_SPLIT;
setting_map[HG_BASE_SETTING_INDEX_AUTO_CORRECT] = HG_239_SETTING_CORRECT;
setting_map[HG_BASE_SETTING_INDEX_RID_HOLE] = HG_239_SETTING_ERASE_HOLE;
setting_map[HG_BASE_SETTING_INDEX_RID_HOLE_RANGE] = HG_239_SETTING_HOLE_SEARCH;
2022-05-06 05:37:14 +00:00
setting_map[HG_BASE_SETTING_INDEX_IS_CUSTOM_GAMMA] = HG_200_SETTING_CUSTOM_GAMMA;
2022-05-03 03:56:07 +00:00
setting_map[HG_BASE_SETTING_INDEX_BRIGHT] = HG_239_SETTING_LIGHT;
setting_map[HG_BASE_SETTING_INDEX_CONTRAST] = HG_239_SETTING_CONTRAST;
setting_map[HG_BASE_SETTING_INDEX_GAMMA] = HG_239_SETTING_GAMMA;
2022-05-06 05:37:14 +00:00
setting_map[HG_BASE_SETTING_INDEX_CUSTOM_GAMMA_DATA] = HG_239_SETTING_END + 1; // HG_200_SETTING_CUSTOM_GAMMA_DATA;
2022-05-03 03:56:07 +00:00
setting_map[HG_BASE_SETTING_INDEX_SHARPEN] = HG_239_SETTING_SHARP;
setting_map[HG_BASE_SETTING_INDEX_DARK_SAMPLE] = HG_239_SETTING_SAMPLE;
setting_map[HG_BASE_SETTING_INDEX_ERASE_BLACK_FRAME] = HG_239_SETTING_ERASE_BLACK_BORDER;
setting_map[HG_BASE_SETTING_INDEX_THRESHOLD] = HG_239_SETTING_THRESHOLD;
setting_map[HG_BASE_SETTING_INDEX_ANTI_NOISE_LEVEL] = HG_239_SETTING_ANTI_NOISE;
setting_map[HG_BASE_SETTING_INDEX_MARGIN] = HG_239_SETTING_MARGIN;
setting_map[HG_BASE_SETTING_INDEX_FILL_BACKGROUND] = HG_239_SETTING_FILLING;
setting_map[HG_BASE_SETTING_INDEX_PERMEATE] = HG_239_SETTING_PERMEATE;
setting_map[HG_BASE_SETTING_INDEX_PERMEATE_LV] = HG_239_SETTING_PERMEATE_lv;
setting_map[HG_BASE_SETTING_REMOVE_MORR] = HG_239_SETTING_REMOVE_MORR;
setting_map[HG_BASE_SETTING_ERROR_EXTENTION] = HG_239_SETTING_ERROR_EXTENTION;
setting_map[HG_BASE_SETTING_REMOVE_TXTTURE] = HG_239_SETTING_REMOVE_TXTTURE;
setting_map[HG_BASE_SETTING_INDEX_ULTRASONIC_CHECK] = HG_239_SETTING_ULTRASONIC;
setting_map[HG_BASE_SETTING_INDEX_STAPLE_CHECK] = HG_239_SETTING_STAPLE;
setting_map[HG_BASE_SETTING_INDEX_SCAN_MODE] = HG_239_SETTING_SCAN_METHOD;
setting_map[HG_BASE_SETTING_INDEX_SCAN_COUNT] = HG_239_SETTING_SCAN_COUNT;
setting_map[HG_BASE_SETTING_INDEX_TEXT_DIRECTION] = HG_239_SETTING_DIRECTION;
setting_map[HG_BASE_SETTING_INDEX_ROTATE_BKG_180] = HG_239_SETTING_ROTATE;
//setting_map[HG_BASE_SETTING_INDEX_FRACTATE_CHECK] = HG_239_SETTING_FRACTATE; 暂时屏蔽
//setting_map[HG_BASE_SETTING_INDEX_FRACTATE_CHECK_LEVEL] = HG_239_SETTING_FRACTATE_COMPLEX;
setting_map[HG_BASE_SETTING_INDEX_SKEW_CHECK] = HG_239_SETTING_SCREW;
setting_map[HG_BASE_SETTING_INDEX_SKEW_CHECK_LEVEL] = HG_239_SETTING_SCREW_COMPLEX;
}
int hg_scanner_200::on_scanner_closing(bool force)
{
return HG_ERR_OK;
}
void hg_scanner_200::thread_handle_usb_read(void)
{
int ret = HG_ERR_OK,
prev_err = HG_ERR_OK;
StopWatch sw;
bool first = true;
while (run_)
{
//if (user_cancel_)
// break;
if (sw.elapsed_s() > 30)
{
// no any data in 30 seconds, we giveup the work ...
status_ = prev_err != HG_ERR_OK ? prev_err : HG_ERR_TIMEOUT;
break;
}
USBCB usb = {0};
ret = get_scanner_status(usb);
2022-05-03 03:56:07 +00:00
if (ret == HG_ERR_DEVICE_NOT_FOUND)
{
// device left, the work is no meanning ...
status_ = ret;
break;
}
else if (usb.u32_Data == HAVE_IMAGE)
2022-05-03 03:56:07 +00:00
{
ret = get_img_data(usb.u32_Count);
2022-05-03 03:56:07 +00:00
io_->set_timeout(200);
pop_image();
sw.reset();
first = false;
}
else if (ret == HG_ERR_DEVICE_STOPPED)
{
status_ = prev_err;
break;
}
else if(ret != HG_ERR_OK)
{
if (prev_err == HG_ERR_OK)
{
if (first)
{
// if the error occurs at the 2nd paper, then the first normal paper maybe lost, we delay 2 seconds here ...
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
get_scanner_status(usb);
if (usb.u32_Data == HAVE_IMAGE)
2022-05-03 03:56:07 +00:00
{
get_img_data(usb.u32_Count);
2022-05-03 03:56:07 +00:00
io_->set_timeout(200);
pop_image();
sw.reset();
first = false;
prev_err = ret;
continue;
}
status_ = ret;
break;
}
}
else
notify_ui_working_status(hg_scanner::error_description((hg_err)prev_err).c_str(), SANE_EVENT_ERROR, prev_err);
prev_err = ret;
}
this_thread::sleep_for(chrono::milliseconds(2));
}
}
int hg_scanner_200::start(void)
{
int ret = HG_ERR_OK,
count = -1;
2022-05-06 10:02:06 +00:00
//discard_prev();
2022-05-03 03:56:07 +00:00
user_cancel_ = false;
2022-05-06 10:02:06 +00:00
//ret = writedown_device_configuration(true);
2022-05-03 03:56:07 +00:00
if (ret == HG_ERR_OK)
writedown_image_configuration();
else
{
status_ = ret;
return ret;
}
printf_devconfig();
2022-05-06 09:34:17 +00:00
//writedown_device_configuration(true);
// ret = get_scan_is_sleep();
// if (ret == HG_ERR_DEVICE_SLEEPING)
// {
// status_ = ret;
// notify_ui_working_status(STATU_DESC_HG_ERR_DEVICE_SLEEPING, SANE_EVENT_SCAN_FINISHED, status_);
// HG_VLOG_MINI_1(HG_LOG_LEVEL_WARNING, "device start status is(%s)\n", STATU_DESC_HG_ERR_DEVICE_SLEEPING);
// return ret;
// }
2022-05-03 03:56:07 +00:00
ret = get_scanner_paperon();
if (ret == HG_ERR_DEVICE_NO_PAPER)
{
status_ = ret;
notify_ui_working_status(STATU_DESC_HG_ERR_DEVICE_NO_PAPER, SANE_EVENT_ERROR, status_);
HG_VLOG_MINI_1(HG_LOG_LEVEL_WARNING, "device start status is(%s)\n", STATU_DESC_HG_ERR_DEVICE_NO_PAPER);
return ret;
}
USBCB usb = {START_COMMAND, img_conf_.scannum, 0};
ret = writeusb(usb);
io_->set_timeout(500);
HG_VLOG_MINI_1(HG_LOG_LEVEL_WARNING, "device start is.(%s)\n", hg_scanner::strerr((hg_err)ret).c_str());
if(ret == HG_ERR_OK)
{
status_ = HG_ERR_DEVICE_BUSY;
wait_usb_.notify();
std::this_thread::sleep_for(std::chrono::milliseconds(300));
}
else
status_ = ret;
return ret;
}
int hg_scanner_200::stop(void)
{
int ret = HG_ERR_OK;
USBCB usbcb = {STOP, 0, 0};
ret = writeusb(usbcb);
user_cancel_ = true;
if (ret == HG_ERR_DEVICE_BUSY)
{
HG_LOG(HG_LOG_LEVEL_DEBUG_INFO,"stop status is busy\r\n");
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
else if (ret == HG_ERR_OK)
{
status_ = HG_ERR_DEVICE_STOPPED;
}
return status_;
}
int hg_scanner_200::writeusb(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = HG_ERR_OK;
int len = sizeof(usb);
ret = io_->write_bulk(&usb,&len);
if (ret)
{
status_ = ret;
}
return ret;
}
int hg_scanner_200::readusb(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = HG_ERR_OK;
int len = sizeof(USBCB);
ret = io_->read_bulk(&usb,&len);
if (ret)
{
status_ = ret;
}
return ret;
}
2022-05-03 03:56:07 +00:00
int hg_scanner_200::pop_image()
{
int ret = HG_ERR_OK;
USBCB usbcb = {POP_IMAGE, 0, 0};
ret = writeusb(usbcb);
return ret;
}
int hg_scanner_200::get_scanner_status(USBCB &usb)
2022-05-03 03:56:07 +00:00
{
int ret = HG_ERR_OK;
usb = {GET_DSP_STATUS, 0, 0};
2022-05-03 03:56:07 +00:00
ret = writeusb(usb);
2022-05-03 03:56:07 +00:00
if (ret != HG_ERR_OK)
return ret;
io_->set_timeout(500);
ret = readusb(usb);
2022-05-03 03:56:07 +00:00
if (ret != HG_ERR_OK)
{
status_ = ret;
return ret;
}
return settingsdsp_200::device_status_to_hg_err(usb.u32_Data, nullptr);
2022-05-03 03:56:07 +00:00
}
int hg_scanner_200::get_img_data(unsigned int bytes)
{
2022-05-06 05:37:14 +00:00
int total = bytes,
ret = HG_ERR_OK,
index = 0,
block = total;
2022-05-03 03:56:07 +00:00
std::shared_ptr<std::vector<char >> imagedata(new std::vector<char>(total));
USBCB usb{GET_IMAGE, 0, total};
ret = writeusb(usb);
if (ret != HG_ERR_OK)
{
status_ = ret;
return ret;
}
io_->set_timeout(500);
2022-05-03 03:56:07 +00:00
while (total > 0)
{
block = 512 * 1024;
2022-05-03 03:56:07 +00:00
if (total < block)
block = total;
2022-05-06 05:37:14 +00:00
ret = io_->read_bulk(imagedata->data() + index,&block);
io_->set_timeout(500); //不能删除可能会导致IO超时
2022-05-03 03:56:07 +00:00
if (ret != HG_ERR_OK)
break;
index += block;
total -= block;
2022-05-03 03:56:07 +00:00
}
if (ret == HG_ERR_OK)
{
ret = save_usb_data(imagedata);
}
return ret;
}
void hg_scanner_200::image_process(std::shared_ptr<std::vector<char>>& buffer)
{
int ret = HG_ERR_OK;
hg_imgproc::IMGPRCPARAM param;
hg_imgproc::HIMGPRC handle = NULL;
hg_imgproc::IMGHEAD ih;
int err = HG_ERR_OK,
index = 0;
void* buf = NULL;
param.bits = 8;
param.black_white = img_conf_.pixtype == COLOR_MODE_BLACK_WHITE;
param.channels = img_conf_.pixtype == COLOR_MODE_24_BITS ? 3 : 1;
param.color_mode = img_conf_.pixtype;
param.double_side = img_conf_.is_duplex;
param.dpi = img_conf_.resolution_dst;
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"param.black_white :%d\r\n",param.black_white);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"param.channels :%d\r\n",param.channels);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"param.color_mode :%d\r\n",param.color_mode);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"param.double_side :%d\r\n",param.double_side);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"param.dpi :%d\r\n",param.dpi);
2022-05-04 08:57:05 +00:00
handle = hg_imgproc::init(&img_conf_,&param,pid_);
2022-05-03 03:56:07 +00:00
hg_imgproc::load_buffer(handle, buffer);
hg_imgproc::decode(handle,pid_);
if (img_conf_.fillhole.is_fillhole)
{
ret = hg_imgproc::fillhole(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"填穿孔开启\r\n");
}
/////////////////////////////////////111111111111111111111111111//////////////////////////////////
ret = hg_imgproc::auto_crop(handle);
if (img_conf_.is_autodiscradblank_normal || img_conf_.is_autodiscradblank_vince)
{
ret = hg_imgproc::discardBlank(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"丢弃空白页开启\r\n");
}
if(img_conf_.fadeback)
{
hg_imgproc::fadeback(handle,img_conf_.fadebackrange,param.double_side);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"背景除色开启\r\n");
}
if (img_conf_.resolution_dst != img_conf_.resolution_native)
{
hg_imgproc::resolution_change(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"dpi改变开启\r\n");
}
if (img_conf_.cropRect.enable && !img_conf_.is_autocrop)
{
hg_imgproc::croprect(handle);
2022-05-06 09:34:17 +00:00
//printf("手动裁图开启\r\n");
2022-05-03 03:56:07 +00:00
}
if (img_conf_.filter != ColorFilter::FILTER_NONE && (img_conf_.pixtype == COLOR_MODE_BLACK_WHITE || img_conf_.pixtype == COLOR_MODE_256_GRAY))
{
hg_imgproc::channel(handle);
//printf("除色开启\r\n");
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"除色开启\r\n");
}
/////////////////////////////////////2222222222222222222222222222222222222//////////////////////////////////
hg_imgproc::customgamma(handle,false); //临时false
if (img_conf_.pixtype == COLOR_MODE_24_BITS && img_conf_.hsvcorrect)
{
hg_imgproc::answerSheetFilterRed(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"答题卡出红开启\r\n");
}
if (img_conf_.refuseInflow)
{
hg_imgproc::antiInflow(handle,image_prc_param_.bits.is_permeate_lv_);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"防止渗透开启\r\n");
}
if (img_conf_.colorCorrection && img_conf_.pixtype != COLOR_MODE_BLACK_WHITE)
{
hg_imgproc::colorCorrection(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"颜色校正开启\r\n");
}
if ((img_conf_.is_autotext != TEXT_DIRECTION_0 || img_conf_.is_backrotate180) && (img_conf_.is_autotext != TEXT_DIRECTION_AUTO))
{
hg_imgproc::orentation(handle);
2022-05-06 09:34:17 +00:00
//printf("img_conf_ =%d 自动旋转开启\r\n",img_conf_.is_autotext);
2022-05-03 03:56:07 +00:00
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"自动旋转开启\r\n");
}
if (img_conf_.removeMorr)
{
hg_imgproc::textureRemove(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"除摩尔纹开启\r\n");
}
if (img_conf_.detachnoise.is_detachnoise)
{
hg_imgproc::nosieDetach(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"噪点优化开启\r\n");
}
if (img_conf_.pixtype == COLOR_MODE_BLACK_WHITE)
{
hg_imgproc::errorextention(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"黑白图处理开启\r\n");
}
if (img_conf_.en_fold)
{
hg_imgproc::fold(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"对折开启\r\n");
}
///////////////////////////////////
if (image_prc_param_.bits.rid_red && img_conf_.pixtype == COLOR_MODE_24_BITS)
{
err = hg_imgproc::multi_out_red(handle);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"多流出红开启\r\n");
}
if (image_prc_param_.bits.multi_out != MULTI_OUT_NOT && !user_cancel_)
{
//err = hg_imgproc::multi_out(handle,image_prc_param_.bits.multi_out - 1); 非法指令 暂时屏蔽
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"多流输出开启\r\n");
}
if (img_conf_.sharpen)
{
hg_imgproc::sharpenType(handle);
}
if (image_prc_param_.bits.split && !user_cancel_)
{
int colormode=1;
if(img_conf_.filter == RID_COLOR_NONE)
colormode=img_conf_.pixtype;
err = hg_imgproc::split(handle,img_conf_.multiOutput,img_conf_.splitImage,img_conf_.multi_output_red,colormode,img_conf_.is_duplex);
HG_VLOG_MINI_5(HG_LOG_LEVEL_DEBUG_INFO, "img split-> multiOutput is:%d splitImage is:%d multi_output_red is:%d pixtype is:%d is_duplex:%d\r\n"
,img_conf_.multiOutput
,img_conf_.splitImage
,img_conf_.multi_output_red
,img_conf_.pixtype
,img_conf_.is_duplex);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"图像拆分开启\r\n");
}
if (!image_prc_param_.bits.split || !image_prc_param_.bits.rid_red || !image_prc_param_.bits.multi_out)
{
if(img_conf_.automaticcolor)
{
hg_imgproc::auto_matic_color(handle,img_conf_.automaticcolortype);
//HG_LOGHG_LOG_LEVEL_DEBUG_INFO,"颜色自动识别开启\r\n");
}
}
hg_imgproc::final(handle);
while (hg_imgproc::get_final_data(handle, &ih, &buf, index++) == HG_ERR_OK && !user_cancel_)
{
HG_VLOG_MINI_5(HG_LOG_LEVEL_DEBUG_INFO, "Final picture %d (%d * %d * %d) with %u bytes!\n", index
, ih.width, ih.height, ih.bits * ih.channels, ih.total_bytes);
std::vector<unsigned char>bmpdata;
if(!img_type_.empty())
{
hg_imgproc::imgtypechange(handle, img_type_, buf, bmpdata);
//cv::imencode(img_type_,*((cv::Mat*)buf),bmpdata);
if(bmpdata.empty())
{
status_ = HG_ERR_NO_DATA;
return ;
}
buf = bmpdata.data();
ih.total_bytes = bmpdata.size();
HG_VLOG_MINI_6(HG_LOG_LEVEL_DEBUG_INFO, "Set img type is:%s Final picture %d (%d * %d * %d) with %u bytes!\n",img_type_.c_str() ,index
, ih.width, ih.height, ih.bits * ih.channels, ih.total_bytes);
}
save_final_image(&ih, buf);
}
hg_imgproc::release(handle);
}
int hg_scanner_200::writedown_device_configuration(bool type,HGSCANCONF_DSP *d)
{
if (!type)
return HG_ERR_OK;
int ret = HG_ERR_OK,
len = 0;
if (!d)
d = &dsp_config_;
USBCB usbcb = {CONFIGURED_DATA, d->value, 0};
len = sizeof(USBCB);
ret = io_->write_bulk(&usbcb,&len);
HG_VLOG_MINI_1(HG_LOG_LEVEL_WARNING, "writedown_device_configuration is .(%s)\n", hg_scanner::strerr((hg_err)ret).c_str());
return ret;
}
int hg_scanner_200::on_color_mode_changed(int& color_mode)
{
int ret = HG_ERR_OK;
if (color_mode == COLOR_MODE_BLACK_WHITE || color_mode == COLOR_MODE_256_GRAY)
{
dsp_config_.params.color = 0;
}
else if(color_mode == COLOR_MODE_24_BITS || color_mode == COLOR_MODE_AUTO_MATCH)
{
dsp_config_.params.color = 1;
}
return ret;
}
int hg_scanner_200::on_paper_changed(int& paper)
{
bool exact = true;
int ind = settingsdsp_200::match_best_paper(paper, &exact, &paper_size_),
ret = exact ? HG_ERR_OK : HG_ERR_NOT_EXACT;
if (dsp_config_.params.paper != settingsdsp_200::paper_map[ind].dev_value)
{
int old = dsp_config_.params.paper;
dsp_config_.params.paper = settingsdsp_200::paper_map[ind].dev_value;
ret = writedown_device_configuration();
if (ret)
{
dsp_config_.params.paper = old;
for (int i = 0; i < ARRAY_SIZE(settingsdsp_200::paper_map); ++i)
{
if (settingsdsp_200::paper_map[i].dev_value == old)
{
paper = settingsdsp_200::paper_map[i].paper;
break;
}
}
}
else if (!exact)
ret = HG_ERR_NOT_EXACT;
}
return ret;
}
int hg_scanner_200::on_paper_check_changed(bool& check)
{
int ret = HG_ERR_OK;
if(dsp_config_.params.enable_sizecheck ^ check)
{
dsp_config_.params.enable_sizecheck = check;
ret = writedown_device_configuration();
if (ret)
{
dsp_config_.params.enable_sizecheck = !check;
check = dsp_config_.params.enable_sizecheck;
}
}
return ret;
}
int hg_scanner_200::on_resolution_changed(int& dpi)
{
int ret = HG_ERR_OK;
dsp_config_.params.dpi = 1;
ret = writedown_device_configuration();
return ret;
}
int hg_scanner_200::on_ultrasonic_check_changed(bool& check)
{
int ret = HG_ERR_OK;
if (dsp_config_.params.double_feed_enbale ^ check)
{
dsp_config_.params.double_feed_enbale = check;
ret = writedown_device_configuration();
if (ret)
{
dsp_config_.params.double_feed_enbale = !check;
check = dsp_config_.params.double_feed_enbale;
}
}
return ret;
}
int hg_scanner_200::on_staple_check_changed(bool& check)
{
int ret = HG_ERR_OK;
if (dsp_config_.params.stable_enbale ^ check)
{
dsp_config_.params.stable_enbale = check;
ret = writedown_device_configuration();
if (ret)
{
dsp_config_.params.stable_enbale = !check;
check = dsp_config_.params.stable_enbale;
}
}
return ret;
}
int hg_scanner_200::on_skew_check_changed(bool& check)
{
int ret = HG_ERR_OK;
if (dsp_config_.params.screw_detect_enable ^ check)
{
dsp_config_.params.screw_detect_enable = check;
ret = writedown_device_configuration();
if (ret)
{
dsp_config_.params.screw_detect_enable = !check;
check = dsp_config_.params.screw_detect_enable;
}
}
return ret;
}
int hg_scanner_200::on_skew_check_level_changed(int& check)
{
int ret = HG_ERR_OK,
val = check,
old = dsp_config_.params.screw_detect_level;
HGSCANCONF_DSP cf;
cf.params.screw_detect_level = -1;
if (val < 0)
{
val = 0;
ret = HG_ERR_NOT_EXACT;
}
else if (val > cf.params.screw_detect_level)
{
val = cf.params.screw_detect_level;
ret = HG_ERR_NOT_EXACT;
}
if (val != dsp_config_.params.screw_detect_level)
{
dsp_config_.params.screw_detect_level = val;
ret = writedown_device_configuration();
if (ret)
check = dsp_config_.params.screw_detect_level = old;
}
if (ret == HG_ERR_OK && val != check)
{
check = val;
ret = HG_ERR_NOT_EXACT;
}
return ret;
}
int hg_scanner_200::initdevice()
{
HGSCANCONF_DSP ds;
ds.params.paper = 0;
ds.params.color = 0;
ds.params.double_feed_enbale =0;
ds.params.dpi = 0;
ds.params.enable_sizecheck=0;
ds.params.pc_correct=0;
ds.params.screw_detect_enable=0;
ds.params.screw_detect_level = 0;
ds.params.stable_enbale = 0;
ds.params.unused_one = 0;
ds.params.unused_two = 0;
writedown_device_configuration(true,&ds);
printf_devconfig(&ds);
return HG_ERR_OK;
}
void hg_scanner_200::writedown_image_configuration(void)
{
SCANCONF ic;
ic.papertype = paper_size_;
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;
ic.en_sizecheck = dsp_config_.params.enable_sizecheck;
ic.imageRotateDegree = image_prc_param_.bits.text_direction * 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 || image_prc_param_.bits.page ==PAGE_FOLIO);
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; //存疑
ic.resolution_dst = resolution_;
ic.resolution_native = 200;
ic.gamma = (float)gamma_;
ic.contrast = contrast_ ;
ic.brightness = bright_ ;
ic.threshold = threshold_;
ic.is_autocontrast = 0; //无参数
ic.is_autocrop = (ic.papertype == TwSS::None || ic.papertype ==TwSS::USStatement);
ic.is_autodiscradblank_normal = image_prc_param_.bits.page == PAGE_OMIT_EMPTY;
ic.discardblank_percent = omit_empty_level_ > 70 ? 70 : omit_empty_level_; //默认20
ic.is_autodiscradblank_vince = image_prc_param_.bits.page == PAGE_OMIT_EMPTY_RECEIPT;
ic.is_switchfrontback = image_prc_param_.bits.exchange;
ic.autodescrew = image_prc_param_.bits.automatic_skew;
//ic.multi_output_red = image_prc_param_.bits.rid_red;
ic.hsvcorrect = image_prc_param_.bits.rid_answer_red;
ic.sharpen = image_prc_param_.bits.sharpen;
//ic.enhance_color = image_prc_param_.bits.rid_color;
ic.fillbackground = image_prc_param_.bits.erase_black_frame;
ic.is_convex = (image_prc_param_.bits.fill_background == FILL_BKG_CONVEX_POLYGON);
ic.noise = image_prc_param_.bits.noise_optimize;
ic.indent = margin_;
ic.AutoCrop_threshold = threshold_;
if (test_1_paper_)
{
HG_LOG(HG_LOG_LEVEL_DEBUG_INFO, "scanning mode: testing ONE paper ...\n");
2022-05-04 03:07:55 +00:00
ic.scannum = 1;
2022-05-03 03:56:07 +00:00
}
else
{
2022-05-04 03:07:55 +00:00
ic.scannum = scan_count_;
2022-05-03 03:56:07 +00:00
}
2022-05-04 03:07:55 +00:00
2022-05-03 03:56:07 +00:00
ic.is_backrotate180 = image_prc_param_.bits.rotate_back_180;
ic.is_dogeardetection = image_prc_param_.bits.fractate_check;
ic.hardwarecaps.en_skrewdetect = dsp_config_.params.screw_detect_enable;
ic.hardwarecaps.en_doublefeed = dsp_config_.params.double_feed_enbale;
ic.hardwarecaps.en_stapledetect = dsp_config_.params.stable_enbale;
ic.hardwarecaps.skrewdetectlevel = dsp_config_.params.screw_detect_level;
// ic.hardwarecaps.is_autopaper = dsp_config_.params.is_autopaper;
ic.hardwarecaps.capturepixtype = 0; //暂无参数 获取图像类型
ic.hardwarecaps.lowpowermode = LowPowerMode::Min_None; //暂无参数 设置休眠时间 两个参数3399未使用
ic.fillhole.is_fillhole = image_prc_param_.bits.rid_hole;
ic.fillhole.fillholeratio = rid_hole_range_;
ic.detachnoise.is_detachnoise = image_prc_param_.bits.noise_optimize;
ic.detachnoise.detachnoise = noise_range_;
ic.is_autotext = image_prc_param_.bits.text_direction == TEXT_DIRECTION_AUTO ? 1 :image_prc_param_.bits.text_direction;
ic.isfillcolor = false;//暂无参数 未使用到
ic.refuseInflow = image_prc_param_.bits.is_permeate;
ic.colorCorrection = 0;
ic.removeMorr = image_prc_param_.bits.remove_morr;
ic.errorExtention = image_prc_param_.bits.error_extention ;//暂无参数
ic.textureRemove = image_prc_param_.bits.remove_txtture;//暂无参数
ic.splitImage = image_prc_param_.bits.split;
2022-05-06 09:34:17 +00:00
//custom_area_br_x_ *ic.resolution_dst /25.4;
//custom_area_br_y_ *ic.resolution_dst /25.4;
ic.cropRect.enable = custom_area_;
ic.cropRect.height = custom_area_br_y_ *ic.resolution_dst /25.4;
ic.cropRect.width = custom_area_br_x_ *ic.resolution_dst /25.4;
ic.cropRect.x = custom_area_lt_x_ *ic.resolution_dst /25.4;
ic.cropRect.y = custom_area_lt_y_ *ic.resolution_dst /25.4;
2022-05-03 03:56:07 +00:00
ic.multiOutput = MultiOutput::Unused; //暂无参数
ic.normalCrop = image_prc_param_.bits.dark_sample;
ic.dogeardistabce = fractate_level_;
ic.fadeback = image_prc_param_.bits.erase_bakground;
ic.fadebackrange = erase_bkg_range_;
int filter_clr[] = { 3, 0, 1, 2, 5, 6, 7 };
if(image_prc_param_.bits.color_mode == COLOR_MODE_24_BITS || image_prc_param_.bits.color_mode == COLOR_MODE_AUTO_MATCH)
ic.filter = 3;
else
{
ic.filter = filter_clr[image_prc_param_.bits.rid_color];
// if(ic.filter != 3)
// ic.pixtype = 2;
ic.hsvcorrect = 0;
ic.multi_output_red = 0;
ic.multiOutput = MultiOutput::Unused;
ic.fadeback = false;
}
img_conf_ = ic;
//printf ("ic.resolution_native =%f ic.resolution_dst = %f img_conf_.resolution_dst = %f \r\n",ic.resolution_native,ic.resolution_dst,img_conf_.resolution_dst);
agreement();
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.pixtype=%d", ic.pixtype);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.papertype=%d", ic.papertype);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.AutoCrop_threshold=%d", ic.AutoCrop_threshold);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.autodescrew=%d", ic.autodescrew);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.automaticcolor=%d", ic.automaticcolor);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.brightness=%f", ic.brightness);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.contrast=%f", ic.contrast);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.en_fold=%d", ic.en_fold);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.en_sizecheck=%d", ic.en_sizecheck);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.enhance_color=%d", ic.enhance_color);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.fillbackground=%d", ic.fillbackground);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.filter=%d", ic.filter);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.gamma=%f", ic.gamma);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.hardwarecaps.capturepixtype=%d", ic.hardwarecaps.capturepixtype);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.hardwarecaps.en_doublefeed=%d", ic.hardwarecaps.en_doublefeed);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.hsvcorrect=%d", ic.hsvcorrect);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.imageRotateDegree=%f", ic.imageRotateDegree);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.indent=%d", 5);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_autocontrast=%d", ic.is_autocontrast);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_autocrop=%d", ic.is_autocrop);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_autodiscradblank_normal=%d", ic.is_autodiscradblank_normal);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_autodiscradblank_vince=%d", ic.is_autodiscradblank_vince);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_autotext=%d", ic.is_autotext);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_backrotate180=%d", ic.is_backrotate180);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_convex=%d", ic.is_convex);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_duplex=%d", ic.is_duplex);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_switchfrontback=%d", ic.is_switchfrontback);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.is_dogeardetection=%d", ic.is_dogeardetection);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.fillhole.multi_output_red=%d", ic.multi_output_red);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.noise=%d", 8);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.resolution_dst=%f", ic.resolution_dst);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.resolution_native=%f", ic.resolution_native);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.scannum=%d", ic.scannum);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.sharpen=%d", ic.sharpen);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.discardblank_percent=%d", ic.discardblank_percent);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.is_detachnoise=%d", ic.detachnoise.is_detachnoise);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.detachnoise=%d\r ", ic.detachnoise.detachnoise);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.detachnoise.refuseInflow=%d\r ", ic.refuseInflow);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.refuseInflow=%d\r ", ic.refuseInflow);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.removeMorr=%d\r ", ic.removeMorr);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.errorExtention=%d\r ", ic.errorExtention);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.textureRemove=%d\r\n ", ic.textureRemove);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.fillhole.is_fillhole=%d\r\n ", ic.fillhole.is_fillhole);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.ic.fillhole.fillholeratio=%f\r\n ", ic.fillhole.fillholeratio);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.fadeback=%d\r\n ",ic.fadeback);
2022-05-06 09:34:17 +00:00
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.enable=%d\r\n ",ic.cropRect.enable);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.height=%d\r\n ",ic.cropRect.height);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.width=%d\r\n ",ic.cropRect.width);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.x=%d\r\n ",ic.cropRect.x);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\n ic.cropRect.y=%d\r\n ",ic.cropRect.y);
2022-05-03 03:56:07 +00:00
}
void hg_scanner_200::printf_devconfig(HGSCANCONF_DSP *d)
{
io_->set_timeout(200);
if (!d)
d = &dsp_config_;
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"\r\ndsp_config.params.color:%d\r\n",d->params.color);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.double_feed_enbale:%d\r\n",d->params.double_feed_enbale);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.dpi:%d\r\n",d->params.dpi);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.enable_sizecheck:%d\r\n",d->params.enable_sizecheck);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.paper:%d\r\n",d->params.paper);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.pc_correct:%d\r\n",d->params.pc_correct);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.screw_detect_enable:%d\r\n",d->params.screw_detect_enable);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.screw_detect_level:%d\r\n",d->params.screw_detect_level);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.stable_enbale:%d\r\n",d->params.stable_enbale);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.unused_one:%d\r\n",d->params.unused_one);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.unused_two:%d\r\n",d->params.unused_two);
HG_VLOG_MINI_1(HG_LOG_LEVEL_DEBUG_INFO,"dsp_config_.params.value:%d\r\n",d->value);
}
std::string hg_scanner_200::get_firmware_version()
{
char buf[20] = { 0 };
2022-05-03 03:56:07 +00:00
int ret = HG_ERR_OK,
len = 8; //协议定义长度为8 300 400 =10
USBCB cmd = {GET_FW_VERSION, len, 0,};
ret = writeusb(cmd);
if(ret == HG_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(buf, &len);
2022-05-03 03:56:07 +00:00
}
return buf;
2022-05-03 03:56:07 +00:00
}
std::string hg_scanner_200::get_serial_num()
{
char buf[20] = { 0 };
2022-05-03 03:56:07 +00:00
int ret = HG_ERR_OK,
len = 12; //协议定义长度为8 300 400 =10
USBCB cmd = {GET_SERIAL, len, 0,};
ret = writeusb(cmd);
if (ret == HG_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(buf, &len);
2022-05-03 03:56:07 +00:00
}
return buf;
2022-05-03 03:56:07 +00:00
}
int hg_scanner_200::agreement()
{
int ret = HG_ERR_OK;
2022-05-04 03:07:55 +00:00
if (image_prc_param_.bits.rid_color != RID_COLOR_NONE)
{
dsp_config_.params.color = 1;
}
2022-05-03 03:56:07 +00:00
2022-05-04 03:07:55 +00:00
ret = writedown_device_configuration(true);
io_->set_timeout(200);
2022-05-03 03:56:07 +00:00
return ret;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int hg_scanner_200::set_leaflet_scan(void)
{
int ret = HG_ERR_OK;
test_1_paper_ = true;
ret = start();
return ret;
}
int hg_scanner_200::get_abuot_info(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::restore_default_setting(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::set_img_format(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_compression_format(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::set_compression_format(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::set_auto_color_type(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_device_code(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_sleep_time(SANE_Power* getime)
{
int ret = HG_ERR_OK,
len = 0;
USBCB usbcb = {GET_SLEEP_TIME, 0, 0};
ret = writeusb(usbcb);
if (ret != HG_ERR_OK)
{
return ret;
}
len = sizeof(usbcb);
ret = io_->read_bulk(&usbcb,&len);
printf("usbcb.u32_Data = %d\r\n",usbcb.u32_Data);
2022-05-03 03:56:07 +00:00
if (ret == HG_ERR_OK)
{
if (getime)
{
*getime = (SANE_Power)usbcb.u32_Data;
2022-05-03 03:56:07 +00:00
}
if (usbcb.u32_Data)
2022-05-03 03:56:07 +00:00
{
return HG_ERR_DEVICE_SLEEPING;
}
}
return ret;
}
int hg_scanner_200::set_sleep_time(SANE_Power* setime)
{
if (!setime)
{
return HG_ERR_NO_DATA;
}
int ret = HG_ERR_OK,
time = *setime;
USBCB usbcb = {SET_SLEEP_TIME,time, 0};
ret = writeusb(usbcb);
return ret;
}
int hg_scanner_200::get_dogear_distance(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::set_dogear_distance(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_scanner_paperon(SANE_Bool* paperon)
{
int ret = HG_ERR_OK,
len = 0;
USBCB usbcb = {GET_PAPER_STATUS, 0, 0};
len = sizeof(USBCB);
ret = writeusb(usbcb);
io_->set_timeout(500);
if (ret == HG_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&usbcb,&len);
}
if (ret != HG_ERR_OK)
{
return ret;
2022-05-03 03:56:07 +00:00
}
if (usbcb.u32_Data == 0)
ret = HG_ERR_DEVICE_NO_PAPER;
else
ret = HG_ERR_OK;
2022-05-03 03:56:07 +00:00
if (paperon)
{
*paperon = usbcb.u32_Data;
}
2022-05-03 03:56:07 +00:00
return ret;
}
int hg_scanner_200::set_scan_when_paper_on(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_scan_when_paper_on(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_scan_with_hole(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::set_scan_with_hole(void)
{
return HG_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner_200::get_scan_is_sleep()
{
int ret = HG_ERR_OK,
len = 0;
2022-05-06 05:37:14 +00:00
USBCB usbcb = { CHECK_IS_SLEEP, 0, 0};
len = sizeof(USBCB);
2022-05-03 03:56:07 +00:00
ret = writeusb(usbcb);
io_->set_timeout(200);
if (ret == HG_ERR_OK)
{
2022-05-06 05:37:14 +00:00
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&usbcb,&len);
2022-05-03 03:56:07 +00:00
}
if (ret != HG_ERR_OK)
{
return ret;
}
if (usbcb.u32_Data == 0x10)
2022-05-03 03:56:07 +00:00
{
return HG_ERR_OK;
}
else if (usbcb.u32_Data == 0x100)
2022-05-03 03:56:07 +00:00
{
return HG_ERR_DEVICE_SLEEPING;
}
}