📄 rangermanager.cpp
字号:
#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 + -