locationtriggering/ltstrategyengine/src/lbtstrategytimer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 09 Jun 2010 10:08:56 +0300
branchRCL_3
changeset 27 b88ebe0cbbbe
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*
* Copyright (c) 2006, 2007 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 Timer class 
*
*/



#include "lbtstrategytimer.h"
#include "lbtlogger.h"


// ======== MEMBER FUNCTIONS ========

// -----------------------------------------------------------------------------
// CLbtStrategyTimer::NewL
// 
// -----------------------------------------------------------------------------
//
CLbtStrategyTimer* CLbtStrategyTimer::NewL()
    {
    CLbtStrategyTimer* timer = new ( ELeave ) CLbtStrategyTimer;
    CleanupStack::PushL( timer );
    timer->ConstructL();
    CleanupStack::Pop();
    return timer;
    }

    
// -----------------------------------------------------------------------------
// CLbtStrategyTimer::~CLbtStrategyTimer
// 
// -----------------------------------------------------------------------------
//
CLbtStrategyTimer::~CLbtStrategyTimer()
    {
    FUNC_ENTER("CLbtStrategyTimer::~CLbtStrategyTimer");
    iTimer.Close();
    if( iUtilizeMovementDetection )
    	{
    	if( iMovtDetector )
			{
			iMovtDetector->StopNotification();
			}
    	}    	
    delete iMovtDetector;
    }

    
// -----------------------------------------------------------------------------
// CLbtStrategyTimer::Set
// 
// -----------------------------------------------------------------------------
//    
void CLbtStrategyTimer::Set( TRequestStatus& aStatus, 
                             TTimeIntervalSeconds aSleepInterval,
                             TBool aUtilizeMovementDetection )
    {
    FUNC_ENTER("CLbtStrategyTimer::Set");
    LOG1("Sleeping for interval : %d", aSleepInterval.Int() );
    // Initialize sleeptime with respect to current time. 
    iSleepTime = aSleepInterval;
    
    iUtilizeMovementDetection = aUtilizeMovementDetection;
    
    // Update start time of sleep
    iStartTime.UniversalTime();
    iInterrupt = EFalse;
    
    aStatus = KRequestPending;    
    
    iMovtDetectorNotified = EFalse;
    //Initiate Movt Detector
    if( iMovtDetector && iUtilizeMovementDetection )
        {
        TRAPD( err, iMovtDetector->RequestNotificationL( this , iSleepTime.Int() ) );
        if( KErrNone == err )
            {
            iStatusPtr = &aStatus;
            return;
            }
        else
            {
            delete iMovtDetector;
            iMovtDetector = NULL;
            }
        }
   	iTimerInitialized = ETrue;
    iTimer.AtUTC( aStatus, ( iStartTime + iSleepTime ) );
    }

    
// -----------------------------------------------------------------------------
// CLbtStrategyTimer::ResetInterval
// 
// -----------------------------------------------------------------------------
//  
void CLbtStrategyTimer::ResetInterval( TRequestStatus& aStatus,
                                       TTimeIntervalSeconds aSleepInterval,
                                       TBool aUtilizeMovementDetection )
	{
	FUNC_ENTER("CLbtStrategyTimer::ResetInterval");
	LOG1("ResetInterval;=%d", aSleepInterval.Int());
	if( !iMovtDetectorNotified )
		{
		Set( aStatus, aSleepInterval,aUtilizeMovementDetection );
		return;
		}
	iUtilizeMovementDetection = aUtilizeMovementDetection;
		
	TTime sleepTime;
    sleepTime.UniversalTime();
    sleepTime += aSleepInterval;
    
    iTimer.AtUTC( aStatus, sleepTime );
	iSleepTime = aSleepInterval;
	iStartTime.UniversalTime();
    iInterrupt = EFalse;    
	}

    
