1.增加清除错误接口;

2.整合IGscan和Gscan接口为IScanner接口,去掉不必要的多继承;
3.调整开始扫描逻辑;
This commit is contained in:
lovelyyoung 2020-06-20 11:13:18 +08:00
parent 185fcf5a7d
commit 169dab7d5c
8 changed files with 210 additions and 169 deletions

View File

@ -1,40 +1,36 @@
#include "stdafx.h"
#include "GScan.h"
#include "stdio.h"
#include <stdio.h>
#include <map>
#include "ImageProcess/ImageApplyHeaders.h"
#include "ImageMatQueue.h"
GScan::GScan()
:pixType(0)
, m_pImages(new ImageMatQueue())
{
devState = DEV_STOP;
Error_Code = 0;
}
//GScan::GScan()
// :pixType(0)
// , m_pImages(new ImageMatQueue())
//{
// devState = DEV_STOP;
// Error_Code = 0;
//}
GScan::~GScan()
{
}
//void DoEvents()
//{
// MSG msg;
// if (PeekMessage(&msg , NULL, 0, 0, PM_REMOVE)) {
// DispatchMessage(&msg);
// TranslateMessage(&msg);
// }
//}
void DoEvents()
{
MSG msg;
if (PeekMessage(&msg , NULL, 0, 0, PM_REMOVE)) {
DispatchMessage(&msg);
TranslateMessage(&msg);
}
}
void GScan::trim(std::string &s)
{
int index = 0;
if (!s.empty()) {
while ((index = s.find(' ', index)) != string::npos)
s.erase(index, 1);
}
}
//void GScan::trim(std::string &s)
//{
// int index = 0;
// if (!s.empty()) {
// while ((index = s.find(' ', index)) != string::npos)
// s.erase(index, 1);
// }
//}

View File

@ -9,76 +9,14 @@
#include <thread>
#include "PublicFunc.h"
enum tagDevState
{
DEV_STOP = -1,
DEV_ISRUNNING,
DEV_WRONG
};
typedef enum tagDevState DevState, PDevState;
enum tagEventIndex
{
EVENT_IMAGE,
EVENT_NUM
};
class DiscardBlank;
class CImageApply;
class IGScan
{
public:
virtual ~IGScan()=0 {};
virtual void open(int vid, int pid) = 0;;
virtual int aquire_bmpdata(std::vector<unsigned char>& bmpdata) = 0;
virtual BOOL IsConnected() = 0;
virtual std::string GetFWVersion() = 0;
virtual std::string GetSerialNum() = 0;
virtual bool is_scan() = 0;
virtual BOOL Get_Scanner_PaperOn() = 0;
virtual void config_params(GScanCap& params) = 0;
virtual void Scanner_StartScan(UINT16 count) = 0;
virtual void Stop_scan() = 0;
virtual void ResetScanner() =0;
virtual bool Get_IsImageQueueEmpty() = 0;
virtual void reset() = 0;
virtual void clear_hwerror() = 0;
virtual void setdecodepixtype(int twpixtype)= 0;
virtual UINT32 get_ErrorCode() = 0;
virtual void Set_ErrorCode(UINT32 value) = 0;
virtual int get_scanned_num() = 0;
};
class IUsb;
class ImageMatQueue;
class GScan
{
public:
GScan();
virtual ~GScan();
protected:
volatile UINT32 Error_Code;
void trim(std::string &s);
volatile int devState;
std::shared_ptr<ImageMatQueue> m_pImages;
std::mutex m_Locker;
std::mutex m_imgLocker;
std::string fwVersion;
std::string SerialNum;
int pixType;
};
//u32_Data
typedef enum tagUsbSupported {
@ -124,8 +62,57 @@ typedef enum tagUsbSupported {
PC_SCAN_BUSY_or_ERROR = 73,
//USB δÁ¬½Ó
USB_DISCONNECTED = 200
} UsbSupported, * PUsbSupported;
} UsbSupported, *PUsbSupported;
enum tagEventIndex
{
EVENT_IMAGE,
EVENT_NUM
};
void DoEvents();
class DiscardBlank;
class CImageApply;
class IUsb;
class ImageMatQueue;
class IScanner
{
public:
virtual ~IScanner(){};
virtual void open(int vid, int pid) = 0;;
virtual int aquire_bmpdata(std::vector<unsigned char>& bmpdata) = 0;
virtual BOOL IsConnected() = 0;
virtual std::string GetFWVersion() = 0;
virtual std::string GetSerialNum() = 0;
virtual bool is_scan() = 0;
virtual BOOL Get_Scanner_PaperOn() = 0;
virtual void config_params(GScanCap& params) = 0;
virtual void Scanner_StartScan(UINT16 count) = 0;
virtual void Stop_scan() = 0;
virtual void ResetScanner() =0;
virtual bool Get_IsImageQueueEmpty() = 0;
virtual void reset() = 0;
virtual void clear_hwerror() = 0;
virtual void setdecodepixtype(int twpixtype)= 0;
virtual UINT32 get_ErrorCode() = 0;
virtual void Set_ErrorCode(UINT32 value) = 0;
virtual int get_scanned_num() = 0;
void DoEvents() {
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
DispatchMessage(&msg);
TranslateMessage(&msg);
}
}
protected:
volatile UINT32 Error_Code;
volatile int devState;
std::shared_ptr<ImageMatQueue> m_pImages;
std::mutex m_Locker;
std::mutex m_imgLocker;
std::string fwVersion;
std::string SerialNum;
int pixType;
};

