diff -r 000000000000 -r 4e1aa6a622a0 resourcemgmt/vibractrl/src/vibractrlwrapperimpl.cpp --- /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