diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/linkmgr/physicallinkmetrics.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/linkmgr/physicallinkmetrics.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,129 @@ +// 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 PHYSICALLINKMETRICS_H +#define PHYSICALLINKMETRICS_H + +#include +#include +#include + +#include "internaltypes.h" +#include "notification.h" + +class CPhysicalLink; +class CBTProxySAP; + +class THCICommandCompleteEvent; +class TReadFailedContactCounterCompleteEvent; +class TReadRSSICompleteEvent; +class TReadLinkQualityCompleteEvent; +class TReadTransmitPowerLevelCompleteEvent; + +const TUint KPLMPollInterval = 2000000; // 2 Seconds + + +enum THciCommandState + { + ECommandIdle, + ECommandIssued, + ECommandBlockedForTimer + }; + +class TPLMManager + { +public: + TPLMManager(); + void RegisterProxySAP(CBTProxySAP& aSAP); + void UpdatePLMValue(TInt aPLMValue); + void UpdatePLMState(THciCommandState aPLMState); + TPckgBuf& PLMValue(); + THciCommandState PLMState() const; + void NotifyQueuedProxySAPs(TInt aErr, TUint aName, TDesC8* aBuf); + TBool AnyOutstandingClientRequest() const; + +private: + TDblQue iPLMQue; + THciCommandState iPLMState; + TPckgBuf iPLMValue; + }; + +/** + This class handles CPhysicalLinkMetrics commands to and from the HCI + It is owned, constructed and destructed by CPhysicalLink +**/ +NONSHARABLE_CLASS(CPhysicalLinkMetrics) : public CBase, public MHCICommandQueueClient, + public MPhysicalLinkObserver + { +public: + static CPhysicalLinkMetrics* NewL(CPhysicalLink& aLink, MHCICommandQueue& aController); + ~CPhysicalLinkMetrics(); + void ReadNewPhysicalLinkMetricValue(TUint aIoctlName, CBTProxySAP& aSAP, TInt aCurrentValue); + +private: + CPhysicalLinkMetrics(CPhysicalLink& aLink, MHCICommandQueue& aController); + void ConstructL(); + void HandleReadFailedContactCounterCompleteEvent(const TReadFailedContactCounterCompleteEvent& aEvent); + void HandleReadLinkQualityCompleteEvent(const TReadLinkQualityCompleteEvent& aEvent); + void HandleReadRssiCompleteEvent(const TReadRSSICompleteEvent& aEvent); + void HandleReadTransmitPowerLevelCompleteEvent(const TReadTransmitPowerLevelCompleteEvent& aEvent); + + void ReadRssiCommand(); + void ReadRssiCommandL(); + void ReadLinkQualityCommand(); + void ReadLinkQualityCommandL(); + void ReadFailedContactCounterCommand(); + void ReadFailedContactCounterCommandL(); + void ReadTransmitPowerLevelCommand(); + void ReadTransmitPowerLevelCommandL(); + + void RemovePLMCommands(); + void CommandCompleteEvent(const THCICommandCompleteEvent& aEvent); + + static TInt PLMEventReceived(TAny* aThis); + void DoRssiTimerEvent(); + void DoLinkQualityTimerEvent(); + void DoFailedContactCounterTimerEvent(); + void DoTransmitPowerLevelTimerEvent(); + + void QueueNextPLMPollIfNotAlreadyQueued(); + void RemovePLMPoll(); + + // From MHCICommandQueueClient + virtual void MhcqcCommandEventReceived(const THCIEventBase& aEvent, const CHCICommandBase* aRelatedCommand); + virtual void MhcqcCommandErrored(TInt aErrorCode, const CHCICommandBase* aCommand); + + // From MPhysicalLinkObserver + virtual void PhysicalLinkChange(const TBTBasebandEventNotification& aEvent, CPhysicalLink& aPhysicalLink); + virtual TPhysicalLinkObserverQLink& ObserverQLink(); + +private: + CPhysicalLink& iParent; + MHCICommandQueue& iCmdController; + + TPhysicalLinkObserverQLink iQueLink; + + TPckgBuf iDummyResult; + + TPLMManager iRssi; + TPLMManager iLinkQuality; + TPLMManager iTransmitPowerLevel; + TPLMManager iFailedContactCounter; + + TDeltaTimerEntry iPLMTimer; + TBool iPLMTimerQueued; + }; + +#endif //PHYSICALLINKMETRICS_H