// 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;
}