resourcemgmt/hwresourcesmgr/server/src/HWRMFmTxStateUtility.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMFmTxStateUtility.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,303 @@
+// Copyright (c) 2006-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:
+//
+
+
+
+
+// INCLUDE FILES
+#include "HWRMtrace.h"
+#include "HWRMFmTxStateUtility.h"
+#include "HWRMPluginHandler.h"
+#include "HWRMReservationHandler.h"
+#include "HWRMFmTxInternalCRKeys.h"
+#include "HWRMFmTxInternalPSKeys.h"
+#include "HWRMFmTxAudioPolicyDomainPSKeys.h"
+#include "HWRMFmTxService.h"
+#include "HWRMFmTxCommonData.h"
+#include "HWRMFmTxRdsTextConverter.h"
+#include "HWRMClientServer.h"
+#include "HWRMConfiguration.h"
+#include "HWRMFmTxCommands.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::CHWRMFmTxStateUtility
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CHWRMFmTxStateUtility::CHWRMFmTxStateUtility() : iPreviousState(EFmTxStateUnknown), iEnableStandby(EFalse)
+    {
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::CHWRMFmTxStateUtility()" ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxStateUtility::ConstructL(CHWRMPluginHandler* aPluginHandler,
+                                       CHWRMPluginHandler* aWatcherPluginHandler,
+                                       CHWRMReservationHandler* aReservationHandler,
+                                       CHWRMFmTxCommonData*     aFmTxCommonData)
+    {    
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::ConstructL()" ) ) );
+
+    iFmTxCommonData = aFmTxCommonData;
+
+    iFmTxStateObserver   = CHWRMPSChangeObserver::NewL(*this, KPSUidHWRMFmTx, KHWRMFmTxStatus);
+    iAudioRoutedObserver = CHWRMPSChangeObserver::NewL(*this, KPSUidHWRMFmTx, KHWRMFmTxAudioRoutedFlag);
+
+    iFmTxService = CHWRMFmTxService::NewL( aPluginHandler, *aWatcherPluginHandler,
+        aReservationHandler, *aFmTxCommonData, *(aFmTxCommonData->GetRdsTextConverter()) );
+
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::ConstructL - return " ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::CancelPowerSaveTimer
+// Stops and deletes power save timer.
+// -----------------------------------------------------------------------------
+//    
+void CHWRMFmTxStateUtility::CancelPowerSaveTimer()
+    {    
+    COMPONENT_TRACE1( (_L("HWRM Server - CHWRMFmTxStateUtility::CancelPowerSaveTimer()" ) ) );             		
+    
+    if( iPowerSaveTimer )
+        {
+        iPowerSaveTimer->Stop();
+    	delete iPowerSaveTimer;
+        iPowerSaveTimer = NULL;
+        }
+  	      
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::CancelPowerSaveTimer - return" ) ) );        
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CHWRMFmTxStateUtility* CHWRMFmTxStateUtility::NewL(CHWRMPluginHandler*      aPluginHandler,
+                                                   CHWRMPluginHandler*      aWatcherPluginHandler,
+                                                   CHWRMReservationHandler* aReservationHandler,
+                                                   CHWRMFmTxCommonData*     aFmTxCommonData)
+    {
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::NewL()" ) ) );
+
+    CHWRMFmTxStateUtility* self = new( ELeave ) CHWRMFmTxStateUtility();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL(aPluginHandler, aWatcherPluginHandler, aReservationHandler, aFmTxCommonData);
+    CleanupStack::Pop( self );
+
+    COMPONENT_TRACE2( _L( "HWRM Server - CHWRMFmTxStateUtility::NewL - return 0x%x" ), self );
+    
+    return self;
+    }
+   
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+CHWRMFmTxStateUtility::~CHWRMFmTxStateUtility()
+    {
+    COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxStateUtility::~CHWRMFmTxStateUtility()" ) );
+
+    delete iFmTxService;
+    delete iFmTxStateObserver;
+    delete iPowerSaveObserver;
+    delete iAudioRoutedObserver;
+    
+    CancelPowerSaveTimer();
+
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::~CHWRMFmTxStateUtility - return" ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::PSValueChanged
+// Act on observed PS value changes
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxStateUtility::PSValueChanged(const TUid& aUid, TUint32 aKey, TInt aValue)
+    {
+    COMPONENT_TRACE4(_L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged(0x%x, 0x%x, 0x%x)"), aUid, aKey, aValue); 
+
+    if ( aUid == KPSUidHWRMFmTx && aKey == KHWRMFmTxStatus )
+        {           
+        COMPONENT_TRACE3(_L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged new state = %d, previous = %d"), aValue, iPreviousState);           
+            
+        TFmTxState currentState = static_cast<TFmTxState>(aValue);
+            
+        // Check if the hardware has switched on
+        if ( iFmTxCommonData->IsFmTxHardwareOn(currentState) && 
+             !(iFmTxCommonData->IsFmTxHardwareOn(iPreviousState)) )
+            {
+            // FM Tx disable event may occur during an enable request
+            if ( iFmTxCommonData->IsPowerSaveOn() )
+                {
+                COMPONENT_TRACE1( (_L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged - powering down again")) );           
+                iFmTxService->ExecutePluginCommand(HWRMFmTxCommand::ETxOffCmdId);
+                }               
+            else // Now set RDS defaults
+                {
+                COMPONENT_TRACE1( (_L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged - setting PS")) );            
+                HWRMFmTxCommand::TRdsPsPackage pckg( iFmTxCommonData->ConvertedRdsPs() ); // package up the request         
+                iFmTxService->ExecutePluginCommand(HWRMFmTxCommand::ESetTxRdsPsCmdId, EFalse/*not split*/, pckg);
+                if( iFmTxCommonData->IsAudioRouted() || iPreviousState == EFmTxStatePowerSaveInactivity )
+                    {
+                    iEnableStandby = ETrue;
+                    }
+                else
+                    {
+                    iEnableStandby = EFalse;
+                    }
+                }
+            }
+		else if ( iFmTxCommonData->IsFmTxHardwareOn(currentState) &&
+			      !iFmTxCommonData->IsAudioRouted() )
+			{
+			iEnableStandby = ETrue;
+			}
+            
+        // Cache state for next time
+        iPreviousState = currentState;
+        
+        // Stop power save timer if Fm Tx state is set off.
+        if( currentState == EFmTxStateOff )
+            {
+            CancelPowerSaveTimer();
+            }
+        }
+        
+    else if ( aUid == KPSUidHWRMFmTx && aKey == KHWRMFmTxAudioRoutedFlag )
+        {       
+        // Update FM Tx status
+        iFmTxCommonData->UpdateAudioStatus( aValue );                   
+        if( aValue && iFmTxCommonData->Status() == EFmTxStatePowerSaveInactivity )
+            {
+            COMPONENT_TRACE1( _L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged - powering up from standby") );
+            HWRMFmTxCommand::TSetFrequencyPackage pckg( iFmTxCommonData->Frequency() );
+            iFmTxService->ExecutePluginCommand(HWRMFmTxCommand::ETxOnCmdId, EFalse/*not split*/, pckg);
+            }
+        }
+    // Check if KHWRFmTxAudioRoutedFlag is set off and FM TX is still enabled        
+    if( !iFmTxCommonData->IsAudioRouted()
+        && iFmTxCommonData->Status() == EFmTxStateInactive
+        && !iPowerSaveTimer )
+        {
+        TRAPD( err, iPowerSaveTimer = CHWRMFmTxPowerSaveTimer::NewL( *this ) );
+        if( err != KErrNone )
+            {
+            COMPONENT_TRACE2(_L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged - Couldn't create power save timer cause %d"), err);
+            }
+        else
+            {
+            iPowerSaveTimer->Start(iFmTxCommonData->PowerSaveTimeout());
+            }
+        }
+    else if( iFmTxCommonData->IsAudioRouted() )
+        {        
+        CancelPowerSaveTimer();
+		iEnableStandby = EFalse;
+        }
+    COMPONENT_TRACE1( (_L("HWRM Server - CHWRMFmTxStateUtility::PSValueChanged - return") ) ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::ProcessIndicationL
+// Handles status change indications from HWRM plugin
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxStateUtility::ProcessIndicationL( const TUint32 aId, TDesC8&  aData )
+    {
+    COMPONENT_TRACE2( _L( "HWRM Server - CHWRMFmTxStateUtility::ProcessIndicationL, aId = %d" ), aId );        
+
+    switch ( aId )
+        {
+        case HWRMFmTxCommand::ETxWatcherConnIndId:
+            {
+            HWRMFmTxCommand::TConnStatusPackage pckg;
+            pckg.Copy( aData );
+            HWRMFmTxCommand::TConnStatusData data( pckg() );
+            
+            if( data.iConnected )
+                {
+                // Update common data power save state if necessary
+                if ( iFmTxCommonData->IsFmTxHardwareOn() ||
+					 iFmTxCommonData->IsPowerSaveOn() )
+                    {
+                    // Update common data power save state if necessary
+                    iFmTxCommonData->UpdatePowerSaveState(
+                                            CHWRMFmTxCommonData::EHWRMFmTxPowerSaveAccessory );
+                    }
+                }
+            else
+                {
+                // Reset power save accessory state, if necessary
+                if ( iFmTxCommonData->IsAccessoryPowerSaveOn() )
+                    {
+                    iFmTxCommonData->UpdatePowerSaveState( 
+                                                CHWRMFmTxCommonData::EHWRMFmTxPowerSaveOff );
+                    }
+                }
+			
+			// Switch off transmitter. As specified in client interface state
+			// transition from EFmTxStatePowerSaveAccessory to EFmTxStateOff must occur.
+			iFmTxService->ExecutePluginCommand(HWRMFmTxCommand::ETxOffCmdId);
+			// Don't change iFmTxState until power down completes
+            }
+            break;
+
+        default:
+            // do nothing
+            break;
+        }
+
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::ProcessIndicationL - return" ) ) );        
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxStateUtility::TimerExpired
+// This method is called by Power Save Timer, after timer expires.
+// -----------------------------------------------------------------------------
+//    
+void CHWRMFmTxStateUtility::TimerExpired()
+    {    
+    COMPONENT_TRACE1( (_L("HWRM Server - CHWRMFmTxStateUtility::TimerExpired()" ) ) );             		
+           
+    delete iPowerSaveTimer;
+    iPowerSaveTimer = NULL;
+    // Power down the transmitter, if necessary
+    if ( iFmTxCommonData->IsFmTxHardwareOn() && !iFmTxCommonData->IsAudioRouted() )
+        {
+        if( iEnableStandby )
+            {
+            iFmTxCommonData->UpdatePowerSaveState( CHWRMFmTxCommonData::EHWRMFmTxPowerSaveInactivity );
+			iEnableStandby = EFalse;
+            }
+        else
+            {
+            iFmTxCommonData->UpdatePowerSaveState( CHWRMFmTxCommonData::EHWRMFmTxPowerSaveOff );
+            }
+        iFmTxService->ExecutePluginCommand(HWRMFmTxCommand::ETxOffCmdId);
+        // Don't change iFmTxState until power down completes
+        }    	      
+    COMPONENT_TRACE1( ( _L( "HWRM Server - CHWRMFmTxStateUtility::TimerExpired - return" ) ) );        
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File