telephonyutils/telephonywatchers/src/signalstrengthwatcher.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
equal deleted inserted replaced
-1:000000000000 0:3553901f7fa8
       
     1 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // SIGNALSTRENGHWATCHER.CPP
       
    15 // 
       
    16 //
       
    17 
       
    18 // User includes
       
    19 #include "watcherlog.h"
       
    20 #include "signalstrengthwatcher.h"
       
    21 
       
    22 // System includes
       
    23 #include <sacls.h>
       
    24 
       
    25  #include <commsdat.h>
       
    26 
       
    27 // In dBm
       
    28 const TInt32 KSignalStrengthHigh = -51;
       
    29 const TInt32 KSignalStrengthMedium = -77;
       
    30 const TInt32 KSignalStrengthNone = -113;
       
    31 const TInt8  KSignalZeroBars = 0;
       
    32 const TInt8  KSignalThreeBars = 3;
       
    33 const TInt8  KSignalFiveBars = 5;
       
    34 
       
    35 //
       
    36 // ------> Global exports
       
    37 //
       
    38 
       
    39 
       
    40 //
       
    41 // ------> CSignalStrengthWatcher (source)
       
    42 //
       
    43 
       
    44 CSignalStrengthWatcher::CSignalStrengthWatcher()
       
    45 :	CPhoneWatcher()
       
    46 	{
       
    47 	}
       
    48 
       
    49 CSignalStrengthWatcher* CSignalStrengthWatcher::NewL(TAny* /*aWatcherParams*/)
       
    50 	{
       
    51 	CSignalStrengthWatcher* self= new (ELeave) CSignalStrengthWatcher();
       
    52 	CleanupStack::PushL(self);
       
    53 	self->ConstructL();
       
    54 	CleanupStack::Pop();
       
    55 	
       
    56 	return self;
       
    57 	}
       
    58 	
       
    59 void CSignalStrengthWatcher::ConstructL()
       
    60 {
       
    61 	CWatcherBase::ConstructL();
       
    62 		
       
    63 	User::LeaveIfError(iNetworkStrengthProperty.Attach(KUidSystemCategory, KUidNetworkStrength.iUid));
       
    64 }
       
    65 
       
    66 CSignalStrengthWatcher::~CSignalStrengthWatcher()
       
    67 	{
       
    68 	Cancel();
       
    69 	iNetworkStrengthProperty.Close();
       
    70 	}
       
    71 
       
    72 //
       
    73 //
       
    74 //
       
    75 
       
    76 void CSignalStrengthWatcher::HandlePhoneStateEventL(TInt aCompletionCode)
       
    77 	{
       
    78 	switch(SignalStrengthState())
       
    79 		{
       
    80 	case ESignalStrengthNotYetInitialised:
       
    81 	case ESignalStrengthStateRequestInitialSignalStrength:
       
    82 		LOGSIGNAL1("SignalStrengthWatcher : Requesting initial signal strength");
       
    83 		Phone().GetSignalStrength(iStatus, iSignalStrength, iSignalBars);
       
    84 		SignalStrengthState() = ESignalStrengthWaitingForInitialSignalStrength;
       
    85 		SetActive();
       
    86 		break;
       
    87 
       
    88 	case ESignalStrengthWaitingForInitialSignalStrength:
       
    89 		SignalStrengthState() = ESignalStrengthStateIssuingSignalChangeNotificationRequest;
       
    90 		HandleSignalStrengthUpdateL(aCompletionCode);
       
    91 		break;
       
    92 
       
    93 	case ESignalStrengthStateIssuingSignalChangeNotificationRequest:
       
    94 		HandleSignalStrengthUpdateL(aCompletionCode);
       
    95 		break;
       
    96 
       
    97 	default:
       
    98 		__ASSERT_DEBUG(0, SignalPanic(EUnexpectedState));
       
    99 		}
       
   100 	}
       
   101 
       
   102 void CSignalStrengthWatcher::HandleCancel()
       
   103 	{
       
   104 	if	(Phone().SubSessionHandle() == KNullHandle)
       
   105 		return;
       
   106 
       
   107 	if	(SignalStrengthState() == ESignalStrengthWaitingForInitialSignalStrength)
       
   108 		Phone().CancelAsyncRequest(EMobilePhoneGetSignalStrength);
       
   109 	else if (SignalStrengthState() == ESignalStrengthStateIssuingSignalChangeNotificationRequest)
       
   110 		Phone().CancelAsyncRequest(EMobilePhoneNotifySignalStrengthChange);
       
   111 	}
       
   112 
       
   113 void CSignalStrengthWatcher::ReleasePhoneResources()
       
   114 //
       
   115 //	Called by the phone watcher base class. Release any telephony related
       
   116 //	resources and reset and state.
       
   117 //
       
   118 	{
       
   119 	// This is only called within RunL and therefore we can't be active
       
   120 	__ASSERT_DEBUG(!IsActive(), SignalPanic(EUnexpectedActiveState));
       
   121 
       
   122 	// Reset state
       
   123 	iState = ESignalStrengthNotYetInitialised;
       
   124 	}
       
   125 
       
   126 
       
   127 //
       
   128 //
       
   129 //
       
   130 
       
   131 void CSignalStrengthWatcher::HandleSignalStrengthUpdateL(TInt aCompletionCode)
       
   132 	{
       
   133 	LOGSIGNAL1("SignalStrengthNotifier : Handling signal strength update");
       
   134 	if	(aCompletionCode < KErrNone)
       
   135 		{
       
   136 		LOGSIGNAL2("SignalStrengthNotifier : Handling request error (%d)", aCompletionCode);
       
   137 
       
   138 		// Indicate we don't know what the signal strength is
       
   139 		TInt ret = iNetworkStrengthProperty.Set(ESANetworkStrengthUnknown);
       
   140 		if (!(ret == KErrNone || ret == KErrNotFound))
       
   141 			User::Leave(ret);
       
   142 
       
   143 		if	(aCompletionCode == KErrNotSupported)
       
   144 			{
       
   145 			// If the TSY returns 'Not supported' then it isn't 
       
   146 			// worth re-sending the request, so give up gracefully.
       
   147 			SetDisabled(_L("SignalStrengthNotifier : TSY returned not supported (%d)"), aCompletionCode);
       
   148 			}
       
   149 		else if	(aCompletionCode == KErrCancel)
       
   150 			{
       
   151 			// Signal Strength watcher was cancelled
       
   152 			SetDisabled(_L("SignalStrengthNotifier : TSY has cancelled request (%d)"), aCompletionCode);
       
   153 			}
       
   154 		else if	(aCompletionCode == KWatcherBaseModemNotDetected)
       
   155 			{
       
   156 			// We should release all telephony related resources until the
       
   157 			// phone is available again.
       
   158 			Cancel();
       
   159 			Reset();
       
   160 
       
   161 			// The modem / phone cannot be found. Wait until it becomes available again...
       
   162 			WaitForPhoneToPowerUpL();
       
   163 			}
       
   164 		else if	(ErrorCountIncrement() >= KErrorRetryCount)
       
   165 			{
       
   166 			// We've already tried as many times as possible. Shut ourselves down forever.
       
   167 			// This watcher will be restarted when the machine is rebooted.
       
   168 			SetDisabled(_L("SignalStrengthNotifier : Max retries reached or exceeded. Shutting down until reboot."), 0);
       
   169 			}
       
   170 		else
       
   171 			{
       
   172 			// Doing this means we will asynchronously request the signal strength 
       
   173 			// so that we can update to a real value again.
       
   174 			SignalStrengthState() = ESignalStrengthNotYetInitialised;
       
   175 			SuspendFor(KErrorRetryPausePeriod);
       
   176 			}
       
   177 		}
       
   178 	else
       
   179 		{
       
   180 		LOGSIGNAL2("SignalStrengthNotifier : Signal strength is: %d", (TInt) iSignalStrength);
       
   181 		LOGSIGNAL2("SignalStrengthNotifier : Signal bars is: %d", iSignalBars);
       
   182 
       
   183 		// What is the signal strength now?
       
   184 		TInt newState = ESANetworkStrengthUnknown;
       
   185 		// iSignalStrength is in dBm - hence use of negative numbers
       
   186 		if	((iSignalStrength == KSignalStrengthNone) || (iSignalBars == KSignalZeroBars))
       
   187 			newState = ESANetworkStrengthNone;
       
   188 		else if ((iSignalStrength < KSignalStrengthMedium) || (iSignalBars < KSignalThreeBars))
       
   189 			newState = ESANetworkStrengthLow;
       
   190 		else if ((iSignalStrength < KSignalStrengthHigh) || (iSignalBars < KSignalFiveBars))
       
   191 			newState = ESANetworkStrengthMedium;
       
   192 		else
       
   193 			newState = ESANetworkStrengthHigh;
       
   194 
       
   195 		// Update properties
       
   196 		LOGSIGNAL1("SignalStrengthNotifier : Informing properties of signal strength change");
       
   197 		TInt ret = iNetworkStrengthProperty.Set(newState);
       
   198 		if (!(ret == KErrNone || ret == KErrNotFound))
       
   199 			User::Leave(ret);
       
   200 				
       
   201 		LOGSIGNAL1("SignalStrengthNotifier : Requesting signal strength change notification");
       
   202 		Phone().NotifySignalStrengthChange(iStatus, iSignalStrength, iSignalBars);
       
   203 		SetActive();
       
   204 		}
       
   205 	}
       
   206 
       
   207 
       
   208 //
       
   209 //
       
   210 //
       
   211 
       
   212 //
       
   213 // Panic Function
       
   214 //
       
   215 void CSignalStrengthWatcher::SignalPanic(TWatcherPanic aPanicNumber)
       
   216 	{
       
   217 	_LIT(panicText,"Signal Strength Watcher");
       
   218 	User::Panic(panicText,aPanicNumber);
       
   219 	}
       
   220 
       
   221 
       
   222 
       
   223 
       
   224 
       
   225 
       
   226 
       
   227 
       
   228 
       
   229