diff -r f742655b05bf -r d38647835c2e callcontinuity/vcchotrigger/src/vccsignallevelhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/callcontinuity/vcchotrigger/src/vccsignallevelhandler.cpp Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2007-2008 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: Implementation of the base class of signal level handler +* +*/ + + + +#include "vccsignallevelhandler.h" +#include "vccsignallevelobserver.h" +#include "rubydebug.h" + + +// Min. signal strength in absolut dBm, i.e. the value +// in real world is -110 dBm (so quite weak). +static const TInt32 KStrengthMin = 110; + +// --------------------------------------------------------------------------- +// C++ destructor. +// --------------------------------------------------------------------------- +// +CVccSignalLevelHandler::~CVccSignalLevelHandler() + { + // Cancel any outstanding requests. + Cancel(); + + iStrength = 0; + } + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor. +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::ConstructL() + { + CTimer::ConstructL(); + } + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CVccSignalLevelHandler::CVccSignalLevelHandler( + MVccSignalLevelObserver& aObserver, + const TSignalLevelParams& aParams ) + : CTimer( EPriorityStandard ), + iObserver( aObserver ), + iParams( aParams ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Star signal level observing. +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::StartL() + { + RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::StartL" ); + + if ( !iNotificationsOn ) + { + EnableNotificationsL(); + iNotificationsOn = ETrue; + } + + RUBY_DEBUG0( " -call Cancel()" ); + Cancel(); + + RUBY_DEBUG0( " -call GetStrength()" ); + GetStrength(); + + RUBY_DEBUG1( " -iStrength = %d, set op = EOperationGet \ + state = EStrengthUnknown", iStrength ); + + iOperation = EOperationGet; + + iState = EStrengthUnknown; + + RUBY_DEBUG0( " -call SetActive()" ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// Stop signal level observing. +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::Stop() + { + RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::Stop "); + + DisableNotifications(); + + iNotificationsOn = EFalse; + + iStrength = 0; + + Cancel(); + } + +// --------------------------------------------------------------------------- +// Set new parameters. +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::SetParams( const TSignalLevelParams& aParams ) + { + RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::SetParams" ); + iParams = aParams; + } + +// --------------------------------------------------------------------------- +// Handles getting the signal strength and notifying the observer about +// strength changes. +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::RunL() + { + RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::RunL" ); + + // Zero (0) is not acceptable. + if ( !iStrength ) + { + RUBY_DEBUG0( " -0 strength not acceptable, setting to KStrengthMin"); + iStrength = KStrengthMin; + } + + RUBY_DEBUG3( " -iStrength = %d iState = %d iOp = %d", iStrength, iState, iOperation ); + + switch ( iOperation ) + { + case EOperationGet: + { + + // We are in the Get-mode to get the signal strength. + // If the strength is < than the high level (== the strength + // is good), start timer to check if we are still in good level + // after the timer completes. + // The same is done if we have a low level (== bad). + + RUBY_DEBUG0( " -EOperationGet"); + + if ( iStrength <= iParams.iHighLevel && iStrength > 0 ) + { + RUBY_DEBUG0( " set state = EStrengthHigh, op = EOperationWait" ); + + After( iParams.iHighTimeout ); + iState = EStrengthHigh; + iOperation = EOperationWait; + } + else if ( iStrength >= iParams.iLowLevel ) + { + RUBY_DEBUG0( " set state = EStrengtLow, op = EOperationWait" ); + After( iParams.iLowTimeout ); + iState = EStrengthLow; + iOperation = EOperationWait; + } + else + { + RUBY_DEBUG0( " strength between low and high, set op = EOperationNone" ); + + iOperation = EOperationNone; + // PCLint + } + break; + } + + case EOperationWait: + { + + // Timer has completed. Check the signal level again. + + RUBY_DEBUG0( " -EOperationWait" ); + RUBY_DEBUG0( " set op = EOperationComplete" ); + GetStrength(); + + SetActive(); + + iOperation = EOperationComplete; + + break; + } + + case EOperationComplete: + { + // Checking signal strength is now done. + // Notify our observer (if needed). + + RUBY_DEBUG1( " -EOperationComplete, iStrength = %d", iStrength ); + + // Do we have a good signal level? + if ( iStrength <= iParams.iHighLevel && iStrength > 0 && iState == EStrengthHigh ) + { + RUBY_DEBUG0( " -if ( iStrength <= iParams.iHighLevel" ); + NotifyChanges( iStrength, MVccSignalLevelObserver::ESignalClassNormal ); + } + // Or do we have a bad signal level? + else if ( iStrength >= iParams.iHighLevel && iState == EStrengthLow ) + { + RUBY_DEBUG0( " -else if ( iStrength >= iParams.iHighLevel" ); + NotifyChanges( iStrength, MVccSignalLevelObserver::ESignalClassWeak ); + } + else + { + // PCLint + } + + iOperation = EOperationNone; + + break; + } + + default: + { + break; + } + } + } + +// --------------------------------------------------------------------------- +// Handles signal strength changes notified by the subsystem +// (either the WLAN or the GSM). +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::StrengthChanged() + { + + RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::StrengthChanged" ); + + // The zero (0) is not good. + if ( !iStrength ) + { + iStrength = KStrengthMin; + } + + RUBY_DEBUG3( " -iStrength = %d, iState = %d, iOp = %d", + iStrength, iState, iOperation); + + // Check in which direction the signal strength changed + // and start the timeout timer to see if the signal level + // stays at that (new) level. + + RUBY_DEBUG1( " -iHighLevel = %d", iParams.iHighLevel ); + RUBY_DEBUG1( " -iLowLevel = %d", iParams.iLowLevel ); + if ( iStrength <= iParams.iHighLevel && iStrength > 0 ) // && + //( iState == EStrengthLow || iState == EStrengthUnknown ) ) + { + // Cancel outstanding timer in all the cases + Cancel(); + // We have a good level after a bad one. + + RUBY_DEBUG0( " -call After( hightimeout ), set state = High, op = Wait"); + After( iParams.iHighTimeout ); + iState = EStrengthHigh; + iOperation = EOperationWait; + } + else if ( iStrength >= iParams.iLowLevel ) //&& + //( iState == EStrengthHigh || iState == EStrengthUnknown ) ) + { + // Cancel outstanding timer in all the cases + Cancel(); + // We have a bad level after a good one. + + RUBY_DEBUG0( " -call After( lowtimeout ), set state = Low, op = Wait"); + + After ( iParams.iLowTimeout ); + iState = EStrengthLow; + iOperation = EOperationWait; + } + else + { + RUBY_DEBUG0( "-EOperationNone "); + iOperation = EOperationNone; + } + } + +// --------------------------------------------------------------------------- +// Cancel outstanding requests. +// --------------------------------------------------------------------------- +// +void CVccSignalLevelHandler::DoCancel() + { + RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::DoCancel" ); + switch ( iOperation ) + { + case EOperationWait: + { + RUBY_DEBUG0( "EOperationWait" ); + CTimer::DoCancel(); + + break; + } + + case EOperationGet: + // fall-through intended here + case EOperationComplete: + { + RUBY_DEBUG0( "EOperationGet / EOperationComplete" ); + CancelGetStrength(); + + break; + } + + default: + { + break; + } + } + }