diff -r 000000000000 -r 4e1aa6a622a0 accessoryservices/pluggeddisplay/pluggeddisplayengine/src/hdmicablestateconnected.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/hdmicablestateconnected.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,995 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of "Connected" state of HDMI Cable Status FSM. +* +*/ + + + +#include +#include + + +#include "pdeconstants.h" +#include "accessorycontrolif.h" +#include "hdmicablestatusfsm.h" +#include "hdmicablestateconnected.h" +#include "tvoutconfigforhdmi.h" +#include "edidhandler.h" +#include "trace.h" + + + + +// ======== LOCAL FUNCTIONS ======== + + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +//Symbian two-phased constructor +// --------------------------------------------------------------------------- +// +CHDMICableStateConnected* CHDMICableStateConnected::NewL( + CTVOutConfigForHDMI& aTVOutConfigForCableConnect, + CEDIDHandler& aEDIDHandler, + CAccessoryControlIf& aAccessoryControlIf, + CHDMICableStatusFSM& aHDMICableStatusFSM ) + { + FUNC_LOG; + CHDMICableStateConnected* self = new ( ELeave ) CHDMICableStateConnected( + aTVOutConfigForCableConnect, + aEDIDHandler, aAccessoryControlIf, + aHDMICableStatusFSM ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CHDMICableStateConnected::~CHDMICableStateConnected() + { + FUNC_LOG; + if ( iTVOutConfigForCopyProtect ) + { + iTVOutConfigForCopyProtect->Cancel(); + delete iTVOutConfigForCopyProtect; + } + if ( iTVOutConfigForSettingChanges ) + { + iTVOutConfigForSettingChanges->Cancel(); + delete iTVOutConfigForSettingChanges; + } + } + + +// --------------------------------------------------------------------------- +// From MFSMState. +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::Enter( ) + { + FUNC_LOG; + TInt retVal( KErrNone ); + iCopyProtectListenFailCounter.iCount = 0; + iTVOutConfigForCopyProtect->ResetLatestRecordedCopyProtectionStatus(); + retVal = iEDIDHandler.FetchEDIDData(); + if ( KErrNone != retVal ) + { + INFO( "Going to state since iEDIDHandler.FetchEDIDData() failed!" ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + iSubState = ESubStateFechEdidData; + } + } + + +// --------------------------------------------------------------------------- +// From MFSMState. +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::Input( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( iSubState ) + { + case ESubStateFechEdidData: + { + SubStateFetchEdidDataInput( aInterfaceId, aEvent ); + break; + } + case ESubStateStartListenSettingsChanges: + { + CHDMICableStateConnected::SubStateStartListenConfigChangesInput( aInterfaceId, aEvent ); + break; + } + case ESubStateEnable: + { + SubStateEnableInput( aInterfaceId, aEvent ); + break; + } + case ESubStateResettingEnable: + { + SubStateResettingEnableInput( aInterfaceId, aEvent ); + break; + } + case ESubStateIdlingDisable: + { + SubStateIdlingDisableInput( aInterfaceId, aEvent ); + break; + } + case ESubStateResettingDisable: + { + SubStateResettingDisableInput( aInterfaceId, aEvent ); + break; + } + case ESubStateRejectingDisable: + { + SubStateRejectingDisableInput( aInterfaceId, aEvent ); + break; + } + case ESubStateConnectAccessory: + { + SubStateConnectAccessoryInput( aInterfaceId, aEvent ); + break; + } + case ESubStateIdlingDisconnectAccessory: + { + SubStateIdlingDisconnectAccessoryInput( aInterfaceId, aEvent ); + break; + } + case ESubStateRejectingDisconnectAccessory: + { + SubStateRejectingDisconnectAccessoryInput( aInterfaceId, aEvent ); + break; + } + case ESubStateConnected: + { + SubStateConnectedInput( aInterfaceId, aEvent ); + break; + } + case ESubStateWaitForSettingsChanged: + { + SubStateWaitForSettingsChangedInput( aInterfaceId, aEvent ); + break; + } + default: + { + INFO_1( "Unexpected Event Id: %i", aEvent ); + INFO_1( "From interface Id: %i", aInterfaceId ); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// From MFSMState. +// --------------------------------------------------------------------------- +// +TFSMState CHDMICableStateConnected::Id() + { + FUNC_LOG; + TFSMState tempStateId( EHDMICableStateConnected ); + INFO_1( "State's id: %i", tempStateId ); + return tempStateId; + } + +// --------------------------------------------------------------------------- +// From MFSMState. +// --------------------------------------------------------------------------- +// +TPtrC CHDMICableStateConnected::Name() + { + FUNC_LOG; + TPtrC temp( KHDMICableStateConnected ); + INFO_1( "State's name: %s", temp.Ptr() ); + return temp; + } + +// --------------------------------------------------------------------------- +// From MFSMState. +// --------------------------------------------------------------------------- +// +TFSMState CHDMICableStateConnected::SubId() + { + FUNC_LOG; + TFSMState tempSubstateId( iSubState ); + INFO_1( "Substate's id: %i", tempSubstateId ); + return tempSubstateId; + } + +// --------------------------------------------------------------------------- +// ListenCopyProtectionStatusChanges. +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::ListenCopyProtectionStatusChanges() + { + FUNC_LOG; + TCopyProtctListenRetValues retStruct = iTVOutConfigForCopyProtect->ListenCopyProtectionIfNoMissedEvents(); + if ( EIfTVOutConfigEventSetCopyProtectStatusChanged == retStruct.iFSMEventId ) + { + // Copy Protection status changed while not listening + Input( EPDEIfTVOutConfig, EIfTVOutConfigEventSetCopyProtectStatusChanged ); + } + else if ( EIfTVOutConfigEventCopyProtectionListenFailed == retStruct.iFSMEventId ) + { + iHDMICableStatusFSM.CopyProtectionListenFailed( retStruct.iError ); + } + } + +// --------------------------------------------------------------------------- +// SubStateFetchEdidDataInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateFetchEdidDataInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfEDIDHandler: + { + INFO( "Interface: EPDEIfEDIDHandler" ); + if ( EPDEIfEDIDHandlerEventEdidDataFetched == aEvent ) + { + INFO( "Event: EPDEIfEDIDHandlerEventEDdidDataFetched" ); + if ( !iTVOutConfigForHDMI.GetTvOutConfig()->HdmiCableConnected() ) + { + INFO( "Retreating back to since cable was disconnected while not listening!" ); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else + { + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Retreating back to since cable was disconnected while not listening!" ); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else + { + iTVOutConfigForSettingChanges->ListenSettingsChanges(); + iSubState = ESubStateStartListenSettingsChanges; + } + } + } + else if ( EPDEIfEDIDHandlerEventEdidDataFetchFailed == aEvent ) + { + INFO( "Event: EPDEIfEDIDHandlerEventEDdidDataFetchFailed" ); + INFO( "Going to state " ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateStartListenConfigChangesInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateStartListenConfigChangesInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventSettingsChangesListenStarted == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChangesListenStarted" ); + if ( !iTVOutConfigForHDMI.GetTvOutConfig()->HdmiCableConnected() ) + { + INFO( "Retreating back to since cable was disconnected while not listening!" ); + iTVOutConfigForSettingChanges->Cancel(); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else + { + TInt retVal = iEDIDHandler.SetVideoParameters(); + if ( KErrNone != retVal ) + { + INFO( "Going to state since video parameter setting failed!" ); + iTVOutConfigForSettingChanges->Cancel(); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Retreating back to since cable was disconnected while not listening!" ); + iTVOutConfigForSettingChanges->Cancel(); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else + { + iSubState = ESubStateWaitForSettingsChanged; + } + } + } + } + else if ( EIfTVOutConfigEventSettingsChangesListenFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChangesListenFailed" ); + INFO( "Going to state since TV Out Settings Change listening failed!" ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateEnableInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateEnableInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventEnabled == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventEnabled" ); + if ( !iTVOutConfigForHDMI.GetTvOutConfig()->HdmiCableConnected() ) + { + INFO( "Disabling since cable was disconnected while not listening!" ); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + TInt retVal( KErrNone ); + TBool copyProtectStatus = iTVOutConfigForCopyProtect->GetTvOutConfig()->CopyProtectionStatus(); + TRAP( retVal, iAccessoryControlIf.ConnectAccessoryL( copyProtectStatus ) ); + if ( KErrNone != retVal ) + { + INFO_1( "Rejecting since CAccessoryControlIf::ConnectAccessoryL() failed, error code %i", retVal ); + iSubState = ESubStateRejectingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + iSubState = ESubStateConnectAccessory; + } + } + } + else if ( EIfTVOutConfigEventEnableFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventEnableFailed" ); + INFO( "Going to state since TV Out Enabling failed!" ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateResettingEnableInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateResettingEnableInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventEnabled == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventEnabled" ); + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Disabling since cable was disconnected while not listening!" ); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + iSubState = ESubStateConnected; + TRAPD( err, iHDMICableStatusFSM.SettingsChangedL() ); + if ( KErrNone != err ) + { + INFO_1( "iHDMICableStatusFSM.SettingsChangedL() failed, error code %i", err ); + } + ListenCopyProtectionStatusChanges(); + iTVOutConfigForSettingChanges->ListenSettingsChanges(); + } + } + else if ( EIfTVOutConfigEventEnableFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventEnableFailed" ); + INFO( "Going to state since TV Out Enabling failed!" ); + iSubState = ESubStateRejectingDisconnectAccessory; + iAccessoryControlIf.DisconnectAccessory(); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateIdlingDisableInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateIdlingDisableInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventDisabled == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventDisabled" ); + iSubState = ESubStateIdlingDisconnectAccessory; + iAccessoryControlIf.DisconnectAccessory(); + } + else if ( EIfTVOutConfigEventDisableFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventDisableFailed" ); + iSubState = ESubStateIdlingDisconnectAccessory; + iAccessoryControlIf.DisconnectAccessory(); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateResettingDisableInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateResettingDisableInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventDisabled == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventDisabled" ); + iSubState = ESubStateResettingEnable; + iTVOutConfigForHDMI.Enable(); + } + else if ( EIfTVOutConfigEventDisableFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventDisableFailed" ); + iSubState = ESubStateRejectingDisconnectAccessory; + iAccessoryControlIf.DisconnectAccessory(); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// SubStateRejectingDisableInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateRejectingDisableInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventDisabled == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventDisabled" ); + iSubState = ESubStateRejectingDisconnectAccessory; + iAccessoryControlIf.DisconnectAccessory(); + } + else if ( EIfTVOutConfigEventDisableFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventDisableFailed" ); + iSubState = ESubStateRejectingDisconnectAccessory; + iAccessoryControlIf.DisconnectAccessory(); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// SubStateConnectAccessoryInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateConnectAccessoryInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfAccessoryControl: + { + INFO( "Interface: EPDEIfAccessoryControl" ); + if ( EPDEIfAccessoryControlEventConnected == aEvent ) + { + INFO( "Event: EPDEIfAccessoryControlEventConnected" ); + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Event: EIfTVOutConfigEventCableDisconnected occurred while connecting" ); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + iSubState = ESubStateConnected; + ListenCopyProtectionStatusChanges(); + iTVOutConfigForSettingChanges->ListenSettingsChanges(); + } + } + else if ( EPDEIfAccessoryControlEventConnectFailed == aEvent ) + { + INFO( "Event: EPDEIfAccessoryControlEventConnectFailed" ); + iSubState = ESubStateRejectingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateIdlingDisconnectAccessoryInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateIdlingDisconnectAccessoryInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfAccessoryControl: + { + INFO( "Interface: EPDEIfAccessoryControl" ); + if ( EPDEIfAccessoryControlEventDisconnected == aEvent ) + { + INFO( "Event: EPDEIfAccessoryControlEventDisconnected" ); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else if ( EPDEIfAccessoryControlEventDisconnectFailed == aEvent ) + { + INFO( "Event: EPDEIfAccessoryControlEventDisconnectFailed" ); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateRejectingDisconnectAccessoryInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateRejectingDisconnectAccessoryInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfAccessoryControl: + { + INFO( "Interface: EPDEIfAccessoryControl" ); + if ( EPDEIfAccessoryControlEventDisconnected == aEvent ) + { + INFO( "Event: EPDEIfAccessoryControlEventDisconnected" ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else if ( EPDEIfAccessoryControlEventDisconnectFailed == aEvent ) + { + INFO( "Event: EPDEIfAccessoryControlEventDisconnectFailed" ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateConnectedInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateConnectedInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfAsyCommandHandler: + { + INFO( "Interface: EPDEIfAsyCommandHandler" ); + if ( EIfAsyCommandHandlerEventSetCopyProtectionOn == aEvent ) + { + INFO( "Event: EIfAsyCommandHandlerEventSetCopyProtectionOn" ); + TInt retVal = iTVOutConfigForCopyProtect->GetTvOutConfig()->CopyProtection( ETrue ); + iHDMICableStatusFSM.CopyProtectionSettingDone( retVal ); + } + else if ( EIfAsyCommandHandlerEventSetCopyProtectionOff == aEvent ) + { + INFO( "Event: EIfAsyCommandHandlerEventSetCopyProtectionOff" ); + TInt retVal = iTVOutConfigForCopyProtect->GetTvOutConfig()->CopyProtection( EFalse ); + iHDMICableStatusFSM.CopyProtectionSettingDone( retVal ); + } + else if ( EIfAsyCommandHandlerEventGetCopyProtectStatus == aEvent ) + { + INFO( "Event: EIfAsyCommandHandlerEventGetCopyProtectStatus" ); + TBool copyProtectStatus = iTVOutConfigForCopyProtect->GetTvOutConfig()->CopyProtectionStatus(); + iHDMICableStatusFSM.CopyProtectionStatusGot( copyProtectStatus ); + } + break; + } + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventCableConnected == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventCableConnected" ); + // Re-issue request for connection notification + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Event: EIfTVOutConfigEventCableDisconnected occurred while not listening" ); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes + iTVOutConfigForSettingChanges->Cancel(); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + } + else if ( EIfTVOutConfigEventCableDisconnected == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventCableDisconnected" ); + iSubState = ESubStateIdlingDisable; + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes + iTVOutConfigForSettingChanges->Cancel(); + // Disable tv out + iTVOutConfigForHDMI.Disable(); + } + else if ( EIfTVOutConfigEventCableStatusListenFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventCableStatusListenFailed" ); + ++iCableStatusListenFailCounter.iCounter; + if ( SCableStatusListenFailCounter::EMaxCounterValue <= iCableStatusListenFailCounter.iCounter ) + { + INFO( "Max number of Cable Status listen failures reached. Retiring to " ); + iSubState = ESubStateRejectingDisable; + iCableStatusListenFailCounter.iCounter = 0; + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes + iTVOutConfigForSettingChanges->Cancel(); + iTVOutConfigForHDMI.Disable(); + } + else + { + // Try once again + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Event: EIfTVOutConfigEventCableDisconnected occurred while not listening" ); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes + iTVOutConfigForSettingChanges->Cancel(); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + } + } + else if ( EIfTVOutConfigEventSetCopyProtectStatusChanged == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSetCopyProtectStatusChanged" ); + TBool latestStatus = iTVOutConfigForCopyProtect->GetLatestRecordedCopyProtectionStatus(); + iHDMICableStatusFSM.CopyProtectionStatusChanged( latestStatus ); + ListenCopyProtectionStatusChanges(); + } + else if ( EIfTVOutConfigEventCopyProtectionListenFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventCopyProtectionListenFailed" ); + ++iCopyProtectListenFailCounter.iCount; + if ( SCopyProtectListenFailCounter::ECounterMaxValue < iCopyProtectListenFailCounter.iCount ) + { + iHDMICableStatusFSM.CopyProtectionListenFailed( iTVOutConfigForCopyProtect->iStatus.Int() ); + // Try again + ListenCopyProtectionStatusChanges(); + } + else + { + INFO( "Max number of Copy Protection Status listen failures reached. Retiring to " ); + iCopyProtectListenFailCounter.iCount = 0; + // Stop listening cable status changes while disabling. + iTVOutConfigForHDMI.Cancel(); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + iSubState = ESubStateRejectingDisable; + iTVOutConfigForHDMI.Disable(); + } + } + else if ( EIfTVOutConfigEventSettingsChanged == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChanged" ); + // Stop listening cable connection status + iTVOutConfigForHDMI.Cancel(); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + if ( iTVOutConfigForHDMI.GetTvOutConfig()->Enabled() ) + { + iSubState = ESubStateResettingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + iSubState = ESubStateResettingEnable; + iTVOutConfigForHDMI.Enable(); + } + } + else if ( EIfTVOutConfigEventSettingsChangesListenStarted ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChangesListenStarted" ); + // Everything is OK. Stay in the same state. + } + else if ( EIfTVOutConfigEventSettingsChangesListenFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChangesListenFailed" ); + INFO( "Going to state since setting changes listening failed!" ); + iSubState = ESubStateRejectingDisable; + // Stop listening cable connection status + iTVOutConfigForHDMI.Cancel(); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + iTVOutConfigForHDMI.Disable(); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// SubStateWaitForSettingsChangedInput +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::SubStateWaitForSettingsChangedInput( + TFSMInterfaceId aInterfaceId , + TFSMEventId aEvent ) + { + FUNC_LOG; + switch ( aInterfaceId ) + { + case EPDEIfTVOutConfig: + { + INFO( "Interface: TPDEIfTVOutConfig" ); + if ( EIfTVOutConfigEventCableConnected == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventCableConnected" ); + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Retreating back to since cable was disconnected while WF setting changes!" ); + iTVOutConfigForSettingChanges->Cancel(); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + } + else if ( EIfTVOutConfigEventCableDisconnected == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventCableDisconnected" ); + INFO( "Retreating back to since cable was disconnected while WF setting changes!" ); + iTVOutConfigForSettingChanges->Cancel(); + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } + else if ( EIfTVOutConfigEventSettingsChanged == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChanged" ); + iSubState = ESubStateEnable; + iTVOutConfigForHDMI.Enable(); + } + else if ( EIfTVOutConfigEventSettingsChangesListenFailed == aEvent ) + { + INFO( "Event: EIfTVOutConfigEventSettingsChangesListenFailed" ); + INFO( "Going to state since setting changes listening failed!" ); + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } + else + { + INFO_1( "Unknown/unexpected Event Id: %i", aEvent ); + } + break; + } + default: + { + INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::ConstructL() + { + FUNC_LOG; + iTVOutConfigForCopyProtect = CTVOutConfigForHDMI::NewL( iHDMICableStatusFSM ); + iTVOutConfigForSettingChanges = CTVOutConfigForHDMI::NewL( iHDMICableStatusFSM ); + } + + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CHDMICableStateConnected::CHDMICableStateConnected( + CTVOutConfigForHDMI& aTVOutConfigForCableConnect, + CEDIDHandler& aEDIDHandler, + CAccessoryControlIf& aAccessoryControlIf, + CHDMICableStatusFSM& aHDMICableStatusFSM ): + iTVOutConfigForHDMI( aTVOutConfigForCableConnect ), + iEDIDHandler( aEDIDHandler ), + iAccessoryControlIf( aAccessoryControlIf ), + iHDMICableStatusFSM( aHDMICableStatusFSM ) + { + FUNC_LOG; + } + + +// ======== GLOBAL FUNCTIONS ======== +