--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/device/t_sirco2.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,591 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\device\t_sirco2.cpp
+//
+//
+
+#include "t_slowir.h"
+#include <e32svr.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32hal.h>
+#include <hal.h>
+
+#if defined(__VC32__) && _MSC_VER==1100
+// Disable MSVC++ 5.0 aggressive warnings about non-expansion of inline functions.
+#pragma warning(disable : 4710) // function '...' not expanded
+#endif
+
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV.PDD")
+#define LDD_NAME _L("ECOMM.LDD")
+#else
+#define PDD_NAME _L("EUART")
+#define LDD_NAME _L("ECOMM")
+#endif
+
+#define PDD2_NAME _L("EUART")
+
+#ifdef __WINS__
+ #include <es_sock.h>
+ RSocketServ ss;
+#endif
+
+#define FIND_NAME _L("Comm.*")
+
+const TInt KUnit0=0;
+const TInt KUnit1=1;
+const TInt KUnit2=2;
+
+//LOCAL_D RTest test(_L("T_SlowIR"));
+
+TBuf8<2060> WriteBuf;
+TBuf8<2060> ReadBuf;
+TInt iTimeDelay=1000000;
+TInt iBufSz=2000;
+TBool iRWToWrite=EFalse;
+
+void ResetReadBuffer()
+ {
+ TInt i=0;
+ ReadBuf.SetLength(2060);
+ for(i=0;i<2050;i++)
+ ReadBuf[i] ='R';
+ }
+
+void ResetWriteBuffer()
+//
+// Mark a buffer with repeating byte pattern
+//
+ {
+ TUint startChar='A';
+ TUint endChar='z';
+ WriteBuf.SetLength(2060);
+
+ TUint character=startChar;
+ for (TInt i=0;i<WriteBuf.Length();i++)
+ {
+ WriteBuf[i]=(TText8)character;
+ if(++character>endChar)
+ character=startChar;
+ }
+ }
+
+TInt CActiveRW::ErrorStats()
+ { // Computes error %ge
+ if(iRxCount != 0)
+ return (iRxErrCount*200+iRxCount)/(2*iRxCount);
+ else
+ return 0;
+ }
+
+TBool CActiveRW::CompareBuffers(TInt aLen)
+ {
+ TInt i=0;
+ if(aLen !=ReadBuf.Length() || aLen !=WriteBuf.Length())
+ return EFalse;
+
+ while(i<aLen)
+ {
+ if(ReadBuf[i]!=WriteBuf[i]){
+ return EFalse;}
+ i++;
+ }
+ return ETrue;
+ }
+
+void SetUpBuffers()
+ {
+ ResetReadBuffer();
+ ResetWriteBuffer();
+ }
+
+CActiveConsole::CActiveConsole(CConsoleBase* aConsole)
+ : CActive(EPriorityNormal)
+ {
+ iConsole=aConsole;
+ iInit1 =EFalse;
+ iInit2 =EFalse;
+ }
+
+CActiveConsole* CActiveConsole::NewLC(CConsoleBase* aConsole)
+ {
+ CActiveConsole* self = new (ELeave) CActiveConsole(aConsole);
+ self->ConstructL();
+ return self;
+ }
+
+void CActiveConsole::ConstructL ()
+ {
+ TCommCaps aCapsBuf;
+ TCommCapsV01& aCaps=aCapsBuf();
+ TCommConfig aConfigBuf;
+ TCommConfigV01& aConfig=aConfigBuf();
+ iConsole->Printf(_L("\r\n"));
+ CActiveScheduler::Add(this); // Add to active scheduler
+
+ TBuf<10> pddName=PDD_NAME;
+#if defined (__MARM__)
+ const TInt KMaxPdds=10;
+ iConsole->Printf(_L("Load MARM PDDs\n\r"));
+ RDebug::Print(_L("Load MARM PDDs\n\r"));
+#else
+ const TInt KMaxPdds=0;
+ iConsole->Printf(_L("Load WINS PDD\n\r"));
+ iConsole->Printf(PDD_NAME);
+#endif
+// iConsole->Read(iStatus);
+
+ TInt i;
+ TInt r;
+ for (i=-1; i<KMaxPdds; ++i)
+ {
+ if (i==0)
+ pddName.Append(TChar('0'));
+ else if (i>0)
+ pddName[pddName.Length()-1] = (TText)('0'+i);
+ r=User::LoadPhysicalDevice(pddName);
+ if (r==KErrNone || r==KErrAlreadyExists)
+ {
+ iConsole->Printf(_L("PDD %S loaded\n"),&pddName);
+ RDebug::Print(_L("PDD %S loaded\n"),&pddName);
+ }
+ }
+
+ RDebug::Print(_L("Load MARM LDD\n\r"));
+ RDebug::Print(LDD_NAME);
+ iConsole->Printf(_L("Load LDD\n\r"));
+ iConsole->Printf(LDD_NAME);
+ r=User::LoadLogicalDevice(LDD_NAME);
+ RDebug::Print(_L("\n\rReturn %d\n\r"),r);
+ iConsole->Printf(_L("\n\rReturn %d\n\r"),r);
+// test(r==KErrNone || r==KErrAlreadyExists);
+
+ RDebug::Print(_L("\n\rFind PDDs\n\r"));
+ iConsole->Printf(_L("Find PDDs\n"));
+ TFindPhysicalDevice findPDD(FIND_NAME);
+ TFullName findResult;
+ TInt res=findPDD.Next(findResult);
+ while (res==KErrNone)
+ {
+ RDebug::Print(_L("Found Driver: %S\n\r"),&findResult);
+ iConsole->Printf(_L("Found Driver: %S\n\r"),&findResult);
+ res=findPDD.Next(findResult);
+ }
+
+ iConsole->Printf(_L("Found drivers\n\r"));
+
+ iPort=new RCommDev;
+// test(iPort!=NULL);
+
+ SetUpBuffers();
+
+ TInt muid=0;
+ TInt ret=HAL::Get(HAL::EMachineUid, muid);
+ if (ret!=KErrNone)
+ iConsole->Printf(_L("Error %d reading MachineUid\r\n"),ret);
+ if(muid==HAL::EMachineUid_Integrator)
+ iConsole->Printf(_L("Platform is Integrator\r\n"));
+
+ if(muid==HAL::EMachineUid_Integrator) ret=iPort->Open(KUnit2); // unit =2 for Integrator
+ else ret=iPort->Open(KUnit1); // unit == 1 for brutus
+ if (ret!=KErrNone)
+ iConsole->Printf(_L("Error %d on opening Slow ir port\r\n"),ret);
+ else
+ iConsole->Printf(_L("Successfully opened Slow ir port\r\n"));
+
+ iPort->Caps(aCapsBuf);
+
+ if (ret!=KErrNone)
+ iConsole->Printf(_L("Error %d on getting caps\r\n"),ret);
+ else
+ iConsole->Printf(_L("Sir Caps: %d\r\n"),aCaps.iRate);
+
+ iPort->Config(aConfigBuf);
+ if (ret!=KErrNone)
+ iConsole->Printf(_L("Error %d getting config\r\n"),ret);
+ else
+ iConsole->Printf(_L("IR port config read\r\n"));
+
+ iConsole->Printf(_L("****Choose Rate*****\r\n"));
+ iConsole->Printf(_L("press '1' for 9600\r\n"));
+ iConsole->Printf(_L("press '2' for 19200\r\n"));
+ iConsole->Printf(_L("press '3' for 38400\r\n"));
+ iConsole->Printf(_L("press '4' for 57600\r\n"));
+ iConsole->Printf(_L("press '5' for 115200\r\n"));
+
+ TRequestStatus key;
+ iConsole->Read(key);
+ User::WaitForRequest(key);
+ TChar pressedkey = TChar(iConsole->KeyCode());
+
+ switch(pressedkey)
+ {
+ case '1':
+ aConfig.iRate=EBps9600;
+ break;
+ case '2':
+ aConfig.iRate=EBps19200;
+ break;
+ case '3':
+ aConfig.iRate=EBps38400;
+ break;
+ case '4':
+ aConfig.iRate=EBps57600;
+ break;
+ case '5':
+ aConfig.iRate=EBps115200;
+ break;
+ default:
+ aConfig.iRate=EBps115200;
+ break;
+ }
+
+ aConfig.iHandshake=0;
+ aConfig.iSIREnable=ESIREnable;
+ aConfig.iParity=EParityNone;
+ aConfig.iDataBits=EData8;
+ aConfig.iStopBits=EStop1;
+
+ ret=iPort->SetConfig(aConfigBuf);
+
+ if (ret!=KErrNone)
+ iConsole->Printf(_L("Error %d setting config\r\n"),ret);
+ else
+ iConsole->Printf(_L("Have configured port\n"));
+
+
+ iRW=CActiveRW::NewL(iConsole,iPort);
+
+
+ if(iRW)
+ iConsole->Printf(_L("Have created writer\r\n"));
+ else
+ iConsole->Printf(_L("Failed to create writer\r\n"));
+ }
+
+CActiveConsole::~CActiveConsole()
+ {
+ // Make sure we're cancelled
+ Cancel();
+
+ if(iRW)
+ delete iRW;
+
+ iPort->Close();
+ }
+
+void CActiveConsole::DoCancel()
+ {
+ iConsole->ReadCancel();
+ }
+
+void CActiveConsole::RunL()
+ {
+ ProcessKeyPressL(TChar(iConsole->KeyCode()));
+// iConsole->Printf(_L("CActiveConsole - Completed with code %d\r\n\r\n"), iStatus.Int ());
+ }
+
+void CActiveConsole::RequestCharacter()
+ {
+ if(!iInit1)
+ {
+ Options1();
+ return;
+ }
+ if(!iInit2)
+ {
+ Options2();
+ return;
+ }
+ // A request is issued to the CConsoleBase to accept a
+ // character from the keyboard.
+ iConsole->Printf(_L("*********************************\r\n"));
+ iConsole->Printf(_L("press Escape to quit\r\n"));
+ iConsole->Printf(_L("press 'r' to start as reader\r\n"));
+ iConsole->Printf(_L("press 'w' to start as writer\r\n"));
+ iConsole->Printf(_L("press 's' stop \r\n"));
+
+ iConsole->Read(iStatus);
+ SetActive();
+ }
+
+void CActiveConsole::Options1()
+ {
+ iConsole->Printf(_L("*****Choose Delay*****\r\n"));
+ iConsole->Printf(_L("press '1' 1.00 sec delay\r\n"));
+ iConsole->Printf(_L("press '2' 0.10 sec delay\r\n"));
+ iConsole->Printf(_L("press '3' 0.01 sec delay\r\n"));
+ iConsole->Printf(_L("press '4' 0.00 sec delay\r\n"));
+ iConsole->Read(iStatus);
+ SetActive();
+ }
+
+void CActiveConsole::Options2()
+ {
+ iConsole->Printf(_L("****Choose Buf Sz*****\r\n"));
+ iConsole->Printf(_L("press '1' 1 byte \r\n"));
+ iConsole->Printf(_L("press '2' 4 bytes\r\n"));
+ iConsole->Printf(_L("press '3' 2000 bytes\r\n"));
+ iConsole->Printf(_L("press '4' 2051 bytes\r\n"));
+ iConsole->Read(iStatus);
+ SetActive();
+ }
+
+void CActiveConsole::ProcessKeyPressL(TChar aChar)
+ {
+ if (aChar == EKeyEscape)
+ {
+ CActiveScheduler::Stop();
+ return;
+ }
+
+ if(!iInit1)
+ {
+ switch(aChar)
+ {
+ case '1'://1 sec
+ iTimeDelay=1000000;
+ break;
+ case '2'://0.1 sec
+ iTimeDelay=100000;
+ break;
+ case '3'://0.01 sec
+ iTimeDelay=10000;
+ break;
+ case '4'://0 sec
+ iTimeDelay=0;
+ break;
+ default:
+ iTimeDelay=1000000;
+ break;
+ }
+ iConsole->Printf(_L("Time Delay: %d\r\n"),iTimeDelay);
+ iInit1=ETrue;
+ RequestCharacter();
+ return;
+ }
+ if(!iInit2)
+ {
+ switch(aChar)
+ {
+ case '1':
+ iBufSz=1;
+ break;
+ case '2':
+ iBufSz=4;
+ break;
+ case '3':
+ iBufSz=2000;
+ break;
+ case '4':
+ iBufSz=2051;
+ break;
+ default:
+ iBufSz=2000;
+ break;
+ }
+ // check that we have enough space
+ if(iBufSz>iPort->ReceiveBufferLength())
+ iPort->SetReceiveBufferLength(iBufSz);
+ // if it won't do it, then settle for what it is by default
+ if(iBufSz>iPort->ReceiveBufferLength())
+ iBufSz=iPort->ReceiveBufferLength();
+
+ iConsole->Printf(_L("Buffer size: %d\r\n"),iBufSz);
+ iInit2=ETrue;
+ RequestCharacter();
+ return;
+ }
+
+ switch (aChar)
+ {
+ case 'r'://start reader
+ case 'R'://start reader
+ iRW->Start(EFalse);
+ break;
+ case 'w'://start writer
+ case 'W'://start writer
+ iRW->Start(ETrue);
+ break;
+ case 's'://stop reader
+ case 'S'://stop reader
+ iRW->Stop();
+ break;
+ default:
+ iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
+ break;
+ }
+ RequestCharacter ();
+ return;
+ }
+
+
+
+//
+// class CActiveRW
+//
+
+CActiveRW::CActiveRW(CConsoleBase* aConsole,RCommDev* aPort)
+ : CActive (EPriorityNormal)
+ {
+ iConsole=aConsole;
+ iPort=aPort;
+ iLength=0;
+ iUnrecovered=0;
+ iRxCount=0;
+ iRxErrCount=0;
+ }
+
+CActiveRW* CActiveRW::NewL(CConsoleBase* aConsole,RCommDev* aPort)
+ {
+ CActiveRW* self = new (ELeave) CActiveRW(aConsole,aPort);
+
+ CleanupStack::PushL (self);
+ self->ConstructL();
+ CActiveScheduler::Add (self);
+ CleanupStack::Pop ();
+ return (self);
+ }
+
+void CActiveRW::ConstructL()
+ {
+ }
+
+CActiveRW::~CActiveRW()
+ {
+ Cancel();
+ }
+
+void CActiveRW::RunL ()
+ {
+
+ TInt i=0;
+ if(iNextXfer==EWriteXfer)
+ iRxCount++;
+
+ if (iStatus != KErrNone)
+ {
+ if(iNextXfer==EWriteXfer)
+ {
+ iRxErrCount++;
+ iConsole->Printf(_L("Error %d on reading, error = %d%%\r\n"),iStatus.Int(),ErrorStats());
+ iPort->ResetBuffers();
+ iNextXfer=EDiscardXfer;
+
+ }
+ else
+ {
+ iConsole->Printf(_L("Error %d on writing\r\n"),iStatus.Int());
+ iConsole->Printf(_L("Received %d characters\r\n"),iPort->QueryReceiveBuffer());
+ }
+ }
+ //return;
+
+ if(iTimeDelay)
+ User::After(iTimeDelay);
+
+ if(iNextXfer==EReadXfer)
+ {
+// iPort->ResetBuffers();
+ ResetReadBuffer();
+ ReadBuf.SetLength(iBufSz);
+ iConsole->Printf(_L("Reading(%d)"),ReadBuf.Length());
+ iPort->Read(iStatus, ReadBuf, ReadBuf.Length());
+ iNextXfer=EWriteXfer;
+ }
+ else // EWriteXfer || EDiagXfer || EDiscardXfer
+ {
+ if(iNextXfer==EWriteXfer)
+ {
+ if(!CompareBuffers(iBufSz))
+ {
+ iConsole->Printf(_L("\n***** Buffers don't match *****\n"));
+ for (i=0;i<ReadBuf.Length();i++)
+ {
+ iConsole->Printf(_L("WriteBuf[%d] = %02x, ReadBuf[%d] = %02x\n"),i,WriteBuf[i],i,ReadBuf[i]);
+ }
+
+ iUnrecovered=iPort->QueryReceiveBuffer();
+ iConsole->Printf(_L("Unrecovered %d characters\r\n"),iUnrecovered);
+ if(iUnrecovered)
+ {
+ ReadBuf.SetLength(Max(iBufSz,iUnrecovered));
+ iNextXfer=EDiagXfer;
+ iConsole->Printf(_L("\n***** Doing Diagnostic read *****\n"));
+ iPort->Read(iStatus, ReadBuf, iUnrecovered);
+ SetActive();
+ return;
+ }
+ }
+ else
+ {
+ iConsole->Printf(_L("ok\n"));
+ }
+ }
+ else if(iNextXfer==EDiagXfer)//EDiagXfer
+ {
+ iConsole->Printf(_L("\n***** Diagnostic dump %d *****\n"),iUnrecovered);
+
+ for (i=0;i<iUnrecovered;i++)
+ {
+ iConsole->Printf(_L("ReadBuf[%d] = %02x\n"),i,ReadBuf[i]);
+ }
+ }
+ WriteBuf.SetLength(iBufSz);
+ iConsole->Printf(_L("\nWriting(%d), "),WriteBuf.Length());
+ iPort->Write(iStatus, WriteBuf, WriteBuf.Length());
+ iNextXfer=EReadXfer;
+
+ }
+ iUnrecovered=0;
+ SetActive();
+ }
+
+void CActiveRW::Start(TBool StartWriting)
+ {
+ iPort->ResetBuffers();
+ if(IsActive())
+ return;
+ if(StartWriting)
+ {
+// iConsole->Printf(_L("Starting with write.%d....\r\n"),iBufSz);
+ WriteBuf.SetLength(iBufSz);
+ iPort->Write(iStatus, WriteBuf, WriteBuf.Length());
+ iNextXfer=EReadXfer;
+ }
+ else
+ {
+ ReadBuf.SetLength(iBufSz);
+ iPort->Read(iStatus, ReadBuf, ReadBuf.Length());
+// iConsole->Printf(_L("Starting with read.%d....\r\n"),ReadBuf.Length());
+ iNextXfer=EWriteXfer;
+ }
+ SetActive();
+ }
+
+void CActiveRW::Stop()
+ {
+ iConsole->Printf(_L("Stopping.....\r\n"));
+ iConsole->Printf(_L("Unrecovered %d characters\r\n"),iPort->QueryReceiveBuffer());
+ Cancel();
+ }
+
+void CActiveRW::DoCancel()
+ {
+ iPort->WriteCancel();
+ iPort->ReadCancel();
+ }
+
+#pragma warning (default:4710)