cbsref/telephonyrefplugins/atltsy/comms/src/commengine.cpp
changeset 49 f50f4094acd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/comms/src/commengine.cpp	Tue Jul 06 15:36:38 2010 +0300
@@ -0,0 +1,581 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// @file commengine.cpp
+// This contains CCommEngine which manage access to serial port.
+// 
+
+// user include
+#include "globalphonemanager.h"
+#include "commengine.h"
+#include "mslogger.h"
+#include "commreader.h"
+#include "commwriter.h"
+#include "mcommobserver.h"
+#include "stringparser.h"
+
+// const define
+const TInt KLtsyOneSecondPause = 1000000;
+
+// ---------------------------------------------------------------------------
+// CCommEngine::NewL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CCommEngine* CCommEngine::NewL(TInt aBufferSize, 
+					           TInt aReadPriority, 
+					           TInt aWritePriority, 
+					           TPortAccess& aPortAccess)
+	{
+	CCommEngine *self = CCommEngine::NewLC(aBufferSize, 
+										   aReadPriority, 
+										   aWritePriority, 
+										   aPortAccess);
+	CleanupStack::Pop(self);
+	
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::NewLC
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CCommEngine* CCommEngine::NewLC(TInt aBufferSize, 
+							    TInt aReadPriority, 
+							    TInt aWritePriority, 
+							    TPortAccess& aPortAccess)
+	{
+	CCommEngine* self = new (ELeave) CCommEngine(aPortAccess);
+	CleanupStack::PushL(self);
+	
+	self->ConstructL(aBufferSize, aReadPriority, aWritePriority);
+	
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::~CCommEngine
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CCommEngine::~CCommEngine()
+	{
+    delete iCommReader;
+	delete iCommWriter;
+	delete iStringParse;
+	delete iCallbackTimer;
+	iCommPort.Close();
+	iCommServer.Close();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CCommEngine
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CCommEngine::CCommEngine(TPortAccess& aPortAccess) 
+						:iPortAccess(aPortAccess)
+	{
+	iCommReader = NULL;
+	iCommWriter = NULL;
+	iEngineObserver = NULL;
+	iStringParse = NULL;
+	iCommCancel = EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::ConstructL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::ConstructL(TInt aBufferSize, TInt aReadPriority, TInt aWritePriority)
+	{
+	iCommReader = new (ELeave) CCommReader(this, aReadPriority);
+	iCommWriter = new (ELeave) CCommWriter(this, aWritePriority);	
+	iStringParse = CStringParser::NewL(aBufferSize);
+	iCallbackTimer = CCallbackTimer::NewL(*this);
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::ConfigurePort
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TInt CCommEngine::ConfigurePort(TCommConfig aConfiguration)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::ConfigurePort()"));
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		TInt ret;
+		TCommConfig cbuf;
+		TCommConfigV01 &cfg = cbuf();
+		
+		// Get the Configuration from current serial com port
+		iCommPort.Config(cbuf);
+	    
+		// set the configuration according to passed config data
+		TCommConfigV01 &newCfg = aConfiguration();
+		cfg.iRate = newCfg.iRate;
+		cfg.iDataBits = newCfg.iDataBits;
+		cfg.iStopBits = newCfg.iStopBits;
+		cfg.iParity = newCfg.iParity;
+		cfg.iHandshake = newCfg.iHandshake;
+		
+		// Set the Configuration
+		ret = iCommPort.SetConfig(cbuf);
+		if(ret != KErrNone)
+			{
+			LOGTEXT2(_L8("[Ltsy] CCommEngine:\tError %d configuring port"),ret);
+			return ret;
+			}
+		}
+	return KErrNone;	
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::Disconnect
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::Disconnect()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::Disconnect()"));
+	
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		TCommConfig cbuf;
+		TCommConfigV01 &cfg = cbuf();
+		iCommPort.Config(cbuf);
+		cfg.iHandshake = KConfigFreeRTS	| KConfigFreeDTR;
+		TInt ret = iCommPort.SetConfig(cbuf);
+		if (ret == KErrNone)
+			{
+			iCommPort.SetSignalsToSpace(KSignalRTS | KSignalDTR);
+			}
+		}
+	
+	CommClose();
+	
+	iPortAccess = EPortAccessDenied;	
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::Read
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::Read()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::Read()"));
+	iCommCancel = EFalse;
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		CommReadOneOrMore();
+		}
+	else
+		{
+		LOGTEXT(_L8("[Ltsy] Port Not Allow Access"));
+		}	
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::DropDtr
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::DropDtr()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::DropDtr()"));
+	
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("[Ltsy] CCommEngine::DropDtr Dropping DTR"));
+		
+		iCommPort.SetSignals(0,KSignalDTR);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::RaiseDTR
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::RaiseDTR()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::RaiseDTR()"));
+	
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("[Ltsy] CCommEngine::RaiseDTR Raising DTR"));
+		
+		iCommPort.SetSignals(KSignalDTR,0);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::DropRTS
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::DropRTS()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::DropRTS()"));
+	
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("[Ltsy] Dropping RTS"));
+		
+		iCommPort.SetSignals(0,KSignalRTS);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::RaiseRTS
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::RaiseRTS()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::RaiseRTS()"));
+	
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("[Ltsy] Raising RTS"));
+		
+		iCommPort.SetSignals(KSignalRTS,0);
+		}
+	}
+// ---------------------------------------------------------------------------
+// CCommEngine::ResetBuffers
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::ResetBuffers()
+	{
+	iCommPort.ResetBuffers();
+	}
+// ---------------------------------------------------------------------------
+// CCommEngine::Signals
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TUint CCommEngine::Signals()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::Signals()"));
+	
+	return iCommPort.Signals();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::ResetReadAndWriteBuffers
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::ResetReadAndWriteBuffers()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::ResetReadAndWriteBuffers()"));
+	
+	iCommPort.ResetBuffers();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::GetSizeOfRxBuffer
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TInt CCommEngine::GetSizeOfRxBuffer()
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::GetSizeOfRxBuffer()"));
+	
+	return iCommPort.QueryReceiveBuffer();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::GetPortShutdownTimeout
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TInt CCommEngine::GetPortShutdownTimeout()
+	{
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		TCommConfig2 cbuf;
+		TCommConfigV02& cfg = cbuf();
+		// Get the Configuration
+		iCommPort.Config(cbuf);				
+
+		return (cfg.iTxShutdownTimeout);
+		}
+	else
+		{
+		return (0);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::SetPortShutdownTimeout
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TInt CCommEngine::SetPortShutdownTimeout(TInt aTimeout)
+	{
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		TCommConfig2 cbuf;
+		TCommConfigV02 &cfg = cbuf();
+		
+		//Get the Configuration
+		iCommPort.Config(cbuf);
+	
+		//Set the Configuration
+		cfg.iTxShutdownTimeout = aTimeout;
+		return (iCommPort.SetConfig(cbuf));
+		}
+	else
+		{
+		return KErrAccessDenied;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommOpen
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+TInt CCommEngine::CommOpen(const TDesC& aDll, const TDesC& aName, TCommAccess aMode)
+	{
+	TInt err;
+	if (err = iCommServer.Connect(), err!=KErrNone)
+		return err;
+		
+	// load serial comm module
+	if (aDll.Length()>0)
+		{
+		if (err = iCommServer.LoadCommModule(aDll), err!=KErrNone)
+			{
+			iCommServer.Close();
+			return err;
+			}
+		}
+	
+	// start to open the serial com with ECommShared model
+	if (aMode==ECommShared)
+		{
+		if (err = iCommPort.Open(iCommServer, aName, aMode), err!=KErrNone)
+			{
+			iCommServer.Close();
+			return err;
+			}
+		}
+		
+	return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommClose
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommClose()
+	{
+	iCommReader->Cancel();
+	iCommWriter->Cancel();
+	iCommPort.Close();
+	iCommServer.Close();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommWrite
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommWrite(const TDesC8& aDes)
+	{
+    LOGTEXT(_L8("[Ltsy] Starting CCommEngine::CommWrite()"));
+    LOGTEXTREL2(_L8("Tx:\t%S"),&aDes);
+    
+	iCommPort.Write(iCommWriter->StatusRef(), aDes);
+	iCommWriter->Activate();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommRead
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommRead()
+	{
+	iCommPort.Read(iCommReader->StatusRef(), iRxBuf, iRxBuf.Length());
+	iCommReader->Activate();
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommReadOneOrMore
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommReadOneOrMore()
+	{
+	if(!iCommCancel)
+		{
+		iCommPort.ReadOneOrMore(iCommReader->StatusRef(), iRxBuf);
+		iCommReader->Activate();
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommCancel
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommCancel()
+	{
+	iCommCancel = ETrue;
+	if(iCallbackTimer->IsActive())
+	    {
+		iCallbackTimer->Cancel();
+		}
+		
+	if (NULL != iCommWriter)
+		{
+		iCommWriter->Cancel();
+		}
+	
+	if (NULL != iCommReader)
+		{
+		iCommReader->Cancel();
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommWriteCancel
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommWriteCancel()
+	{
+	if(iCallbackTimer->IsActive())
+	    {
+		iCallbackTimer->Cancel();
+		}
+		
+	if (NULL != iCommWriter)
+		{
+		iCommWriter->Cancel();
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommReadCancel
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommReadCancel()
+	{
+	if(iCallbackTimer->IsActive())
+	    {
+		iCallbackTimer->Cancel();
+		}
+		
+	if (NULL != iCommReader)
+		{
+		iCommReader->Cancel();
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommReadComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommReadComplete(TInt aStatus)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::CommReadComplete()"));
+	LOGTEXT2(_L8("[Ltsy] aStatus = %d"), aStatus);
+	LOGTEXT2(_L8("Received %d"),iRxBuf.Length());
+	LOGTEXTREL2(_L8("Rx:\t%S"),&iRxBuf);
+		
+	if (KErrNone == aStatus)
+		{
+		if (NULL != iStringParse)
+			{
+			iStringParse->ProcessReadString(iRxBuf);
+			}
+			
+		CommReadOneOrMore();	
+		}
+	else
+		{
+		if (NULL != iEngineObserver)
+			{
+			iEngineObserver->ReadOrWriteComplete(EReadCompletion, aStatus);
+			}
+		}
+	LOGTEXT(_L8("[Ltsy] End CCommEngine::CommReadComplete()"));
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::CommWriteComplete
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::CommWriteComplete(TInt aStatus)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CCommEngine::CommWriteComplete()"));
+	LOGTEXT2(_L8("[Ltsy] aStatus = %d"), aStatus);
+	if(iCallbackTimer->IsActive())
+	    {
+		iCallbackTimer->Cancel();
+		}
+		
+	if (NULL != iEngineObserver)
+		{
+		iEngineObserver->ReadOrWriteComplete(EWriteCompletion, aStatus);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::GetStringParse
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CStringParser* CCommEngine::GetStringParse() const
+	{
+	return iStringParse;
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::SetCommReadLineNotify
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::SetCommReadLineNotify(MCommReadLineNotifier *aReadLineNotify)
+	{
+	iStringParse->SetReadLineNotify(aReadLineNotify);
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::SetCommEngineObserver
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::SetCommEngineObserver(MCommEngineObserver *aEngineObserver)
+	{
+	iEngineObserver = aEngineObserver;
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::TimerRun
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::TimerRun(TInt aError)
+    {
+	if(aError == KErrNone)
+	    {
+		iEngineObserver->ReadOrWriteComplete(ETimeoutCompletion, KErrTimedOut);
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::StartTimer
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::StartTimer(TInt aSeconds)
+    {
+    if (iCallbackTimer->IsActive())
+    	{
+    	iCallbackTimer->Cancel();
+    	}
+	iCallbackTimer->After(aSeconds*KLtsyOneSecondPause);
+	}
+
+// ---------------------------------------------------------------------------
+// CCommEngine::StopTimer
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CCommEngine::StopTimer()	
+    {
+	iCallbackTimer->Cancel();
+	}
+
+// End of file