--- /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 <HtiDispatcherInterface.h>
+#include <HTILogging.h>
+#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