hwrmhaptics/tsrc/hapticstestplugins/src/hwrmhapticstestplugin.cpp
changeset 76 cb32bcc88bad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/src/hwrmhapticstestplugin.cpp	Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,691 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Haptics adaptation test plugin implementation.
+*
+*/
+
+#include <s32mem.h>
+#include <hwrmhapticscommands.h>
+
+#include "hwrmhapticstestplugin.h"
+#include "hwrmhapticstrace.h"
+#include "hwrmhapticsvibeconstants.h"
+#include "plugintimer.h"
+
+// -----------------------------------------------------------------------------
+// Enumeration for special test case in which it is tested that HapticsClient 
+// correctly converts VibeStatus codes to Symbian/S60 error codes.
+// -----------------------------------------------------------------------------
+//
+enum vibestatustests
+    {
+    SUCCESS_TEST = 100,
+    ALREADY_INITIALIZED_TEST,
+    NOT_INITIALIZED_TEST,
+    INVALID_ARGUMENT_TEST,
+    FAIL_TEST,
+    INCOMPATIBLE_EFFECT_TYPE_TEST,
+    INCOMPATIBLE_CAPABILITY_TYPE_TEST,
+    INCOMPATIBLE_PROPERTY_TYPE_TEST,
+    DEVICE_NEEDS_LICENSE_TEST,
+    NOT_ENOUGH_MEMORY_TEST,
+    SERVICE_NOT_RUNNING_TEST,
+    INSUFFICIENT_PRIORITY_TEST,
+    SERVICE_BUSY_TEST,
+    WRN_NOT_PLAYING_TEST,
+    WRN_INSUFFICIENT_PRIORITY_TEST
+    };
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::NewL
+// Static instantiation method. Allocates mem and constructs new test plugin object.
+// -----------------------------------------------------------------------------
+//
+CHWRMHapticsTestPlugin* CHWRMHapticsTestPlugin::NewL( 
+                                    MHWRMHapticsPluginCallback* aCallback )
+    {
+    COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::NewL()") ) );
+    CHWRMHapticsTestPlugin* self = 
+        new ( ELeave ) CHWRMHapticsTestPlugin( aCallback );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::~CHWRMHapticsTestPlugin
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CHWRMHapticsTestPlugin::~CHWRMHapticsTestPlugin()
+    {
+    COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::~CFmtxPlugin()") ) );
+    
+    iStorage.Close();
+    
+    iTimers.ResetAndDestroy();
+    iVibeCmdPacket = NULL;
+ #ifdef PUBLISH_STATE_INFO
+    iCmdProperty.Close();
+    iDataProperty.Close();
+    iVibeCmdProperty.Close();
+#endif /* PUBLISH_STATE_INFO */
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::CHWRMHapticsTestPlugin
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CHWRMHapticsTestPlugin::CHWRMHapticsTestPlugin( 
+    MHWRMHapticsPluginCallback* aCallback )
+    {
+    COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::CHWRMHapticsTestPlugin()") ) );
+    iResponseCallback = aCallback;
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::ConstructL
+// Two-phase construction ConstructL that can leave.
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::ConstructL()
+    {
+    COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::ConstructL") ) );
+    
+    // Create response data buffer
+    iStorage.Create( KHWRMHapticsRespMaxSize );
+    
+    // Read in response file contents
+    RFs fileServer;
+    User::LeaveIfError( fileServer.Connect() );
+    
+    RFile file;
+    TInt err = file.Open( fileServer, KStubResponseFile, EFileRead );
+    if( err !=KErrNone )
+        COMPONENT_TRACE( _L("HWRM HapticsPlugin: Couldn't open file successfully") );
+    
+    file.Read( iFileData );
+    
+    file.Close();
+    fileServer.Close();
+    
+#ifdef PUBLISH_STATE_INFO
+    RProperty::Define( KPSUidHWResourceNotification, KHWRMTestHapticsCommand, RProperty::EInt );
+    RProperty::Define( KPSUidHWResourceNotification, KHWRMTestHapticsDataPckg, RProperty::EByteArray, 512 );
+    RProperty::Define( KPSUidHWResourceNotification, KHWRMTestVibCmdData, RProperty::EInt );
+    iCmdProperty.Attach( KPSUidHWResourceNotification, KHWRMTestHapticsCommand );
+    iDataProperty.Attach( KPSUidHWResourceNotification, KHWRMTestHapticsDataPckg );
+    iVibeCmdProperty.Attach( KPSUidHWResourceNotification, KHWRMTestVibCmdData );
+#endif /* PUBLISH_STATE_INFO */
+    
+    // inform haptics of the plugin state
+    iResponseCallback->PluginEnabled( EHWRMLogicalActuatorAny, ETrue );
+    iResponseCallback->PluginEnabled( EHWRMLogicalActuatorDevice, ETrue );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::ProcessCommandL
+// Implementation of CHWRMHapticsPluginService::ProcessCommandL. 
+// This method processes the haptics command in adaptation layer. In this test
+// plugin simply a timer instance is created with the given data and later, after
+// the timer expiry, the semi-hard-coded response is created in GenericTimerFired
+// method below. 
+// -----------------------------------------------------------------------------
+//     
+void CHWRMHapticsTestPlugin::ProcessCommandL( TInt aCommandId,
+                                              TUint8 aTransId,
+                                              TDesC8& aData )
+    {
+    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Processing command: 0x%x, TransId: 0x%x" ), aCommandId, aTransId ) );
+    
+    TInt retVal( KErrNone );
+    
+    switch ( aCommandId )
+        {
+        case HWRMHapticsCommand::EHapticsCmdId :
+            {
+            COMPONENT_TRACE( _L("HWRM HapticsPlugin: Processed EHapticsCmdId") );
+            }
+            break;
+        default :
+            {
+            COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Unknown Command: 0x%x" ), aCommandId ) );
+#ifdef _DEBUG
+            User::Invariant(); // panic here to notice the problem early
+#endif
+            }
+            break;
+        }
+    
+    
+    iVibeCmdPacket = reinterpret_cast<TVibePacket*>( const_cast<TUint8*>( aData.Ptr() ) ); 
+    // check for NULL pointer
+    if ( NULL == iVibeCmdPacket )
+        {
+        User::Leave( KErrBadDescriptor );
+        }
+    
+    TInt timeout( KTimeOut );
+    
+    _LIT8 ( KTestPluginMgrTransTimerExpires, "KTestPluginMgrTransTimerExpires" );
+    if ( aData.FindF ( KTestPluginMgrTransTimerExpires ) != KErrNotFound )
+        {
+		COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: set the timeout that is more than plug-in manager transaction generic timer time-out period") ) );
+        // set the timeout that is more than plug-in manager transaction generic timer time-out period i.e. > KDefaultPluginTimeout
+        timeout = 4000000;
+        }
+
+#ifdef PUBLISH_STATE_INFO
+    // publish
+    iCmdProperty.Set( aCommandId );
+    iDataProperty.Set( aData );
+    iVibeCmdProperty.Set( iVibeCmdPacket->iSimpleRsp.iCmdCode );
+#endif /* PUBLISH_STATE_INFO */
+
+    // create new timer and append it to the timer (pointer) array
+    CPluginTimer* timer = CPluginTimer::NewL( timeout, iResponseCallback, aCommandId, aTransId, retVal, this );
+    CleanupStack::PushL( timer );
+    iTimers.AppendL( timer );
+    CleanupStack::Pop( timer );
+    
+    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Processing command - return") ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::CancelCommandL
+// Implementation of CHWRMHapticsPluginService::CancelCommandL.
+// Method for cancelling ongoing (emulated) command execution. In practice 
+// removes the timer that was started in order to emulate the given command.
+// -----------------------------------------------------------------------------
+// 
+void CHWRMHapticsTestPlugin::CancelCommandL(
+    TUint8 aTransId, 
+    TInt /*aCommandId*/ )
+    {
+    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Cancelling command - iTimers.Count(): %d " ), iTimers.Count() ) );
+
+    for( TInt i = 0; i < iTimers.Count(); i++ )
+        {
+        if ( iTimers[i]->TransId() == aTransId )
+            {
+            delete iTimers[i];
+            iTimers.Remove( i );
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::GenericTimerFired
+// Callback method that is called from the CPluginTimer after timer expiry. 
+// This method emulates reception of response from the ISA layer to a haptics
+// command. The actual response is read from a file, converted to binary and 
+// then the Haptics plugin manager's callback method (ProcessResponseL) is 
+// called with that binary data.
+// -----------------------------------------------------------------------------
+// 
+void CHWRMHapticsTestPlugin::GenericTimerFired(
+    MHWRMHapticsPluginCallback* aService,
+    TInt aCommandId,
+    TUint8 aTransId,
+    TInt aRetVal )
+    {
+    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: GenericTimerFired (0x%x, 0x%x, %d)" ), aCommandId, aTransId, aRetVal ) );
+
+    __ASSERT_ALWAYS( aService != NULL, User::Invariant() );
+    
+    TInt err = KErrNone;
+    TBuf8<KHWRMHapticsRespMaxSize> binRespData;
+    if ( NULL != iVibeCmdPacket )
+        {
+        TBool jumpCases = EFalse;
+        
+        // Special case for vibeStatus to S60 err code manipulations:
+        if ( iVibeCmdPacket->iSimpleRsp.iCmdCode == KVibeCmdPlayIVTEffectNoData )
+            {
+            TVibePacketPlayIVTEffectRequest* playReq = reinterpret_cast<TVibePacketPlayIVTEffectRequest*>( iVibeCmdPacket );
+            if ( playReq )
+                {
+                jumpCases = ETrue;
+                
+                // the repeat value is used to indicate which sub-case is ongoing.. 
+                // values between 100...114 are treated as special values.
+                switch ( playReq->iRepeat )
+                    {
+                    case SUCCESS_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_S_SUCCESS") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseSuccess ), binRespData );
+                        break;
+                        }
+                    case ALREADY_INITIALIZED_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_ALREADY_INITIALIZED") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseAlreadyInit ), binRespData );
+                        break;
+                        }                        
+                    case NOT_INITIALIZED_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_NOT_INITIALIZED") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseNotInit ), binRespData );
+                        break;
+                        }
+                    case INVALID_ARGUMENT_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INVALID_ARGUMENT") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseInvalidArg ), binRespData );
+                        break;
+                        }        
+                    case FAIL_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_FAIL") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseFail ), binRespData );
+                        break;
+                        }
+                    case INCOMPATIBLE_EFFECT_TYPE_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INCOMPATIBLE_EFFECT_TYPE") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseIncompEffType ), binRespData );
+                        break;
+                        }                        
+                    case INCOMPATIBLE_CAPABILITY_TYPE_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INCOMPATIBLE_CAPABILITY_TYPE") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseIncompCapaType ), binRespData );
+                        break;
+                        }
+                    case INCOMPATIBLE_PROPERTY_TYPE_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INCOMPATIBLE_PROPERTY_TYPE") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseIncompPropType ), binRespData );
+                        break;
+                        }                 
+                    case DEVICE_NEEDS_LICENSE_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_DEVICE_NEEDS_LICENSE") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseDevNeedsLicense ), binRespData );
+                        break;
+                        }
+                    case NOT_ENOUGH_MEMORY_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_NOT_ENOUGH_MEMORY") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseNotEnoughMem ), binRespData );
+                        break;
+                        }                        
+                    case SERVICE_NOT_RUNNING_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_SERVICE_NOT_RUNNING") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseSrvNotRunning ), binRespData );
+                        break;
+                        }
+                    case INSUFFICIENT_PRIORITY_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INSUFFICIENT_PRIORITY") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseErrInsuffPriority ), binRespData );
+                        break;
+                        } 
+                    case SERVICE_BUSY_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_SERVICE_BUSY") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseSrvBusy ), binRespData );
+                        break;
+                        }
+                    case WRN_NOT_PLAYING_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_W_NOT_PLAYING") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseWrnNotPlaying ), binRespData );
+                        break;
+                        }                        
+                    case WRN_INSUFFICIENT_PRIORITY_TEST:
+                        {
+                        COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_W_INSUFFICIENT_PRIORITY") ) );
+                        this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseWrnInsuffPriority ), binRespData );
+                        break;
+                        }
+                    default:
+                        {
+                        jumpCases = EFalse;
+                        break;    
+                        }
+                    }
+                if ( jumpCases )
+                    {
+                    iEffectState = ENotPlaying; 
+                    }
+                }
+            }
+            
+        if ( !jumpCases )
+            {
+            // Other cases..
+            switch( iVibeCmdPacket->iSimpleRsp.iCmdCode )
+                {
+            
+                case KVibeCmdInitialize:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_INITIALIZE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );    
+                    TInt pos = iFileData.Find( KVibraCmdInitialize );
+                    iEffectState = ENotPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdOpenDevice:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_OPENDEVICE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdOpenDevice );
+                    iEffectState = ENotPlaying; 
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdSetDeviceProperty:
+                    {
+                     COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_SETDEVICEPROPERTY command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                     TInt pos = iFileData.Find( KVibraCmdSetDeviceProperty );
+                     this->GetBinRespCode( pos, binRespData );
+                     break;
+                    }
+                case KVibeCmdPlayMagSweepEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYMAGSWEEPEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdPlayMagSweepEffect );
+                    iEffectState = EPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdCloseDevice:
+                    {
+                     COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_CLOSEDEVICE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                     TInt pos = iFileData.Find( KVibraCmdCloseDevice );
+                     iEffectState = ENotPlaying;
+                     this->GetBinRespCode( pos, binRespData );
+                     break;
+                    }
+                case KVibeCmdDeviceCount:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_DEVICE_COUNT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdDeviceCount );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdGetDeviceProperty:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETDEVICEPROPERTY command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = 0;
+                    switch (iVibeCmdPacket->iGetDevicePropertyReq.iPropertyValueType)
+                        {
+                        case KVibeValuetypeInt32:
+                            pos = iFileData.Find( KVibraCmdGetDevicePropertyInteger );
+                            break;
+                        case KVibeValuetypeString:
+                            pos = iFileData.Find( KVibraCmdGetDevicePropertyString );
+                            break;                        
+                        case KVibeValuetypeBool:
+                            pos = iFileData.Find( KVibraCmdGetDevicePropertyBool );
+                            break;                        
+                        default:
+#ifdef _DEBUG                        
+                            User::Invariant(); // wrong value type
+#endif                            
+                            ;
+                        }
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdGetDeviceState:
+                    {
+                     COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETDEVICESTATE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                     TInt pos = iFileData.Find( KVibraCmdGetDeviceState );
+                     this->GetBinRespCode( pos, binRespData );
+                     break;
+                    }
+                case KVibeCmdGetDeviceCapabilities:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETDEVICECAPABILITIES command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = 0;
+                    switch (iVibeCmdPacket->iGetDeviceCapsReq.iCapabilityValueType)
+                        {
+                        case KVibeValuetypeInt32:
+                            pos = iFileData.Find( KVibraCmdGetDeviceCapabilitiesInteger );
+                            break;
+                        case KVibeValuetypeString:
+                            pos = iFileData.Find( KVibraCmdGetDeviceCapabilitiesString );
+                            break;
+                        default:
+#ifdef _DEBUG                        
+                            User::Invariant(); // wrong value type
+#endif                            
+                            ;
+                        }
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdPlayPeriodicEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYPERIODICEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdPlayPeriodicEffect );
+                    iEffectState = EPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdPlayIVTEffectIncludeData:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYIVTEFFECT_INCLUDEIVTDATA command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdPlayIVTEffectIncludeIVTData );
+                    iEffectState = EPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdPlayIVTEffectNoData:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYIVTEFFECT_NOIVTDATA command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdPlayIVTEffectNoIVTData );
+                    iEffectState = EPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdStopEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_STOPEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdStopEffect );
+                    iEffectState = ENotPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdStopAllEffects:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_STOPALLEFFECTS command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdStopAllEffects );
+                    iEffectState = ENotPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdPlayStreamingSample:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYSTREAMINGSAMPLE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdPlayStreamingSample );
+                    iEffectState = EPlaying;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+            
+                case KVibeCmdCreateStreamingEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_CREATESTREAMINGEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdCreateStreamingEffect );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdDestroyStreamingEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_DESTROYSTREAMINGEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdDestroyStreamingEffect );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdModifyPlayingMagSweepEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_MODIFYPLAYINGMAGSWEEPEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdModifyPlayingMagSweepEffect );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdModifyPlayingPeriodicEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_MODIFYPLAYINGPERIODICEFFECT: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdModifyPlayingPeriodicEffect );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdPausePlayingEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PAUSEPLAYINGEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdPausePlayingEffect );
+                    iEffectState = EPaused;
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdResumePausedEffect:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_RESUMEPAUSEDEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdResumePausedEffect );
+                    iEffectState = EPlaying; 
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+            
+                case KVibeCmdGetEffectState:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETEFFECTSTATE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos;
+                    if ( iEffectState == ENotPlaying ) 
+                        {
+                        pos = iFileData.Find( KVibraCmdGetEffectStateNotPlaying );
+                        }
+                    else if ( iEffectState == EPlaying ) 
+                        {   
+                        pos = iFileData.Find( KVibraCmdGetEffectStatePlaying );
+                        }
+                    else
+                        {
+                        pos = iFileData.Find( KVibraCmdGetEffectStatePaused );
+                        }
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdSetKernelParameter:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_SETKERNELPARAMETER command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) ); 
+                    TInt pos = iFileData.Find( KVibraCmdSetKernelParameter );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdGetKernelParameter:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETKERNELPARAMETER command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdGetKernelParameter );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                case KVibeCmdSetLicense:
+                    {
+                    COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_SETLICENSE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+                    TInt pos = iFileData.Find( KVibraCmdSetLicense );
+                    this->GetBinRespCode( pos, binRespData );
+                    break;
+                    }
+                default:
+                    {
+                    // do panic --> packetized message not recognized
+                    break;
+                    }    
+                }//switch
+            }
+
+            CHWRMHapticsRespData* respData;
+            TInt32 errorCode( KErrNone );
+            respData = CHWRMHapticsRespData::NewLC( errorCode, binRespData );
+            RDesWriteStream writer( iStorage );
+            CleanupClosePushL( writer );
+            // write to resp data
+            writer << *respData;
+            // remove from stack , it will commit the actual data to the stoarage.
+            CleanupStack::PopAndDestroy( &writer ); 
+            CleanupStack::PopAndDestroy( respData ); 
+            
+        } // if block end for pRsp check
+    
+    
+    TRAP( err, aService->ProcessResponseL( aCommandId, aTransId, iStorage ) );               
+    // delete obsolete timers
+    for( TInt i = ( iTimers.Count()-1 ); i > -1 ; i-- )
+        {
+        if ( !iTimers[i]->IsActive() )
+            {
+            delete iTimers[i];
+            iTimers.Remove( i );            
+            COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: GenericTimerFired - Removed obsolete timer") ) );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::Hex2Bin
+// Converts hexadecimal string given as first parameter to binary data that is 
+// stored to the object referenced by the second parameter.
+// -----------------------------------------------------------------------------
+// 
+void CHWRMHapticsTestPlugin::Hex2Bin( const TDesC8& aSrcBuffer, TDes8& aDstBuffer )
+     {
+     TInt len = aSrcBuffer.Length();
+     aDstBuffer.SetLength( len >> 1 );
+     for ( TInt n=0; n<len; n+=2 )
+         {
+         TUint8 hiNibble = ( (aSrcBuffer[n] > '9' ) ? aSrcBuffer[n] - 'A' + 10: aSrcBuffer[n] - '0' );
+         TUint8 loNibble = ( (aSrcBuffer[n+1] > '9' ) ? aSrcBuffer[n+1] - 'A' + 10: aSrcBuffer[n+1] - '0' );
+ 
+         aDstBuffer[n>>1] = static_cast<TUint8>( ( ( hiNibble << 4 ) + loNibble ) );
+         }
+     }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::GetBinRespCode
+// Helper method that gets the response data string from given position (line)
+// of the (buffered in) response data file, and with the above Hex2Bin method
+// converts the string into binary data that is then stored to the TDes8 object
+// whose reference is given as second param (aBinRespData).
+// -----------------------------------------------------------------------------
+// 
+void CHWRMHapticsTestPlugin::GetBinRespCode( TInt aCmdPosition, TDes8& aBinRespData )
+    {
+     TBuf8<KRespFileData> tempFileData;
+     TBuf8<KHexRespCode>  hexRespCode;
+     
+     tempFileData.Copy( iFileData.Mid( aCmdPosition ) );
+     TInt pos2 = tempFileData.Locate( '"' );
+     TInt pos3 = tempFileData.Locate( '\r' );
+     TInt respCodeLength = ( pos3-2 ) - pos2;
+     
+     hexRespCode.Copy( tempFileData.Mid( pos2+1, respCodeLength ) );
+     
+     CHWRMHapticsTestPlugin::Hex2Bin( hexRespCode, aBinRespData );     
+    }
+
+
+