usbmgmt/usbmgrtest/usbtestconsole/usbtestconsole.cpp
changeset 0 c9bc50fca66e
child 9 6ba7b7d87ab3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgrtest/usbtestconsole/usbtestconsole.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,2192 @@
+/*
+* Copyright (c) 2007-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:
+*
+*/
+
+#include "usbtestconsole.h"
+
+#include <e32cons.h>
+#include <e32debug.h>
+
+#include <d32otgdi_errors.h>
+#include <d32usbdi_errors.h>
+#include <d32usbdi.h>
+
+#include <usb/usbshared.h>
+
+static TBool verbose = EFalse;
+
+const TUint KTimerAWaitBConnect = 30*1000000;  
+
+#define PANIC Panic(__LINE__)
+
+#define LOG(A,B) if (verbose) RDebug::Print(_L("UsbTestConsole: " L##A),B)
+
+#define PNT(A)	 if (verbose) RDebug::Print(_L("UsbTestConsole: " L##A))
+
+void Panic(TInt aLine)
+	{
+	if (verbose) RDebug::Printf("UsbTestConsole: PANIC line=%d", aLine);
+	User::Panic(_L("USBTESTCONSOLE"), aLine);
+	}
+
+_LIT(KArgVerbose, "VERBOSE");
+
+void RunConsoleL()
+	{
+	TInt cmdLineLength(User::CommandLineLength());
+	HBufC* cmdLine = HBufC::NewMaxLC(cmdLineLength);
+	TPtr cmdLinePtr = cmdLine->Des();
+	User::CommandLine(cmdLinePtr);
+
+	TLex args(*cmdLine);
+	args.SkipSpace(); // args are separated by spaces
+	
+	// first arg is the exe name, skip it
+	TPtrC cmdToken = args.NextToken();
+	HBufC* tc = HBufC::NewLC(80);
+	*tc = cmdToken;
+	
+	while (tc->Length())
+		{
+		TInt pos = tc->FindF(KArgVerbose);
+		
+		if ( pos != KErrNotFound )
+			{ 
+			verbose = ETrue;
+			}
+		
+		// next parameter
+		*tc = args.NextToken();
+		}
+	CleanupStack::PopAndDestroy(tc);
+	CleanupStack::PopAndDestroy(cmdLine);
+
+	CUsbTestConsole* console = CUsbTestConsole::NewLC();
+	console->StartL();
+	CleanupStack::PopAndDestroy(console);
+	}
+
+TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	CActiveScheduler* activeScheduler = new CActiveScheduler;
+	TInt err = KErrNoMemory;
+	if(cleanup && activeScheduler)
+		{
+		CActiveScheduler::Install(activeScheduler);
+
+		TRAP(err,RunConsoleL());
+		}
+	delete activeScheduler;
+	delete cleanup;
+	__UHEAP_MARKEND;
+	return err;
+	}
+
+XUsbTestConsoleEvent::~XUsbTestConsoleEvent()
+	{
+	iLink.Deque();
+	iEvent.Close();
+	}
+	
+	
+	
+	
+CUsbTestConsoleKeys* CUsbTestConsoleKeys::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CUsbTestConsoleKeys* self = new(ELeave) CUsbTestConsoleKeys(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CUsbTestConsoleKeys::~CUsbTestConsoleKeys()
+	{
+	Cancel();
+
+	TDblQueIter<CUsbTestConsoleTextEntryBase> iter(iEntryConsoles);
+	CUsbTestConsoleTextEntryBase* event = NULL;
+	while((event = iter++) != NULL)
+		{
+		delete event;
+		}
+		
+	delete iUsbManStarter;
+	delete iUsbManStoper;
+	delete iUsbManTryStarter;
+	delete iUsbManTryStoper;
+	}
+
+CUsbTestConsoleKeys::CUsbTestConsoleKeys(CUsbTestConsole& aTestConsole)
+	: CActive(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	, iEntryConsoles(_FOFF(CUsbTestConsoleTextEntryBase, iLink))
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbTestConsoleKeys::ConstructL()
+	{
+	iTestConsole.iConsole->Read(iStatus);
+	SetActive();
+	}
+
+void CUsbTestConsoleKeys::DoCancel()
+	{
+	iTestConsole.iConsole->ReadCancel();
+	}
+
+void CUsbTestConsoleKeys::RunL()
+	{
+	User::LeaveIfError(iStatus.Int());
+	
+	switch(iTestConsole.iConsole->KeyCode())
+		{
+	case '[':
+		{
+		RUsb sess;
+		TInt err = sess.Connect();
+		sess.Close();
+		
+		User::After(4000000);
+		
+		err = sess.Connect(); 
+
+		XUsbTestConsoleEvent* event = NewConsoleEventL();
+		event->iEvent.AppendFormat(_L("T:USBMAN Test Err[%d]"), err);
+		iTestConsole.NotifyEvent(event);
+		
+		sess.Close();
+		}
+		break;
+	case 'm':
+		{
+		TInt val = 1;
+		TInt err = RProperty::Set(KUidUsbManCategory,KUsbRequestSessionProperty,val);
+		XUsbTestConsoleEvent* event = NewConsoleEventL();
+		event->iEvent.AppendFormat(_L("T:USBMAN VBus marshalling - err=[%d]"),err);
+		iTestConsole.NotifyEvent(event);
+		}
+		break;
+	case 'H': case 'h': case '?': 
+
+		iTestConsole.ScheduleDraw('H');
+		break;
+
+	case 'q': case 'Q':
+		iTestConsole.Stop();
+		return;
+		
+	case 's':
+		// Toggle Start
+		if(!iUsbManStarter)
+			{
+			CUsbManStarter::NewL(iUsbManStarter, iTestConsole);
+			}
+		else
+			{
+			iUsbManStarter->DestroyL();
+			}
+		break;
+		
+	case 'S':
+		// Toggle Stop
+		if(!iUsbManStoper)
+			{
+			// Because we cannot tell query the actual state of Function Driver loading
+			// when we shutdown we also automatically disable loading.
+			iTestConsole.Usb().DisableFunctionDriverLoading();
+			iFunctionDriverLoading = EFalse;
+			iTestConsole.SetDriverLoading(CUsbTestConsole::EDisabled);
+
+			CUsbManStoper::NewL(iUsbManStoper, iTestConsole);
+			}
+		else
+			{
+			iUsbManStoper->DestroyL();
+			}
+		break;
+		
+	case 't':
+		// Toggle TryStart
+		if(!iUsbManTryStarter)
+			{
+			CUsbManTryStarter::NewL(iUsbManTryStarter, iTestConsole, iPersonalityId);
+			}
+		else
+			{
+			iUsbManTryStarter->DestroyL();
+			}
+		break;
+
+	case 'T':
+		// Toggle TryStop
+		if(!iUsbManTryStoper)
+			{
+			// Because we cannot tell query the actual state of Function Driver loading
+			// when we shutdown we also automatically disable loading.
+			iTestConsole.Usb().DisableFunctionDriverLoading();
+			iFunctionDriverLoading = EFalse;
+			iTestConsole.SetDriverLoading(CUsbTestConsole::EDisabled);
+
+			CUsbManTryStoper::NewL(iUsbManTryStoper, iTestConsole);
+			}
+		else
+			{
+			iUsbManTryStoper->DestroyL();
+			}
+		break;
+		
+	case 'p': case 'P':
+		// Enter personality id
+			{
+			CUsbTestConsoleTextEntryBase* entry = CUsbTestConsoleTextEntry<TInt>::NewL(iPersonalityId, _L("Personality Id"));
+			iEntryConsoles.AddLast(*entry);
+			}
+		break;
+		
+	case 'c': case 'C':
+		// Toggle Control Session
+			{
+			iControlSession = !iControlSession;
+			TInt err = iTestConsole.Usb().SetCtlSessionMode(iControlSession);
+			if(err != KErrNone)
+				{
+				iControlSession = !iControlSession;
+				}
+			else
+				{
+				iTestConsole.SetControlSession(iControlSession);
+				if(!iControlSession)
+					{
+					// This is set to unknown because as soon as we relinquish the controlling session
+					// someone else could be altering the state.
+					iFunctionDriverLoading = EFalse;
+                    iTestConsole.SetDriverLoading(CUsbTestConsole::EUnknown);
+					}
+				}
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("G:SetControlSession:Err[%d]"), err);
+			iTestConsole.NotifyEvent(event);
+			}
+		break;
+
+	case 'b':
+		// Bus Request
+			{
+			TInt err = iTestConsole.Usb().BusRequest();
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("G:BusRequest:Err[%d]"), err);
+			iTestConsole.NotifyEvent(event);
+			}
+		break;
+
+	case 'r':
+	    // Respond to SRP
+			{
+			TInt err = iTestConsole.Usb().BusRespondSrp();
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("G:BusRespondSrp:Err[%d]"), err);
+			iTestConsole.NotifyEvent(event);
+			}
+			break;
+
+	case 'R':
+		// Auto-respond to SRP
+			{
+			iTestConsole.SetAutoSrpResponseState( !iTestConsole.GetAutoSrpResponseState() );
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("G:Auto-Respond to SRP (%d)"), iTestConsole.GetAutoSrpResponseState());
+			iTestConsole.NotifyEvent(event);
+			}
+			break;
+			
+	case 'x': case 'X':
+	    // Clear Bus Error State
+			{
+			TInt err = iTestConsole.Usb().BusClearError();
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("G:BusClearError:Err[%d]"), err);
+			iTestConsole.NotifyEvent(event);
+			}
+			break;
+
+	case 'B':
+		// Bus Drop
+			{
+			TInt err = iTestConsole.Usb().BusDrop();
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("G:BusDrop:Err[%d]"), err);
+			iTestConsole.NotifyEvent(event);
+			}
+		break;
+		
+	case 'e': case 'E':
+			{
+			TBool functionDriverLoading = !iFunctionDriverLoading;
+			CUsbTestConsole::TFdfDriverLoadingState state = functionDriverLoading ? CUsbTestConsole::EEnabled : CUsbTestConsole::EDisabled;
+			TInt err = KErrNone;
+			if(functionDriverLoading)
+				{
+				err = iTestConsole.Usb().EnableFunctionDriverLoading();
+				}
+			else
+				{
+				iTestConsole.Usb().DisableFunctionDriverLoading();
+				}
+
+			if(err == KErrNone)
+				{
+				iFunctionDriverLoading = functionDriverLoading;
+				iTestConsole.SetDriverLoading(state);
+				}
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			event->iEvent.AppendFormat(_L("H:FunctionDriverLoading[%d] Err[%d]"), functionDriverLoading, err);
+			iTestConsole.NotifyEvent(event);
+			}
+		break;
+
+		case 'A': case 'a': 
+			{
+			XUsbTestConsoleEvent* event = NewConsoleEventL();
+			switch( iTestConsole.iDeviceType )
+				{
+				case CUsbTestConsole::ELogitechHeadset:
+					{
+												// 12345678901234567890123456789012345678901234567890123
+					event->iEvent.AppendFormat(_L("G:Audio will play OK on this Logitech headset"));
+					}
+					break;
+				case CUsbTestConsole::EGenericDevice:
+					{
+												// 12345678901234567890123456789012345678901234567890123
+					event->iEvent.AppendFormat(_L("G:Audio on this device is not supported"));
+					}
+					break;
+				case CUsbTestConsole::ENoDevice:
+					{
+												// 12345678901234567890123456789012345678901234567890123
+					event->iEvent.AppendFormat(_L("G:There is no device connected!"));
+					}
+					break;
+				}
+			iTestConsole.NotifyEvent(event);
+			}
+		break;
+		
+	case 'v': case 'V':
+		{
+		TBool oldVerbose = verbose;
+		
+		verbose = ETrue;
+		
+		if (oldVerbose)
+			{
+			PNT("Switching Logging Off");
+			}
+		else
+			{
+			PNT("Switching Logging On");
+			}
+		
+		verbose = !oldVerbose;
+
+		break;
+		}
+		
+	default:
+		// Unrecognised key
+		XUsbTestConsoleEvent* event = NewConsoleEventL();
+		event->iEvent.AppendFormat(_L("G:Unknown:Key[%c]"), iTestConsole.iConsole->KeyCode());
+		iTestConsole.NotifyEvent(event);
+		break;
+		}
+	iTestConsole.iConsole->Read(iStatus);
+	SetActive();
+	}
+	
+XUsbTestConsoleEvent* CUsbTestConsoleKeys::NewConsoleEventL()
+	{
+	XUsbTestConsoleEvent* event = new(ELeave) XUsbTestConsoleEvent;
+	CleanupStack::PushL(event);
+	User::LeaveIfError(event->iEvent.Create(CUsbTestConsole::KNumCharactersOnLine-1));
+	CleanupStack::Pop();
+	return event;
+	}
+	
+
+
+CUsbTestConsole* CUsbTestConsole::NewLC()
+	{
+	CUsbTestConsole* self = new(ELeave) CUsbTestConsole;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+	
+CUsbTestConsole::~CUsbTestConsole()
+	{
+	PNT("Closing Console");
+
+	delete iKeys;
+
+	TDblQueIter<XUsbTestConsoleEvent> iter(iEventList);
+	XUsbTestConsoleEvent* event = NULL;
+	while((event = iter++) != NULL)
+		{
+		delete event;
+		}
+
+	delete iMessageWatcher;
+	delete iHostEventWatcher;
+	delete iOtgStateWatcher;
+	delete iVBusWatcher;
+	delete iIdPinWatcher;
+	delete iDeviceStateWatcher;
+	delete iServiceStateWatcher;
+	delete iTimer;  
+
+	Cancel();
+
+	PNT("Closing USB Session");
+
+	iUsb.Close();
+	
+	delete iConsole;
+	}
+
+CUsbTestConsole::CUsbTestConsole()
+	: CActive(EPriorityLow) // Low so all notifications that want to be serviced will be done first
+	, iHelp(EFalse)
+	, iAutoSrpResponse(EFalse)
+	, iDeviceType(ENoDevice)
+	, iEventList(_FOFF(XUsbTestConsoleEvent, iLink))
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbTestConsole::ConstructL()
+	{
+	iConsole = Console::NewL(KUsbTestConsoleTitle, TSize(-1,-1));
+	User::LeaveIfError(iUsb.Connect());
+	
+	for(TInt i=0; i<KNumEventsOnScreen; ++i)
+		{
+        XUsbTestConsoleEvent* nullEvent = new(ELeave) XUsbTestConsoleEvent;
+		iEventList.AddFirst(*nullEvent);
+		}
+
+	iServiceStateWatcher = CServiceStateWatcher::NewL(*this);
+	iDeviceStateWatcher = CDeviceStateWatcher::NewL(*this);
+	iIdPinWatcher = CIdPinWatcher::NewL(*this);
+	iVBusWatcher = CVBusWatcher::NewL(*this);
+    iConnectionIdleWatcher = CConnectionIdleWatcher::NewL(*this);
+	iOtgStateWatcher = COtgStateWatcher::NewL(*this);
+	iHostEventWatcher = CHostEventWatcher::NewL(*this);
+	iMessageWatcher = CMessageWatcher::NewL(*this);
+	iTimer = CUsbTestTimer::NewL(*this);  
+	SetDriverLoading(EUnknown);
+	SetDeviceType(ENoDevice);
+	SetAutoSrpResponseState(EFalse);
+
+	// After everything else, enable interactivity.
+	iKeys = CUsbTestConsoleKeys::NewL(*this);
+	}
+CUsbTestTimer* CUsbTestConsole::Timer() const
+	{
+	return iTimer;
+	}
+
+
+void CUsbTestConsole::StartL()
+	{
+	// Get everything running
+	CActiveScheduler::Start();
+	}
+	
+void CUsbTestConsole::Stop() const
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CUsbTestConsole::DoCancel()
+	{
+	// Don't need to do anything as the AO is completed straight away.
+	}
+
+void CUsbTestConsole::RunL()
+	{
+	__ASSERT_ALWAYS(iStatus.Int() == KErrNone, PANIC);
+	Draw();
+	}
+
+void CUsbTestConsole::ScheduleDraw(TUint aKey)
+	{
+	if(!IsActive())
+		{
+		iHelp = (aKey=='H') ? !iHelp : EFalse;
+		SetActive();
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+
+		TSize size = iConsole->ScreenSize();
+		iConsole->SetCursorPosAbs(TPoint(size.iWidth-1, 0));
+		iConsole->Write(_L("*"));
+		}
+	}
+	
+RUsb& CUsbTestConsole::Usb()
+	{
+	return iUsb;
+	}
+	
+void CUsbTestConsole::SetServiceState(TUsbServiceState aServiceState)
+	{
+	switch(aServiceState)
+		{
+    case EUsbServiceIdle:
+    	iServStatus =
+    		//  12345678901
+			_L("Idle       ");
+    	break;
+
+	case EUsbServiceStarting:
+    	iServStatus =
+    		//  12345678901
+			_L("Starting   ");
+		break;
+
+	case EUsbServiceStarted:
+	    iServStatus =
+    		//  12345678901
+			_L("Started    ");
+		break;
+
+	case EUsbServiceStopping:
+    	iServStatus =
+    		//  12345678901
+			_L("Stopping   ");
+		break;
+
+	case EUsbServiceFatalError:
+    	iServStatus =
+    		//  12345678901
+			_L("Error      ");
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	LOG("Service State => %S", &iServStatus);
+	ScheduleDraw('E');
+	}
+	
+void CUsbTestConsole::SetDeviceState(TUsbDeviceState aDeviceState)
+	{
+	switch(aDeviceState)
+		{
+	case EUsbDeviceStateUndefined:
+		iDevStatus =
+    		//  12345678901
+			_L("Undefined  ");
+		break;
+
+	case EUsbDeviceStateDefault:
+		iDevStatus =
+    		//  12345678901
+			_L("Default    ");
+		break;
+
+	case EUsbDeviceStateAttached:
+		iDevStatus =
+    		//  12345678901
+			_L("Attached   ");
+		break;
+
+	case EUsbDeviceStatePowered:
+		iDevStatus =
+    		//  12345678901
+			_L("Powered    ");
+		break;
+
+	case EUsbDeviceStateConfigured:
+		iDevStatus =
+    		//  12345678901
+			_L("Configured ");
+		break;
+
+	case EUsbDeviceStateAddress:
+		iDevStatus =
+    		//  12345678901
+			_L("Address    ");
+		break;
+
+	case EUsbDeviceStateSuspended:
+		iDevStatus =
+    		//  12345678901
+			_L("Suspended  ");
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	LOG("Device State => %S", &iDevStatus);
+	ScheduleDraw('E');
+	}
+	
+void CUsbTestConsole::SetConnectionIdle(TInt aConnectionIdle)
+	{
+	switch(aConnectionIdle)
+		{
+	case 0:
+		iConnectionIdle =
+    		//  12345
+			_L("Busy ");
+		break;
+
+	case 1:
+		iConnectionIdle =
+    		//  12345
+			_L("Idle ");
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	LOG("ConnectionIdle => %S", &iConnectionIdle);
+	ScheduleDraw('E');
+	}
+
+void CUsbTestConsole::SetIdPin(TInt aIdPin)
+	{
+	switch(aIdPin)
+		{
+    case 0:
+        iIdPin =
+    		//  12345
+			_L("-    ");
+		break;
+
+	case 1:
+		iIdPin =
+    		//  12345
+			_L("+    ");
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	LOG("Id Pin => %S", &iIdPin);
+	ScheduleDraw('E');
+	}
+	
+void CUsbTestConsole::SetVBus(TInt aVBus)
+	{
+	switch(aVBus)
+		{
+	case 0:
+		iVBus =
+    		//  12345
+			_L("-    ");
+		break;
+
+	case 1:
+		iVBus =
+    		//  12345
+			_L("+    ");
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	LOG("VBus => %S", &iVBus);
+	ScheduleDraw('E');
+	}
+
+void CUsbTestConsole::SetOtgState(TInt aOtgState)
+	{
+	switch(aOtgState)
+		{
+	case 0x01:
+		iOtgState =
+    		//  123456789012
+			_L("Reset       ");
+		break;
+
+	case 0x02:
+		iOtgState =
+    		//  123456789012
+			_L("A-Idle      ");
+		break;
+
+	case 0x04:
+		iOtgState =
+    		//  123456789012
+			_L("A-Host      ");
+		break;
+
+	case 0x08:
+		iOtgState =
+    		//  1234567890123
+			_L("A-Peripheral");
+		break;
+
+	case 0x10:
+		iOtgState =
+    		//  123456789012
+			_L("A-Vbus Error");
+		break;
+
+	case 0x20:
+		iOtgState =
+    		//  123456789012
+			_L("B-Idle      ");
+		break;
+
+	case 0x40:
+		iOtgState =
+    		//  1234567890123
+			_L("B-Peripheral");
+		break;
+
+	case 0x80:
+		iOtgState =
+    		//  1234567890123
+			_L("B-Host      ");
+		break;
+		
+	default:
+		iOtgState =
+    		//  1234567890123
+			_L("Don't Panic!");
+		break;
+		}
+	LOG("OTG State => %S", &iOtgState);
+	ScheduleDraw('E');
+	}
+
+void CUsbTestConsole::SetDriverLoading(TFdfDriverLoadingState aDriverLoading)
+	{
+	switch(aDriverLoading)
+		{
+	case EUnknown:
+		iDriverLoading =
+			//  123
+			_L("???");
+		break;
+	case EDisabled:
+		iDriverLoading =
+			//  123
+			_L("Off");
+		break;
+	case EEnabled:
+		iDriverLoading =
+			//  123
+			_L("On ");
+		break;
+	default:
+		PANIC;
+		break;
+		}
+	LOG("Driver Loading => %S", &iDriverLoading);
+	ScheduleDraw('E');
+	}
+	
+void CUsbTestConsole::SetAttachedDevices(TUint aAttachedDevices)
+	{
+	if(aAttachedDevices > 999)
+		{
+		iAttachedDevices =
+			//  123
+			_L("xxx");
+		}
+	else
+		{
+		iAttachedDevices.NumFixedWidthUC(aAttachedDevices, EDecimal, 3);
+		}
+	LOG("Attached Devices => %S", &iAttachedDevices);
+	ScheduleDraw('E');
+	}
+	
+void CUsbTestConsole::SetControlSession(TBool aControl)
+	{
+	if(aControl)
+		{
+		iControlSession =
+			//  1234567
+			_L("Control");
+		}
+	else
+		{
+		iControlSession =
+			//  1234567
+			_L("       ");
+		}
+	LOG("Control Session => [%d]", aControl);
+	ScheduleDraw('E');
+	}
+
+void CUsbTestConsole::SetDeviceType(TDeviceType aDeviceType)
+	{
+	iDeviceType = aDeviceType;
+
+	switch ( aDeviceType )
+		{
+	case ENoDevice:
+		iAttachedDevice =
+			//  12345
+			_L("     ");
+		break;
+	case EGenericDevice:
+		iAttachedDevice =
+			//  12345
+			_L("<   >");
+		break;
+	case ELogitechHeadset:
+		iAttachedDevice =
+			//  12345
+			_L("<<A>>");
+		break;
+		}
+	LOG("Audio Device => [%S]", &iAttachedDevice);
+	ScheduleDraw('E');
+	}
+	
+TBool CUsbTestConsole::GetAutoSrpResponseState()
+	{
+	return iAutoSrpResponse;
+	}
+	
+void CUsbTestConsole::SetAutoSrpResponseState(TBool aAutoSrpResponse)
+	{
+	iAutoSrpResponse = aAutoSrpResponse;
+	
+	if ( aAutoSrpResponse )
+		{
+		iSrpState = _L("Auto");
+		}
+	else
+		{
+		iSrpState = _L("    ");
+		}
+	}
+
+void CUsbTestConsole::NotifyEvent(XUsbTestConsoleEvent* aEvent)
+	{
+	__ASSERT_ALWAYS(aEvent, PANIC);
+	__ASSERT_ALWAYS(aEvent->iEvent.Length() <= KNumCharactersOnLine, PANIC);
+
+	iEventList.AddFirst(*aEvent);
+	delete iEventList.Last();
+	LOG("Event => %S", &(aEvent->iEvent));
+	ScheduleDraw('E');
+	}
+
+void CUsbTestConsole::Draw()
+	{
+	iConsole->ClearScreen();
+	
+	// First line is the server version number (and session state)
+	TVersionName versionName = iVersion.Name();
+	iConsole->Printf(_L(
+//          1         2         3         4         5
+// 12345678901234567890123456789012345678901234567890123
+  "Server Version: %S   %S\n"
+	),
+	&versionName, &iControlSession
+	);
+
+	// Print "dash board"
+	iConsole->Printf(_L(
+//          1         2         3         4         5
+// 12345678901234567890123456789012345678901234567890123
+  "Device              OTG          Host          "L"%S\n"
+//          12345678901        12345                123
+ L"Service: %S"      L"Id Pin: %S"L"Driver Loading: %S\n"
+ L"Device:  %S"      L"V. Bus: %S"L"Attached Devs:  %S\n"
+ //           1234567890123           12345
+ L"OTG State: %S "        L"Device: %S " L"SRP: %S\n"
+	),
+	&iConnectionIdle,
+    &iServStatus, &iIdPin, &iDriverLoading,
+	&iDevStatus, &iVBus, &iAttachedDevices,
+	&iOtgState, &iAttachedDevice, &iSrpState
+	);
+
+	if (iHelp)
+		{
+		//                     12345678901234567890123456789012345678901234567890123
+		iConsole->Printf(_L("\nHelp:Available Command Selections"));
+		iConsole->Printf(_L("\n"));
+		iConsole->Printf(_L("\n '?'/'h'/'H' = Help (show these menu commands)"));
+		iConsole->Printf(_L("\n 'v'/'V' = Toggle 'verbose' logging"));
+		iConsole->Printf(_L("\n 'q'/'Q' = Quit application"));
+		iConsole->Printf(_L("\n 'c'/'C' = Toggle control session"));
+		iConsole->Printf(_L("\n 's' = Start()           'S' = Stop()"));
+		iConsole->Printf(_L("\n 't' = TryStart()        'T' = TryStop()"));
+		iConsole->Printf(_L("\n 'p'/'P' = Enter personality number (for TryStart())"));
+		iConsole->Printf(_L("\n 'e'/'E' = Toggle 'enable driver loading'"));
+		iConsole->Printf(_L("\n 'b' = BusRequest()      'B' = BusDrop()"));
+		iConsole->Printf(_L("\n 'r' = Respond (positively) to SRP"));
+		iConsole->Printf(_L("\n 'R' = Toggle SRP Auto-Response"));
+		iConsole->Printf(_L("\n 'x'/'X' = Clear Bus Error (A_VBUS_ERR)"));
+		iConsole->Printf(_L("\n 'a'/'A' = Check audio capability"));
+		iConsole->Printf(_L("\n '[' = Perform USBMAN test"));
+		}
+	else
+		{
+		// Events...
+		TDblQueIter<XUsbTestConsoleEvent> iter(iEventList);
+		XUsbTestConsoleEvent* event = NULL;
+		while((event = iter++) != NULL)
+			{
+			iConsole->Printf(_L("\n"));
+			iConsole->Printf(event->iEvent.Left(KNumCharactersOnLine-1));
+			}
+		}
+	}
+	
+	
+
+CUsbTestConsoleTextEntryBase::CUsbTestConsoleTextEntryBase()
+	: CActive(EPriorityNormal)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CUsbTestConsoleTextEntryBase::~CUsbTestConsoleTextEntryBase()
+	{
+	Cancel();
+	iLink.Deque();
+	delete iEntryConsole;
+	iChars.Close();
+	}
+
+void CUsbTestConsoleTextEntryBase::ConstructL(const TDesC& aEntryField)
+	{
+	User::LeaveIfError(iChars.Create(KMaxNumOfChars));
+	iEntryConsole = Console::NewL(_L("UsbTestConsole Entry Console"), TSize(-1,-1));
+	iEntryConsole->Printf(aEntryField);
+	iEntryConsole->Printf(_L(": "));
+	iEntryConsole->Read(iStatus);
+	SetActive();
+	}
+
+void CUsbTestConsoleTextEntryBase::DoCancel()
+	{
+	iEntryConsole->ReadCancel();
+	}
+
+void CUsbTestConsoleTextEntryBase::RunL()
+	{
+	TKeyCode code = iEntryConsole->KeyCode();
+	switch(code)
+		{
+		case EKeyEnter:
+				{
+				TRAPD(err, ConvertAndSetL());
+				if(err == KErrNone)
+					{
+					delete this;
+					return;
+					}
+				}
+			break;
+		case EKeyEscape:
+			delete this;
+			return;
+		case EKeyBackspace:
+			if(iChars.Length() > 0)
+				{
+				iEntryConsole->SetCursorPosRel(TPoint(-1, 0));
+				iEntryConsole->ClearToEndOfLine();
+				iChars.SetLength(iChars.Length()-1);
+				}
+			break;
+		default:
+			iChars.Append(code);
+			iEntryConsole->Printf(_L("%c"), code);
+			break;
+		}
+	iEntryConsole->Read(iStatus);
+	SetActive();
+	}
+
+
+template<typename T>
+CUsbTestConsoleTextEntry<T>* CUsbTestConsoleTextEntry<T>::NewL(T& aValue, const TDesC& aEntryField)
+	{
+	CUsbTestConsoleTextEntry<T>* self = new(ELeave) CUsbTestConsoleTextEntry<T>(aValue);
+	CleanupStack::PushL(self);
+	self->ConstructL(aEntryField);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+template<typename T>
+CUsbTestConsoleTextEntry<T>::~CUsbTestConsoleTextEntry()
+	{
+	}
+
+template<typename T>
+CUsbTestConsoleTextEntry<T>::CUsbTestConsoleTextEntry(T& aValue)
+	: CUsbTestConsoleTextEntryBase()
+	, iValue(aValue)
+	{
+	}
+
+template<>
+void CUsbTestConsoleTextEntry<TUint>::ConvertAndSetL()
+	{
+	TLex lex(iChars);
+	
+	lex.SkipSpaceAndMark();
+
+	TBool hex = ETrue;
+	if (lex.Get() != '0' || lex.Get() != 'x')
+		{
+		lex.UnGetToMark();
+		hex = EFalse;
+		}
+		
+	TUint val;
+	TRadix rad = hex ? EHex : EDecimal;
+	User::LeaveIfError(lex.Val(val, rad));
+	
+	iValue = val;
+	}
+	
+template<>
+void CUsbTestConsoleTextEntry<TInt>::ConvertAndSetL()
+	{
+	TLex lex(iChars);
+	
+	lex.SkipSpaceAndMark();
+
+	TUint val;
+	User::LeaveIfError(lex.Val(val, EDecimal));
+	
+	iValue = val;
+	}
+
+
+
+
+
+
+
+
+	
+
+
+CEventNotifier::CEventNotifier(TInt aPriority)
+	: CActive(aPriority)
+	{
+	}
+
+XUsbTestConsoleEvent* CEventNotifier::NewConsoleEventL()
+	{
+	XUsbTestConsoleEvent* event = new(ELeave) XUsbTestConsoleEvent;
+	CleanupStack::PushL(event);
+	User::LeaveIfError(event->iEvent.Create(CUsbTestConsole::KNumCharactersOnLine-1));
+	CleanupStack::Pop();
+	return event;
+	}
+
+void CEventNotifier::RunL()
+	{
+	DoRunL(NewConsoleEventL());
+	}
+
+
+CServiceStateWatcher* CServiceStateWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CServiceStateWatcher* self = new(ELeave) CServiceStateWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+CServiceStateWatcher::~CServiceStateWatcher()
+	{
+	Cancel();
+	}
+
+CServiceStateWatcher::CServiceStateWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	, iServiceState(EUsbServiceIdle)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CServiceStateWatcher::ConstructL()
+	{
+	iTestConsole.Usb().ServiceStateNotification(iServiceState, iStatus);
+	SetActive();
+
+	TUsbServiceState serviceState;
+	User::LeaveIfError(iTestConsole.Usb().GetServiceState(serviceState));
+	iTestConsole.SetServiceState(serviceState);
+	}
+
+void CServiceStateWatcher::DoCancel()
+	{
+	iTestConsole.Usb().ServiceStateNotificationCancel();
+	}
+
+void CServiceStateWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	iTestConsole.SetServiceState(iServiceState);
+	TPtrC res(NULL, 0);
+	_LIT(KIdle, "Idle");
+	_LIT(KStarting, "Starting");
+	_LIT(KStarted, "Started");
+	_LIT(KStopping, "Stopping");
+	_LIT(KError, "Error");
+	switch(iServiceState)
+		{
+	case EUsbServiceIdle:
+		res.Set(KIdle);
+		break;
+	case EUsbServiceStarting:
+		res.Set(KStarting);
+		break;
+	case EUsbServiceStarted:
+		res.Set(KStarted);
+		break;
+	case EUsbServiceStopping:
+		res.Set(KStopping);
+		break;
+	case EUsbServiceFatalError:
+		res.Set(KError);
+		break;
+	default:
+		PANIC;
+		break;
+		}
+		
+	iTestConsole.Usb().ServiceStateNotification(iServiceState, iStatus);
+	SetActive();
+
+	aEvent->iEvent.AppendFormat(_L("D:ServiceState [%S]"), &res);
+	iTestConsole.NotifyEvent(aEvent);
+
+	// Seems like there can be race conditions
+	TUsbServiceState serviceState;
+	User::LeaveIfError(iTestConsole.Usb().GetServiceState(serviceState));
+
+	iTestConsole.SetServiceState(serviceState);
+	}
+
+	
+CDeviceStateWatcher* CDeviceStateWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CDeviceStateWatcher* self = new(ELeave) CDeviceStateWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+CDeviceStateWatcher::~CDeviceStateWatcher()
+	{
+	Cancel();
+	}
+
+CDeviceStateWatcher::CDeviceStateWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CDeviceStateWatcher::ConstructL()
+	{
+	iTestConsole.Usb().DeviceStateNotification(0xffffffff, iDeviceState, iStatus);
+	SetActive();
+
+	TUsbDeviceState deviceState;
+	User::LeaveIfError(iTestConsole.Usb().GetDeviceState(deviceState));
+	iTestConsole.SetDeviceState(deviceState);
+	}
+
+void CDeviceStateWatcher::DoCancel()
+	{
+	iTestConsole.Usb().DeviceStateNotificationCancel();
+	}
+
+void CDeviceStateWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	iTestConsole.SetDeviceState(iDeviceState);
+	TPtrC res(NULL, 0);
+	_LIT(KUndefined, "Undefined");
+    _LIT(KDefault, "Default");
+    _LIT(KAttached, "Attached");
+    _LIT(KPowered, "Powered");
+    _LIT(KConfigured, "Configured");
+    _LIT(KAddress, "Address");
+    _LIT(KSuspended, "Suspended");
+	switch(iDeviceState)
+		{
+	case EUsbDeviceStateUndefined:
+		res.Set(KUndefined);
+		break;
+	case EUsbDeviceStateDefault:
+		res.Set(KDefault);
+		break;
+	case EUsbDeviceStateAttached:
+		res.Set(KAttached);
+		break;
+	case EUsbDeviceStatePowered:
+		res.Set(KPowered);
+		break;
+	case EUsbDeviceStateConfigured:
+		res.Set(KConfigured);
+		break;
+	case EUsbDeviceStateAddress:
+		res.Set(KAddress);
+		break;
+	case EUsbDeviceStateSuspended:
+		res.Set(KSuspended);
+		break;
+	default:
+		PANIC;
+		break;
+		}
+
+    iTestConsole.Usb().DeviceStateNotification(0xffffffff, iDeviceState, iStatus);
+	SetActive();
+
+	aEvent->iEvent.AppendFormat(_L("D:DeviceState [%S]"), &res);
+	iTestConsole.NotifyEvent(aEvent);
+
+	// Seems like there can be race conditions
+	TUsbDeviceState deviceState;
+	User::LeaveIfError(iTestConsole.Usb().GetDeviceState(deviceState));
+
+	iTestConsole.SetDeviceState(deviceState);
+	}
+	
+CConnectionIdleWatcher* CConnectionIdleWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CConnectionIdleWatcher * self = new(ELeave) CConnectionIdleWatcher (aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+CConnectionIdleWatcher::~CConnectionIdleWatcher()
+	{
+	Cancel();
+	iConnectionIdleProp.Close();
+	}
+
+CConnectionIdleWatcher::CConnectionIdleWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CConnectionIdleWatcher::ConstructL()
+	{
+	User::LeaveIfError(iConnectionIdleProp.Attach(KUidUsbManCategory, KUsbOtgConnectionIdleProperty));
+	iConnectionIdleProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	TInt err = iConnectionIdleProp.Get(val);
+	LOG("CConnectionIdleWatcher::ConstructL iConnectionIdleProp.Get(val) => val=%d", val);
+	User::LeaveIfError(err);
+	iTestConsole.SetConnectionIdle(val);
+	}
+
+void CConnectionIdleWatcher::DoCancel()
+	{
+	iConnectionIdleProp.Cancel();
+	}
+
+void CConnectionIdleWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	CleanupStack::PushL(aEvent);
+
+	iConnectionIdleProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	User::LeaveIfError(iConnectionIdleProp.Get(val));
+
+	TPtrC res(NULL, 0);
+	_LIT(KConnectionIdle, "Idle");
+	_LIT(KConnectionBusy, "Busy");
+	switch(val)
+		{
+	case 0:
+		res.Set(KConnectionBusy);
+		break;
+
+	case 1:
+		res.Set(KConnectionIdle);
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	CleanupStack::Pop();
+
+	aEvent->iEvent.AppendFormat(_L("O:ConnectionIdle [%S]"), &res);
+	iTestConsole.SetConnectionIdle(val);
+	iTestConsole.NotifyEvent(aEvent);
+	}
+	
+	
+CIdPinWatcher* CIdPinWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CIdPinWatcher* self = new(ELeave) CIdPinWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+CIdPinWatcher::~CIdPinWatcher()
+	{
+	Cancel();
+	iIdPinProp.Close();
+	}
+
+CIdPinWatcher::CIdPinWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CIdPinWatcher::ConstructL()
+	{
+	User::LeaveIfError(iIdPinProp.Attach(KUidUsbManCategory, KUsbOtgIdPinPresentProperty));
+	iIdPinProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	TInt err = iIdPinProp.Get(val);
+	LOG("CIdPinWatcher::ConstructL iIdPinProp.Get(val) => %d",err);
+	User::LeaveIfError(err);
+	iTestConsole.SetIdPin(val);
+	}
+
+void CIdPinWatcher::DoCancel()
+	{
+	iIdPinProp.Cancel();
+	}
+
+void CIdPinWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	CleanupStack::PushL(aEvent);
+
+	iIdPinProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	User::LeaveIfError(iIdPinProp.Get(val));
+
+	TPtrC res(NULL, 0);
+	_LIT(KIdPinInserted, "Inserted");
+	_LIT(KIdPinRemoved, "Removed");
+	switch(val)
+		{
+	case 0:
+		res.Set(KIdPinRemoved);
+		break;
+
+	case 1:
+		res.Set(KIdPinInserted);
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	CleanupStack::Pop();
+
+	aEvent->iEvent.AppendFormat(_L("O:IdPin [%S]"), &res);
+	iTestConsole.SetIdPin(val);
+	iTestConsole.NotifyEvent(aEvent);
+	}
+	
+	
+CVBusWatcher* CVBusWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CVBusWatcher* self = new(ELeave) CVBusWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+CVBusWatcher::~CVBusWatcher()
+	{
+	Cancel();
+	iVBusProp.Close();
+	}
+
+CVBusWatcher::CVBusWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CVBusWatcher::ConstructL()
+	{
+	User::LeaveIfError(iVBusProp.Attach(KUidUsbManCategory, KUsbOtgVBusPoweredProperty));
+	iVBusProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	User::LeaveIfError(iVBusProp.Get(val));
+	iTestConsole.SetVBus(val);
+	}
+
+void CVBusWatcher::DoCancel()
+	{
+	iVBusProp.Cancel();
+	}
+
+void CVBusWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	CleanupStack::PushL(aEvent);
+
+	iVBusProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	User::LeaveIfError(iVBusProp.Get(val));
+
+	TPtrC res(NULL, 0);
+	_LIT(KVBusRaised, "Raised");
+	_LIT(KVBusDropped, "Dropped");
+	switch(val)
+		{
+	case 0:
+		{
+		if ( iTestConsole.GetAutoSrpResponseState() ) 
+			{
+			(iTestConsole.Timer())->Cancel();
+			}
+		res.Set(KVBusDropped);
+		break;
+		}
+	case 1:
+		res.Set(KVBusRaised);
+		break;
+
+	default:
+		PANIC;
+		break;
+		}
+	CleanupStack::Pop();
+
+	aEvent->iEvent.AppendFormat(_L("O:VBus [%S]"), &res);
+	iTestConsole.SetVBus(val);
+	iTestConsole.NotifyEvent(aEvent);
+	}
+	
+COtgStateWatcher* COtgStateWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	COtgStateWatcher* self = new(ELeave) COtgStateWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+COtgStateWatcher::~COtgStateWatcher()
+	{
+	Cancel();
+	iOtgStateProp.Close();
+	}
+
+COtgStateWatcher::COtgStateWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void COtgStateWatcher::ConstructL()
+	{
+	User::LeaveIfError(iOtgStateProp.Attach(KUidUsbManCategory, KUsbOtgStateProperty));
+	iOtgStateProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	User::LeaveIfError(iOtgStateProp.Get(val));
+	iTestConsole.SetOtgState(val);
+	}
+
+void COtgStateWatcher::DoCancel()
+	{
+	iOtgStateProp.Cancel();
+	}
+
+void COtgStateWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	CleanupStack::PushL(aEvent);
+
+	iOtgStateProp.Subscribe(iStatus);
+	SetActive();
+
+	TInt val;
+	User::LeaveIfError(iOtgStateProp.Get(val));
+
+	TPtrC res(NULL, 0);
+	
+	_LIT(KReset, 		"Reset"			);
+
+	_LIT(KAIdle, 		"A-Idle"		);
+	_LIT(KAHost, 		"A-Host"		);
+	_LIT(KAPeripheral, 	"A-Peripheral"	);
+	_LIT(KABusError, 	"A-Bus Error"	);
+	
+	_LIT(KBIdle, 		"B-Idle"		);
+	_LIT(KBPeripheral, 	"B-Peripheral"	);
+	_LIT(KBHost, 		"B-Host"		);
+	
+	_LIT(KUnknown, 		"Unknown"		);
+
+	switch(val)
+		{
+	case EUsbOtgStateReset:
+		res.Set(KReset);
+		break;
+
+	case EUsbOtgStateAIdle:
+		res.Set(KAIdle);
+		break;
+
+	case EUsbOtgStateAHost:
+		if ( iTestConsole.GetAutoSrpResponseState() ) 
+			{
+			(iTestConsole.Timer())->Cancel();
+			}
+		res.Set(KAHost);
+		break;
+
+	case EUsbOtgStateAPeripheral:
+		res.Set(KAPeripheral);
+		break;
+
+	case EUsbOtgStateAVbusError:
+		res.Set(KABusError);
+		break;
+
+	case EUsbOtgStateBIdle:
+		res.Set(KBIdle);
+		break;
+
+	case EUsbOtgStateBPeripheral:
+		res.Set(KBPeripheral);
+		break;
+		
+	case EUsbOtgStateBHost:
+		res.Set(KBHost);
+		break;
+
+	default:
+		res.Set(KUnknown);
+		break;
+		}
+	CleanupStack::Pop();
+
+	aEvent->iEvent.AppendFormat(_L("O:OtgState [%S]"), &res);
+	iTestConsole.SetOtgState(val);
+	iTestConsole.NotifyEvent(aEvent);
+	}
+
+CHostEventWatcher* CHostEventWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CHostEventWatcher* self = new(ELeave) CHostEventWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CHostEventWatcher::~CHostEventWatcher()
+	{
+	Cancel();
+	}
+
+CHostEventWatcher::CHostEventWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CHostEventWatcher::ConstructL()
+	{
+	iTestConsole.Usb().HostEventNotification(iStatus, iDeviceInfo);
+	SetActive();
+	iTestConsole.SetAttachedDevices(0);
+	}
+
+void CHostEventWatcher::DoCancel()
+	{
+	iTestConsole.Usb().HostEventNotificationCancel();
+	}
+
+void CHostEventWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	CleanupStack::PushL(aEvent);
+
+	switch(iDeviceInfo.iEventType)
+		{
+	case EDeviceAttachment:
+			{
+			if(iDeviceInfo.iError == KErrNone)
+				{
+				User::LeaveIfError(iAttachedDevices.Append(iDeviceInfo.iDeviceId));
+				}
+			aEvent->iEvent.AppendFormat(_L("H:Attach[%08x] Err[%d] VidPid[%04x,%04x]"), iDeviceInfo.iDeviceId, iDeviceInfo.iError, iDeviceInfo.iVid, iDeviceInfo.iPid);
+			
+			if (  (iDeviceInfo.iVid == 0x046D)
+			    &&(iDeviceInfo.iPid == 0x0A02)
+			   )
+				{
+				iTestConsole.SetDeviceType(CUsbTestConsole::ELogitechHeadset);
+				}
+			else
+				{
+				iTestConsole.SetDeviceType(CUsbTestConsole::EGenericDevice);
+				}
+			}
+		break;
+
+	case EDriverLoad:
+			{
+			TPtrC res(NULL, 0);
+			_LIT(KDriverLoadSuccess, "Success");
+			_LIT(KDriverLoadPartialSuccess, "Warning");
+			_LIT(KDriverLoadFailure, "Failure");
+			switch(iDeviceInfo.iDriverLoadStatus)
+				{
+			case EDriverLoadSuccess:
+				res.Set(KDriverLoadSuccess);
+				break;
+			case EDriverLoadPartialSuccess:
+				res.Set(KDriverLoadPartialSuccess);
+				break;
+			case EDriverLoadFailure:
+				res.Set(KDriverLoadFailure);
+				break;
+			default:
+				PANIC;
+				break;
+				}
+			aEvent->iEvent.AppendFormat(_L("H:Load[%08x] Err[%d] Status[%S]"), iDeviceInfo.iDeviceId, iDeviceInfo.iError, &res);
+			}
+		break;
+
+	case EDeviceDetachment:
+			{
+			aEvent->iEvent.AppendFormat(_L("H:Detach [%08x]"), iDeviceInfo.iDeviceId);
+			TInt ix = iAttachedDevices.Find(iDeviceInfo.iDeviceId);
+			if(ix == KErrNotFound)
+				{
+				// This is probably caused by starting a new instance of the test console.
+				break;
+				}
+			iAttachedDevices.Remove(ix);
+			iTestConsole.SetDeviceType(CUsbTestConsole::ENoDevice);
+			}
+		break;
+	default:
+		PANIC;
+		break;
+		}
+	CleanupStack::Pop();
+	iTestConsole.SetAttachedDevices(iAttachedDevices.Count());
+	iTestConsole.NotifyEvent(aEvent);
+	iTestConsole.Usb().HostEventNotification(iStatus, iDeviceInfo);
+	SetActive();
+	}
+	
+	
+CMessageWatcher* CMessageWatcher::NewL(CUsbTestConsole& aTestConsole)
+	{
+	CMessageWatcher* self = new(ELeave) CMessageWatcher(aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+CMessageWatcher::~CMessageWatcher()
+	{
+	Cancel();
+	}
+
+CMessageWatcher::CMessageWatcher(CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CMessageWatcher::ConstructL()
+	{
+	iTestConsole.Usb().MessageNotification(iStatus, iMessage);
+	SetActive();
+	}
+
+void CMessageWatcher::DoCancel()
+	{
+	iTestConsole.Usb().MessageNotificationCancel();
+	}
+
+void CMessageWatcher::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	TInt err = iStatus.Int();
+	
+	if (err)
+		{
+		aEvent->iEvent.AppendFormat(_L("O:Message[%d] Err[%d]"), iMessage, err);
+		}
+	else
+		{
+		TPtrC text(NULL, 0);
+
+		// OTGDI
+		_LIT(KMessOtgdiEventQueueOverflow,			"O:Event Queue Overflow"			);
+		_LIT(KMessOtgdiStateQueueOverflow,			"O:State Queue Overflow"			);
+		_LIT(KMessOtgdiMessageQueueOverflow,		"O:Message Queue Overflow"			);
+		_LIT(KMessOtgdiBadState,					"O:Bad State"						);
+		_LIT(KMessOtgdiStackNotStarted,				"O:Stack Not Started"				);
+		_LIT(KMessOtgdiVbusAlreadyRaised,			"O:VBUS Already Raised"				);
+		_LIT(KMessOtgdiSrpForbidden,				"O:SRP Forbidden"					);
+		_LIT(KMessOtgdiBusControlProblem,			"O:Bus Control Problem"				);
+		_LIT(KMessOtgdiVbusPowerUpError,			"O:VBUS Power Up Error"				);		
+		_LIT(KMessOtgdiHnpEnableProblem,			"O:HNP Enable Problem"				);		
+		_LIT(KMessOtgdiPeriphNotSupported,			"O:Peripheral Not Supported"		);		
+		_LIT(KMessOtgdiVbusError,					"O:VBUS Error"						);
+		_LIT(KMessOtgdiSrpTimeout,					"O:SRP Timeout"						);
+		_LIT(KMessOtgdiSrpActive,					"O:SRP Already Active"				);
+		_LIT(KMessOtgdiSrpNotPermitted,				"O:SRP Not Permitted"				);
+		_LIT(KMessOtgdiHnpNotPermitted,				"O:HNP Not Permitted"				);
+		_LIT(KMessOtgdiHnpNotEnabled,				"O:HNP Not Enabled"					);
+		_LIT(KMessOtgdiHnpNotSuspended,				"O:HNP Not Suspended"				);
+		_LIT(KMessOtgdiVbusPowerUpNotPermitted,		"O:VBUS Power Up Not Permitted"		);
+		_LIT(KMessOtgdiVbusPowerDownNotPermitted,	"O:VBUS Power Down Not Permitted"	);
+		_LIT(KMessOtgdiVbusClearErrorNotPermitted,	"O:VBUS Clear Error Not Permitted"	);
+		_LIT(KMessOtgdiHnpNotResponding,			"O:HNP Not Responding"				);
+		_LIT(KMessOtgdiHnpBusDrop,					"O:VBUS Drop During HNP!"			);
+
+		// USBDI - Main
+
+		_LIT(KMessUsbdiRequestsPending,				"U:Requests Pending"				);		
+		_LIT(KMessUsbdiBadAddress,					"U:Bad Address"						);
+		_LIT(KMessUsbdiNoAddress,					"U:No Address"						);
+		_LIT(KMessUsbdiSetAddrFailed,				"U:Set Address Failed"				);
+		_LIT(KMessUsbdiNoPower,						"U:No Power"						);
+		_LIT(KMessUsbdiTooDeep,						"U:Too Deep"						);
+		_LIT(KMessUsbdiIOError,						"U:IO Error"						);
+		_LIT(KMessUsbdiNotConfigured,				"U:Not Configured"					);
+		_LIT(KMessUsbdiTimeout,						"U:Timeout"							);
+		_LIT(KMessUsbdiStalled,						"U:Stalled"							);
+		_LIT(KMessUsbdiTestFailure,					"U:Test Failure"					);
+		_LIT(KMessUsbdiBadState,					"U:Bad State"						);
+		_LIT(KMessUsbdiDeviceSuspended,				"U:Device Suspended"				);
+
+		// USBDI - Descriptors
+
+		_LIT(KMessUsbdiBadDescriptorTopology,		"U:Bad Descriptor Topology"			);
+
+		// USBDI - DevMon
+
+		_LIT(KMessUsbdiDeviceRejected,				"U:Device Rejected"					);
+		_LIT(KMessUsbdiDeviceFailed,				"U:Device failed"					);
+		_LIT(KMessUsbdiBadDevice,					"U:Bad Device"						);
+		_LIT(KMessUsbdiBadHubPosition,				"U:Bad Hub Position"				);
+		_LIT(KMessUsbdiBadHub,						"U:Bad Hub"							);
+		_LIT(KMessUsbdiEventOverflow,				"U:Event Overflow"					);
+		
+		// USBMAN
+		
+		_LIT(KMessUsbmanSrpInitiated,				"M:SRP Initiated"					);
+		_LIT(KMessUsbmanSrpReceived,				"M:SRP Received"					);
+		_LIT(KMessUsbmanHnpDisabled,				"M:HNP Disabled"					);
+		_LIT(KMessUsbmanHnpEnabled,					"M:HNP Enabled"						);
+		_LIT(KMessUsbmanVbusRaised,					"M:VBUS Raised"						);
+		_LIT(KMessUsbmanVbusDropped,				"M:VBUS Dropped"					);
+		_LIT(KMessUsbmanRequestSession,				"M:Request Session"					);
+
+		_LIT(KMessUnknown, 							"*:Unknown"							);
+
+		switch(iMessage)
+			{
+			// OTGDI
+
+			case KErrUsbOtgEventQueueOverflow:			text.Set(KMessOtgdiEventQueueOverflow);			break;
+			case KErrUsbOtgStateQueueOverflow:	       	text.Set(KMessOtgdiStateQueueOverflow);			break;
+			case KErrUsbOtgMessageQueueOverflow:		text.Set(KMessOtgdiMessageQueueOverflow);		break;
+			case KErrUsbOtgBadState:					text.Set(KMessOtgdiBadState);					break;		
+			case KErrUsbOtgStackNotStarted:				text.Set(KMessOtgdiStackNotStarted);			break;	
+			case KErrUsbOtgVbusAlreadyRaised:	       	text.Set(KMessOtgdiVbusAlreadyRaised);			break;
+			case KErrUsbOtgSrpForbidden:				text.Set(KMessOtgdiSrpForbidden);				break;	
+			case KErrUsbOtgBusControlProblem:	       	text.Set(KMessOtgdiBusControlProblem);			break;
+			case KErrUsbOtgVbusPowerUpError:			text.Set(KMessOtgdiVbusPowerUpError);			break;		
+			case KErrUsbOtgHnpEnableProblem:			text.Set(KMessOtgdiHnpEnableProblem);			break;		
+			case KErrUsbOtgPeriphNotSupported:			text.Set(KMessOtgdiPeriphNotSupported);			break;		
+			case KErrUsbOtgVbusError:			       	text.Set(KMessOtgdiVbusError);					break;		
+			case KErrUsbOtgSrpTimeout:			       	text.Set(KMessOtgdiSrpTimeout);					break;		
+			case KErrUsbOtgSrpActive:			       	text.Set(KMessOtgdiSrpActive);					break;		
+			case KErrUsbOtgSrpNotPermitted:				text.Set(KMessOtgdiSrpNotPermitted);			break;
+			case KErrUsbOtgHnpNotPermitted:				text.Set(KMessOtgdiHnpNotPermitted);			break;
+			case KErrUsbOtgHnpNotEnabled:				text.Set(KMessOtgdiHnpNotEnabled);				break;
+			case KErrUsbOtgHnpNotSuspended:				text.Set(KMessOtgdiHnpNotSuspended);			break;
+			case KErrUsbOtgVbusPowerUpNotPermitted:  	text.Set(KMessOtgdiVbusPowerUpNotPermitted);	break;
+			case KErrUsbOtgVbusPowerDownNotPermitted:	text.Set(KMessOtgdiVbusPowerDownNotPermitted);	break;
+			case KErrUsbOtgVbusClearErrorNotPermitted:	text.Set(KMessOtgdiVbusClearErrorNotPermitted);	break;
+			case KErrUsbOtgHnpNotResponding:			text.Set(KMessOtgdiHnpNotResponding);			break;
+			case KErrUsbOtgHnpBusDrop:					text.Set(KMessOtgdiHnpBusDrop);					break;
+
+			// USBDI - Main
+
+			case KErrUsbRequestsPending:				text.Set(KMessUsbdiRequestsPending);			break;		
+			case KErrUsbBadAddress:						text.Set(KMessUsbdiBadAddress); 				break;			
+			case KErrUsbNoAddress:						text.Set(KMessUsbdiNoAddress); 					break;			
+			case KErrUsbSetAddrFailed:					text.Set(KMessUsbdiSetAddrFailed); 				break;		
+			case KErrUsbNoPower:						text.Set(KMessUsbdiNoPower); 					break;				
+			case KErrUsbTooDeep:						text.Set(KMessUsbdiTooDeep); 					break;				
+			case KErrUsbIOError:						text.Set(KMessUsbdiIOError); 					break;				
+			case KErrUsbNotConfigured:					text.Set(KMessUsbdiNotConfigured); 				break;		
+			case KErrUsbTimeout:						text.Set(KMessUsbdiTimeout); 					break;				
+			case KErrUsbStalled:						text.Set(KMessUsbdiStalled); 					break;				
+			case KErrUsbTestFailure:					text.Set(KMessUsbdiTestFailure); 				break;			
+			case KErrUsbBadState:						text.Set(KMessUsbdiBadState); 					break;			
+			case KErrUsbDeviceSuspended:				text.Set(KMessUsbdiDeviceSuspended); 			break;		
+																									
+			// USBDI - Descriptors																	
+			
+			case KErrUsbBadDescriptorTopology:			text.Set(KMessUsbdiBadDescriptorTopology); 		break;
+
+			// USBDI - DevMon
+			
+			case KErrUsbDeviceRejected:					text.Set(KMessUsbdiDeviceRejected); 			break;		
+			case KErrUsbDeviceFailed:					text.Set(KMessUsbdiDeviceFailed); 				break;		
+			case KErrUsbBadDevice:						text.Set(KMessUsbdiBadDevice); 					break;			
+			case KErrUsbBadHubPosition:					text.Set(KMessUsbdiBadHubPosition); 			break;		
+			case KErrUsbBadHub:							text.Set(KMessUsbdiBadHub); 					break;				
+			case KErrUsbEventOverflow:					text.Set(KMessUsbdiEventOverflow); 				break;		
+																										
+			// USBMAN																					
+																										
+			case KUsbMessageSrpInitiated:				text.Set(KMessUsbmanSrpInitiated);				break;
+			case KUsbMessageSrpReceived:				text.Set(KMessUsbmanSrpReceived);				break;
+			case KUsbMessageHnpDisabled:				text.Set(KMessUsbmanHnpDisabled);				break;
+			case KUsbMessageHnpEnabled:					text.Set(KMessUsbmanHnpEnabled);				break;
+			case KUsbMessageVbusRaised:					text.Set(KMessUsbmanVbusRaised);				break;
+			case KUsbMessageVbusDropped:				text.Set(KMessUsbmanVbusDropped);				break;
+			case KUsbMessageRequestSession:				text.Set(KMessUsbmanRequestSession);			break;
+																										
+			default:									text.Set(KMessUnknown);							break;
+			}																							
+
+		aEvent->iEvent.AppendFormat(_L("O:Message[%d] [%S]"), iMessage, &text);
+		
+		if (   ( iMessage == KUsbMessageSrpReceived )
+		    && ( iTestConsole.GetAutoSrpResponseState() )
+		   )
+			{
+			iTestConsole.Usb().BusRespondSrp();
+			iTestConsole.Timer()->Start(KTimerAWaitBConnect);
+			}
+		else if ( iMessage == KUsbMessageRequestSession )
+			{
+			iTestConsole.Usb().BusRequest();
+			} 
+		}
+
+	iTestConsole.Usb().MessageNotification(iStatus, iMessage);
+	SetActive();
+	
+	iTestConsole.NotifyEvent(aEvent);
+	}
+
+
+	
+void CUsbManStarter::NewL(CUsbManStarter*& aSelf, CUsbTestConsole& aTestConsole)
+	{
+	aSelf = NULL;
+	CUsbManStarter* self = new(ELeave) CUsbManStarter(aSelf, aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	aSelf = self;
+	}
+
+CUsbManStarter::~CUsbManStarter()
+	{
+	Cancel();
+	iSelf = NULL;
+	}
+
+CUsbManStarter::CUsbManStarter(CUsbManStarter*& aSelf, CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iSelf(aSelf)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbManStarter::ConstructL()
+	{
+	iTestConsole.Usb().Start(iStatus);
+	SetActive();
+	}
+
+void CUsbManStarter::DoCancel()
+	{
+	iTestConsole.Usb().StartCancel();
+	}
+
+void CUsbManStarter::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	aEvent->iEvent.AppendFormat(_L("G:Start:Err[%d]"), iStatus.Int());
+	iTestConsole.NotifyEvent(aEvent);
+	delete this;
+	}
+
+void CUsbManStarter::DestroyL()
+	{
+	XUsbTestConsoleEvent* event = NewConsoleEventL();
+	event->iEvent.Append(_L("G:StartCancel"));
+	iTestConsole.NotifyEvent(event);
+	delete this;
+	}
+	
+	
+void CUsbManStoper::NewL(CUsbManStoper*& aSelf, CUsbTestConsole& aTestConsole)
+	{
+	aSelf = NULL;
+	CUsbManStoper* self = new(ELeave) CUsbManStoper(aSelf, aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	aSelf = self;
+	}
+
+CUsbManStoper::~CUsbManStoper()
+	{
+	Cancel();
+	iSelf = NULL;
+	}
+
+CUsbManStoper::CUsbManStoper(CUsbManStoper*& aSelf, CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iSelf(aSelf)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbManStoper::ConstructL()
+	{
+	iTestConsole.Usb().Stop(iStatus);
+	SetActive();
+	}
+
+void CUsbManStoper::DoCancel()
+	{
+	iTestConsole.Usb().StopCancel();
+	}
+
+void CUsbManStoper::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	aEvent->iEvent.AppendFormat(_L("G:Stop:Err[%d]"), iStatus.Int());
+	iTestConsole.NotifyEvent(aEvent);
+	delete this;
+	}
+
+void CUsbManStoper::DestroyL()
+	{
+	XUsbTestConsoleEvent* event = NewConsoleEventL();
+	event->iEvent.Append(_L("G:StopCancel"));
+	iTestConsole.NotifyEvent(event);
+	delete this;
+	}
+	
+	
+	
+void CUsbManTryStarter::NewL(CUsbManTryStarter*& aSelf, CUsbTestConsole& aTestConsole, TInt aPersonalityId)
+	{
+	aSelf = NULL;
+	CUsbManTryStarter* self = new(ELeave) CUsbManTryStarter(aSelf, aTestConsole, aPersonalityId);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	aSelf = self;
+	}
+
+CUsbManTryStarter::~CUsbManTryStarter()
+	{
+	Cancel();
+	iSelf = NULL;
+	}
+
+CUsbManTryStarter::CUsbManTryStarter(CUsbManTryStarter*& aSelf, CUsbTestConsole& aTestConsole, TInt aPersonalityId)
+	: CEventNotifier(EPriorityStandard)
+	, iSelf(aSelf)
+	, iTestConsole(aTestConsole)
+	, iPersonalityId(aPersonalityId)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbManTryStarter::ConstructL()
+	{
+	iTestConsole.Usb().TryStart(iPersonalityId, iStatus);
+	SetActive();
+	}
+
+void CUsbManTryStarter::DoCancel()
+	{
+	iTestConsole.Usb().StartCancel();
+	}
+
+void CUsbManTryStarter::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	aEvent->iEvent.AppendFormat(_L("G:TryStart:Err[%d]"), iStatus.Int());
+	iTestConsole.NotifyEvent(aEvent);
+	delete this;
+	}
+
+void CUsbManTryStarter::DestroyL()
+	{
+	XUsbTestConsoleEvent* event = NewConsoleEventL();
+	event->iEvent.Append(_L("G:StartCancel"));
+	iTestConsole.NotifyEvent(event);
+	delete this;
+	}
+	
+	
+void CUsbManTryStoper::NewL(CUsbManTryStoper*& aSelf, CUsbTestConsole& aTestConsole)
+	{
+	aSelf = NULL;
+	CUsbManTryStoper* self = new(ELeave) CUsbManTryStoper(aSelf, aTestConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	aSelf = self;
+	}
+
+CUsbManTryStoper::~CUsbManTryStoper()
+	{
+	Cancel();
+	iSelf = NULL;
+	}
+
+CUsbManTryStoper::CUsbManTryStoper(CUsbManTryStoper*& aSelf, CUsbTestConsole& aTestConsole)
+	: CEventNotifier(EPriorityStandard)
+	, iSelf(aSelf)
+	, iTestConsole(aTestConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CUsbManTryStoper::ConstructL()
+	{
+	iTestConsole.Usb().TryStop(iStatus);
+	SetActive();
+	}
+
+void CUsbManTryStoper::DoCancel()
+	{
+	iTestConsole.Usb().StopCancel();
+	}
+
+void CUsbManTryStoper::DoRunL(XUsbTestConsoleEvent* aEvent)
+	{
+	aEvent->iEvent.AppendFormat(_L("G:TryStop:Err[%d]"), iStatus.Int());
+	iTestConsole.NotifyEvent(aEvent);
+	delete this;
+	}
+
+void CUsbManTryStoper::DestroyL()
+	{
+	XUsbTestConsoleEvent* event = NewConsoleEventL();
+	event->iEvent.Append(_L("G:StopCancel"));
+	iTestConsole.NotifyEvent(event);
+	delete this;
+	}
+
+CUsbTestTimer* CUsbTestTimer::NewL(CUsbTestConsole& aUsb)
+	{
+	CUsbTestTimer* self = new(ELeave) CUsbTestTimer(aUsb);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CUsbTestTimer::~CUsbTestTimer()
+	{
+	Cancel();
+	}
+
+void CUsbTestTimer::ConstructL()
+	{
+	CTimer::ConstructL();
+	CActiveScheduler::Add(this);
+	}
+
+CUsbTestTimer::CUsbTestTimer(CUsbTestConsole& aUsb)
+: CTimer(EPriorityStandard)
+, iTestConsole(aUsb)
+	{	
+	}
+
+void CUsbTestTimer::Start(TTimeIntervalMicroSeconds32 aTime)
+	{
+	After(aTime);
+	}
+
+void CUsbTestTimer::RunL()
+	{
+		XUsbTestConsoleEvent* event = new(ELeave) XUsbTestConsoleEvent;
+		CleanupStack::PushL(event);
+		User::LeaveIfError(event->iEvent.Create(CUsbTestConsole::KNumCharactersOnLine-1));
+		CleanupStack::Pop();
+		
+		TPtrC res(NULL, 0);
+		_LIT(KErrMsg, "Device Not Responding");
+		
+		res.Set(KErrMsg);
+		event->iEvent.AppendFormat(_L("T:Timer Message [%S]"), &res);
+		iTestConsole.NotifyEvent(event);
+	}
+
+void CUsbTestTimer::DoCancel()
+	{
+	CTimer::DoCancel();
+	}