diff -r 000000000000 -r c6b0df440bee dbgagents/trkagent/engine/TrkDbgTrcCommPort.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbgagents/trkagent/engine/TrkDbgTrcCommPort.cpp Tue Mar 02 10:33:16 2010 +0530 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + +#include +#include + +#include "TrkConnData.h" +#include "TrkDbgTrcCommPort.h" +#include "TrkFramingLayer.h" + +_LIT(KSendErrMsg, "Failed to write to the DbgTrc channel"); + +// +// Default comm values +// + + +// +// Static helper functions +// + +// +// +// CTrkDbgTrcCommPort implementation +// +// + +// +// CTrkDbgTrcCommPort constructor +// +CTrkDbgTrcCommPort::CTrkDbgTrcCommPort() + : CTrkCommPort(CActive::EPriorityStandard), + iConnected(EFalse), + iListening(EFalse), + iLineNumber(0) +{ +} + +// +// CTrkDbgTrcCommPort::ConstructL +// +void CTrkDbgTrcCommPort::ConstructL(TTrkConnData aTrkConnData, TDes& aErrorMessage) +{ + iUnitNumber = aTrkConnData.iPortNumber; +} + +// +// CTrkDbgTrcCommPort destructor +// +CTrkDbgTrcCommPort::~CTrkDbgTrcCommPort() +{ + +} + +// +// CTrkDbgTrcCommPort::NewL +// +CTrkDbgTrcCommPort* CTrkDbgTrcCommPort::NewL(TTrkConnData aTrkConnData, TDes& aErrorMessage) +{ + CTrkDbgTrcCommPort* self = new(ELeave) CTrkDbgTrcCommPort; + CleanupStack::PushL(self); + self->ConstructL(aTrkConnData, aErrorMessage); + CleanupStack::Pop(self); + return self; +} + +// +// CTrkDbgTrcCommPort::OpenPortL +// +// Open the serial type communications port +// +void CTrkDbgTrcCommPort::OpenPortL() +{ + TInt error = KErrNone; + + error = iDbgTrcPort.Connect(); + if ((KErrAlreadyExists != error) && (KErrNone != error)) + ReportAndLeaveIfErrorL(error, _L("Failed to connect to the debug trace comms server.")); + + TAcmConfig config; + error = iDbgTrcPort.GetAcmConfig(config); + + if (KErrNone != error) + ReportAndLeaveIfErrorL(error, _L("Failed to get the port configuration.")); + + TAcmConfigV01 config1(*(TAcmConfigV01*)config.Ptr()); + config1.iPortNumber = iUnitNumber; + + error = iDbgTrcPort.SetAcmConfig(config); + if (KErrNone != error && KErrInUse != error) + ReportAndLeaveIfErrorL(error, _L("Failed to set the port configuration.")); + + error = iDbgTrcPort.Open(); + + if (KErrNone != error) + ReportAndLeaveIfErrorL(error, _L("Failed to open debug trace port.")); + + iConnected = ETrue; + + // register the protocol id here + error = iDbgTrcPort.RegisterProtocolID(EOstProtTrk, EFalse); + if (KErrNone != error) + ReportAndLeaveIfErrorL(error, _L("Failed to register the protocol id.")); + + + iConnectionMessage.Format(_L("Connection: USB \r\nPort: %d\r\n"), iUnitNumber); +} + +// +// CTrkDbgTrcCommPort::ClosePort +// +// Close the communications port +// +void CTrkDbgTrcCommPort::ClosePort() +{ + Cancel(); + + if (iConnected) + { + iDbgTrcPort.UnRegisterProtocolID(EOstProtTrk); + //iDbgTrcPort.Disconnect(); + iDbgTrcPort.Close(); + iConnected = EFalse; + } +} + +// +// CTrkDbgTrcCommPort::SendDataL +// +// Write data to the serial type port +// +void CTrkDbgTrcCommPort::SendDataL(const TDesC8& aBuffer) +{ + TRequestStatus status; + iDbgTrcPort.WriteMessage(status, aBuffer, EFalse); + User::WaitForRequest(status); + + TInt err = status.Int(); + ReportAndLeaveIfErrorL(err, KSendErrMsg); +} + +// +// CTrkDbgTrcCommPort::Listen +// +// Start listening for data coming into the serial type communications port +// +void CTrkDbgTrcCommPort::Listen(CTrkFramingLayer *aFramingLayer) +{ + iFramingLayer = aFramingLayer; + CActiveScheduler::Add(this); + IssueReadRequest(); + iListening = ETrue; +} + +// +// CTrkDbgTrcCommPort::StopListening +// +// Stop listening for data coming into the serial type communications port +// +void CTrkDbgTrcCommPort::StopListening() +{ + if (iListening) + { + Cancel(); + Deque(); + } + + iListening = EFalse; +} + +// +// CTrkDbgTrcCommPort::ReportAndLeaveIfErrorL +// +// If an error occurred, print the error information to the screen and bail out +// +void CTrkDbgTrcCommPort::ReportAndLeaveIfErrorL(TInt aError, const TDesC& aDesc) +{ + if (KErrNone != aError) + { + iErrorMessage.Format(_L("%S\r\nError Code: %d\r\n"), &aDesc, aError); + User::Leave(aError); + } +} + + +// +// CTrkDbgTrcCommPort::IssueReadRequest +// +// Wait for data to come into the communications port +// +void CTrkDbgTrcCommPort::IssueReadRequest() +{ + iNextReadChar = 0; + iDbgTrcPort.ReadMessage(iStatus, iReceivedChars); + SetActive(); +} + +// +// CTrkDbgTrcCommPort::DoCancel +// +// Cancel the request for data from the communications port +// +void CTrkDbgTrcCommPort::DoCancel() +{ + iDbgTrcPort.ReadCancel(); +} + +// +// CTrkDbgTrcCommPort::RunL +// +// Called when data comes into the communications port +// +void CTrkDbgTrcCommPort::RunL() +{ + // pass the data onto the framing layer + if (iStatus.Int() == KErrNone) + { + while (iNextReadChar < iReceivedChars.Length()) + iFramingLayer->HandleByte(iReceivedChars[iNextReadChar++]); + } + // continue waiting for data + IssueReadRequest(); +} +