contextframework/cfwplugins/vibraactionplugin/src/vibraaction.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfwplugins/vibraactionplugin/src/vibraaction.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,260 @@
+/*
+* Copyright (c) 2006-2006 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:  CVibraAction class implementation.
+*
+*/
+
+
+#include "vibraaction.h"
+
+#include <cfactionindication.h>
+
+#include "vibratrace.h"
+#include "vibraactionobserver.h"
+
+// CONSTANTS
+
+const TInt KMultiplier = 1000;
+
+// MEMBER FUNCTIONS
+
+CVibraAction* CVibraAction::NewL( MVibraActionObserver& aObserver )
+    {
+    FUNC_LOG;
+    
+    CVibraAction* self = CVibraAction::NewLC( aObserver );
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+  
+CVibraAction* CVibraAction::NewLC( MVibraActionObserver& aObserver )
+    {
+    FUNC_LOG;
+    
+    CVibraAction* self = new( ELeave ) CVibraAction( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    
+    return self;
+    }
+  
+// Destructor
+CVibraAction::~CVibraAction()
+    {
+    FUNC_LOG;
+    
+    Cancel();
+    delete iVibra;
+    }
+
+// Vibra feedback should be as exact as possible. Set high priority.
+CVibraAction::CVibraAction( MVibraActionObserver& aObserver ):
+    CTimer( EPriorityHigh ),
+    iObserver( aObserver )
+    {
+    FUNC_LOG;
+    
+    // Add into active scheduler if not already added
+    if( !IsAdded() )
+        {
+        CActiveScheduler::Add( this );
+        }
+    }
+    
+void CVibraAction::ConstructL()
+    {
+    FUNC_LOG;
+    
+    // Construct ctimer
+    CTimer::ConstructL();
+    
+    // Connect to vibra client
+    iVibra = CHWRMVibra::NewL( this );
+    }
+
+// METHODS
+
+//-----------------------------------------------------------------------------
+// CVibraAction::StartVibraL
+//-----------------------------------------------------------------------------
+//
+CCFActionPlugIn::TExecutionTime CVibraAction::StartVibraL(
+    const TVibraActionInfo& aVibraInfo )
+    {
+    FUNC_LOG;
+    
+    CCFActionPlugIn::TExecutionTime time = CCFActionPlugIn::ENone;
+    
+    INFO( "Vibra started with params:");
+    INFO_1( ">> Delay: %d", aVibraInfo.iDelay );
+    INFO_1( ">> Duration: %d", aVibraInfo.iDuration );
+    INFO_1( ">> Intensity: %d", aVibraInfo.iIntensity );
+    INFO_1( ">> Repeats: %d", aVibraInfo.iRepeats );
+    INFO_1( ">> Repeat interval: %d", aVibraInfo.iRepeatInterval );
+    
+    // First cancel ongoing timer if any
+    Cancel();
+    
+    // Store parameters
+    iRepeats = 0;
+    iInfo = aVibraInfo;
+    if( iInfo.iDelay )
+        {
+        // We have to delay vibra
+        After( MicroSeconds( iInfo.iDelay ) );
+        time = CCFActionPlugIn::ELong;
+        }
+    else
+        {
+        // No delay, start right away
+        time = DoRunVibraL();
+        }
+        
+    return time;
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::StopVibra
+//-----------------------------------------------------------------------------
+//
+void CVibraAction::StopVibraL()
+    {
+    FUNC_LOG;
+    
+    // First cancel ongoing timer
+    Cancel();
+    
+    // Stop vibra
+    DoStopVibraL();
+    
+    INFO( "Vibra stopped");
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::RunL
+//-----------------------------------------------------------------------------
+//
+void CVibraAction::RunL()
+    {
+    FUNC_LOG;
+    
+    if( DoRunVibraL() == CCFActionPlugIn::ENone )
+        {
+        // All repeats executed, finnish vibra action
+        iObserver.VibraActionCompletedL();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CVibraAction::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CVibraAction::RunError( TInt aError )
+    {
+    FUNC_LOG;
+    
+    INFO_1( "CVibraAction::RunError: aError == %d", aError );
+
+    // Avoid Panic in CActiveScheduler
+    aError = KErrNone;
+
+    return aError;
+    }
+
+
+//-----------------------------------------------------------------------------
+// CVibraAction::DoCancel
+//-----------------------------------------------------------------------------
+//
+void CVibraAction::DoCancel()
+    {
+    FUNC_LOG;
+    
+    // Stop vibra just in case
+    TRAP_IGNORE( DoStopVibraL() );
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::VibraModeChanged
+//-----------------------------------------------------------------------------
+//
+void CVibraAction::VibraModeChanged( CHWRMVibra::TVibraModeState aStatus )
+    {
+    FUNC_LOG;
+    
+    INFO_1( "Old vibra mode: %d", iVibraModeState );
+    iVibraModeState = aStatus;
+    INFO_1( "New vibra mode: %d", iVibraModeState );
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::VibraStatusChanged
+//-----------------------------------------------------------------------------
+//
+void CVibraAction::VibraStatusChanged(
+    CHWRMVibra::TVibraStatus /*aStatus*/ )
+    {
+    FUNC_LOG;
+    
+    // Nothing to do
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::DoRunVibraL
+//-----------------------------------------------------------------------------
+//
+CCFActionPlugIn::TExecutionTime CVibraAction::DoRunVibraL()
+    {
+    FUNC_LOG;
+
+    CCFActionPlugIn::TExecutionTime time = CCFActionPlugIn::ENone;
+    iVibra->StartVibraL( iInfo.iDuration, iInfo.iIntensity );
+    iRepeats++;
+    
+    INFO_1( "Vibra activated: times = %d", iRepeats );
+    
+    if( iRepeats < iInfo.iRepeats )
+        {
+        // We have repeats
+        After( MicroSeconds( iInfo.iRepeatInterval ) );
+        time = CCFActionPlugIn::ELong;
+        }
+        
+    return time;
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::DoStopVibraL
+//-----------------------------------------------------------------------------
+//
+void CVibraAction::DoStopVibraL()
+    {
+    FUNC_LOG;
+
+    iVibra->StopVibraL();
+    iRepeats = 0;
+    }
+
+//-----------------------------------------------------------------------------
+// CVibraAction::MicroSeconds
+//-----------------------------------------------------------------------------
+//
+TTimeIntervalMicroSeconds32 CVibraAction::MicroSeconds(
+    TInt aMilliSeconds ) const
+    {
+    FUNC_LOG;
+    
+    return TTimeIntervalMicroSeconds32( aMilliSeconds * KMultiplier );
+    }