Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// 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)