--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/inc/CamPerformance.h Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,463 @@
+/*
+* Copyright (c) 2007 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: Macros, event definitions and memory logging class header*
+*/
+
+
+#ifndef CAM_PERFORMANCE_H
+#define CAM_PERFORMANCE_H
+
+// INCLUDES
+#include <e32base.h> // RDebug
+#include <coemain.h> // CCoeStatic
+
+// FORWARD DECLARATIONS
+class TLogItem;
+class RFileWriteStream;
+
+// #define CAMERAAPP_PERFORMANCE_MEASUREMENT
+
+/*
+CAMERAAPP PERFORMANCE MEASUREMENT FRAMEWORK
+
+If the flag CAMERAAPP_PERFORMANCE_MEASUREMENT is defined, the following
+macros can be used for logging:
+
+LEVEL 1 (High level):
+PERF_EVENT_START_L1( EVENT )
+PERF_EVENT_END_L1( EVENT )
+PERF_MESSAGE_L1( MESSAGE )
+PERF_ENGINE_STATE_CHANGE( STATE )
+PERF_OPERATION_STATE_CHANGE( STATE )
+
+LEVEL 2 (Intermediate level):
+PERF_EVENT_START_L2( EVENT )
+PERF_EVENT_END_L2( EVENT )
+PERF_MESSAGE_L2( MESSAGE )
+
+LEVEL 3 (Low level):
+PERF_EVENT_START_L3( EVENT )
+PERF_EVENT_END_L3( EVENT )
+PERF_MESSAGE_L3( MESSAGE )
+*/
+
+#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
+// Log levels
+#define CAMERAAPP_PERF_L1 // High level logging enabled
+#define CAMERAAPP_PERF_L2 // Intermediate level logging enabled
+#define CAMERAAPP_PERF_L3 // Low level logging enabled
+
+// Different methods of logging in use
+// Memory log data is written to disk when application is closed
+#define CAMERAAPP_PERF_LOG_TRACES // Logging to traces enabled
+#define CAMERAAPP_PERF_LOG_MEMORY // Logging to memory enabled
+
+#endif // CAMERAAPP_PERFORMANCE_MEASUREMENT
+
+
+// Log data to traces using event names, instead of numeric event values
+// For example: e_123_1 -> e_EEventName_1
+#define CAMERAAPP_PERF_LOG_TRACES_AS_TEXT
+
+// Log filename for memory logs output
+_LIT( KPerfLogFilename, "C:\\CameraPerf.log" );
+
+// Perform analysis of event data after memory logging
+#define CAMERAAPP_PERF_LOG_ANALYZE_EVENTS
+_LIT( KPerfAnalysisFileName, "C:\\CameraPerfAnalysis.log" );
+
+// Show warnings about invalid start/end events in event analysis log
+#define CAMERAAPP_PERF_ANALYSIS_WARN_END_WITHOUT_START
+#define CAMERAAPP_PERF_ANALYSIS_WARN_START_WITHOUT_END
+#define CAMERAAPP_PERF_ANALYSIS_WARN_MULTIPLE_START
+
+// Event definitions
+enum TCamEvent
+ {
+ EPerfEventAppFirstStartup = 0,
+ EPerfEventApplicationShutdown,
+ EPerfEventSwitchToStillMode,
+ EPerfEventSwitchToVideoMode,
+ EPerfEventKeyToCapture,
+ EPerfEventShotToSnapshot,
+ EPerfEventShotToStillImageReady,
+ EPerfEventShotToSave,
+ EPerfEventAutoFocus,
+ EPerfEventSequenceCapture,
+ EPerfEventStartVideoRecording,
+ EPerfEventVideoStopToSave,
+ EPerfEventBurstCaptureMomentToViewfinderFrame,
+ EPerfEventAvkonUIConstruction,
+ EPerfEventCAEConstruction,
+ EPerfEventCAEInit,
+ EPerfEventPreCaptureViewConstruction,
+ EPerfEventActivePaletteConstruction,
+ EPerfEventPrepareStill,
+ EPerfEventPostCaptureViewConstruction,
+ EPerfEventVideoPreCaptureViewActivation,
+ EPerfEventStillPreCaptureViewDeactivation,
+ EPerfEventPrepareVideo,
+ EPerfEventVideoPreCaptureViewDeactivation,
+ EPerfEventStillPreCaptureViewActivation,
+ EPerfEventStillPostCaptureViewActivation,
+ EPerfEventSaveImage,
+ EPerfEventBurstThumbnailViewActivation,
+ EPerfEventAppSubsequentStartup,
+ EPerfEventLastEvent
+ };
+
+// Message definitions
+enum TCamMessage
+ {
+ EPerfMessageTestMessage = 0,
+ EPerfMessageStartingViewFinder,
+ EPerfMessageActivePaletteAnimationStarting,
+ EPerfMessageStoppingViewFinder,
+ EPerfMessageBurstSnapshotReady,
+ EPerfMessageBurstStillimageReady,
+ EPerfMessageStartingRecord,
+ EPerfMessagePausingViewFinder,
+ EPerfMessageCaptureKeyHalfPressed,
+ EPerfMessageLastMessage
+ };
+
+enum TCamPerformanceState
+ {
+ EPerfWaitingForStartup = 0,
+ EPerfIdle,
+ EPerfWaitingForStillMode,
+ EPerfWaitingForVideoMode,
+ EPerfWaitingForBurstFrame
+ };
+
+// Macros that handle the logging to traces
+#ifdef CAMERAAPP_PERF_LOG_TRACES_AS_TEXT
+ // Log enum arguments with their names, for example: e_EEventApplicationStartup_1
+ #define PERF_EVENT_START_TRACE( EVENT ) RDebug::Print( KPerfEventStartText, &(_L( #EVENT )) );
+ #define PERF_EVENT_END_TRACE( EVENT ) RDebug::Print( KPerfEventEndText, &(_L( #EVENT )) );
+ #define PERF_MESSAGE_TRACE( EVENT ) RDebug::Print( KPerfMessageText, &(_L( #EVENT )) );
+ #define PERF_ENGINE_STATE_CHANGE_TRACE( STATE ) RDebug::Print( KPerfEngineStateChange, STATE );
+ #define PERF_OPERATION_STATE_CHANGE_TRACE( STATE ) RDebug::Print( KPerfOperationStateChange, STATE );
+#else
+ // Log enum arguments as their integer values, for example: e_123_1
+ #define PERF_EVENT_START_TRACE( EVENT ) RDebug::Print( KPerfEventStart, EVENT );
+ #define PERF_EVENT_END_TRACE( EVENT ) RDebug::Print( KPerfEventEnd, EVENT );
+ #define PERF_MESSAGE_TRACE( EVENT ) RDebug::Print( KPerfMessage, EVENT );
+ #define PERF_ENGINE_STATE_CHANGE_TRACE( STATE ) RDebug::Print( KPerfEngineStateChange, STATE );
+ #define PERF_OPERATION_STATE_CHANGE_TRACE( STATE ) RDebug::Print( KPerfOperationStateChange, STATE );
+#endif // CAMERAAPP_PERF_LOG_AS_TEXT
+
+// Macros that handle logging to memory
+#define PERF_EVENT_START_MEMORY( EVENT ) CCamPerformanceLogger::Logger()->EventStart( EVENT );
+#define PERF_EVENT_END_MEMORY( EVENT ) CCamPerformanceLogger::Logger()->EventEnd( EVENT );
+#define PERF_MESSAGE_MEMORY( EVENT ) CCamPerformanceLogger::Logger()->Message( EVENT );
+#define PERF_ENGINE_STATE_CHANGE_MEMORY( STATE ) CCamPerformanceLogger::Logger()->EngineState( STATE );
+#define PERF_OPERATION_STATE_CHANGE_MEMORY( STATE ) CCamPerformanceLogger::Logger()->OperationState( STATE );
+
+// High level (L1) logging macro definitions
+#ifdef CAMERAAPP_PERF_L1
+
+ #if defined (CAMERAAPP_PERF_LOG_TRACES) && defined (CAMERAAPP_PERF_LOG_MEMORY)
+ // Log to traces and memory
+ #define PERF_EVENT_START_L1( EVENT ) PERF_EVENT_START_TRACE( EVENT ); PERF_EVENT_START_MEMORY( EVENT );
+ #define PERF_EVENT_END_L1( EVENT) PERF_EVENT_END_TRACE( EVENT ); PERF_EVENT_END_MEMORY( EVENT );
+ #define PERF_MESSAGE_L1( EVENT ) PERF_MESSAGE_TRACE( EVENT ); PERF_MESSAGE_MEMORY( EVENT );
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_TRACE( STATE ); PERF_ENGINE_STATE_CHANGE_MEMORY( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_TRACE( STATE ); PERF_OPERATION_STATE_CHANGE_MEMORY( STATE );
+
+ #elif defined (CAMERAAPP_PERF_LOG_TRACES)
+ // Log only to traces
+ #define PERF_EVENT_START_L1( EVENT ) PERF_EVENT_START_TRACE( EVENT );
+ #define PERF_EVENT_END_L1( EVENT ) PERF_EVENT_END_TRACE( EVENT );
+ #define PERF_MESSAGE_L1( EVENT) PERF_MESSAGE_TRACE( EVENT );
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_TRACE( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_TRACE( STATE );
+
+ #elif defined (CAMERAAPP_PERF_LOG_MEMORY)
+ // Log only to memory
+ #define PERF_EVENT_START_L1( EVENT ) PERF_EVENT_START_MEMORY( EVENT );
+ #define PERF_EVENT_END_L1( EVENT ) PERF_EVENT_END_MEMORY( EVENT );
+ #define PERF_MESSAGE_L1( EVENT) PERF_MESSAGE_MEMORY( EVENT );
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_MEMORY( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_MEMORY( STATE );
+
+ #else
+ // Logging enabled, but no logging way specified - empty macro implementations
+ #define PERF_EVENT_START_L1( A ) ;
+ #define PERF_EVENT_END_L1( A ) ;
+ #define PERF_MESSAGE_L1( A ) ;
+ #define PERF_ENGINE_STATE_CHANGE( A ) ;
+ #define PERF_OPERATION_STATE_CHANGE( A ) ;
+ #endif
+
+#else
+ // L1 logging not enabled - empty macro implementation
+ #define PERF_EVENT_START_L1( A ) ;
+ #define PERF_EVENT_END_L1( A ) ;
+ #define PERF_MESSAGE_L1( A ) ;
+ #define PERF_ENGINE_STATE_CHANGE( A ) ;
+ #define PERF_OPERATION_STATE_CHANGE( A ) ;
+#endif // CAMERAAPP_PERF_L1
+
+// Intermediate level (L2) logging macro definitions
+#ifdef CAMERAAPP_PERF_L2
+
+ #if defined (CAMERAAPP_PERF_LOG_TRACES) && defined (CAMERAAPP_PERF_LOG_MEMORY)
+ // Log to traces and memory
+ #define PERF_EVENT_START_L2( EVENT ) PERF_EVENT_START_TRACE( EVENT ); PERF_EVENT_START_MEMORY( EVENT );
+ #define PERF_EVENT_END_L2( EVENT) PERF_EVENT_END_TRACE( EVENT ); PERF_EVENT_END_MEMORY( EVENT );
+ #define PERF_MESSAGE_L2( EVENT ) PERF_MESSAGE_TRACE( EVENT ); PERF_MESSAGE_MEMORY( EVENT );
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_TRACE( STATE ); PERF_ENGINE_STATE_CHANGE_MEMORY( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_TRACE( STATE ); PERF_OPERATION_STATE_CHANGE_MEMORY( STATE );
+ #endif
+
+ #elif defined (CAMERAAPP_PERF_LOG_TRACES)
+ // Log only to traces
+ #define PERF_EVENT_START_L2( EVENT ) PERF_EVENT_START_TRACE( EVENT );
+ #define PERF_EVENT_END_L2( EVENT ) PERF_EVENT_END_TRACE( EVENT );
+ #define PERF_MESSAGE_L2( EVENT) PERF_MESSAGE_TRACE( EVENT );
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_TRACE( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_TRACE( STATE );
+ #endif
+
+ #elif defined (CAMERAAPP_PERF_LOG_MEMORY)
+ // Log only to memory
+ #define PERF_EVENT_START_L2( EVENT ) PERF_EVENT_START_MEMORY( EVENT );
+ #define PERF_EVENT_END_L2( EVENT ) PERF_EVENT_END_MEMORY( EVENT );
+ #define PERF_MESSAGE_L2( EVENT) PERF_MESSAGE_MEMORY( EVENT );
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_MEMORY( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_MEMORY( STATE );
+ #endif
+
+ #else
+ // Logging enabled, but no logging way specified - empty macro implementations
+ #define PERF_EVENT_START_L2( A ) ;
+ #define PERF_EVENT_END_L2( A ) ;
+ #define PERF_MESSAGE_L2( A ) ;
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( A ) ;
+ #define PERF_OPERATION_STATE_CHANGE( A ) ;
+ #endif
+ #endif
+
+#else
+ // L2 logging not enabled - empty macro implementation
+ #define PERF_EVENT_START_L2( A ) ;
+ #define PERF_EVENT_END_L2( A ) ;
+ #define PERF_MESSAGE_L2( A ) ;
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( A ) ;
+ #define PERF_OPERATION_STATE_CHANGE( A ) ;
+ #endif
+#endif // CAMERAAPP_PERF_L2
+
+// Low level (L3) logging macro definitions
+#ifdef CAMERAAPP_PERF_L3
+
+ #if defined (CAMERAAPP_PERF_LOG_TRACES) && defined (CAMERAAPP_PERF_LOG_MEMORY)
+ // Log to traces and memory
+ #define PERF_EVENT_START_L3( EVENT ) PERF_EVENT_START_TRACE( EVENT ); PERF_EVENT_START_MEMORY( EVENT );
+ #define PERF_EVENT_END_L3( EVENT) PERF_EVENT_END_TRACE( EVENT ); PERF_EVENT_END_MEMORY( EVENT );
+ #define PERF_MESSAGE_L3( EVENT ) PERF_MESSAGE_TRACE( EVENT ); PERF_MESSAGE_MEMORY( EVENT );
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_TRACE( STATE ); PERF_ENGINE_STATE_CHANGE_MEMORY( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_TRACE( STATE ); PERF_OPERATION_STATE_CHANGE_MEMORY( STATE );
+ #endif
+
+ #elif defined (CAMERAAPP_PERF_LOG_TRACES)
+ // Log only to traces
+ #define PERF_EVENT_START_L3( EVENT ) PERF_EVENT_START_TRACE( EVENT );
+ #define PERF_EVENT_END_L3( EVENT ) PERF_EVENT_END_TRACE( EVENT );
+ #define PERF_MESSAGE_L3( EVENT) PERF_MESSAGE_TRACE( EVENT );
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_TRACE( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_TRACE( STATE );
+ #endif
+
+ #elif defined (CAMERAAPP_PERF_LOG_MEMORY)
+ // Log only to memory
+ #define PERF_EVENT_START_L3( EVENT ) PERF_EVENT_START_MEMORY( EVENT );
+ #define PERF_EVENT_END_L3( EVENT ) PERF_EVENT_END_MEMORY( EVENT );
+ #define PERF_MESSAGE_L3( EVENT) PERF_MESSAGE_MEMORY( EVENT );
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( STATE ) PERF_ENGINE_STATE_CHANGE_MEMORY( STATE );
+ #define PERF_OPERATION_STATE_CHANGE( STATE ) PERF_OPERATION_STATE_CHANGE_MEMORY( STATE );
+ #endif
+
+ #else
+ // Logging enabled, but no logging way specified - empty macro implementations
+ #define PERF_EVENT_START_L3( A ) ;
+ #define PERF_EVENT_END_L3( A ) ;
+ #define PERF_MESSAGE_L3( A ) ;
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( A ) ;
+ #define PERF_OPERATION_STATE_CHANGE( A ) ;
+ #endif
+
+ #endif
+
+#else
+ // L3 logging not enabled - empty macro implementation
+ #define PERF_EVENT_START_L3( A ) ;
+ #define PERF_EVENT_END_L3( A ) ;
+ #define PERF_MESSAGE_L3( A ) ;
+ #ifndef PERF_ENGINE_STATE_CHANGE
+ #define PERF_ENGINE_STATE_CHANGE( A ) ;
+ #define PERF_OPERATION_STATE_CHANGE( A ) ;
+ #endif
+#endif // CAMERAAPP_PERF_L3
+
+#ifdef CAMERAAPP_PERF_LOG_MEMORY
+
+/**
+* Handles memory logging of events, messages and state changes, performing
+* simple event analysis and writing the resulting log files to disk.
+*
+* @since 2.8
+*/
+class CCamPerformanceLogger: public CCoeStatic
+ {
+ public:
+
+ /**
+ * Static function, which returns a pointer to the currently
+ * active CCamPerformanceLogger object or instantiates a new one
+ * @since 2.8
+ * @return pointer to CCamPerformanceLogger object
+ */
+ static CCamPerformanceLogger* Logger();
+
+ /**
+ * Static function, which saves the currently recorded log
+ * data and clears the log.
+ * @since 2.8
+ */
+ static void SaveAndReset();
+
+ /**
+ * Destructor.
+ * @since 2.8
+ */
+ ~CCamPerformanceLogger();
+
+ /**
+ * Appends an event start item to the memory log
+ * @since 2.8
+ * @param aEvent Event type
+ */
+ void EventStart( TCamEvent aEvent );
+
+ /**
+ * Appends an event end item to the memory log
+ * @since 2.8
+ * @param aEvent Event type
+ */
+ void EventEnd( TCamEvent aEvent );
+
+ /**
+ * Appends a message to the memory log
+ * @since 2.8
+ * @param aMessage Message type
+ */
+ void Message( TCamMessage aMessage );
+
+ /**
+ * Appends a state change to the memory log
+ * @since 2.8
+ * @param aState New state
+ */
+ void EngineState( TInt aState );
+
+ /**
+ * Appends a state change to the memory log
+ * @since 2.8
+ * @param aState New state
+ */
+ void OperationState( TInt aState );
+
+ /**
+ * Saves all data from memory log to file KPerfLogFilename
+ * @since 2.8
+ */
+ void SaveLogDataL() const;
+
+ /**
+ * Performs simple analysis to event data from memory log and writes
+ * the result to file KPerfAnalysisFilename
+ * @since 2.8
+ */
+ void SaveAnalysisL() const;
+
+ private:
+ /**
+ * Converts log item data into LogicAnalyzer compatible string, and stores the result in aDes
+ * @param aItem Log item
+ * @param aDes Descriptor
+ * @since 2.8
+ */
+ static void LogItemToDes( const TLogItem& aItem, TDes& aDes );
+
+ /**
+ * Appends time represented by aTime to aDes with format seconds.milliseconds
+ * @param aDes Destination descriptor
+ * @param aTime Time in system 64-bit format
+ * @param aSpace Reserve 6 characters for seconds field
+ * @since 2.8
+ */
+ static void AppendTime( TDes& aDes, TInt64 aTime, TBool aSpace=EFalse );
+
+ /**
+ * Writes the contents of descriptor aDes followed by '\n' to aStream
+ * @param aStream RFileWriteStream
+ * @param aDes Descriptor
+ * @since 2.8
+ */
+ static void WriteLineL( RFileWriteStream& aStream, TDes& aDes );
+
+ /**
+ * Returns system 64-bit representation of the current time
+ * @since 2.8
+ * @return Time
+ */
+ static TInt64 Time64();
+
+ private:
+ CCamPerformanceLogger();
+ TInt64 iStartTime;
+ RArray<TLogItem> iLogItems;
+ };
+#endif // CAMERAAPP_PERF_LOG_MEMORY
+
+// Log item formatting literals
+_LIT( KPerfEventStart, "e_%d_1" );
+//_LIT( KPerfEventStartText, "e_%S_1" );
+_LIT( KPerfEventStartText, "e_%S 1" );
+_LIT( KPerfEventEnd, "e_%d_0" );
+//_LIT( KPerfEventEndText, "e_%S_0" );
+_LIT( KPerfEventEndText, "e_%S 0" );
+_LIT( KPerfMessage, "m_%d" );
+//_LIT( KPerfMessageText, "m_%S" );
+_LIT( KPerfMessageText, "m_%S;CamMsg;CamMsg" );
+//_LIT( KPerfEngineStateChange, "sm_CamEngine_%d" );
+_LIT( KPerfEngineStateChange, "sm_CamEngine;%d" );
+_LIT( KPerfEngineStateChangeText, "sm_CamEngine_%S" );
+//_LIT( KPerfOperationStateChange, "sm_CamOperation_%d" );
+_LIT( KPerfOperationStateChange, "sm_CamOperation;%d" );
+_LIT( KPerfOperationStateChangeText, "sm_CamOperation_%S" );
+_LIT( KPerfUnknown, "unknown_%d" );
+
+#endif // CAM_PERFORMANCE_H
\ No newline at end of file