resourcemgmt/hwresourcesmgr/server/src/HWRMFmTxService.cpp
changeset 78 3f0699f2e14c
parent 0 4e1aa6a622a0
--- a/resourcemgmt/hwresourcesmgr/server/src/HWRMFmTxService.cpp	Tue Oct 12 15:02:43 2010 +0300
+++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMFmTxService.cpp	Thu Oct 14 12:47:54 2010 +0300
@@ -41,7 +41,8 @@
                                    CHWRMFmTxRdsTextConverter& aRdsTextConverter)
     : iWatcherPluginHandler(aWatcherPluginHandler),
       iFmTxCommonData(aFmTxCommonData), 
-      iRdsTextConverter(aRdsTextConverter)
+      iRdsTextConverter(aRdsTextConverter),
+      iScanRequestType(EFmTxScanTypeNone)
     {
     COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::CHWRMFmTxService()" ));
     COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::CHWRMFmTxService - return" ));
@@ -234,6 +235,7 @@
             {
             COMPONENT_TRACE1( _L("HWRM Server - CHWRMFmTxService::ExecuteMessageL - EHWRMFmTxCancelGetNextClearFreq") );
 
+            ResetScanRequest();
             CancelPluginCommandL( HWRMFmTxCommand::ETxScanRequestCmdId );
             completeMessage = ETrue; // no responses from plugin cancel commands
             }
@@ -252,6 +254,7 @@
             {
             COMPONENT_TRACE1( _L("HWRM Server - CHWRMFmTxService::ExecuteMessageL - EHWRMFmTxCancelSetNextClearFreq") );
 
+            ResetScanRequest();
             // no hope of cancelling the ESetTxFrequencyCmdId part, so try the ETxScanRequestCmdId
             CancelPluginCommandL( HWRMFmTxCommand::ETxScanRequestCmdId );
             completeMessage = ETrue; // no responses from plugin cancel commands
@@ -379,6 +382,7 @@
     COMPONENT_TRACE2( _L( "HWRM Server - CHWRMFmTxService::EnableL(0x%x)" ), aMessage.Int0() );
 
     LeaveIfOtherReservationL();
+    ResetScanRequest( iFmTxCommonData.IsFmTxHardwareOn() ); 
 
     // We cannot enable from "power save" state
     if ( iFmTxCommonData.IsAccessoryPowerSaveOn() )
@@ -414,6 +418,7 @@
     COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::DisableL" ) );
 
     LeaveIfOtherReservationL();
+    ResetScanRequest(); 
 
     // We don't need to disable HW from some states
 	if ( !iFmTxCommonData.IsFmTxHardwareOn() )
@@ -486,12 +491,18 @@
 
     LeaveIfOtherReservationL();
 
-    LeaveIfTransmitterOffL();
-
-    // package up the request
-    HWRMFmTxCommand::TScanRequestPackage pckg(aClearFreqsRequired);
-
-    ExecutePluginCommandL(aMessage, HWRMFmTxCommand::ETxScanRequestCmdId, EFalse/*not split*/, pckg );
+    if ( !iFmTxCommonData.IsFmTxHardwareOn() )
+        {
+        EnsureTransmitterOnL( aMessage );
+        iScanRequestType = EFmTxScanTypeGet;
+        iClearFreqsRequired = aClearFreqsRequired;
+        }
+    else
+        {
+        // package up the request
+        HWRMFmTxCommand::TScanRequestPackage pckg( aClearFreqsRequired );
+        ExecutePluginCommandL(aMessage, HWRMFmTxCommand::ETxScanRequestCmdId, EFalse/*not split*/, pckg );
+        }
 
     COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::GetClearFrequencyL - return" ) ); 
     }
@@ -508,13 +519,19 @@
 
     LeaveIfOtherReservationL();
 
-    LeaveIfTransmitterOffL();
-
-    // package up the request
-    HWRMFmTxCommand::TScanRequestPackage pckg(aClearFreqsRequired);
-
-    ExecutePluginCommandL(aMessage, HWRMFmTxCommand::ETxScanRequestCmdId, ETrue/*split*/, pckg );
-    // wait until response before calling SetFrequencyL
+    if ( !iFmTxCommonData.IsFmTxHardwareOn() )
+        {
+        EnsureTransmitterOnL( aMessage );
+        iScanRequestType = EFmTxScanTypeSet;
+        iClearFreqsRequired = aClearFreqsRequired;
+        }
+    else
+        {
+        // package up the request
+        HWRMFmTxCommand::TScanRequestPackage pckg( aClearFreqsRequired );
+        ExecutePluginCommandL(aMessage, HWRMFmTxCommand::ETxScanRequestCmdId, ETrue/*split*/, pckg );
+        // wait until response before calling SetFrequencyL
+        }
 
     COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::SetNextClearFrequencyL - return" ) ); 
     }
