halservices/hal/tsrc/t_newhal.cpp
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
child 117 5b5d147c7838
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// Copyright (c) 1998-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:
// hal\tsrc\t_newhal.cpp
// 
//

#define __E32TEST_EXTENSION__

#include <e32test.h>
#include <hal.h>

RTest test(_L("T_NEWHAL"));

const TText* AttributeNames[]=
	{
	_S("EManufacturer"),
	_S("EManufacturerHardwareRev"),
	_S("EManufacturerSoftwareRev"),
	_S("EManufacturerSoftwareBuild"),
	_S("EModel"),
	_S("EMachineUid"),
	_S("EDeviceFamily"),
	_S("EDeviceFamilyRev"),
	_S("ECPU"),
	_S("ECPUArch"),
	_S("ECPUABI"),
	_S("ECPUSpeed"),
	_S("ESystemStartupReason"),
	_S("ESystemException"),
	_S("ESystemTickPeriod"),		
	_S("EMemoryRAM"),
	_S("EMemoryRAMFree"),
	_S("EMemoryROM"),
	_S("EMemoryPageSize"),	
	_S("EPowerGood"),
	_S("EPowerBatteryStatus"),	
	_S("EPowerBackup"),
	_S("EPowerBackupStatus"),	
	_S("EPowerExternal"),
	_S("EKeyboard"),
	_S("EKeyboardDeviceKeys"),	
	_S("EKeyboardAppKeys"),
	_S("EKeyboardClick"),
	_S("EKeyboardClickState"),	
	_S("EKeyboardClickVolume"),
	_S("EKeyboardClickVolumeMax"),
	_S("EDisplayXPixels"),
	_S("EDisplayYPixels"),
	_S("EDisplayXTwips"),
	_S("EDisplayYTwips"),
	_S("EDisplayColors"),
	_S("EDisplayState"),
	_S("EDisplayContrast"),
	_S("EDisplayContrastMax"),
	_S("EBacklight"),
	_S("EBacklightState"),
	_S("EPen"),
	_S("EPenX"),
	_S("EPenY"),
	_S("EPenDisplayOn"),
	_S("EPenClick"),
	_S("EPenClickState"),
	_S("EPenClickVolume"),
	_S("EPenClickVolumeMax"),
	_S("EMouse"),
	_S("EMouseX"),
	_S("EMouseY"),			
	_S("EMouseState"),
	_S("EMouseSpeed"),
	_S("EMouseAcceleration"),
	_S("EMouseButtons"),
	_S("EMouseButtonState"),
	_S("ECaseState"),
	_S("ECaseSwitch"),
	_S("ECaseSwitchDisplayOn"),
	_S("ECaseSwitchDisplayOff"),
	_S("ELEDs"),
	_S("ELEDmask"),
	_S("EIntegratedPhone"),
	_S("EDisplayBrightness"),
	_S("EDisplayBrightnessMax"),
	_S("EKeyboardBacklightState"),
	_S("EAccessoryPower"),
	_S("ELanguageIndex"),
	_S("EKeyboardIndex"),
	_S("EMaxRAMDriveSize"),
	_S("EKeyboardState"),
	_S("ESystemDrive"),
	_S("EPenState"),
	_S("EDisplayIsMono"),
	_S("EDisplayIsPalettized"),
	_S("EDisplayBitsPerPixel"),
	_S("EDisplayNumModes"),
	_S("EDisplayMemoryAddress"),
	_S("EDisplayOffsetToFirstPixel"),
	_S("EDisplayOffsetBetweenLines"),
	_S("EDisplayPaletteEntry"),
	_S("EDisplayIsPixelOrderRGB"),
	_S("EDisplayIsPixelOrderLandscape"),
	_S("EDisplayMode"),
	_S("ESwitches"),
	_S("EDebugPort"),
	_S("ELocaleLoaded"),
	_S("EClipboardDrive"),
	_S("ECustomRestart"),
	_S("ECustomRestartReason"),
	_S("EDisplayNumberOfScreens"),
	_S("ENanoTickPeriod"),
	_S("EFastCounterFrequency"),
	_S("EFastCounterCountsUp"),
	_S("EPointer3D"),
	_S("EPointer3DMaxProximity"),
	_S("EPointer3DThetaSupported"),
	_S("EPointer3DPhiSupported"),
	_S("EPointer3DRotationSupported"),
	_S("EPointer3DPressureSupported"),
	_S("EHardwareFloatingPoint"),
	_S("ETimeNonSecureOffset"),
	_S("EPersistStartupModeKernel"),
	_S("EMaximumCustomRestartReasons"),
	_S("EMaximumRestartStartupModes"),
	_S("ECustomResourceDrive"),
	_S("EPointer3DProximityStep"),
	_S("EPointerMaxPointers"),
	_S("EPointerNumberOfPointers"),
	_S("EPointer3DMaxPressure"),
	_S("EPointer3DPressureStep"),
	_S("EPointer3DEnterHighPressureThreshold"),
	_S("EPointer3DExitHighPressureThreshold"),
	_S("EPointer3DEnterCloseProximityThreshold"),
	_S("EPointer3DExitCloseProximityThreshold"),
	_S("EDisplayMemoryHandle"),
	_S("ESerialNumber"),
	_S("ECpuProfilingDefaultInterruptBase"),
	_S("ENumCpus"),

	};

TInt MatchAbbrev(const TDesC& anInput, const TText** aList, TInt aListLen)
	{
	TInt first_match=KErrNotFound;
	TInt nmatches=0;
	TInt i;
	for (i=0; i<aListLen; i++)
		{
		TPtrC list_entry(aList[i]);
		TInt r=list_entry.FindF(anInput);
		if (r>=0)
			{
			// substring matches
			if (r==0 && list_entry.Length()==anInput.Length())
				{
				// exact match
				return i;
				}
			if (first_match<0)
				first_match=i;
			++nmatches;
			}
		}
	if (nmatches>1)
		return KErrGeneral;	// ambiguous
	return first_match;		// either KErrNotFound or match index
	}

