diff -r 2473f5e227f9 -r 8b72faa1200f cbsref/telephonyrefplugins/atltsy/comms/src/commengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsref/telephonyrefplugins/atltsy/comms/src/commengine.cpp Tue Jun 22 11:02:32 2010 +0100 @@ -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