diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/inc/blogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/inc/blogger.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,401 @@ +// Copyright (c) 1999-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: +// + +#ifndef BLOGGER_H__ +#define BLOGGER_H__ + +#include "debug.h" + +#ifndef BLOGGING__ +NONSHARABLE_CLASS(CBlogger): public CBase + { +public: + IMPORT_C TAny* GetFloggerInfo(); + }; +#endif + +#ifdef BLOGGING__ + +// Stack Blogging Layers +const TInt KBlogLayerLinkLayer =1; +const TInt KBlogLayerL2CAP =2; +const TInt KBlogBadLayerChoice =3; +const TInt KBlogLayerRFComm =4; + +// Stack Layers Logging Masks +const TInt KBlogNoLayer =0x00000000; +const TInt KBLogLinkLayer =0x00000001; +const TInt KBlogL2CAP =0x00000002; +const TInt KBLogRFComm =0x00000004; +const TInt KBlogAllLayers =0x7fffffff; + +//Blogging Verbosity Levels +const TInt KBlogVerbosityOff =0x00000000; +const TInt KBlogVerbosityTimeCritical =0x00000001; +const TInt KBlogVerbosityMinimal =0x00000002; +const TInt KBlogVerbosityNormal =0x00000003; +const TInt KBlogVerbosityBTQualLevel =0x00000004; +const TInt KBlogVerbosityLoud =0x00000005; +const TInt KBlogVerbosityAllLevels =0x00000006; + + +//BLogging Type Masks +const TInt KBlogTypeLogAllMask = 0xffffffff; +const TInt KBlogTypeProtocol = 0x00000001; +const TInt KBlogTypeTimestamp = 0x00000002; +const TInt KBlogTypeTimeout = 0x00000004; +const TInt KBlogTypeTestAppContext = 0x00000008; +const TInt KBlogTypeFCS = 0x00000010; +const TInt KBlogTypeBaseband = 0x00000020; +const TInt KBlogTypeChannelNumber = 0x00000040; +const TInt KBlogTypePSMNumber = 0x00000080; +const TInt KBlogTypeIncomingPacket = 0x00000100; +const TInt KBlogTypeOutgoingPacket = 0x00000200; +const TInt KBlogTypeRawFrames = 0x00000400; +const TInt KBlogTypeL2CAPSignallerState = 0x00000800; +const TInt KBlogTypeRFCOMMMuxState = 0x00001000; +const TInt KBlogTypeSapState = 0x00002000; +const TInt KBlogTypeCurrentState = 0x00004000; +const TInt KBlogTypeStateChange = 0x00008000; +const TInt KBlogTypeRequest = 0x00010000; +const TInt KBlogTypeExpectedResponse = 0x00020000; +const TInt KBlogTypeActualResponse = 0x00040000; +const TInt KBlogTypeInquiry = 0x00080000; +const TInt KBlogTypeInquiryResult = 0x00100000; +const TInt KBlogTypeKeyRegistration = 0x00200000; +const TInt KBlogTypeKeyFailure = 0x00400000; +const TInt KBlogTypeLinkKeyInteraction = 0x00800000; +const TInt KBlogTypeCtrlFrames = 0x01000000; +const TInt KBlogTypeUIHFrames = 0x02000000; +const TInt KBlogTypeMuxCtrlFrames = 0x04000000; +const TInt KBlogTypeCtrlFrameBits = 0x08000000; +const TInt KBlogTypeOutgoingFrames = 0x10000000; +const TInt KBlogTypeCreditAccounting = 0x20000000; +const TInt KBlogTypeSecurity = 0x40000000; +const TInt KBLogTypeLocalHCPokes = 0x80000000; + +//Logging LITs + + +_LIT(KBlogCommand, "command"); +_LIT(KBlogResponse, "response"); + + +_LIT(KBlogBluetoothAddrLit,"Bluetooth Address:"); + +//Layer/Protocol dependent +_LIT(KBlogIncomingPacket, "Incoming packet, Type %d, Size %d, Payload %08x"); //received data pkt with size and type of pkt +_LIT(KBlogOutgoingPacket, "Outgoing packet, Type %d, Size %d, Payload %08x"); //sent data pkt with size and type of pkt +_LIT(KBlogRawFrames, "Frame Type %d, 0x%8x");// frame type and content - different specific info required from different types of Frame +_LIT(KBlogSapId, "%d SAP %08x"); //type of SAP (RFCOMM/L2CAP) and sap id +_LIT(KBlogSapState, "SAP State %d"); +_LIT(KBlogCurrentState, "Current State %d"); +_LIT(KBlogStateChange, "State %d"); +_LIT(KBlogInquiryResult, "Inquiry Result"); + +//L2CAP +_LIT(KBlogChannelNumber, "Channel %d"); +_LIT(KBlogL2CAPSignallerState, "Signaller State %d"); +_LIT(KBlogPSMNumber, "PSM %d"); +_LIT(KBlogL2, "L2: "); +_LIT(KBlogL2Test, "Test"); +_LIT(KBlogTest, "L2: TEST NUMBER is %d"); + + + + +//RFCOMM + +_LIT(KBlogMuxId, "MUX %08x"); +_LIT(KBlogFrameid, "Frame id %08x"); +//States +_LIT(KBlogRFCOMMMuxState, "Mux State %d"); +//Frame Parts +_LIT(KBlogDLCI, " DLCI %d"); +_LIT(KBlogPFSet, " P/F bit = %d"); +_LIT(KBlogEASet, " EA bit = %d"); +_LIT(KBlogCRSet, " C/R bit = %d"); +_LIT(KBlogActualFCS, " Actual PDU FCS %d"); +_LIT(KBlogComputedFCS, " Computed FCS %d - (should be 0xCF)"); +_LIT(KBlogComparedFCS, " Compared FCS %d"); +_LIT(KBlogSignals, " Signals 0x%02x"); + +//Timeouts +_LIT(KBlogTimeout, "T1 timer expired awaiting response for "); +//Ctrl Frames +_LIT(KBlogSABM, "SABM"); +_LIT(KBlogDM, "DM"); +_LIT(KBlogUA, "UA"); +_LIT(KBlogDISC, "DISC"); +//Frame Types +_LIT(KBlogFrameType, "Frame of type %d"); +_LIT(KBlogCtrlFrame, "Ctrl Frame: "); +_LIT(KBlogUIHCtrlFrame, "UIH Ctrl Frame"); +_LIT(KBlogSimpleUIH, "UIH simple data frame"); +_LIT(KBlogShortUIH, "UIH simple data frame"); +_LIT(KBlogLongUIH, "UIH simple data frame"); +_LIT(KBlogCreditUIH, "UIH credit data frame"); +_LIT(KBlogLongCreditUIH, "Tx :Long UIH credit data frame with %d credits"); +_LIT(KBlogShortCreditUIH, "Tx: Short UIH credit data frame with %d credits"); +_LIT(KBlogMuxCtrlFrame, "Mux Ctrlframe"); +//MuxCtrlCommands +_LIT(KBlogTestCommand, "TestCommand"); +_LIT(KBlogFcOn, "FcOn"); +_LIT(KBlogFcOff, "FcOff"); +_LIT(KBlogMSC, "MSC"); +_LIT(KBlogRPN, "RPN"); +_LIT(KBlogRLS, "RLS"); +_LIT(KBlogPN, "PN"); +_LIT(KBlogNSC, "NSC"); +//Data +_LIT(KBlogNewData, "New packet of data arrived from L2CAP, count %d"); +_LIT(KBlogNewDataFrame, "Creating new datapacket for outbound queue, dlci %d, data length %d, sap %08x, "); +_LIT(KBlogWriteData, "Writing data, 0x%x"); +_LIT(KBlogNonZeroLength, "with non-zero length"); + +//Link Layer +_LIT(KBlogNewLinkConnectionEvent,"LL: Connection complete event. Code %d, link type=%d "); +_LIT(KBlogNewLinkConnectionReqEvent, "LL: Incoming connection request event"); +_LIT(KBlogNewLinkDisconnectionEvent,"LL: Disconnection complete event. Handle %x, Code %d, Reason %d"); +_LIT(KBlogHCSendPacketsOK,"LL: Notifying DataQ Controller of %d Completed packets from HC to remote"); +_LIT(KBlogLLDataIn ,"LL: Data received for handle %d, flags %d, length %d"); +_LIT(KBlogACLFrame,"LL: ACL Frame:"); +_LIT(KBlogLLDataIn2Null,"LL: Warning!! Data received with no datalink notifier in place"); +_LIT(KBlogLLScanEnableResult,"LL: ReadScanEnableResult received, with error code %d, value %d"); +_LIT(KBlogHCBufferSizeResult,"LL: ReadBufferSizeResult - aErr %d, aAclMaxLen %d, aNoACL %d"); +_LIT(KBlogHCReadTimeoutResult,"LL: Warning!! Unhandled ReadTimeoutResult (EConnectionAcceptTimeout)"); +_LIT(KBlogVendorEvent,"LL: Warning!! Just received a Vendor Specific Debug Event !"); +_LIT(KBlogHardwareError,"LL: Error! HardwareErrorEvent Received: %d"); +_LIT(KBlogHCIBufferNewCredits,"LL: HCI Buffer Strategy, Credit available, trying to issue."); +_LIT(KBlogLLTransportFreed,"LL: LinkMgr, Transport is now free"); +_LIT(KBlogHCIssuedCmdCredits,"LL: LinkMgr, HC issued %d command credits"); +_LIT(KBlogLLSetLocalNameComplete,"LL: SetLocalName Command Complete Event"); +_LIT(KBlogLLWritePageTOComplete,"LL: WritePageTimeout Command Complete Event"); +_LIT(KBlogLLWriteCoDComplete,"LL: WriteClassOfDevice Command Complete Event"); +_LIT(KBlogLLWriteVoiceSettingComplete,"LL: WriteVoiceSetting Command Complete Event"); +_LIT(KBlogLLWriteScanEnable,"LL: WriteScanEnable Command Complete Event"); +_LIT(KBlogLLWriteCurrentIACLAPComplete,"LL: WriteCurrentIACLAP Command Complete Event"); +_LIT(KBlogLLSetHC2HostFCComplete,"LL: SetHostControllerToHostFlow Command Complete Event"); +_LIT(KBlogLLCommandWarning,"LL: Warning, Unhandled Command complete event! Opcode %d error code %d"); +_LIT(KBlogLLWriteAFHHostChannelClassification,"LL: WriteAFHHostChannelClassificationComplete Command Complete Event"); +_LIT(KBlogLLReadAFHChannelAssessmentModeComplete,"LL: ReadAFHChannelAssessmentModeComplete Command Complete Event"); +_LIT(KBlogLLWriteAFHChannelAssessmentModeComplete,"LL: WriteAFHChannelAssessmentModeComplete Command Complete Event"); + +//MISC +_LIT(KKeyRegistration, "Key Registration"); +_LIT(KKeyFailure, "Key Failure"); +_LIT(KPINKeyInteraction, "PIN Key"); + +// Const Lit Lengths for the predifined Lits +//255 is the max RDebug::Print size +const TInt KRDBMaxLit=255; +const TInt KBlogDateTimeLitLength=36; //depends on date, time formating lits +const TInt KBlogTCPreambleLitLength=20; +const TInt KBlogTestCaseMaxLitLength=KRDBMaxLit+KBlogDateTimeLitLength+KBlogTCPreambleLitLength; +const TInt KBlogTestCaseResultPreambleLitLength=36; +const TInt KBlogTestCaseResultMaxLitLength=KBlogTestCaseResultPreambleLitLength+KBlogDateTimeLitLength+KRDBMaxLit; +const TInt KBlogTesterMessageInfoLitLength=100; +const TInt KBlogTesterMessageInfoMaxLitLength=KBlogDateTimeLitLength+KBlogTesterMessageInfoLitLength; +const TInt KBlogMessageMaxLitLength=512; + +//Blogging Output Resource Types +// if we ever need to put more than 2 then implement it with dynamic binding +const TInt KBlogOutputTypeIsRDebug =0; +const TInt KBlogOutputTypeIsFlogger =1; + +// The number of chars to be printed on single line over COM1 or on a file +const TInt KBlogOutputWindowDefault=80; + + +// Common Lits + +// need to be in sync with KBlogDateTimeLitLength +_LIT(KBlogTimeFormat,"%J%:1%T%:2%S "); +_LIT(KBlogDateFormat,"%1%/1%2%/2%3 "); +_LIT(KBlogBlankDate,"--:--:---- "); +_LIT(KBlogBlankTime,"--:--:-- "); +_LIT(KBlogTestCaseLit,"Test Case Running: "); +// need to be in sync with KBlogTesterMessageInfoLitLength +//_LIT(KBlogTesterMessageInfoLit,"[Message from the tester follows:]"); +_LIT(KBlogTesterMessageInfoLit,"Tester: "); + +// Test Case Result Consts +// these should be used with the KBloggerSetTestCaseResult option +const TInt KBlogTestCaseResultPassed = 0; +const TInt KBlogTestCaseResultFailed = 1; +const TInt KBlogTestCaseResultInconclusive = 2; +const TInt KBlogTestCaseResultSkipped = 3; +const TInt KBlogTestCaseResultUpperNo = 3; // for bounds checking + +// Test Case Result Lits +// these should be used with the KBloggerSetTestCaseResult option +// remember to cjheck with KBlogTestCaseResultPreambleLitLength +// if any of the below Lits gets changed +_LIT(KBlogTestCaseResultLitPass,"[PASSED] test for test case : "); +_LIT(KBlogTestCaseResultLitFailed, "[FAILED] test for test case : "); +_LIT(KBlogTestCaseResultLitInconclusive, "[INCONCLUSIVE] test for test case : "); +_LIT(KBlogTestCaseResultLitSkipped,"[SKIPPED] test for test case : "); + +enum TBTBloggingOptions + { + KBloggerSetLayers, + KBloggerSetVerbosity, + KBloggerSetLoggingMask, + KBloggerSetMedium, + KBloggerSetTestCaseName, + KBloggerSetOutputWindow, + KBloggerSetTestCaseResult, // to be used with the appropriate lits to indicate result + KBloggerSetTesterMessage, // to be formated according to the corresponding lit + KBloggerSetAllOptions //should use TBlogSettings + }; + +struct TBlogSettings + { + TInt iLayersToLog; + TInt iVerbosity; + TInt iLoggingMask; + TInt iMediumToLog; + TInt iOutputWindowSize; + TBuf<255> iTestCaseLit; + }; +typedef TPckgBuf TBlogSettingsPckg; + +typedef TBuf<255> TBlogTestCaseLit; + +enum TBloggerPanic + { + EBloggerLayerRegistrationOutOfRange =0, + EBloggerLayerBloggetteAlreadyRegistered=1, + EBloggerLayerRequestedOutOfRange =2, + EBloggerResourceTypeIsBogus =3, + EBloggerTestCaseResultIsBogus =4, // check your KBlogTestCaseResultUpperNo + EBloggerDescriptorLengthWasShorter =5, + EBloggerMessageLengthTooLong =6 + }; + +class CRfcommSAP; +class CRfcommMuxCtrlFrame; +class CRfcommMuxer; +class CRfcommFrame; +class CRfcommCtrlFrame; +class CBloggette; + +NONSHARABLE_CLASS(CBlogger) : public CBase + { +public: + ~CBlogger(); + static CBlogger* NewL(); + void ConstructL(); + TInt LoggingMask(TInt aLayer, TInt aVerbosity) const; + CBloggette* GetLayerBloggette(TInt aLayer); //only one per layer please + void Register(CBloggette* aLayerBloggette); + void Blog(const TDesC& aMessage, TInt aFrameWindow); + void Blog(const TDesC& aMessage); + void HexDump(const TDesC& aDescription,const TDesC8& aHexFrame,TInt aFrameWindow=KBlogOutputWindowDefault); + // to be used by the protocol layer which receives the SetOp + TInt UpdateLoggingSettings(TUint aOptionType,const TDesC8& aOption); + void StoreFloggerInfo(TAny* aLogInfo); + IMPORT_C TAny* GetFloggerInfo(); +private: + CBlogger(); + void Panic(TBloggerPanic aPanic); + // Blogging calls + void BlogTestCase(TDesC& aTestCaseName); + void BlogTestCaseResult(TInt aTestCaseResult); + void BlogTesterMessage(TDesC& aTesterMessage); + void DoBlog(const TDesC& aMessage, TInt aFrameWindow=KBlogOutputWindowDefault); + // Output and formating + void DoOutputToResourceL(const TDesC& aMessage); + void CreateBlogFileL(); + void DoFileL(); + void MakefilenameL(const TDesC &aFileName); + TInt DoDateTimeFormat(TDes& aDesToPrepend); + //for testing and debugging only + void DoBloggerTests(); +private: + friend class CHCILinkMgr; // for testing + CBloggette* iLLBloggette; + CBloggette* iL2Bloggette; + CBloggette* iRFBloggette; + + TInt iOutputWindowSize; + TInt iVerbosityLevel; + TInt iLayersToLogMask; + TInt iLoggingMask; + TInt iMediumType; // 0 for port 0, 1 for Flogger - defaults to zero because member of C Class. + TBuf iTestCaseLit; + + TAny* iFloggerInfo; // when flogging is compiled in + RFs ifileserv; + RFile ifile; + TBool iFileExists; + HBufC* ifilename; + }; + +NONSHARABLE_CLASS(CBloggette) : public CBase + { +public: + ~CBloggette(); + inline TInt Layer() const; + void Log(TRefByValue aFormatingLit, ...); + void HexDump(TRefByValue aDescription,const TDesC8& aHexFrame, TInt aFrameWindow=80); + virtual TDesC NameDes()=0; +protected: + CBloggette(CBlogger* aProvider, TInt aLayer); + TInt iLayer; + CBlogger* iBlogger; + }; + +NONSHARABLE_CLASS(CLLBloggette) : public CBloggette + { +public: + static CLLBloggette* NewL(CBlogger* aProvider, TInt aLayer); //only one per layer please + ~CLLBloggette(); + virtual TDesC NameDes(); +private: + CLLBloggette(CBlogger* aProvider, TInt aLayer); + }; + +NONSHARABLE_CLASS(CL2Bloggette) : public CBloggette + { +public: + static CL2Bloggette* NewL(CBlogger* aProvider, TInt aLayer); + ~CL2Bloggette(); + virtual TDesC NameDes(); +private: + CL2Bloggette(CBlogger* aProvider, TInt aLayer); + }; + +NONSHARABLE_CLASS(CRFBloggette) : public CBloggette + { + friend class CRfcommCtrlFrame; +public: + static CRFBloggette* NewL(CBlogger* aProvider, TInt aLayer); + ~CRFBloggette(); + virtual TDesC NameDes(); +private: + CRFBloggette(CBlogger* aProvider, TInt aLayer); + friend class CRfcommFrame; //Shehla + friend class CRfcommMuxer; //Shehla + void Timeout(/*CRfcommSAP* aSAP, CRfcommMuxer* aMux, */CRfcommFrame* aFrm ); + void ExplainOutgoingFrame(CRfcommFrame* aFrm, CRfcommMuxer* aMux); + void ExplainIncomingFrame(TUint8 addr, TUint8 ctrl, TBool poll); + void LogMuxCommand(CRfcommSAP* aSAP, CRfcommMuxer* aMux, TUint8 aCommand); + void IncomingCtrlMessage(TUint8 aCtrlmessage, TInt aLength); + }; + +#endif +#endif +