兼容飞线版本3399设备

This commit is contained in:
masayume 2021-12-16 16:21:35 +08:00
parent 7316be3dd0
commit 9f060c7745
22 changed files with 288 additions and 179 deletions

View File

@ -5,7 +5,17 @@
3.修复保存首选项不能保存高级设置参数问题
4.新增奥鸽G139型号
2021年11月20日
版本3.3.5.4
版本3.3.5.5
1.添加配置文件,可开关显示滚轴弹框以及打印协议设置信息
2.调整twain协议
3.更新穿孔算法
3.更新穿孔算法
4.合入提升效率版本ocr
2021年12月01日
版本3.3.5.6
1.添加连续扫描模式
2.增加g200 扫描仪升降台异常处理
3.添加图像拆分功能
4.修复3399对折扫描异常时的丢图问题
5.根据arm固件进行兼容以A1209为分界线根据版本显示连续扫描
6.屏蔽对折前旋转,奥鸽要求
7.修复首选项保存时亮度读取异常问题

View File

@ -30,7 +30,7 @@ void CIndicatorDlg::DoDataExchange(CDataExchange* pDX)
BOOL CIndicatorDlg::OnInitDialog()
{
#ifdef LANXUM
GetDlgItem(IDC_BTNSTOPSCAN)->ShowWindow(SW_HIDE);
//GetDlgItem(IDC_BTNSTOPSCAN)->ShowWindow(SW_HIDE);
#endif // LANXUM
return 0;
}

View File