TInt MatchAttribute(const TDesC& anInput)
	{
	return MatchAbbrev(anInput, AttributeNames, sizeof(AttributeNames)/sizeof(TText*));
	}

void TestGet()
	{
	TInt i;
	TInt n=0;

	for (i=0; i<HAL::ENumHalAttributes; i++)
		{
		TPtrC att_name(AttributeNames[i]);
		TInt val=-1;
		TInt r=HAL::Get((HAL::TAttribute)i,val);
		test.Printf(_L("%S: return %d, value %d(0x%08x)\n"),&att_name,r,val,val);
		if (++n==16)
			{
			n=0;
			test.Printf(_L("\nPress a key to continue...\n"));
			test.Getch();
			}
		}
	}


void TestGetAll()
	{
	User::Allocator().Check();
	HAL::SEntry* pE=NULL;
	TInt nEntries=0;
	TInt r=HAL::GetAll(nEntries, pE);
	test(r==KErrNone);
	test.Printf(_L("%d attributes defined\n"),nEntries);
	test(nEntries==HAL::ENumHalAttributes);
	TInt i;
	for (i=0; i<nEntries; ++i)
		{
		TPtrC att_name(AttributeNames[i]);
		TInt f=pE[i].iProperties;
		TInt v=pE[i].iValue;
		TInt v2=-1;
		TInt r=HAL::Get((HAL::TAttribute)i,v2);
		if (f & HAL::EEntryValid)
			{
			test(r==KErrNone);
			if (f & HAL::EEntryDynamic)
				{
				test.Printf(_L("Attribute %S dynamic "),&att_name);
				if (v2!=v)
					{
					test.Printf(_L("Values %d(%08x), %d(%08x)"),v,v,v2,v2);
					}
				test.Printf(_L("\n"));
				}
			else
				{
				test(v==v2);	// constant attribute
				}
			}
		else
			{
			test.Printf(_L("Attribute %S not supported on this platform or requires parameter\n"),&att_name,r);
			test(r==KErrNotSupported || r==KErrArgument);
			}
		}
	User::Free(pE);
	User::Allocator().Check();
	}

void InputLine(const TDesC& aPrompt, TDes& aLine)
	{
	test.Printf(_L("%S"),&aPrompt);
	aLine.SetLength(0);
	FOREVER
		{
		TKeyCode k=test.Getch();
		switch (k)
			{
			case EKeyEnter:
				test.Printf(_L("\n"));
				return;
			case EKeyEscape:
				aLine.SetLength(0);
				test.Printf(_L("\n%S"),&aPrompt);
				break;
			case EKeyBackspace:
			case EKeyDelete:
				if (aLine.Length()>0)
					{
					aLine.SetLength(aLine.Length()-1);
					test.Printf(_L("\x8"));
					}
				break;
			default:
				{
				TChar ch((TUint)k);
				TBuf<1> b;
				b.Append(ch);
				aLine.Append(ch);
				test.Printf(_L("%S"),&b);
				break;
				}
			}
		}
	}

void TestSet()
	{
	TBuf<256> line;
	FOREVER
		{
		TInt attrib=KErrNotFound;
		while (attrib<0)
			{
			InputLine(_L("Attribute: "),line);
			if (line.Length()==0)
				return;
			attrib=MatchAttribute(line);
			if (attrib==KErrNotFound)
				test.Printf(_L("Unrecognised attribute\n"));
			else if (attrib==KErrGeneral)
				test.Printf(_L("Ambiguous attribute\n"));
			}
		TPtrC attrib_name(AttributeNames[attrib]);
		test.Printf(_L("Attribute %d (%S) selected\n"),attrib,&attrib_name);
		TInt value=0;
		TInt r=KErrGeneral;
		TBool set=ETrue;
		while(r!=KErrNone)
			{
			InputLine(_L("Value: "),line);
			line.Trim();
			TLex lex(line);
			if (line.MatchF(_L("r"))>=0)
				{
				set=EFalse;
				r=KErrNone;
				}
			else if (line.MatchF(_L("0x"))>=0)
				{
				lex.Inc(2);
				r=lex.Val((TUint&)value,EHex);
				}
			else
				{
				r=lex.Val(value);
				}
			}
		if (set)
			{
			r=HAL::Set((HAL::TAttribute)attrib,value);
			test.Printf(_L("Set returns %d\n"),r);
			}
		TInt v2;
		r=HAL::Get((HAL::TAttribute)attrib,v2);
		test.Printf(_L("Get returns %d, value %d(%08x)\n"),r,v2,v2);
		}
	}

GLDEF_C TInt E32Main()
	{
	test.Title();
	__UHEAP_MARK;
	__UHEAP_SETFAIL(RHeap::EDeterministic,1);
	TInt machine_id;
	TInt r=HAL::Get(HAL::EMachineUid,machine_id);
	__UHEAP_RESET;
	test(r==KErrNone);
	test.Printf(_L("Machine ID %08x\n"),machine_id);

	test.Start(_L("Check AttributeNames[] is up-to-date"));
	test_Equal(HAL::ENumHalAttributes, sizeof(AttributeNames)/sizeof(TText*));

	test.Next(_L("Test Get"));
	TestGet();

	test.Next(_L("Test GetAll"));
	TestGetAll();

	test.Next(_L("Test Set"));
	TestSet();

	test.End();

	__UHEAP_MARKEND;	// problem if HAL uses TLS

	return KErrNone;
	}