⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rangermanager.cpp

📁 支票扫描仪协议Ranger的应用.使用vc7.1
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"

#include "RangerConstants.h"
#include "ranger.h"

#include "RangerException.h"
#include "RangerEventObserver.h"
#include "RangerManager.h"
#include "RangerAsyncResult.h"
#include "RangeDataTypeHelper.h"
#include "RangerParameterBase.h"

// Condition Variable
CRangerAsyncResult<TransportState>	g_asyncResult_Start;
CRangerAsyncResult<TransportState>  g_asyncResult_EnableOption;
CRangerAsyncResult<TransportState>  g_asyncResult_StopCapture;
CRangerAsyncResult<TransportState>  g_asyncResult_EnableShutdown;
CRangerAsyncResult<TransportState>  g_asyncResult_Shutdown;

// ID of Ranger
#define ID_RANGERCTRL 1000

// Helper Macro
//-----------------------------------------------------------------------------------------------------------------------------------
#define RANGEROPERATION_CHECKVALIEDSTATE(state)													\
	do{																							\
		if (GetCurrentState() != state) return FALSE;											\
	}while(0);


 #define RANGEROPERATION_INITILIZERESULT(result)												\
	do{																							\
		result.Initialize(GetCurrentState());													\
	}while(0);

#define RANGEROPERATION_CHECKERESULT(result,desiredvalue)										\
	do{																							\
		TransportState ret;																		\
		if (!result.CheckResult(ret))															\
			ret = GetCurrentState();															\
		if (ret != (desiredvalue))			return FALSE;										\
		return TRUE;																			\
	}while(0);

#define RANGEROPERATION_CHECKERESULT_PASSIFSUCCESS(result,desiredvalue1)						\
	do{																							\
	TransportState ret;																			\
	if (!result.CheckResult(ret))																\
	ret = GetCurrentState();																	\
	if (ret != (desiredvalue1))			return FALSE;											\
	}while(0);

#define RANGEROPERATION_CHECKERESULT2(result,desiredvalue1,desiredvalue2)						\
	do{																							\
	TransportState ret;																			\
	if (!result.CheckResult((ret)))																\
	ret = GetCurrentState();																	\
	if (ret != (desiredvalue1) && ret != (desiredvalue2))			return FALSE;				\
	return TRUE;																				\
	}while(0);

#define RANGEROPERATION_CHECKERESULT2_PASSIFSUCCESS(result,desiredvalue1,desiredvalue2)			\
	do{																							\
	TransportState ret;																			\
	if (!result.CheckResult(ret))																\
	ret = GetCurrentState();																	\
	if (ret != (desiredvalue1) && ret != (desiredvalue2))			return FALSE;				\
	}while(0);

//  CRangerManager
//===================================================================================================================================
IMPLEMENT_DYNAMIC(CRangerManager, CFrameWnd)

// Message Map
BEGIN_MESSAGE_MAP(CRangerManager, CFrameWnd)
 
END_MESSAGE_MAP()


BEGIN_EVENTSINK_MAP(CRangerManager, CFrameWnd)
	//{{AFX_EVENTSINK_MAP(CRangerManager)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 1 /* TransportNewState */, OnTransportNewState, VTS_I4 VTS_I4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 2 /* TransportIsDead */, OnTransportIsDead, VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 3 /* TransportStartingUpState */, OnTransportStartingUpState  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 4 /* TransportChangeOptionsState */, OnTransportChangeOptionsState  , VTS_I4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 5 /* TransportEnablingOptionsState */, OnTransportEnablingOptionsState  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 6 /* TransportReadyToFeedState */, OnTransportReadyToFeedState  , VTS_I4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 7 /* TransportInExceptionState */, OnTransportInExceptionState  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 8 /* TransportExceptionComplete */, OnTransportExceptionComplete  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 9 /* TransportFeedingState */, OnTransportFeedingState  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 10 /* TransportShuttingDownState */, OnTransportShuttingDownState  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 11 /* TransportShutDownState */, OnTransportShutDownState  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 12 /* TransportFeedingStopped */, OnTransportFeedingStopped  , VTS_I4 VTS_I4 VTS_I4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 13 /* TransportNewItem */, OnTransportNewItem  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 14 /* TransportSetItemOutput */, OnTransportSetItemOutput  , VTS_I4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 15 /* TransportItemInPocket */, OnTransportItemInPocket, VTS_I4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 16 /* TransportOverrideOptions */, OnTransportOverrideOptions  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 17 /* TransportPassthroughEvent */, OnTransportPassthroughEvent  , VTS_BSTR VTS_BSTR VTS_PI4)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 18 /* TransportTrackIsClear */, OnTransportTrackIsClear  , VTS_NONE)
	ON_EVENT(CRangerManager, ID_RANGERCTRL, 19 /* TransportItemSuspended */, OnTransportItemSuspended  , VTS_I4)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
 

CRangerManager::CRangerManager():
	m_bInitialized(FALSE),
	m_bPrepareToOption(FALSE),
	m_bProcessingSession(FALSE),
	m_pRanger(NULL),
	m_pObserver(NULL),
	m_pRangerParams(NULL)
{
	m_pRanger = new CRanger;

	ASSERT(m_pRanger != NULL);
}


CRangerManager::~CRangerManager()
{
	Uninitialize();
}

BOOL CRangerManager::Initialize()
{
	

	if (m_pRanger == NULL) return FALSE;

	if (!Create(NULL,NULL)) return FALSE;

	CRect rc;
	GetClientRect(&rc);
 	if (!m_pRanger->CreateControl(m_pRanger->GetClsid(),NULL, WS_CHILD | ~WS_VISIBLE, rc, this, ID_RANGERCTRL)) return FALSE;
	

	m_bInitialized = TRUE;
	return TRUE;
}

