sl@0: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32test/usb/t_usb_device/main.cpp sl@0: // USB Test Program, main part. sl@0: // Device-side part, to work against t_usb_host running on the host. sl@0: // sl@0: // sl@0: sl@0: #include "general.h" sl@0: #include "config.h" sl@0: #include "activecontrol.h" sl@0: #include "activeRW.h" sl@0: sl@0: // --- Global Top Level Variables sl@0: sl@0: CActiveControl* gActiveControl; sl@0: #ifdef USB_SC sl@0: RTest test(_L("T_USB_SCDEVICE")); sl@0: #else sl@0: RTest test(_L("T_USB_DEVICE")); sl@0: #endif sl@0: TBool gVerbose = EFalse; sl@0: TBool gSkip = EFalse; sl@0: TBool gTempTest = EFalse; sl@0: TBool gStopOnFail = ETrue; sl@0: TBool gAltSettingOnNotify = ETrue; sl@0: TInt8 gSettingNumber [128]; sl@0: TInt32 gSoakCount = 1; sl@0: CActiveRW* gRW[KMaxConcurrentTests]; // the USB read/write active object sl@0: IFConfigPtr gInterfaceConfig [128] [KMaxInterfaceSettings]; sl@0: TInt gActiveTestCount = 0; sl@0: #ifdef USB_SC sl@0: RChunk gChunk; sl@0: #endif sl@0: sl@0: sl@0: void RunAppL(TDes * aConfigFile, TDes * aScriptFile) sl@0: { sl@0: // Construct the active scheduler sl@0: CActiveScheduler* myScheduler = new (ELeave) CActiveScheduler(); sl@0: sl@0: // Push active scheduler onto the cleanup stack sl@0: CleanupStack::PushL(myScheduler); sl@0: sl@0: // Install as the active scheduler sl@0: CActiveScheduler::Install(myScheduler); sl@0: sl@0: // Create console handler sl@0: #ifdef USB_SC sl@0: CConsoleBase* myConsole = Console::NewL(_L("T_USB_SCDEVICE - USB Client Test"), TSize(KConsFullScreen, KConsFullScreen)); sl@0: CleanupStack::PushL(myConsole); sl@0: sl@0: myConsole->Printf(_L("T_USB_SCDEVICE v%d.%d.%d\n"),KDeviceVersionMajor,KDeviceVersionMinor,KDeviceVersionMicro); sl@0: test.Printf(_L("T_USB_SCDEVICE v%d.%d.%d\n"),KDeviceVersionMajor,KDeviceVersionMinor,KDeviceVersionMicro); sl@0: #else sl@0: CConsoleBase* myConsole = Console::NewL(_L("T_USB_DEVICE - USB Client Test"), TSize(KConsFullScreen, KConsFullScreen)); sl@0: CleanupStack::PushL(myConsole); sl@0: sl@0: myConsole->Printf(_L("T_USB_DEVICE v%d.%d.%d\n"),KDeviceVersionMajor,KDeviceVersionMinor,KDeviceVersionMicro); sl@0: test.Printf(_L("T_USB_DEVICE v%d.%d.%d\n"),KDeviceVersionMajor,KDeviceVersionMinor,KDeviceVersionMicro); sl@0: #endif sl@0: sl@0: // outermost test begin sl@0: test.Start(_L("Outermost test of t_usb_device\n")); sl@0: sl@0: do sl@0: { sl@0: gActiveControl = CActiveControl::NewL(myConsole, aConfigFile, aScriptFile); sl@0: CleanupStack::PushL(gActiveControl); sl@0: sl@0: sl@0: // Call request function sl@0: gActiveControl->RequestEp0ControlPacket(); sl@0: sl@0: CActiveScheduler::Start(); sl@0: sl@0: test.Printf (_L("Test Run Completed\n")); sl@0: sl@0: if (gSoakCount > 0) sl@0: { sl@0: gSoakCount--; sl@0: } sl@0: sl@0: // Suspend thread for 2 seconds sl@0: User::After(2000000); sl@0: sl@0: CleanupStack::PopAndDestroy(gActiveControl); sl@0: sl@0: } sl@0: while ((gSoakCount > 0) || (gSoakCount == -1)); sl@0: sl@0: // outermost test end sl@0: test.End(); sl@0: test.Close(); sl@0: sl@0: CleanupStack::PopAndDestroy(myConsole); sl@0: sl@0: CleanupStack::PopAndDestroy(myScheduler); sl@0: sl@0: return; sl@0: } sl@0: sl@0: void ParseCommandLine (TDes& aConfigFileName, TDes& aScriptFileName) sl@0: { sl@0: TBuf<64> c; sl@0: sl@0: User::CommandLine(c); sl@0: c.LowerCase(); sl@0: sl@0: aConfigFileName.SetLength(0); sl@0: aScriptFileName.SetLength(0); sl@0: if (c != KNullDesC) sl@0: { sl@0: TLex lex(c); sl@0: TPtrC token; sl@0: sl@0: while (token.Set(lex.NextToken()), token != KNullDesC) sl@0: { sl@0: if (token == _L("/v")) sl@0: { sl@0: RDebug::Print(_L("Verbose output enabled\n")); sl@0: gVerbose = ETrue; sl@0: } sl@0: else if (token == _L("/s")) sl@0: { sl@0: RDebug::Print(_L("Skipping some tests\n")); sl@0: gSkip = ETrue; sl@0: } sl@0: else if (token == _L("/t")) sl@0: { sl@0: RDebug::Print(_L("Temporary Test\n")); sl@0: gTempTest = ETrue; sl@0: } sl@0: else if (token == _L("/n")) sl@0: { sl@0: RDebug::Print(_L("Not Stopping on Test Fail\n")); sl@0: gStopOnFail = EFalse; sl@0: } sl@0: else if (token.Left(5) == _L("/soak")) sl@0: { sl@0: TInt equalPos; sl@0: gSoakCount = -1; sl@0: equalPos = token.Locate('='); sl@0: if ((equalPos+1) < token.Length()) sl@0: { sl@0: TLex lexNum(token.Mid(equalPos+1)); sl@0: lexNum.Val(gSoakCount,EDecimal); sl@0: } sl@0: RDebug::Print(_L("Soak test for %d iterations\n"),gSoakCount); sl@0: } sl@0: else if (token.Left(8) == _L("/script=")) sl@0: { sl@0: aScriptFileName = token; sl@0: } sl@0: else sl@0: { sl@0: aConfigFileName = token; sl@0: } sl@0: } sl@0: } sl@0: sl@0: } sl@0: sl@0: TInt E32Main() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack sl@0: sl@0: TBuf<64> configFileName; sl@0: TBuf<64> scriptFileName; sl@0: ParseCommandLine (configFileName,scriptFileName); sl@0: sl@0: if (configFileName.Length() == 0) sl@0: { sl@0: RDebug::Print(_L("(T_USB: Warning - No Configuration File.)\n")); sl@0: } sl@0: else sl@0: { sl@0: RDebug::Print(_L("T_USB: Config File Name %s\n"),configFileName.PtrZ()); sl@0: } sl@0: sl@0: if (scriptFileName.Length() != 0) sl@0: { sl@0: RDebug::Print(_L("T_USB: Script File Name %s\n"),scriptFileName.PtrZ()); sl@0: } sl@0: sl@0: TRAPD(error, RunAppL(& configFileName, &scriptFileName)); sl@0: sl@0: __ASSERT_ALWAYS(!error, User::Panic(_L("T_USB_DEVICE: EPOC32EX"), error)); sl@0: sl@0: delete cleanup; // destroy clean-up stack sl@0: sl@0: __UHEAP_MARKEND; sl@0: sl@0: RDebug::Print(_L("Program exit: done.\n")); sl@0: sl@0: return 0; // and return sl@0: } sl@0: sl@0: sl@0: // -eof-