utilities/aristatemachine/src/aristatemachine.cpp
author Pat Downey <patd@symbian.org>
Fri, 23 Jul 2010 16:58:44 +0100
changeset 0 bb31fbe78861
permissions -rw-r--r--
Initial commit of Aricent codec contribution.

	/*
* Copyright (c) 2009 Aricent and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Aricent - initial contribution.
*
* Contributors:
*
* Description:
* State machine for all video hwdevice plugins.
*
*/

//User includes
#include "aristatemachine.h"

//---------------------------------------------------------------------------
//Default Constrcutor.
//---------------------------------------------------------------------------
//
CStateMachine::CStateMachine():iState( EUnInitialized )
	{
	PRINT_ENTRY;
	// Initailization
	for ( TInt i = 0; i < KNumOfStates; i++ )
		{
		for ( TInt j = 0; j < KNumOfCommands; j++ )
			{
			iStateChanges [i][j] = EInvalidState;
			}
		}

	// set the valid transition states in the table

	// valid state changes from Uninitailize
	iStateChanges [EUnInitialized][EInitializeCommand] = EInitialized;
	iStateChanges [EUnInitialized][EInitializingCommand] = EInitializing;
	iStateChanges [EUnInitialized][EDeadStateCommand]
	                               = ENonInitializedDeadState;


	// valid state changes from Initailize
	iStateChanges [EInitialized][EStartCommand]		= EStart;
	iStateChanges [EInitialized][EPauseCommand]		= EPause;
	iStateChanges [EInitialized][EResumeCommand]	= EStart;
	iStateChanges [EInitialized][EInputEndCommand]	= EInitializedInStopping;
	iStateChanges [EInitialized][EStopCommand]		= EStop;
	iStateChanges [EInitialized][EDeadStateCommand]	= EInitializedDeadState;

	iStateChanges [EInitializing][EDeadStateCommand] = EInitializedDeadState;
	iStateChanges [EInitializing][EInitializeCommand]	= EInitialized;

	// valid state changes from Start
	iStateChanges [EStart][EStartCommand]		= EStart;
	iStateChanges [EStart][EPauseCommand]		= EPause;
	iStateChanges [EStart][EInputEndCommand]	= EStopping;
	iStateChanges [EStart][EStopCommand]		= EStop;
	iStateChanges [EStart][EDeadStateCommand]	= ENonInitializedDeadState;

	// valid  State changes from pause
	iStateChanges [EPause][EPauseCommand]		= EPause;
	iStateChanges [EPause][EResumeCommand]		= EStart;
	iStateChanges [EPause][EInputEndCommand]	= EPauseInStopping;
	iStateChanges [EPause][EStopCommand]		= EStop;
	iStateChanges [EPause][EDeadStateCommand]	= ENonInitializedDeadState;

	// valid state changes from Stop
	iStateChanges [EStop][EStartCommand]	= EStart;
	iStateChanges [EStop][EInputEndCommand] = EStopInInputEnd;
	iStateChanges [EStop][EStopCommand]		= EStop;
	iStateChanges [EStop][EDeadStateCommand]= ENonInitializedDeadState;

	// valid state changes from InitailizeInStopping
	iStateChanges [EInitializedInStopping][EStartCommand] = EStopping;
	iStateChanges [EInitializedInStopping][EDeadStateCommand]
	                                       = ENonInitializedDeadState;

	// valid  State Changes from EStopping
	iStateChanges [EStopping][EPauseCommand] = EPauseInStopping;
	iStateChanges [EStopping][EStopCommand]	 = EStop;
	iStateChanges [EStopping][EDeadStateCommand] = ENonInitializedDeadState;

	// valid state changes from PauseInStopping
	iStateChanges [EPauseInStopping][EResumeCommand] = EStopping;
	iStateChanges [EPauseInStopping][EStopCommand] = EStop;
	iStateChanges [EPauseInStopping][EDeadStateCommand]
	                                 = ENonInitializedDeadState;

	// valid state changes frm StopInInputEnd
	iStateChanges [EStopInInputEnd][EStartCommand] = EStopping;
	iStateChanges [EStopInInputEnd][EStopCommand] = EStop;
	iStateChanges [EStopInInputEnd][EDeadStateCommand]
	                                = ENonInitializedDeadState;
	}

