# Conflicts:
#	GScan200.cpp
This commit is contained in:
罗颖 2019-12-09 09:09:32 +08:00
commit 1c0d0c33b2
16 changed files with 237 additions and 64 deletions

View File

@ -114,6 +114,7 @@ CScanner_FreeImage::CScanner_FreeImage() :
//////////////////////////////////////////////////////////////////////////////
CScanner_FreeImage::~CScanner_FreeImage()
{
g_scan.reset();
}
void CScanner_FreeImage::InitMSGMap()
@ -174,6 +175,7 @@ bool CScanner_FreeImage::acquireImage(bool bscan)
if (getDeviceOnline())
{
g_scan->config_params(*(getSetting()));
g_scan->setdecodepixtype(m_HardWareParams.PixType);
g_scan->Scanner_StartScan(m_wScanCount);
}
else

View File

@ -83,17 +83,22 @@ void GDevice::close()
if (m_threadInt && m_threadInt->joinable()) {
m_bListen = false;
this_thread::sleep_for(std::chrono::milliseconds(100));
XdPrint("closing m_threadInt\n");
m_threadInt->join();
m_threadInt = NULL;
XdPrint("close m_threadInt\n");
}
if (m_threadrecv && m_threadrecv->joinable()) {
m_bScan = false;
image_indexs.ShutDown();
XdPrint("closing m_threadrecv\n");
m_threadrecv->join();
m_threadrecv = NULL;
XdPrint("close m_threadrecv\n");
}
m_usb->close();
XdPrint("close m_usb\n");
}
}
@ -129,7 +134,6 @@ void GDevice::set_event_call(event_callback callfunc, void* userdata)
void GDevice::stop()
{
set_option(Cam_Options::scanner_stop_motor, 0);
}
@ -328,21 +332,45 @@ void GDevice::Int_main()
image_indexs.Put(int_buffer[1]);
}
MotorStatus* ms = (MotorStatus*)int_buffer;
if (ms->value && 0x7fe) {
if(m_eventcall_userdata){
((GScan200*)m_eventcall_userdata)->set_scan_status(false);//停止或异常停止时,通知图像处理线程扫描仪已停止
}
m_run = false;
}
//int ret = get_option(Cam_Options::scanner_scan_status);
//XdPrint("scanner_scan_status %d \n",ret);
//if (!ret)//电机板工作中
//{
// XdPrint("scanner stoped 1\n");
// ((GScan200*)m_eventcall_userdata)->set_scan_status(false);//停止或异常停止时,通知图像处理线程扫描仪已停止
// m_run = false;
// XdPrint("scanner stoped 2\n");
//}
//else
//{
// XdPrint("scanner is scanning \n");
//}
//if (ms->value && 0x7fe) {
// if(m_eventcall_userdata){
//
// }
//}
if (event_call)
{
//0x3fe ==>b 1111 1111 10 Ò쳣λ¸ßÓÐЧʱ
if (ms->value & 0x3fe) {
((GScan200*)m_eventcall_userdata)->set_scan_status(false);
event_call(ms->value, m_eventcall_userdata);
m_run = false;
XdPrint("scanner have error stoped \n");
}
}
}
int ret = get_option(Cam_Options::scanner_scan_status);
if (m_run&&!ret)//电机板工作中
{
XdPrint("scanner stoped 1\n");
((GScan200*)m_eventcall_userdata)->set_scan_status(false);//停止或异常停止时,通知图像处理线程扫描仪已停止
m_run = false;
XdPrint("scanner stoped 2\n");
}
}
}
@ -480,6 +508,10 @@ int GDevice::get_option(Cam_Options option)
value = read_reg(MOTOR_BOARD, 0x02);
value = ((Motor_Mode*)& value)->feeding_paper_ready;
break;
case scanner_scan_status:
value = read_reg(MOTOR_BOARD, 0x02);
value = ((Motor_Mode*)& value)->scan_status;
break;
default:
break;
}

View File

