twain3.0/huagao/Device/GScanO200.cpp

396 lines
8.5 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include "GScanO200.h"
#include "UsbScanEx.h"
#include "UsbScanEx.h"
#include "StopWatch.h"
#include "scn_config.h"
#include "ImageMatQueue.h"
#include "filetools.h"
//u32_CMD
typedef enum tagUsbKeyWords : UINT32
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NO_COMMAND = 0,
//<2F><>ȡdsp ״̬
GET_DSP_STATUS = 1,
//ȡͼ
GET_IMAGE = 2,
//<2F><><EFBFBD><EFBFBD>DSP<53><50>פ<EFBFBD><D7A4><EFBFBD><EFBFBD>ͼ
POP_IMAGE = 3,
//<2F><>ʼɨ<CABC><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
START_COMMAND = 4,
//ֹͣɨ<D6B9><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STOP = 5,
//<2F><>ȡɨ<C8A1><C9A8><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>ģʽ
GET_SCAN_MODE = 6,
//<2F><>ȡ<EFBFBD>̼<EFBFBD><CCBC><EFBFBD><E6B1BE>
GET_FW_VERSION = 7,
//<2F><><EFBFBD><EFBFBD>PC<50>˵<EFBFBD>״̬
SEND_STATUS_PC = 8,
//<2F>·<EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
CONFIGURED_DATA = 9,
//<2F>·<EFBFBD><C2B7>̼<EFBFBD><CCBC><EFBFBD>Ϣ
SEND_FW = 10,
//<2F><>ȡɨ<C8A1><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_CONFIG_DATA = 11,
//<2F><>ȡɨ<C8A1><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_SCANN_NUM = 12,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>״̬
GET_PAPERFEEDER_STATUS = 13,
//DSP<53><50>ʼ<EFBFBD><CABC>
INIT_HARDWARE_SYS = 14,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>״̬
GET_PAPER_STATUS = 0x0d,
//<2F>·<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷȣ<D2B6>LED R<>ع<EFBFBD>ʱ<EFBFBD>
SEND_COMPONENTS_GR = 15,
//<2F>·<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>LED G/B<>ع<EFBFBD>ʱ<EFBFBD>
SEND_COMPONENTS_GB = 16,
//<2F>·<EFBFBD>ɨ<EFBFBD><C9A8>ģʽ
SEND_SCAN_MODE = 17,
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
START_FLAT = 18,
//ֹͣƽ<D6B9><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STOP_FLAT = 19,
//<2F>·<EFBFBD>200dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_200_COLOR_FLAT_DATA = 20,
//<2F>·<EFBFBD>300dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_300_COLOR_FLAT_DATA = 21,
//<2F><>ȡ200dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_200_COLOR_FLAT_DATA = 22,
//<2F><>ȡ300dpi<70><69>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_300_COLOR_FLAT_DATA = 23,
//<2F>·<EFBFBD>200dpi<70>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_200_GRAY_FLAT_DATA = 24,
//<2F>·<EFBFBD>300dpi<70>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SEND_300_GRAY_FLAT_DATA = 25,
//<2F><>ȡ200DPI<50>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_200_GRAY_FLAT_DATA = 26,
//<2F><>ȡ300DPI<50>Ҷ<EFBFBD>ƽ<EFBFBD><C6BD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GET_300_GRAY_FLAT_DATA = 27,
//<2F>·<EFBFBD><C2B7><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
SEND_SERIAL = 28,
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
2020-05-19 17:06:53 +00:00
GET_SERIAL = 29
} UsbKeyWords, * PUsbKeyWords;
GScanO200::GScanO200()
{
}
GScanO200::~GScanO200()
{
if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP;
m_threadUsb->join();
m_threadUsb.reset();
}
}
void GScanO200::open(int vid, int pid)
{
auto usbs = UsbScan_List::find_vid_pid(vid, pid);
if (!usbs.empty()) {
m_usb = *usbs.begin();
2020-05-19 17:06:53 +00:00
bool ret= m_usb->open();
if (ret) {
m_usb->set_usbhotplug_callback(usbhotplug_callback, this);
}
}
}
#ifdef LOG_NORMAL
fstream fsaquire;
static int aquiretimes = 1;
#endif // LOG
int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
{
StopWatch sw;
while (true)
{
if (m_pImages->empty()) {
DoEvents();
this_thread::sleep_for(chrono::milliseconds(1));
if (sw.elapsed_s() > 20.00)
{
if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP;
m_threadUsb->join();
m_threadUsb.reset();
}
Stop_scan();//ֹͣɨ<D6B9><C9A8>
ResetScanner();
return HARDWARE_ERROR;
}
if (!is_scan()) {
if (devState == DEV_WRONG) {
return get_ErrorCode();
}
return -1;
}
}
else {
if (m_pImages->valid()) {
2020-05-19 17:06:53 +00:00
bmpdata = m_pImages->popBmpdata();
#ifdef LOG_NORMAL
static int aquireindex = 0;
FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex));
#endif // LOG
return 0;
}
DoEvents();
this_thread::sleep_for(chrono::milliseconds(2));
}
}
}
BOOL GScanO200::IsConnected()
{
return m_usb.get() && m_usb->is_connected();
}
std::string GScanO200::GetFWVersion()
{
if (m_usb.get() && m_usb->is_connected()) {
lock_guard< mutex> lock(m_imgLocker);
if (fwVersion.empty()) {
fwVersion = " ";
2020-05-19 17:06:53 +00:00
USBCB cmd= { GET_FW_VERSION,8,0,};
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], 8);
}
return fwVersion;
}
return "";
}
std::string GScanO200::GetSerialNum()
{
if (m_usb.get() && m_usb->is_connected())
{
2020-05-19 17:06:53 +00:00
std::lock_guard<mutex> lck(m_imgLocker);
if (SerialNum.empty()) {
SerialNum = " ";
USBCB usbcb = { GET_SERIAL,12,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], 12);
}
return SerialNum;
}
return "";
}
bool GScanO200::is_scan()
{
2020-05-19 17:06:53 +00:00
//std::lock_guard<mutex> lck(m_imgLocker);
return devState == DEV_ISRUNNING;
}
BOOL GScanO200::Get_Scanner_PaperOn()
{
2020-05-19 17:06:53 +00:00
if (m_usb.get()&&!m_usb->is_open())
return false;
USBCB usbcb = { GET_PAPER_STATUS ,0,0 };
2020-05-19 17:06:53 +00:00
std::lock_guard<mutex> lck(m_imgLocker);
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
return usbcb.u32_Data != 0;
}
void GScanO200::config_params(GScanCap& params)
{
2020-05-19 17:06:53 +00:00
if (m_usb.get()&&m_usb->is_connected()) {
IConfig cfg;
cfg = hgConfigClass(params);
UINT32 cfgdata = cfg.GetData();
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
m_usb->write_bulk(&usbcb, sizeof(USBCB));
m_pImages->setparam(params);
}
}
void GScanO200::Scanner_StartScan(UINT16 count)
{
if (m_usb.get() && m_usb->is_connected()) {
2020-05-19 17:06:53 +00:00
std::lock_guard<mutex> lck(m_imgLocker);
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
if (m_threadUsb && m_threadUsb->joinable()) {
m_threadUsb->join();
}
2020-05-19 17:06:53 +00:00
m_threadUsb.reset(new thread(&GScanO200::usbmain, this));
m_pImages->run();
2020-05-19 17:06:53 +00:00
m_pImages->setscanflags(true);
}
}
void GScanO200::Stop_scan()
{
if (m_usb.get() && !m_usb->is_connected()) {
return;
}
2020-05-19 17:06:53 +00:00
std::lock_guard<mutex> lck(m_imgLocker);
USBCB usbcb = { STOP ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
}
void GScanO200::ResetScanner()
{
if (m_usb.get() && !m_usb->is_connected())
return;
2020-05-19 17:06:53 +00:00
std::lock_guard<mutex> lck(m_imgLocker);
USBCB usbcb = { INIT_HARDWARE_SYS ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
}
bool GScanO200::Get_IsImageQueueEmpty()
{
return m_pImages->empty();
}
void GScanO200::reset()
{
2020-05-19 17:06:53 +00:00
while (!m_pImages->empty())
m_pImages->clear();
}
void GScanO200::setdecodepixtype(int twpixtype)
{
}
UINT32 GScanO200::get_ErrorCode()
{
return Error_Code;
}
void GScanO200::Set_ErrorCode(UINT32 value)
{
Error_Code = value;
}
int GScanO200::get_scanned_num()
{
if (m_usb.get() && !m_usb->is_connected())
return -1;
2020-05-19 17:06:53 +00:00
std::lock_guard<mutex> lck(m_imgLocker);
USBCB usbcb = { GET_SCANN_NUM ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
return usbcb.u32_Count;
}
void GScanO200::usbhotplug_callback(bool isconnect, void* userdata)
{
GScanO200* This = (GScanO200*)userdata;
This->usbhotplug(isconnect);
}
void GScanO200::usbhotplug(bool isleft)
{
if (isleft) {
2020-05-19 17:06:53 +00:00
//devState = DEV_WRONG;
//Error_Code = USB_DISCONNECTED;
//m_pImages->setscanflags(false);
}
}
void GScanO200::usbmain()
{
std::shared_ptr<std::vector<char>> imgData;
devState = DEV_ISRUNNING;
while (devState == DEV_ISRUNNING) {
2020-05-19 17:06:53 +00:00
if (m_usb.get() && !m_usb->is_connected()) {
this_thread::sleep_for(chrono::milliseconds(200));
continue;
}
USBCB usbcb = Get_Scanner_Status();
switch (usbcb.u32_Data) {
case HAVE_IMAGE:
{
int totalNum = usbcb.u32_Count;
2020-05-19 17:06:53 +00:00
m_usb->set_timeout(1500);
imgData = Get_Img_Data(totalNum);
if (!imgData->size()) {
Stop_scan();
}
2020-05-19 17:06:53 +00:00
m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData)));
#ifdef LOG_NORMAL
static int rawdataindex = 0;
FileTools::write_log("out.txt", "Enquque rawbuffer index " + std::to_string(++rawdataindex));
#endif // LOG
m_usb->set_timeout(200);
Pop_Image();
break;
}
case STOP_SCAN:
m_pImages->setscanflags(false);
devState = DEV_STOP;
break;
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:
2020-05-19 17:06:53 +00:00
case PC_SCAN_BUSY_or_ERROR:
Set_ErrorCode(usbcb.u32_Data);
m_pImages->setscanflags(false);
devState = DEV_WRONG;
break;
case NORMAL:
break;
default:
break;
}
this_thread::sleep_for(chrono::milliseconds(20));
}
}
///////////////////////////////////////////////////////////////////////////
USBCB GScanO200::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 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
return usbcb;
}
std::shared_ptr<std::vector<char>> GScanO200::Get_Img_Data(int bufferSize)
{
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
StopWatch sw;
int readed = 0;
2020-05-19 17:06:53 +00:00
while (readed < bufferSize && sw.elapsed_ms() < 5000){
USBCB usbcb = { GET_IMAGE,0,(UINT32)bufferSize };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
readed = m_usb->read_bulk(imData->data(), bufferSize);
}
if (sw.elapsed_ms() > 3000) {
writelog("Usb read data error\n");
}
return imData;
}
///////////////////////////////////////////////////////////////////////////
void GScanO200::Pop_Image()
{
if (m_usb.get() && !m_usb->is_open())
return;
USBCB usbcb = { POP_IMAGE ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
}