//---------------------------------------------------------------------------
//Constrcutor.
//---------------------------------------------------------------------------
//
EXPORT_C CStateMachine* CStateMachine::NewL()
	{
	PRINT_ENTRY;
	CStateMachine* self = new ( ELeave ) CStateMachine();
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop();
	PRINT_EXIT;
	return( self );
	}

//---------------------------------------------------------------------------
//Symbian 2nd Phase Constrcutor.
//---------------------------------------------------------------------------
//
void CStateMachine::ConstructL()
	{
	PRINT_ENTRY;
	PRINT_EXIT;
	}

//---------------------------------------------------------------------------
//Checks whether transition to new state is possible or not.
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsTransitionValid( TCommand aCommand )
	{
	PRINT_ENTRY;

	if ( iStateChanges[iState][aCommand] != EInvalidState )
		{
		PRINT_EXIT;
		return( ETrue );
		}
	else
		{
		PRINT_EXIT;
		return( EFalse );
		}
	}

//---------------------------------------------------------------------------
//Transits to new state. If transition cann't be done, object will remain in
//the previous state.
//---------------------------------------------------------------------------
//
EXPORT_C TInt CStateMachine::Transit( TCommand aCommand )
	{
	PRINT_ENTRY;
	if ( !IsTransitionValid ( aCommand ) )
		{
		return KErrGeneral;
		}
	iState = iStateChanges[iState][aCommand];
	PRINT_EXIT;
	return KErrNone;
	}

//---------------------------------------------------------------------------
//Tells whether the state is initialized or not. Here initilized means if the
//state is in any state other than EUnInitialized
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsInitialized()
	{
	PRINT_ENTRY;
	if ( iState	!=	EUnInitialized )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether the state is exactly in EInitialized state or not.
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsInInitializedState()
	{
	PRINT_ENTRY;
	if ( iState	==	EInitialized )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether the state is initializing or not.
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsInitializing()
	{
	PRINT_ENTRY;
	if ( iState	==	EInitializing )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether the state is in any one of the input ending
//states i.e
//EInitializedInStopping,
//EStopping,
//EPauseInStopping,
//EStopInInputEnd
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsInputEndPending()
	{
	PRINT_ENTRY;
	if ( iState == EInitializedInStopping ||
		iState == EStopping ||
		iState == EPauseInStopping ||
		iState == EStopInInputEnd )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether state is in EStart state
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsStarted()
	{
	PRINT_ENTRY;
	if ( iState == EStart )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether stae is in EPlaying state
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsPlaying()
	{
	PRINT_ENTRY;
	if ( iState == EStart || iState == EStopping )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether state is in EPause state
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsPaused()
	{
	PRINT_ENTRY;
	if ( ( iState == EPause ) || ( iState == EPauseInStopping ) )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether stae is in EStop state
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsStopped()
	{
	PRINT_ENTRY;
	if ( iState == EStop )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Tells whether stae is in EInitailize or not
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IfIsStateInInitailize()
	{
	PRINT_ENTRY;
	if ( iState == EInitialized )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Resets the state machine to EUnInitialized state.
//---------------------------------------------------------------------------
//
EXPORT_C void CStateMachine::Reset()
	{
	PRINT_ENTRY;
	iState	=	EUnInitialized;
	PRINT_EXIT;
	}



//---------------------------------------------------------------------------
//Tells whether stae is in EDeadState state
//---------------------------------------------------------------------------
//
EXPORT_C TBool CStateMachine::IsInDeadState()
	{
	PRINT_ENTRY;
	if ( ( iState == EInitializedDeadState ) ||
		 ( iState == ENonInitializedDeadState ) )
		{
		PRINT_EXIT;
		return ETrue;
		}
	else
		{
		PRINT_EXIT;
		return EFalse;
		}
	}

//---------------------------------------------------------------------------
//Destructor for StateMachine
//---------------------------------------------------------------------------
//
CStateMachine::~CStateMachine()
	{}