mirror of http://192.168.1.51:8099/lmh188/twain3.0
2021.5.20 对接河南天一阅卷系统,修改DeviceOnline协议,由enum修改为onevalue,类型修改为bool
2021.5.22 增加上传张数核对 修复进度指示器关闭无法停止扫描问题 微调界面UI 2021.5.24 添加扫描仪dsp固件与电机板固件核验是否限制取图 2021.5.25 更新颜色增强算法 调整取图为保存至本地再读取进行图像处理 2021.5.27 再获取到安卓设备usb数据不一致时再读取512字节清空usb缓冲区后可正常读取usb数据 2021.5.28 针对usb正常读取后解码错误问题,再读取数据后进行移位12位操作,将上次为读取数据移除 针对安卓异常处理流程修改scano400 2021.6.08 修改文件读写方式为CFile 2021.6.09 修改G400\G300最大尺寸扫描下发参数,由16改为17 2021.6.10 修复最大尺寸扫描出图问题 2021.6.16 添加无屏休眠唤醒功能 修复中文首选项无法保存问题 2021.6.18 屏蔽尺寸检测功能,屏蔽G100 G200休眠功能 2021.6.19 调整GetOverlappedResult位置,放在getlasterror之后,放在之前usb断开时阻塞GetOverlappedResult不会触发回调函数 2021.6.20 修改G100/G200默认缓存方式为小于240dpi多页缓存,否则单页缓存
This commit is contained in:
parent
4dbfade00e
commit
75d3cb941b
|
@ -44,7 +44,7 @@ BOOL CBrightnessPage::OnInitDialog()
|
|||
m_Edit_Brightness.SetValue(128);
|
||||
|
||||
m_Edit_Contrast.SetSlideLink(this, IDC_SLIDER_CONTRAST);
|
||||
m_Edit_Contrast.SetParams(1, 7, 6);
|
||||
m_Edit_Contrast.SetParams(1, 7, 1);
|
||||
m_Edit_Contrast.SetValue(4);
|
||||
|
||||
// setup third slider-edit box - floating point
|
||||
|
|
|
@ -38,6 +38,7 @@ BOOL CIndicatorDlg::OnInitDialog()
|
|||
|
||||
BEGIN_MESSAGE_MAP(CIndicatorDlg, CDialogEx)
|
||||
ON_BN_CLICKED(IDC_BTNSTOPSCAN, &CIndicatorDlg::OnBnClickedBtnstopscan)
|
||||
ON_WM_CLOSE()
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
|
@ -47,7 +48,7 @@ END_MESSAGE_MAP()
|
|||
void CIndicatorDlg::setindicatortext(int aquire, int updata)
|
||||
{
|
||||
wchar_t text[260] = { 0 };
|
||||
_stprintf(text, L"扫描中,已扫描%d份文件,已上传%d张图片。", aquire,updata);
|
||||
_stprintf(text, L"扫描\t\t\t\t%d\n上传\t\t\t\t%d", aquire,updata);
|
||||
GetDlgItem(IDC_STATIC)->SetWindowTextW(text);
|
||||
}
|
||||
|
||||
|
@ -57,3 +58,13 @@ void CIndicatorDlg::OnBnClickedBtnstopscan()
|
|||
if (m_stop)
|
||||
m_stop();
|
||||
}
|
||||
|
||||
|
||||
void CIndicatorDlg::OnClose()
|
||||
{
|
||||
// TODO: 在此添加消息处理程序代码和/或调用默认值
|
||||
|
||||
if (m_stop)
|
||||
m_stop();
|
||||
CDialogEx::OnClose();
|
||||
}
|
||||
|
|
|
@ -16,13 +16,13 @@ public:
|
|||
#ifdef AFX_DESIGN_TIME
|
||||
enum { IDD = IDD_INDICATOR };
|
||||
#endif
|
||||
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
|
||||
virtual BOOL OnInitDialog();
|
||||
DECLARE_MESSAGE_MAP()
|
||||
|
||||
afx_msg void OnBnClickedBtnstopscan();
|
||||
|
||||
std::function<void()> m_stop;
|
||||
public:
|
||||
afx_msg void OnClose();
|
||||
};
|
||||
|
|
|
@ -82,10 +82,13 @@ BOOL CTwainUI::OnInitDialog()
|
|||
m_tabCtrl->AddSSLPage(_T("送纸"), nPageID++, m_pageFeedPaper.get());
|
||||
CString title(m_confirmtitle.c_str());
|
||||
this->GetDlgItem(IDC_CONFIRM)->SetWindowText(title);
|
||||
|
||||
UpdateUI();
|
||||
UpdateListConfig();
|
||||
dataChangeFunction();
|
||||
setvisable_size(false);
|
||||
#ifdef G200
|
||||
setvisable_sleepmode(false);
|
||||
#endif // G200
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -589,6 +592,21 @@ void CTwainUI::UpdateUi()
|
|||
m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(m_pageBasic->m_cmBoxColorMode->GetCurSel() == 0);
|
||||
}
|
||||
|
||||
void CTwainUI::setvisable_size(bool flag)
|
||||
{
|
||||
m_pageBasic->GetDlgItem(IDC_CKBSIZEDETECT)->ShowWindow(flag?SW_SHOW:SW_HIDE);
|
||||
if(!flag)
|
||||
((CButton*)m_pageBasic->GetDlgItem(IDC_CKBSIZEDETECT))->SetCheck(false);
|
||||
}
|
||||
|
||||
void CTwainUI::setvisable_sleepmode(bool flag)
|
||||
{
|
||||
m_pageFeedPaper->GetDlgItem(IDC_STATICLOWPM)->ShowWindow(flag ? SW_SHOW : SW_HIDE);
|
||||
m_pageFeedPaper->GetDlgItem(IDC_CBLOWPOWERMODE)->ShowWindow(flag ? SW_SHOW : SW_HIDE);
|
||||
if (!flag)
|
||||
((CComboBox*)m_pageFeedPaper->GetDlgItem(IDC_CBLOWPOWERMODE))->SetCurSel(0);
|
||||
}
|
||||
|
||||
void CTwainUI::EnableID_OKorID_Cancel(bool enable)
|
||||
{
|
||||
GetDlgItem(IDC_CONFIRM)->EnableWindow(enable);
|
||||
|
|
|
@ -173,7 +173,8 @@ public:
|
|||
void UpdateListConfig();
|
||||
void GetGScanCap(GScanCap& cap);
|
||||
void UpdateUi();
|
||||
|
||||
void setvisable_size(bool flag);
|
||||
void setvisable_sleepmode(bool flag);
|
||||
void EnableID_OKorID_Cancel(bool enable);
|
||||
// 对话框数据
|
||||
#ifdef AFX_DESIGN_TIME
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
G400ScanConfig::G400ScanConfig(GScanCap& gcap)
|
||||
{
|
||||
cfg = { 0 };
|
||||
cfg.params.doubleFeeded = gcap.hardwarecaps.en_doublefeed == 0 ? 0 : 1;
|
||||
cfg.params.dpi = G400_DPI::G400_D200;//gcap.resolution_dst <= 200.0f ? G400_DPI::G400_D200 : (gcap.resolution_dst <= 300.0f ? G400_DPI::G400_D300 : G400_DPI::G400_D600);
|
||||
cfg.params.enableLed = 1;
|
||||
|
|
|
@ -76,6 +76,8 @@ typedef enum tagUsbSupported {
|
|||
AQUIRE_IMAGE_TIMEOUT=76,
|
||||
//获取图片与扫描张数不匹配
|
||||
LOSE_IMAGE=77,
|
||||
//usb读取数据错误
|
||||
USB_BULK_ERROR=78,
|
||||
//USB 未连接
|
||||
USB_DISCONNECTED = 200,
|
||||
//用户点击停止
|
||||
|
@ -92,7 +94,7 @@ static map<UsbSupported, string> msgs = {
|
|||
{UsbSupported::NO_FEED,"无纸!请放置纸张!"},
|
||||
{UsbSupported::FEED_IN_ERROR,"搓纸失败!请整理纸张!"},
|
||||
{UsbSupported::PAPER_JAM,"卡纸!"},
|
||||
{UsbSupported::DETECT_DOUBLE_FEED,"双张"},
|
||||
{UsbSupported::DETECT_DOUBLE_FEED,"双张,请核对扫描试卷张数!"},
|
||||
{UsbSupported::DETECT_STAPLE,"检测到订书针!"},
|
||||
{UsbSupported::PAPER_SKEW,"纸张歪斜!请整理纸张!"},
|
||||
{UsbSupported::COUNT_MODE,"计数模式,请退出计数模式!"},
|
||||
|
@ -103,7 +105,8 @@ static map<UsbSupported, string> msgs = {
|
|||
{UsbSupported::DOG_EAR,"检测到折角!"},
|
||||
{UsbSupported::SIZE_ERROR,"幅面检测异常!"},
|
||||
{UsbSupported::AQUIRE_IMAGE_TIMEOUT,"取图超时!"},
|
||||
{UsbSupported::LOSE_IMAGE,"上传图片与扫描张数不匹配!"}
|
||||
{UsbSupported::LOSE_IMAGE,"上传图片与扫描张数不匹配!"},
|
||||
{UsbSupported::USB_BULK_ERROR,"USB数据读取错误!"}
|
||||
};
|
||||
|
||||
enum tagEventIndex
|
||||
|
@ -120,7 +123,9 @@ typedef void(*deviceevent_callback)(int eventID, void* userdata);
|
|||
class IScanner
|
||||
{
|
||||
public:
|
||||
IScanner() { bFilterMsg = false; aquire_image_count = updata_image_count = updata_image_count = roller_num = lose_image_num= 0; }
|
||||
IScanner() {
|
||||
bFilterMsg = false; aquire_image_count = updata_image_count = updata_image_count = roller_num = lose_image_num = 0; is_AndroidOrLinux = false;
|
||||
}
|
||||
virtual ~IScanner() { bFilterMsg = true; }
|
||||
void ResetMsgFiter() { bFilterMsg = true; }
|
||||
int get_aquire_image_count() { return aquire_image_count; };
|
||||
|
@ -136,12 +141,15 @@ public:
|
|||
virtual BOOL IsConnected() = 0;
|
||||
virtual std::string GetFWVersion() = 0;
|
||||
virtual std::string GetSerialNum() = 0;
|
||||
virtual std::uint32_t GetMotorFPGA() = 0;
|
||||
virtual std::uint32_t GetScanFPGA() = 0;
|
||||
virtual bool is_scan() = 0;
|
||||
virtual BOOL Get_Scanner_PaperOn() = 0;
|
||||
virtual int Get_Roller_num() = 0;
|
||||
virtual void config_params(GScanCap& params) = 0;
|
||||
virtual void Scanner_StartScan(UINT16 count) = 0;
|
||||
virtual void Stop_scan() = 0;
|
||||
virtual int notifyscan() = 0;
|
||||
virtual void ResetScanner() = 0;
|
||||
virtual bool Get_IsImageQueueEmpty() = 0;
|
||||
virtual void reset() = 0;
|
||||
|
@ -169,6 +177,8 @@ protected:
|
|||
std::string fwVersion;
|
||||
std::string SerialNum;
|
||||
std::string scannercode;
|
||||
std::uint32_t MotorFpga;
|
||||
std::uint32_t ScanFpga;
|
||||
std::function<void(int, int)> setindicatortext;
|
||||
int aquire_image_count;
|
||||
int updata_image_count;
|
||||
|
@ -176,4 +186,6 @@ protected:
|
|||
int pixType;
|
||||
int lose_image_num;
|
||||
bool bFilterMsg;
|
||||
bool is_AndroidOrLinux;
|
||||
|
||||
};
|
|
@ -145,7 +145,8 @@ typedef enum tagUsbKeyWords : UINT32
|
|||
GScanO200::GScanO200() :
|
||||
huagods(NULL),
|
||||
image_num(0),
|
||||
m_bread_fixed_ratio_fromDSP(false)
|
||||
m_bread_fixed_ratio_fromDSP(false),
|
||||
is_orginimgcount(true)
|
||||
{
|
||||
m_pImages.reset(new ImageMatQueue());
|
||||
m_pImages->Getimagenumber = std::bind(&GScanO200::Getimagenumber,this, std::placeholders::_1);
|
||||
|
@ -217,7 +218,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
|||
{
|
||||
if (m_pImages->empty()) {
|
||||
DoEvents();
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||
if (sw.elapsed_s() > 30.00)
|
||||
{
|
||||
if (m_threadUsb && m_threadUsb->joinable()) {
|
||||
|
@ -228,6 +229,9 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
|||
}
|
||||
Stop_scan();//停止扫描
|
||||
ResetScanner();
|
||||
auto rollernew = Get_Roller_num();
|
||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
||||
set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count()));
|
||||
return HARDWARE_ERROR;
|
||||
}
|
||||
|
||||
|
@ -245,7 +249,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
|||
//writelog("aquireed image " + to_string(++aqimgindex));
|
||||
//FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "aquired procced image "+ to_string(++aqimgindex));
|
||||
|
||||
|
||||
set_aquire_image_count(get_aquire_image_count(), get_updata_image_count() + 1);
|
||||
#ifdef LOG_NORMAL
|
||||
static int aquireindex = 0;
|
||||
FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex));
|
||||
|
@ -275,7 +279,7 @@ std::string GScanO200::GetFWVersion()
|
|||
std::string ver = fwVersion.substr((fwVersion.length() - 2), 2);
|
||||
int verValue = atoi(ver.c_str());
|
||||
m_bread_fixed_ratio_fromDSP = verValue >= 15;
|
||||
//writelog(m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio");
|
||||
FileTools::writelog(log_ERROR,m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio");
|
||||
updateHVRatio();
|
||||
}
|
||||
return fwVersion;
|
||||
|
@ -301,6 +305,34 @@ std::string GScanO200::GetSerialNum()
|
|||
return "";
|
||||
}
|
||||
|
||||
std::uint32_t GScanO200::GetMotorFPGA()
|
||||
{
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { GET_MOTORFPGA_VERSION,0,sizeof(MotorFpga) };
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
||||
MotorFpga = usbcb.u32_Data;
|
||||
return MotorFpga;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::uint32_t GScanO200::GetScanFPGA()
|
||||
{
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { GET_SCANFPGA_VERSION,0,4 };
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
||||
ScanFpga = usbcb.u32_Data;
|
||||
return ScanFpga;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool GScanO200::is_scan()
|
||||
{
|
||||
//std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
|
@ -327,12 +359,17 @@ BOOL GScanO200::Get_Scanner_PaperOn()
|
|||
int GScanO200::Get_Roller_num()
|
||||
{
|
||||
if (!(m_usb.get() && m_usb->is_open()))
|
||||
return false;
|
||||
return 0;
|
||||
USBCB usbcb = { GET_ROLLER_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)
|
||||
{
|
||||
FileTools::writelog(log_ERROR, "get roller usb bulk error");
|
||||
}
|
||||
FileTools::writelog(log_INFO, "get roller num " + to_string(usbcb.u32_Data));
|
||||
return usbcb.u32_Data;
|
||||
}
|
||||
|
||||
|
@ -343,20 +380,7 @@ void GScanO200::config_params(GScanCap& params)
|
|||
gcap = params;
|
||||
UINT32 cfgdata = cfg.GetData();
|
||||
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
|
||||
//FileTools::write_log("¿ªÊ¼Ï·¢Ó²¼þ²ÎÊý ===>\n\tUSB config_params:" + to_string(cfgdata) + "\n\tpaper:" + to_string(cfgdata & 0x1f)
|
||||
// + "\n\tcolor:" + to_string((cfgdata >> 5) & 0x1)
|
||||
// + "\n\tdpi:" + to_string((cfgdata >> 6) & 0x3)
|
||||
// + "\n\tdouble_feed_enbale:" + to_string((cfgdata >> 8) & 0x1)
|
||||
// + "\n\tstable_enbale:" + to_string((cfgdata >> 9) & 0x1)
|
||||
// + "\n\tscrew_detect_enable:" + to_string((cfgdata >> 10) & 0x1)
|
||||
// + "\n\tscrew_detect_level:" + to_string((cfgdata >> 11) & 0x7)
|
||||
// + "\n\tunused_one:" + to_string((cfgdata >> 14) & 0x3F)
|
||||
// + "\n\tpc_correct:" + to_string((cfgdata >> 20) & 0x1)
|
||||
// + "\n\tenable_sizecheck:" + to_string((cfgdata >> 21) & 0x1)
|
||||
// + "\n\tenabledsp_cache:" + to_string((cfgdata >> 22) & 0x1)
|
||||
// + "\n\tlowpowermode:" + to_string((cfgdata >> 23) & 0x7)
|
||||
// + "\n\tunused_two:" + to_string((cfgdata >> 26) & 0x3f));
|
||||
FileTools::writelog(log_INFO, "config hardware param");
|
||||
FileTools::writelog(log_INFO, "config hardware param"+to_string(cfgdata));
|
||||
m_usb->write_bulk(&usbcb, sizeof(USBCB));
|
||||
this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
m_pImages->setparam(params);
|
||||
|
@ -365,12 +389,20 @@ void GScanO200::config_params(GScanCap& params)
|
|||
|
||||
void GScanO200::Scanner_StartScan(UINT16 count)
|
||||
{
|
||||
|
||||
if (fwVersion.size() > 1)
|
||||
{
|
||||
if ((atoi(fwVersion.substr(2, 6).c_str()) > 211132) && ((MotorFpga >= 25210514)&&(MotorFpga<100000000)))
|
||||
is_orginimgcount = true;
|
||||
else
|
||||
is_orginimgcount = false;
|
||||
}
|
||||
roller_num = Get_Roller_num();
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
if (m_threadUsb && m_threadUsb->joinable()) {
|
||||
devState = DEV_STOP;
|
||||
m_threadUsb->join();
|
||||
}
|
||||
|
||||
USBCB status = { GET_DSP_STATUS ,0,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->write_bulk(&status, sizeof(status));
|
||||
|
@ -420,7 +452,7 @@ void GScanO200::Scanner_StartScan(UINT16 count)
|
|||
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
{
|
||||
m_pImages->setscanflags(true);
|
||||
|
@ -429,6 +461,11 @@ void GScanO200::Scanner_StartScan(UINT16 count)
|
|||
}
|
||||
}
|
||||
|
||||
int GScanO200::notifyscan()
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
void GScanO200::Stop_scan()
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
|
@ -442,11 +479,17 @@ void GScanO200::ResetScanner()
|
|||
{
|
||||
if (!(m_usb.get() && m_usb->is_connected()))
|
||||
return;
|
||||
roller_num = Get_Roller_num();
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
while (!m_pImages->m_imagepath.empty())
|
||||
{
|
||||
string path = m_pImages->m_imagepath.front();
|
||||
if (isFileExist(path))
|
||||
remove(path.c_str());
|
||||
m_pImages->m_imagepath.pop();
|
||||
}
|
||||
}
|
||||
|
||||
bool GScanO200::Get_IsImageQueueEmpty()
|
||||
|
@ -581,7 +624,6 @@ void GScanO200::usbmain()
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
if (sw.elapsed_ms() > 30000)
|
||||
{
|
||||
m_pImages->setscanflags(false);
|
||||
|
@ -591,21 +633,21 @@ void GScanO200::usbmain()
|
|||
FileTools::writelog(log_ERROR, "USBmain aquire image timeout");
|
||||
return;
|
||||
}
|
||||
if(gcap.resolution_dst>200.0f)
|
||||
{
|
||||
if (m_pImages->orginimgcount() > 2)
|
||||
{
|
||||
this_thread::sleep_for(chrono::milliseconds(10));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (m_pImages->orginimgcount() > 10)
|
||||
{
|
||||
this_thread::sleep_for(chrono::milliseconds(10));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//if(gcap.resolution_dst>200.0f)
|
||||
//{
|
||||
// if (m_pImages->orginimgcount() > 2)
|
||||
// {
|
||||
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||
// continue;
|
||||
// }
|
||||
//}
|
||||
//else {
|
||||
// if ((m_pImages->orginimgcount() > 15)&&(is_orginimgcount))
|
||||
// {
|
||||
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||
// continue;
|
||||
// }
|
||||
//}
|
||||
|
||||
USBCB usbcb = Get_Scanner_Status();
|
||||
switch (usbcb.u32_Data) {
|
||||
|
@ -619,9 +661,21 @@ void GScanO200::usbmain()
|
|||
FileTools::writelog(log_ERROR,"imgData->size() error send stop scan");
|
||||
break;
|
||||
}
|
||||
if(!m_pImages->get_isDogEar())
|
||||
m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData)));
|
||||
m_usb->set_timeout(200);
|
||||
//if(!m_pImages->get_isDogEar())
|
||||
// m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData)));
|
||||
//string path = cv::tempfile();
|
||||
m_pImages->m_data.push(imgData);
|
||||
//string path = FileTools::get_appdata_path() + "image"+to_string(get_aquire_image_count())+".tmp";
|
||||
//if (!access(path.c_str(), 0))
|
||||
// remove(path.c_str());
|
||||
//FILE* fd = fopen(path.c_str(), "wb+");
|
||||
//if (fd)
|
||||
//{
|
||||
// fwrite(imgData->data(), imgData->size(), 1, fd);
|
||||
// fclose(fd);
|
||||
// m_pImages->m_imagepath.push(path);
|
||||
//}
|
||||
Pop_Image();
|
||||
set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count());
|
||||
FileTools::writelog(log_INFO, "从扫描仪接收"+to_string(get_aquire_image_count())+"份文件。");
|
||||
|
@ -654,10 +708,15 @@ void GScanO200::usbmain()
|
|||
case PAPER_SKEW:
|
||||
case HARDWARE_ERROR:
|
||||
case PC_SCAN_BUSY_or_ERROR:
|
||||
case SIZE_ERROR: {
|
||||
case SIZE_ERROR:
|
||||
case USB_BULK_ERROR:
|
||||
{
|
||||
if (usbcb.u32_Data == USB_BULK_ERROR)
|
||||
Stop_scan();
|
||||
Set_ErrorCode(usbcb.u32_Data);
|
||||
m_pImages->setscanflags(false);
|
||||
devState = DEV_WRONG;
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1500));
|
||||
auto rollernew = Get_Roller_num();
|
||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
||||
set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count()));
|
||||
|
@ -693,7 +752,11 @@ USBCB GScanO200::Get_Scanner_Status()
|
|||
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
||||
|
||||
if (usbcb.u32_CMD != GET_DSP_STATUS)
|
||||
{
|
||||
FileTools::writelog(log_ERROR, "get dsp status usb bulk error");
|
||||
return { NO_COMMAND,USB_BULK_ERROR,0 };
|
||||
}
|
||||
return usbcb;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,11 +15,14 @@ public:
|
|||
virtual BOOL IsConnected() override;
|
||||
virtual std::string GetFWVersion() override;
|
||||
virtual std::string GetSerialNum() override;
|
||||
virtual std::uint32_t GetMotorFPGA() override;
|
||||
virtual std::uint32_t GetScanFPGA() override;
|
||||
virtual bool is_scan() override;
|
||||
virtual BOOL Get_Scanner_PaperOn() override;
|
||||
virtual int Get_Roller_num() override;
|
||||
virtual void config_params(GScanCap& params) override;
|
||||
virtual void Scanner_StartScan(UINT16 count) override;
|
||||
virtual int notifyscan() override;
|
||||
virtual void Stop_scan() override;
|
||||
virtual void ResetScanner() override;
|
||||
virtual bool Get_IsImageQueueEmpty() override;
|
||||
|
@ -45,6 +48,7 @@ private:
|
|||
void Pop_Image();
|
||||
private:
|
||||
bool m_bread_fixed_ratio_fromDSP;
|
||||
bool is_orginimgcount;
|
||||
std::shared_ptr<IUsb> m_usb;
|
||||
std::unique_ptr<thread> m_threadUsb;
|
||||
GScanCap gcap;
|
||||
|
|
|
@ -195,11 +195,13 @@ void GScanO400::open(int vid, int pid)
|
|||
bool ret = m_usb->open();
|
||||
USBCB status = { GET_DSP_STATUS ,0,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->write_bulk(&status, sizeof(status));
|
||||
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->read_bulk(&status, sizeof(status));
|
||||
|
||||
{
|
||||
//m_usb->write_bulk(&status, sizeof(status));
|
||||
//m_usb->read_bulk(&status, sizeof(status));
|
||||
//std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
notifyscan();
|
||||
GetFWVersion();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,7 +228,7 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
|||
devState = DEV_STOP;
|
||||
m_threadUsb->join();
|
||||
m_threadUsb.reset();
|
||||
//writelog("aquire_bmpdata m_threadUsb.reset();");
|
||||
FileTools::writelog(log_ERROR,"aquire_bmpdata m_threadUsb.reset()");
|
||||
}
|
||||
Stop_scan();//ֹͣɨÃè
|
||||
ResetScanner();
|
||||
|
@ -243,15 +245,7 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
|||
else {
|
||||
if (m_pImages->valid()) {
|
||||
bmpdata = *(m_pImages->popBmpdata());
|
||||
//static int aqimgindex = 0;
|
||||
//writelog("aquireed image " + to_string(++aqimgindex));
|
||||
//FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "aquired procced image "+ to_string(++aqimgindex));
|
||||
|
||||
|
||||
#ifdef LOG_NORMAL
|
||||
static int aquireindex = 0;
|
||||
FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex));
|
||||
#endif // LOG
|
||||
set_aquire_image_count(get_aquire_image_count(), get_updata_image_count() + 1);
|
||||
return 0;
|
||||
}
|
||||
DoEvents();
|
||||
|
@ -276,6 +270,10 @@ std::string GScanO400::GetFWVersion()
|
|||
if(m_usb.get()&&m_usb->is_connected())
|
||||
m_usb->read_bulk(&fwVersion[0], fwVersion.size());
|
||||
}
|
||||
if (fwVersion.substr(0, 2) == "G3" || fwVersion.substr(0, 2) == "G4")
|
||||
is_AndroidOrLinux = false;
|
||||
else
|
||||
is_AndroidOrLinux = true;
|
||||
return fwVersion;
|
||||
}
|
||||
return "";
|
||||
|
@ -299,6 +297,35 @@ std::string GScanO400::GetSerialNum()
|
|||
return "";
|
||||
}
|
||||
|
||||
std::uint32_t GScanO400::GetMotorFPGA()
|
||||
{
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { GET_MOTORFPGA_VERSION,0,sizeof(MotorFpga) };
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
||||
MotorFpga = usbcb.u32_Data;
|
||||
return MotorFpga;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::uint32_t GScanO400::GetScanFPGA()
|
||||
{
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { GET_SCANFPGA_VERSION,0,4 };
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
||||
ScanFpga = usbcb.u32_Data;
|
||||
return ScanFpga;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool GScanO400::is_scan()
|
||||
{
|
||||
//std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
|
@ -339,6 +366,11 @@ int GScanO400::Get_Roller_num()
|
|||
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)
|
||||
{
|
||||
FileTools::writelog(log_ERROR, "get roller usb bulk error");
|
||||
}
|
||||
FileTools::writelog(log_INFO, "get roller num " + to_string(usbcb.u32_Data));
|
||||
return usbcb.u32_Data;
|
||||
}
|
||||
|
||||
|
@ -350,17 +382,7 @@ void GScanO400::config_params(GScanCap& params)
|
|||
gcap = params;
|
||||
UINT32 cfgdata = cfg.GetData();
|
||||
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
|
||||
//FileTools::write_log("开始下发硬件参数 ===> \n\tUSB config_params:"+to_string(cfgdata)+"\n\tpaper:"+to_string(cfgdata&0x1f)
|
||||
// + "\n\tcolor:" + to_string((cfgdata>>5) & 0x1)
|
||||
// + "\n\tdpi:" + to_string((cfgdata>>6) & 0x3)
|
||||
// + "\n\tdouble_feed_enbale:" + to_string((cfgdata>>8) & 0x1)
|
||||
// + "\n\tstable_enbale:" + to_string((cfgdata>>9) & 0x1)
|
||||
// + "\n\tenableLed:" + to_string((cfgdata>>10) & 0x1)
|
||||
// + "\n\treversed1:" + to_string((cfgdata>>11) & 0x3F)
|
||||
// + "\n\tisCorrect:" + to_string((cfgdata>>17) & 0x1)
|
||||
// + "\n\tdstHeight:" + to_string((cfgdata>>18) & 0xFF)
|
||||
// + "\n\treversed2:" + to_string((cfgdata>>26) & 0x3F));
|
||||
FileTools::writelog(log_INFO, "config hardware param");
|
||||
FileTools::writelog(log_INFO, "config hardware param"+to_string(cfgdata));
|
||||
m_usb->write_bulk(&usbcb, sizeof(USBCB));
|
||||
this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
m_pImages->setparam(params);
|
||||
|
@ -369,7 +391,8 @@ void GScanO400::config_params(GScanCap& params)
|
|||
|
||||
void GScanO400::Scanner_StartScan(UINT16 count)
|
||||
{
|
||||
|
||||
scanfalg = false;
|
||||
roller_num = Get_Roller_num();
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
if (m_threadUsb && m_threadUsb->joinable()) {
|
||||
devState = DEV_STOP;
|
||||
|
@ -433,12 +456,41 @@ void GScanO400::Scanner_StartScan(UINT16 count)
|
|||
}
|
||||
}
|
||||
|
||||
int GScanO400::notifyscan()
|
||||
{
|
||||
if (is_AndroidOrLinux)
|
||||
return 2;
|
||||
if (!m_usb.get() && !m_usb->is_connected())
|
||||
return -1;
|
||||
USBCB notify = { 0x100,0,0 };
|
||||
m_usb->write_bulk(¬ify, sizeof(notify));
|
||||
m_usb->read_bulk(¬ify, sizeof(notify));
|
||||
if (notify.u32_Data == 0x100)
|
||||
{
|
||||
ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("扫描仪处于休眠状态正在唤醒! 提示 "), NULL, SW_HIDE);
|
||||
auto now = std::chrono::system_clock::now();
|
||||
while (std::chrono::system_clock::now() < now + std::chrono::milliseconds(8000))
|
||||
{
|
||||
DoEvents();
|
||||
}
|
||||
ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("扫描仪唤醒完成! 提示 "), NULL, SW_HIDE);
|
||||
return 1;
|
||||
}
|
||||
else if (notify.u32_Data == 0x10)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void GScanO400::Stop_scan()
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { STOP ,0,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
{
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
scanfalg = true;
|
||||
FileTools::writelog(log_INFO, "user stop scan");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -446,7 +498,7 @@ void GScanO400::ResetScanner()
|
|||
{
|
||||
if (!(m_usb.get() && m_usb->is_connected()))
|
||||
return;
|
||||
roller_num = Get_Roller_num();
|
||||
|
||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
|
@ -462,7 +514,13 @@ void GScanO400::reset()
|
|||
{
|
||||
while (!m_pImages->empty())
|
||||
m_pImages->clear();
|
||||
|
||||
while (!m_pImages->m_imagepath.empty())
|
||||
{
|
||||
string path = m_pImages->m_imagepath.front();
|
||||
if (isFileExist(path))
|
||||
remove(path.c_str());
|
||||
m_pImages->m_imagepath.pop();
|
||||
}
|
||||
}
|
||||
|
||||
void GScanO400::setdecodepixtype(int twpixtype)
|
||||
|
@ -589,46 +647,68 @@ void GScanO400::usbmain()
|
|||
FileTools::writelog(log_ERROR, "USBmain aquire image timeout");
|
||||
return;
|
||||
}
|
||||
if(gcap.resolution_dst>200.0f)
|
||||
{
|
||||
if (m_pImages->orginimgcount() > 2)
|
||||
{
|
||||
this_thread::sleep_for(chrono::milliseconds(10));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (m_pImages->orginimgcount() > 10) {
|
||||
this_thread::sleep_for(chrono::milliseconds(10));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
//if(gcap.resolution_dst>200.0f)
|
||||
//{
|
||||
// if (m_pImages->orginimgcount() > 2)
|
||||
// {
|
||||
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||
// continue;
|
||||
// }
|
||||
//}
|
||||
//else {
|
||||
// if (m_pImages->orginimgcount() > 10) {
|
||||
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||
// continue;
|
||||
// }
|
||||
//}
|
||||
USBCB usbcb = Get_Scanner_Status();
|
||||
switch (usbcb.u32_Data) {
|
||||
case HAVE_IMAGE:
|
||||
{
|
||||
int totalNum = usbcb.u32_Count;
|
||||
//if(is_AndroidOrLinux)
|
||||
// m_usb->read_bulk(error_buf->data(), 512);
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
m_usb->set_timeout(2000);
|
||||
imgData = Get_Img_Data(totalNum);
|
||||
m_usb->set_timeout(200);
|
||||
if (!imgData->size()) {
|
||||
Stop_scan();
|
||||
FileTools::writelog(log_ERROR,"imgData->size() error");
|
||||
break;
|
||||
}
|
||||
if(!m_pImages->get_isDogEar())
|
||||
m_pImages->pushMat(std::shared_ptr<IDecode>(new G400Decode(imgData)));
|
||||
m_usb->set_timeout(200);
|
||||
FileTools::writelog(log_INFO, " get image data size " + to_string(totalNum));
|
||||
if (imgData->size() != totalNum)
|
||||
{
|
||||
FileTools::writelog(log_ERROR," get image data size error totalnum " + to_string(totalNum) + " imgdata size " + to_string(imgData->size()));
|
||||
}
|
||||
//if(!m_pImages->get_isDogEar())
|
||||
//m_pImages->pushMat(std::shared_ptr<IDecode>(new G400Decode(imgData)));
|
||||
m_pImages->m_data.push(imgData);
|
||||
//string path = FileTools::get_appdata_path() + "image"+to_string(get_aquire_image_count())+".tmp";
|
||||
//if (!access(path.c_str(), 0))
|
||||
// remove(path.c_str());
|
||||
//FILE* fd = fopen(path.c_str(), "wb+");
|
||||
//if (fd)
|
||||
//{
|
||||
// if ((*imgData)[0] != -1 && (*imgData)[1] != -40 && (*imgData)[2] != -1 && (*imgData)[3] != -32)
|
||||
// fwrite(imgData->data() + 12, imgData->size() - 12, 1, fd);
|
||||
// else
|
||||
// fwrite(imgData->data(), imgData->size(), 1, fd);
|
||||
// fclose(fd);
|
||||
// m_pImages->m_imagepath.push(path);
|
||||
//}
|
||||
set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count());
|
||||
FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_aquire_image_count()) + "份文件。");
|
||||
Pop_Image();
|
||||
if(!is_AndroidOrLinux)
|
||||
Pop_Image();
|
||||
FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_aquire_image_count()) + "份文件。耗时 "+to_string(sw.elapsed_ms()));
|
||||
sw.reset();
|
||||
break;
|
||||
}
|
||||
case STOP_SCAN:
|
||||
{
|
||||
m_pImages->setscanflags(false);
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1500));
|
||||
auto rollernew = Get_Roller_num();
|
||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
||||
{
|
||||
|
@ -653,17 +733,28 @@ void GScanO400::usbmain()
|
|||
case HARDWARE_ERROR:
|
||||
case PC_SCAN_BUSY_or_ERROR:
|
||||
case SIZE_ERROR:
|
||||
case USB_BULK_ERROR:
|
||||
if (!haveError)
|
||||
{
|
||||
haveError = true;
|
||||
devState = DEV_WRONG;
|
||||
m_pImages->setscanflags(false);
|
||||
Set_ErrorCode(usbcb.u32_Data);
|
||||
auto rollernew = Get_Roller_num();
|
||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
||||
set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count()));
|
||||
//if (is_AndroidOrLinux)
|
||||
//{
|
||||
haveError = true;
|
||||
Set_ErrorCode(usbcb.u32_Data);
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// haveError = true;
|
||||
// devState = DEV_WRONG;
|
||||
// m_pImages->setscanflags(false);
|
||||
// Set_ErrorCode(usbcb.u32_Data);
|
||||
// std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||
// auto rollernew = Get_Roller_num();
|
||||
// if (get_aquire_image_count() != (rollernew - roller_num))
|
||||
// set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count()));
|
||||
//}
|
||||
if (huagods)
|
||||
dev_callback(usbcb.u32_Data, huagods);
|
||||
|
||||
}
|
||||
break;
|
||||
case NORMAL:
|
||||
|
@ -690,13 +781,23 @@ USBCB GScanO400::Get_Scanner_Status()
|
|||
if (!(m_usb.get() && m_usb->is_connected())) {
|
||||
return { NO_COMMAND ,PC_SCAN_BUSY_or_ERROR ,0 };
|
||||
}
|
||||
|
||||
USBCB usbcb = { GET_DSP_STATUS ,0,0 };
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
||||
|
||||
if (usbcb.u32_CMD != GET_DSP_STATUS)
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(50));
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->read_bulk(&usbcb, 512);
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
if (m_usb.get() && m_usb->is_connected())
|
||||
m_usb->read_bulk(&usbcb, 512);
|
||||
FileTools::writelog(log_ERROR, "get dsp status error");
|
||||
return { NO_COMMAND,USB_BULK_ERROR,0 };
|
||||
}
|
||||
return usbcb;
|
||||
}
|
||||
|
||||
|
@ -708,7 +809,7 @@ std::shared_ptr<std::vector<char>> GScanO400::Get_Img_Data(int bufferSize)
|
|||
return std::shared_ptr<std::vector<char>>(new std::vector<char>());
|
||||
|
||||
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
|
||||
StopWatch sw;
|
||||
/*StopWatch sw;
|
||||
int readed = 0;
|
||||
USBCB usbcb = { GET_IMAGE,0,bufferSize };
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
|
@ -727,8 +828,19 @@ std::shared_ptr<std::vector<char>> GScanO400::Get_Img_Data(int bufferSize)
|
|||
|
||||
int tt = m_usb->read_bulk(imData->data() + startindex, dstlength);
|
||||
startindex += dstlength;
|
||||
}*/
|
||||
StopWatch sw;
|
||||
int readed = 0;
|
||||
USBCB usbcb = { GET_IMAGE,0,bufferSize };
|
||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||
int totalength = 1024 * 1024;
|
||||
int startindex = 0;
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(20));
|
||||
while (startindex < bufferSize)
|
||||
{
|
||||
startindex += m_usb->read_bulk(imData->data() + startindex, (bufferSize - startindex) < totalength ? (bufferSize - startindex) : totalength); //数据接收量必须小于等于管道内数据量,否则会接收失败
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(10));
|
||||
}
|
||||
|
||||
if (sw.elapsed_ms() > 5000)
|
||||
{
|
||||
FileTools::writelog(log_ERROR,"Usb read data timeout\n");
|
||||
|
|
|
@ -15,11 +15,14 @@ public:
|
|||
virtual BOOL IsConnected() override;
|
||||
virtual std::string GetFWVersion() override;
|
||||
virtual std::string GetSerialNum() override;
|
||||
virtual std::uint32_t GetMotorFPGA() override;
|
||||
virtual std::uint32_t GetScanFPGA() override;
|
||||
virtual bool is_scan() override;
|
||||
virtual BOOL Get_Scanner_PaperOn() override;
|
||||
virtual int Get_Roller_num() override;
|
||||
virtual void config_params(GScanCap& params) override;
|
||||
virtual void Scanner_StartScan(UINT16 count) override;
|
||||
virtual int notifyscan() override;
|
||||
virtual void Stop_scan() override;
|
||||
virtual void ResetScanner() override;
|
||||
virtual bool Get_IsImageQueueEmpty() override;
|
||||
|
@ -49,6 +52,7 @@ private:
|
|||
std::unique_ptr<thread> m_threadUsb;
|
||||
GScanCap gcap;
|
||||
volatile int image_num;
|
||||
volatile bool scanfalg;
|
||||
void* huagods;
|
||||
deviceevent_callback dev_callback;
|
||||
};
|
||||
|
|
|
@ -74,6 +74,7 @@ static std::map<PaperStatus, unsigned int> SupPaperTyps = {
|
|||
{{TwSS::None,PaperAlign::Rot0},G400_A3},
|
||||
#endif
|
||||
{{TwSS::MaxSize,PaperAlign::Rot0},G400_LONGLETTER},
|
||||
{{TwSS::USStatement,PaperAlign::Rot0},G400_LONGLETTER},
|
||||
{{TwSS::Trigeminy,PaperAlign::Rot0},G400_LONGLETTER},
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -321,7 +321,8 @@ void ImageMatQueue::PaniusCount()
|
|||
|
||||
bool ImageMatQueue::empty()
|
||||
{
|
||||
return atm_orgin_image_remains <= 0 && m_imagedata.Size() == 0 && !is_scanning;
|
||||
//return atm_orgin_image_remains <= 0 && m_imagedata.Size() == 0 && !is_scanning;
|
||||
return m_imagepath.empty()&&(m_imagedata.Size()==0 )&& !is_scanning&&m_data.empty();
|
||||
}
|
||||
|
||||
bool ImageMatQueue::queuesempty()
|
||||
|
@ -335,18 +336,106 @@ void ImageMatQueue::proc()
|
|||
//int dwnumber = std::thread::thread::hardware_concurrency();
|
||||
//std::unique_ptr<ThreadPool> m_threadpool;
|
||||
//m_threadpool.reset(new ThreadPool(dwnumber < 4 ? 1 : dwnumber / 2));
|
||||
std::ios::sync_with_stdio(false);
|
||||
while (bRun) {
|
||||
while (m_imagedata.Size() > 0) {
|
||||
this_thread::sleep_for(chrono::milliseconds(1));
|
||||
}
|
||||
|
||||
if (m_rawBuffs.Size() == 0)
|
||||
//if (m_rawBuffs.Size() == 0)
|
||||
//{
|
||||
// this_thread::sleep_for(chrono::milliseconds(1));
|
||||
// continue;
|
||||
//}
|
||||
//if (m_imagepath.empty())
|
||||
//{
|
||||
// this_thread::sleep_for(chrono::milliseconds(1));
|
||||
// continue;
|
||||
//}
|
||||
if (m_data.empty())
|
||||
{
|
||||
this_thread::sleep_for(chrono::milliseconds(1));
|
||||
continue;
|
||||
}
|
||||
|
||||
auto& buffs = m_rawBuffs.Take()->getImageBuffs();
|
||||
if (m_data.size() > 0)
|
||||
{
|
||||
string path = FileTools::get_appdata_path() + "image" + to_string(index++) + ".tmp";
|
||||
if (!access(path.c_str(), 0))
|
||||
remove(path.c_str());
|
||||
auto buff = m_data.front();
|
||||
//if (!fw.get())
|
||||
// fw.reset(new fstream());
|
||||
//fw->open(path, std::ios::binary | std::ios::out);
|
||||
//if (fw->is_open())
|
||||
//{
|
||||
// if ((*buff)[0] != -1 && (*buff)[1] != -40 && (*buff)[2] != -1 && (*buff)[3] != -32)
|
||||
// {
|
||||
// fw->write(buff->data() + 12, buff->size() - 12);
|
||||
// FileTools::writelog(log_ERROR, "usb data error -image data");
|
||||
// }
|
||||
// else
|
||||
// fw->write(buff->data(), buff->size());
|
||||
// fw->flush();
|
||||
// fw->close();
|
||||
// m_imagepath.push(path);
|
||||
// buff.reset(); m_data.pop();
|
||||
// fw.reset();
|
||||
//}
|
||||
|
||||
CFile frb;
|
||||
if (frb.Open(CString(path.c_str()), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary))
|
||||
{
|
||||
if ((*buff)[0] != -1 && (*buff)[1] != -40 && (*buff)[2] != -1 && (*buff)[3] != -32)
|
||||
{
|
||||
frb.Write(buff->data() + 12, buff->size() - 12);
|
||||
FileTools::writelog(log_ERROR, "usb data error -image data");
|
||||
}
|
||||
else
|
||||
frb.Write(buff->data(), buff->size());
|
||||
frb.Flush();
|
||||
frb.Close();
|
||||
m_imagepath.push(path);
|
||||
buff.reset(); m_data.pop();
|
||||
}
|
||||
}
|
||||
|
||||
std::string path = m_imagepath.front();
|
||||
long lenght= FileTools::get_file_size(path.c_str());
|
||||
std::shared_ptr<std::vector<char>> buf(new std::vector<char>);
|
||||
buf->resize(lenght);
|
||||
StopWatch sw;
|
||||
if (!access(path.c_str(),0))
|
||||
{
|
||||
//if (!fr.get())
|
||||
// fr.reset(new fstream());
|
||||
//fr->open(path, std::ios::binary | std::ios::in);
|
||||
//if (fr->is_open())
|
||||
//{
|
||||
// fr->read(buf->data(), lenght);
|
||||
// fr->close();
|
||||
// fr.reset();
|
||||
// remove(path.c_str());
|
||||
//}
|
||||
CFile fwb;
|
||||
if (fwb.Open(CString(path.c_str()), CFile::modeRead |CFile::typeBinary))
|
||||
{
|
||||
fwb.Read(buf->data(), lenght);
|
||||
fwb.Close();
|
||||
remove(path.c_str());
|
||||
}
|
||||
}
|
||||
else
|
||||
FileTools::writelog(log_ERROR, "open file error filename:" + path);
|
||||
FileTools::writelog(log_INFO, " 获取磁盘图片数据耗时 " + to_string(sw.elapsed_ms())+" data size "+to_string(lenght));
|
||||
sw.reset();
|
||||
#ifdef G200
|
||||
auto& buffs = G200Decode(buf).getImageBuffs();
|
||||
#else
|
||||
auto& buffs = G400Decode(buf).getImageBuffs();
|
||||
#endif // G200
|
||||
|
||||
//auto& buffs = m_rawBuffs.Take()->getImageBuffs();
|
||||
if (!m_rawBuffs.IsShutDown() && !buffs.empty()) {
|
||||
//m_threadpool->enqueue(&ImageMatQueue::imageproceing, this, buffs);
|
||||
//try {
|
||||
|
@ -357,7 +446,9 @@ void ImageMatQueue::proc()
|
|||
// FileTools::writelog(log_ERROR, " image proc error " + std::string(e.what()));
|
||||
//}
|
||||
imageproceing(buffs);
|
||||
|
||||
}
|
||||
m_imagepath.pop();
|
||||
}
|
||||
//m_threadpool.reset();
|
||||
}
|
||||
|
@ -379,10 +470,10 @@ void ImageMatQueue::imageproceing(std::vector<std::shared_ptr<std::vector<char>>
|
|||
try
|
||||
{
|
||||
cv::Mat mat = cv::imdecode(*buf, rmc);
|
||||
buf.reset();
|
||||
if (mat.empty()) {
|
||||
FileTools::writelog(log_ERROR,"decode image data error");
|
||||
}
|
||||
buf.reset();
|
||||
#ifdef G200
|
||||
cv::resize(mat, mat, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
|
||||
mats.push_back(mat);
|
||||
|
@ -405,6 +496,12 @@ void ImageMatQueue::imageproceing(std::vector<std::shared_ptr<std::vector<char>>
|
|||
}
|
||||
}
|
||||
buffs.clear();
|
||||
if (mats[0].empty() || mats[1].empty())
|
||||
{
|
||||
mats.clear();
|
||||
PaniusCount();
|
||||
return;
|
||||
}
|
||||
//DogEar_index++; //暂时屏蔽 2021.3.18
|
||||
//StopWatch sw;
|
||||
//sw.reset();
|
||||
|
@ -421,17 +518,17 @@ void ImageMatQueue::imageproceing(std::vector<std::shared_ptr<std::vector<char>>
|
|||
// }
|
||||
//}
|
||||
//FileTools::write_log("1.txt", " dogear time " + to_string(sw.elapsed_ms()));
|
||||
static int index = 0;
|
||||
if (scanParam.is_switchfrontback)
|
||||
swap(mats[0], mats[1]);
|
||||
if (scanParam.en_fold != 0) {
|
||||
cv::flip(mats[0], mats[0], 1);
|
||||
cv::flip(mats[0], mats[0], 0);
|
||||
}
|
||||
StopWatch sw;
|
||||
for (int j = 0; j < m_iaList.size(); j++) {
|
||||
m_iaList[j]->apply(mats, scanParam.is_duplex);
|
||||
}
|
||||
|
||||
FileTools::writelog(log_INFO, "图像处理耗时 " + to_string(sw.elapsed_ms()));
|
||||
for (int i = 0; i < mats.size(); i++) {
|
||||
if (!scanParam.is_duplex && i == 1) {
|
||||
mats[i].release();
|
||||
|
|
|
@ -174,6 +174,8 @@ public:
|
|||
void updatefixratio(float& hratio, float& vratio);
|
||||
std::function<void(int)> DogEarDetection_callback;
|
||||
std::function<void(bool)> Getimagenumber;
|
||||
std::queue<std::string> m_imagepath;
|
||||
std::queue<std::shared_ptr<std::vector<char>>> m_data;
|
||||
private:
|
||||
void proc();
|
||||
void imageproceing(std::vector<std::shared_ptr<std::vector<char>>>& buffs);
|
||||
|
@ -187,6 +189,8 @@ private:
|
|||
volatile bool bRun;
|
||||
volatile int atm_orgin_image_remains;
|
||||
volatile bool is_scanning;
|
||||
std::unique_ptr<fstream> fw;
|
||||
std::unique_ptr<fstream> fr;
|
||||
GScanCap scanParam;
|
||||
Device::PaperSize papersize;
|
||||
std::shared_ptr<CImageApplyDogEarDetection> m_dogear;
|
||||
|
|
|
@ -388,6 +388,7 @@ std::string TCHAR2STRING(TCHAR* STR)
|
|||
char* chRtn = new char[iLen * sizeof(char)];
|
||||
WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL);
|
||||
std::string str(chRtn);
|
||||
delete[]chRtn;
|
||||
return str;
|
||||
}
|
||||
|
||||
|
@ -426,6 +427,23 @@ std::string StringToUtf(std::string strValue)
|
|||
return retStr;
|
||||
}
|
||||
|
||||
char* GBKToUTF8(const char* chGBK)
|
||||
{
|
||||
DWORD dWideBufSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)chGBK, -1, NULL, 0);
|
||||
wchar_t* pWideBuf = new wchar_t[dWideBufSize];
|
||||
wmemset(pWideBuf, 0, dWideBufSize);
|
||||
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)chGBK, -1, pWideBuf, dWideBufSize);
|
||||
|
||||
DWORD dUTF8BufSize = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pWideBuf, -1, NULL, 0, NULL, NULL);
|
||||
|
||||
char* pUTF8Buf = new char[dUTF8BufSize];
|
||||
memset(pUTF8Buf, 0, dUTF8BufSize);
|
||||
WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pWideBuf, -1, pUTF8Buf, dUTF8BufSize, NULL, NULL);
|
||||
|
||||
delete[]pWideBuf;
|
||||
return pUTF8Buf;
|
||||
}
|
||||
|
||||
int GetContrastLevel(float contrast) {
|
||||
int ret = 4;
|
||||
if (contrast >= -1000.0f && contrast < -666.0f) { ret = 1; }
|
||||
|
|
|
@ -278,7 +278,7 @@ enum G400_PaperSize {
|
|||
G400_LEGAL,
|
||||
G400_LETTER,
|
||||
G400_LETTERR,
|
||||
G400_LONGLETTER
|
||||
G400_LONGLETTER=17,
|
||||
};
|
||||
|
||||
enum G400_DPI {
|
||||
|
@ -311,6 +311,7 @@ HBITMAP SetButtonStaticBkBmp(HINSTANCE hInst, HWND hWin, UINT id, UINT iamge_id)
|
|||
void writelog(std::string msg);
|
||||
std::string TCHAR2STRING(TCHAR* STR);
|
||||
float GetContrast(int level);
|
||||
char* GBKToUTF8(const char* chGBK);
|
||||
int GetMappingBrightnessValue(float in);
|
||||
int GetMappingContrastValue(float in);
|
||||
int GetContrastLevel(float contrast);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include "UsbScanEx.h"
|
||||
#include <tchar.h>
|
||||
#include <winioctl.h>
|
||||
#include "filetools.h"
|
||||
//#include "filetools.h"
|
||||
|
||||
UsbScanEx::UsbScanEx(int index)
|
||||
{
|
||||
|
@ -80,7 +80,7 @@ bool UsbScanEx::open()
|
|||
CloseHandle(m_h_dev);
|
||||
m_h_dev = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
FileTools::writelog(log_lv::log_INFO,"USB Open!");
|
||||
//FileTools::writelog(log_lv::log_INFO,"USB Open!");
|
||||
return m_h_dev;
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,7 @@ bool UsbScanEx::close()
|
|||
}
|
||||
}
|
||||
m_b_is_connected = FALSE;
|
||||
FileTools::writelog(log_lv::log_INFO,"USB Close!");
|
||||
//FileTools::writelog(log_lv::log_INFO,"USB Close!");
|
||||
return b_ret;
|
||||
}
|
||||
|
||||
|
@ -156,8 +156,9 @@ int UsbScanEx::read_bulk(void* data, int len)
|
|||
|
||||
if (m_h_dev != NULL) {
|
||||
b_ret = ReadFile(h_pipe, data, len, &pdw_ret, lp_overlap);
|
||||
|
||||
//b_ret = GetOverlappedResult(h_pipe, lp_overlap, &pdw_ret, TRUE);
|
||||
if (b_ret) {
|
||||
FlushFileBuffers(h_pipe);
|
||||
return pdw_ret;
|
||||
}
|
||||
else {
|
||||
|
@ -170,13 +171,13 @@ int UsbScanEx::read_bulk(void* data, int len)
|
|||
case ERROR_FILE_NOT_FOUND:
|
||||
case ERROR_ACCESS_DENIED:
|
||||
m_b_is_connected = false;
|
||||
FileTools::writelog(log_lv::log_WARN, "errorcode =" + std::to_string(error_code));
|
||||
//FileTools::writelog(log_lv::log_WARN, "errorcode =" + std::to_string(error_code));
|
||||
if (hotplug_call) {
|
||||
hotplug_call(true, usrdata);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
FileTools::writelog(log_INFO,"Usb read_bulk error code : " + std::to_string(error_code));
|
||||
//FileTools::writelog(log_INFO,"Usb read_bulk error code : " + std::to_string(error_code));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -194,12 +195,15 @@ int UsbScanEx::write_bulk(void* data, int len)
|
|||
if (m_h_dev == INVALID_HANDLE_VALUE)
|
||||
return TRUE;
|
||||
b_ret = WriteFile(h_pipe, p_data, dw_size, &dw_size, lp_overlap);
|
||||
//b_ret = GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE);
|
||||
if (b_ret) {
|
||||
FlushFileBuffers(h_pipe);
|
||||
return dw_size;
|
||||
}
|
||||
else {
|
||||
int errorcode = GetLastError();
|
||||
switch (errorcode)
|
||||
//int errorcode = GetLastError();
|
||||
//switch (errorcode)
|
||||
switch (GetLastError())
|
||||
{
|
||||
case ERROR_IO_PENDING:
|
||||
GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE);
|
||||
|
@ -207,13 +211,13 @@ int UsbScanEx::write_bulk(void* data, int len)
|
|||
case ERROR_FILE_NOT_FOUND:
|
||||
case ERROR_ACCESS_DENIED:
|
||||
m_b_is_connected = false;
|
||||
FileTools::writelog(log_lv::log_WARN,"errorcode ="+ std::to_string(errorcode));
|
||||
//FileTools::writelog(log_lv::log_WARN,"errorcode ="+ std::to_string(errorcode));
|
||||
if (hotplug_call) {
|
||||
hotplug_call(true, usrdata);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
FileTools::writelog(log_INFO,"Usb write_bulk error code: " + std::to_string(errorcode));
|
||||
//FileTools::writelog(log_INFO,"Usb write_bulk error code: " + std::to_string(errorcode));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -280,7 +284,6 @@ int UsbScanEx::read_int(void* data, int len)
|
|||
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
m_b_is_connected = false;
|
||||
FileTools::writelog(log_lv::log_ERROR,"USB connection error: ERROR_FILE_NOT_FOUND");
|
||||
if (hotplug_call) {
|
||||
hotplug_call(true, usrdata);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,9 @@
|
|||
#include <vector>
|
||||
#include <io.h>
|
||||
#include <fstream>
|
||||
#include <timeapi.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <log4cplus/log4cplus.h>
|
||||
#include "PublicFunc.h"
|
||||
|
||||
|
@ -117,6 +119,56 @@ public:
|
|||
_tcscat(szIniFile, TWAIN_LOG_NAME);
|
||||
writelog(std::wstring(szIniFile), log_lv::log_ERROR, log);
|
||||
}
|
||||
|
||||
static std::string get_appdata_path()
|
||||
{
|
||||
TCHAR szIniFile[MAX_PATH] = { 0 };
|
||||
SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_LOCAL_APPDATA, TRUE);
|
||||
_tcscat(szIniFile, HUAGAO_SCAN);
|
||||
_tcscat(szIniFile, L"\\temp\\");
|
||||
std::string path= TCHAR2STRING(szIniFile);
|
||||
if (!isFolderExist(path.data()))
|
||||
createDirectory(path.data());
|
||||
return path;
|
||||
}
|
||||
|
||||
static void deletedir(CString szPath)
|
||||
{
|
||||
CFileFind ff;
|
||||
if (szPath.Right(1) != "\\")
|
||||
szPath += "\\";
|
||||
szPath += "*.*";
|
||||
BOOL res = ff.FindFile(szPath);
|
||||
while (res)
|
||||
{
|
||||
res = ff.FindNextFile();
|
||||
auto x = ff.GetFilePath();
|
||||
if (!ff.IsDots() && !ff.IsDirectory())//是文件时直接删除
|
||||
DeleteFile(ff.GetFilePath());
|
||||
else if (ff.IsDots())
|
||||
continue;
|
||||
else if (ff.IsDirectory())
|
||||
{
|
||||
szPath = ff.GetFilePath();
|
||||
deletedir(szPath.GetBuffer());//是目录时继续递归,删除该目录下的文件
|
||||
RemoveDirectory(szPath);//目录为空后删除目录
|
||||
}
|
||||
}
|
||||
RemoveDirectory(szPath);//最终删除该目录
|
||||
}
|
||||
|
||||
static unsigned long get_file_size(const char* path)
|
||||
{
|
||||
unsigned long filesize = -1;
|
||||
struct stat statbuff;
|
||||
if (stat(path, &statbuff) < 0) {
|
||||
return filesize;
|
||||
}
|
||||
else {
|
||||
filesize = statbuff.st_size;
|
||||
}
|
||||
return filesize;
|
||||
}
|
||||
private:
|
||||
static void getFiles(std::string path, std::vector<std::string>& files)
|
||||
{
|
||||
|
|
|
@ -25,7 +25,7 @@ hgConfigClass::hgConfigClass(GScanCap param)
|
|||
m_param.lowpowermode = (byte)param.hardwarecaps.lowpowermode;
|
||||
m_param.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
|
||||
m_param.unused_one = m_param.sizeerror_errorratio = 0;
|
||||
m_param.enabledsp_cache = param.resolution_dst >= 240.0f?1:0;
|
||||
param.resolution_dst >= 240.0f ? 1 : 0;
|
||||
}
|
||||
|
||||
bool hgConfigClass::ContainspaperTypesKey(PaperStatus key)
|
||||
|
|
|
@ -681,17 +681,18 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
|
|||
|
||||
void GscanJsonConfig::SaveGscancapJson(GScanCap cap, std::string path)
|
||||
{
|
||||
cap.SavePath = cap.Caption = "";
|
||||
json js = GscancapToJson(cap);
|
||||
std::ofstream of;
|
||||
try {
|
||||
of.open(path, std::ios::out);
|
||||
of.write(js.dump().c_str(), js.dump().size());
|
||||
of.open(path, std::ios::out|std::ios::binary);
|
||||
of.write(js.dump().data(), js.dump().size());
|
||||
of.close();
|
||||
}
|
||||
catch (...) {
|
||||
catch (std::exception &e) {
|
||||
if (of.is_open())
|
||||
of.close();
|
||||
FileTools::writelog(log_ERROR, "save json error");
|
||||
FileTools::writelog(log_ERROR, "save json error :"+std::string(e.what()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -742,7 +743,7 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap)
|
|||
js[CONFIG][AUTOCROP_THRESHOLD] = cap.AutoCrop_threshold;
|
||||
js[CONFIG][ISCONVEX] = cap.is_convex;
|
||||
js[CONFIG][ITEMCAPTION] = cap.Caption;
|
||||
js[CONFIG][SAVEPATH] = cap.SavePath;
|
||||
js[CONFIG][SAVEPATH] = cap.SavePath.c_str();
|
||||
js[CONFIG][LOWPOWERMODE] = cap.hardwarecaps.lowpowermode;
|
||||
return js;
|
||||
}
|
||||
|
@ -856,7 +857,7 @@ json GscanJsonConfig::GetDefaultJson()
|
|||
json GscanJsonConfig::Readjson(std::string path)
|
||||
{
|
||||
std::ifstream f;
|
||||
f.open(path, std::ios::in);
|
||||
f.open(path, std::ios::in|std::ios::binary);
|
||||
json js;
|
||||
try {
|
||||
if(f.is_open()){
|
||||
|
|
|
@ -8,7 +8,7 @@ CImageApplyAutoCrop::CImageApplyAutoCrop()
|
|||
, m_isConvexHull(true)
|
||||
, m_isFillColor(false)
|
||||
, m_threshold(40)
|
||||
, m_noise(2)
|
||||
, m_noise(8)
|
||||
, m_indent(5)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -73,31 +73,30 @@ void CImageApplyChannel::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
|||
|
||||
void CImageApplyChannel::except_channel(const cv::Mat & src, cv::Mat & dst, int channel)
|
||||
{
|
||||
int rows = static_cast<int>(src.total());
|
||||
cv::Mat src_temp(rows, 3, CV_8UC1, src.data);
|
||||
cv::Mat dst_temp(rows, 1, CV_8UC1, dst.data);
|
||||
|
||||
cv::Mat temp1, temp2;
|
||||
cv::Mat mv[3];
|
||||
cv::split(src, mv);
|
||||
cv::Mat mask, mask1, mask2;
|
||||
switch (channel)
|
||||
{
|
||||
case 0:
|
||||
temp1 = src_temp(cv::Rect(1, 0, 1, rows));
|
||||
temp2 = src_temp(cv::Rect(2, 0, 1, rows));
|
||||
cv::addWeighted(temp1, 0.587, temp2, 0.299, 0, dst_temp);
|
||||
mask1 = mv[0] - mv[1];
|
||||
mask2 = mv[0] - mv[2];
|
||||
break;
|
||||
case 1:
|
||||
temp1 = src_temp(cv::Rect(0, 0, 1, rows));
|
||||
temp2 = src_temp(cv::Rect(2, 0, 1, rows));
|
||||
cv::addWeighted(temp1, 0.114, temp2, 0.299, 0, dst_temp);
|
||||
mask1 = mv[1] - mv[0];
|
||||
mask2 = mv[1] - mv[2];
|
||||
break;
|
||||
case 2:
|
||||
temp1 = src_temp(cv::Rect(0, 0, 1, rows));
|
||||
temp2 = src_temp(cv::Rect(1, 0, 1, rows));
|
||||
cv::addWeighted(temp1, 0.114, temp2, 0.587, 0, dst_temp);
|
||||
mask1 = mv[2] - mv[1];
|
||||
mask2 = mv[2] - mv[0];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
cv::min(mask1, mask2, mask);
|
||||
|
||||
cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);
|
||||
dst -= mask;
|
||||
}
|
||||
|
||||
void CImageApplyChannel::colourless(const cv::Mat &src, cv::Mat &dst, uchar threshold)
|
||||
|
|
|
@ -87,7 +87,7 @@ using namespace std::placeholders;
|
|||
TWPP_ENTRY_MFC(HuagaoDs)
|
||||
|
||||
static constexpr const Identity srcIdent(
|
||||
Version(3, 3, Language::English, Country::China, "v3.3.4.3"),
|
||||
Version(3, 3, Language::English, Country::China, "v3.3.5.0"),
|
||||
DataGroup::Image,
|
||||
#ifdef MAKEHUAGAO
|
||||
"HUAGO",
|
||||
|
@ -337,24 +337,36 @@ HuagaoDs::HuagaoDs()
|
|||
//}));
|
||||
}
|
||||
|
||||
void HuagaoDs::showmsg(std::string caption, std::string text)
|
||||
void HuagaoDs::showmsg(std::string caption, std::string text, int retcode)
|
||||
{
|
||||
if (scanner.get()) {
|
||||
if (scanner->get_lose_image_num() != 0)
|
||||
int losemun = scanner->get_lose_image_num();
|
||||
int num = 0;
|
||||
if ((retcode == 64 || retcode == 8 || retcode == 16) && losemun > 0)
|
||||
losemun--;
|
||||
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
|
||||
{
|
||||
text += "进纸与扫描数量相差" + to_string(scanner->get_lose_image_num()) + "份!";
|
||||
if (m_scanparam->is_duplex && m_scanparam->en_fold && m_scanparam->multi_output_red)
|
||||
num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count();
|
||||
else if (m_scanparam->is_duplex && m_scanparam->en_fold)
|
||||
num = scanner->get_aquire_image_count() - scanner->get_updata_image_count();
|
||||
else if (m_scanparam->is_duplex && m_scanparam->multi_output_red)
|
||||
num = scanner->get_aquire_image_count() * 4 - scanner->get_updata_image_count();
|
||||
else if ((!m_scanparam->is_duplex) && m_scanparam->multi_output_red)
|
||||
num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count();
|
||||
else if (!m_scanparam->is_duplex)
|
||||
num = scanner->get_aquire_image_count() - scanner->get_updata_image_count();
|
||||
else
|
||||
num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count();
|
||||
}
|
||||
if ((losemun != 0) || (num != 0)) {
|
||||
text += "进纸"+to_string(scanner->get_lose_image_num()+scanner->get_aquire_image_count())+
|
||||
",扫描"+to_string(scanner->get_aquire_image_count()) +",上传"+to_string(scanner->get_updata_image_count())+
|
||||
",扫描相差"+to_string(losemun) + "份文件,上传相差"+to_string(num)+"份文件!";
|
||||
scanner->set_lose_image_num(0);
|
||||
}
|
||||
}
|
||||
ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text+" "+caption).c_str()), NULL, SW_HIDE);
|
||||
//if (!msgbox.get())
|
||||
//{
|
||||
// msgbox.reset(new Cmsgbox());
|
||||
// msgbox->Create(IDD_DIAMSGBOX);
|
||||
//}
|
||||
//msgbox->setwindowstext(CString(caption.c_str()), CString(text.c_str()));
|
||||
//::SetWindowPos(msgbox->GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||
//ShowWindow(msgbox->GetSafeHwnd(), SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
HuagaoDs::~HuagaoDs()
|
||||
|
@ -767,7 +779,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
|||
showmsg("警告", msgs[(UsbSupported)202]);
|
||||
return { ReturnCode::Failure, ConditionCode::CapBadOperation };
|
||||
}
|
||||
|
||||
auto usblist= UsbScan_List::find_all_usb();
|
||||
if (!usblist.empty())
|
||||
{
|
||||
|
@ -824,7 +835,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
|||
scanner->regist_deviceevent_callback(DeviceEvent_callback, this);
|
||||
scanner->DogEar_callback(std::bind(&HuagaoDs::dogear_callback, this, std::placeholders::_1));
|
||||
}
|
||||
|
||||
//MessageBox(NULL, L"2", L"", 0);
|
||||
// init caps
|
||||
// there are caps a minimal source must support
|
||||
|
@ -1802,12 +1812,33 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
|||
//双张检测 与官方标准定义有所差异 此协议修改为bool型 爱云校使用bool类型,其余使用标准twain协议
|
||||
m_query[CapType::DoubleFeedDetection] = msgSupportGetAllSetReset;
|
||||
m_caps[CapType::DoubleFeedDetection] = [this](Msg msg, Capability& data)->Result {
|
||||
if (Msg::Set == msg) {
|
||||
auto mech = data.currentItem<Bool>();
|
||||
m_scanparam->hardwarecaps.en_doublefeed = mech ? 1 : 0;
|
||||
switch (msg) {
|
||||
case Msg::Get:
|
||||
data = Capability::createEnumeration<UInt16>(CapType::DoubleFeedDetection, { 0 }, m_scanparam->hardwarecaps.en_doublefeed ? 0 : 1, 0);
|
||||
return { ReturnCode::Success, ConditionCode::Success };
|
||||
case Msg::GetCurrent:
|
||||
data = Capability::createOneValue<UInt16>(CapType::DoubleFeedDetection, (UInt16)m_scanparam->hardwarecaps.en_doublefeed ? 0 : 1);
|
||||
return { ReturnCode::Success, ConditionCode::Success };
|
||||
case Msg::Reset:
|
||||
case Msg::GetDefault:
|
||||
m_scanparam->hardwarecaps.en_doublefeed = 1;
|
||||
data = Capability::createOneValue<UInt16>(CapType::DoubleFeedDetection, 0);
|
||||
return { ReturnCode::Success, ConditionCode::Success };
|
||||
case Msg::Set: {
|
||||
auto mech = data.currentItem<UInt16>();
|
||||
m_scanparam->hardwarecaps.en_doublefeed = mech ? 0 : 1;
|
||||
return success();
|
||||
}
|
||||
return CapSupGetAllResetEx<BYTE, Bool, CapType::DoubleFeedDetection>(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE);
|
||||
|
||||
default:
|
||||
return { ReturnCode::Failure, ConditionCode::CapBadOperation };
|
||||
}
|
||||
/*if (Msg::Set == msg) {
|
||||
auto mech = data.currentItem<UInt16>();
|
||||
m_scanparam->hardwarecaps.en_doublefeed = mech ? 0 : 1;
|
||||
return success();
|
||||
}
|
||||
return CapSupGetAllResetEx<BYTE, UInt16, CapType::DoubleFeedDetection>(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE);*/
|
||||
};
|
||||
|
||||
#ifdef G200
|
||||
|
@ -1868,19 +1899,38 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
|
|||
scanner->Set_ErrorCode(0);
|
||||
if (guiIndicator->GetSafeHwnd())
|
||||
guiIndicator->ShowWindow(SW_HIDE);
|
||||
//if (guiIndicator.get())
|
||||
// guiIndicator.reset();
|
||||
//guiIndicator->ShowWindow(SW_HIDE);
|
||||
if (ret != -1) {
|
||||
//CString str;
|
||||
//str.Format(_T("%d"), ret);
|
||||
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), str, NULL, SW_HIDE);
|
||||
showmsg("警告", msgs[(UsbSupported)ret]);
|
||||
showmsg("警告", msgs[(UsbSupported)ret],ret);
|
||||
FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]);
|
||||
#ifndef G200
|
||||
scanner->clear_hwerror();
|
||||
#endif // G200
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
|
||||
{
|
||||
int num = 0;
|
||||
if (m_scanparam->is_duplex && m_scanparam->en_fold && m_scanparam->multi_output_red)
|
||||
num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count();
|
||||
else if (m_scanparam->is_duplex && m_scanparam->en_fold)
|
||||
num = scanner->get_aquire_image_count() - scanner->get_updata_image_count();
|
||||
else if (m_scanparam->is_duplex && m_scanparam->multi_output_red)
|
||||
num = scanner->get_aquire_image_count() * 4 - scanner->get_updata_image_count();
|
||||
else if ((!m_scanparam->is_duplex) && m_scanparam->multi_output_red)
|
||||
num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count();
|
||||
else if (!m_scanparam->is_duplex)
|
||||
num = scanner->get_aquire_image_count() - scanner->get_updata_image_count();
|
||||
else
|
||||
num = scanner->get_aquire_image_count() * 2 - scanner->get_updata_image_count();
|
||||
if (num != 0)
|
||||
{
|
||||
showmsg("警告", msgs[LOSE_IMAGE]);
|
||||
FileTools::writelog(log_ERROR, msgs[LOSE_IMAGE]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
m_pendingXfers = 0;
|
||||
if (guiTwain.get()) {
|
||||
((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true);
|
||||
|
@ -1888,7 +1938,6 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
|
|||
}
|
||||
else {
|
||||
m_pendingXfers = 1;
|
||||
scanner->set_aquire_image_count(scanner->get_aquire_image_count(), scanner->get_updata_image_count()+1);
|
||||
}
|
||||
data.setCount(m_pendingXfers);
|
||||
return success();
|
||||
|
@ -1938,13 +1987,13 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
|
|||
if (!ui.showUi()) {
|
||||
// this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state
|
||||
// with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step
|
||||
#ifndef G200
|
||||
//#ifndef G200
|
||||
while (!scanner->Get_Scanner_PaperOn())
|
||||
{
|
||||
if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO)
|
||||
return seqError();
|
||||
}
|
||||
#endif // !G200
|
||||
//#endif // !G200
|
||||
|
||||
|
||||
auto ret = startScan();
|
||||
|
@ -2306,6 +2355,7 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly)
|
|||
if (newRect.top <= 0 || newRect.left <= 0)
|
||||
newRect.top = newRect.left = 20;
|
||||
SetWindowPos(guiTwain->m_hWnd, HWND_TOPMOST, newRect.left + 20, newRect.top + 100, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
//SetWindowPos(guiTwain->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
|
||||
guiTwain->ShowWindow(SW_SHOWNORMAL);
|
||||
return success();
|
||||
}
|
||||
|
@ -2421,7 +2471,9 @@ Twpp::Result HuagaoDs::startScan()
|
|||
//FileTools::write_log("D:\\1.txt",info);
|
||||
FileTools::writelog(log_INFO,"start scan");
|
||||
#ifndef G200
|
||||
scanner->notifyscan();
|
||||
scanner->clear_hwerror();
|
||||
|
||||
#endif //
|
||||
|
||||
scanner->config_params(*m_scanparam);
|
||||
|
|
|
@ -94,7 +94,7 @@ private://method
|
|||
void dogear_callback(int indexpaper);
|
||||
void updataGscanCap();
|
||||
Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data);
|
||||
void showmsg(std::string caption, std::string text);
|
||||
void showmsg(std::string caption, std::string text, int retcode=0);
|
||||
|
||||
private://field
|
||||
std::unordered_map<Twpp::CapType, std::function<Twpp::Result(Twpp::Msg msg, Twpp::Capability& data)>> m_caps;
|
||||
|
|
Binary file not shown.
BIN
huagao/stdafx.h
BIN
huagao/stdafx.h
Binary file not shown.
Loading…
Reference in New Issue