resourcemgmt/vibractrl/src/vibractrlwrapperimpl.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resourcemgmt/vibractrl/src/vibractrlwrapperimpl.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,234 @@
+/*
+* Copyright (c) 2003 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:  Vibra control API implementation that uses HWRM vibra API
+*                instead of DOS.
+*
+*/
+
+
+// INCLUDE FILES
+#include "vibractrlwrapperimpl.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::CVibraControlImpl
+// Constructor with notify handling.
+// -----------------------------------------------------------------------------
+//
+CVibraControlImpl::CVibraControlImpl(MVibraControlObserver* aCallback)
+    :iCallback(aCallback),
+    iVibra(NULL)
+    {
+    //...
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::~CVibraControlImpl
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CVibraControlImpl::~CVibraControlImpl()
+    {
+    delete iVibra;
+    iVibra = NULL;
+    
+    // PCLint demands
+    iCallback = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::ConstructL
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CVibraControlImpl::ConstructL()
+    {
+    // Ignore status change notifications caused by initialization
+    // to make functionality similar to old vibra.
+    iVibraRouteEvents = EFalse;
+
+    // To get access vibra thru DOS
+    iVibra = CHWRMVibra::NewL(this);
+    
+    iVibraRouteEvents = ETrue;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::HandleErrorL
+// Handles error from HWRM Vibra API
+// -----------------------------------------------------------------------------
+void CVibraControlImpl::HandleErrorL(TInt aError)
+    {
+    if ( aError != KErrNone )
+        {
+        if ( aError == KErrAccessDenied )
+            {
+            NotifyRequestStatus(EVibraRequestNotAllowed);
+            }
+        else 
+            {
+            NotifyRequestStatus(EVibraRequestFail);
+            if ( aError == KErrArgument || aError == KErrNotSupported )
+                {
+                User::Leave(aError);
+                }
+            else
+                {
+                User::Leave(KErrGeneral);
+                }
+            }        
+        }
+    else
+        {
+        NotifyRequestStatus(EVibraRequestOK);
+        iExpectingStop = ETrue;  // Expecting vibra to be stopped by HWRM timer soon.
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::StartVibraL:
+// Route call to HWRM Vibra API
+// -----------------------------------------------------------------------------
+EXPORT_C void CVibraControlImpl::StartVibraL(TUint16 aDuration, TInt aIntensity)
+    {
+    if ( aIntensity != 0 )
+        {        
+        TRAPD(err, iVibra->StartVibraL(aDuration, aIntensity));
+        HandleErrorL(err);
+        }
+    else
+        {
+        StopVibraL();
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::StartVibraL:
+// Route call to HWRM Vibra API
+// -----------------------------------------------------------------------------
+EXPORT_C void CVibraControlImpl::StartVibraL(TUint16 aDuration)
+    {
+    TRAPD(err, iVibra->StartVibraL(aDuration));
+    
+    HandleErrorL(err);
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::StopVibra
+// Vibra is stopped and timer supervising vibra is cancelled.
+// -----------------------------------------------------------------------------
+EXPORT_C void CVibraControlImpl::StopVibraL()
+    {
+    TRAPD(err, iVibra->StopVibraL());
+
+    if ( err != KErrNone )
+        {
+        NotifyRequestStatus(EVibraRequestUnableToStop);
+        User::Leave(err);
+        }
+    else
+        {
+        NotifyRequestStatus(EVibraRequestStopped);
+        }   
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::VibraSettings
+// Mode of the vibra is returned (from user profiles)
+// -----------------------------------------------------------------------------
+EXPORT_C CVibraControl::TVibraModeState CVibraControlImpl::VibraSettings() const
+    {
+    CHWRMVibra::TVibraModeState hwrmState = iVibra->VibraSettings();
+    
+    CVibraControl::TVibraModeState retval;
+    
+    switch (hwrmState)
+        {
+        case CHWRMVibra::EVibraModeON:
+            {
+            retval = CVibraControl::EVibraModeON;
+            break;
+            }
+        case CHWRMVibra::EVibraModeOFF:
+            {
+            retval = CVibraControl::EVibraModeOFF;
+            break;
+            }
+        default:
+            {
+            retval = CVibraControl::EVibraModeUnknown;
+            break;
+            }
+        }
+ 
+    return retval;
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::NotifyRequestStatus
+// VibraRequestStatus callback method is called if there is observer who is
+// listening it.
+// -----------------------------------------------------------------------------
+void CVibraControlImpl::NotifyRequestStatus(TVibraRequestStatus aStatus)
+    {
+    if (iCallback && iVibraRouteEvents  )
+        {
+        iCallback->VibraRequestStatus(aStatus);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::VibraModeChanged
+// Handler for events from HWRM Vibra API
+// -----------------------------------------------------------------------------
+void CVibraControlImpl::VibraModeChanged(CHWRMVibra::TVibraModeState aStatus)
+    {
+    if ( iCallback && iVibraRouteEvents )
+        {        
+        if ( aStatus == CHWRMVibra::EVibraModeON )
+            {
+            iCallback->VibraModeStatus(CVibraControl::EVibraModeON);
+            }
+        else if ( aStatus == CHWRMVibra::EVibraModeOFF )
+            {
+            iCallback->VibraModeStatus(CVibraControl::EVibraModeOFF);
+            }
+        else
+            {
+            iCallback->VibraModeStatus(CVibraControl::EVibraModeUnknown);
+            }
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CVibraControlImpl::VibraStatusChanged
+// Handler for events from HWRM Vibra API
+// -----------------------------------------------------------------------------
+void CVibraControlImpl::VibraStatusChanged(CHWRMVibra::TVibraStatus aStatus)
+    {
+    // Only notify stop if expecting one. This is required to handle
+    // stop generated automatically by HWRM vibra timer. All other
+    // status notifications are either already handled in initial call or 
+    // relate to some other vibra client.
+    if ( iExpectingStop && aStatus == CHWRMVibra::EVibraStatusStopped )
+        {
+        iExpectingStop = EFalse;
+        NotifyRequestStatus(EVibraRequestStopped);
+        }
+    }
+
+//  End of File