@ -17,7 +17,7 @@
IMPLEMENT_DYNAMIC(CTwainUI, CDialogEx)
CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::string hardwareversion, std::string serialnum, CWnd* pParent /*=nullptr*/)
CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::string hardwareversion, std::string serialnum, std::uint32_t mbversion ,CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_TWAINUI, pParent)
, m_tabCtrl(new CTabCtrlSSL())
, m_pageBrightness(new CBrightnessPage)
@ -29,6 +29,7 @@ CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::st
{
m_hardwareVersion = hardwareversion;
m_serialnum = serialnum;
m_mbversion = mbversion;
//memset(settings.get(), 0, sizeof(GScanCap));
/*m_pageImageProc->noise = caps.noise;
m_pageImageProc->is_convex = caps.is_convex;
@ -92,8 +93,21 @@ BOOL CTwainUI::OnInitDialog()
setvisable_sleepmode(false);
#ifdef G200
setvisable_dogear(true);
if (m_hardwareVersion.size() > 9)
{
if (m_hardwareVersion[5] > 'A' || atoi(m_hardwareVersion.substr(6, 4).c_str()) > 1209)
{
if (m_mbversion >= 35211210)
setvisable_autopaper(true);
else
setvisable_autopaper(false);
}
else
setvisable_autopaper(false);
}
#else
setvisable_dogear(false);
setvisable_autopaper(false);
#endif // G200
return true;
}
@ -166,6 +180,7 @@ void CTwainUI::UpdateUI()
m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型
m_pageBasic->m_enableSizeCheck = settings->en_sizecheck==1?TRUE:FALSE;//!< 尺寸检测
m_pageBasic->m_bswitchfrontback = settings->is_switchfrontback ? TRUE : FALSE; //!< 交换正反面
((CButton*)m_pageBasic->GetDlgItem(IDC_CKSPLIT))->SetCheck(settings->is_split);
#ifdef UV
m_pageBasic->m_bUV = settings->hardwarecaps.en_uv == 1 ? TRUE : FALSE;
#endif
@ -236,6 +251,7 @@ void CTwainUI::UpdateUI()
m_pageFeedPaper->m_cbStaple = settings->hardwarecaps.en_stapledetect==TRUE ? TRUE : FALSE;//装订检测
m_pageFeedPaper->m_cbDoublePaper = settings->hardwarecaps.en_doublefeed==TRUE ? TRUE : FALSE;//双张检测
m_pageFeedPaper->m_cbSkew = settings->hardwarecaps.en_skrewdetect==TRUE ? TRUE : FALSE;//歪斜检测
((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->SetCheck(settings->hardwarecaps.is_autopaper);
m_pageFeedPaper->m_cmBoxOrentation.SetCurSel(settings->is_autotext?4:getRotateCmbIndex(settings->imageRotateDegree));//旋转方向;
m_pageFeedPaper->m_sldSkrewDetecttion.SetPos(m_pageFeedPaper->m_cbSkew?settings->hardwarecaps.skrewdetectlevel:3);//歪斜检测等级
m_pageFeedPaper->m_sldSkrewDetecttion.EnableWindow(m_pageFeedPaper->m_cbSkew);
@ -485,6 +501,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
//settings->resolution_dst = Resolutions[configItem->Resolution];
settings->resolution_dst = configItem->Resolution;
settings->resolution_native = 200.0f;
settings->is_split = ((CButton*)m_pageBasic->GetDlgItem(IDC_CKSPLIT))->GetCheck();
settings->is_switchfrontback = configItem->EnSwitchFrontBack ? 1 : 0;
//float value_Contrast = GetContrast(configItem->Contrast);
settings->contrast = configItem->Contrast;
@ -521,6 +538,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->hardwarecaps.en_skrewdetect = configItem->EnScrewDetect;
settings->hardwarecaps.skrewdetectlevel = (int)configItem->ScrewDetectLevel;
settings->hardwarecaps.en_stapledetect = configItem->EnBindingDetect;
settings->hardwarecaps.is_autopaper = ((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->GetCheck();
settings->hardwarecaps.en_doublefeed = configItem->EnUltrasonicDetect;
settings->dogeardistance = m_pageFeedPaper->m_slider_dogear.GetPos();
settings->en_fold = configItem->EnFlod ? 1 : 0;
@ -656,6 +674,13 @@ void CTwainUI::setvisable_dogear(bool flag)
((CButton*)m_pageFeedPaper->GetDlgItem(IDC_DogEarDetection))->SetCheck(false);
}
void CTwainUI::setvisable_autopaper(bool flag)
{
((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->ShowWindow(flag ? SW_SHOW : SW_HIDE);
if (!flag)
((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKAUTOPAPER))->SetCheck(false);
}
void CTwainUI::EnableID_OKorID_Cancel(bool enable)
{
GetDlgItem(IDC_CONFIRM)->EnableWindow(enable);

View File

@ -165,7 +165,7 @@ class CTwainUI : public CDialogEx
DECLARE_DYNAMIC(CTwainUI)
public:
CTwainUI(TwGlue glue,GScanCap caps,std::string confirmtitle,std::string hardwareversion,std::string serialnum, CWnd* pParent = nullptr); // 标准构造函数
CTwainUI(TwGlue glue,GScanCap caps,std::string confirmtitle,std::string hardwareversion,std::string serialnum,std::uint32_t mbversion ,CWnd* pParent = nullptr); // 标准构造函数
virtual ~CTwainUI();
void UpdateUI();
@ -176,6 +176,7 @@ public:
void setvisable_size(bool flag);
void setvisable_sleepmode(bool flag);
void setvisable_dogear(bool flag);
void setvisable_autopaper(bool flag);
void EnableID_OKorID_Cancel(bool enable);
// 对话框数据
#ifdef AFX_DESIGN_TIME
@ -184,6 +185,7 @@ public:
public:
std::string m_hardwareVersion;
std::string m_serialnum;
std::uint32_t m_mbversion;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

View File

@ -89,6 +89,8 @@ typedef enum tagUsbSupported {
SLEEPING = 81,
//检测到有折角
HAVE_DOGEAR = 82,
//
MLTOP_TIMEOUT = 83,
//USB 未连接
USB_DISCONNECTED = 200,
//用户点击停止
@ -122,6 +124,7 @@ static map<UsbSupported, string> msgs = {
{UsbSupported::V4L2_IMAGE_EMPTY,"扫描仪图像处理异常!"},
{UsbSupported::SLEEPING,"设备处于休眠模式,请按电源键关闭休眠!"},
{UsbSupported::HAVE_DOGEAR,"检测到有折角,停止扫描!"},
{UsbSupported::MLTOP_TIMEOUT,"升降台抬升未到达指定位置!"},
};
enum tagEventIndex

View File

@ -127,7 +127,7 @@ int GScanO1003399::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
{
if ((imagecount == 0) && (!scanflag) || (sw.elapsed_s() > 30))
{
if (is_scan())
if (is_scan() || (m_param.hardwarecaps.is_autopaper && (sw.elapsed_s() > 30)))
{
sw.reset();
continue;
@ -203,7 +203,14 @@ std::string GScanO1003399::GetSerialNum()
std::uint32_t GScanO1003399::GetMotorFPGA()
{
return std::uint32_t();
std::string fw;
if (m_usb.get() && m_usb->is_connected())
{
fw.resize(scanner_read_reg(m_usb, SR_GET_MBVERSION_LENGHT));
scanner_write_reg(m_usb, SR_GET_MBVERSION,0);
m_usb->read_bulk(&fw[0], fw.size());
}
return atoi(fw.c_str());
}
std::uint32_t GScanO1003399::GetScanFPGA()
@ -250,7 +257,7 @@ void GScanO1003399::config_params(GScanCap& param)
cfg.g200params.stable_enbale = (unsigned int)param.hardwarecaps.en_stapledetect;
cfg.g200params.screw_detect_enable = (unsigned int)param.hardwarecaps.en_skrewdetect;
cfg.g200params.screw_detect_level = (unsigned int)cfg.g200params.screw_detect_enable ? secrewMaps[param.hardwarecaps.skrewdetectlevel] : 0;
cfg.g200params.is_autopaper = param.hardwarecaps.is_autopaper;
cfg.g200params.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
cfg.g200params.unused_one = cfg.g200params.sizeerror_errorratio = 0;
@ -345,7 +352,17 @@ void GScanO1003399::config_params(GScanCap& param)
void GScanO1003399::Scanner_StartScan(UINT16 count)
{
error_index = 0;
auto fwver = GetFWVersion();
if (fwver[5] > 'A' || atoi(fwver.substr(6, 4).c_str()) >= 1209)
{
if (GetMotorFPGA() >= 35211210)
is_kernelsnap_211209 = true;
else
is_kernelsnap_211209 = false;
}
else
is_kernelsnap_211209 = false;
error_index = autopaperstop = 0;
roller_num = this->count();
scanflag = true;
while (m_paths.Size() > 0)
@ -353,10 +370,8 @@ void GScanO1003399::Scanner_StartScan(UINT16 count)
remove(m_paths.Take().c_str());
}
Set_ErrorCode(0);
getimgnum = 0;
aquirenum = 0;
imagecount = 0;
keeplastimg = true;
getimgnum = aquirenum = imagecount = 0;
keeplastimg = is_kernelsnap_211209 ? false : true;//true
reset();
devState = DEV_ISRUNNING;
if (scanner_read_reg(m_usb, SR_GET_SLEEP_STAUTUS) != 1)
@ -373,17 +388,6 @@ void GScanO1003399::Scanner_StartScan(UINT16 count)
scanflag = false;
return;
}
//int val = scanner_read_reg(m_usb, SR_GET_MBSTATUS);
//if (val)
//{
// devState = DEV_WRONG;
// HGEIntInfo info;
// info.From = MtBoard;
// info.Code = val == 0x14 ? 4 : val;
// Set_ErrorCode(codeconvter(info));
// scanflag = false;
// return;
//}
//if (!Get_Scanner_PaperOn())
//{
// devState = DEV_WRONG;
@ -400,49 +404,21 @@ void GScanO1003399::Scanner_StartScan(UINT16 count)
m_imgprocthread->join();
}
m_imgprocthread.reset(new thread(&GScanO1003399::proc, this, procmode));
//if (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131) {
// b_imgprothread = true;
// m_imgprocthread.enqueue([this] {
// while (b_imgprothread)
// {
// if (m_paths.Size() < 1)
// {
// this_thread::sleep_for(chrono::milliseconds(10));
// continue;
// }
// auto path = m_paths.Take();
// if (!path.empty())
// {
// auto fd = fopen(path.c_str(), "rb+");
// if (fd)
// {
// auto lenght = FileTools::get_file_size(path.c_str());
// std::shared_ptr<std::vector<char>> buff(new std::vector<char>);
// buff->resize(lenght);
// fread(buff->data(), lenght, 1, fd);
// fclose(fd);
// remove(path.c_str());
// imgproce(buff);
// }
// else {
// FileTools::writelog(log_ERROR, "img tmp file read error file name =" + path);
// }
// }
// }
// });
//}
//else
//{
// b_imgprothread = false;
//}
}
void GScanO1003399::Stop_scan()
{
stop();
if (m_param.hardwarecaps.is_autopaper)
{
autopaperstop = true;
if (!is_scan() && imagecount == 0)
scanflag = false;
}
if ((devState == DEV_WRONG) || (devState == DEV_STOP))
return;
devState = DEV_STOP;
}
int GScanO1003399::notifyscan()
@ -543,39 +519,39 @@ void GScanO1003399::usb_run()
}
if ((codeconvter(info) == -1))
{
//if ((get_ErrorCode() != PAPER_JAM) && (get_ErrorCode() != DETECT_DOUBLE_FEED) && (get_ErrorCode() != DETECT_STAPLE))
//{
// keeplastimg = false;
// while (im_dev_count())
// im_rx();
// scanflag = false;
//}
//else {
while (!scanner_read_reg(m_usb, SR_GET_IMAGEPROCESSDONE))
this_thread::sleep_for(chrono::microseconds(30));
if (scanner_read_reg(m_usb, SR_GET_KEEP_LAST_PAPER))
{
this_thread::sleep_for(chrono::milliseconds(100));
while(im_dev_count()>( m_param.is_duplex?2:1))
im_rx();
if (m_param.is_duplex)
while (!scanner_read_reg(m_usb, SR_GET_IMAGEPROCESSDONE))
this_thread::sleep_for(chrono::microseconds(30));
if (scanner_read_reg(m_usb, SR_GET_KEEP_LAST_PAPER))
{
FileTools::writelog(log_ERROR, "keep last paper true");
this_thread::sleep_for(chrono::milliseconds(100));
while (im_dev_count() > ((m_param.is_duplex && !m_param.en_fold) ? 2 : 1))
im_rx();
if (!is_kernelsnap_211209) {
if (m_param.is_duplex && !m_param.en_fold)
pop_dev_im();
pop_dev_im();
}
else
{
keeplastimg = false;
while (im_dev_count())
im_rx();
}
scanflag = false;
//}
}
else
{
keeplastimg = false;
while (im_dev_count())
im_rx();
}
if ((devState != DEV_WRONG) && (get_ErrorCode()<=0))
devState = DEV_STOP;
else if ((devState != DEV_WRONG) && (get_ErrorCode() > 0))
devState = DEV_WRONG;
if (m_param.hardwarecaps.is_autopaper) {
if (devState == DEV_STOP && autopaperstop == false)
scanflag = true;
else
scanflag = false;
}
else
scanflag = false;
}
@ -644,60 +620,46 @@ bool GScanO1003399::is_dev_tx()
void GScanO1003399::im_rx()
{
//m_imgthread.enqueue([this] {
//StopWatch sw;
//while (im_dev_count()){
if (is_dev_tx())
if (is_dev_tx())
return;
if (keeplastimg)
{
if (m_param.is_duplex && !m_param.en_fold) {
if(im_dev_count()<3)
return;
if (keeplastimg)
{
if (m_param.is_duplex) {
if(im_dev_count()<3)
return;
}
if(im_dev_count()<2)
return;
}
std::shared_ptr<std::vector<char>> buffi(new std::vector<char>);
//auto& buffi = im_data;
int count = front_datasize();
buffi->resize(count);
rx_cmd();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
count = read_data(buffi->data(), count, count / (0.005 * 1024 * 1024)); //
pop_dev_im();
//vector<cv::Mat> mats;
m_param.multi_output_red? imagecount += 2: imagecount++;
UpdateScanInfo(countNReaded(), get_imgTransfered());
if (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131)
{
auto path = cv::tempfile();
auto fd = fopen(path.c_str(), "wb+");
if (fd)
{
fwrite(buffi->data(), buffi->size(), 1, fd);
fclose(fd);
m_paths.Put(path);
}
else {
FileTools::writelog(log_ERROR, "img temp file save error flie name =" + path);
}
}
else {
imgs.Put(buffi);
//fu_imgpro.push(m_imgprocthread.enqueue([this] {
// imgproce(imgs.Take());
//}));
//while (fu_imgpro.size()>1)
//{
// fu_imgpro.front().get();
// if(fu_imgpro.size()>0)
// fu_imgpro.pop();
//}
}
//}
//});
}
if(im_dev_count()<2)
return;
}
std::shared_ptr<std::vector<char>> buffi(new std::vector<char>);
//auto& buffi = im_data;
int count = front_datasize();
buffi->resize(count);
rx_cmd();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
count = read_data(buffi->data(), count, count / (0.005 * 1024 * 1024)); //
pop_dev_im();
//vector<cv::Mat> mats;
//m_param.multi_output_red? imagecount += 2: imagecount++;
imagecount += 1 * (m_param.multi_output_red ? 2 : 1) * (m_param.is_split ? 2 : 1);
UpdateScanInfo(countNReaded(), get_imgTransfered());
if (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131)
{
auto path = cv::tempfile();
auto fd = fopen(path.c_str(), "wb+");
if (fd)
{
fwrite(buffi->data(), buffi->size(), 1, fd);
fclose(fd);
m_paths.Put(path);
}
else {
FileTools::writelog(log_ERROR, "img temp file save error flie name =" + path);
}
}
else {
imgs.Put(buffi);
}
}
int GScanO1003399::read_data(void* data, int length, int timeout)
@ -787,6 +749,24 @@ void GScanO1003399::imgproce(std::shared_ptr<std::vector<char>>& buff)
{
CImageApplyColorRecognition(m_param.automaticcolortype == 1 ? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray : CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono).apply(mats,m_param.is_duplex);
}
if (m_param.is_split)
{
CImageApplySplit m_split;
std::vector<cv::Mat> tmp;
for (auto& var : mats)
{
if (!var.empty())
{
auto sptmp = m_split.apply(var);
for (auto& matvar : sptmp)
{
if (!matvar.empty())
tmp.push_back(matvar);
}
}
}
mats.swap(tmp);
}
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
IMat2Bmp idata;
@ -852,6 +832,8 @@ int GScanO1003399::codeconvter(HGEIntInfo code)
return AQUIRE_IMAGE_TIMEOUT;
case 0x20000:
return SIZE_ERROR;
case 0x80000:
return MLTOP_TIMEOUT;
default:
break;
}

View File

@ -75,6 +75,8 @@ private:
volatile int Error_Code;
volatile bool scanflag;
volatile bool keeplastimg;
volatile bool autopaperstop;
volatile bool is_kernelsnap_211209;
GScanCap m_param;
std::shared_ptr<IUsb> m_usb;
volatile bool b_imgprothread;

View File

@ -343,12 +343,12 @@ int GScanO200::Get_Roller_num()
{
if (!(m_usb.get() && m_usb->is_open()))
return 0;
USBCB usbcb = { GET_ROLLER_NUM ,0,4 };
USBCB usbcb = { GET_SCANN_NUM ,0,4 };
std::lock_guard<std::mutex> lck(m_imgLocker);
m_usb->write_bulk(&usbcb, sizeof(usbcb));
std::this_thread::sleep_for(std::chrono::milliseconds(50));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
if (usbcb.u32_CMD != GET_ROLLER_NUM)
if (usbcb.u32_CMD != GET_SCANN_NUM)
{
FileTools::writelog(log_ERROR, "get roller usb bulk error");
}

View File

@ -348,11 +348,11 @@ int GScanO400::Get_Roller_num()
{
if (!(m_usb.get() && m_usb->is_open()))
return false;
USBCB usbcb = { GET_ROLLER_NUM ,0,4 };
USBCB usbcb = { GET_SCANN_NUM ,0,4 };
std::lock_guard<std::mutex> lck(m_imgLocker);
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
if (usbcb.u32_CMD != GET_ROLLER_NUM)
if (usbcb.u32_CMD != GET_SCANN_NUM)
{
FileTools::writelog(log_ERROR, "get roller usb bulk error");
}

View File

@ -356,11 +356,11 @@ int GScanO400Android::Get_Roller_num()
{
if (!(m_usb.get() && m_usb->is_open()))
return false;
USBCB usbcb = { GET_ROLLER_NUM ,0,4 };
USBCB usbcb = { GET_SCANN_NUM ,0,4 };
std::lock_guard<std::mutex> lck(m_imgLocker);
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
if (usbcb.u32_CMD != GET_ROLLER_NUM)
if (usbcb.u32_CMD != GET_SCANN_NUM)
{
FileTools::writelog(log_ERROR, "get roller usb bulk error");
}
@ -629,6 +629,10 @@ void GScanO400Android::usbmain()
case HAVE_IMAGE:
{
int totalNum = usbcb.u32_Count&0x3fffffff;
if ((usbcb.u32_Count & 0xc0000000) == 0)
{
image_last = false;
}
if (totalNum < 1)
{
image_last = false;

View File

@ -201,7 +201,14 @@ enum Scanner_Reg_Defs
SR_FLAT_GRAY_MAX_BRIGHT,
SR_KERNEL_VERSION_INFO_LENGTH,
SR_GET_KERNEL_VERSION,
SR_GET_MBSTATUS
SR_GET_MBSTATUS,
SR_GET_IPADDR_LENGHT = 0x200,
SR_GET_MACADDR,
SR_GET_IPADDR,
SR_GET_MBVERSION_LENGHT,
SR_GET_MBVERSION,
SR_GET_USBVIDPID,
SR_SET_USBVIDPID
};
enum Scanner_Cmd_Defs
@ -284,7 +291,8 @@ typedef union HG_ScanConfig
unsigned int screw_detect_enable : 1;
unsigned int screw_detect_level : 3;//µÚÊ®ËÄλ
unsigned int iscorrect_mod : 1;
unsigned int unused_one : 5;
unsigned int is_autopaper : 1;
unsigned int unused_one : 4;
unsigned int pc_correct : 1;
unsigned int enable_sizecheck : 1;
unsigned int enabledsp_cache : 1;

View File

@ -7,6 +7,7 @@
#include <math.h>
#include "StopWatch.h"
using namespace cv;
using namespace std;
@ -509,10 +510,10 @@ void ImageMatQueue::proc()
cv::resize(mats[i], mats[i], cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
}
if (scanParam.en_fold != 0) {
cv::flip(mats[0], mats[0], 1);
cv::flip(mats[0], mats[0], 0);
}
//if (scanParam.en_fold != 0) { //对折前旋转屏蔽 20211214 奥鸽要求
// cv::flip(mats[0], mats[0], 1);
// cv::flip(mats[0], mats[0], 0);
//}
}
else
{
@ -602,14 +603,15 @@ void ImageMatQueue::proc()
uvmats.clear();
}
#endif
FileTools::writelog(log_INFO, "图像处理耗时 " + to_string(sw.elapsed_ms()));
sw.reset();
if (!scanParam.is_duplex && mats.size()>1) {
mats.pop_back();
break;
}
if (scanParam.is_split)
{
splitimg(mats);
}
for (int i = 0; i < mats.size(); i++) {
if (!scanParam.is_duplex && i == 1) {
mats[i].release();
break;
}
if (!mats[i].empty()) {
IMat2Bmp idata;
#ifdef UV
@ -634,9 +636,7 @@ void ImageMatQueue::proc()
FileTools::writelog(log_ERROR, "enqueue image is empty " + std::to_string(index++));
}
}
FileTools::writelog(log_INFO, "转码BMP 耗时: " + to_string(sw.elapsed_ms()));
sw.reset();
if (scanParam.multi_output_red) {
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
@ -656,7 +656,6 @@ void ImageMatQueue::proc()
}
}
}
FileTools::writelog(log_INFO, "多流输出 耗时: " + to_string(sw.elapsed_ms()));
}
mats.clear();
@ -668,6 +667,21 @@ void ImageMatQueue::proc()
}
}
void ImageMatQueue::splitimg(std::vector<cv::Mat>& mats) {
CImageApplySplit m_split;
std::vector<cv::Mat> tmp;
for (auto& var : mats){
if (!var.empty()){
auto sptmp = m_split.apply(var);
for (auto& matvar : sptmp){
if (!matvar.empty())
tmp.push_back(matvar);
}
}
}
mats.swap(tmp);
}
G400Decode::G400Decode(std::shared_ptr<std::vector<char>> buff)
{
m_buffs.push_back(buff);

View File

@ -226,6 +226,7 @@ private:
void EnqueueBmpBuffer(std::shared_ptr<std::vector<unsigned char>>);
void PaniusCount(int count = 1);
void init_cachethread();
void splitimg(std::vector<cv::Mat>& mats);
void cache_run();
//清除缓存文件
void clear_cachefiles();

View File

@ -44,7 +44,7 @@ const std::string DB_DEVNMAX = "iDevnMax";
const std::string FLOD = "bFlod";
const std::string AUTOCROP = "bAuotCrop";
const std::string SWITCHFRONTBACK = "bSwitchFrontBack";
const std::string SPLIT = "bSplit";
//<!亮度对比度选项卡
const std::string AUTOCONTRAST = "bAutoContrast";
@ -70,6 +70,7 @@ const std::string HSVCORRECT = "bHsvCorrect";
//<!送纸选项卡
const std::string ULTRADETECT = "bUltrasonicDetect";
const std::string BINDINGDETECT = "bBindingDetect";
const std::string AUTOPAPER = "bautopaper";
const std::string SCANCOUNT = "ScanCount";
const std::string DOCORIENTATION = "bOrientation";
const std::string AUTO_TEXT = "bAutoText";
@ -180,6 +181,7 @@ typedef struct tagHARDWAREPARAMS
byte en_stapledetect;
byte en_skrewdetect;
byte skrewdetectlevel;
byte is_autopaper;
LowPowerMode lowpowermode;
#ifdef UV
byte en_uv;
@ -244,6 +246,7 @@ struct GScanCap
uint8_t is_autocontrast; /**< 自动对比度*/
uint8_t is_autocrop; /**< 自动裁切*/
bool normalCrop; /**<传统模式自动裁切*/
bool is_split; /**< 图像拆分*/
uint8_t is_autodiscradblank_normal; /**< 自动丢弃空白页通用*/
int discardblank_percent; /**<跳过空白页阀值*/
uint8_t is_autodiscradblank_vince;/**自动丢弃空白页发票*/

View File

@ -3,7 +3,6 @@
#include <tchar.h>
#include <winioctl.h>
//#ifdef ANDROIDSERIAL
#if false

View File

@ -104,6 +104,7 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin
//outJson["Config"].Add(DB_DEVNMAX, (int)(pConfigItem->DBlank_DevnMax));
outJson["Config"].Add(FLOD, (bool)(gcap.en_fold), false);
outJson["Config"].Add(SWITCHFRONTBACK, (bool)(gcap.is_switchfrontback), false);
outJson["Config"].Add(SPLIT, gcap.is_split, false);
#ifdef UV
outJson["Config"].Add(ENUVMODEL, (bool)(gcap.hardwarecaps.en_uv), false);
@ -127,6 +128,7 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin
outJson["Config"].Add(ULTRADETECT, (bool)(gcap.hardwarecaps.en_doublefeed), false);
outJson["Config"].Add(BINDINGDETECT, (bool)(gcap.hardwarecaps.en_stapledetect), false);
outJson["Config"].Add(AUTOPAPER, (bool)(gcap.hardwarecaps.is_autopaper), false);
outJson["Config"].Add(SCANCOUNT, (int)(gcap.scannum));
outJson["Config"].Add(DOCORIENTATION, (int)(gcap.imageRotateDegree));
outJson["Config"].Add(AUTO_TEXT, (bool)(gcap.is_autotext),false);
@ -227,6 +229,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector<GScanCap> cfgArray, const
//root["Config"][DB_DEVNMAX].Add(cfgArray[i].DBlank_DevnMax);
root["Config"][FLOD].Add(i, (bool)cfgArray[i].en_fold);
root["Config"][SWITCHFRONTBACK].Add(i,(bool)cfgArray[i].is_switchfrontback);
root["Config"][SPLIT].Add(i, cfgArray[i].is_split);
#ifdef UV
root["Config"][ENUVMODEL].Add(i, cfgArray[i].hardwarecaps.en_uv);
#endif
@ -249,6 +252,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector<GScanCap> cfgArray, const
root["Config"][ULTRADETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_doublefeed);
root["Config"][BINDINGDETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_stapledetect);
root["Config"][AUTOPAPER].Add(i, (bool)cfgArray[i].hardwarecaps.is_autopaper);
root["Config"][SCANCOUNT].Add((int)cfgArray[i].scannum);
root["Config"][DOCORIENTATION].Add((int)cfgArray[i].imageRotateDegree);
root["Config"][AUTO_TEXT].Add(i, (bool)cfgArray[i].is_autotext);
@ -391,6 +395,9 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
root["Config"].Get(FLOD, itmEnFlod);
neb::CJsonObject itmEnSwitchFrontBack;
root["Config"].Get(SWITCHFRONTBACK, itmEnSwitchFrontBack);
neb::CJsonObject itmEnSplit;
root["Config"].Get(SPLIT, itmEnSplit);
neb::CJsonObject itmdiscarbrank_value;
root["Config"].Get(DISCARBLANK_VALUE, itmdiscarbrank_value);
#ifdef UV
@ -433,6 +440,8 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
root["Config"].Get(ULTRADETECT, itmUltDetect);
neb::CJsonObject itmBingdingDetect;
root["Config"].Get(BINDINGDETECT, itmBingdingDetect);
neb::CJsonObject itmAutoPaper;
root["Config"].Get(AUTOPAPER, itmAutoPaper);
neb::CJsonObject itmScanCount;
root["Config"].Get(SCANCOUNT, itmScanCount);
neb::CJsonObject itmDocOrientation;
@ -508,12 +517,14 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
cfp.en_fold = b_value ? 1 : 0;
itmEnSwitchFrontBack.Get(i, b_value);
cfp.is_switchfrontback = b_value ? 1 : 0;
itmEnSplit.Get(i, b_value);
cfp.is_split = b_value ? 1 : 0;
#ifdef UV
itmEnUV.Get(i, b_value);
cfp.hardwarecaps.en_uv = b_value ? 1 : 0;
#endif
itmBrtnes.Get(i, i_value);
cfp.brightness = i_value;
itmBrtnes.Get(i, f_value);
cfp.brightness = f_value;
itmAutoCrnt.Get(i, b_value);
cfp.is_autocontrast = b_value ? 1 : 0;
itmContrast.Get(i, i_value);
@ -548,6 +559,8 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
cfp.hardwarecaps.en_doublefeed = b_value ? 1 : 0;
itmBingdingDetect.Get(i, b_value);
cfp.hardwarecaps.en_stapledetect = b_value ? 1 : 0;
itmAutoPaper.Get(i, b_value);
cfp.hardwarecaps.is_autopaper = b_value ? 1 : 0;
itmScanCount.Get(i, i_value);
cfp.scannum = i_value;
itmDocOrientation.Get(i, i_value);
@ -623,12 +636,14 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
cfp.en_fold = bvalue?1:0;
root["Config"].Get(SWITCHFRONTBACK, bvalue);
cfp.is_switchfrontback = bvalue?1:0;
root["Config"].Get(SPLIT, bvalue);
cfp.is_split = bvalue ? 1 : 0;
#ifdef UV
root["Config"].Get(ENUVMODEL, bvalue);
cfp.hardwarecaps.en_uv = bvalue ? 1 : 0;
#endif
root["Config"].Get(BRIGHTNESS, index);
cfp.brightness = index;
root["Config"].Get(BRIGHTNESS, fvalue);
cfp.brightness = fvalue;
root["Config"].Get(AUTOCONTRAST, bvalue);
cfp.is_autocontrast = bvalue?1:0;
root["Config"].Get(CONTRAST, index);
@ -669,6 +684,8 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
cfp.hardwarecaps.en_doublefeed = bvalue?1:0;
root["Config"].Get(BINDINGDETECT, bvalue);
cfp.hardwarecaps.en_stapledetect = bvalue ? 1 : 0;
root["Config"].Get(AUTOPAPER, bvalue);
cfp.hardwarecaps.is_autopaper = bvalue ? 1 : 0;
root["Config"].Get(SCANCOUNT, index);
cfp.scannum = index;
root["Config"].Get(DOCORIENTATION, index);
@ -739,6 +756,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap)
js[CONFIG][DISCARBLANK_VALUE] = cap.discardblank_percent;
js[CONFIG][FLOD] = cap.en_fold;
js[CONFIG][SWITCHFRONTBACK] = cap.is_switchfrontback;
js[CONFIG][SPLIT] = cap.is_split;
#ifdef UV
js[CONFIG][ENUVMODEL] = cap.hardwarecaps.en_uv;
#endif
@ -760,6 +778,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap)
js[CONFIG][HSVCORRECT] = cap.hsvcorrect;
js[CONFIG][ULTRADETECT] = cap.hardwarecaps.en_doublefeed;
js[CONFIG][BINDINGDETECT] = cap.hardwarecaps.en_stapledetect;
js[CONFIG][AUTOPAPER] = cap.hardwarecaps.is_autopaper;
js[CONFIG][SCANCOUNT] = cap.scannum;
js[CONFIG][DOCORIENTATION] = cap.imageRotateDegree;
js[CONFIG][AUTO_TEXT] = cap.is_autotext;
@ -798,6 +817,7 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js)
cap.discardblank_percent = json_cast(js[CONFIG][DISCARBLANK_VALUE]).to_int();
cap.en_fold = json_cast(js[CONFIG][FLOD]).to_int();
cap.is_switchfrontback = json_cast(js[CONFIG][SWITCHFRONTBACK]).to_int();
cap.is_split = json_cast(js[CONFIG][SPLIT]).to_int();
#ifdef UV
cap.hardwarecaps.en_uv = json_cast(js[CONFIG][ENUVMODEL]).to_int();
#endif // UV
@ -819,6 +839,7 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js)
cap.hsvcorrect = json_cast(js[CONFIG][HSVCORRECT]).to_int();
cap.hardwarecaps.en_doublefeed = json_cast(js[CONFIG][ULTRADETECT]).to_int();
cap.hardwarecaps.en_stapledetect = json_cast(js[CONFIG][BINDINGDETECT]).to_int();
cap.hardwarecaps.is_autopaper = json_cast(js[CONFIG][AUTOPAPER]).to_int();
cap.scannum = json_cast(js[CONFIG][SCANCOUNT]).to_int();
cap.imageRotateDegree = json_cast(js[CONFIG][DOCORIENTATION]).to_int();
cap.is_autotext = json_cast(js[CONFIG][AUTO_TEXT]).to_int();
@ -856,6 +877,7 @@ json GscanJsonConfig::GetDefaultJson()
"discardblank_percent": 20 ,
"bFlod": false ,
"bSwitchFrontBack": false ,
"bSplit": false ,
"bUVmodel": false,
"detachnoise": false ,
"detachnoisevalue": 30 ,
@ -874,6 +896,7 @@ json GscanJsonConfig::GetDefaultJson()
"bHsvCorrect": false ,
"bUltrasonicDetect": true ,
"bBindingDetect": false ,
"bautopaper": false ,
"ScanCount": 65535 ,
"bOrientation": 0 ,
"bAutoText": false ,
@ -909,6 +932,7 @@ json GscanJsonConfig::GetDefaultJson()
"discardblank_percent": 20 ,
"bFlod": false ,
"bSwitchFrontBack": false ,
"bSplit": false ,
"detachnoise": false ,
"detachnoisevalue": 30 ,
"iBrightness": 0 ,
@ -926,6 +950,7 @@ json GscanJsonConfig::GetDefaultJson()
"bHsvCorrect": false ,
"bUltrasonicDetect": true ,
"bBindingDetect": false ,
"bautopaper": false ,
"ScanCount": 65535 ,
"bOrientation": 0 ,
"bAutoText": false ,