BOOL CRangerManager::Uninitialize()
{
 
	//CFrameWnd::DestroyWindow();
	if (m_pRanger)
	{
		delete m_pRanger;
		m_pRanger = NULL;
	}
	return TRUE;
}

void CRangerManager::SetRangerParameter(CRangerParameterBase* pRangerParams)
{
	m_pRangerParams = pRangerParams;
	if (m_pRangerParams != NULL) m_pRangerParams->SetRangerManager(this);
}

void CRangerManager::SetObserver(IRangerEventObserver* pObserver)
{
	m_pObserver = pObserver;
}

TransportState	CRangerManager::GetCurrentState()
{
	if (m_pRanger == NULL) return Transport_UnknownState;

	return (TransportState)m_pRanger->GetTransportState();

}

CString	CRangerManager::GetCurrentStatesString()
{
	if (m_pRanger == NULL) return "";

	return m_pRanger->GetTransportStateString();
}

BOOL CRangerManager::StartUp()
{
	if (m_pRanger == NULL) return FALSE;

	if (!m_bInitialized) return FALSE;
	
	m_bPrepareToOption = FALSE;
	m_bProcessingSession = FALSE;

	// prepare
	RANGEROPERATION_CHECKVALIEDSTATE(Transport_ShutDown)
	RANGEROPERATION_INITILIZERESULT(g_asyncResult_Start)

	// execute
	if (!m_pRanger->StartUp()) return FALSE;

	// check result
	// OnTransportIsDead or OnTransportChangeOptionsState will pulse event
	RANGEROPERATION_CHECKERESULT(g_asyncResult_Start,Transport_ReadyToFeed)
}

BOOL CRangerManager::StartUpAllowed()
{
	if (m_pRanger == NULL) return FALSE;
	if (!m_bInitialized) return FALSE;

	TransportState curState = GetCurrentState();
	if (curState == Transport_ShutDown)
		return TRUE;

	return FALSE;
}

BOOL CRangerManager::StartCaptureAllowed()
{
	if (m_pRanger == NULL) return FALSE;
	if (!m_bInitialized) return FALSE;

	TransportState curState = GetCurrentState();
	if (curState == Transport_ReadyToFeed)
		return TRUE;

	return FALSE;
}

BOOL CRangerManager::StopAllowed()
{
	if (m_pRanger == NULL) return FALSE;
	if (!m_bInitialized) return FALSE;

	TransportState curState = GetCurrentState();
	if (curState == Transport_Feeding)
		return TRUE;

	return FALSE;
}

BOOL CRangerManager::ShutdownAllowed()
{
	if (m_pRanger == NULL) return FALSE;
	if (!m_bInitialized) return FALSE;

	TransportState curState = GetCurrentState();
	if (curState == Transport_ShutDown || 
		curState == Transport_ReadyToFeed ||
		curState == Transport_ChangeOptions)
		return TRUE;

	return FALSE;
}

BOOL CRangerManager::EnableOptionAllowed()
{
	if (m_pRanger == NULL) return FALSE;
	if (!m_bInitialized) return FALSE;

	TransportState curState = GetCurrentState();
	if (curState == Transport_ReadyToFeed)return TRUE;

	return FALSE;
}


BOOL CRangerManager::Shutdown()
{
	if (m_pRanger == NULL) return FALSE;

	TransportState curState = GetCurrentState();
	if (curState == Transport_ShutDown) return TRUE;

	// if scanner is in feeding,wait until the current state is Transport_ReadyToFeed or Transport_ChangeOptions.
	if (curState != Transport_ReadyToFeed &&
		curState != Transport_ChangeOptions )
	{
		RANGEROPERATION_INITILIZERESULT(g_asyncResult_EnableShutdown)
		RANGEROPERATION_CHECKERESULT2_PASSIFSUCCESS(g_asyncResult_EnableShutdown,Transport_ChangeOptions,Transport_ReadyToFeed)

 	}

	RANGEROPERATION_INITILIZERESULT(g_asyncResult_Shutdown)
	m_pRanger->ShutDown();
	RANGEROPERATION_CHECKERESULT_PASSIFSUCCESS(g_asyncResult_Shutdown,Transport_ShutDown)

	if (m_pRangerParams)
	{
		m_pRangerParams->Close();
	}

	if (m_pObserver)
	{
		m_pObserver->OnDeviceShutDown();
	}

}

BOOL CRangerManager::StartCapture(Transport_FeederSource source /*= TFS_MainHopper*/,Transport_FeederWorkMode mode/* = TFWM_Continuous*/)
{
	if (m_pRanger == NULL) return FALSE;

	m_curSource = source;
	m_curMode = mode;

	// make sure Ranger work in Transport_ReadyToFeed state
	RANGEROPERATION_CHECKVALIEDSTATE(Transport_ReadyToFeed)

	// start capture
	m_dwPageID	= 0;

	// indicate that session begin
	if (m_pObserver)	
	{
		RANGER_SESSION_BEGIN_INFO info;
		m_pObserver->OnSessionBegin(info);

	}

	// indicate that scan session in process
	m_bProcessingSession = TRUE;

	// start capture
	if (!m_pRanger->StartFeeding((long)m_curSource,(long)m_curMode))
	{
		// end of session
		if (m_pObserver && m_bProcessingSession)	
		{
			RANGER_SESSION_END_INFO info;
			m_pObserver->OnSessionEnd(info);

		}
		m_bProcessingSession = FALSE;

		return FALSE;
	}

	return TRUE;
}

BOOL CRangerManager::Stop(BOOL bWait)
{
	// Valid operation State:Transport_Feeding
	// state changes :Transport_Feeding ->Transport_ReadyToFeed

	if (m_pRanger == NULL) return FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -