bluetooth/btstack/HCIShared/src/hcishared.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/HCIShared/src/hcishared.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,499 @@
+// Copyright (c) 2008-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
+ @publishedPartner
+*/
+
+#include <bluetooth/hci/hcishared.h>
+#include "btfeatures.h"
+
+
+enum TBTFeaturesPanic
+	{
+	ERangeTooLarge,
+	};
+
+void FeaturesPanic(TBTFeaturesPanic aPanic)
+	{
+	_LIT(KPanicText, "BTFeatures");
+	User::Panic(KPanicText, aPanic);
+	}
+
+void Panic(THCISharePanic aPanic)
+// Panic due to stack bug.
+	{
+	User::Panic(KHCISharedPanicName, aPanic);
+	}
+
+/** 
+Constructor
+Start with no requests to update the required configuration.
+*/
+
+EXPORT_C TBTFeatures::TBTFeatures()
+	{
+	Init(0);
+	}
+
+/** 
+Constructor
+Start with request to update the required configuration
+
+@param aFeatures the required bluetooth features
+*/
+
+EXPORT_C TBTFeatures::TBTFeatures(TUint64 aFeatures)
+	{
+	Init(aFeatures);
+	}
+
+
+void TBTFeatures::Init(TUint64 aFeatures)
+	{
+	const TInt KMaxBit = 7;
+	iFeatures.SetMax();
+	for (TInt pos = 0; pos < iFeatures.MaxSize(); pos++)
+		{
+		TUint8 byte = (pos <= KMaxBit) ? (aFeatures >> (pos * 8)) & 0xff : 0;
+		iFeatures[pos] = byte;
+		}
+	}
+
+TUint32 TBTFeatures::Extract32BitsOffset(TInt aStart, TInt aEnd, TInt aOffset) const
+	{
+	return Extract32Bits(aStart, aEnd) << aOffset;
+	}
+
+TUint32 TBTFeatures::Extract32Bits(TInt aStart, TInt aEnd) const
+	{
+	__ASSERT_DEBUG(aEnd - aStart <= 32, FeaturesPanic(ERangeTooLarge));
+	TUint32 result =0;
+	TInt outOffset = 0;
+	for (TInt bit = aStart; bit <= aEnd; bit++)
+		{
+		result |= (operator[](bit) ? 1<<outOffset : 0);
+		outOffset++;
+		}
+	
+	return result;
+	}
+
+
+/**
+Subscript operator.
+
+Return an individual bit from BT features
+
+@param aOffset Object to compare to this.
+@return ETrue if the individual bit is 1, otherwise EFalse returned
+*/
+
+EXPORT_C TBool TBTFeatures::operator[](TInt aOffset) const
+	{
+	TInt byte = aOffset / 8;
+	TInt offset = aOffset - (byte * 8);
+	return TBool(iFeatures[byte] & (1<<offset));
+	}
+
+
+/** 
+Return current link mode set  
+
+@return current link mode set 
+*/
+
+EXPORT_C TBTLinkModeSet TBTFeatures::LinkModes() const
+	{
+	return TBTLinkModeSet(Extract32Bits(ESupportedHoldModeBit, ESupportedParkModeBit));
+	}
+
+
+/** 
+Return current SCO packets type
+
+@return current SCO packets type 
+*/
+EXPORT_C TBTSCOPackets TBTFeatures::SCOPackets() const
+	{
+	return TBTSCOPackets(Extract32Bits(ESupportedSCOLinkBit, ESupportedHV3PacketsBit) * EPacketsHV1);
+	}
+
+/** 
+Return current synchronous packet types (SCO and eSCO on v1.2).
+
+@return current synchronous packet types (SCO and eSCO on v1.2).
+*/
+EXPORT_C TBTSyncPacketTypes TBTFeatures::SyncPackets() const
+	{
+	TBTSyncPacketTypes packets = Extract32Bits(ESupportedSCOLinkBit, ESupportedHV3PacketsBit) | Extract32BitsOffset(ESupportedExtendedSCOLinkBit, ESupportedEV5PacketsBit, 3);
+	return packets;
+	}
+
+/** 
+Return current supported mode
+
+@param aMode specified link modes to compare 
+@return ETrue if specified link modes are supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsModeSupported(TBTLinkMode aMode) const
+	{
+	return LinkModes() & aMode;
+	}
+
+/** 
+Return whether role switch is supported
+
+@return ETrue if role switch is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsRoleSwitchSupported() const
+	{
+	return operator[](ESupportedSwitchBit);
+	}
+
+/** 
+Return whether encryption is supported
+
+@return ETrue if encryption is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsEncryptionSupported() const
+	{
+	return operator[](ESupportedEncryptionBit);
+	}
+
+/** 
+Return whether Extended Inquiry Response is supported
+
+@return ETrue if Extended Inquiry Response is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsExtendedInquiryResponseSupported() const
+	{
+	return operator[](ESupportedExtendedInquiryResponseBit);
+	}
+
+/** 
+Return whether Read signal strength indication with inquiry is supported
+
+@return ETrue if Read signal strength indication with inquiry is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsRssiWithInquiryResultsSupported() const
+	{
+	return operator[](ESupportedRSSIWithInquiryResultsBit);
+	}
+
+/** 
+Return whether Secure Simple Pairing is supported
+
+@return ETrue if Secure Simple Pairing is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsSecureSimplePairingSupported() const
+	{
+	return operator[](ESupportedSecureSimplePairingBit);
+	}
+
+/** 
+Return whether Encryption Pause and Resume is supported
+
+@return ETrue if Encryption Pause and Resume is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsEncryptionPauseResumeSupported() const
+	{
+	return operator[](ESupportedEncryptionPauseResumeBit);
+	}
+
+/** 
+Return whether SCO link is supported
+
+@return ETrue if SCO link is supported, otherwise EFalse returned
+*/
+EXPORT_C TBool TBTFeatures::IsSCOLinkSupported() const
+	{
+	return operator[](ESupportedSCOLinkBit);
+	}
+
+/** 
+Return whether Extended SCO link is supported
+
+@return ETrue if Extended SCO link is supported, otherwise EFalse returned
+*/
+
+EXPORT_C TBool TBTFeatures::IsExtendedSCOLinkSupported() const
+	{
+	return operator[](ESupportedExtendedSCOLinkBit);
+	}
+
+
+
+/** 
+Indicate whether a low power mode is allowed
+
+@param aMode Bluetooth SIG specified values for indicating link modes
+@return ETrue if the indicated low power modes are allowed, otherwise return EFalse
+*/
+
+EXPORT_C TBool TLinkPolicy::IsModeAllowed(TBTLinkMode aMode) const
+	{
+	TBool allowed;
+
+	switch (aMode)
+		{
+		case EHoldMode:
+		case ESniffMode:
+		case EParkMode:
+			allowed = iLowPowerModePolicy & aMode;
+			break;
+
+		default:
+			Panic(EBTUnknownLowPowerMode);
+			allowed = EFalse;
+		}
+	
+	return allowed;
+	}
+
+/** 
+Indicate whether mode switch is allowed
+
+@return ETrue if mode switch is allowed, otherwise return EFalse
+*/
+
+EXPORT_C TBool TLinkPolicy::IsSwitchAllowed() const
+	{
+	return iSwitchAllowed;
+	}
+
+/** 
+Set permission or prohibition to a specific low power mode
+
+@param aMode Bluetooth SIG specified values for indicating link modes
+@param aAllowed the permission or prohibition to a specific low power mode
+*/
+
+EXPORT_C void TLinkPolicy::SetModeAllowed(TBTLinkMode aMode, TBool aAllowed)
+	{
+	switch (aMode)
+		{
+		case EHoldMode:
+		case ESniffMode:
+		case EParkMode:
+			aAllowed ? iLowPowerModePolicy |= aMode : iLowPowerModePolicy &= ~aMode;
+			break;
+
+		default:
+			Panic(EBTUnknownLowPowerMode);
+		}
+	}
+
+/** 
+Set permission to low power modes
+
+@param aModesAllowed the low power modes to be allowed or not
+*/
+
+EXPORT_C void TLinkPolicy::SetModesAllowed(TUint8 aModesAllowed)
+	{
+	iLowPowerModePolicy = aModesAllowed;
+	}
+
+/** 
+Set permission to low power modes switch
+
+@param aAllowed the low power modes switch to be allowed or not
+*/
+
+EXPORT_C void TLinkPolicy::SetSwitchAllowed(TBool aAllowed)
+	{
+	iSwitchAllowed = aAllowed;
+	}
+
+
+/** 
+Return current low power mode policy 
+
+@return current low power mode policy
+*/
+
+EXPORT_C TUint8 TLinkPolicy::LowPowerModePolicy() const
+	{
+	return iLowPowerModePolicy;
+	}
+
+/** 
+Return current link policy  
+
+@return current link policy 
+*/
+
+EXPORT_C TUint8 TLinkPolicy::LinkPolicy() const
+	{
+	return static_cast<TUint8>(iSwitchAllowed + (iLowPowerModePolicy << 1));
+	}
+
+
+/** 
+Constructor
+Start with default configuration
+*/
+EXPORT_C TBTBasebandLinkState::TBTBasebandLinkState()
+ :	iLinkState(ELinkDown), 
+	iAuthenticated(EFalse), 
+	iEncrypted(EFalse),
+	iMode(EActiveMode),
+	iRole(ERoleUnknown),
+	iPacketTypes(EAnyPacket),
+	iMaxSlots(5)
+	{
+	}
+
+/** 
+Set the link state
+
+@param aState link state values 
+*/
+EXPORT_C void TBTBasebandLinkState::SetLinkState(TLinkState aState)		
+	{ 
+ 	iLinkState = aState; 
+	}
+
+/** 
+Set the authentication state
+
+@param aAuthenticated TBool value indicates whether authentication is allowed or not
+*/
+EXPORT_C void TBTBasebandLinkState::SetAuthenticated(TBool aAuthenticated)
+	{ 
+ 	iAuthenticated = aAuthenticated;
+	}
+
+/** 
+Set the encryption state
+
+@param aEncrypted TBool value indicates whether encryption is allowed or not
+*/
+EXPORT_C void TBTBasebandLinkState::SetEncrypted(TBool aEncrypted)
+	{ 
+ 	iEncrypted = aEncrypted;
+	}
+
+/** 
+Set the link mode
+
+@param aMode TBool value indicates the BT link mode
+*/
+EXPORT_C void TBTBasebandLinkState::SetLinkMode(TBTLinkMode aMode)			
+	{ 
+ 	iMode = aMode;
+	}
+
+/** 
+Set the link role
+
+@param aRole Bluetooth SIG specified values for specification of (piconet) role
+*/
+EXPORT_C void TBTBasebandLinkState::SetLinkRole(TBTBasebandRole aRole)		
+	{ 
+ 	iRole = aRole;
+	}
+
+/** 
+Set the packet types
+
+@param aPacketTypes Bluetooth SIG specified packet types
+*/
+EXPORT_C void TBTBasebandLinkState::SetPacketTypes(TUint16 aPacketTypes)	
+	{ 
+ 	iPacketTypes = aPacketTypes;
+	}
+
+/** 
+Set the maximum types
+
+@param aMaxSlots LMP maximum slot
+*/
+EXPORT_C void TBTBasebandLinkState::SetMaxSlots(TUint8 aMaxSlots)				
+	{ 
+ 	iMaxSlots = aMaxSlots;
+	}
+
+/** 
+Return current baseband link state 
+
+@return current baseband link state  
+*/
+EXPORT_C TBTBasebandLinkState::TLinkState TBTBasebandLinkState::LinkState() const				
+	{ 
+	return iLinkState;
+	}
+
+/** 
+Return current authentication status 
+
+@return current authentication status  
+*/
+EXPORT_C TBool TBTBasebandLinkState::Authenticated() const					
+	{ 
+	return iAuthenticated;
+	}
+
+/** 
+Return current encryption status 
+
+@return current encryption status  
+*/
+EXPORT_C TBool TBTBasebandLinkState::Encrypted() const						
+	{ 
+	return iEncrypted;
+	}
+
+/** 
+Return current baseband link state 
+
+@return current baseband link state 
+*/
+EXPORT_C TBTLinkMode TBTBasebandLinkState::LinkMode() const				
+	{ 
+	return iMode;
+	}
+
+/** 
+Return current baseband link role 
+
+@return current baseband link role 
+*/
+EXPORT_C TBTBasebandRole TBTBasebandLinkState::LinkRole() const			
+	{ 
+	return iRole;
+	}
+
+/** 
+Return current baseband packet types 
+
+@return current baseband packet types 
+*/
+EXPORT_C TUint16 TBTBasebandLinkState::PacketTypes() const					
+	{ 
+	return iPacketTypes;
+	}
+
+/** 
+Return current baseband max slots 
+
+@return current baseband max slots 
+*/
+EXPORT_C TUint8 TBTBasebandLinkState::MaxSlots() const						
+	{ 
+	return iMaxSlots;
+	}