sysanadatacapture/piprofiler/piprofiler_api/inc/PluginSampler.h
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:52:57 +0200
changeset 1 3ff3fecb12fe
permissions -rw-r--r--
Add initial version of PI Profiler under EPL

/*
* 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:  
*
*/


#ifndef __PLUGINSAMPLER_H__
#define __PLUGINSAMPLER_H__

/*
 * The user-interface to the sampling device driver sued by the profiling engine
 */
//	#include <piprofiler/ProfilerConfig.h>
//	#include <piprofiler/ProfilerVersion.h>	// versions removed from ProfilerConfig.h

#ifndef __KERNEL_MODE__
#include <utf.h>
#endif

/*
 *	Forward declarations
 */
class TBapBuf;

/**
 * A minimal capabilities class for the Sampling device.
 * It just returns the version number.
 */
class TCapsSamplerV01
	{
public:
	TVersion	iVersion;
	};


const TInt KMinDelay = 1;
const TInt KMaxDelay = 10000;

/**
 * The user device driver class for controlling the plugin sampler.
 */

class RPluginSampler :  public RBusLogicalChannel // public RPluginSampler
{	
	friend class DPluginDriver;
	public:
		enum TControl
		{
			EOutputSettingsForTrace,
			EMarkTraceActive,
			EMarkTraceInactive,
			ESample,
			EStartSampling,
			EGetSampleTime,
			EGetSamplerVersion,
			EStopAndWaitForEnd,
			ESetSamplingPeriod,
			EAdditionalTraceSettings,
			EAdditionalTraceSettings2,
			EAdditionalTraceSettings3,
			EAdditionalTraceSettings4,
			//EPrintTraces,
			ECancelStreamRead,
			ERequestFillThisStreamBuffer,
			ERequestPrintStreamBuffer,
			ETest
		};

	public:
		#ifndef __KERNEL_MODE__
		
		inline ~RPluginSampler();
			
		/**
		 * 
		 * Methods for controlling the sampler device
		 * 
		 **/
		/** Open a channel to the sampling device **/
		virtual TInt Open() = 0;

		/** Set sampling period for sampler */
		inline void SetSamplingPeriod(TInt samplerId, TInt settings);
		
		/** Set additional trace settings **/
		inline void AdditionalSettingsForTrace(TInt samplerId,TInt settings);
		inline void AdditionalSettingsForTrace2(TInt samplerId,TInt settings);
		inline void AdditionalSettingsForTrace3(TInt samplerId,TInt settings);
		inline void AdditionalSettingsForTrace4(TInt samplerId,TInt settings);
		
		/** Mark trace active **/
		inline void MarkTraceActive(TUint32 id);

		/** Mark trace inactive **/
		inline void MarkTraceInactive(TUint32 id);

		/** Sample command to kernel LDD**/
		inline void Sample();
		
		/** Start tracing **/
		inline void StartSampling();

		/** Stop tracing **/
		inline void StopSampling();

		/** Get current sampling time **/
		inline TUint32 GetSampleTime();

		/** Get sampler version as descriptor **/
		virtual void GetSamplerVersion(TDes*);

		/** Get next filled buffer in stream mode **/
		void GetNextbuffer( );

		/** Request stream read **/
		void FillThisStreamBuffer(TBapBuf* aBuffer, TRequestStatus& aStatus);

		/** Request print buffer**/
		void PrintStreamBuffer(TDesC16* aBuffer);
		
		/** Run test case **/
		inline void Test(TUint32 testCase);

		#endif	// !__KERNEL_MODE__	
};


#ifndef __KERNEL_MODE__
inline RPluginSampler::~RPluginSampler()
{
}

inline void RPluginSampler::AdditionalSettingsForTrace(TInt samplerId,TInt settings)
	{
	DoControl(EAdditionalTraceSettings,
			reinterpret_cast<TAny*>(samplerId),
			reinterpret_cast<TAny*>(settings));
	}

inline void RPluginSampler::AdditionalSettingsForTrace2(TInt samplerId,TInt settings)
	{
	DoControl(EAdditionalTraceSettings2,
			reinterpret_cast<TAny*>(samplerId),
			reinterpret_cast<TAny*>(settings));
	}

inline void RPluginSampler::AdditionalSettingsForTrace3(TInt samplerId,TInt settings)
	{
	DoControl(EAdditionalTraceSettings3,
			reinterpret_cast<TAny*>(samplerId),
			reinterpret_cast<TAny*>(settings));
	}

inline void RPluginSampler::AdditionalSettingsForTrace4(TInt samplerId,TInt settings)
	{
	DoControl(EAdditionalTraceSettings4,
			reinterpret_cast<TAny*>(samplerId),
			reinterpret_cast<TAny*>(settings));
	}

inline void RPluginSampler::SetSamplingPeriod(TInt samplerId, TInt settings)
	{
	DoControl(ESetSamplingPeriod, 
			reinterpret_cast<TAny*>(samplerId),
			reinterpret_cast<TAny*>(settings));
	}


inline void RPluginSampler::MarkTraceActive(TUint32 id)
{
		DoControl(EMarkTraceActive, reinterpret_cast<TAny*>(id));
}

inline void RPluginSampler::MarkTraceInactive(TUint32 id)
{
		DoControl(EMarkTraceInactive, reinterpret_cast<TAny*>(id));
}

inline void RPluginSampler::Sample()
	{
	DoControl(ESample);
	}

inline void RPluginSampler::StartSampling()
{
	// at first, start the kernel side samplers
	DoControl(EStartSampling);
}

inline void RPluginSampler::StopSampling()
{
	// stop the device driver and the kernel mode samplers
	TRequestStatus status;
	status = KRequestPending;
	DoRequest(EStopAndWaitForEnd,status);
	User::WaitForRequest(status);
}

inline TUint32 RPluginSampler::GetSampleTime()
{
	TUint32* sampleTime = new TUint32;

	DoControl(EGetSampleTime,reinterpret_cast<TAny*>(sampleTime));
	TUint32 value = *sampleTime;
	delete sampleTime;

	return value;
}

inline void RPluginSampler::GetSamplerVersion(TDes* aDes)
{
	TBuf8<16> buf;
	DoControl(EGetSamplerVersion,(TAny*)&buf);
	CnvUtfConverter::ConvertToUnicodeFromUtf8(*aDes,buf);
}

inline void RPluginSampler::PrintStreamBuffer(TDesC16* aDes) 
{
	DoControl(ERequestPrintStreamBuffer,reinterpret_cast<TAny*>(aDes));
}

inline void RPluginSampler::FillThisStreamBuffer(TBapBuf* aBuffer, TRequestStatus& aStatus)
{
	aStatus = KRequestPending;
	DoRequest(ERequestFillThisStreamBuffer,aStatus,(TAny*)aBuffer);

}

inline void RPluginSampler::Test(TUint32 testCase)
{
	DoControl(ETest,reinterpret_cast<TAny*>(testCase));
}

#endif
#endif