tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/src/tacticonhapticsplayer.cpp
changeset 0 d54f32e146dd
child 12 63c33341dc19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/src/tacticonhapticsplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,291 @@
+/*
+* 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: Class for producing haptics tacticon.
+* Part of:     Tacticon Server
+*/
+
+#include <f32file.h>
+#include <hwrmhaptics.h>
+#include <centralrepository.h>
+#include <ecom/implementationproxy.h>
+
+#include "tacticonhapticsplayer.h"
+#include "tacticonprivatecrkeys.h"
+#include "tacticontrace.h"
+#include "osttracedefinitions.h" 
+#ifdef OST_TRACE_COMPILER_IN_USE 
+#include "tacticonhapticsplayertraces.h"
+#endif
+
+
+// Tacticons
+_LIT8( KPositiveTacticon,     "PositiveTacticon");
+_LIT8( KNegativeTacticon,     "NegativeTacticon");
+_LIT8( KNeutralTacticon,      "NeutralTacticon" );
+
+
+// max length of tacticon names defined above
+const TInt KTacticonNameMaxLen = 128;
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonHapticsPlayer::CTacticonHapticsPlayer( CRepository& aRepository ) :
+    iRepository(aRepository)
+    {
+    
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::ConstructL()
+    {
+    TRACE( "CTacticonHapticsPlayer::ConstructL - Begin" );
+    iHaptics = CHWRMHaptics::NewL( NULL, NULL );
+
+    TUint32 suppMask( 0 );
+    User::LeaveIfError( iHaptics->SupportedActuators( suppMask ) );
+
+    CRepository* playerRepository = CRepository::NewL( KCRUidTacticon ); 
+    CleanupStack::PushL( playerRepository );
+    TInt actuatorType( 0 );
+    playerRepository->Get( KActuatorType, actuatorType );
+    CleanupStack::PopAndDestroy( playerRepository );
+    TRACE2( "CTacticonHapticsPlayer::ConstructL - ActuatorType: %d", actuatorType );
+    if ( actuatorType & suppMask )
+        {
+        // supported actuator, use this
+        iHaptics->OpenActuatorL( ( THWRMLogicalActuators )actuatorType );    
+        }  
+    else 
+        {
+        TRACE3( "CTacticonHapticsPlayer::ConstructL - ActuatorType is not supported: %d/%d", 
+                actuatorType, 
+                suppMask );
+        // suggested actuator is not supported, use default one
+        iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny );    
+        }  
+        
+    User::LeaveIfError( iHaptics->SetDeviceProperty( 
+                                            CHWRMHaptics::EHWRMHapticsLicensekey,
+                                            KNullDesC8() ) );
+    TInt strength( 0 );
+    User::LeaveIfError( iRepository.Get( KTacticonStrength, strength ) );
+    iStrength = strength * 100; // strength is in percents
+    
+    iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                 iStrength );
+    TRACE2( "CTacticonHapticsPlayer::ConstructL - Set strength: %d", iStrength );
+
+    TFileName ivtFile;
+    User::LeaveIfError( iRepository.Get( KTacticonIVTFile, ivtFile ) );
+    TRACE2( "CTacticonHapticsPlayer::ConstructL - Loading IVT file: %S", &ivtFile );
+    
+    HBufC8* ivtBuf = IVTBufAllocL( ivtFile );
+    CleanupStack::PushL( ivtBuf );
+    User::LeaveIfError( iHaptics->LoadEffectData( *ivtBuf, iIVTHandle ) );
+    CleanupStack::PopAndDestroy( ivtBuf );
+    
+    iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, iRepository );
+    iCenRepNotifier->StartListeningL();
+
+    TRACE( "CTacticonHapticsPlayer::ConstructL - End" );
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonHapticsPlayer* CTacticonHapticsPlayer::NewL( CRepository& aRepository )
+    {
+    CTacticonHapticsPlayer* self = 
+                        new ( ELeave ) CTacticonHapticsPlayer( aRepository );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonHapticsPlayer::~CTacticonHapticsPlayer()
+    {
+    delete iCenRepNotifier;
+    delete iHaptics;
+    }
+
+// ---------------------------------------------------------------------------
+// Load IVT file.
+// ---------------------------------------------------------------------------
+//
+HBufC8* CTacticonHapticsPlayer::IVTBufAllocL( const TDesC& aFileName )
+    {
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );  
+    CleanupClosePushL( fs );
+    
+    RFile file;
+    User::LeaveIfError( file.Open( fs, aFileName, EFileRead ) );
+    CleanupClosePushL( file );
+    
+    TInt fileSize( 0 );
+    file.Size( fileSize );
+    
+    HBufC8* ivtFileBuf = HBufC8::NewLC( fileSize );
+    TPtr8 dataBufPtr = ivtFileBuf->Des();
+    
+    User::LeaveIfError( file.Read( dataBufPtr ) );
+
+    CleanupStack::Pop( ivtFileBuf );    
+    CleanupStack::PopAndDestroy( &file );
+    CleanupStack::PopAndDestroy( &fs );
+    return ivtFileBuf;
+    }
+
+// ---------------------------------------------------------------------------
+// Check if there's a change in tacticon settings and set new values if needed.
+// ---------------------------------------------------------------------------
+//  
+void CTacticonHapticsPlayer::DoHandleNotifyGenericL( TUint32 aId )
+    {
+    switch ( aId )
+        {
+        case KTacticonStrength:
+            {
+            // Strength value in settings is multiplied by 100 to scale value 
+            // suitable for haptics.
+            TInt strength(0);
+            iRepository.Get( KTacticonStrength, strength );
+            
+            iStrength = strength * 100;
+            iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                         iStrength );        
+            }
+            break;
+        case KTacticonIVTFile:
+            {
+            TFileName ivtFile;
+            iRepository.Get( KTacticonIVTFile, ivtFile );
+            ChangeIVTFileL( ivtFile );
+            }
+            break;            
+        default:
+            break;
+        } 
+    }
+
+// ---------------------------------------------------------------------------
+// From MCenRepNotifyHandlerCallback.
+// ---------------------------------------------------------------------------
+//    
+void CTacticonHapticsPlayer::HandleNotifyGeneric( TUint32 aId )
+    {
+    TRAP_IGNORE( DoHandleNotifyGenericL( aId ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Load new effect file.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::ChangeIVTFileL( const TDesC& aFileName )
+    {
+    iHaptics->DeleteEffectData( iIVTHandle );
+    
+    HBufC8* ivtBuf = IVTBufAllocL( aFileName );
+   
+    iHaptics->LoadEffectData( *ivtBuf, iIVTHandle );    
+
+    delete ivtBuf;
+    } 
+
+// ---------------------------------------------------------------------------
+// Play tacticon.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::PlayTacticon( TTacticonType aTacticon )
+    {
+    TRACE2( "CTacticonHapticsPlayer::PlayTacticon(%d) - Begin", aTacticon );
+
+    TBuf8<KTacticonNameMaxLen> name;
+    switch( aTacticon )
+        {
+        case EPositiveTacticon:
+            name = KPositiveTacticon;
+            break;
+        case ENegativeTacticon:
+            name = KNegativeTacticon;
+            break;
+        case ENeutralTacticon:
+            name = KNeutralTacticon;
+            break;                      
+        default:
+            return;
+        }
+    TInt effectIndex(0);
+    iHaptics->GetEffectIndexFromName( iIVTHandle, name, effectIndex );
+
+    OstTrace1( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_1,
+               "e_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON 1 0x%x", aTacticon );
+
+    TInt effectHandle(0);
+    iHaptics->PlayEffect( iIVTHandle, effectIndex, effectHandle );
+
+    OstTrace1( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_0,
+               "e_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON 0 0x%x", aTacticon );
+
+    TRACE( "CTacticonHapticsPlayer::PlayTacticon(%d) - End" );
+    }     
+    
+// ---------------------------------------------------------------------------
+// Stop playing tacticon.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::StopTacticon()
+    {
+    OstTrace0( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_STOP_TACTICON_1,
+               "e_TACTICON_HAPTICS_PLAYER_STOP_TACTICON 1" );
+               
+    iHaptics->StopAllPlayingEffects();
+
+    OstTrace0( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_STOP_TACTICON_0,
+               "e_TACTICON_HAPTICS_PLAYER_STOP_TACTICON 0" );
+    } 
+
+//---------------------------------------------------------------------------
+// ImplementationTable[]
+//
+//---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 0x2001FE51, CTacticonHapticsPlayer::NewL )
+    };
+
+//---------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//
+//---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+    return ImplementationTable;
+    }
+   
+// End of file