bluetooth/btstack/test/util/hcemulator/hcemulator.h
changeset 0 29b1cd4cb562
child 47 a1b8f5cc021e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/test/util/hcemulator/hcemulator.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,406 @@
+// Copyright (c) 2005-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 HCEMULATOR_H
+#define HCEMULATOR_H
+
+// forward declarations
+#include <e32test.h>
+#include <es_sock.h>
+#include <f32file.h>
+#include <bt_sock.h>
+#include <c32comm.h>
+#include <bluetooth/hci/hcierrors.h>
+
+const TInt KReadBufSize			=258;
+const TInt KWriteBufSize		=258;
+
+// properties of emulated host controller
+
+const TBTDevAddr KEmulatedHCAddress(MAKE_TINT64(0xfeed, 0xdeadbeef));						
+_LIT8(KDefaultLocalName, "HCEmuDevice");
+
+const TUint16 KEmulatedHCNumberACLBuffers			=0x0010;
+const TUint16 KEmulatedHCSizeACLBuffers				=0x02A0;
+const TUint16 KEmulatedHCNumberSCOBuffers			=0x0000;
+const TUint8 KEmulatedHCSizeSCOBuffers				=0x00;
+const TEncryptMode KEmulatedEncryptMode				=EDisabled;
+const TUint16 KEmulatedClockOffset					=0xfd5d;
+
+// emulated devices found
+
+const TBTDevAddr KDeviceAddresses []={
+									MAKE_TINT64(0x1111, 0x11111111),
+									MAKE_TINT64(0x2222, 0x22222222),
+									MAKE_TINT64(0x3333, 0x33333333),
+									MAKE_TINT64(0x4444, 0x44444444),
+									MAKE_TINT64(0x5555, 0x55555555),
+									MAKE_TINT64(0x6666, 0x66666666),
+									MAKE_TINT64(0x7777, 0x77777777),
+									MAKE_TINT64(0x8888, 0x88888888),
+									MAKE_TINT64(0x9999, 0x99999999),
+									MAKE_TINT64(0xaaaa, 0xaaaaaaaa),
+									MAKE_TINT64(0xbbbb, 0xbbbbbbbb),
+									MAKE_TINT64(0xcccc, 0xcccccccc),
+									MAKE_TINT64(0xdddd, 0xdddddddd),
+									MAKE_TINT64(0xeeee, 0xeeeeeeee),
+									MAKE_TINT64(0xffff, 0xffffffff),
+									MAKE_TINT64(0x1111, 0x22222222),
+									MAKE_TINT64(0x2222, 0x33333333),
+									MAKE_TINT64(0x3333, 0x44444444),
+									MAKE_TINT64(0x4444, 0x55555555),
+									MAKE_TINT64(0x5555, 0x66666666),
+									MAKE_TINT64(0x6666, 0x77777777),
+									MAKE_TINT64(0x7777, 0x88888888),
+									MAKE_TINT64(0x8888, 0x99999999),
+									MAKE_TINT64(0x9999, 0xaaaaaaaa)
+									};
+const TBuf8<20> KDeviceNames [] ={
+								_L8("Emulated Device 1"),
+								_L8("Emulated Device 2"),
+								_L8("Emulated Device 3"),
+								_L8("Emulated Device 4"),
+								_L8("Emulated Device 5"),
+								_L8("Emulated Device 6"),
+								_L8("Emulated Device 7"),
+								_L8("Emulated Device 8"),
+								_L8("Emulated Device 9"),
+								_L8("Emulated Device a"),
+								_L8("Emulated Device b"),
+								_L8("Emulated Device c"),
+								_L8("Emulated Device d"),
+								_L8("Emulated Device e"),
+								_L8("Emulated Device f"),
+								_L8("Emulated Device 12"),
+								_L8("Emulated Device 23"),
+								_L8("Emulated Device 34"),
+								_L8("Emulated Device 45"),
+								_L8("Emulated Device 56"),
+								_L8("Emulated Device 67"),
+								_L8("Emulated Device 78"),
+								_L8("Emulated Device 89"),
+								_L8("Emulated Device 9a")
+								};
+
+
+const TUint8  KEmulatedInquiryPageScanRepetionMode	= 0x01;
+const TUint8  KEmulatedInquiryPageScanPeriodMode	= 0x02;
+const TUint8  KEmulatedInquiryPageScanMode			= 0x03;
+const TUint	  KEmulatedInquiryClassOfDevice			= 0xcc00dd;
+const TUint	  KEmulatedInquiryNullClassOfDevice		= 0x0;
+const TUint16 KEmulatedInquiryClockOffset			= 0xabcd;
+const TUint	  KEmulatedLocalSupportedFeatures1	    = 0x000fffff;
+const TUint   KEmulatedLocalSupportedFeatures2		= 0x00000000;
+const TUint	  KEmulatedLocalVersion1			    = 0x01020d01;
+const TUint   KEmulatedLocalVersion2				= 0x020d000a;
+const TUint	  KEmulatedCoD							= 0x000000;
+const TUint	  KEmulatedRemoteSupportedFeatures1		= 0x0031ea04;
+const TUint	  KEmulatedRemoteSupportedFeatures2		= 0x00000000;
+const TUint	  KEmulatedRemoteVersionInfo1			= 0x01000000;
+const TUint8  KEmulatedRemoteVersionInfo2			= 0x04;
+const TUint16 KEmulatedChangedPacketType			= 0x0018;
+
+const TTimeIntervalSeconds KEmulatedInterDeviceInquiryTime			=0x05;	// seconds
+
+// emulated results
+const TUint8 KEmulatedInquiryNumberDevicesFound		=0x18;
+const THCIConnHandle KEmulatedBaseConnectionHandle	=0x0001;
+const TUint8 KHCIEmulatedDisconnectionReason		=0x13;
+
+// HCI Interface events
+
+const TInt KHCIUARTCommandHeader				=0x01;
+const TInt KHCIUARTACLDataHeader				=0x02;
+const TInt KHCIUARTEventHeader					=0x04;
+
+const TUint8 KHCIInquiryCompleteEventCode		=0x01;
+const TUint8 KHCIInquiryResultEventCode			=0x02;
+const TUint8 KHCIConnectionCompleteEventCode	=0x03;
+const TUint8 KHCIConnectionRequestEventCode		=0x04;
+const TUint8 KHCICommandCompleteEventCode		=0x0e;
+const TUint8 KHCICommandStatusEventCode			=0x0f;
+const TUint8 KHCIDisconnectionCompleteEventCode	=0x05;
+const TUint8 KHCIRemoteNameRequestCompleteEventCode = 0x07;
+const TUint8 KHCINumCompletedPacketsEventCode	=0x13;
+const TUint8 KHCIReadClockOffsetCompleteEventCode = 0x1c;
+const TUint8 KHCIReadRemoteSupportedFeaturesCode = 0x0b;
+const TUint8 KHCIReadRemoteVersionInfoCode 		= 0x0c;
+const TUint8 KHCIConnectionPacketTypeChangedCode = 0x1d;
+const TUint8 KHCIHardwareErrorEventCode			=0x10;
+const TUint8 KHCISpecificVendorDebugEvent		=0xff;
+// opcodes
+const TUint16 KNoOpcode						=0x0000;
+
+// lengths
+const TUint8 KHCIDefaultCommandCompleteEventLength			=0x04;
+const TUint8 KHCICommandStatusEventLength					=0x04;
+const TUint8 KHCIReadBufferSizeCommandCompleteEventLength	=0x0b;
+const TUint8 KHCIReadBdaddrCommandCompleteEventLength		=0x0a;
+const TUint8 KHCIReadLocalNameCommandCompleteEventLength	=0xfc;
+const TUint8 KHCIConnectionCompleteEventLength				=0x0b;
+const TUint8 KHCIInquiryCompleteEventLength					=0x01;
+const TUint8 KHCIDisconnectionCompleteEventLength			=0x04;
+const TUint8 KHCINumCompletedPacketsEventLength				=0x05;
+const TUint8 KHCIInquiryResultEventLength					=0x0f;
+const TUint8 KHCIConnectionRequestEventLength				=0x0a;
+const TUint8 KHCIReadLocalSupportedFeaturesLength			=0x0c;
+const TUint8 KHCIReadLocalVersionInformationLength			=0x0c;
+const TUint8 KHCIReadCoDLength								=0x07;
+const TUint8 KHCIWriteLinkPolicySettingsCompleteLength		=0x06;
+const TUint8 KHCIReadClockOffsetCompleteLength				=0x05;
+const TUint8 KHCIReadRemoteSupportedFeaturesLength			=0x0b;
+const TUint8 KHCIReadRemoteVersionInfoLength				=0x08;
+const TUint8 KHCIConnectionPacketTypeChangedLength			=0x05;
+const TUint8 KHCIHardwareErrorEventLength					=0x01;
+
+// errors
+const TUint8 KHCIOK								=0x00;
+const TUint8 KHCINoConnection					=0x02;
+const TUint8 KHCIPageTimeout					=0x04;
+const TUint8 KHCICommandDisallowed				=0x0c;
+
+
+// forward declarations
+class CActiveConsole;
+class CActiveReader;
+class CActiveWriter;
+class CInquiryTimer;
+
+class CHCEmulator : public CBase
+	{
+	public:
+
+		static CHCEmulator* NewL(CConsoleBase& aConsole);
+		void CommandStatusEvent(TUint16 aOpcode, TUint8 aError);
+		void DefaultCommandCompleteEvent(TUint16 aOpcode, TUint8 aError);
+		void ReadBufferSizeCompleteEvent(TUint8 aError);
+		void ReadBDAddrCompleteEvent(TUint8 aError);
+		void ReadLocalNameCompleteEvent(TUint8 aError);
+		void InquiryCompleteEvent(TUint8 aError);
+		void ConnectionCompleteEvent(TUint8 aError, TLinkType aType);
+		void ConnectionRequestEvent(const TBTDevAddr& aAddr, TUint aCoD, TLinkType aType);
+		void DisconnectionCompleteEvent(TUint8 aError, THCIConnHandle aConnH, TUint8 aReason);
+		void InquiryStartEvent(TUint8 aError);
+		void InquiryResultEvent();
+		void NumberCompletedPacketsEvent(/*const TDesC8& aConnHandleFlagsBuf*/THCIConnHandle aConnH, TUint8 aNumPackets, TUint8 aError);
+		void InquiryCancelCompleteEvent(TUint8 aError);
+		void ReadRemoteNameCompleteEvent(TUint8 aError, const TBTDevAddr& aAddr, const TDesC8& aName);
+		void ReadLocalSupportedFeaturesCompleteEvent(TUint8 aError);
+		void ReadRemoteSupportedFeaturesCompleteEvent(TUint8 aError, THCIConnHandle aConnH);
+		void ReadRemoteVersionInfoCompleteEvent(TUint8 aError, THCIConnHandle aConnH);
+		void ReadLocalVersionInfoCompleteEvent(TUint8 aError);
+		void WriteVoiceSettingCompleteEvent(TUint8 aError);
+		void WriteCurrentIACLAPCompleteEvent(TUint8 aError);
+	    void ReadClassOfDeviceCompleteEvent(TUint8 aError);
+		void WriteLinkPolicySettingsCompleteEvent(TUint8 aError, THCIConnHandle aConnh);
+		void ReadClockOffsetCompleteEvent(TUint8 aError, THCIConnHandle aConnH);
+		void VendorSpecificDebugCompleteEvent(TUint16 aOpCode, const TDesC8& aRemainderBuf);
+		void HardwareErrorEvent();
+		void SpecificVendorDebugEvent();
+		
+		void CommandReceived(const TDesC8& aOpcodeBuf, const TDesC8& aRemainderBuf);
+		void ACLDataReceived(const TDesC8& aConnHandleFlagsBuf, const TDesC8& aRemainderBuf);
+		void SCODataReceived(const TDesC8& /*aConnHandleBuf*/, const TDesC8& /*aRemainderBuf*/) {}; // not yet!
+		void ConnectionPacketTypeChangedEvent(TUint8 aError, THCIConnHandle aConnH);
+
+		static CConsoleBase* AutoSizeNewL(const TDesC& aTitle, TSize aSize);
+
+		void Start();
+		void Stop();
+		~CHCEmulator();
+
+	private:
+		CHCEmulator(CConsoleBase& aConsole);
+		void ConstructL(CConsoleBase& aConsole);
+
+		enum TPacketType
+			{
+			ECommandStatusEvent,
+			ECommandCompleteEvent,
+			EInquiryCompleteEvent,
+			EACLConnectionCompleteEvent,
+			ESCOConnectionCompleteEvent,
+			EDisconnectCompleteEvent
+			};
+
+		void BuildAndWriteCommandPacket(TPacketType aType, TUint16 aOpcode, TUint8 aError);
+		void BuildAndWriteDataPacket(const TDesC8& aConnHandleFlagsBuf, /*THCIConnHandle aConnH,*/ const TDesC8& aRemainderBuf);
+
+		void PutBytes(TUint aNum, TUint8 aNumOfBytes=1);
+		void PutAddress(const TBTDevAddr& aAddress);
+		void PutName(const TDesC8& aName);
+		
+// util functions
+		void GetBigEndianDevAddr(TBTDevAddr& aAddresS, const TUint8* aPacket);
+		void GetConnHandle(THCIConnHandle& aConnH, const TUint8* aPacket);
+		void GetByte(TUint8& aByte, const TUint8* aPacket);
+
+		TBool Decode(const TDesC8& aOpcodeBuf, const TDesC8& aRemainderBuf);	
+		void ResetEmulator();
+		void WritePacket();
+		void ClearPacket();
+		TInt FindConnection(THCIConnHandle aConnH);
+		TInt GetRemoteName(const TBTDevAddr& aAddr, TPtrC8& aName) const;
+
+		
+	private:
+		CActiveConsole*	iActiveConsole;
+		CConsoleBase&	iConsole;
+		CConsoleBase*	iConnectionsConsole;
+		CActiveWriter*	iWriter;
+		CActiveReader*	iReader;
+		CInquiryTimer*	iInquiryTimer;
+		TUint8			iCurrentInquiryResponse;
+		RCommServ		iCommServer;
+		RComm			iPort;
+		HBufC8*			iPacketBuffer;
+		TPtr8			iPacket;
+		TUint			iParsePtr;		// points to current parse point
+
+	private:
+		// emulated stuff
+		RArray<TBTConnect>	iConnections; // competed once a createconnection command appears
+		TFixedArray<TBTDevAddr, KEmulatedInquiryNumberDevicesFound>	iInquiryAddresses;	// for emulated inquiries
+		TFixedArray<TBuf8<20>, KEmulatedInquiryNumberDevicesFound>	iInquiryNames;		// for emulated name lookups
+		THCIScanEnable		iScanEnable;
+		const TBTDevAddr	iHCAddress;
+		RBuf8				iLocalName;
+	};
+
+class CActiveConsole : public CActive
+	{
+	public:
+		static CActiveConsole* NewL(CConsoleBase& aConsole, CHCEmulator& aEmulator);
+
+		void RunL();
+		void DoCancel();
+		void TestMenu();
+		void DrawCursor();
+		~CActiveConsole();
+
+	private:
+		CActiveConsole(CConsoleBase& aConsole, CHCEmulator& aEmulator);
+		void ConstructL();
+		void RequestKey();
+
+	private:
+		CConsoleBase&	iConsole;
+		CHCEmulator&	iEmulator;
+	};
+
+class CActiveReader : public CActive
+	{
+	public:
+		static CActiveReader* NewL(CConsoleBase& aConsole, CHCEmulator& aEmulator, RComm& iPort);
+		void RunL();
+		void DoCancel();
+		~CActiveReader();
+
+	private:
+		CActiveReader(CConsoleBase& aConsole, CHCEmulator& aEmulator, RComm& iPort);
+		void ConstructL();
+		void DoRead();
+		TInt DecodeHeader();
+		TInt DecodeOpcode();
+
+	private:
+		enum TReadState
+			{
+			EReadHeader,
+			EReadOpcode,
+			EReadCommandLength,
+			EReadDataLength,
+			EReadCommandRemainder,
+			EReadDataRemainder,
+			EReadConnectionHandleFlags,
+			};
+
+	private:
+		CConsoleBase&	iConsole;
+		CHCEmulator&	iEmulator;
+		RComm&			iPort;
+		CConsoleBase*	iReaderOutputConsole;
+		TBool			iAuto;
+		TReadState		iReadState;
+		TBuf8<1>		iHeaderBuf;
+		TBuf8<2>		iOpcodeBuf;
+		TBuf8<1>		iCommandLengthBuf;
+		TBuf8<2>		iDataLengthBuf;
+		TBuf8<2>		iConnectionHandleFlagsBuf;
+		TBuf8<255>		iRemainderBuf;
+		TBool			iReadComplete;
+	};
+
+class CActiveWriter : public CActive
+	{
+	public:
+		static CActiveWriter* NewL(CConsoleBase& aConsole, CHCEmulator& aEmulator, RComm& iPort);
+		void RunL();
+		void DoCancel();
+		void WriteL(const TDesC8& aPacket);
+		~CActiveWriter();
+
+	private:
+		CActiveWriter(CConsoleBase& aConsole, CHCEmulator& aEmulator, RComm& iPort);
+		void ConstructL();
+		void DoWrite();
+
+	private:
+		CConsoleBase&	iConsole;
+		CHCEmulator&	iEmulator;
+		RComm&			iPort;
+		RPointerArray<HBufC8>	iWriteBuffers;
+	};
+
+
+class CInquiryTimer : public CTimer
+/**
+	Simulates the finite time to find stuff - handy for testing inquiry cancelling
+	RunL asks emulator to send up one InquiryStatus with n devices in
+**/
+	{
+	public:
+		static CInquiryTimer* NewL(CHCEmulator& aEmulator);
+		void RunL();
+		void Start();
+
+	private:
+		CInquiryTimer(CHCEmulator& aEmulator);
+		void ConstructL();
+
+	private:
+		CHCEmulator& iEmulator;
+	};
+
+/**
+	@internalComponent
+	class TInputManager
+	It manage the input from the keyboard and the output on the console.
+**/
+class TInputManager
+	{
+	public:
+		TInputManager(CConsoleBase& aConsole);
+		
+		TUint ReadString(TDes8& aStr);
+		TInt  String2Uint(TDes8& aStr, TUint& aResult, TBool aHex=EFalse);
+	private:
+		void ConsoleBackspace(TUint aNumberOfChars);
+		TUint GetCipher(TChar aChar);
+	private:
+		CConsoleBase& iConsole;
+	};
+
+#endif // HCEMULATOR_H