sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #include "uloggerserialplugin.h" sl@0: sl@0: #if defined(__LIGHTLOGGER_ENABLED) sl@0: #include "lightlogger.h" sl@0: #endif sl@0: sl@0: namespace Ulogger sl@0: { sl@0: sl@0: #if defined (__WINS__) sl@0: _LIT(KPddDev, "ECDRV.PDD"); sl@0: #else sl@0: _LIT(KPddDev, "EUART1"); sl@0: #endif sl@0: sl@0: #if defined (__WINS__) sl@0: _LIT(KLddDev, "ECOMM.LDD"); sl@0: #else sl@0: _LIT(KLddDev, "ECOMM"); sl@0: #endif sl@0: sl@0: //settings for serial output plugin sl@0: _LIT(KPortNumber, "output_port"); sl@0: sl@0: /** sl@0: Creates an instance of CSerialWriter object sl@0: @return a pointer to the new created CSerialWriter Object sl@0: @leave KErrNoMemory if no memory sl@0: */ sl@0: CSerialWriter* CSerialWriter::NewL() sl@0: { sl@0: CSerialWriter *me = new (ELeave) CSerialWriter; sl@0: CleanupStack::PushL(me); sl@0: me->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return me; sl@0: } sl@0: sl@0: /** sl@0: Public Destructor sl@0: */ sl@0: CSerialWriter::~CSerialWriter() sl@0: { sl@0: Disconnect(); sl@0: } sl@0: sl@0: //default constructor sl@0: CSerialWriter::CSerialWriter() sl@0: { sl@0: } sl@0: sl@0: void CSerialWriter::ConstructL() sl@0: { sl@0: iReady = EFalse; sl@0: sl@0: TInt err = User::LoadPhysicalDevice(KPddDev); sl@0: if(err!=KErrNone && err!=KErrAlreadyExists) sl@0: User::Leave(err); sl@0: sl@0: err = User::LoadLogicalDevice(KLddDev); sl@0: if(err!=KErrNone && err!=KErrAlreadyExists) sl@0: User::Leave(err); sl@0: } sl@0: sl@0: void CSerialWriter::CloseOutputPlugin() sl@0: { sl@0: Disconnect(); sl@0: } sl@0: sl@0: TInt CSerialWriter::ConfigureOutputPlugin(const RPointerArray& aSettings) sl@0: { sl@0: TInt i = aSettings.Count(); sl@0: while(i-->0) sl@0: { sl@0: TPluginConfiguration* key = aSettings[i]; sl@0: sl@0: if(key->Key().Compare(KPortNumber) == 0) sl@0: { sl@0: TLex lex(key->Value()); sl@0: lex.Val(iPortNum); sl@0: } sl@0: } sl@0: sl@0: Disconnect(); sl@0: TInt err = Connect(); sl@0: if(err != KErrNone) sl@0: return err; sl@0: err = Config(); sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CSerialWriter::Connect() sl@0: { sl@0: if(!iReady) sl@0: { sl@0: TInt err = KErrNone; sl@0: err = iComm.Open(iPortNum); sl@0: if(err!=KErrNone) sl@0: { sl@0: iReady = EFalse; sl@0: return err; sl@0: } sl@0: else sl@0: iReady = ETrue; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CSerialWriter::Config() sl@0: { sl@0: TInt err = KErrNone; sl@0: if(iReady) sl@0: { sl@0: TCommConfig2 cfgBuf; sl@0: TCommConfigV02& cfg = cfgBuf(); sl@0: iComm.Config(cfgBuf); sl@0: cfg.iRate = EBps115200;// default EBps9600; sl@0: cfg.iDataBits = EData8;// default EData8; sl@0: cfg.iStopBits = EStop1;// default EStop1; sl@0: cfg.iParity = EParityNone;// default EParityNone; sl@0: cfg.iHandshake = 0;// default KConfigObeyCTS; sl@0: cfg.iParityError = KConfigParityErrorFail; sl@0: cfg.iFifo = EFifoEnable;// default EFifoEnable; sl@0: cfg.iSpecialRate = 0;// default 0; sl@0: cfg.iTerminatorCount = 0;// default 0; sl@0: cfg.iXonChar = 0x11;// default 0x11; // XON sl@0: cfg.iXoffChar = 0x13;// default 0x13; // XOFF sl@0: cfg.iParityErrorChar = 0;// default 0; sl@0: cfg.iSIREnable = ESIRDisable;// default ESIRDisable; sl@0: cfg.iSIRSettings = 0;// no default sl@0: sl@0: err = iComm.SetConfig(cfgBuf); sl@0: if(err!=KErrNone && err!=KErrInUse) sl@0: { sl@0: iReady = EFalse; sl@0: return(err); sl@0: } sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: TInt CSerialWriter::Disconnect() sl@0: { sl@0: if(iReady) sl@0: { sl@0: iReady = EFalse; sl@0: iComm.Close(); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CSerialWriter::Write(const TDesC8& aData) sl@0: { sl@0: TInt err = KErrNone; sl@0: sl@0: if(iReady) sl@0: { sl@0: TRequestStatus writeStatus; sl@0: iComm.Write(writeStatus, aData); sl@0: User::WaitForRequest(writeStatus); sl@0: err = writeStatus.Int(); sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TAny* CSerialWriter::GetInterfaceL(TPluginInterface aInterfaceId) sl@0: { sl@0: if(aInterfaceId == MOutputPlugin::iInterfaceId) sl@0: return static_cast(this); sl@0: else sl@0: return NULL; sl@0: } sl@0: sl@0: } // namespace sl@0: sl@0: sl@0: //Ecom Implementations sl@0: // Map the interface implementation UIDs to implementation factory functions sl@0: const TImplementationProxy ImplementationTable[] = sl@0: { sl@0: IMPLEMENTATION_PROXY_ENTRY(0x102836CB, Ulogger::CSerialWriter::NewL) sl@0: }; sl@0: sl@0: sl@0: // Exported proxy for instantiation method resolution. sl@0: EXPORT_C const TImplementationProxy* ImplementationGroupProxy( sl@0: TInt& aTableCount) sl@0: { sl@0: aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); sl@0: return ImplementationTable; sl@0: } sl@0: