1.新增加IConfig虚拟类,以适配新版本参数配置类config_new

2.增加imagematqueue类中锁其他线程修改类成员变量锁不生效问题;
This commit is contained in:
pm 2019-12-07 17:57:00 +08:00
parent 72e9dd0078
commit 3b35c7808c
12 changed files with 184 additions and 47 deletions

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

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
{