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_Brightness.SetValue(128);
|
||||||
|
|
||||||
m_Edit_Contrast.SetSlideLink(this, IDC_SLIDER_CONTRAST);
|
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);
|
m_Edit_Contrast.SetValue(4);
|
||||||
|
|
||||||
// setup third slider-edit box - floating point
|
// setup third slider-edit box - floating point
|
||||||
|
|
|
@ -38,6 +38,7 @@ BOOL CIndicatorDlg::OnInitDialog()
|
||||||
|
|
||||||
BEGIN_MESSAGE_MAP(CIndicatorDlg, CDialogEx)
|
BEGIN_MESSAGE_MAP(CIndicatorDlg, CDialogEx)
|
||||||
ON_BN_CLICKED(IDC_BTNSTOPSCAN, &CIndicatorDlg::OnBnClickedBtnstopscan)
|
ON_BN_CLICKED(IDC_BTNSTOPSCAN, &CIndicatorDlg::OnBnClickedBtnstopscan)
|
||||||
|
ON_WM_CLOSE()
|
||||||
END_MESSAGE_MAP()
|
END_MESSAGE_MAP()
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ END_MESSAGE_MAP()
|
||||||
void CIndicatorDlg::setindicatortext(int aquire, int updata)
|
void CIndicatorDlg::setindicatortext(int aquire, int updata)
|
||||||
{
|
{
|
||||||
wchar_t text[260] = { 0 };
|
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);
|
GetDlgItem(IDC_STATIC)->SetWindowTextW(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,3 +58,13 @@ void CIndicatorDlg::OnBnClickedBtnstopscan()
|
||||||
if (m_stop)
|
if (m_stop)
|
||||||
m_stop();
|
m_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CIndicatorDlg::OnClose()
|
||||||
|
{
|
||||||
|
// TODO: 在此添加消息处理程序代码和/或调用默认值
|
||||||
|
|
||||||
|
if (m_stop)
|
||||||
|
m_stop();
|
||||||
|
CDialogEx::OnClose();
|
||||||
|
}
|
||||||
|
|
|
@ -16,13 +16,13 @@ public:
|
||||||
#ifdef AFX_DESIGN_TIME
|
#ifdef AFX_DESIGN_TIME
|
||||||
enum { IDD = IDD_INDICATOR };
|
enum { IDD = IDD_INDICATOR };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
|
||||||
virtual BOOL OnInitDialog();
|
virtual BOOL OnInitDialog();
|
||||||
DECLARE_MESSAGE_MAP()
|
DECLARE_MESSAGE_MAP()
|
||||||
|
|
||||||
afx_msg void OnBnClickedBtnstopscan();
|
afx_msg void OnBnClickedBtnstopscan();
|
||||||
|
|
||||||
std::function<void()> m_stop;
|
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());
|
m_tabCtrl->AddSSLPage(_T("送纸"), nPageID++, m_pageFeedPaper.get());
|
||||||
CString title(m_confirmtitle.c_str());
|
CString title(m_confirmtitle.c_str());
|
||||||
this->GetDlgItem(IDC_CONFIRM)->SetWindowText(title);
|
this->GetDlgItem(IDC_CONFIRM)->SetWindowText(title);
|
||||||
|
|
||||||
UpdateUI();
|
UpdateUI();
|
||||||
UpdateListConfig();
|
UpdateListConfig();
|
||||||
dataChangeFunction();
|
dataChangeFunction();
|
||||||
|
setvisable_size(false);
|
||||||
|
#ifdef G200
|
||||||
|
setvisable_sleepmode(false);
|
||||||
|
#endif // G200
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,6 +592,21 @@ void CTwainUI::UpdateUi()
|
||||||
m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(m_pageBasic->m_cmBoxColorMode->GetCurSel() == 0);
|
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)
|
void CTwainUI::EnableID_OKorID_Cancel(bool enable)
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_CONFIRM)->EnableWindow(enable);
|
GetDlgItem(IDC_CONFIRM)->EnableWindow(enable);
|
||||||
|
|
|
@ -173,7 +173,8 @@ public:
|
||||||
void UpdateListConfig();
|
void UpdateListConfig();
|
||||||
void GetGScanCap(GScanCap& cap);
|
void GetGScanCap(GScanCap& cap);
|
||||||
void UpdateUi();
|
void UpdateUi();
|
||||||
|
void setvisable_size(bool flag);
|
||||||
|
void setvisable_sleepmode(bool flag);
|
||||||
void EnableID_OKorID_Cancel(bool enable);
|
void EnableID_OKorID_Cancel(bool enable);
|
||||||
// 对话框数据
|
// 对话框数据
|
||||||
#ifdef AFX_DESIGN_TIME
|
#ifdef AFX_DESIGN_TIME
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
G400ScanConfig::G400ScanConfig(GScanCap& gcap)
|
G400ScanConfig::G400ScanConfig(GScanCap& gcap)
|
||||||
{
|
{
|
||||||
|
cfg = { 0 };
|
||||||
cfg.params.doubleFeeded = gcap.hardwarecaps.en_doublefeed == 0 ? 0 : 1;
|
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.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;
|
cfg.params.enableLed = 1;
|
||||||
|
|
|
@ -76,6 +76,8 @@ typedef enum tagUsbSupported {
|
||||||
AQUIRE_IMAGE_TIMEOUT=76,
|
AQUIRE_IMAGE_TIMEOUT=76,
|
||||||
//获取图片与扫描张数不匹配
|
//获取图片与扫描张数不匹配
|
||||||
LOSE_IMAGE=77,
|
LOSE_IMAGE=77,
|
||||||
|
//usb读取数据错误
|
||||||
|
USB_BULK_ERROR=78,
|
||||||
//USB 未连接
|
//USB 未连接
|
||||||
USB_DISCONNECTED = 200,
|
USB_DISCONNECTED = 200,
|
||||||
//用户点击停止
|
//用户点击停止
|
||||||
|
@ -92,7 +94,7 @@ static map<UsbSupported, string> msgs = {
|
||||||
{UsbSupported::NO_FEED,"无纸!请放置纸张!"},
|
{UsbSupported::NO_FEED,"无纸!请放置纸张!"},
|
||||||
{UsbSupported::FEED_IN_ERROR,"搓纸失败!请整理纸张!"},
|
{UsbSupported::FEED_IN_ERROR,"搓纸失败!请整理纸张!"},
|
||||||
{UsbSupported::PAPER_JAM,"卡纸!"},
|
{UsbSupported::PAPER_JAM,"卡纸!"},
|
||||||
{UsbSupported::DETECT_DOUBLE_FEED,"双张"},
|
{UsbSupported::DETECT_DOUBLE_FEED,"双张,请核对扫描试卷张数!"},
|
||||||
{UsbSupported::DETECT_STAPLE,"检测到订书针!"},
|
{UsbSupported::DETECT_STAPLE,"检测到订书针!"},
|
||||||
{UsbSupported::PAPER_SKEW,"纸张歪斜!请整理纸张!"},
|
{UsbSupported::PAPER_SKEW,"纸张歪斜!请整理纸张!"},
|
||||||
{UsbSupported::COUNT_MODE,"计数模式,请退出计数模式!"},
|
{UsbSupported::COUNT_MODE,"计数模式,请退出计数模式!"},
|
||||||
|
@ -103,7 +105,8 @@ static map<UsbSupported, string> msgs = {
|
||||||
{UsbSupported::DOG_EAR,"检测到折角!"},
|
{UsbSupported::DOG_EAR,"检测到折角!"},
|
||||||
{UsbSupported::SIZE_ERROR,"幅面检测异常!"},
|
{UsbSupported::SIZE_ERROR,"幅面检测异常!"},
|
||||||
{UsbSupported::AQUIRE_IMAGE_TIMEOUT,"取图超时!"},
|
{UsbSupported::AQUIRE_IMAGE_TIMEOUT,"取图超时!"},
|
||||||
{UsbSupported::LOSE_IMAGE,"上传图片与扫描张数不匹配!"}
|
{UsbSupported::LOSE_IMAGE,"上传图片与扫描张数不匹配!"},
|
||||||
|
{UsbSupported::USB_BULK_ERROR,"USB数据读取错误!"}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum tagEventIndex
|
enum tagEventIndex
|
||||||
|
@ -120,7 +123,9 @@ typedef void(*deviceevent_callback)(int eventID, void* userdata);
|
||||||
class IScanner
|
class IScanner
|
||||||
{
|
{
|
||||||
public:
|
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; }
|
virtual ~IScanner() { bFilterMsg = true; }
|
||||||
void ResetMsgFiter() { bFilterMsg = true; }
|
void ResetMsgFiter() { bFilterMsg = true; }
|
||||||
int get_aquire_image_count() { return aquire_image_count; };
|
int get_aquire_image_count() { return aquire_image_count; };
|
||||||
|
@ -136,12 +141,15 @@ public:
|
||||||
virtual BOOL IsConnected() = 0;
|
virtual BOOL IsConnected() = 0;
|
||||||
virtual std::string GetFWVersion() = 0;
|
virtual std::string GetFWVersion() = 0;
|
||||||
virtual std::string GetSerialNum() = 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 is_scan() = 0;
|
||||||
virtual BOOL Get_Scanner_PaperOn() = 0;
|
virtual BOOL Get_Scanner_PaperOn() = 0;
|
||||||
virtual int Get_Roller_num() = 0;
|
virtual int Get_Roller_num() = 0;
|
||||||
virtual void config_params(GScanCap& params) = 0;
|
virtual void config_params(GScanCap& params) = 0;
|
||||||
virtual void Scanner_StartScan(UINT16 count) = 0;
|
virtual void Scanner_StartScan(UINT16 count) = 0;
|
||||||
virtual void Stop_scan() = 0;
|
virtual void Stop_scan() = 0;
|
||||||
|
virtual int notifyscan() = 0;
|
||||||
virtual void ResetScanner() = 0;
|
virtual void ResetScanner() = 0;
|
||||||
virtual bool Get_IsImageQueueEmpty() = 0;
|
virtual bool Get_IsImageQueueEmpty() = 0;
|
||||||
virtual void reset() = 0;
|
virtual void reset() = 0;
|
||||||
|
@ -169,6 +177,8 @@ protected:
|
||||||
std::string fwVersion;
|
std::string fwVersion;
|
||||||
std::string SerialNum;
|
std::string SerialNum;
|
||||||
std::string scannercode;
|
std::string scannercode;
|
||||||
|
std::uint32_t MotorFpga;
|
||||||
|
std::uint32_t ScanFpga;
|
||||||
std::function<void(int, int)> setindicatortext;
|
std::function<void(int, int)> setindicatortext;
|
||||||
int aquire_image_count;
|
int aquire_image_count;
|
||||||
int updata_image_count;
|
int updata_image_count;
|
||||||
|
@ -176,4 +186,6 @@ protected:
|
||||||
int pixType;
|
int pixType;
|
||||||
int lose_image_num;
|
int lose_image_num;
|
||||||
bool bFilterMsg;
|
bool bFilterMsg;
|
||||||
|
bool is_AndroidOrLinux;
|
||||||
|
|
||||||
};
|
};
|
|
@ -145,7 +145,8 @@ typedef enum tagUsbKeyWords : UINT32
|
||||||
GScanO200::GScanO200() :
|
GScanO200::GScanO200() :
|
||||||
huagods(NULL),
|
huagods(NULL),
|
||||||
image_num(0),
|
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.reset(new ImageMatQueue());
|
||||||
m_pImages->Getimagenumber = std::bind(&GScanO200::Getimagenumber,this, std::placeholders::_1);
|
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()) {
|
if (m_pImages->empty()) {
|
||||||
DoEvents();
|
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 (sw.elapsed_s() > 30.00)
|
||||||
{
|
{
|
||||||
if (m_threadUsb && m_threadUsb->joinable()) {
|
if (m_threadUsb && m_threadUsb->joinable()) {
|
||||||
|
@ -228,6 +229,9 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
||||||
}
|
}
|
||||||
Stop_scan();//停止扫描
|
Stop_scan();//停止扫描
|
||||||
ResetScanner();
|
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;
|
return HARDWARE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +249,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
||||||
//writelog("aquireed image " + to_string(++aqimgindex));
|
//writelog("aquireed image " + to_string(++aqimgindex));
|
||||||
//FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "aquired procced 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
|
#ifdef LOG_NORMAL
|
||||||
static int aquireindex = 0;
|
static int aquireindex = 0;
|
||||||
FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex));
|
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);
|
std::string ver = fwVersion.substr((fwVersion.length() - 2), 2);
|
||||||
int verValue = atoi(ver.c_str());
|
int verValue = atoi(ver.c_str());
|
||||||
m_bread_fixed_ratio_fromDSP = verValue >= 15;
|
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();
|
updateHVRatio();
|
||||||
}
|
}
|
||||||
return fwVersion;
|
return fwVersion;
|
||||||
|
@ -301,6 +305,34 @@ std::string GScanO200::GetSerialNum()
|
||||||
return "";
|
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()
|
bool GScanO200::is_scan()
|
||||||
{
|
{
|
||||||
//std::lock_guard<std::mutex> lck(m_imgLocker);
|
//std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
|
@ -327,12 +359,17 @@ BOOL GScanO200::Get_Scanner_PaperOn()
|
||||||
int GScanO200::Get_Roller_num()
|
int GScanO200::Get_Roller_num()
|
||||||
{
|
{
|
||||||
if (!(m_usb.get() && m_usb->is_open()))
|
if (!(m_usb.get() && m_usb->is_open()))
|
||||||
return false;
|
return 0;
|
||||||
USBCB usbcb = { GET_ROLLER_NUM ,0,4 };
|
USBCB usbcb = { GET_ROLLER_NUM ,0,4 };
|
||||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||||
m_usb->read_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;
|
return usbcb.u32_Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,20 +380,7 @@ void GScanO200::config_params(GScanCap& params)
|
||||||
gcap = params;
|
gcap = params;
|
||||||
UINT32 cfgdata = cfg.GetData();
|
UINT32 cfgdata = cfg.GetData();
|
||||||
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
|
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
|
||||||
//FileTools::write_log("¿ªÊ¼Ï·¢Ó²¼þ²ÎÊý ===>\n\tUSB config_params:" + to_string(cfgdata) + "\n\tpaper:" + to_string(cfgdata & 0x1f)
|
FileTools::writelog(log_INFO, "config hardware param"+to_string(cfgdata));
|
||||||
// + "\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");
|
|
||||||
m_usb->write_bulk(&usbcb, sizeof(USBCB));
|
m_usb->write_bulk(&usbcb, sizeof(USBCB));
|
||||||
this_thread::sleep_for(std::chrono::milliseconds(200));
|
this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||||
m_pImages->setparam(params);
|
m_pImages->setparam(params);
|
||||||
|
@ -365,12 +389,20 @@ void GScanO200::config_params(GScanCap& params)
|
||||||
|
|
||||||
void GScanO200::Scanner_StartScan(UINT16 count)
|
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);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
if (m_threadUsb && m_threadUsb->joinable()) {
|
if (m_threadUsb && m_threadUsb->joinable()) {
|
||||||
devState = DEV_STOP;
|
devState = DEV_STOP;
|
||||||
m_threadUsb->join();
|
m_threadUsb->join();
|
||||||
}
|
}
|
||||||
|
|
||||||
USBCB status = { GET_DSP_STATUS ,0,0 };
|
USBCB status = { GET_DSP_STATUS ,0,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->write_bulk(&status, sizeof(status));
|
m_usb->write_bulk(&status, sizeof(status));
|
||||||
|
@ -420,7 +452,7 @@ void GScanO200::Scanner_StartScan(UINT16 count)
|
||||||
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
|
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
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())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
{
|
{
|
||||||
m_pImages->setscanflags(true);
|
m_pImages->setscanflags(true);
|
||||||
|
@ -429,6 +461,11 @@ void GScanO200::Scanner_StartScan(UINT16 count)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GScanO200::notifyscan()
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void GScanO200::Stop_scan()
|
void GScanO200::Stop_scan()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
|
@ -442,11 +479,17 @@ void GScanO200::ResetScanner()
|
||||||
{
|
{
|
||||||
if (!(m_usb.get() && m_usb->is_connected()))
|
if (!(m_usb.get() && m_usb->is_connected()))
|
||||||
return;
|
return;
|
||||||
roller_num = Get_Roller_num();
|
|
||||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
|
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
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()
|
bool GScanO200::Get_IsImageQueueEmpty()
|
||||||
|
@ -581,7 +624,6 @@ void GScanO200::usbmain()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (sw.elapsed_ms() > 30000)
|
if (sw.elapsed_ms() > 30000)
|
||||||
{
|
{
|
||||||
m_pImages->setscanflags(false);
|
m_pImages->setscanflags(false);
|
||||||
|
@ -591,21 +633,21 @@ void GScanO200::usbmain()
|
||||||
FileTools::writelog(log_ERROR, "USBmain aquire image timeout");
|
FileTools::writelog(log_ERROR, "USBmain aquire image timeout");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(gcap.resolution_dst>200.0f)
|
//if(gcap.resolution_dst>200.0f)
|
||||||
{
|
//{
|
||||||
if (m_pImages->orginimgcount() > 2)
|
// if (m_pImages->orginimgcount() > 2)
|
||||||
{
|
// {
|
||||||
this_thread::sleep_for(chrono::milliseconds(10));
|
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
else {
|
//else {
|
||||||
if (m_pImages->orginimgcount() > 10)
|
// if ((m_pImages->orginimgcount() > 15)&&(is_orginimgcount))
|
||||||
{
|
// {
|
||||||
this_thread::sleep_for(chrono::milliseconds(10));
|
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
USBCB usbcb = Get_Scanner_Status();
|
USBCB usbcb = Get_Scanner_Status();
|
||||||
switch (usbcb.u32_Data) {
|
switch (usbcb.u32_Data) {
|
||||||
|
@ -619,9 +661,21 @@ void GScanO200::usbmain()
|
||||||
FileTools::writelog(log_ERROR,"imgData->size() error send stop scan");
|
FileTools::writelog(log_ERROR,"imgData->size() error send stop scan");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(!m_pImages->get_isDogEar())
|
|
||||||
m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData)));
|
|
||||||
m_usb->set_timeout(200);
|
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();
|
Pop_Image();
|
||||||
set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count());
|
set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count());
|
||||||
FileTools::writelog(log_INFO, "从扫描仪接收"+to_string(get_aquire_image_count())+"份文件。");
|
FileTools::writelog(log_INFO, "从扫描仪接收"+to_string(get_aquire_image_count())+"份文件。");
|
||||||
|
@ -654,10 +708,15 @@ void GScanO200::usbmain()
|
||||||
case PAPER_SKEW:
|
case PAPER_SKEW:
|
||||||
case HARDWARE_ERROR:
|
case HARDWARE_ERROR:
|
||||||
case PC_SCAN_BUSY_or_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);
|
Set_ErrorCode(usbcb.u32_Data);
|
||||||
m_pImages->setscanflags(false);
|
m_pImages->setscanflags(false);
|
||||||
devState = DEV_WRONG;
|
devState = DEV_WRONG;
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(1500));
|
||||||
auto rollernew = Get_Roller_num();
|
auto rollernew = Get_Roller_num();
|
||||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
if (get_aquire_image_count() != (rollernew - roller_num))
|
||||||
set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count()));
|
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())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
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;
|
return usbcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,14 @@ public:
|
||||||
virtual BOOL IsConnected() override;
|
virtual BOOL IsConnected() override;
|
||||||
virtual std::string GetFWVersion() override;
|
virtual std::string GetFWVersion() override;
|
||||||
virtual std::string GetSerialNum() 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 is_scan() override;
|
||||||
virtual BOOL Get_Scanner_PaperOn() override;
|
virtual BOOL Get_Scanner_PaperOn() override;
|
||||||
virtual int Get_Roller_num() override;
|
virtual int Get_Roller_num() override;
|
||||||
virtual void config_params(GScanCap& params) override;
|
virtual void config_params(GScanCap& params) override;
|
||||||
virtual void Scanner_StartScan(UINT16 count) override;
|
virtual void Scanner_StartScan(UINT16 count) override;
|
||||||
|
virtual int notifyscan() override;
|
||||||
virtual void Stop_scan() override;
|
virtual void Stop_scan() override;
|
||||||
virtual void ResetScanner() override;
|
virtual void ResetScanner() override;
|
||||||
virtual bool Get_IsImageQueueEmpty() override;
|
virtual bool Get_IsImageQueueEmpty() override;
|
||||||
|
@ -45,6 +48,7 @@ private:
|
||||||
void Pop_Image();
|
void Pop_Image();
|
||||||
private:
|
private:
|
||||||
bool m_bread_fixed_ratio_fromDSP;
|
bool m_bread_fixed_ratio_fromDSP;
|
||||||
|
bool is_orginimgcount;
|
||||||
std::shared_ptr<IUsb> m_usb;
|
std::shared_ptr<IUsb> m_usb;
|
||||||
std::unique_ptr<thread> m_threadUsb;
|
std::unique_ptr<thread> m_threadUsb;
|
||||||
GScanCap gcap;
|
GScanCap gcap;
|
||||||
|
|
|
@ -195,11 +195,13 @@ void GScanO400::open(int vid, int pid)
|
||||||
bool ret = m_usb->open();
|
bool ret = m_usb->open();
|
||||||
USBCB status = { GET_DSP_STATUS ,0,0 };
|
USBCB status = { GET_DSP_STATUS ,0,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->write_bulk(&status, sizeof(status));
|
{
|
||||||
|
//m_usb->write_bulk(&status, sizeof(status));
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
//m_usb->read_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;
|
devState = DEV_STOP;
|
||||||
m_threadUsb->join();
|
m_threadUsb->join();
|
||||||
m_threadUsb.reset();
|
m_threadUsb.reset();
|
||||||
//writelog("aquire_bmpdata m_threadUsb.reset();");
|
FileTools::writelog(log_ERROR,"aquire_bmpdata m_threadUsb.reset()");
|
||||||
}
|
}
|
||||||
Stop_scan();//ֹͣɨÃè
|
Stop_scan();//ֹͣɨÃè
|
||||||
ResetScanner();
|
ResetScanner();
|
||||||
|
@ -243,15 +245,7 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
||||||
else {
|
else {
|
||||||
if (m_pImages->valid()) {
|
if (m_pImages->valid()) {
|
||||||
bmpdata = *(m_pImages->popBmpdata());
|
bmpdata = *(m_pImages->popBmpdata());
|
||||||
//static int aqimgindex = 0;
|
set_aquire_image_count(get_aquire_image_count(), get_updata_image_count() + 1);
|
||||||
//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
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
DoEvents();
|
DoEvents();
|
||||||
|
@ -276,6 +270,10 @@ std::string GScanO400::GetFWVersion()
|
||||||
if(m_usb.get()&&m_usb->is_connected())
|
if(m_usb.get()&&m_usb->is_connected())
|
||||||
m_usb->read_bulk(&fwVersion[0], fwVersion.size());
|
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 fwVersion;
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
|
@ -299,6 +297,35 @@ std::string GScanO400::GetSerialNum()
|
||||||
return "";
|
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()
|
bool GScanO400::is_scan()
|
||||||
{
|
{
|
||||||
//std::lock_guard<std::mutex> lck(m_imgLocker);
|
//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);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||||
m_usb->read_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;
|
return usbcb.u32_Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,17 +382,7 @@ void GScanO400::config_params(GScanCap& params)
|
||||||
gcap = params;
|
gcap = params;
|
||||||
UINT32 cfgdata = cfg.GetData();
|
UINT32 cfgdata = cfg.GetData();
|
||||||
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
|
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
|
||||||
//FileTools::write_log("开始下发硬件参数 ===> \n\tUSB config_params:"+to_string(cfgdata)+"\n\tpaper:"+to_string(cfgdata&0x1f)
|
FileTools::writelog(log_INFO, "config hardware param"+to_string(cfgdata));
|
||||||
// + "\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");
|
|
||||||
m_usb->write_bulk(&usbcb, sizeof(USBCB));
|
m_usb->write_bulk(&usbcb, sizeof(USBCB));
|
||||||
this_thread::sleep_for(std::chrono::milliseconds(200));
|
this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||||
m_pImages->setparam(params);
|
m_pImages->setparam(params);
|
||||||
|
@ -369,7 +391,8 @@ void GScanO400::config_params(GScanCap& params)
|
||||||
|
|
||||||
void GScanO400::Scanner_StartScan(UINT16 count)
|
void GScanO400::Scanner_StartScan(UINT16 count)
|
||||||
{
|
{
|
||||||
|
scanfalg = false;
|
||||||
|
roller_num = Get_Roller_num();
|
||||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
if (m_threadUsb && m_threadUsb->joinable()) {
|
if (m_threadUsb && m_threadUsb->joinable()) {
|
||||||
devState = DEV_STOP;
|
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()
|
void GScanO400::Stop_scan()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
USBCB usbcb = { STOP ,0,0 };
|
USBCB usbcb = { STOP ,0,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
|
{
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
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()))
|
if (!(m_usb.get() && m_usb->is_connected()))
|
||||||
return;
|
return;
|
||||||
roller_num = Get_Roller_num();
|
|
||||||
std::lock_guard<std::mutex> lck(m_imgLocker);
|
std::lock_guard<std::mutex> lck(m_imgLocker);
|
||||||
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
|
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
|
@ -462,7 +514,13 @@ void GScanO400::reset()
|
||||||
{
|
{
|
||||||
while (!m_pImages->empty())
|
while (!m_pImages->empty())
|
||||||
m_pImages->clear();
|
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)
|
void GScanO400::setdecodepixtype(int twpixtype)
|
||||||
|
@ -589,46 +647,68 @@ void GScanO400::usbmain()
|
||||||
FileTools::writelog(log_ERROR, "USBmain aquire image timeout");
|
FileTools::writelog(log_ERROR, "USBmain aquire image timeout");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(gcap.resolution_dst>200.0f)
|
//if(gcap.resolution_dst>200.0f)
|
||||||
{
|
//{
|
||||||
if (m_pImages->orginimgcount() > 2)
|
// if (m_pImages->orginimgcount() > 2)
|
||||||
{
|
// {
|
||||||
this_thread::sleep_for(chrono::milliseconds(10));
|
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
else {
|
//else {
|
||||||
if (m_pImages->orginimgcount() > 10) {
|
// if (m_pImages->orginimgcount() > 10) {
|
||||||
this_thread::sleep_for(chrono::milliseconds(10));
|
// this_thread::sleep_for(chrono::milliseconds(10));
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
USBCB usbcb = Get_Scanner_Status();
|
USBCB usbcb = Get_Scanner_Status();
|
||||||
switch (usbcb.u32_Data) {
|
switch (usbcb.u32_Data) {
|
||||||
case HAVE_IMAGE:
|
case HAVE_IMAGE:
|
||||||
{
|
{
|
||||||
int totalNum = usbcb.u32_Count;
|
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);
|
m_usb->set_timeout(2000);
|
||||||
imgData = Get_Img_Data(totalNum);
|
imgData = Get_Img_Data(totalNum);
|
||||||
|
m_usb->set_timeout(200);
|
||||||
if (!imgData->size()) {
|
if (!imgData->size()) {
|
||||||
Stop_scan();
|
Stop_scan();
|
||||||
FileTools::writelog(log_ERROR,"imgData->size() error");
|
FileTools::writelog(log_ERROR,"imgData->size() error");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(!m_pImages->get_isDogEar())
|
FileTools::writelog(log_INFO, " get image data size " + to_string(totalNum));
|
||||||
m_pImages->pushMat(std::shared_ptr<IDecode>(new G400Decode(imgData)));
|
if (imgData->size() != totalNum)
|
||||||
m_usb->set_timeout(200);
|
{
|
||||||
|
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());
|
set_aquire_image_count(get_aquire_image_count() + 1,get_updata_image_count());
|
||||||
FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_aquire_image_count()) + "份文件。");
|
if(!is_AndroidOrLinux)
|
||||||
Pop_Image();
|
Pop_Image();
|
||||||
|
FileTools::writelog(log_INFO, "从扫描仪接收" + to_string(get_aquire_image_count()) + "份文件。耗时 "+to_string(sw.elapsed_ms()));
|
||||||
sw.reset();
|
sw.reset();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case STOP_SCAN:
|
case STOP_SCAN:
|
||||||
{
|
{
|
||||||
m_pImages->setscanflags(false);
|
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();
|
auto rollernew = Get_Roller_num();
|
||||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
if (get_aquire_image_count() != (rollernew - roller_num))
|
||||||
{
|
{
|
||||||
|
@ -653,17 +733,28 @@ void GScanO400::usbmain()
|
||||||
case HARDWARE_ERROR:
|
case HARDWARE_ERROR:
|
||||||
case PC_SCAN_BUSY_or_ERROR:
|
case PC_SCAN_BUSY_or_ERROR:
|
||||||
case SIZE_ERROR:
|
case SIZE_ERROR:
|
||||||
|
case USB_BULK_ERROR:
|
||||||
if (!haveError)
|
if (!haveError)
|
||||||
{
|
{
|
||||||
haveError = true;
|
//if (is_AndroidOrLinux)
|
||||||
devState = DEV_WRONG;
|
//{
|
||||||
m_pImages->setscanflags(false);
|
haveError = true;
|
||||||
Set_ErrorCode(usbcb.u32_Data);
|
Set_ErrorCode(usbcb.u32_Data);
|
||||||
auto rollernew = Get_Roller_num();
|
//}
|
||||||
if (get_aquire_image_count() != (rollernew - roller_num))
|
//else
|
||||||
set_lose_image_num(std::abs((rollernew - roller_num) - get_aquire_image_count()));
|
//{
|
||||||
|
// 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)
|
if (huagods)
|
||||||
dev_callback(usbcb.u32_Data, huagods);
|
dev_callback(usbcb.u32_Data, huagods);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NORMAL:
|
case NORMAL:
|
||||||
|
@ -690,13 +781,23 @@ USBCB GScanO400::Get_Scanner_Status()
|
||||||
if (!(m_usb.get() && m_usb->is_connected())) {
|
if (!(m_usb.get() && m_usb->is_connected())) {
|
||||||
return { NO_COMMAND ,PC_SCAN_BUSY_or_ERROR ,0 };
|
return { NO_COMMAND ,PC_SCAN_BUSY_or_ERROR ,0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
USBCB usbcb = { GET_DSP_STATUS ,0,0 };
|
USBCB usbcb = { GET_DSP_STATUS ,0,0 };
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
||||||
if (m_usb.get() && m_usb->is_connected())
|
if (m_usb.get() && m_usb->is_connected())
|
||||||
m_usb->read_bulk(&usbcb, sizeof(usbcb));
|
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;
|
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>());
|
return std::shared_ptr<std::vector<char>>(new std::vector<char>());
|
||||||
|
|
||||||
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
|
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
|
||||||
StopWatch sw;
|
/*StopWatch sw;
|
||||||
int readed = 0;
|
int readed = 0;
|
||||||
USBCB usbcb = { GET_IMAGE,0,bufferSize };
|
USBCB usbcb = { GET_IMAGE,0,bufferSize };
|
||||||
m_usb->write_bulk(&usbcb, sizeof(usbcb));
|
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);
|
int tt = m_usb->read_bulk(imData->data() + startindex, dstlength);
|
||||||
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)
|
if (sw.elapsed_ms() > 5000)
|
||||||
{
|
{
|
||||||
FileTools::writelog(log_ERROR,"Usb read data timeout\n");
|
FileTools::writelog(log_ERROR,"Usb read data timeout\n");
|
||||||
|
|
|
@ -15,11 +15,14 @@ public:
|
||||||
virtual BOOL IsConnected() override;
|
virtual BOOL IsConnected() override;
|
||||||
virtual std::string GetFWVersion() override;
|
virtual std::string GetFWVersion() override;
|
||||||
virtual std::string GetSerialNum() 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 is_scan() override;
|
||||||
virtual BOOL Get_Scanner_PaperOn() override;
|
virtual BOOL Get_Scanner_PaperOn() override;
|
||||||
virtual int Get_Roller_num() override;
|
virtual int Get_Roller_num() override;
|
||||||
virtual void config_params(GScanCap& params) override;
|
virtual void config_params(GScanCap& params) override;
|
||||||
virtual void Scanner_StartScan(UINT16 count) override;
|
virtual void Scanner_StartScan(UINT16 count) override;
|
||||||
|
virtual int notifyscan() override;
|
||||||
virtual void Stop_scan() override;
|
virtual void Stop_scan() override;
|
||||||
virtual void ResetScanner() override;
|
virtual void ResetScanner() override;
|
||||||
virtual bool Get_IsImageQueueEmpty() override;
|
virtual bool Get_IsImageQueueEmpty() override;
|
||||||
|
@ -49,6 +52,7 @@ private:
|
||||||
std::unique_ptr<thread> m_threadUsb;
|
std::unique_ptr<thread> m_threadUsb;
|
||||||
GScanCap gcap;
|
GScanCap gcap;
|
||||||
volatile int image_num;
|
volatile int image_num;
|
||||||
|
volatile bool scanfalg;
|
||||||
void* huagods;
|
void* huagods;
|
||||||
deviceevent_callback dev_callback;
|
deviceevent_callback dev_callback;
|
||||||
};
|
};
|
||||||
|
|
|
@ -74,6 +74,7 @@ static std::map<PaperStatus, unsigned int> SupPaperTyps = {
|
||||||
{{TwSS::None,PaperAlign::Rot0},G400_A3},
|
{{TwSS::None,PaperAlign::Rot0},G400_A3},
|
||||||
#endif
|
#endif
|
||||||
{{TwSS::MaxSize,PaperAlign::Rot0},G400_LONGLETTER},
|
{{TwSS::MaxSize,PaperAlign::Rot0},G400_LONGLETTER},
|
||||||
|
{{TwSS::USStatement,PaperAlign::Rot0},G400_LONGLETTER},
|
||||||
{{TwSS::Trigeminy,PaperAlign::Rot0},G400_LONGLETTER},
|
{{TwSS::Trigeminy,PaperAlign::Rot0},G400_LONGLETTER},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
|
@ -321,7 +321,8 @@ void ImageMatQueue::PaniusCount()
|
||||||
|
|
||||||
bool ImageMatQueue::empty()
|
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()
|
bool ImageMatQueue::queuesempty()
|
||||||
|
@ -335,18 +336,106 @@ void ImageMatQueue::proc()
|
||||||
//int dwnumber = std::thread::thread::hardware_concurrency();
|
//int dwnumber = std::thread::thread::hardware_concurrency();
|
||||||
//std::unique_ptr<ThreadPool> m_threadpool;
|
//std::unique_ptr<ThreadPool> m_threadpool;
|
||||||
//m_threadpool.reset(new ThreadPool(dwnumber < 4 ? 1 : dwnumber / 2));
|
//m_threadpool.reset(new ThreadPool(dwnumber < 4 ? 1 : dwnumber / 2));
|
||||||
|
std::ios::sync_with_stdio(false);
|
||||||
while (bRun) {
|
while (bRun) {
|
||||||
while (m_imagedata.Size() > 0) {
|
while (m_imagedata.Size() > 0) {
|
||||||
this_thread::sleep_for(chrono::milliseconds(1));
|
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));
|
this_thread::sleep_for(chrono::milliseconds(1));
|
||||||
continue;
|
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()) {
|
if (!m_rawBuffs.IsShutDown() && !buffs.empty()) {
|
||||||
//m_threadpool->enqueue(&ImageMatQueue::imageproceing, this, buffs);
|
//m_threadpool->enqueue(&ImageMatQueue::imageproceing, this, buffs);
|
||||||
//try {
|
//try {
|
||||||
|
@ -356,8 +445,10 @@ void ImageMatQueue::proc()
|
||||||
//{
|
//{
|
||||||
// FileTools::writelog(log_ERROR, " image proc error " + std::string(e.what()));
|
// FileTools::writelog(log_ERROR, " image proc error " + std::string(e.what()));
|
||||||
//}
|
//}
|
||||||
imageproceing(buffs);
|
imageproceing(buffs);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
m_imagepath.pop();
|
||||||
}
|
}
|
||||||
//m_threadpool.reset();
|
//m_threadpool.reset();
|
||||||
}
|
}
|
||||||
|
@ -379,10 +470,10 @@ void ImageMatQueue::imageproceing(std::vector<std::shared_ptr<std::vector<char>>
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cv::Mat mat = cv::imdecode(*buf, rmc);
|
cv::Mat mat = cv::imdecode(*buf, rmc);
|
||||||
buf.reset();
|
|
||||||
if (mat.empty()) {
|
if (mat.empty()) {
|
||||||
FileTools::writelog(log_ERROR,"decode image data error");
|
FileTools::writelog(log_ERROR,"decode image data error");
|
||||||
}
|
}
|
||||||
|
buf.reset();
|
||||||
#ifdef G200
|
#ifdef G200
|
||||||
cv::resize(mat, mat, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
|
cv::resize(mat, mat, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
|
||||||
mats.push_back(mat);
|
mats.push_back(mat);
|
||||||
|
@ -405,6 +496,12 @@ void ImageMatQueue::imageproceing(std::vector<std::shared_ptr<std::vector<char>>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buffs.clear();
|
buffs.clear();
|
||||||
|
if (mats[0].empty() || mats[1].empty())
|
||||||
|
{
|
||||||
|
mats.clear();
|
||||||
|
PaniusCount();
|
||||||
|
return;
|
||||||
|
}
|
||||||
//DogEar_index++; //暂时屏蔽 2021.3.18
|
//DogEar_index++; //暂时屏蔽 2021.3.18
|
||||||
//StopWatch sw;
|
//StopWatch sw;
|
||||||
//sw.reset();
|
//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()));
|
//FileTools::write_log("1.txt", " dogear time " + to_string(sw.elapsed_ms()));
|
||||||
static int index = 0;
|
|
||||||
if (scanParam.is_switchfrontback)
|
if (scanParam.is_switchfrontback)
|
||||||
swap(mats[0], mats[1]);
|
swap(mats[0], mats[1]);
|
||||||
if (scanParam.en_fold != 0) {
|
if (scanParam.en_fold != 0) {
|
||||||
cv::flip(mats[0], mats[0], 1);
|
cv::flip(mats[0], mats[0], 1);
|
||||||
cv::flip(mats[0], mats[0], 0);
|
cv::flip(mats[0], mats[0], 0);
|
||||||
}
|
}
|
||||||
|
StopWatch sw;
|
||||||
for (int j = 0; j < m_iaList.size(); j++) {
|
for (int j = 0; j < m_iaList.size(); j++) {
|
||||||
m_iaList[j]->apply(mats, scanParam.is_duplex);
|
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++) {
|
for (int i = 0; i < mats.size(); i++) {
|
||||||
if (!scanParam.is_duplex && i == 1) {
|
if (!scanParam.is_duplex && i == 1) {
|
||||||
mats[i].release();
|
mats[i].release();
|
||||||
|
|
|
@ -174,6 +174,8 @@ public:
|
||||||
void updatefixratio(float& hratio, float& vratio);
|
void updatefixratio(float& hratio, float& vratio);
|
||||||
std::function<void(int)> DogEarDetection_callback;
|
std::function<void(int)> DogEarDetection_callback;
|
||||||
std::function<void(bool)> Getimagenumber;
|
std::function<void(bool)> Getimagenumber;
|
||||||
|
std::queue<std::string> m_imagepath;
|
||||||
|
std::queue<std::shared_ptr<std::vector<char>>> m_data;
|
||||||
private:
|
private:
|
||||||
void proc();
|
void proc();
|
||||||
void imageproceing(std::vector<std::shared_ptr<std::vector<char>>>& buffs);
|
void imageproceing(std::vector<std::shared_ptr<std::vector<char>>>& buffs);
|
||||||
|
@ -187,6 +189,8 @@ private:
|
||||||
volatile bool bRun;
|
volatile bool bRun;
|
||||||
volatile int atm_orgin_image_remains;
|
volatile int atm_orgin_image_remains;
|
||||||
volatile bool is_scanning;
|
volatile bool is_scanning;
|
||||||
|
std::unique_ptr<fstream> fw;
|
||||||
|
std::unique_ptr<fstream> fr;
|
||||||
GScanCap scanParam;
|
GScanCap scanParam;
|
||||||
Device::PaperSize papersize;
|
Device::PaperSize papersize;
|
||||||
std::shared_ptr<CImageApplyDogEarDetection> m_dogear;
|
std::shared_ptr<CImageApplyDogEarDetection> m_dogear;
|
||||||
|
|
|
@ -388,6 +388,7 @@ std::string TCHAR2STRING(TCHAR* STR)
|
||||||
char* chRtn = new char[iLen * sizeof(char)];
|
char* chRtn = new char[iLen * sizeof(char)];
|
||||||
WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL);
|
WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL);
|
||||||
std::string str(chRtn);
|
std::string str(chRtn);
|
||||||
|
delete[]chRtn;
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,6 +427,23 @@ std::string StringToUtf(std::string strValue)
|
||||||
return retStr;
|
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 GetContrastLevel(float contrast) {
|
||||||
int ret = 4;
|
int ret = 4;
|
||||||
if (contrast >= -1000.0f && contrast < -666.0f) { ret = 1; }
|
if (contrast >= -1000.0f && contrast < -666.0f) { ret = 1; }
|
||||||
|
|
|
@ -278,7 +278,7 @@ enum G400_PaperSize {
|
||||||
G400_LEGAL,
|
G400_LEGAL,
|
||||||
G400_LETTER,
|
G400_LETTER,
|
||||||
G400_LETTERR,
|
G400_LETTERR,
|
||||||
G400_LONGLETTER
|
G400_LONGLETTER=17,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum G400_DPI {
|
enum G400_DPI {
|
||||||
|
@ -311,6 +311,7 @@ HBITMAP SetButtonStaticBkBmp(HINSTANCE hInst, HWND hWin, UINT id, UINT iamge_id)
|
||||||
void writelog(std::string msg);
|
void writelog(std::string msg);
|
||||||
std::string TCHAR2STRING(TCHAR* STR);
|
std::string TCHAR2STRING(TCHAR* STR);
|
||||||
float GetContrast(int level);
|
float GetContrast(int level);
|
||||||
|
char* GBKToUTF8(const char* chGBK);
|
||||||
int GetMappingBrightnessValue(float in);
|
int GetMappingBrightnessValue(float in);
|
||||||
int GetMappingContrastValue(float in);
|
int GetMappingContrastValue(float in);
|
||||||
int GetContrastLevel(float contrast);
|
int GetContrastLevel(float contrast);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "UsbScanEx.h"
|
#include "UsbScanEx.h"
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#include <winioctl.h>
|
#include <winioctl.h>
|
||||||
#include "filetools.h"
|
//#include "filetools.h"
|
||||||
|
|
||||||
UsbScanEx::UsbScanEx(int index)
|
UsbScanEx::UsbScanEx(int index)
|
||||||
{
|
{
|
||||||
|
@ -80,7 +80,7 @@ bool UsbScanEx::open()
|
||||||
CloseHandle(m_h_dev);
|
CloseHandle(m_h_dev);
|
||||||
m_h_dev = INVALID_HANDLE_VALUE;
|
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;
|
return m_h_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ bool UsbScanEx::close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_b_is_connected = FALSE;
|
m_b_is_connected = FALSE;
|
||||||
FileTools::writelog(log_lv::log_INFO,"USB Close!");
|
//FileTools::writelog(log_lv::log_INFO,"USB Close!");
|
||||||
return b_ret;
|
return b_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,8 +156,9 @@ int UsbScanEx::read_bulk(void* data, int len)
|
||||||
|
|
||||||
if (m_h_dev != NULL) {
|
if (m_h_dev != NULL) {
|
||||||
b_ret = ReadFile(h_pipe, data, len, &pdw_ret, lp_overlap);
|
b_ret = ReadFile(h_pipe, data, len, &pdw_ret, lp_overlap);
|
||||||
|
//b_ret = GetOverlappedResult(h_pipe, lp_overlap, &pdw_ret, TRUE);
|
||||||
if (b_ret) {
|
if (b_ret) {
|
||||||
|
FlushFileBuffers(h_pipe);
|
||||||
return pdw_ret;
|
return pdw_ret;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -170,13 +171,13 @@ int UsbScanEx::read_bulk(void* data, int len)
|
||||||
case ERROR_FILE_NOT_FOUND:
|
case ERROR_FILE_NOT_FOUND:
|
||||||
case ERROR_ACCESS_DENIED:
|
case ERROR_ACCESS_DENIED:
|
||||||
m_b_is_connected = false;
|
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) {
|
if (hotplug_call) {
|
||||||
hotplug_call(true, usrdata);
|
hotplug_call(true, usrdata);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,12 +195,15 @@ int UsbScanEx::write_bulk(void* data, int len)
|
||||||
if (m_h_dev == INVALID_HANDLE_VALUE)
|
if (m_h_dev == INVALID_HANDLE_VALUE)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
b_ret = WriteFile(h_pipe, p_data, dw_size, &dw_size, lp_overlap);
|
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) {
|
if (b_ret) {
|
||||||
|
FlushFileBuffers(h_pipe);
|
||||||
return dw_size;
|
return dw_size;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int errorcode = GetLastError();
|
//int errorcode = GetLastError();
|
||||||
switch (errorcode)
|
//switch (errorcode)
|
||||||
|
switch (GetLastError())
|
||||||
{
|
{
|
||||||
case ERROR_IO_PENDING:
|
case ERROR_IO_PENDING:
|
||||||
GetOverlappedResult(h_pipe, lp_overlap, &dw_size, TRUE);
|
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_FILE_NOT_FOUND:
|
||||||
case ERROR_ACCESS_DENIED:
|
case ERROR_ACCESS_DENIED:
|
||||||
m_b_is_connected = false;
|
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) {
|
if (hotplug_call) {
|
||||||
hotplug_call(true, usrdata);
|
hotplug_call(true, usrdata);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,7 +284,6 @@ int UsbScanEx::read_int(void* data, int len)
|
||||||
|
|
||||||
case ERROR_FILE_NOT_FOUND:
|
case ERROR_FILE_NOT_FOUND:
|
||||||
m_b_is_connected = false;
|
m_b_is_connected = false;
|
||||||
FileTools::writelog(log_lv::log_ERROR,"USB connection error: ERROR_FILE_NOT_FOUND");
|
|
||||||
if (hotplug_call) {
|
if (hotplug_call) {
|
||||||
hotplug_call(true, usrdata);
|
hotplug_call(true, usrdata);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <timeapi.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <log4cplus/log4cplus.h>
|
#include <log4cplus/log4cplus.h>
|
||||||
#include "PublicFunc.h"
|
#include "PublicFunc.h"
|
||||||
|
|
||||||
|
@ -117,6 +119,56 @@ public:
|
||||||
_tcscat(szIniFile, TWAIN_LOG_NAME);
|
_tcscat(szIniFile, TWAIN_LOG_NAME);
|
||||||
writelog(std::wstring(szIniFile), log_lv::log_ERROR, log);
|
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:
|
private:
|
||||||
static void getFiles(std::string path, std::vector<std::string>& files)
|
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.lowpowermode = (byte)param.hardwarecaps.lowpowermode;
|
||||||
m_param.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
|
m_param.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
|
||||||
m_param.unused_one = m_param.sizeerror_errorratio = 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)
|
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)
|
void GscanJsonConfig::SaveGscancapJson(GScanCap cap, std::string path)
|
||||||
{
|
{
|
||||||
|
cap.SavePath = cap.Caption = "";
|
||||||
json js = GscancapToJson(cap);
|
json js = GscancapToJson(cap);
|
||||||
std::ofstream of;
|
std::ofstream of;
|
||||||
try {
|
try {
|
||||||
of.open(path, std::ios::out);
|
of.open(path, std::ios::out|std::ios::binary);
|
||||||
of.write(js.dump().c_str(), js.dump().size());
|
of.write(js.dump().data(), js.dump().size());
|
||||||
of.close();
|
of.close();
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (std::exception &e) {
|
||||||
if (of.is_open())
|
if (of.is_open())
|
||||||
of.close();
|
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][AUTOCROP_THRESHOLD] = cap.AutoCrop_threshold;
|
||||||
js[CONFIG][ISCONVEX] = cap.is_convex;
|
js[CONFIG][ISCONVEX] = cap.is_convex;
|
||||||
js[CONFIG][ITEMCAPTION] = cap.Caption;
|
js[CONFIG][ITEMCAPTION] = cap.Caption;
|
||||||
js[CONFIG][SAVEPATH] = cap.SavePath;
|
js[CONFIG][SAVEPATH] = cap.SavePath.c_str();
|
||||||
js[CONFIG][LOWPOWERMODE] = cap.hardwarecaps.lowpowermode;
|
js[CONFIG][LOWPOWERMODE] = cap.hardwarecaps.lowpowermode;
|
||||||
return js;
|
return js;
|
||||||
}
|
}
|
||||||
|
@ -856,7 +857,7 @@ json GscanJsonConfig::GetDefaultJson()
|
||||||
json GscanJsonConfig::Readjson(std::string path)
|
json GscanJsonConfig::Readjson(std::string path)
|
||||||
{
|
{
|
||||||
std::ifstream f;
|
std::ifstream f;
|
||||||
f.open(path, std::ios::in);
|
f.open(path, std::ios::in|std::ios::binary);
|
||||||
json js;
|
json js;
|
||||||
try {
|
try {
|
||||||
if(f.is_open()){
|
if(f.is_open()){
|
||||||
|
|
|
@ -8,7 +8,7 @@ CImageApplyAutoCrop::CImageApplyAutoCrop()
|
||||||
, m_isConvexHull(true)
|
, m_isConvexHull(true)
|
||||||
, m_isFillColor(false)
|
, m_isFillColor(false)
|
||||||
, m_threshold(40)
|
, m_threshold(40)
|
||||||
, m_noise(2)
|
, m_noise(8)
|
||||||
, m_indent(5)
|
, 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)
|
void CImageApplyChannel::except_channel(const cv::Mat & src, cv::Mat & dst, int channel)
|
||||||
{
|
{
|
||||||
int rows = static_cast<int>(src.total());
|
cv::Mat mv[3];
|
||||||
cv::Mat src_temp(rows, 3, CV_8UC1, src.data);
|
cv::split(src, mv);
|
||||||
cv::Mat dst_temp(rows, 1, CV_8UC1, dst.data);
|
cv::Mat mask, mask1, mask2;
|
||||||
|
|
||||||
cv::Mat temp1, temp2;
|
|
||||||
switch (channel)
|
switch (channel)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
temp1 = src_temp(cv::Rect(1, 0, 1, rows));
|
mask1 = mv[0] - mv[1];
|
||||||
temp2 = src_temp(cv::Rect(2, 0, 1, rows));
|
mask2 = mv[0] - mv[2];
|
||||||
cv::addWeighted(temp1, 0.587, temp2, 0.299, 0, dst_temp);
|
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
temp1 = src_temp(cv::Rect(0, 0, 1, rows));
|
mask1 = mv[1] - mv[0];
|
||||||
temp2 = src_temp(cv::Rect(2, 0, 1, rows));
|
mask2 = mv[1] - mv[2];
|
||||||
cv::addWeighted(temp1, 0.114, temp2, 0.299, 0, dst_temp);
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
temp1 = src_temp(cv::Rect(0, 0, 1, rows));
|
mask1 = mv[2] - mv[1];
|
||||||
temp2 = src_temp(cv::Rect(1, 0, 1, rows));
|
mask2 = mv[2] - mv[0];
|
||||||
cv::addWeighted(temp1, 0.114, temp2, 0.587, 0, dst_temp);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
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)
|
void CImageApplyChannel::colourless(const cv::Mat &src, cv::Mat &dst, uchar threshold)
|
||||||
|
|
|
@ -87,7 +87,7 @@ using namespace std::placeholders;
|
||||||
TWPP_ENTRY_MFC(HuagaoDs)
|
TWPP_ENTRY_MFC(HuagaoDs)
|
||||||
|
|
||||||
static constexpr const Identity srcIdent(
|
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,
|
DataGroup::Image,
|
||||||
#ifdef MAKEHUAGAO
|
#ifdef MAKEHUAGAO
|
||||||
"HUAGO",
|
"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()) {
|
||||||
if (scanner->get_lose_image_num() != 0)
|
int losemun = scanner->get_lose_image_num();
|
||||||
{
|
int num = 0;
|
||||||
text += "进纸与扫描数量相差" + to_string(scanner->get_lose_image_num()) + "份!";
|
if ((retcode == 64 || retcode == 8 || retcode == 16) && losemun > 0)
|
||||||
|
losemun--;
|
||||||
|
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
|
||||||
|
{
|
||||||
|
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);
|
scanner->set_lose_image_num(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text+" "+caption).c_str()), NULL, SW_HIDE);
|
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()
|
HuagaoDs::~HuagaoDs()
|
||||||
|
@ -767,7 +779,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
showmsg("警告", msgs[(UsbSupported)202]);
|
showmsg("警告", msgs[(UsbSupported)202]);
|
||||||
return { ReturnCode::Failure, ConditionCode::CapBadOperation };
|
return { ReturnCode::Failure, ConditionCode::CapBadOperation };
|
||||||
}
|
}
|
||||||
|
|
||||||
auto usblist= UsbScan_List::find_all_usb();
|
auto usblist= UsbScan_List::find_all_usb();
|
||||||
if (!usblist.empty())
|
if (!usblist.empty())
|
||||||
{
|
{
|
||||||
|
@ -824,7 +835,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
scanner->regist_deviceevent_callback(DeviceEvent_callback, this);
|
scanner->regist_deviceevent_callback(DeviceEvent_callback, this);
|
||||||
scanner->DogEar_callback(std::bind(&HuagaoDs::dogear_callback, this, std::placeholders::_1));
|
scanner->DogEar_callback(std::bind(&HuagaoDs::dogear_callback, this, std::placeholders::_1));
|
||||||
}
|
}
|
||||||
|
|
||||||
//MessageBox(NULL, L"2", L"", 0);
|
//MessageBox(NULL, L"2", L"", 0);
|
||||||
// init caps
|
// init caps
|
||||||
// there are caps a minimal source must support
|
// there are caps a minimal source must support
|
||||||
|
@ -1802,12 +1812,33 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
//双张检测 与官方标准定义有所差异 此协议修改为bool型 爱云校使用bool类型,其余使用标准twain协议
|
//双张检测 与官方标准定义有所差异 此协议修改为bool型 爱云校使用bool类型,其余使用标准twain协议
|
||||||
m_query[CapType::DoubleFeedDetection] = msgSupportGetAllSetReset;
|
m_query[CapType::DoubleFeedDetection] = msgSupportGetAllSetReset;
|
||||||
m_caps[CapType::DoubleFeedDetection] = [this](Msg msg, Capability& data)->Result {
|
m_caps[CapType::DoubleFeedDetection] = [this](Msg msg, Capability& data)->Result {
|
||||||
if (Msg::Set == msg) {
|
switch (msg) {
|
||||||
auto mech = data.currentItem<Bool>();
|
case Msg::Get:
|
||||||
m_scanparam->hardwarecaps.en_doublefeed = mech ? 1 : 0;
|
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 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
|
#ifdef G200
|
||||||
|
@ -1868,19 +1899,38 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
|
||||||
scanner->Set_ErrorCode(0);
|
scanner->Set_ErrorCode(0);
|
||||||
if (guiIndicator->GetSafeHwnd())
|
if (guiIndicator->GetSafeHwnd())
|
||||||
guiIndicator->ShowWindow(SW_HIDE);
|
guiIndicator->ShowWindow(SW_HIDE);
|
||||||
//if (guiIndicator.get())
|
|
||||||
// guiIndicator.reset();
|
|
||||||
//guiIndicator->ShowWindow(SW_HIDE);
|
|
||||||
if (ret != -1) {
|
if (ret != -1) {
|
||||||
//CString str;
|
showmsg("警告", msgs[(UsbSupported)ret],ret);
|
||||||
//str.Format(_T("%d"), ret);
|
|
||||||
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), str, NULL, SW_HIDE);
|
|
||||||
showmsg("警告", msgs[(UsbSupported)ret]);
|
|
||||||
FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]);
|
FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]);
|
||||||
#ifndef G200
|
#ifndef G200
|
||||||
scanner->clear_hwerror();
|
scanner->clear_hwerror();
|
||||||
#endif // G200
|
#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;
|
m_pendingXfers = 0;
|
||||||
if (guiTwain.get()) {
|
if (guiTwain.get()) {
|
||||||
((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true);
|
((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true);
|
||||||
|
@ -1888,7 +1938,6 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_pendingXfers = 1;
|
m_pendingXfers = 1;
|
||||||
scanner->set_aquire_image_count(scanner->get_aquire_image_count(), scanner->get_updata_image_count()+1);
|
|
||||||
}
|
}
|
||||||
data.setCount(m_pendingXfers);
|
data.setCount(m_pendingXfers);
|
||||||
return success();
|
return success();
|
||||||
|
@ -1938,13 +1987,13 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) {
|
||||||
if (!ui.showUi()) {
|
if (!ui.showUi()) {
|
||||||
// this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state
|
// 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
|
// with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step
|
||||||
#ifndef G200
|
//#ifndef G200
|
||||||
while (!scanner->Get_Scanner_PaperOn())
|
while (!scanner->Get_Scanner_PaperOn())
|
||||||
{
|
{
|
||||||
if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO)
|
if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO)
|
||||||
return seqError();
|
return seqError();
|
||||||
}
|
}
|
||||||
#endif // !G200
|
//#endif // !G200
|
||||||
|
|
||||||
|
|
||||||
auto ret = startScan();
|
auto ret = startScan();
|
||||||
|
@ -2306,6 +2355,7 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly)
|
||||||
if (newRect.top <= 0 || newRect.left <= 0)
|
if (newRect.top <= 0 || newRect.left <= 0)
|
||||||
newRect.top = newRect.left = 20;
|
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, 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);
|
guiTwain->ShowWindow(SW_SHOWNORMAL);
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
@ -2421,7 +2471,9 @@ Twpp::Result HuagaoDs::startScan()
|
||||||
//FileTools::write_log("D:\\1.txt",info);
|
//FileTools::write_log("D:\\1.txt",info);
|
||||||
FileTools::writelog(log_INFO,"start scan");
|
FileTools::writelog(log_INFO,"start scan");
|
||||||
#ifndef G200
|
#ifndef G200
|
||||||
|
scanner->notifyscan();
|
||||||
scanner->clear_hwerror();
|
scanner->clear_hwerror();
|
||||||
|
|
||||||
#endif //
|
#endif //
|
||||||
|
|
||||||
scanner->config_params(*m_scanparam);
|
scanner->config_params(*m_scanparam);
|
||||||
|
|
|
@ -94,7 +94,7 @@ private://method
|
||||||
void dogear_callback(int indexpaper);
|
void dogear_callback(int indexpaper);
|
||||||
void updataGscanCap();
|
void updataGscanCap();
|
||||||
Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data);
|
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
|
private://field
|
||||||
std::unordered_map<Twpp::CapType, std::function<Twpp::Result(Twpp::Msg msg, Twpp::Capability& data)>> m_caps;
|
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