kerneltest/e32test/digitiser/d_ldddigitisertest.cpp
changeset 9 96e5fb8b040d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/digitiser/d_ldddigitisertest.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,321 @@
+// Copyright (c) 2008-2009 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 "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:
+// e32test\digitiser\d_ldddigitisertest.cpp
+// LDD for testing the Digitiser  Hal Calls.
+// 
+//
+
+#include <kernel/kernel.h>
+
+#include "d_ldddigitisertest.h"
+
+const TUint KMaxDeviceNumber=10;
+
+TUint 	gDeviceNumber=1;					// Device Number
+TUint	gRegisteredDeviceNumber;			// Represents the registered Hal Entry
+TBool	gHalEntryRegistered; 				// States HAL Entry Successfully registered or not
+static	TDigitiserInfoV02 gDigitserHalData;	// Buffer to  hold the HAL data; 
+static	TUint gPointer3DSupported;			// States whether the pointing device supports 3rd dimension.
+
+class DDigitiserLDDTestFactory : public DLogicalDevice
+//
+// Test LDD factory
+//
+	{
+public:
+	DDigitiserLDDTestFactory();
+	virtual TInt Install(); 								//overriding pure virtual
+	virtual void GetCaps(TDes8& aDes) const;				//overriding pure virtual
+	virtual TInt Create(DLogicalChannelBase*& aChannel); 	//overriding pure virtual
+	};
+
+class DDigitiserLDDTestChannel : public DLogicalChannelBase
+//
+// Test logical channel
+//
+	{
+public:
+	virtual ~DDigitiserLDDTestChannel();
+protected:
+	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+	virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
+	};
+
+// Initialise Digitiser HAL Data
+void initialiseDigitiserHalData()
+	{
+//  TDigitiserInfoV02 Class Data layout
+  
+//class TDigitiserInfoV02 : public TDigitiserInfoV01
+//	{	
+//public :
+//	TInt iZRange;				/**< The maximum distance to screen a pointing device will be detected (settable).*/
+//	TUint8 iThetaSupported;		/**< A Boolean value that indicates if Theta polar angle detection (tilt) is supported.*/
+//	TUint8 iPhiSupported;		/**< A Boolean value that indicates if Phi polar angle detection (tilt) is supported.*/
+//	TUint8 iAlphaSupported;		/**< A Boolean value that indicates if rotation of the pointing device along its main axis is supported.*/
+//	TUint8 iPressureSupported; 	/**< A Boolean value that indicates if pressure applied on screen is supported.*/
+//	TInt iProximityStep;    	/**<proximity resolution, e.g. proximity readings change in steps of 1, 5, 10, ... */
+//	TInt iMaxPressure;      	/**< maximum pressure reading*/
+//	TInt iPressureStep;     	/**< pressure resolution, */	
+//	TUint8 iMaxPointers;    	/**< max number of multi-touch pointers supported by hardware/driver.*/ 
+//	TUint8 iNumberOfPointers;	/**< Number of pointers it supports (settable).*/
+//	};
+
+    gPointer3DSupported=1;
+    gDigitserHalData.iZRange=100;
+	gDigitserHalData.iThetaSupported=1;
+	gDigitserHalData.iPhiSupported=1;
+	gDigitserHalData.iPressureSupported=1;
+	gDigitserHalData.iAlphaSupported=1;
+	gDigitserHalData.iProximityStep=5;
+	gDigitserHalData.iMaxPointers=2;
+	gDigitserHalData.iNumberOfPointers=2;
+	gDigitserHalData.iMaxPressure=5000;
+	gDigitserHalData.iPressureStep=500;
+	}
+
+LOCAL_C TInt halFunction(TAny* /*aPtr*/, TInt aFunction, TAny* a1, TAny* /*a2*/)
+	{
+	TInt r=KErrNone;
+	TPckgBuf<TDigitiserInfoV02> vPckg(gDigitserHalData);
+	switch(aFunction)
+		{
+		case EDigitiserHal3DInfo:
+			// Get Request for all but EPointer3D. Copy the TDigitiserInfoV02 object to a1
+			Kern::InfoCopy(*(TDes8*)a1,vPckg);
+			break;
+		case EDigitiserHal3DPointer:
+			// Get request EPointer3D
+			kumemput32(a1,&gPointer3DSupported,sizeof(gPointer3DSupported));
+			break;
+		case EDigitiserHalSetZRange:
+			// Set requeest for EPointer3DMaxProximity (iZRange)
+			gDigitserHalData.iZRange=(TInt)a1;
+			break;
+		case EDigitiserHalSetNumberOfPointers:
+			// Set request for EPointerNumberOfPointers
+			gDigitserHalData.iNumberOfPointers=static_cast<TUint8>((TInt)a1);
+			break;
+		default:
+			r=KErrNotSupported;
+			break;
+		}
+	return r;
+	}
+
+#ifdef GRAPHICS_VERSION
+DECLARE_EXTENSION_LDD()
+	{
+	return new DDigitiserLDDTestFactory;
+	}
+DECLARE_STANDARD_EXTENSION()
+	{
+	TInt r;
+	// Initialise Digitiser HAL Data first.
+	initialiseDigitiserHalData();
+	// Find device number
+	do
+		{
+		r=Kern::AddHalEntry(EHalGroupDigitiser,halFunction,NULL,gDeviceNumber);
+		}
+	while((r==KErrInUse) && (++gDeviceNumber < KMaxDeviceNumber));
+		
+	if((gDeviceNumber < KMaxDeviceNumber) && (r==KErrNone))
+		{
+		gHalEntryRegistered = ETrue;
+		gRegisteredDeviceNumber = gDeviceNumber;
+		}
+	else
+		{
+		gHalEntryRegistered = EFalse;
+		r=KErrInUse;
+		}
+	return r;
+	}
+#else
+DECLARE_STANDARD_LDD()
+	{
+	return new DDigitiserLDDTestFactory;
+	}
+#endif
+
+//
+// Constructor
+//
+DDigitiserLDDTestFactory::DDigitiserLDDTestFactory()
+	{
+	}
+
+TInt DDigitiserLDDTestFactory::Create(DLogicalChannelBase*& aChannel)
+	{
+//
+// Create new channel
+//  
+	aChannel=new DDigitiserLDDTestChannel;
+	return aChannel?KErrNone:KErrNoMemory;
+	}
+
+TInt DDigitiserLDDTestFactory::Install()
+//
+// Install the LDD - overriding pure virtual
+	{
+	return SetName(&KLddName);
+	}
+
+void DDigitiserLDDTestFactory::GetCaps(TDes8& /*aDes*/) const
+//
+// Get capabilities - overriding pure virtual
+//
+	{
+	}
+
+TInt DDigitiserLDDTestChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
+//
+// Create channel
+//
+	{
+	return KErrNone;
+	}
+
+DDigitiserLDDTestChannel::~DDigitiserLDDTestChannel()
+//
+// Destructor
+//
+	{
+	}
+
+TInt DDigitiserLDDTestChannel::Request(TInt aReqNo, TAny* a1, TAny* /*a2*/)
+	{
+	TInt r=KErrNone;
+	switch(aReqNo)
+		{
+		case (RLddDigitiserTest::EADDHALENTRY):
+#ifndef GRAPHICS_VERSION
+            NKern::ThreadEnterCS();
+			do
+			{
+		    r=Kern::AddHalEntry(EHalGroupDigitiser,halFunction,this,gDeviceNumber);
+			}
+            while((r==KErrInUse) && (++gDeviceNumber < KMaxDeviceNumber));
+			NKern::ThreadLeaveCS();
+
+			if((gDeviceNumber < KMaxDeviceNumber) && (r==KErrNone))
+				{
+				gHalEntryRegistered=ETrue;
+				gRegisteredDeviceNumber=gDeviceNumber;
+				}
+			else
+				{
+				gHalEntryRegistered=EFalse;
+				r=KErrInUse;
+				}
+#else
+			r=KErrNotSupported;
+#endif
+			break;
+		case (RLddDigitiserTest::EREMOVEHALENTRY):
+			if(gHalEntryRegistered)
+				{
+				r=Kern::RemoveHalEntry(EHalGroupDigitiser,gRegisteredDeviceNumber);
+				}
+		break;
+		case (RLddDigitiserTest::EGETREGISTEREDDEVICENUMBER):
+			if(gHalEntryRegistered)
+				{
+				r=gRegisteredDeviceNumber;
+				}
+			else
+				{
+				r=KErrNotFound;
+				}
+			break;
+		case (RLddDigitiserTest::EINITIALISEHALDATA):
+#ifndef GRAPHICS_VERSION
+			initialiseDigitiserHalData();
+#else
+			r=KErrNone;
+#endif
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3D):
+			r=gPointer3DSupported;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3D):
+			gPointer3DSupported=(TUint32)a1;
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTERMAXPROXIMITY):
+			r=gDigitserHalData.iZRange;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTERMAXPROXIMITY):
+			gDigitserHalData.iZRange=(TInt)a1;
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DTHETASUPPORTED):
+			r=gDigitserHalData.iThetaSupported;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DTHETASUPPORTED):
+			gDigitserHalData.iThetaSupported=static_cast<TUint8>((TInt)a1);
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DPHISUPPORTED):
+			r=gDigitserHalData.iPhiSupported;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DPHISUPPORTED):
+			gDigitserHalData.iPhiSupported=static_cast<TUint8>((TInt)a1);
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DROTATIONSUPPORTED):
+			r=gDigitserHalData.iAlphaSupported;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DROTATIONSUPPORTED):
+			gDigitserHalData.iAlphaSupported=static_cast<TUint8>((TInt)a1);
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DPRESSURESUPPORTED):
+			r=gDigitserHalData.iPressureSupported;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DPRESSURESUPPORTED):
+			gDigitserHalData.iPressureSupported=static_cast<TUint8>((TInt)a1);
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DPROXIMITYSTEP):
+			r=gDigitserHalData.iProximityStep;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DPROXIMITYSTEP):
+			gDigitserHalData.iProximityStep=(TInt)a1;
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DMAXPOINTERS):
+			r=gDigitserHalData.iMaxPointers;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DMAXPOINTERS):
+			gDigitserHalData.iMaxPointers=static_cast<TUint8>((TInt)a1);
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DNUMBEROFPOINTERS):
+			r=gDigitserHalData.iNumberOfPointers;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DNUMBEROFPOINTERS):
+			gDigitserHalData.iNumberOfPointers=static_cast<TUint8>((TInt)a1);
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DMAXPRESSURE):
+			r=gDigitserHalData.iMaxPressure;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DMAXPRESSURE):
+			gDigitserHalData.iMaxPressure=(TInt)a1;
+			break;
+		case (RLddDigitiserTest::EGET_EPOINTER3DPRESSURESTEP):
+			r=gDigitserHalData.iPressureStep;
+			break;
+		case (RLddDigitiserTest::ESET_EPOINTER3DPRESSURESTEP):
+			gDigitserHalData.iPressureStep=(TInt)a1;
+			break;
+		default:
+			r=KErrNotSupported;
+			break;
+		} 
+	return r;
+	}