@@ -792,10 +809,20 @@
                                                                                      EFalse ) );
                     if(data)
                     	{
+                        COMPONENT_TRACE2( _L( "HWRM Server - CHWRMFmTxService::ProcessResponseL, EStartObservingCmdId scan type = %d" ), 
+                            iScanRequestType );
+
+                    	TBool split( ( iScanRequestType != EFmTxScanTypeNone ) ? ETrue : EFalse );
                     	TRAP( pluginErr, ExecutePluginCommandL( data->iRequestMessage,
                     			HWRMFmTxCommand::ETxOnCmdId,
-                    			EFalse/*not split*/,
+                    			split,
                     			pckg ) );
+                    	
+                    	if( !pluginErr && iScanRequestType != EFmTxScanTypeNone )
+                    	    {
+                    	    // Temporarily prevent audio routing.
+                    	    iFmTxCommonData.EnableAudioRouting( EFalse );
+                    	    }
                     	}
                     else
                     	{
@@ -813,16 +840,30 @@
                 errPckg.Copy(aData);
                 pluginErr = errPckg();
 
-                COMPONENT_TRACE2( _L( "HWRM Server - CHWRMFmTxService::ProcessResponseL, ETxOnCmdId pluginErr = %d" ), pluginErr );
+                COMPONENT_TRACE3( _L( "HWRM Server - CHWRMFmTxService::ProcessResponseL, ETxOnCmdId pluginErr = %d, scan type = %d" ), 
+                    pluginErr, iScanRequestType );
 
                 if ( pluginErr == KErrNone || pluginErr == KErrInUse )
                     {
                     pluginErr = KErrNone; // If already enabled, complete client request with KErrNone
+
                     // Update common data power save
                     iFmTxCommonData.UpdatePowerSaveState( 
                                         CHWRMFmTxCommonData::EHWRMFmTxPowerSaveOff );
                     // Store the new status
                     iFmTxCommonData.UpdateStatus(CHWRMFmTxCommonData::EFmTxStateTransOn);
+
+                    // Proceed with scan command if needed.
+                    if( iScanRequestType != EFmTxScanTypeNone )
+                        {
+                        THWRMPluginRequestData* data = static_cast<THWRMPluginRequestData*>(iTransactionList->FindTransaction(aTransId, EFalse));
+                        if( data )
+                            {
+                            HWRMFmTxCommand::TScanRequestPackage pckg( iClearFreqsRequired );
+                            TBool split( ( iScanRequestType == EFmTxScanTypeSet ) ? ETrue : EFalse );
+                            ExecutePluginCommandL( data->iRequestMessage, HWRMFmTxCommand::ETxScanRequestCmdId, split, pckg );
+                            }
+                        }
                     }
                 }
                 break;              
@@ -926,7 +967,7 @@
                 scanPckg.Copy(aData);
                 HWRMFmTxCommand::TScanResponseData scanResp = scanPckg();               
                 COMPONENT_TRACE3( _L( "HWRM Server - CHWRMFmTxService::ProcessResponseL, ETxScanRequestCmdId error = %d, found = %d" ), scanResp.iErrorCode, scanResp.iFrequenciesFound );
-                                
+                
                 if ( scanResp.iErrorCode != KErrNone ||
                      scanResp.iFrequenciesFound == 0 ||
                      scanResp.iFrequenciesFound > KClearFrequencyArrayMax ) 
@@ -957,7 +998,20 @@
                         pluginErr = data->iRequestMessage.Write(0,clientClearFreqPckg);
                         }
 
-                    if ( pluginErr == KErrNone &&
+                    // Disable transmitter if scan state is still get or set (i.e. transmitter not enabled 
+                    // or disabled explicitly during scan neither accessory connected during scan).
+                    // If scan state is set, we can still just disable transmitter because frequency is 
+                    // being set upon next transmitter enabling.
+                    if ( pluginErr == KErrNone && iScanRequestType != EFmTxScanTypeNone )
+                        {
+                        ExecutePluginCommand(HWRMFmTxCommand::ETxOffCmdId);
+                        if ( iScanRequestType == EFmTxScanTypeSet )
+                            {
+                            // Store the new frequency, which is used when next time enabling transmitter
+                            iFmTxCommonData.UpdateFrequency( firstClearFreq );
+                            }
+                        }
+                    else if ( pluginErr == KErrNone &&
                          data->iRequestMessage.Function() == EHWRMFmTxSetNextClearFreq )
                         {
                         // Continue split command
@@ -1451,6 +1505,44 @@
 
     COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::CancelPluginCommandL - return" ) );     
     }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxService::EnsureTransmitterOnL
+// Enables transmitter for being able to scan and set free frequencies.
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxService::EnsureTransmitterOnL( const RMessage2& aMessage )
+    {
+    COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::EnsureTransmitterOnL" ) );
+
+    // Enable transmitter if not in "power save" state
+    if ( iFmTxCommonData.IsAccessoryPowerSaveOn() )
+        {
+		// We cannot enable during "power save" due to mutually exclusive accessory connection.			
+        COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::EnableL - not ready in \"power save\" state" ) );
+        User::Leave( KErrNotReady );
+        }
+    else
+        {
+        //start observing       
+        ExecutePluginCommandL( aMessage, HWRMFmTxCommand::EStartObservingCmdId, EFalse/*not split*/ );
+        }
+
+    COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::EnsureTransmitterOnL - return" ) );     
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMFmTxService::ResetScanRequest
+// Resets scan request and enables audio routing.
+// -----------------------------------------------------------------------------
+//
+void CHWRMFmTxService::ResetScanRequest( TBool aNotifyAudioPolicy )
+    {
+    COMPONENT_TRACE1( _L( "HWRM Server - CHWRMFmTxService::ResetScanRequest" ) );
+
+    iFmTxCommonData.EnableAudioRouting( ETrue, aNotifyAudioPolicy );
+    iScanRequestType = EFmTxScanTypeNone;
+    }
     
 // ========================== OTHER EXPORTED FUNCTIONS =========================