accessoryservices/pluggeddisplay/pluggeddisplayengine/src/tvoutconfigforcomposite.cpp
changeset 0 4e1aa6a622a0
child 41 c87e5f80c17d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/tvoutconfigforcomposite.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,729 @@
+/*
+ * 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:
+ * CPDConfigurationListenerForHDMI class implementation.
+ *
+ */
+
+
+// INCLUDE FILES
+#include <tvoutconfig.h>
+#include <centralrepository.h>
+#include <accessoriescrkeys.h>
+
+#include "edidhandler.h"
+#include "pdeconstants.h"
+#include "multifinitestatemachine.h"
+#include "tvoutconfigforcomposite.h"
+#include "myasynconeshottimer.h"
+#include "trace.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+//Default progressive sequence
+const TTvSettings::TScanMode KDefaultScan = TTvSettings::EInterlacedScan;
+
+//Default output type
+const TTvSettings::TOutput KDefaultOutput = TTvSettings::ECompositeVideo;
+
+//Default detection mode
+const TTvSettings::TDetectionType KDefaultDetectionMode = 
+                                  TTvSettings::EAutoDetectOff;
+
+// Pixel Aspect Ratio parameters
+//PAL 4:3
+const TUint8 KPxlAspect4d3PalNumerator   = 255; // 768 but scaled to 8-bit value
+const TUint8 KPxlAspect4d3PalDenominator = 233; // 702 but scaled to 8-bit value
+//PAL 16:9
+const TUint8 KPxlAspect16d9PalNumerator  = 255; // 1024 but scaled to 8-bit value
+const TUint8 KPxlAspect16d9PalDenominator= 175; // 702 but scaled to 8-bit value
+//NTSC 4:3
+const TUint8 KPxlAspect4d3NtscNumerator   = 232; // 647 but scaled to 8-bit value
+const TUint8 KPxlAspect4d3NtscDenominator = 255; // 711 but scaled to 8-bit value
+//NTSC 16:9
+const TUint8 KPxlAspect16d9NtscNumerator  = 255; // 863 but scaled to 8-bit value
+const TUint8 KPxlAspect16d9NtscDenominator = 210; // 711 but scaled to 8-bit value
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::NewL
+//
+// ----------------------------------------------------------------------------
+//
+CTVOutConfigForComposite* CTVOutConfigForComposite::NewL( MFSMForBody& aFSM )
+    {
+    FUNC_LOG;
+    
+    CTVOutConfigForComposite* self = new(ELeave) CTVOutConfigForComposite( aFSM );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::CTVOutConfigForComposite
+//
+// ----------------------------------------------------------------------------
+//
+CTVOutConfigForComposite::CTVOutConfigForComposite( MFSMForBody& aFSM ):
+    CActive( CActive::EPriorityLow ),
+    iFSM( aFSM )
+    {
+    FUNC_LOG;
+    
+    // Nothing
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::SetConfig
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::SetConfig( TBool aSettingAfterCableConnected )
+    {
+    FUNC_LOG;
+    
+    iSettingAfterCableConnected = aSettingAfterCableConnected;
+    iStatus = KRequestPending;
+    iNextOpt = EOptSetting;
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );            
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForHDMI::ListenSettingsChanges
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::ListenSettingsChanges()
+    {
+    FUNC_LOG;
+    Cancel();    
+    iNextOpt = EOptStartListenForSettingsChanges;
+    iStatus = KRequestPending;
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );        
+    
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForHDMI::GetTvOutConfig
+//
+// ----------------------------------------------------------------------------
+//
+CTvOutConfig* CTVOutConfigForComposite::GetTvOutConfig()
+    {
+    FUNC_LOG;
+    return iTvOutConfig; 
+    }
+
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::Enable
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::Enable()
+    {
+    FUNC_LOG;
+    
+    iStatus = KRequestPending;
+    iNextOpt = EOptEnableTv;
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );        
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::Disable
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::Disable()
+    {
+    FUNC_LOG;
+    
+    iStatus = KRequestPending;
+    iNextOpt = EOptDisableTv;
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );        
+    }
+
+// -----------------------------------------------------------------------------
+// CTVOutConfigForComposite::InitializeDriverL
+// -----------------------------------------------------------------------------
+//
+TInt CTVOutConfigForComposite::InitializeDriverL()
+    {
+    FUNC_LOG;
+    
+    TTvSettings settings;
+    TInt value = 0;
+    TInt err = KErrNone;
+    
+    value = TvSystemL();
+    ConvertTvSystem( value );
+    settings.iTvSystem = ( TTvSettings::TSystem ) value;
+
+    value = AspectRatioL();
+    ConvertAspectRatio( value );
+    settings.iRatio = ( TTvSettings::TAspectRatio ) value;
+
+    settings.iScanMode = KDefaultScan;
+    settings.iOutput = KDefaultOutput;
+    settings.iAutoDetection = KDefaultDetectionMode;
+
+    value = FlickerFilterL();
+    ConvertFlickerFilter( value );
+    settings.iFlickerFilter = ( TTvSettings::TFlickerFilterType ) value;
+
+    TInt hOverscan = 0;
+    TInt vOverscan = 0;
+    err = iRepository->Get( KSettingsTvoutHorizontalOverscan, hOverscan );
+    if( err != KErrNone )
+        {
+        hOverscan = 0;
+        }
+    err = iRepository->Get( KSettingsTvoutVerticalOverscan, vOverscan );
+    if( err != KErrNone )
+        {
+        vOverscan = 0;
+        }
+    settings.iHorizontalOverScan = hOverscan;
+    settings.iVerticalOverScan = vOverscan;
+    
+    // Update the PAR
+    UpdatePixelAspectRatio( settings );
+
+    if ( err == KErrNone )
+        {
+        RArray<THdmiDviTimings> newHdmiSettingsArray;
+        CleanupClosePushL( newHdmiSettingsArray );
+        RArray<TTvSettings> newTvSettingsArray;
+        CleanupClosePushL( newTvSettingsArray );
+
+        err = newTvSettingsArray.Append( settings );
+        INFO_1( "Settings.iTvSystem %i", settings.iTvSystem );
+        INFO_1( "Settings.iRatio %i", settings.iRatio );
+        INFO_1( "Settings.iScanMode %i", settings.iScanMode );
+        INFO_1( "Settings.iOutput %i", settings.iOutput );
+        INFO_1( "Settings.iFlickerFilter %i", settings.iFlickerFilter );
+        INFO_1( "Settings.iAutoDetection %i", settings.iAutoDetection );
+        INFO_1( "Settings.iHorizontalOverScan %i", settings.iHorizontalOverScan );
+        INFO_1( "Settings.iVerticalOverScan %i", settings.iVerticalOverScan );
+        iTvOutConfig->SetAvailableTvConfigList( newTvSettingsArray, newHdmiSettingsArray );
+        CleanupStack::PopAndDestroy( &newTvSettingsArray );
+        CleanupStack::PopAndDestroy( &newHdmiSettingsArray );
+        
+        iSettingAfterCableConnected = EFalse;
+        }
+    
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CTVOutConfigForComposite::TvSystem
+// -----------------------------------------------------------------------------
+//
+TInt CTVOutConfigForComposite::TvSystemL()
+    {
+    FUNC_LOG;
+    
+    TInt value = 0;
+    User::LeaveIfError( iRepository->Get( KSettingsTvSystemInfo, value ) );
+    
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// CTVOutConfigForComposite::AspectRatioL
+// -----------------------------------------------------------------------------
+//
+TInt CTVOutConfigForComposite::AspectRatioL()
+    {
+    FUNC_LOG;
+    
+    TInt value = 0;
+    User::LeaveIfError( iRepository->Get( KSettingsTvAspectRatio, value ) );
+    
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// CTVOutConfigForComposite::FlickerFilter
+// -----------------------------------------------------------------------------
+//
+TInt CTVOutConfigForComposite::FlickerFilterL()
+    {
+    FUNC_LOG;
+    
+    TInt value = 0;
+    User::LeaveIfError( iRepository->Get( KSettingsTvoutFlickerFilter, value ) );
+
+    return value;
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::ConvertFlickerFilter
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::ConvertFlickerFilter( TInt& aValue )
+    {
+    FUNC_LOG;
+    
+    switch( aValue )   
+        {
+        case 0: // Off
+            {
+            aValue = TTvSettings::EFilterDisabled;
+            break;
+            }
+        case 1: // On
+            {
+            aValue = TTvSettings::EFilterEnabled;
+            break;
+            }
+        default:
+            {
+            aValue = TTvSettings::EUndefFlicker;
+            break;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::ConvertAspectRatio
+// 
+// 
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::ConvertAspectRatio( TInt& aValue )
+    {
+    FUNC_LOG;
+    
+    switch( aValue )
+        {
+        case 0: // 4:3
+            {
+            aValue = TTvSettings::E4d3;
+            break;
+            }
+        case 1: // 16:9
+            {
+            aValue = TTvSettings::E16d9;
+            break;
+            }
+        default:
+            {
+            aValue = TTvSettings::EUndefRatio;
+            break;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::ConvertTvSystem
+// 
+// 
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::ConvertTvSystem( TInt& aValue )
+    {
+    FUNC_LOG;
+    
+    switch( aValue )
+        {
+        case 0: // PAL
+            {
+            aValue = TTvSettings::EPAL;
+            break;
+            }
+        case 1: // PALM
+            {
+            aValue = TTvSettings::EPALM;
+            break;
+            }
+        case 2: // NTSC
+            {
+            aValue = TTvSettings::ENTSC;
+            break;
+            }
+        default:
+            {
+            aValue = TTvSettings::EUndefSystem;
+            break;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::UpdatePixelAspectRatio
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::UpdatePixelAspectRatio( TTvSettings& aSettings )
+    {
+    FUNC_LOG;
+    
+    switch ( aSettings.iTvSystem )
+        {
+        case TTvSettings::EPAL:
+        case TTvSettings::EPALM:
+            {
+            if( aSettings.iRatio == TTvSettings::E16d9 )
+                {
+                aSettings.iPixelAspectRatioNumerator = KPxlAspect16d9PalNumerator;
+                aSettings.iPixelAspectRatioDenominator = KPxlAspect16d9PalDenominator;
+                }
+            else
+                {
+                aSettings.iPixelAspectRatioNumerator = KPxlAspect4d3PalNumerator;
+                aSettings.iPixelAspectRatioDenominator = KPxlAspect4d3PalDenominator;                
+                }
+            break;
+            }
+        case TTvSettings::ENTSC:
+            {
+            if( aSettings.iRatio == TTvSettings::E16d9 )
+                {
+                aSettings.iPixelAspectRatioNumerator = KPxlAspect16d9NtscNumerator;
+                aSettings.iPixelAspectRatioDenominator = KPxlAspect16d9NtscDenominator;
+                }
+            else
+                {
+                aSettings.iPixelAspectRatioNumerator = KPxlAspect4d3NtscNumerator;
+                aSettings.iPixelAspectRatioDenominator = KPxlAspect4d3NtscDenominator;                
+                }
+            break;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::ConstructL
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::ConstructL()
+    {
+    FUNC_LOG;
+
+    iMyAsyncOneShotTimer = new (ELeave) CMyAsyncOneShotTimer( CActive::EPriorityLow, *this );
+    iRepository = CRepository::NewL( KCRUidTvoutSettings );
+    iTvOutConfig = CTvOutConfig::NewL();
+
+    CActiveScheduler::Add( this );
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::~CTVOutConfigForComposite
+//
+// ----------------------------------------------------------------------------
+//
+CTVOutConfigForComposite::~CTVOutConfigForComposite()
+    {
+    FUNC_LOG;
+    
+    if ( iTvOutConfig )
+        {
+        Cancel();
+        delete iTvOutConfig;
+        }
+    if ( iMyAsyncOneShotTimer )
+        {
+        if ( iMyAsyncOneShotTimer->IsActive() )
+            {
+            iMyAsyncOneShotTimer->Cancel();      
+            }
+        delete iMyAsyncOneShotTimer;
+        }
+    delete iRepository;    
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::DoCancel
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::DoCancel()
+    {
+    FUNC_LOG;
+    TInt err( KErrNone );
+    if ( iMyAsyncOneShotTimer->IsActive() )
+        {
+        iMyAsyncOneShotTimer->Cancel();
+        }
+    if ( iNextOpt == EOptListenForSettingsChanges )
+        {
+        err = iTvOutConfig->SettingsChangedListenerCancel ();
+        }
+    if ( KErrNone != err )
+        {
+        INFO_1("Error status %d", err);
+        }
+    iNextOpt = EOptIdle;
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::RunL
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::RunL()
+    {
+
+    FUNC_LOG;
+
+    switch ( iNextOpt )
+        {
+        case EOptEnableTv:
+            {
+            INFO("EOptEnableTv");
+            TInt retVal = iTvOutConfig->Enable();
+            INFO_1("iTvOutConfig->Enable() retVal: %d", retVal);
+            switch ( retVal )
+                {
+                case KErrNone:
+                case KErrAlreadyExists:    
+                    {
+                    iNextOpt = EOptUndefined;
+                    iFSM.Input(
+                            EPDEIfTVOutConfig,
+                            EIfTVOutConfigEventEnabled );                     
+                    }
+                    break;
+                case KErrServerBusy:
+                    {
+                    iTimeOutReason = iNextOpt;
+                    iNextOpt = EOptIdle;
+                    iMyAsyncOneShotTimer->Call();
+                    }
+                    break;
+                case KErrNotSupported:
+                case KErrNotReady:
+                default:
+                    {
+                    iNextOpt = EOptUndefined;
+                    iFSM.Input(
+                             EPDEIfTVOutConfig,
+                             EIfTVOutConfigEventEnableFailed );                                         
+                    }
+                    break;
+                }            
+            break;
+            }
+        case EOptDisableTv:
+            {
+            INFO("EOptDisableTv");
+            TInt retVal = iTvOutConfig->Disable();
+            INFO_1("iTvOutConfig->Disable() retVal: %d", retVal);
+            switch ( retVal )
+                {
+                case KErrNone:
+                case KErrAlreadyExists:    
+                    {
+                    iNextOpt = EOptUndefined;
+                    iFSM.Input(
+                            EPDEIfTVOutConfig,
+                            EIfTVOutConfigEventDisabled );                     
+                    }
+                    break;
+                case KErrServerBusy:
+                    {
+                    iTimeOutReason = iNextOpt;
+                    iNextOpt = EOptIdle;
+                    iMyAsyncOneShotTimer->Call();
+                    }
+                    break;
+                case KErrNotSupported:
+                case KErrNotReady:
+                default:
+                    {
+                    iNextOpt = EOptUndefined;
+                    iFSM.Input(
+                             EPDEIfTVOutConfig,
+                             EIfTVOutConfigEventDisableFailed );                                         
+                    }
+                    break;
+                }            
+            break;
+            }
+        case EOptStartListenForSettingsChanges:
+            {
+            INFO("EOptStartListenForSettingsChanges");
+            iStatus = KRequestPending;
+            TInt err = iTvOutConfig->SettingsChangedListener( iStatus );
+            INFO("EOptStartListenForSettingsChanges - Stage 1");
+            if ( KErrNone != err )
+                {
+                INFO_1("iTvOutConfig->SettingsChangedListener( iStatus ) error status %i", err);
+                iFSM.Input(
+                        EPDEIfTVOutConfig,
+                        EIfTVOutConfigEventSettingsChangesListenFailed );
+                }
+            else
+                {
+                INFO("EOptStartListenForSettingsChanges - Stage 2");
+                iNextOpt = EOptListenForSettingsChanges;
+                SetActive();
+                INFO("EOptStartListenForSettingsChanges - Stage 3");
+                iFSM.Input(
+                        EPDEIfTVOutConfig,
+                        EIfTVOutConfigEventSettingsChangesListenStarted );
+                INFO("EOptStartListenForSettingsChanges - Stage 4");
+                }
+            break;
+            }
+        case EOptListenForSettingsChanges:
+            {
+            INFO("EOptListenForSettingsChanges");
+            iNextOpt = EOptIdle;
+            TInt err( iStatus.Int() );
+            if ( KErrNone != err )
+                {
+                INFO_1("Error status %d", err);
+                iFSM.Input(
+                        EPDEIfTVOutConfig,
+                        EIfTVOutConfigEventSettingsChangesListenFailed );
+                }
+            else
+                {
+                iFSM.Input(
+                        EPDEIfTVOutConfig,
+                        EIfTVOutConfigEventSettingsChanged );
+                }
+            break;
+            }            
+        case EOptSetting:
+            {
+            INFO("EOptSetting");
+            TInt retVal( KErrNone );
+            TRAP( retVal,  InitializeDriverL() );
+            if (KErrNone != retVal )
+                {
+                INFO_1( "InitializeDriverL() leaved with error code %i", retVal );        
+                if ( ( KErrNotReady == retVal ) &&
+                     ( !iDisabledOnceBeforeSetting ) )
+                    {
+                    iDisabledOnceBeforeSetting = ETrue;
+                    iStatus = KRequestPending;
+                    iNextOpt = EOptDisableTVBeforeSetting;
+                    SetActive();
+                    TRequestStatus* status = &iStatus;
+                    User::RequestComplete( status, KErrNone );        
+                    }
+                else
+                    {
+                    iDisabledOnceBeforeSetting = EFalse;
+                    iSettingAfterCableConnected = EFalse;
+                    iFSM.Input(
+                             EPDEIfTVOutConfig,
+                             EIfTVOutConfigEventSetFailed );                                         
+                    }
+                }
+            else
+                {
+                iDisabledOnceBeforeSetting = EFalse;
+                iSettingAfterCableConnected = EFalse;
+                iNextOpt = EOptUndefined;
+                iFSM.Input(
+                         EPDEIfTVOutConfig,
+                         EIfTVOutConfigEventSet );                                                 
+                }
+            break;
+            }
+        case EOptDisableTVBeforeSetting:
+            {
+            INFO("EOptDisableTVBeforeSetting");
+            TInt retVal = iTvOutConfig->Disable();
+            INFO_1("iTvOutConfig->Disable() retVal: %d", retVal);
+            switch ( retVal )
+                {
+                case KErrNone:
+                case KErrAlreadyExists:    
+                    {
+                    iNextOpt = EOptUndefined;
+                    SetConfig( iSettingAfterCableConnected );
+                    }
+                    break;
+                case KErrServerBusy:
+                    {
+                    User::After( EWaitTimeInMsForTvOutConfigBusyServer );
+                    iStatus = KRequestPending;
+                    iNextOpt = EOptDisableTVBeforeSetting;
+                    SetActive();
+                    TRequestStatus* status = &iStatus;
+                    User::RequestComplete( status, KErrNone );                            
+                    }
+                    break;
+                case KErrNotSupported:
+                case KErrNotReady:
+                default:
+                    {
+                    iNextOpt = EOptUndefined;
+                    iFSM.Input(
+                             EPDEIfTVOutConfig,
+                             EIfTVOutConfigEventSetFailed );                                         
+                    }
+                    break;
+                }            
+            break;
+            }
+        default:
+            INFO_1("Default case, iNextOpt = %i", iNextOpt);
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CTVOutConfigForComposite::OneShotTimeout
+//
+// ----------------------------------------------------------------------------
+//
+void CTVOutConfigForComposite::OneShotTimeout()
+    {
+    FUNC_LOG;
+    
+    iNextOpt = iTimeOutReason;
+    iTimeOutReason = EOptUndefined;
+    RunL();
+    }