sl@0: // Copyright (c) 1996-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\device\t_loop.cpp sl@0: // sl@0: // sl@0: sl@0: //#define _DEBUG_DEVCOMM sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #if defined (__WINS__) sl@0: #define __COMM_LDD _L("ECOMM") sl@0: #define __COMM_PDD1 _L("ECDRV") sl@0: #else sl@0: #define __COMM_LDD _L("ECOMM") sl@0: #define __COMM_PDD1 _L("EUART1") sl@0: #define __COMM_PDD2 _L("EUART2") sl@0: #endif sl@0: sl@0: const char KSpinner[]={'|','/','-','\\',}; sl@0: sl@0: const TInt KKeyboardPriority = 4; sl@0: const TInt KTimerPriority = 3; sl@0: const TInt KWriterPriority = 2; sl@0: const TInt KReaderPriority = 1; sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: RTest Test(_L("T_LOOP")); sl@0: sl@0: #define TEST(a) __DoTest((a), __FILE__, __LINE__, 0) sl@0: #define TESTERR(a,b) __DoTest((a), __FILE__, __LINE__, b) sl@0: sl@0: void __DoTest(TBool aCondition, char* aFile, TInt aLine, TInt aErr) sl@0: { sl@0: if (aCondition) sl@0: return; sl@0: sl@0: if (aErr==0) sl@0: Test.Printf(_L("\r\nCheckpoint Fail at %s:%d\r\n"), aFile, aLine); sl@0: else sl@0: Test.Printf(_L("\r\nCheckpoint Fail at %s:%d: Return code = %d (0x%x)\r\n"), aFile, aLine, aErr, aErr); sl@0: __DEBUGGER(); sl@0: Test.Getch(); sl@0: User::Exit(aErr); sl@0: } sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: class CDevCommTestBase; sl@0: sl@0: // This needs: sl@0: // inline void Read(TRequestStatus &aStatus) { iConsole->Read(aStatus); } sl@0: // inline void ReadCancel() { iConsole->ReadCancel(); } sl@0: // inline void TKeyCode KeyCode() { return iConsole->KeyCode(); } sl@0: // adding to RTest sl@0: sl@0: class CKeyReader : public CActive sl@0: { sl@0: public: sl@0: CKeyReader(CDevCommTestBase* aTester, RTest& aTest); sl@0: ~CKeyReader(); sl@0: void Start(); sl@0: protected: sl@0: void RunL(); sl@0: void DoCancel(); sl@0: public: sl@0: RTest& iTest; sl@0: TKeyCode iKey; sl@0: CDevCommTestBase* iTester; sl@0: }; sl@0: sl@0: class CDevCommIOBase : public CActive sl@0: { sl@0: public: sl@0: CDevCommIOBase(CDevCommTestBase* aTester, TInt aPriority); sl@0: ~CDevCommIOBase(); sl@0: void CreateL(TInt aBufferSize); sl@0: void UpdateCount(); sl@0: void ResetCount(); sl@0: public: sl@0: CDevCommTestBase* iTester; sl@0: TPtr8 iDes; sl@0: TUint8* iBuffer; sl@0: TInt iSize; sl@0: TInt iCount; sl@0: TInt iTotal; sl@0: }; sl@0: sl@0: class CDevCommWriterBase : public CDevCommIOBase sl@0: { sl@0: public: sl@0: CDevCommWriterBase(CDevCommTestBase* aTester); sl@0: ~CDevCommWriterBase(); sl@0: void Ready(); sl@0: void Start(); sl@0: protected: sl@0: void RunL(); sl@0: void DoCancel(); sl@0: }; sl@0: sl@0: class CDevCommReaderBase : public CDevCommIOBase sl@0: { sl@0: public: sl@0: CDevCommReaderBase(CDevCommTestBase* aTester); sl@0: ~CDevCommReaderBase(); sl@0: void Ready(); sl@0: void Start(); sl@0: protected: sl@0: void RunL(); sl@0: void DoCancel(); sl@0: }; sl@0: sl@0: class CDevCommTimerBase : public CTimer sl@0: { sl@0: public: sl@0: CDevCommTimerBase(CDevCommTestBase* aTester); sl@0: void CreateL(); sl@0: protected: sl@0: void RunL(); sl@0: public: sl@0: CDevCommTestBase* iTester; sl@0: }; sl@0: sl@0: enum THandshakeMode sl@0: { sl@0: EHandshakeNone, sl@0: EHandshakeHardware, sl@0: EHandshakeSoftware sl@0: }; sl@0: sl@0: class CDevCommTestBase : public CAsyncOneShot sl@0: { sl@0: public: sl@0: CDevCommTestBase(); sl@0: ~CDevCommTestBase(); sl@0: void CreateL(TInt aBufferSize); sl@0: TInt Open(TInt aPort); sl@0: void Close(); sl@0: void Debug(); sl@0: TInt SetHandshaking(THandshakeMode aMode); sl@0: TInt LineFailOn(); sl@0: TInt LineFailOff(); sl@0: TInt ZeroTerminate(); sl@0: void ShowLoopSignals(TUint aOutState, TUint aInState); sl@0: virtual void ReadComplete(TInt aStatus); sl@0: virtual void WriteComplete(TInt aStatus); sl@0: virtual void TimeComplete(TInt aStatus); sl@0: virtual void KeyComplete(TKeyCode aKey); sl@0: void Start(); sl@0: public: sl@0: RBusDevComm iComm; sl@0: CDevCommWriterBase* iWriter; sl@0: CDevCommReaderBase* iReader; sl@0: CDevCommTimerBase* iTimer; sl@0: CKeyReader* iKeyboard; sl@0: TInt iBufferSize; sl@0: }; sl@0: sl@0: sl@0: CKeyReader::CKeyReader(CDevCommTestBase* aTester, RTest& aTest) sl@0: : CActive(KKeyboardPriority), iTest(aTest), iTester(aTester) sl@0: { sl@0: __DECLARE_NAME(_S("CKeyReader")); sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: CKeyReader::~CKeyReader() sl@0: { sl@0: Cancel(); sl@0: } sl@0: sl@0: void CKeyReader::Start() sl@0: { sl@0: if (IsActive()) sl@0: return; sl@0: SetActive(); sl@0: iTest.Console()->Read(iStatus); sl@0: } sl@0: sl@0: void CKeyReader::RunL() sl@0: { sl@0: iKey = iTest.Console()->KeyCode(); sl@0: iTester->KeyComplete(iKey); sl@0: Start(); sl@0: } sl@0: sl@0: void CKeyReader::DoCancel() sl@0: { sl@0: iTest.Console()->ReadCancel(); sl@0: } sl@0: sl@0: sl@0: sl@0: CDevCommIOBase::CDevCommIOBase(CDevCommTestBase* aTester, TInt aPriority) sl@0: : CActive(aPriority), iTester(aTester), iDes(NULL, 0) sl@0: { sl@0: __DECLARE_NAME(_S("CDevCommIOBase")); sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: CDevCommIOBase::~CDevCommIOBase() sl@0: { sl@0: if (iBuffer) sl@0: User::Free(iBuffer); sl@0: } sl@0: sl@0: void CDevCommIOBase::CreateL(TInt aSize) sl@0: { sl@0: iSize = aSize; sl@0: if (iSize>0) sl@0: iBuffer = (TUint8*)User::AllocL(iSize); sl@0: iDes.Set(iBuffer, iSize, iSize); sl@0: } sl@0: sl@0: void CDevCommIOBase::UpdateCount() sl@0: { sl@0: iCount += iDes.Length(); sl@0: iTotal += iDes.Length(); sl@0: } sl@0: sl@0: void CDevCommIOBase::ResetCount() sl@0: { sl@0: iCount = 0; sl@0: } sl@0: sl@0: CDevCommWriterBase::CDevCommWriterBase(CDevCommTestBase* aTester) sl@0: : CDevCommIOBase(aTester, KWriterPriority) sl@0: { sl@0: __DECLARE_NAME(_S("CDevCommWriterBase")); sl@0: } sl@0: sl@0: CDevCommWriterBase::~CDevCommWriterBase() sl@0: { sl@0: Cancel(); sl@0: } sl@0: sl@0: void CDevCommWriterBase::Start() sl@0: { sl@0: __ASSERT_ALWAYS(iBuffer!=NULL, User::Panic(_L("No Buffer"), 0)); sl@0: if (IsActive()) sl@0: return; sl@0: SetActive(); sl@0: iTester->iComm.Write(iStatus, iDes); sl@0: } sl@0: sl@0: void CDevCommWriterBase::Ready() sl@0: { sl@0: if (IsActive()) sl@0: return; sl@0: SetActive(); sl@0: iTester->iComm.Write(iStatus, TPtr8(NULL, 0)); sl@0: } sl@0: sl@0: void CDevCommWriterBase::RunL() sl@0: { sl@0: UpdateCount(); sl@0: iTester->WriteComplete(iStatus.Int()); sl@0: } sl@0: sl@0: void CDevCommWriterBase::DoCancel() sl@0: { sl@0: iTester->iComm.WriteCancel(); sl@0: } sl@0: sl@0: sl@0: CDevCommReaderBase::CDevCommReaderBase(CDevCommTestBase* aTester) sl@0: : CDevCommIOBase(aTester, KReaderPriority) sl@0: { sl@0: __DECLARE_NAME(_S("CDevCommReaderBase")); sl@0: } sl@0: sl@0: CDevCommReaderBase::~CDevCommReaderBase() sl@0: { sl@0: Cancel(); sl@0: } sl@0: sl@0: void CDevCommReaderBase::Start() sl@0: { sl@0: __ASSERT_ALWAYS(iBuffer!=NULL, User::Panic(_L("No Buffer"), 0)); sl@0: if (IsActive()) sl@0: return; sl@0: SetActive(); sl@0: iDes.SetLength(iDes.MaxLength()-iCount); sl@0: iTester->iComm.Read(iStatus, iDes); sl@0: } sl@0: sl@0: void CDevCommReaderBase::Ready() sl@0: { sl@0: if (IsActive()) sl@0: return; sl@0: SetActive(); sl@0: TPtr8 ptr(NULL, 0); sl@0: iTester->iComm.Read(iStatus, ptr); sl@0: } sl@0: sl@0: void CDevCommReaderBase::RunL() sl@0: { sl@0: UpdateCount(); sl@0: iTester->ReadComplete(iStatus.Int()); sl@0: } sl@0: sl@0: void CDevCommReaderBase::DoCancel() sl@0: { sl@0: iTester->iComm.ReadCancel(); sl@0: } sl@0: sl@0: CDevCommTimerBase::CDevCommTimerBase(CDevCommTestBase* aTester) sl@0: : CTimer(KTimerPriority), iTester(aTester) sl@0: { sl@0: __DECLARE_NAME(_S("CDevCommTestTimerBase")); sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: void CDevCommTimerBase::CreateL() sl@0: { sl@0: ConstructL(); sl@0: } sl@0: sl@0: void CDevCommTimerBase::RunL() sl@0: { sl@0: iTester->TimeComplete(iStatus.Int()); sl@0: } sl@0: sl@0: CDevCommTestBase::CDevCommTestBase() sl@0: : CAsyncOneShot(-1) sl@0: { sl@0: __DECLARE_NAME(_S("CDevCommTestBase")); sl@0: } sl@0: sl@0: CDevCommTestBase::~CDevCommTestBase() sl@0: { sl@0: delete iKeyboard; sl@0: delete iTimer; sl@0: delete iWriter; sl@0: delete iReader; sl@0: iComm.Close(); sl@0: } sl@0: sl@0: void CDevCommTestBase::CreateL(TInt aBufferSize) sl@0: { sl@0: iBufferSize = aBufferSize; sl@0: iKeyboard = new (ELeave) CKeyReader(this, Test); sl@0: iTimer = new (ELeave) CDevCommTimerBase(this); sl@0: iWriter = new (ELeave) CDevCommWriterBase(this); sl@0: iReader = new (ELeave) CDevCommReaderBase(this); sl@0: iKeyboard->Start(); sl@0: iWriter->CreateL(iBufferSize); sl@0: iTimer->CreateL(); sl@0: iReader->CreateL(iBufferSize/16); sl@0: } sl@0: sl@0: void CDevCommTestBase::Start() sl@0: { sl@0: Call(); sl@0: } sl@0: sl@0: TInt CDevCommTestBase::Open(TInt aPort) sl@0: { sl@0: TInt err; sl@0: if (err = iComm.Open(aPort), err!=KErrNone) sl@0: return err; sl@0: sl@0: TCommConfig cBuf; sl@0: TCommConfigV01 &c=cBuf(); sl@0: iComm.Config(cBuf); sl@0: sl@0: c.iStopBits = EStop1; sl@0: c.iDataBits = EData8; sl@0: c.iParity = EParityNone; sl@0: c.iHandshake = 0 sl@0: // | KConfigObeyXoff sl@0: // | KConfigSendXoff sl@0: | KConfigObeyCTS sl@0: // | KConfigFailCTS sl@0: | KConfigObeyDSR sl@0: // | KConfigFailDSR sl@0: // | KConfigObeyDCD sl@0: // | KConfigFailDCD sl@0: // | KConfigFreeRTS sl@0: // | KConfigFreeDTR sl@0: ; sl@0: c.iRate = EBps115200; sl@0: c.iFifo = EFifoEnable; sl@0: c.iTerminatorCount = 0; sl@0: c.iTerminator[0] = 0x00; sl@0: sl@0: if (err = iComm.SetConfig(cBuf), err!=KErrNone) sl@0: { sl@0: iComm.Close(); sl@0: return err; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt CDevCommTestBase::ZeroTerminate() sl@0: { sl@0: TCommConfig cBuf; sl@0: TCommConfigV01 &c=cBuf(); sl@0: iComm.Config(cBuf); sl@0: sl@0: c.iTerminatorCount = 1; sl@0: c.iTerminator[0] = 0x00; sl@0: sl@0: return iComm.SetConfig(cBuf); sl@0: } sl@0: sl@0: void CDevCommTestBase::Close() sl@0: { sl@0: iTimer->Cancel(); sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iComm.Close(); sl@0: } sl@0: sl@0: TInt CDevCommTestBase::SetHandshaking(THandshakeMode aMode) sl@0: { sl@0: TCommConfig cBuf; sl@0: TCommConfigV01 &c=cBuf(); sl@0: iComm.Config(cBuf); sl@0: sl@0: switch (aMode) sl@0: { sl@0: case EHandshakeNone: sl@0: c.iHandshake = 0 sl@0: // | KConfigObeyXoff sl@0: // | KConfigSendXoff sl@0: // | KConfigObeyCTS sl@0: // | KConfigFailCTS sl@0: // | KConfigObeyDSR sl@0: // | KConfigFailDSR sl@0: // | KConfigObeyDCD sl@0: // | KConfigFailDCD sl@0: | KConfigFreeRTS sl@0: | KConfigFreeDTR sl@0: ; sl@0: break; sl@0: case EHandshakeSoftware: sl@0: c.iXonChar=0x11; sl@0: c.iXoffChar=0x13; sl@0: c.iHandshake = 0 sl@0: | KConfigObeyXoff sl@0: | KConfigSendXoff sl@0: // | KConfigObeyCTS sl@0: // | KConfigFailCTS sl@0: // | KConfigObeyDSR sl@0: // | KConfigFailDSR sl@0: // | KConfigObeyDCD sl@0: // | KConfigFailDCD sl@0: | KConfigFreeRTS sl@0: | KConfigFreeDTR sl@0: ; sl@0: break; sl@0: case EHandshakeHardware: sl@0: c.iHandshake = 0 sl@0: // | KConfigObeyXoff sl@0: // | KConfigSendXoff sl@0: | KConfigObeyCTS sl@0: // | KConfigFailCTS sl@0: | KConfigObeyDSR sl@0: // | KConfigFailDSR sl@0: // | KConfigObeyDCD sl@0: // | KConfigFailDCD sl@0: // | KConfigFreeRTS sl@0: // | KConfigFreeDTR sl@0: ; sl@0: break; sl@0: } sl@0: return iComm.SetConfig(cBuf); sl@0: } sl@0: sl@0: TInt CDevCommTestBase::LineFailOn() sl@0: { sl@0: TCommConfig cBuf; sl@0: TCommConfigV01 &c=cBuf(); sl@0: iComm.Config(cBuf); sl@0: c.iHandshake |= (KConfigFailDSR|KConfigFailDCD); sl@0: return iComm.SetConfig(cBuf); sl@0: } sl@0: sl@0: TInt CDevCommTestBase::LineFailOff() sl@0: { sl@0: TCommConfig cBuf; sl@0: TCommConfigV01 &c=cBuf(); sl@0: iComm.Config(cBuf); sl@0: c.iHandshake &= ~(KConfigFailDSR|KConfigFailDCD); sl@0: return iComm.SetConfig(cBuf); sl@0: } sl@0: sl@0: void CDevCommTestBase::ShowLoopSignals(TUint aOutState, TUint aInState) sl@0: { sl@0: TPtrC cts, dsr, dcd; sl@0: TPtrC rts, dtr; sl@0: rts.Set(aOutState & KSignalRTS ? _L("RTS On ") : _L("RTS Off")); sl@0: dtr.Set(aOutState & KSignalDTR ? _L("DTR On ") : _L("DTR Off")); sl@0: Test.Printf(_L("%S, %S : "), &rts, &dtr); sl@0: cts.Set(aInState & KSignalCTS ? _L("CTS On ") : _L("CTS Off")); sl@0: dsr.Set(aInState & KSignalDSR ? _L("DSR On ") : _L("DSR Off")); sl@0: dcd.Set(aInState & KSignalDCD ? _L("DCD On ") : _L("DCD Off")); sl@0: Test.Printf(_L("%S, %S, %S "), &cts, &dsr, &dcd); sl@0: rts.Set(aInState & KSignalRTS ? _L("RTS On ") : _L("RTS Off")); sl@0: dtr.Set(aInState & KSignalDTR ? _L("DTR On ") : _L("DTR Off")); sl@0: Test.Printf(_L("[%S, %S]\r\n"), &rts, &dtr); sl@0: } sl@0: sl@0: #ifdef _DEBUG_DEVCOMM sl@0: void CDevCommTestBase::Debug() sl@0: { sl@0: TCommDebugInfoPckg infopckg; sl@0: TCommDebugInfo& info = infopckg(); sl@0: iComm.DebugInfo(infopckg); sl@0: sl@0: Test.Printf(_L(" LDD State : TX RX \r\n")); sl@0: Test.Printf(_L(" Busy : %10d %10d\r\n"), info.iTxBusy, info.iRxBusy); sl@0: Test.Printf(_L(" Held : %10d %10d\r\n"), info.iTxHeld, info.iRxHeld); sl@0: Test.Printf(_L(" Length : %10d %10d\r\n"), info.iTxLength, info.iRxLength); sl@0: Test.Printf(_L(" Offset : %10d %10d\r\n"), info.iTxOffset, info.iRxOffset); sl@0: Test.Printf(_L(" Int Count : %10d %10d\r\n"), info.iTxIntCount, info.iRxIntCount); sl@0: Test.Printf(_L(" Err Count : %10d %10d\r\n"), info.iTxErrCount, info.iRxErrCount); sl@0: Test.Printf(_L(" Buf Count : %10d %10d\r\n"), info.iTxBufCount, info.iRxBufCount); sl@0: Test.Printf(_L(" Fill/Drain : %10d %10d\r\n"), info.iFillingTxBuf, info.iFillingTxBuf); sl@0: Test.Printf(_L(" XON : %10d %10d\r\n"), info.iTxXon, info.iRxXon); sl@0: Test.Printf(_L(" XOFF : %10d %10d\r\n"), info.iTxXoff, info.iRxXoff); sl@0: Test.Printf(_L(" Chars : %10d %10d\r\n"), info.iTxChars, info.iRxChars); sl@0: // Test.Printf(_L(" DFC Pending : %10d %10d\r\n"), info.iTxDfcPend, info.iTxDfcPend); sl@0: // Test.Printf(_L(" DFC Run/Count : %10d %10d\r\n"), info.iRunningDfc, info.iDfcCount); sl@0: // Test.Printf(_L(" DFC Req/Do/Drain : %10d %10d %10d\r\n"), info.iDfcReqSeq, info.iDfcHandlerSeq, info.iDoDrainSeq); sl@0: } sl@0: #else sl@0: void CDevCommTestBase::Debug() sl@0: { sl@0: Test.Printf(_L("Debug Dump not available\r\n")); sl@0: } sl@0: #endif sl@0: sl@0: void CDevCommTestBase::ReadComplete(TInt /*aStatus*/) sl@0: {} sl@0: sl@0: void CDevCommTestBase::WriteComplete(TInt /*aStatus*/) sl@0: {} sl@0: sl@0: void CDevCommTestBase::TimeComplete(TInt /*aStatus*/) sl@0: {} sl@0: sl@0: void CDevCommTestBase::KeyComplete(TKeyCode /*aKey*/) sl@0: {} sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void StripeMem(TUint8 *aBuf, TInt aStartPos, TInt anEndPos, TUint aStartChar, TUint anEndChar, TInt aOffset=0) sl@0: // sl@0: // Mark a buffer with repeating byte pattern sl@0: // sl@0: { sl@0: TUint character=aStartChar+(aOffset%((anEndChar+1)-aStartChar)); sl@0: sl@0: for (TInt i=aStartPos;ianEndChar) sl@0: character=aStartChar; sl@0: } sl@0: } sl@0: sl@0: inline void StripeDes(TDes8 &aBuf, TInt aStartPos, TInt anEndPos, TUint aStartChar, TUint anEndChar, TInt aOffset=0) sl@0: { sl@0: StripeMem((TUint8 *)aBuf.Ptr(), aStartPos, anEndPos, aStartChar, anEndChar, aOffset); sl@0: } sl@0: sl@0: TBool CheckMem(TUint8 *aBuf, TInt aStartPos, TInt anEndPos, TUint aStartChar, TUint anEndChar, TInt aOffset=0) sl@0: // sl@0: // Mark a buffer with repeating byte pattern sl@0: // sl@0: { sl@0: TUint character=aStartChar+(aOffset%((anEndChar+1)-aStartChar)); sl@0: sl@0: for (TInt i=aStartPos;ianEndChar) sl@0: character=aStartChar; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: inline TBool CheckDes(TDes8 &aBuf, TInt aStartPos, TInt anEndPos, TUint aStartChar, TUint anEndChar, TInt aOffset=0) sl@0: { sl@0: return CheckMem((TUint8 *)aBuf.Ptr(), aStartPos, anEndPos, aStartChar, anEndChar, aOffset); sl@0: } sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void CommStart() sl@0: { sl@0: TInt ret; sl@0: Test.Printf(_L("Loading Drivers\r\n")); sl@0: ret = User::LoadPhysicalDevice(__COMM_PDD1); sl@0: TESTERR(ret==KErrNone || ret==KErrAlreadyExists, ret); sl@0: // ret = User::LoadPhysicalDevice(__COMM_PDD2); sl@0: // TESTERR(ret==KErrNone || ret==KErrAlreadyExists, ret); sl@0: ret = User::LoadLogicalDevice(__COMM_LDD); sl@0: TESTERR(ret==KErrNone || ret==KErrAlreadyExists, ret); sl@0: Test.Printf(_L("OK\r\n")); sl@0: } sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: class CTestRandTerm : public CDevCommTestBase sl@0: { sl@0: public: sl@0: enum TTestRandTermState { EIdle, EWaitReady, EWaitReset, EWaitIO }; sl@0: enum TTestFailType { ETestFailBoth, ETestFailRead, ETestFailWrite, ETestBadData }; sl@0: public: sl@0: static CTestRandTerm* NewL(TInt aPort); sl@0: CTestRandTerm(); sl@0: ~CTestRandTerm(); sl@0: virtual void ReadComplete(TInt aStatus); sl@0: virtual void WriteComplete(TInt aStatus); sl@0: virtual void TimeComplete(TInt aStatus); sl@0: virtual void KeyComplete(TKeyCode aKey); sl@0: void Reset(); sl@0: void Write(); sl@0: void Read(); sl@0: TBool CheckRead(); sl@0: void Halt(); sl@0: void Fail(TTestFailType aType, TInt aError); sl@0: protected: sl@0: virtual void RunL(); sl@0: public: sl@0: TTestRandTermState iState; sl@0: TInt64 iSeed; sl@0: TInt iCount; sl@0: TInt iOffset; sl@0: TInt iRetries; sl@0: TInt iPackets; sl@0: TInt iSpin; sl@0: TBool iTrace; sl@0: }; sl@0: sl@0: CTestRandTerm::CTestRandTerm() sl@0: { sl@0: } sl@0: sl@0: CTestRandTerm::~CTestRandTerm() sl@0: { sl@0: } sl@0: sl@0: CTestRandTerm* CTestRandTerm::NewL(TInt aPort) sl@0: { sl@0: CTestRandTerm* tester = new (ELeave) CTestRandTerm; sl@0: CleanupStack::PushL(tester); sl@0: tester->CreateL(1000); sl@0: User::LeaveIfError(tester->Open(aPort)); sl@0: CleanupStack::Pop(); sl@0: return tester; sl@0: } sl@0: sl@0: void CTestRandTerm::Reset() sl@0: { sl@0: Test.Printf(_L("Resetting Port\r\n")); sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iTimer->Cancel(); sl@0: LineFailOff(); sl@0: iComm.ResetBuffers(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReset; sl@0: } sl@0: sl@0: void CTestRandTerm::RunL() sl@0: { sl@0: iCount = 0; sl@0: iState = EIdle; sl@0: iSeed = 1; sl@0: Test.Printf(_L("Waiting for Port\r\n")); sl@0: ZeroTerminate(); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReady; sl@0: } sl@0: sl@0: void CTestRandTerm::ReadComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestRandTerm::ReadComplete(%d) len = %d/%d\r\n"), aStatus, iWriter->iDes.Length(), iWriter->iDes.MaxLength()); sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: Fail(ETestFailRead, aStatus); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitIO: sl@0: iRetries = 0; sl@0: iTimer->Cancel(); sl@0: if (CheckRead()) sl@0: { sl@0: iPackets++; sl@0: if (iReader->iCount==iWriter->iCount) sl@0: { sl@0: iCount += iWriter->iCount; sl@0: Test.Printf(_L("%c %6d %d\r"), KSpinner[iSpin++ & 3], iPackets, iCount); sl@0: Write(); sl@0: Read(); sl@0: } sl@0: else sl@0: { sl@0: iOffset = iReader->iCount; sl@0: Test.Printf(_L("%c\r"), KSpinner[iSpin++ & 3]); sl@0: Read(); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: Fail(ETestBadData, KErrNone); sl@0: } sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTestRandTerm::WriteComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: { sl@0: Test.Printf(_L("CTestRandTerm::WriteComplete(%d) len = %d/%d\r\n"), aStatus, iWriter->iDes.Length(), iWriter->iDes.MaxLength()); sl@0: } sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: Fail(ETestFailWrite, aStatus); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitReady: sl@0: iRetries = 0; sl@0: iTimer->Cancel(); sl@0: iState = EWaitIO; sl@0: Test.Printf(_L("Port Ready\r\n")); sl@0: LineFailOn(); sl@0: Write(); sl@0: Read(); sl@0: break; sl@0: case EWaitIO: sl@0: iRetries = 0; sl@0: if (iReader->iCount==iWriter->iCount) sl@0: { sl@0: Write(); sl@0: Read(); sl@0: } sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTestRandTerm::TimeComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestRandTerm::TimeComplete(%d)\r\n"), aStatus); sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: __DEBUGGER(); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitReset: sl@0: Test.Printf(_L("Waiting for Port\r\n")); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReady; sl@0: break; sl@0: case EWaitReady: sl@0: if (++iRetries>10) sl@0: { sl@0: Test.Printf(_L("Too many retries\r\n")); sl@0: Halt(); sl@0: } sl@0: else sl@0: { sl@0: Test.Printf(_L("%c\r"), KSpinner[iSpin++ & 3]); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: } sl@0: break; sl@0: case EWaitIO: sl@0: Fail(ETestFailBoth, KErrTimedOut); sl@0: break; sl@0: default: sl@0: Reset(); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CTestRandTerm::KeyComplete(TKeyCode aKey) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestRandTerm::KeyComplete(%d)\r\n"), aKey); sl@0: sl@0: switch ((TInt)aKey) sl@0: { sl@0: case EKeyEscape: sl@0: Halt(); sl@0: break; sl@0: case 'd': sl@0: case 'D': sl@0: Debug(); sl@0: break; sl@0: case 'q': sl@0: case 'Q': sl@0: iTrace = 0; sl@0: break; sl@0: case 'v': sl@0: case 'V': sl@0: iTrace = 1; sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CTestRandTerm::Fail(TTestFailType aType, TInt aError) sl@0: { sl@0: switch (aType) sl@0: { sl@0: case ETestFailBoth: sl@0: Test.Printf(_L("Timeout at offset %d\r\n"), iOffset); sl@0: break; sl@0: case ETestFailRead: sl@0: Test.Printf(_L("Read fail (%d) at offset %d\r\n"), aError, iOffset); sl@0: break; sl@0: case ETestFailWrite: sl@0: Test.Printf(_L("Write fail (%d) at offset %d\r\n"), aError, iOffset); sl@0: break; sl@0: case ETestBadData: sl@0: Test.Printf(_L("Data verify failure at offset %d\r\n"), iOffset); sl@0: break; sl@0: } sl@0: Debug(); sl@0: Reset(); sl@0: } sl@0: sl@0: sl@0: void CTestRandTerm::Write() sl@0: { sl@0: iOffset = 0; sl@0: iWriter->ResetCount(); sl@0: iReader->ResetCount(); sl@0: sl@0: TInt i; sl@0: TInt j = 0; sl@0: StripeDes(iWriter->iDes, 0, iBufferSize, '@', 'Z'); sl@0: while (jiDes[j+i] = '\0'; sl@0: j += i; sl@0: } sl@0: sl@0: iWriter->Start(); sl@0: } sl@0: sl@0: sl@0: void CTestRandTerm::Read() sl@0: { sl@0: iReader->Start(); sl@0: iTimer->After(5000000); sl@0: } sl@0: sl@0: sl@0: TBool CTestRandTerm::CheckRead() sl@0: { sl@0: TPtrC8 ref; sl@0: ref.Set(iWriter->iDes.Ptr()+iOffset, iReader->iDes.Length()); sl@0: return ref.Compare(iReader->iDes)==0; sl@0: } sl@0: sl@0: void CTestRandTerm::Halt() sl@0: { sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iTimer->Cancel(); sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: sl@0: class CTestSignals : public CDevCommTestBase sl@0: { sl@0: public: sl@0: enum TTestState { EAllOff, ERtsOn, EDtrOn, EAllOn, EMonitor }; sl@0: public: sl@0: static CTestSignals* NewL(TInt aPort); sl@0: CTestSignals(); sl@0: ~CTestSignals(); sl@0: virtual void KeyComplete(TKeyCode aKey); sl@0: virtual void ReadComplete(TInt aStatus); sl@0: void Halt(); sl@0: void DoSignals(TTestState aState); sl@0: protected: sl@0: virtual void RunL(); sl@0: public: sl@0: TTestState iState; sl@0: }; sl@0: sl@0: CTestSignals::CTestSignals() sl@0: { sl@0: } sl@0: sl@0: CTestSignals::~CTestSignals() sl@0: { sl@0: } sl@0: sl@0: CTestSignals* CTestSignals::NewL(TInt aPort) sl@0: { sl@0: CTestSignals* tester = new (ELeave) CTestSignals; sl@0: CleanupStack::PushL(tester); sl@0: tester->CreateL(0); sl@0: User::LeaveIfError(tester->Open(aPort)); sl@0: CleanupStack::Pop(); sl@0: return tester; sl@0: } sl@0: sl@0: void CTestSignals::RunL() sl@0: { sl@0: TCommConfig cBuf; sl@0: TCommConfigV01 &c=cBuf(); sl@0: iComm.Config(cBuf); sl@0: c.iHandshake = KConfigFreeRTS | KConfigFreeDTR; sl@0: iComm.SetConfig(cBuf); sl@0: iReader->Ready(); sl@0: } sl@0: sl@0: sl@0: void CTestSignals::Halt() sl@0: { sl@0: Test.Printf(_L(" \r")); sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: sl@0: void CTestSignals::ReadComplete(TInt /*aStatus*/) sl@0: { sl@0: DoSignals(EAllOff); sl@0: } sl@0: sl@0: void CTestSignals::KeyComplete(TKeyCode aKey) sl@0: { sl@0: switch (aKey) sl@0: { sl@0: case EKeyEscape: sl@0: Halt(); sl@0: break; sl@0: default: sl@0: switch (iState) sl@0: { sl@0: case EAllOff: sl@0: DoSignals(ERtsOn); sl@0: break; sl@0: case ERtsOn: sl@0: DoSignals(EDtrOn); sl@0: break; sl@0: case EDtrOn: sl@0: DoSignals(EAllOn); sl@0: break; sl@0: case EAllOn: sl@0: DoSignals(EAllOff); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CTestSignals::DoSignals(TTestState aState) sl@0: { sl@0: TUint set=0, clr=0; sl@0: sl@0: switch (aState) sl@0: { sl@0: case EAllOff: sl@0: set = 0; sl@0: clr = KSignalRTS | KSignalDTR; sl@0: break; sl@0: case ERtsOn: sl@0: set = KSignalRTS; sl@0: clr = KSignalDTR; sl@0: break; sl@0: case EDtrOn: sl@0: set = KSignalDTR; sl@0: clr = KSignalRTS; sl@0: break; sl@0: case EAllOn: sl@0: set = KSignalRTS | KSignalDTR; sl@0: clr = 0; sl@0: break; sl@0: default: sl@0: set = 0; sl@0: clr = 0; sl@0: } sl@0: iComm.SetSignals(set, clr); sl@0: TUint sig = iComm.Signals(); sl@0: ShowLoopSignals(set, sig); sl@0: iState = aState; sl@0: Test.Printf(_L("Press key for next state\r")); sl@0: } sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: class CTestPerf : public CDevCommTestBase sl@0: { sl@0: public: sl@0: enum TTestRandTermState { EIdle, EWaitReady, EWaitReset, EWaitIO }; sl@0: enum TTestFailType { ETestFailBoth, ETestFailRead, ETestFailWrite, ETestBadData }; sl@0: public: sl@0: static CTestPerf* NewL(TInt aPort); sl@0: CTestPerf(); sl@0: ~CTestPerf(); sl@0: virtual void ReadComplete(TInt aStatus); sl@0: virtual void WriteComplete(TInt aStatus); sl@0: virtual void TimeComplete(TInt aStatus); sl@0: virtual void KeyComplete(TKeyCode aKey); sl@0: void Reset(); sl@0: void Write(); sl@0: void Read(); sl@0: TBool CheckRead(); sl@0: void Halt(); sl@0: void Fail(TTestFailType aType, TInt aError); sl@0: protected: sl@0: virtual void RunL(); sl@0: public: sl@0: TTestRandTermState iState; sl@0: TInt64 iSeed; sl@0: TInt iCount; sl@0: TInt iOffset; sl@0: TInt iRetries; sl@0: TInt iPackets; sl@0: TInt iSpin; sl@0: TBool iTrace; sl@0: TTime iStartTime; sl@0: TInt iRate; sl@0: TInt iSpeed; sl@0: }; sl@0: sl@0: CTestPerf::CTestPerf() sl@0: { sl@0: } sl@0: sl@0: CTestPerf::~CTestPerf() sl@0: { sl@0: } sl@0: sl@0: CTestPerf* CTestPerf::NewL(TInt aPort) sl@0: { sl@0: CTestPerf* tester = new (ELeave) CTestPerf; sl@0: CleanupStack::PushL(tester); sl@0: tester->CreateL(250); sl@0: User::LeaveIfError(tester->Open(aPort)); sl@0: CleanupStack::Pop(); sl@0: StripeDes(tester->iWriter->iDes, 0, tester->iBufferSize, '@', 'Z'); sl@0: return tester; sl@0: } sl@0: sl@0: void CTestPerf::Reset() sl@0: { sl@0: Test.Printf(_L("Resetting Port\r\n")); sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iTimer->Cancel(); sl@0: LineFailOff(); sl@0: iComm.ResetBuffers(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReset; sl@0: } sl@0: sl@0: void CTestPerf::RunL() sl@0: { sl@0: iCount = 0; sl@0: iState = EIdle; sl@0: iSeed = 1; sl@0: Test.Printf(_L("Waiting for Port\r\n")); sl@0: ZeroTerminate(); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReady; sl@0: } sl@0: sl@0: void CTestPerf::ReadComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestPerf::ReadComplete(%d) len = %d/%d\r\n"), aStatus, iWriter->iDes.Length(), iWriter->iDes.MaxLength()); sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: Fail(ETestFailRead, aStatus); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitIO: sl@0: iRetries = 0; sl@0: iTimer->Cancel(); sl@0: iCount += iReader->iCount; sl@0: iPackets++; sl@0: { sl@0: TTime end; sl@0: end.UniversalTime(); sl@0: TInt64 difftime = (end.MicroSecondsFrom(iStartTime).Int64()+TInt64(500000))/TInt64(1000000); sl@0: if (difftime==0) sl@0: difftime = 1; sl@0: TInt64 cps = MAKE_TINT64(0,iCount)/difftime; sl@0: TInt rate = (I64INT(cps)*10000)/11520; sl@0: sl@0: iRate += rate; sl@0: iSpeed += I64INT(cps); sl@0: sl@0: Test.Printf(_L("%c %6d %d (%dbps=%d.%02d%%)\r"), KSpinner[iSpin++ & 3], iPackets, iCount, iSpeed/iPackets, (iRate/iPackets)/100, (iRate/iPackets)%100); sl@0: } sl@0: Read(); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTestPerf::WriteComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: { sl@0: Test.Printf(_L("CTestPerf::WriteComplete(%d) len = %d/%d\r\n"), aStatus, iWriter->iDes.Length(), iWriter->iDes.MaxLength()); sl@0: } sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: Fail(ETestFailWrite, aStatus); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitReady: sl@0: iRetries = 0; sl@0: iTimer->Cancel(); sl@0: iState = EWaitIO; sl@0: Test.Printf(_L("Port Ready\r\n")); sl@0: LineFailOn(); sl@0: iStartTime.UniversalTime();; sl@0: Write(); sl@0: Read(); sl@0: break; sl@0: case EWaitIO: sl@0: iRetries = 0; sl@0: Write(); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTestPerf::TimeComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestPerf::TimeComplete(%d)\r\n"), aStatus); sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: __DEBUGGER(); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitReset: sl@0: Test.Printf(_L("Waiting for Port\r\n")); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReady; sl@0: break; sl@0: case EWaitReady: sl@0: if (++iRetries>10) sl@0: { sl@0: Test.Printf(_L("Too many retries\r\n")); sl@0: Halt(); sl@0: } sl@0: else sl@0: { sl@0: Test.Printf(_L("%c\r"), KSpinner[iSpin++ & 3]); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: } sl@0: break; sl@0: case EWaitIO: sl@0: Fail(ETestFailBoth, KErrTimedOut); sl@0: break; sl@0: default: sl@0: Reset(); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CTestPerf::KeyComplete(TKeyCode aKey) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestPerf::KeyComplete(%d)\r\n"), aKey); sl@0: sl@0: switch ((TInt)aKey) sl@0: { sl@0: case EKeyEscape: sl@0: Halt(); sl@0: break; sl@0: case 'd': sl@0: case 'D': sl@0: Test.Printf(_L("\r\n")); sl@0: Debug(); sl@0: break; sl@0: case 'q': sl@0: case 'Q': sl@0: iTrace = 0; sl@0: break; sl@0: case 'v': sl@0: case 'V': sl@0: iTrace = 1; sl@0: break; sl@0: case 's': sl@0: case 'S': sl@0: Test.Printf(_L("\r\n")); sl@0: Test.Printf(_L("Keyboard : %08x, %d\r\n"), iKeyboard->iStatus.Int(), iKeyboard->IsActive()); sl@0: Test.Printf(_L("Timer : %08x, %d\r\n"), iTimer->iStatus.Int(), iTimer->IsActive()); sl@0: Test.Printf(_L("Reader : %08x, %d\r\n"), iReader->iStatus.Int(), iReader->IsActive()); sl@0: Test.Printf(_L("Writer : %08x, %d\r\n"), iWriter->iStatus.Int(), iWriter->IsActive()); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CTestPerf::Fail(TTestFailType aType, TInt aError) sl@0: { sl@0: switch (aType) sl@0: { sl@0: case ETestFailBoth: sl@0: Test.Printf(_L("\r\nTimeout at offset %d\r\n"), iOffset); sl@0: break; sl@0: case ETestFailRead: sl@0: Test.Printf(_L("\r\nRead fail (%d) at offset %d\r\n"), aError, iOffset); sl@0: break; sl@0: case ETestFailWrite: sl@0: Test.Printf(_L("\r\nWrite fail (%d) at offset %d\r\n"), aError, iOffset); sl@0: break; sl@0: case ETestBadData: sl@0: Test.Printf(_L("\r\nData verify failure at offset %d\r\n"), iOffset); sl@0: break; sl@0: } sl@0: Debug(); sl@0: Reset(); sl@0: } sl@0: sl@0: sl@0: void CTestPerf::Write() sl@0: { sl@0: iOffset = 0; sl@0: iWriter->ResetCount(); sl@0: iWriter->Start(); sl@0: } sl@0: sl@0: void CTestPerf::Read() sl@0: { sl@0: iReader->ResetCount(); sl@0: iReader->Start(); sl@0: iTimer->After(5000000); sl@0: } sl@0: sl@0: TBool CTestPerf::CheckRead() sl@0: { sl@0: TPtrC8 ref; sl@0: ref.Set(iWriter->iDes.Ptr()+iOffset, iReader->iDes.Length()); sl@0: return ref.Compare(iReader->iDes)==0; sl@0: } sl@0: sl@0: void CTestPerf::Halt() sl@0: { sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iTimer->Cancel(); sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: class CTestXonXoff : public CDevCommTestBase sl@0: { sl@0: public: sl@0: enum TTestRandTermState { EIdle, EWaitReady, EWaitReset, EWaitIO }; sl@0: enum TTestFailType { ETestFailBoth, ETestFailRead, ETestFailWrite, ETestBadData }; sl@0: public: sl@0: static CTestXonXoff* NewL(TInt aPort); sl@0: CTestXonXoff(); sl@0: ~CTestXonXoff(); sl@0: virtual void ReadComplete(TInt aStatus); sl@0: virtual void WriteComplete(TInt aStatus); sl@0: virtual void TimeComplete(TInt aStatus); sl@0: virtual void KeyComplete(TKeyCode aKey); sl@0: void Reset(); sl@0: void Write(); sl@0: void Read(); sl@0: TBool CheckRead(); sl@0: void Halt(); sl@0: void Fail(TTestFailType aType, TInt aError); sl@0: protected: sl@0: virtual void RunL(); sl@0: public: sl@0: TTestRandTermState iState; sl@0: TInt64 iSeed; sl@0: TInt iCount; sl@0: TInt iOffset; sl@0: TInt iRetries; sl@0: TInt iPackets; sl@0: TInt iSpin; sl@0: TBool iTrace; sl@0: TTime iStartTime; sl@0: TInt iRate; sl@0: TInt iSpeed; sl@0: }; sl@0: sl@0: CTestXonXoff::CTestXonXoff() sl@0: { sl@0: } sl@0: sl@0: CTestXonXoff::~CTestXonXoff() sl@0: { sl@0: } sl@0: sl@0: CTestXonXoff* CTestXonXoff::NewL(TInt aPort) sl@0: { sl@0: CTestXonXoff* tester = new (ELeave) CTestXonXoff; sl@0: CleanupStack::PushL(tester); sl@0: tester->CreateL(16384); sl@0: User::LeaveIfError(tester->Open(aPort)); sl@0: User::LeaveIfError(tester->SetHandshaking(EHandshakeSoftware)); sl@0: CleanupStack::Pop(); sl@0: StripeDes(tester->iWriter->iDes, 0, tester->iBufferSize, '@', 'Z'); sl@0: return tester; sl@0: } sl@0: sl@0: void CTestXonXoff::Reset() sl@0: { sl@0: Test.Printf(_L("Resetting Port\r\n")); sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iTimer->Cancel(); sl@0: LineFailOff(); sl@0: iComm.ResetBuffers(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReset; sl@0: } sl@0: sl@0: void CTestXonXoff::RunL() sl@0: { sl@0: iCount = 0; sl@0: iState = EIdle; sl@0: iSeed = 1; sl@0: Test.Printf(_L("Waiting for Port\r\n")); sl@0: ZeroTerminate(); sl@0: sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: sl@0: // iState = EWaitReady; sl@0: // WriteComplete(0); sl@0: } sl@0: sl@0: void CTestXonXoff::ReadComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestXonXoff::ReadComplete(%d) len = %d/%d (%d)\r\n"), aStatus, iReader->iDes.Length(), iReader->iDes.MaxLength(), iReader->iTotal); sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: Fail(ETestFailRead, aStatus); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitIO: sl@0: iRetries = 0; sl@0: iTimer->Cancel(); sl@0: if (!CheckDes(iReader->iDes, 0, iReader->iDes.Length(), '@', 'Z', iCount & 0x3fff)) sl@0: { sl@0: Fail(ETestBadData, aStatus); sl@0: return; sl@0: } sl@0: iCount += iReader->iCount; sl@0: iPackets++; sl@0: { sl@0: TTime end; sl@0: end.UniversalTime(); sl@0: TInt64 difftime = (end.MicroSecondsFrom(iStartTime).Int64()+TInt64(500000))/TInt64(1000000); sl@0: if (difftime==0) sl@0: difftime = 1; sl@0: TInt64 cps = MAKE_TINT64(0,iCount)/difftime; sl@0: TInt rate = (I64INT(cps)*10000)/11520; sl@0: iRate += rate; sl@0: iSpeed += I64INT(cps); sl@0: Test.Printf(_L("%c %6d %d (%dbps=%d.%02d%%)\r"), KSpinner[iSpin++ & 3], iPackets, iCount, iSpeed/iPackets, (iRate/iPackets)/100, (iRate/iPackets)%100); sl@0: } sl@0: Read(); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTestXonXoff::WriteComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: { sl@0: Test.Printf(_L("CTestXonXoff::WriteComplete(%d) len = %d/%d (%d)\r\n"), aStatus, iWriter->iDes.Length(), iWriter->iDes.MaxLength(), iWriter->iTotal); sl@0: } sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: Fail(ETestFailWrite, aStatus); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitReady: sl@0: iRetries = 0; sl@0: iTimer->Cancel(); sl@0: iState = EWaitIO; sl@0: Test.Printf(_L("Port Ready\r\n")); sl@0: LineFailOn(); sl@0: iStartTime.UniversalTime();; sl@0: Write(); sl@0: Read(); sl@0: break; sl@0: case EWaitIO: sl@0: iRetries = 0; sl@0: Write(); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTestXonXoff::TimeComplete(TInt aStatus) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestXonXoff::TimeComplete(%d)\r\n"), aStatus); sl@0: sl@0: if (aStatus!=KErrNone) sl@0: { sl@0: __DEBUGGER(); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EWaitReset: sl@0: Test.Printf(_L("Waiting for Port\r\n")); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: iState = EWaitReady; sl@0: break; sl@0: case EWaitReady: sl@0: if (++iRetries>10) sl@0: { sl@0: Test.Printf(_L("Too many retries\r\n")); sl@0: Halt(); sl@0: } sl@0: else sl@0: { sl@0: Test.Printf(_L("%c\r"), KSpinner[iSpin++ & 3]); sl@0: iWriter->Ready(); sl@0: iTimer->After(1000000); sl@0: } sl@0: break; sl@0: case EWaitIO: sl@0: Fail(ETestFailBoth, KErrTimedOut); sl@0: break; sl@0: default: sl@0: Reset(); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CTestXonXoff::KeyComplete(TKeyCode aKey) sl@0: { sl@0: if (iTrace) sl@0: Test.Printf(_L("CTestXonXoff::KeyComplete(%d)\r\n"), aKey); sl@0: sl@0: switch ((TInt)aKey) sl@0: { sl@0: case EKeyEscape: sl@0: Halt(); sl@0: break; sl@0: case 'd': sl@0: case 'D': sl@0: Test.Printf(_L("\r\n")); sl@0: Debug(); sl@0: break; sl@0: case 'q': sl@0: case 'Q': sl@0: iTrace = 0; sl@0: break; sl@0: case 'v': sl@0: case 'V': sl@0: iTrace = 1; sl@0: break; sl@0: case 's': sl@0: case 'S': sl@0: Test.Printf(_L("\r\n")); sl@0: Test.Printf(_L("Keyboard : %08x, %d\r\n"), iKeyboard->iStatus.Int(), iKeyboard->IsActive()); sl@0: Test.Printf(_L("Timer : %08x, %d\r\n"), iTimer->iStatus.Int(), iTimer->IsActive()); sl@0: Test.Printf(_L("Reader : %08x, %d\r\n"), iReader->iStatus.Int(), iReader->IsActive()); sl@0: Test.Printf(_L("Writer : %08x, %d\r\n"), iWriter->iStatus.Int(), iWriter->IsActive()); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CTestXonXoff::Fail(TTestFailType aType, TInt aError) sl@0: { sl@0: switch (aType) sl@0: { sl@0: case ETestFailBoth: sl@0: Test.Printf(_L("\r\nTimeout at offset %d\r\n"), iOffset); sl@0: break; sl@0: case ETestFailRead: sl@0: Test.Printf(_L("\r\nRead fail (%d) at offset %d\r\n"), aError, iOffset); sl@0: break; sl@0: case ETestFailWrite: sl@0: Test.Printf(_L("\r\nWrite fail (%d) at offset %d\r\n"), aError, iOffset); sl@0: break; sl@0: case ETestBadData: sl@0: Test.Printf(_L("\r\nData verify failure at offset %d\r\n"), iOffset); sl@0: break; sl@0: } sl@0: Debug(); sl@0: Reset(); sl@0: } sl@0: sl@0: sl@0: void CTestXonXoff::Write() sl@0: { sl@0: iOffset = 0; sl@0: iWriter->ResetCount(); sl@0: StripeDes(iWriter->iDes, 0, iWriter->iDes.Length(), '@', 'Z'); sl@0: iWriter->Start(); sl@0: } sl@0: sl@0: void CTestXonXoff::Read() sl@0: { sl@0: User::After(1000000); sl@0: iReader->ResetCount(); sl@0: iReader->Start(); sl@0: iTimer->After(5000000); sl@0: } sl@0: sl@0: TBool CTestXonXoff::CheckRead() sl@0: { sl@0: TPtrC8 ref; sl@0: ref.Set(iWriter->iDes.Ptr()+iOffset, iReader->iDes.Length()); sl@0: return ref.Compare(iReader->iDes)==0; sl@0: } sl@0: sl@0: void CTestXonXoff::Halt() sl@0: { sl@0: iReader->Cancel(); sl@0: iWriter->Cancel(); sl@0: iTimer->Cancel(); sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: sl@0: sl@0: //////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: TInt E32Main() sl@0: { sl@0: TInt err; sl@0: sl@0: Test.Start(_L("Comm Driver Tests")); sl@0: CommStart(); sl@0: Test.Printf(_L("Insert plug in then press a key\r\n")); sl@0: Test.Getch(); sl@0: sl@0: TEST(CTrapCleanup::New()!=NULL); sl@0: CActiveScheduler* Scheduler = new CActiveScheduler; sl@0: TEST(Scheduler!=NULL); sl@0: CActiveScheduler::Install(Scheduler); sl@0: /* sl@0: CTestSignals* testsignals = NULL; sl@0: TRAP(err, testsignals = CTestSignals::NewL(0)); sl@0: TEST(err==KErrNone); sl@0: testsignals->Start(); sl@0: Scheduler->Start(); sl@0: delete testsignals; sl@0: sl@0: CTestRandTerm* testrandterm = NULL; sl@0: TRAP(err, testrandterm = CTestRandTerm::NewL(0)); sl@0: TEST(err==KErrNone); sl@0: testrandterm->Start(); sl@0: Scheduler->Start(); sl@0: delete testrandterm; sl@0: sl@0: CTestPerf* testperf = NULL; sl@0: TRAP(err, testperf = CTestPerf::NewL(0)); sl@0: TEST(err==KErrNone); sl@0: testperf->Start(); sl@0: Scheduler->Start(); sl@0: delete testperf; sl@0: */ sl@0: sl@0: CTestXonXoff* testx = NULL; sl@0: TRAP(err, testx = CTestXonXoff::NewL(0)); sl@0: TEST(err==KErrNone); sl@0: testx->Start(); sl@0: Scheduler->Start(); sl@0: delete testx; sl@0: sl@0: /* sl@0: CTestXonXoff* testx1 = NULL; sl@0: TRAP(err, testx1 = CTestXonXoff::NewL(0)); sl@0: TEST(err==KErrNone); sl@0: testx1->Start(); sl@0: sl@0: CTestXonXoff* testx2 = NULL; sl@0: TRAP(err, testx2 = CTestXonXoff::NewL(1)); sl@0: TEST(err==KErrNone); sl@0: testx2->Start(); sl@0: sl@0: Scheduler->Start(); sl@0: sl@0: delete testx1; sl@0: delete testx2; sl@0: */ sl@0: Test.End(); sl@0: return KErrNone; sl@0: }