diff -r 000000000000 -r 7f656887cf89 plugins/consoles/vt100cons/src/vtc_busdevcons.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/consoles/vt100cons/src/vtc_busdevcons.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,212 @@ +// vtc_busdevcons.cpp +// +// Copyright (c) 2009 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +#include +#include +#include + +class TPortConfig + { +public: + TPortConfig(); + + TPtrC iPdd; + TPtrC iLdd; + TInt iPort; + TBps iRate; + }; + + +NONSHARABLE_CLASS(CVtcBusDevCommConsole) : public CVtcConsoleBase + { +public: + CVtcBusDevCommConsole(); + ~CVtcBusDevCommConsole(); + +protected: // From CVtcConsoleBase. + virtual void ConstructL(const TDesC& aTitle); +private: // From MConsoleOutput. + virtual TInt Output(const TDesC8& aDes); +private: // From MConsoleInput. + virtual void Input(TDes8& aDes, TRequestStatus& aStatus); + virtual void CancelInput(TRequestStatus& aStatus); +private: + TInt ReadConfig(const TDesC& aConfigDes, TPortConfig& aConfig); +private: + RBusDevComm iComm; + }; + +extern "C" EXPORT_C TAny* NewConsole() + { + return new CVtcBusDevCommConsole; + } + +CVtcBusDevCommConsole::CVtcBusDevCommConsole() + { + } + +CVtcBusDevCommConsole::~CVtcBusDevCommConsole() + { + iComm.Close(); + } + +#ifdef __WINS__ +_LIT(KPdd, "ecdrv"); +#else +_LIT(KPdd, "euart"); +#endif +_LIT(KLdd, "ecomm"); + +TPortConfig::TPortConfig() + :iPdd(KNullDesC), iLdd(KNullDesC), iPort(-1), iRate(EBpsAutobaud) + { + } + +TInt CVtcBusDevCommConsole::ReadConfig(const TDesC& aConfigDes, TPortConfig& aConfig) + { + _LIT(KKeywordPdd, "pdd"); + _LIT(KKeywordLdd, "ldd"); + _LIT(KKeywordPort, "port"); + _LIT(KKeywordRate, "rate"); + + TBool keywordFound(EFalse); + TLex lex(aConfigDes); + while (!lex.Eos()) + { + TPtrC keyword; + TPtrC value; + TInt err = ReadKeywordValuePair(lex, keyword, value); + if (err != KErrNone) + { + break; + } + + if (keyword == KKeywordPdd) + { + aConfig.iPdd.Set(value); + keywordFound = ETrue; + } + else if (keyword == KKeywordLdd) + { + aConfig.iLdd.Set(value); + keywordFound = ETrue; + } + else if (keyword == KKeywordPort) + { + TLex lex(value); + User::LeaveIfError(lex.Val(aConfig.iPort)); + keywordFound = ETrue; + } + else if (keyword == KKeywordRate) + { + TLex lex(value); + TUint rate; + if (lex.Val(rate) == KErrNone) + { + switch (rate) + { + case 115200: + aConfig.iRate = EBps115200; break; + case 9600: + aConfig.iRate = EBps9600; break; + case 19200: + aConfig.iRate = EBps19200; break; + case 57600: + aConfig.iRate = EBps57600; break; + default: + break; + } + } + keywordFound = ETrue; + } + } + + if (!keywordFound) + { + // Treat unrecognised string as a port number (to preserve backwards compatibility with earlier releases). + TLex lex(aConfigDes); + lex.Val(aConfig.iPort); + } + + return KErrNone; + } + +void CVtcBusDevCommConsole::ConstructL(const TDesC& aTitle) + { + TPortConfig portConfig; + User::LeaveIfError(ReadConfig(aTitle, portConfig)); + if (portConfig.iPort < 0) User::Leave(KErrArgument); + + TPtrC pdd(portConfig.iPdd); + if (pdd.Length() == 0) pdd.Set(KPdd()); + TPtrC ldd(portConfig.iLdd); + if (ldd.Length() == 0) ldd.Set(KLdd()); + + TInt err = User::LoadPhysicalDevice(pdd); + Message(EDebug, _L("Loading %S returned %d"), &pdd, err); + if (err != KErrAlreadyExists && portConfig.iPdd.Length()) User::LeaveIfError(err); // Don't error if we failed to load the default PDD + + err = User::LoadLogicalDevice(ldd); + Message(EDebug, _L("Loading %S returned %d"), &ldd, err); + if (err != KErrAlreadyExists && portConfig.iLdd.Length()) User::LeaveIfError(err); // Don't error if we failed to load the default LDD + err = iComm.Open(portConfig.iPort); + Message(EDebug, _L("Opening port %d returned %d"), portConfig.iPort, err); + User::LeaveIfError(err); + + if (portConfig.iRate != EBpsAutobaud) + { + TCommConfig cfg; + cfg().iRate = portConfig.iRate; + cfg().iDataBits = EData8; + cfg().iStopBits = EStop1; + cfg().iParity = EParityNone; + cfg().iHandshake = 0; + cfg().iParityError = KConfigParityErrorFail; + cfg().iFifo = EFifoEnable; + cfg().iSpecialRate = 0; + cfg().iTerminatorCount = 0; + cfg().iSIREnable = ESIRDisable; + err = iComm.SetConfig(cfg); + Message(EDebug, _L("RBusDevComm::SetConfig returned %d"), err); + User::LeaveIfError(err); + } + iComm.ResetBuffers(); + CVtcConsoleBase::ConstructL(aTitle); + } + +TInt CVtcBusDevCommConsole::Output(const TDesC8& aDes) + { + TRequestStatus stat; +#ifdef FSHELL_PLATFORM_OPP +retry: +#endif + iComm.Write(stat, aDes); + User::WaitForRequest(stat); +#ifdef FSHELL_PLATFORM_OPP + // Temporary OPP specific change - the drivers for the mid-sized prototype currently complete requests with KErrAbort just before power management sends the device to sleep. + if (stat.Int() == KErrAbort) + { + goto retry; + } +#endif + return stat.Int(); + } + +void CVtcBusDevCommConsole::Input(TDes8& aDes, TRequestStatus& aStatus) + { + iComm.ReadOneOrMore(aStatus, aDes); + } + +void CVtcBusDevCommConsole::CancelInput(TRequestStatus&) + { + iComm.ReadCancel(); + }