diff -r 61516c5786af -r 00076e39386f accessoryservices/pluggeddisplay/pluggeddisplayengine/src/hdmicablestateconnected.cpp --- a/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/hdmicablestateconnected.cpp Wed Jun 23 22:58:50 2010 +0100 +++ b/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/hdmicablestateconnected.cpp Thu Jul 22 16:45:41 2010 +0100 @@ -28,6 +28,9 @@ #include "tvoutconfigforhdmi.h" #include "edidhandler.h" #include "trace.h" +#include +#include +#include @@ -77,8 +80,73 @@ iTVOutConfigForSettingChanges->Cancel(); delete iTVOutConfigForSettingChanges; } + if ( iCRWatchForVOverScan ) + { + iCRWatchForVOverScan->Cancel(); + delete iCRWatchForVOverScan; + } } +// --------------------------------------------------------------------------- +// From MCentralRepositoryObserver. +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::CentRepKeyChanged( + TUid aRepositoryId, + TUint32 aId ) + { + FUNC_LOG; + if ( KCRUidTvoutSettings == aRepositoryId ) + { + if ( KSettingsTvoutVerticalOverscan == aId ) + { + INFO("Cenrep Value Changed"); + if( iEDIDHandler.UpdateOverscanValues() ) + { + INFO( "There is a real change" ); + Input( EPDEIfCentralRepositoryWatch, EPDEIfCentralRepositoryWatchEventKeyChanged ); + } + } + else + { + INFO_1("Unexpected CR key ID, aId 0x%x", aId ); + } + } + else + { + INFO_1("Unexpected Central Repository ID, aRepositoryId 0x%x", aRepositoryId); + } + + } + +// --------------------------------------------------------------------------- +// From MCentralRepositoryObserver. +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::CentRepGetKeyValueFailed( + TUid aRepositoryId, + TUint32 aId, + TInt aError ) + { + FUNC_LOG; + // Make use of aError argument top get rid of compiler warning. + TInt error( aError ); + if ( ( KCRUidTvoutSettings == aRepositoryId ) && ( KErrNone != error ) ) + { + if ( KSettingsTvoutVerticalOverscan == aId ) + { + INFO_1(" Getting KSettingsTvoutVerticalOverscan from CR failed, aError %d", error ); + } + else + { + INFO_1("Unexpected CR key ID, aId 0x%x", aId ); + } + } + else + { + INFO_1("Unexpected Central Repository ID, aRepositoryId 0x%x", aRepositoryId); + } + } // --------------------------------------------------------------------------- // From MFSMState. @@ -88,6 +156,11 @@ { FUNC_LOG; TInt retVal( KErrNone ); + + // Get the current overscan value + iEDIDHandler.UpdateOverscanValues(); + iEDIDHandler.GetCurrentOverscanValue( iHOverscanValue, iVOverscanValue ); + iCopyProtectListenFailCounter.iCount = 0; iTVOutConfigForCopyProtect->ResetLatestRecordedCopyProtectionStatus(); retVal = iEDIDHandler.FetchEDIDData(); @@ -330,6 +403,9 @@ } else { + // Update the current overscan value + iEDIDHandler.GetCurrentOverscanValue( iHOverscanValue, iVOverscanValue ); + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); if ( EIfTVOutConfigEventCableDisconnected == event ) { @@ -451,6 +527,7 @@ else { iSubState = ESubStateConnected; + TRAPD( err, iHDMICableStatusFSM.SettingsChangedL() ); if ( KErrNone != err ) { @@ -458,6 +535,7 @@ } ListenCopyProtectionStatusChanges(); iTVOutConfigForSettingChanges->ListenSettingsChanges(); + iCRWatchForVOverScan->Watch(); } } else if ( EIfTVOutConfigEventEnableFailed == aEvent ) @@ -500,12 +578,14 @@ INFO( "Event: EIfTVOutConfigEventDisabled" ); iSubState = ESubStateIdlingDisconnectAccessory; iAccessoryControlIf.DisconnectAccessory(); + ClearAvailableTvOutConfig(); } else if ( EIfTVOutConfigEventDisableFailed == aEvent ) { INFO( "Event: EIfTVOutConfigEventDisableFailed" ); iSubState = ESubStateIdlingDisconnectAccessory; iAccessoryControlIf.DisconnectAccessory(); + ClearAvailableTvOutConfig(); } else { @@ -632,6 +712,7 @@ iSubState = ESubStateConnected; ListenCopyProtectionStatusChanges(); iTVOutConfigForSettingChanges->ListenSettingsChanges(); + iCRWatchForVOverScan->Watch(); } } else if ( EPDEIfAccessoryControlEventConnectFailed == aEvent ) @@ -780,6 +861,7 @@ iTVOutConfigForCopyProtect->Cancel(); // Stop listen setting changes iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); iSubState = ESubStateIdlingDisable; iTVOutConfigForHDMI.Disable(); } @@ -792,6 +874,7 @@ iTVOutConfigForCopyProtect->Cancel(); // Stop listen setting changes iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); // Disable tv out iTVOutConfigForHDMI.Disable(); } @@ -808,6 +891,7 @@ iTVOutConfigForCopyProtect->Cancel(); // Stop listen setting changes iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); iTVOutConfigForHDMI.Disable(); } else @@ -821,6 +905,7 @@ iTVOutConfigForCopyProtect->Cancel(); // Stop listen setting changes iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); iSubState = ESubStateIdlingDisable; iTVOutConfigForHDMI.Disable(); } @@ -851,6 +936,7 @@ iTVOutConfigForHDMI.Cancel(); // Stop listening Copy Protection status iTVOutConfigForCopyProtect->Cancel(); + iCRWatchForVOverScan->Cancel(); iSubState = ESubStateRejectingDisable; iTVOutConfigForHDMI.Disable(); } @@ -862,6 +948,7 @@ iTVOutConfigForHDMI.Cancel(); // Stop listening Copy Protection status iTVOutConfigForCopyProtect->Cancel(); + iCRWatchForVOverScan->Cancel(); if ( iTVOutConfigForHDMI.GetTvOutConfig()->Enabled() ) { iSubState = ESubStateResettingDisable; @@ -873,10 +960,17 @@ iTVOutConfigForHDMI.Enable(); } } - else if ( EIfTVOutConfigEventSettingsChangesListenStarted ) + else if ( EIfTVOutConfigEventSettingsChangesListenStarted == aEvent ) { INFO( "Event: EIfTVOutConfigEventSettingsChangesListenStarted" ); // Everything is OK. Stay in the same state. + // Should not miss the cenrep value change + TInt newOverScanValue = 0; + iCRWatchForVOverScan->GetCurrentValue(newOverScanValue); + if( iVOverscanValue != newOverScanValue ) + { + Input( EPDEIfCentralRepositoryWatch, EPDEIfCentralRepositoryWatchEventKeyChanged ); + } } else if ( EIfTVOutConfigEventSettingsChangesListenFailed == aEvent ) { @@ -887,6 +981,7 @@ iTVOutConfigForHDMI.Cancel(); // Stop listening Copy Protection status iTVOutConfigForCopyProtect->Cancel(); + iCRWatchForVOverScan->Cancel(); iTVOutConfigForHDMI.Disable(); } else @@ -895,6 +990,53 @@ } break; } + case EPDEIfCentralRepositoryWatch: + { + INFO( "Interface: EPDEIfCentralRepositoryWatch" ); + if ( EPDEIfCentralRepositoryWatchEventKeyChanged == aEvent ) + { + INFO( "Event: EPDEIfCentralRepositoryWatchEventKeyChanged" ); + + // Get the available config + THdmiDviTimings curConfig; + + iTVOutConfigForHDMI.GetTvOutConfig()->GetConfig( curConfig ); + + if( (TTvSettings::EHDMI == curConfig.iConnector) && (!curConfig.iUnderscanEnabled) ) + { + + TInt retVal = iEDIDHandler.SetVideoParameters(); + if ( KErrNone != retVal ) + { + INFO( "Going to state since video parameter setting failed!" ); + iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + // Update the current overscan value + iEDIDHandler.GetCurrentOverscanValue( iHOverscanValue, iVOverscanValue ); + + TFSMEventId event = iTVOutConfigForHDMI.ListenHDMICableStatusIfNoMissedEvents(); + if ( EIfTVOutConfigEventCableDisconnected == event ) + { + INFO( "Retreating back to since cable was disconnected while not listening!" ); + iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + } + } + } + else + { + INFO_1( "Unknown Event Id: %i", aEvent ); + } + break; + } default: { INFO_1( "Event received from unknown/unexpected interface Id: %i", aInterfaceId ); @@ -924,16 +1066,43 @@ if ( EIfTVOutConfigEventCableDisconnected == event ) { INFO( "Retreating back to since cable was disconnected while WF setting changes!" ); + + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes iTVOutConfigForSettingChanges->Cancel(); - iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + iCRWatchForVOverScan->Cancel(); + + if( iTVOutConfigForHDMI.GetTvOutConfig()->Enabled() ) + { + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + 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 ); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes + iTVOutConfigForSettingChanges->Cancel(); + iCRWatchForVOverScan->Cancel(); + + if( iTVOutConfigForHDMI.GetTvOutConfig()->Enabled() ) + { + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + iHDMICableStatusFSM.Transit( EHDMICableStateIdle ); + } } else if ( EIfTVOutConfigEventSettingsChanged == aEvent ) { @@ -945,7 +1114,20 @@ { INFO( "Event: EIfTVOutConfigEventSettingsChangesListenFailed" ); INFO( "Going to state since setting changes listening failed!" ); - iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + // Stop listening Copy Protection status + iTVOutConfigForCopyProtect->Cancel(); + // Stop listen setting changes + iCRWatchForVOverScan->Cancel(); + + if( iTVOutConfigForHDMI.GetTvOutConfig()->Enabled() ) + { + iSubState = ESubStateIdlingDisable; + iTVOutConfigForHDMI.Disable(); + } + else + { + iHDMICableStatusFSM.Transit( EHDMICableStateRejected ); + } } else { @@ -962,14 +1144,38 @@ } // --------------------------------------------------------------------------- +// ClearAvailableConfig +// --------------------------------------------------------------------------- +// +void CHDMICableStateConnected::ClearAvailableTvOutConfig() + { + FUNC_LOG; + + if( iTVOutConfigForHDMI.GetTvOutConfig() ) + { + RArray HdmiSettingsArray; + RArray TvSettingsArray; + + TInt err = iTVOutConfigForHDMI.GetTvOutConfig()->SetAvailableTvConfigList( TvSettingsArray, HdmiSettingsArray ); + + HdmiSettingsArray.Close(); + TvSettingsArray.Close(); + } + } + + +// --------------------------------------------------------------------------- // ConstructL // --------------------------------------------------------------------------- // void CHDMICableStateConnected::ConstructL() { FUNC_LOG; + // Create Central Repository Watchers + iCRWatchForVOverScan = CCentralRepositoryWatch::NewL(*this, KCRUidTvoutSettings, KSettingsTvoutVerticalOverscan ); + iTVOutConfigForCopyProtect = CTVOutConfigForHDMI::NewL( iHDMICableStatusFSM ); - iTVOutConfigForSettingChanges = CTVOutConfigForHDMI::NewL( iHDMICableStatusFSM ); + iTVOutConfigForSettingChanges = CTVOutConfigForHDMI::NewL( iHDMICableStatusFSM ); }