// -----------------------------------------------------------------------------
// CLbtStrategyTimer::Cancel
// 
// -----------------------------------------------------------------------------
//
void CLbtStrategyTimer::Cancel()
    {
    FUNC_ENTER("CLbtStrategyTimer::Cancel");
    if( iTimerInitialized )
        {
        iTimer.Cancel();
        }
    if( iMovtDetector && iUtilizeMovementDetection )
        {
        iMovtDetector->StopNotification();
        }
    if(iStatusPtr != NULL)
    	{
    	User::RequestComplete(iStatusPtr, KErrCancel);
    	}
    //  iMovtDetectorNotified = EFalse;
    iInterrupt = ETrue;
    }
    
  
// -----------------------------------------------------------------------------
// CLbtStrategyTimer::RemainingSleepInterval
// 
// -----------------------------------------------------------------------------
//    
TBool CLbtStrategyTimer::RemainingSleepInterval( 
                                    TTimeIntervalSeconds& aRemainingInterval )
    {
    return RemainingSleepInterval( iSleepTime, aRemainingInterval );
    }


// -----------------------------------------------------------------------------
// CLbtStrategyTimer::RemainingSleepInterval
// 
// -----------------------------------------------------------------------------
//    
TBool CLbtStrategyTimer::RemainingSleepInterval( 
                                TTimeIntervalSeconds aEstimatedTime, 
                                TTimeIntervalSeconds& aRemainingInterval )
    {
    TTime currentTime;
	TTimeIntervalSeconds interval;
	currentTime.UniversalTime();
	currentTime.SecondsFrom( iStartTime, interval );
    
    aRemainingInterval = aEstimatedTime.Int() - interval.Int(); 
             
	if( aRemainingInterval.Int() <= 0 )
        {
        return EFalse;
        }
	else
        {
        return ETrue;
        }
    }
 
 
// -----------------------------------------------------------------------------
// CLbtStrategyTimer::SleepIntervalInterrupted
// 
// -----------------------------------------------------------------------------
//    
TBool CLbtStrategyTimer::SleepIntervalInterrupted()
    {
    TBool interrupted = iInterrupt;
    iInterrupt = EFalse;
    return interrupted;
    }


// -----------------------------------------------------------------------------
// CLbtStrategyTimer::ElapsedTime
// 
// -----------------------------------------------------------------------------
//    
CLbtStrategyTimer::CLbtStrategyTimer() : iTimerInitialized( EFalse ), 
										 iMovtDetectorNotified( EFalse ),
										 iMovtDetector( NULL )
    {
    }


// -----------------------------------------------------------------------------
// CLbtStrategyTimer::ElapsedTime
// 
// -----------------------------------------------------------------------------
//    
void CLbtStrategyTimer::ConstructL()
    {
    iInterrupt = EFalse;
    User::LeaveIfError( iTimer.CreateLocal() );
    iMovtDetector = CLbtMovementDetector::NewL();
    iUtilizeMovementDetection = ETrue;
    iStatusPtr = NULL;
    }


// -----------------------------------------------------------------------------
// CLbtStrategyEngine::HandleDetectorNotification
// Handles Movt detection notification
// -----------------------------------------------------------------------------
//
void CLbtStrategyTimer::HandleDetectorNotification( const TMovementObserverEvent /*aEvent*/ )
	{
	FUNC_ENTER("CLbtStrategyTimer::HandleDetectorNotification");
	LOG("Movement detected");
	 // aEvent need not be checked as the handling will remain the same  
	iMovtDetector->StopNotification();
	iMovtDetectorNotified = ETrue;
	
	TTime currentTime;
  	currentTime.UniversalTime();
    
  	if( currentTime > ( iStartTime + iSleepTime ) )
   		{
   		//Notification  after the completion of sleepinterval => Notify the engine immediately
   		User::RequestComplete( iStatusPtr, KErrNone ); 
   		iStatusPtr = NULL;
   		}
  	else
   		{
   		//Notification before the completion of sleepinterval => Notify the engine after the completion 
 		//of sleep interval
		iTimerInitialized = ETrue;
		iTimer.AtUTC( *iStatusPtr, ( iStartTime + iSleepTime ) );
		iStatusPtr = NULL;
   		}
   	}