diff -r 000000000000 -r d6fe6244b863 htiui/HtiServicePlugins/HtiSysInfoServicePlugin/src/HtiLightsController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htiui/HtiServicePlugins/HtiSysInfoServicePlugin/src/HtiLightsController.cpp Tue Feb 02 00:17:27 2010 +0200 @@ -0,0 +1,405 @@ +/* +* Copyright (c) 2009 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 for controlling S60 device lights. +* +*/ + + +// INCLUDE FILES +#include +#include +#include "HtiLightsController.h" + +// CONSTANTS +const static TUid KSysInfoServiceUid = { 0x10210CC7 }; + +const static TInt KLightStatusCmdLength = 2; +const static TInt KLightOnCmdLength = 6; +const static TInt KLightOffCmdLength = 5; +const static TInt KLightBlinkCmdLength = 9; + +enum TSysInfoLightControlCommand + { + ELightStatus = 0x30, + ELightOn = 0x31, + ELightOff = 0x32, + ELightBlink = 0x33 + }; + +_LIT8( KErrDescrArgument, "Invalid argument" ); +_LIT8( KErrDescrLightOn, "LightOn failed" ); +_LIT8( KErrDescrLightOff, "LightOff failed" ); +_LIT8( KErrDescrLightBlink, "LightBlink failed" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CHtiLightsController::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CHtiLightsController* CHtiLightsController::NewL( MHtiDispatcher* aDispatcher ) + { + CHtiLightsController* self = new (ELeave) CHtiLightsController( + aDispatcher ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::CHtiLightsController +// C++ default constructor. +// ----------------------------------------------------------------------------- +// +CHtiLightsController::CHtiLightsController( + MHtiDispatcher* aDispatcher ):iDispatcher( aDispatcher ), + iCommand( 0 ), + iTarget( 0 ), + iDuration( 0 ), + iOnDuration( 0 ), + iOffDuration( 0 ), + iIntensity( 0 ), + iFade( EFalse ) + { + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::~CHtiLightsController() +// Destructor +// ----------------------------------------------------------------------------- +// +CHtiLightsController::~CHtiLightsController() + { + HTI_LOG_TEXT("CHtiLightsController destroy"); + delete iLight; + } + +// Second phase construction +void CHtiLightsController::ConstructL() + { + HTI_LOG_TEXT("CHtiLightsController::ConstructL"); + iLight = CHWRMLight::NewL( this ); + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::ProcessMessageL +// Called by the plugin when there is a message to be processed by +// the lights controller. +// ----------------------------------------------------------------------------- +// +void CHtiLightsController::ProcessMessageL( const TDesC8& aMessage, + TDes8& aReply ) + { + HTI_LOG_FUNC_IN( "CHtiLightsController::ProcessMessageL" ); + + iCommand = aMessage[0]; + iReply.Zero(); + + switch ( iCommand ) + { + case ELightStatus: + { + HTI_LOG_TEXT( "ELightStatus" ); + HandleLightStatusL( aMessage ); + break; + } + + case ELightOn: + { + HTI_LOG_TEXT( "ELightOn" ); + HandleLightOnL( aMessage ); + break; + } + + case ELightOff: + { + HTI_LOG_TEXT( "ELightOff" ); + HandleLightOffL( aMessage ); + break; + } + + case ELightBlink: + { + HTI_LOG_TEXT( "ELightBlink" ); + HandleLightBlinkL( aMessage ); + break; + } + + default: + { + // If comes here it's an error from caller. + User::Leave( KErrArgument ); + } + } + + aReply.Copy( iReply ); + + HTI_LOG_FUNC_OUT("CHtiLightsController::ProcessMessageL"); + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::HandleLightStatusL +// Gets the status of the given light target. +// Returns "Not supported" for S60 2.x +// ----------------------------------------------------------------------------- +// +void CHtiLightsController::HandleLightStatusL( const TDesC8& aMessage ) + { + HTI_LOG_FUNC_IN( "CHtiLightsController::HandleLightStatusL" ); + + if ( aMessage.Length() != KLightStatusCmdLength ) + { + iDispatcher->DispatchOutgoingErrorMessage( + KErrArgument, KErrDescrArgument, KSysInfoServiceUid ); + } + + else + { + iTarget = aMessage[1]; + iReply.Append( iLight->LightStatus( iTarget ) ); + } + HTI_LOG_FUNC_OUT( "CHtiLightsController::HandleLightStatusL" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::HandleLightOnL +// Turns on light with specified parameters. +// For S60 2.x just turns on lights forever, parameters are ignored. +// ----------------------------------------------------------------------------- +// +void CHtiLightsController::HandleLightOnL( const TDesC8& aMessage ) + { + HTI_LOG_FUNC_IN( "CHtiLightsController::HandleLightOnL" ); + + if ( aMessage.Length() != KLightOnCmdLength ) + { + iDispatcher->DispatchOutgoingErrorMessage( + KErrArgument, KErrDescrArgument, KSysInfoServiceUid ); + return; + } + + // parse values from message + iTarget = aMessage[1]; + iDuration = aMessage[2] + ( aMessage[3] << 8 ); + iIntensity = aMessage[4]; + iFade = (TBool)aMessage[5]; + + TInt err = KErrNone; + + // normalize possibly abnormal values + if ( iIntensity < KHWRMLightMinIntensity ) + iIntensity = KHWRMDefaultIntensity; + + if ( iIntensity > KHWRMLightMaxIntensity ) + iIntensity = KHWRMLightMaxIntensity; + + if ( iDuration < 1 ) iDuration = KHWRMInfiniteDuration; + + // shoot + TRAP( err, iLight->LightOnL( iTarget, iDuration, iIntensity, iFade ) ); + + if ( err ) + { + iDispatcher->DispatchOutgoingErrorMessage( + err, KErrDescrLightOn, KSysInfoServiceUid ); + } + + else + { + iReply.Append( 0 ); + } + + HTI_LOG_FUNC_OUT( "CHtiLightsController::HandleLightOnL "); + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::HandleLightOffL +// Turns off light with specified parameters. +// Returns "Not supported" for S60 2.x +// ----------------------------------------------------------------------------- +// +void CHtiLightsController::HandleLightOffL( const TDesC8& aMessage ) + { + HTI_LOG_FUNC_IN( "CHtiLightsController::HandleLightOffL" ); + + if ( aMessage.Length() != KLightOffCmdLength ) + { + iDispatcher->DispatchOutgoingErrorMessage( + KErrArgument, KErrDescrArgument, KSysInfoServiceUid ); + return; + } + + // parse values from message + iTarget = aMessage[1]; + iDuration = aMessage[2] + ( aMessage[3] << 8 ); + iFade = (TBool)aMessage[4]; + + // normalize possibly abnormal values + if ( iDuration < 1 ) iDuration = KHWRMInfiniteDuration; + + // shoot + TRAPD( err, iLight->LightOffL( iTarget, iDuration, iFade ) ); + + if ( err ) + { + iDispatcher->DispatchOutgoingErrorMessage( + err, KErrDescrLightOff, KSysInfoServiceUid ); + } + + else + { + iReply.Append( 0 ); + } + HTI_LOG_FUNC_OUT( "CHtiLightsController::HandleLightOffL" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::HandleLightBlinkL +// Blinks light with specified parameters. +// Returns "Not supported" for S60 2.x +// ----------------------------------------------------------------------------- +// +void CHtiLightsController::HandleLightBlinkL( const TDesC8& aMessage ) + { + HTI_LOG_FUNC_IN( "CHtiLightsController::HandleLightBlinkL" ); + + if ( aMessage.Length() != KLightBlinkCmdLength ) + { + iDispatcher->DispatchOutgoingErrorMessage( + KErrArgument, KErrDescrArgument, KSysInfoServiceUid ); + return; + } + + // parse values from message + iTarget = aMessage[1]; + iDuration = aMessage[2] + ( aMessage[3] << 8 ); + iOnDuration = aMessage[4] + ( aMessage[5] << 8 ); + iOffDuration = aMessage[6] + ( aMessage[7] << 8 ); + iIntensity = aMessage[8]; + + // normalize possibly abnormal values + if ( iIntensity < KHWRMLightMinIntensity ) + iIntensity = KHWRMDefaultIntensity; + + if ( iIntensity > KHWRMLightMaxIntensity ) + iIntensity = KHWRMLightMaxIntensity; + + if ( iDuration < 1 ) iDuration = KHWRMInfiniteDuration; + + if ( iOnDuration < 1 || iOffDuration < 1 ) + { + iOnDuration = KHWRMDefaultCycleTime; + iOffDuration = KHWRMDefaultCycleTime; + } + + // shoot + TRAPD( err, iLight->LightBlinkL( + iTarget, iDuration, iOnDuration, iOffDuration, iIntensity ) ); + + if ( err ) + { + iDispatcher->DispatchOutgoingErrorMessage( + err, KErrDescrLightBlink, KSysInfoServiceUid ); + } + + else + { + iReply.Append( 0 ); + } + HTI_LOG_FUNC_OUT( "CHtiLightsController::HandleLightBlinkL" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiLightsController::LightStatusChanged +// Called when status of any light target changes. +// If infinite duration is requested, restores the state back to what was +// last requested. +// This method does not exist for S60 2.x +// ----------------------------------------------------------------------------- +// +void CHtiLightsController::LightStatusChanged( TInt aTarget, + CHWRMLight::TLightStatus aStatus ) + { + HTI_LOG_FORMAT( "Light status changed for target %d", aTarget ); + HTI_LOG_FORMAT( "New status = %d", aStatus ); + HTI_LOG_FORMAT( "Current target = %d", iTarget ); + + TInt target = aTarget & iTarget; + if ( !target ) + { + HTI_LOG_TEXT( "Not interested about the target" ); + return; + } + + HTI_LOG_TEXT( "Matches current target" ); + + if ( iDuration != KHWRMInfiniteDuration ) + { + return; + } + + if ( ( aStatus == CHWRMLight::ELightOn && iCommand == ELightOn ) || + ( aStatus == CHWRMLight::ELightOff && iCommand == ELightOff ) || + ( aStatus == CHWRMLight::ELightBlink && iCommand == ELightBlink ) ) + { + HTI_LOG_TEXT( "Status already OK" ); + return; + } + + HTI_LOG_TEXT( "Infinite duration wanted - restore light status" ); + switch ( iCommand ) + { + case ELightOn: + { + // Ignore error + TRAPD( err, iLight->LightOnL( + target, iDuration, iIntensity, iFade ) ); + HTI_LOG_FORMAT( "LightOnL return code %d", err ); + err = err; // to get rid of compiler warning for non-logging + break; + } + case ELightOff: + { + // Ignore error + TRAPD( err, iLight->LightOffL( target, iDuration, iFade ) ); + HTI_LOG_FORMAT( "LightOffL return code %d", err ); + err = err; // to get rid of compiler warning for non-logging + break; + } + case ELightBlink: + { + // Ignore error + TRAPD( err, iLight->LightBlinkL( + target, iDuration, iOnDuration, + iOffDuration, iIntensity ) ); + HTI_LOG_FORMAT( "LightBlinkL return code %d", err ); + err = err; // to get rid of compiler warning for non-logging + break; + } + default: + break; + } + } + +// End of file