@ -4,6 +4,7 @@
#include "IGDevice.h"
#include "opencv2/opencv.hpp"
#include "twain.h"
#include "config_new.h"
#include "device_common.h"
#include "GDevice.h"
@ -15,6 +16,7 @@ GScan200::~GScan200()
{
if (!error_msg.IsShutDown())
error_msg.ShutDown();
XdPrint("closed GScan200\n");
}
void GScan200::open(int vid, int pid)
@ -57,22 +59,18 @@ BOOL GScan200::IsConnected()
std::string GScan200::GetFWVersion()
{
if (fwVersion.empty())
{
fwVersion = " ";
((GDevice*)(m_dev.get()))->read_flash(FWVERSION_ADDR, &fwVersion[0], FLASH_FWVERSION_ADDR_SIZE);
return fwVersion;
if (fwVersion.empty()) {
fwVersion.resize(8);
((GDevice*)(m_dev.get()))->read_flash(FWVERSION_ADDR, (void*)(fwVersion.data()), FLASH_FWVERSION_ADDR_SIZE);
}
return fwVersion;
}
std::string GScan200::GetSerialNum()
{
if (SerialNum.empty())
{
SerialNum = " ";
((GDevice*)(m_dev.get()))->read_flash(SERIAL_ADDR, &SerialNum[0], FLASH_SERIAL_ADDR_SIZE);
return SerialNum;
if (SerialNum.empty()) {
SerialNum.resize(12);
((GDevice*)(m_dev.get()))->read_flash(SERIAL_ADDR, (void*)(SerialNum.data()), FLASH_SERIAL_ADDR_SIZE);
}
return SerialNum;
}
@ -89,6 +87,9 @@ BOOL GScan200::Get_Scanner_PaperOn()
void GScan200::config_params(SFreeImage& params)
{
config_new cfn(params);
unsigned int cfg_value=cfn.GetData();
m_dev->set_option(Cam_Options::scanner_config, cfg_value);
m_pImages.setparam(params);
}

10
IConfig.h Normal file
View File

@ -0,0 +1,10 @@
#pragma once
class IConfig
{
public:
IConfig(void) {};
virtual ~IConfig(void) {};
virtual unsigned int GetData() = 0;
};

View File

@ -31,8 +31,8 @@ enum Cam_Options {
scanner_error_clean ,//异常清除
scanner_Init_Status, //状态初始化使能
scanner_IIC_Config, //IIC配置使能
scanner_Speed_Config //速度配置使能
scanner_Speed_Config, //速度配置使能
scanner_scan_status
};
class IGDevice

View File

@ -32,8 +32,10 @@ ImageMatQueue::~ImageMatQueue(void)
bRun = false;
at_prced_image_remains = 0;
atm_orgin_image_remains = 0;
XdPrint("closeing m_threadProc\n");
m_threadProc->join();
m_threadProc = NULL;
XdPrint("closed m_threadProc\n");
}
}
@ -43,11 +45,12 @@ void ImageMatQueue::pushMat(JpegBuffer& data)
m_pImages.Put(data);
atm_orgin_image_remains++;
}
static int outnum =0;
cv::Mat ImageMatQueue::popMat()
{
std::lock_guard<std::mutex> lock(m_mtxJB);
cv::Mat mat = _popMat();
XdPrint("dequeue image %d \n", outnum++);
at_prced_image_remains--;
return mat;
}
@ -111,7 +114,7 @@ void ImageMatQueue::PaniusCount()
void ImageMatQueue::SetScanningStatus(bool isscannning)
{
std::lock_guard<std::mutex> lock(m_Locker);
std::lock_guard<std::mutex> lock(m_mtxscan);
iscanning = isscannning;
}
@ -129,60 +132,68 @@ void ImageMatQueue::release_img_prc_thread()
bool ImageMatQueue::empty()
{
return ((atm_orgin_image_remains == 0 &&
bool ret= ((atm_orgin_image_remains == 0 &&
at_prced_image_remains == 0) && (!iscanning));
return ret;
}
static int index=0;
void ImageMatQueue::proc()
{
JpegBuffer jb;
while (bRun) {
if (m_pImages.Size() <= 0)
{
continue;
}
jb = m_pImages.Take();
if (!m_pImages.IsShutDown() && !jb.empty()) {
vector<cv::Mat> mats = jb.getMats();
if (scanParam.m_OutHole.EnOutHole && mats.size() == 2){ //确保能够获取正反两面图
if (!mats[0].empty() && !mats[1].empty())
ImageOutHole().puncture(mats[0], mats[1], 50.0, scanParam.m_OutHole.OutHoleRatio / 100.0, 50);
}
//if (scanParam.m_OutHole.EnOutHole && mats.size() == 2){ //确保能够获取正反两面图
// if (!mats[0].empty() && !mats[1].empty())
// ImageOutHole().puncture(mats[0], mats[1], 50.0, scanParam.m_OutHole.OutHoleRatio / 100.0, 50);
//}
//for (int i = 0; i < mats.size(); i++) {
// if (!mats[i].empty()) {
// for (int j = 0; j < m_iaList.size(); j++) {
// if (mats[i].empty())//剔除空白页
// break;
// m_iaList[j]->apply(mats[i], i);
// }
// }
//}
for (int i = 0; i < mats.size(); i++) {
if (!mats[i].empty()) {
for (int j = 0; j < m_iaList.size(); j++) {
if (mats[i].empty())//剔除空白页
break;
//if (!scanParam.m_bDuplex && i == 1) {
// mats[i].release();
// break;
//}
m_iaList[j]->apply(mats[i], i);
}
}
}
for (int i = 0; i < mats.size(); i++) {
if (!scanParam.m_bDuplex && i == 1) {
mats[i].release();
break;
}
if (!mats[i].empty())
if (!mats[i].empty()){
EnqueueMat(mats[i]);
}
if (scanParam.m_bMultiOutput)
{
for (int i = 0; i < mats.size(); i++)
{
ImageMultiOutput m_mlt;
Mat m_filterMat = m_mlt.GetMultiFilterMat(mats[i], 2);
if (!m_filterMat.empty()) {
if (!scanParam.m_bDuplex && i == 1) {
mats[i].release();
break;
}
if (!m_filterMat.empty())
EnqueueMat(m_filterMat);
}
XdPrint("enqueue image %d \n", index++);
}
}
//if (scanParam.m_bMultiOutput)
//{
// for (int i = 0; i < mats.size(); i++)
// {
// ImageMultiOutput m_mlt;
// Mat m_filterMat = m_mlt.GetMultiFilterMat(mats[i], 2);
// if (!m_filterMat.empty()) {
// if (!scanParam.m_bDuplex && i == 1) {
// mats[i].release();
// break;
// }
// if (!m_filterMat.empty())
// EnqueueMat(m_filterMat);
// }
// }
//}
PaniusCount();
}
jb = JpegBuffer();

View File

@ -44,6 +44,7 @@ private:
BlockingQueue<JpegBuffer> m_pImages;
std::mutex m_Locker;
std::mutex m_mtxJB;
std::mutex m_mtxscan;
std::unique_ptr<thread> m_threadProc;
volatile bool bRun;
bool isduplex;

77
config_new.cpp Normal file
View File

@ -0,0 +1,77 @@
#include "stdafx.h"
#include "config_new.h"
config_new::config_new(SFreeImage param)
{
ms.value = 0;
init_paperdic();
init_colormodedic();
init_dpidic();
set_unused_default_value();
ms.double_paper = param.m_HardWareParams.DoubleFeederOn;
ms.color_model = pixType[param.m_HardWareParams.PixType];
ms.dpi = resolutions[param.m_HardWareParams.Resolution];
ms.papar_type = paperTypes[param.m_HardWareParams.PaperType];
ms.paper = ms.papar_type == 3;
ms.skew_enable = param.m_HardWareParams.SkrewDetectOn;
ms.skew_parameter = param.m_HardWareParams.SkrewDetectLevel;
ms.staple_enable = param.m_HardWareParams.StapleDetectOn;
}
config_new::~config_new(void)
{
}
unsigned int config_new::GetData()
{
return ms.value;
}
void config_new::init_paperdic(void)
{
paperTypes.insert(std::pair<uint16_t, UINT32>(11, 0));//A3
paperTypes.insert(std::pair<uint16_t, UINT32>(1, 1));//A4
paperTypes.insert(std::pair<uint16_t, UINT32>(60, 2));//A4R
paperTypes.insert(std::pair<uint16_t, UINT32>(5, 2));//A5
paperTypes.insert(std::pair<uint16_t, UINT32>(61, 2));//A5R
paperTypes.insert(std::pair<uint16_t, UINT32>(13, 2));//A6
paperTypes.insert(std::pair<uint16_t, UINT32>(62, 2));//A6R
paperTypes.insert(std::pair<uint16_t, UINT32>(6, 0));//B4
paperTypes.insert(std::pair<uint16_t, UINT32>(2, 0));//B5
paperTypes.insert(std::pair<uint16_t, UINT32>(70, 1));//B5R
paperTypes.insert(std::pair<uint16_t, UINT32>(7, 2));//B6
paperTypes.insert(std::pair<uint16_t, UINT32>(71, 2));//B6R
paperTypes.insert(std::pair<uint16_t, UINT32>(3, 1));//LETTER
paperTypes.insert(std::pair<uint16_t, UINT32>(80, 2));//LETTERR
paperTypes.insert(std::pair<uint16_t, UINT32>(81, 0));//DOUBLE LETTER
paperTypes.insert(std::pair<uint16_t, UINT32>(4, 0));//LEGAL
paperTypes.insert(std::pair<uint16_t, UINT32>(90, 0));//Auto °´ÕÕA3½øÐÐɨÃè
paperTypes.insert(std::pair<uint16_t, UINT32>(91, 3));//³¤Îĸå
}
void config_new::init_colormodedic(void)
{
pixType.insert(std::pair<uint16_t, UINT32>(0, 0));//BW
pixType.insert(std::pair<uint16_t, UINT32>(1, 0));//Gray
pixType.insert(std::pair<uint16_t, UINT32>(2, 1));//RGB
}
void config_new::init_dpidic(void)
{
resolutions.insert(std::pair<float, UINT32>(300, 1));//300
resolutions.insert(std::pair<float, UINT32>(200, 0));//200
resolutions.insert(std::pair<float, UINT32>(600, 2));//600
}
void config_new::set_unused_default_value(void)
{
ms.error_clean = 0;
ms.iic_config = 0;
ms.iic_config_addr = 0;
ms.pick_paper = 0;
ms.scan_enable = 0;
ms.status_init = 0;
ms.v_setting = 0;
ms.speed_set_enable = 0;
ms.key_staple_enable = 0;
}

25
config_new.h Normal file
View File

@ -0,0 +1,25 @@
#pragma once
#include "IConfig.h"
#include "PublicFunc.h"
#include "device_common.h"
#include <map>
class config_new :
public IConfig
{
public :
config_new(SFreeImage param);
virtual ~config_new(void);
virtual unsigned int GetData() override;
private:
void init_paperdic(void);
void init_colormodedic(void);
void init_dpidic(void);
void set_unused_default_value(void);
private:
std::map<unsigned short, unsigned int> paperTypes;
std::map<unsigned short, unsigned int> pixType;
std::map<float, unsigned int> resolutions;
MotorSetting ms;
};

View File

@ -127,6 +127,7 @@ typedef union Motor_Mode {
unsigned int scan_num : 14;
unsigned int scan_mode : 2;
unsigned int feeding_paper_ready : 1;
unsigned int scan_status : 1;
};
} MotorMode;

BIN
hugaotwainds.aps Normal file

Binary file not shown.

View File

@ -220,6 +220,7 @@
<ClCompile Include="CJsonObject.cpp" />
<ClCompile Include="CommonDS.cpp" />
<ClCompile Include="CommonTWAIN.cpp" />
<ClCompile Include="config_new.cpp" />
<ClCompile Include="CScanner_FreeImage.cpp" />
<ClCompile Include="CTiffWriter.cpp" />
<ClCompile Include="CTWAINDS_Base.cpp" />
@ -291,6 +292,7 @@
<ClInclude Include="Common.h" />
<ClInclude Include="CommonDS.h" />
<ClInclude Include="CommonTWAIN.h" />
<ClInclude Include="config_new.h" />
<ClInclude Include="CScanner_FreeImage.h" />
<ClInclude Include="CTiffWriter.h" />
<ClInclude Include="CTWAINDS_Base.h" />
@ -305,6 +307,7 @@
<ClInclude Include="GScanO200.h" />
<ClInclude Include="gscn_drv.h" />
<ClInclude Include="hugaotwainds.h" />
<ClInclude Include="IConfig.h" />
<ClInclude Include="IGDevice.h" />
<ClInclude Include="ImageAdjustColors.h" />
<ClInclude Include="ImageApply.h" />

View File

@ -201,6 +201,9 @@
<ClCompile Include="ImageMultiOutput.cpp">
<Filter>图像处理</Filter>
</ClCompile>
<ClCompile Include="config_new.cpp">
<Filter>代码文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="hugaotwainds.def">
@ -421,6 +424,12 @@
<ClInclude Include="GScanO200.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="IConfig.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="config_new.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="hugaotwainds.rc">

View File

@ -12,7 +12,7 @@
<DebuggerFlavor Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LocalDebuggerCommand>C:\Users\holdtecs\Desktop\极课Twain测试小软件release32bit\Sample.WPF.exe</LocalDebuggerCommand>
<LocalDebuggerCommand>E:\软件安装包\xnviewer\xnviewer\xnview.exe</LocalDebuggerCommand>
<LocalDebuggerWorkingDirectory>..\..\..\..\Windows\twain_32\huagoscan</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>

View File

@ -117,7 +117,7 @@ void hgConfigClass::setSkewDelection(bool value)
setBit(11, value);
}
UINT32 hgConfigClass::GetData()
unsigned int hgConfigClass::GetData()
{
return m_data.to_ulong();
}

View File

@ -5,17 +5,18 @@
#include <map>
#include <bitset>
#include "PublicFunc.h"
#include "IConfig.h"
typedef unsigned short uint16_t;
class hgConfigClass
class hgConfigClass:public IConfig
{
public:
hgConfigClass();
hgConfigClass(SFreeImage param);
~hgConfigClass();
virtual ~hgConfigClass();
UINT32 GetData();
virtual unsigned int GetData() override;
private:
enum Config_Scanner
{