View File

@ -18,4 +18,5 @@
#include "ImageApplyDetachNoise.h"
#include "ImageApplyColorRecognition.h"
#include "ImageApplyUV.h"
#include "ImageApplySplit.h"
#endif

View File

@ -61,6 +61,7 @@ enum class CapTypeEx : unsigned short {
TwEx_ENCODE = 0x8105,
TwEx_CropModel=0x8106,
TwEx_DogEarDistance = 0x8107,
TwEx_ImageSplit = 0x8108,
};
enum class PaperSizeEx : unsigned short {
@ -88,7 +89,7 @@ using namespace std::placeholders;
TWPP_ENTRY_MFC(HuagaoDs)
static constexpr const Identity srcIdent(
Version(3, 3, Language::English, Country::China, "v3.3.5.5"),
Version(3, 3, Language::English, Country::China, "v3.3.5.6"),
DataGroup::Image,
#ifdef MAKEHUAGAO
"HUAGO",
@ -106,6 +107,8 @@ static constexpr const Identity srcIdent(
#ifdef ISG100
#ifdef LANXUM
"G62S Series",
#elif defined HANVON
"HW-8190F Series",
#else // ISG100
"G100 Series",
#endif
@ -113,7 +116,7 @@ static constexpr const Identity srcIdent(
#ifdef LANXUM
"G73S Series",
#elif defined HANVON
"HW-7000W Series",
"HW-9110M Series",
#else // ISG100
"G200 Series",
#endif
@ -124,7 +127,7 @@ static constexpr const Identity srcIdent(
#elif defined HANVON
"HW-7000W Series",
#else // ISG100
"G200 Series",//兼容旧极课 pm changed G300 Series
"G300 Series",//兼容旧极课 pm changed G300 Series
#endif
#elif defined(G400) // G200
@ -144,6 +147,8 @@ static constexpr const Identity srcIdent(
"HUAGOSCAN G100 TWAIN"
#elif defined AUGE
"AUGESCAN G100 TWAIN"
#elif defined HANVON
"HANVONSCAN HW-8190F TAWIN"
#elif defined LANXUM //!LANXUM
"LANXUMSCAN G62S TWAIN"
#else // !MAKEHUAGAO
@ -153,7 +158,7 @@ static constexpr const Identity srcIdent(
#ifdef MAKEHUAGAO
"HUAGOSCAN G200 TWAIN"
#elif defined HANVON
"HANVONSCAN HW-7000W TAWIN"
"HANVONSCAN HW-9110M TAWIN"
#elif defined LANXUM //!LANXUM
"LANXUMSCAN G73S TWAIN"
#else // !MAKEHUAGAO
@ -165,7 +170,7 @@ static constexpr const Identity srcIdent(
#ifdef UV
"HUAGOSCAN G300UV TWAIN"
#else
"HUAGOSCAN G200 TWAIN"// 兼容旧极课 pm changed "HUAGOSCAN G300 TWAIN"
"HUAGOSCAN G300 TWAIN"// 兼容旧极课 pm changed "HUAGOSCAN G300 TWAIN"
#endif
#elif defined HANVON
@ -270,7 +275,6 @@ struct Vid_pid
#ifdef LANXUM
static std::vector<Vid_pid> DeviceID{
{0x3072,0x239},
{0x31c9,0x8200},
#ifdef G200
#ifdef ISG100
@ -295,7 +299,15 @@ static std::vector<Vid_pid> DeviceID{
#elif defined HANVON
static std::vector<Vid_pid> DeviceID{
#ifdef G200
#ifdef ISG100
{0x2903,0x8000},
#else
{0x2903,0x9000},
#endif // ISG100
#elif defined G400
{0x2903,0x7000},
#endif // G200
};
#else
@ -387,15 +399,15 @@ HuagaoDs::HuagaoDs()
void HuagaoDs::showmsg(std::string caption, std::string text, int retcode)
{
if (scanner.get()) {
//int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
//int readnum =scanner->get_scannum()* (m_scanparam->is_duplex ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
int num = scanner->get_imgnReaded() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
int num = scanner->get_imgnReaded() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1) * (m_scanparam->is_split ? 2 : 1);
int imgread = scanner->get_imgnReaded();
IScanner* ptr = scanner.get();
if (typeid(*ptr) == typeid(GScanO1003399))
{
//readnum = readnum / 2 * (m_scanparam->en_fold ? 2 : 1);
num = scanner->get_imgnReaded() * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
num = scanner->get_imgnReaded() * (m_scanparam->multi_output_red ? 2 : 1) * (m_scanparam->is_split ? 2 : 1);
if(!m_scanparam->en_fold)
imgread /= 2;
}
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
@ -837,7 +849,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
pid = usb.pid;
if (!scanner.get()) {
#ifdef G200
if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629)
if (pid == 0x139 || pid == 0x239 || pid == 0x8739 || pid == 0x8629 || pid == 0x130 ||pid == 0x8000 || pid == 0x9000)
scanner.reset(new GScanO1003399());
else
scanner.reset(new GScanO200());
@ -1996,6 +2008,17 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
}
return CapSupGetAllResetEx<bool, UInt32, (CapType)CapTypeEx::TwEx_CropModel>(msg, data, m_scanparam->normalCrop, false);
};
//图像拆分
m_query[(CapType)(CapTypeEx::TwEx_ImageSplit)] = msgSupportGetAllSetReset;
m_caps[(CapType)(CapTypeEx::TwEx_ImageSplit)] = [this](Msg msg, Capability& data)->Result {
CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CropModel), msg == Msg::Set ? to_string((float)data.currentItem<UInt32>()) : "");
if (Msg::Set == msg) {
auto mech = data.currentItem<Bool>();
m_scanparam->is_split = mech;
return success();
}
return CapSupGetAllResetEx<bool, Bool, (CapType)CapTypeEx::TwEx_ImageSplit>(msg, data, m_scanparam->is_split, false);
};
#ifdef UV
m_query[(CapType)(CapTypeEx::TwEx_UVModel)] = msgSupportGetAllSetReset;
m_caps[(CapType)(CapTypeEx::TwEx_UVModel)] = [this](Msg msg, Capability& data)->Result {
@ -2085,7 +2108,7 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
{
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
{
int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1) * (m_scanparam->is_split ? 2 : 1);
if ((num - scanner->get_imgTransfered()) != 0)
{
showmsg("Ìáʾ", msgs[LOSE_IMAGE]);
@ -2097,10 +2120,15 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
m_pendingXfers = 0;
if (guiTwain.get()) {
((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true);
//setState(DsState::Enabled);
}
else {
//setState(DsState::Open);
}
}
else {
m_pendingXfers = 1;
//setState( DsState::XferReady );
}
data.setCount(m_pendingXfers);
return success();
@ -2523,7 +2551,8 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly)
TwGlue glueUiOnly = { confirmFunction, cancelFunction };
std::string serialnum = scanner->GetSerialNum();
std::string hardwareversion = scanner->GetFWVersion();
guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "确定" : "扫描", hardwareversion, serialnum));
uint32_t mbversion = scanner->GetMotorFPGA();
guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "确定" : "扫描", hardwareversion, serialnum,mbversion));
guiTwain->Create(IDD_TWAINUI, parent);
CRect newRect;
::GetWindowRect(static_cast<HWND>(ui.parent().raw()), &newRect);

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -948,6 +948,7 @@ namespace Twpp {
setState(DsState::XferReady);
}
else {
//setState(data.count() ? DsState::XferReady : DsState::Enabled);
setState(data.count() ? DsState::XferReady : DsState::Enabled);
}
}