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:
masayume 2021-06-21 19:38:36 +08:00
parent 4dbfade00e
commit 75d3cb941b
26 changed files with 637 additions and 183 deletions

View File

@ -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

View File

@ -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();
}

View File

@ -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();
};

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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;
};

View File

@ -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;
}

View File

@ -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;

View File

@ -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(&notify, sizeof(notify));
m_usb->read_bulk(&notify, 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()) + "份文件。");
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)
{
//if (is_AndroidOrLinux)
//{
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()));
//}
//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");

View File

@ -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;
};

View File

@ -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
};

View File

@ -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();

View File

@ -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;

View File

@ -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; }

View File

@ -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);

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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)

View File

@ -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()){

View File

@ -8,7 +8,7 @@ CImageApplyAutoCrop::CImageApplyAutoCrop()
, m_isConvexHull(true)
, m_isFillColor(false)
, m_threshold(40)
, m_noise(2)
, m_noise(8)
, m_indent(5)
{
}

View File

@ -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)

View File

@ -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);

View File

@ -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.

Binary file not shown.