View File

@ -103,6 +103,10 @@ void GScan200::reset()
}
}
void GScan200::clear_hwerror()
{
}
void GScan200::setdecodepixtype(int twpixtype)
{
pixType = (twpixtype == 0) ? 1 : 0;
@ -125,11 +129,6 @@ int GScan200::get_scanned_num()
return scanned_count;
}
void GScan200::set_scan_status(bool isscan)
{
}
void GScan200::image_call_s(void* fdata, int fsize, void* bdata, int bsize, void* userdata)
{
GScan200* This = (GScan200*)userdata;

View File

@ -5,7 +5,7 @@
class IGDevice;
class GScan200 : public IGScan, GScan
class GScan200 : public IScanner
{
public:
GScan200();
@ -23,11 +23,11 @@ public:
virtual void ResetScanner() override;
virtual bool Get_IsImageQueueEmpty() override;
virtual void reset() override;
virtual void clear_hwerror() override;
virtual void setdecodepixtype(int twpixtype) override;
virtual UINT32 get_ErrorCode() override;
virtual void Set_ErrorCode(UINT32 value) override;
virtual int get_scanned_num() override;
void set_scan_status(bool isscan);
virtual int get_scanned_num() override;
private:
static void image_call_s(void *fdata, int fsize, void *bdata, int bsize, void *userdata);
static void event_call_g200(int error_value, void* userdata);

View File

@ -78,72 +78,74 @@ typedef enum tagUsbKeyWords : UINT32
//获取序列号命令
GET_SERIAL = 29,
//获取滚轴数
GET_ROLLER_NUM=0x1e,
GET_ROLLER_NUM = 0x1e,
//清零滚轴数
CLR_ROLLER_NUM=0x1f,
CLR_ROLLER_NUM = 0x1f,
//清除扫描总张数
CLR_SCAN_NUM=0x20,
CLR_SCAN_NUM = 0x20,
//准备更新固件
PRE_UPGRADE=0X21,
PRE_UPGRADE = 0X21,
//开始更新固件
START_UPGRADE=0x22,
START_UPGRADE = 0x22,
//彩色的AD参数
RGB_ADI_PARA=0x23,
RGB_ADI_PARA = 0x23,
//灰度的AD参数
ADI_PARA=0x24,
ADI_PARA = 0x24,
//获取CIS参数曝光时间ad参数)
GET_CIS_PARA=0x25,
GET_CIS_PARA = 0x25,
//扫描张数
START_COMMAND_COUNT=0x26,
START_COMMAND_COUNT = 0x26,
//下发休眠时间
SET_SLEEP_TIME=0x27,
SET_SLEEP_TIME = 0x27,
//获取休眠时间
GET_SLEEP_TIME=0x28,
GET_SLEEP_TIME = 0x28,
//清除缓存
CLR_CACHE=0x29,
CLR_CACHE = 0x29,
//下发速度模式
SET_SPEED_MODE=0x2a,
SET_SPEED_MODE = 0x2a,
//获取扫描速度模式
GET_SPEED_MODE=0X2b,
GET_SPEED_MODE = 0X2b,
//设置固件版本一共8个字节
SET_FW_VERSION=0X2c,
SET_FW_VERSION = 0X2c,
//获取DSP版本
GET_DSP_VERSION=0X2d,
GET_DSP_VERSION = 0X2d,
//采集板FPGA固件版本
GET_SCANFPGA_VERSION=0x2e,
GET_SCANFPGA_VERSION = 0x2e,
//电机板FPGA固件版本
GET_MOTORFPGA_VERSION =0X2f,
GET_MOTORFPGA_VERSION = 0X2f,
//设置制造商信息
SET_USB_INFOR_MANUFACTURE=0X30,
SET_USB_INFOR_MANUFACTURE = 0X30,
//获取制造商信息
GET_USB_INFOR_MANUFACTURE=0X31,
GET_USB_INFOR_MANUFACTURE = 0X31,
//设置产品型号信息
SET_USB_INFOR_MODEL_NAME=0X32,
SET_USB_INFOR_MODEL_NAME = 0X32,
//获取产品型号信息
GET_USB_INFOR_MODEL_NAME=0X33,
GET_USB_INFOR_MODEL_NAME = 0X33,
//设置USB PID / VID信息
SET_USB_INFOR_VIDPID=0X34,
GET_USB_INFOR_VIDPID=0X35,
SET_USB_INFOR_VIDPID = 0X34,
GET_USB_INFOR_VIDPID = 0X35,
//设置卡纸急停检测灵敏度
SET_JAM_DETECT_SENSITIVE=0X36,
SET_JAM_DETECT_SENSITIVE = 0X36,
//获取卡纸急停检测灵敏度
GET_JAM_DETECT_SENSITIVE=0X37,
GET_JAM_DETECT_SENSITIVE = 0X37,
//设置横向畸变系数
SET_JUST_COF_H=0x38,
SET_JUST_COF_H = 0x38,
//读取横向畸变系数
GET_JUST_COF_H=0x39,
GET_JUST_COF_H = 0x39,
#ifndef G200
CLEAR_HWERROR = 0x40,//G400 清除硬件异常
#endif // !G200
//设置纵向畸变系数
//ÉèÖÃ×ÝÏò»û±äϵÊý
SET_JUST_COF_V = 0x41,
//读取纵向畸变系数
GET_JUST_COF_V
} UsbKeyWords, * PUsbKeyWords;
} UsbKeyWords, *PUsbKeyWords;
GScanO200::GScanO200()
GScanO200::GScanO200():
m_bread_fixed_ratio_fromDSP(false)
{
m_pImages.reset(new ImageMatQueue());
}
GScanO200::~GScanO200()
@ -201,6 +203,11 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
else {
if (m_pImages->valid()) {
bmpdata = *(m_pImages->popBmpdata());
//static int aqimgindex = 0;
//FileTools::write_log("1.txt", "aquireed image " + to_string(++aqimgindex));
//FileTools::write_log("E:\\Users\\huago\\Desktop\\1.txt", "aquired image "+ to_string(++aqimgindex));
#ifdef LOG_NORMAL
static int aquireindex = 0;
FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex));
@ -224,24 +231,22 @@ std::string GScanO200::GetFWVersion()
lock_guard< mutex> lock(m_imgLocker);
if (fwVersion.empty()) {
#ifndef G200
fwVersion = " ";
USBCB cmd = { GET_FW_VERSION,10,0, };
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], 10);
//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");
//updateHVRatio()
fwVersion.resize(10);
#else // !G200
fwVersion = " ";
USBCB cmd = { GET_FW_VERSION,8,0, };
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], 8);
fwVersion.resize(8);
#endif
USBCB cmd = { GET_FW_VERSION,fwVersion.size(),0, };
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], fwVersion.size());
#ifdef G200
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");
updateHVRatio();
#endif // G200
}
;
;
return fwVersion;
}
return "";
@ -249,22 +254,19 @@ std::string GScanO200::GetFWVersion()
std::string GScanO200::GetSerialNum()
{
//return "G20018000298";
if (m_usb.get() && m_usb->is_connected())
{
std::lock_guard<std::mutex> lck(m_imgLocker);
if (SerialNum.empty()) {
#ifndef G200
SerialNum = " ";
USBCB usbcb = { GET_SERIAL,14,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], 14);
SerialNum.resize(14);
#else // !G200
SerialNum = " ";
USBCB usbcb = { GET_SERIAL,12,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], 12);
SerialNum.resize(12);
#endif
USBCB usbcb = { GET_SERIAL,SerialNum.size(),0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], SerialNum.size());
}
return SerialNum;
@ -310,12 +312,52 @@ void GScanO200::Scanner_StartScan(UINT16 count)
{
if (m_usb.get() && m_usb->is_connected()) {
std::lock_guard<std::mutex> lck(m_imgLocker);
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP;
m_threadUsb->join();
}
#ifndef G200
USBCB paperstatus = { GET_PAPER_STATUS ,0,0 };
m_usb->write_bulk(&paperstatus, sizeof(paperstatus));
m_usb->read_bulk(&paperstatus, sizeof(paperstatus));
if (paperstatus.u32_Data == 0) {
m_pImages->setscanflags(false);
devState = DEV_WRONG;
Set_ErrorCode(NO_FEED);
return;
}
#endif // !G200
USBCB status = { GET_DSP_STATUS ,0,0 };
m_usb->write_bulk(&status, sizeof(status));
m_usb->read_bulk(&status, sizeof(status));
switch (status.u32_Data)
{
case COUNT_MODE:
case NO_FEED:
case OPEN_COVER:
case FEED_IN_ERROR:
case PAPER_JAM:
case DETECT_DOUBLE_FEED:
case DETECT_STAPLE:
case PAPER_SKEW:
case HARDWARE_ERROR:
case PC_SCAN_BUSY_or_ERROR:
m_pImages->setscanflags(false);
devState = DEV_WRONG;
Set_ErrorCode(status.u32_Data);
return;
default:
break;
}
if (gcap.is_duplex)
count = count == 65535 ? 65535 : count / 2;
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_pImages->setscanflags(true);
m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this));
m_pImages->run();
@ -330,8 +372,10 @@ void GScanO200::Stop_scan()
std::lock_guard<std::mutex> lck(m_imgLocker);
USBCB usbcb = { STOP ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_pImages->setscanflags(false);
devState = DEV_STOP;
#ifdef G200
//m_pImages->setscanflags(false);
//devState = DEV_STOP;
#endif // G200
}
void GScanO200::ResetScanner()
@ -353,6 +397,7 @@ void GScanO200::reset()
{
while (!m_pImages->empty())
m_pImages->clear();
}
void GScanO200::setdecodepixtype(int twpixtype)
@ -417,11 +462,11 @@ void GScanO200::updateHVRatio()
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
float hratio = *((float*)(&usbcb.u32_Data));
usbcb= { GET_JUST_COF_V ,0,0 };
usbcb = { GET_JUST_COF_V ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
float vratio = *((float*)(&usbcb.u32_Data));
writelog("fx: " + to_string(hratio) + " fy :" + to_string(vratio));
//writelog("fx: " + to_string(hratio) + " fy :" + to_string(vratio));
m_pImages->updatefixratio(hratio, vratio);
}
}
@ -430,10 +475,8 @@ void GScanO200::usbmain()
{
std::shared_ptr<std::vector<char>> imgData;
devState = DEV_ISRUNNING;
bool haveError = false;
while (devState == DEV_ISRUNNING) {
//int mmused = GetMemoryUsage::CurrentProcessMemoryInfo();//当前进程内存使用量
//bool need_loop = (m_pImages->getdpi() > 240.0) && mmused >500;//进程内存占用率大于600MB
if ((m_usb.get() && !m_usb->is_connected())) {
this_thread::sleep_for(chrono::milliseconds(200));
continue;
@ -468,7 +511,9 @@ void GScanO200::usbmain()
}
case STOP_SCAN:
m_pImages->setscanflags(false);
devState = DEV_STOP;
devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP;
//m_pImages->setscanflags(false);
//devState = DEV_STOP;
break;
case COUNT_MODE:
case NO_FEED:
@ -480,9 +525,18 @@ void GScanO200::usbmain()
case PAPER_SKEW:
case HARDWARE_ERROR:
case PC_SCAN_BUSY_or_ERROR:
#ifdef G200
Set_ErrorCode(usbcb.u32_Data);
m_pImages->setscanflags(false);
devState = DEV_WRONG;
#else
if (!haveError)
{
haveError = true;
Set_ErrorCode(usbcb.u32_Data);
}
#endif
break;
case NORMAL:
break;

View File

@ -9,7 +9,7 @@ typedef struct tag_USBCB {
}USBCB, * PUSBCB;
class GScanO200 : public IGScan, GScan
class GScanO200 : public IScanner
{
public:
GScanO200();

View File

@ -34,7 +34,7 @@ int GScanVirtual::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
while (true)
{
if (Get_IsImageQueueEmpty() && is_scan()) {
DoEvents();
//DoEvents();
this_thread::sleep_for(chrono::milliseconds(1));
if (sw.elapsed_s() > 15.00)
{
@ -44,7 +44,7 @@ int GScanVirtual::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
m_threadUsb.reset();
}
Stop_scan();//ֹͣɨÃè
ResetScanner();
//ResetScanner();
return HARDWARE_ERROR;
}
@ -120,6 +120,10 @@ void GScanVirtual::Stop_scan()
fs.close();
}
void GScanVirtual::clear_hwerror()
{
}
void GScanVirtual::ResetScanner()
{

View File

@ -3,7 +3,7 @@
#include <memory>
class GScanVirtual : public IGScan, GScan
class GScanVirtual : public IScanner
{
public:
GScanVirtual();
@ -19,6 +19,7 @@ public:
virtual void config_params(GScanCap& params) override;
virtual void Scanner_StartScan(UINT16 count) override;
virtual void Stop_scan() override;
virtual void clear_hwerror() override;
virtual void ResetScanner() override;
virtual bool Get_IsImageQueueEmpty() override;
virtual void reset() override;