plugins/consoles/vt100cons/src/vtc_busdevcons.cpp
changeset 0 7f656887cf89
child 27 17e35ffe449b
--- /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 <d32comm.h>
+#include <fshell/vtc_base.h>
+#include <fshell/common.mmh>
+
+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();
+	}