diff --git a/src/platform/silabs/AbstractBLEManagerImpl.cpp b/src/platform/silabs/AbstractBLEManagerImpl.cpp new file mode 100644 index 0000000000..978e1bca07 --- /dev/null +++ b/src/platform/silabs/AbstractBLEManagerImpl.cpp @@ -0,0 +1,303 @@ +#include "AbstractBLEManagerImpl.h" + +#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE + +#include + +#include +#include +#include + +#include + +namespace chip { +namespace DeviceLayer { +namespace Internal { + +CHIP_ERROR AbstractBLEManagerImpl::_Init() +{ + return PlatformInit(); +} + +CHIP_ERROR AbstractBLEManagerImpl::_SetAdvertisingEnabled(bool val) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + + VerifyOrExit(mServiceMode != ConnectivityManager::kCHIPoBLEServiceMode_NotSupported, + err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE); + + if (mFlags.Has(Flags::kAdvertisingEnabled) != val) + { + mFlags.Set(Flags::kAdvertisingEnabled, val); + PostDriveBLEState(); + } + +exit: + return err; +} + +CHIP_ERROR AbstractBLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode) +{ + switch (mode) + { + case BLEAdvertisingMode::kFastAdvertising: + mFlags.Set(Flags::kFastAdvertisingEnabled, true); + break; + case BLEAdvertisingMode::kSlowAdvertising: + mFlags.Set(Flags::kFastAdvertisingEnabled, false); + break; + default: + return CHIP_ERROR_INVALID_ARGUMENT; + } + mFlags.Set(Flags::kRestartAdvertising); + PostDriveBLEState(); + return CHIP_NO_ERROR; +} + +CHIP_ERROR AbstractBLEManagerImpl::_GetDeviceName(char * buf, size_t bufSize) +{ + if (strlen(mDeviceName) >= bufSize) + { + return CHIP_ERROR_BUFFER_TOO_SMALL; + } + strcpy(buf, mDeviceName); + return CHIP_NO_ERROR; +} + +CHIP_ERROR AbstractBLEManagerImpl::_SetDeviceName(const char * deviceName) +{ +#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + ChipLogProgress(DeviceLayer, "_SetDeviceName Started"); +#endif + + if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_NotSupported) + { +#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE"); +#endif + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; + } + if (deviceName != nullptr && deviceName[0] != 0) + { + if (strlen(deviceName) >= kMaxDeviceNameLength) + { +#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_INVALID_ARGUMENT"); +#endif + return CHIP_ERROR_INVALID_ARGUMENT; + } + strcpy(mDeviceName, deviceName); + mFlags.Set(Flags::kDeviceNameSet); + mFlags.Set(Flags::kRestartAdvertising); + ChipLogProgress(DeviceLayer, "Setting device name to : \"%s\"", mDeviceName); + } + else + { + mDeviceName[0] = 0; + } + + PostDriveBLEState(); + +#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + ChipLogProgress(DeviceLayer, "_SetDeviceName Ended"); +#endif + return CHIP_NO_ERROR; +} + +uint16_t AbstractBLEManagerImpl::_NumConnections(void) +{ + uint16_t numCons = 0; + for (uint16_t i = 0; i < kMaxConnections; i++) + { + if (mBleConnections[i].allocated) + { + numCons++; + } + } + + return numCons; +} + +void AbstractBLEManagerImpl::HandleBootEvent(void) +{ + mFlags.Set(Flags::kSiLabsBLEStackInitialize); + PostDriveBLEState(); +} + +void AbstractBLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) +{ + switch (event->Type) + { + case DeviceEventType::kCHIPoBLESubscribe: { + ChipDeviceEvent connEstEvent; + + ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLESubscribe"); + HandleSubscribeReceived(event->CHIPoBLESubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); + connEstEvent.Type = DeviceEventType::kCHIPoBLEConnectionEstablished; + PlatformMgr().PostEventOrDie(&connEstEvent); + } + break; + + case DeviceEventType::kCHIPoBLEUnsubscribe: { + ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEUnsubscribe"); + HandleUnsubscribeReceived(event->CHIPoBLEUnsubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); + } + break; + + case DeviceEventType::kCHIPoBLEWriteReceived: { + ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEWriteReceived"); + HandleWriteReceived(event->CHIPoBLEWriteReceived.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_1_UUID, + PacketBufferHandle::Adopt(event->CHIPoBLEWriteReceived.Data)); + } + break; + + case DeviceEventType::kCHIPoBLEConnectionError: { + ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEConnectionError"); + HandleConnectionError(event->CHIPoBLEConnectionError.ConId, event->CHIPoBLEConnectionError.Reason); + } + break; + + case DeviceEventType::kCHIPoBLEIndicateConfirm: { + ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEIndicateConfirm"); + HandleIndicationConfirmation(event->CHIPoBLEIndicateConfirm.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); + } + break; + + default: + ChipLogProgress(DeviceLayer, "_OnPlatformEvent default: event->Type = %d", event->Type); + break; + } +} + +CHIP_ERROR AbstractBLEManagerImpl::SubscribeCharacteristic(BLE_CONNECTION_OBJECT, const Ble::ChipBleUUID *, + const Ble::ChipBleUUID *) +{ + ChipLogProgress(DeviceLayer, "AbstractBLEManagerImpl::SubscribeCharacteristic() not supported"); + return CHIP_ERROR_NOT_IMPLEMENTED; +} + +CHIP_ERROR AbstractBLEManagerImpl::UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT, const Ble::ChipBleUUID *, + const Ble::ChipBleUUID *) +{ + ChipLogProgress(DeviceLayer, "AbstractBLEManagerImpl::UnsubscribeCharacteristic() not supported"); + return CHIP_ERROR_NOT_IMPLEMENTED; +} + +CHIP_ERROR AbstractBLEManagerImpl::SendWriteRequest(BLE_CONNECTION_OBJECT, const Ble::ChipBleUUID *, const Ble::ChipBleUUID *, + System::PacketBufferHandle) +{ + ChipLogProgress(DeviceLayer, "AbstractBLEManagerImpl::SendWriteRequest() not supported"); + return CHIP_ERROR_NOT_IMPLEMENTED; +} + +bool AbstractBLEManagerImpl::RemoveConnection(uint8_t connectionHandle) +{ + BLEConState * bleConnState = GetConnectionState(connectionHandle, true); + bool status = false; + + if (bleConnState != nullptr) + { + memset(bleConnState, 0, sizeof(BLEConState)); + status = true; + } + + return status; +} + +void AbstractBLEManagerImpl::AddConnection(uint8_t connectionHandle, uint8_t bondingHandle) +{ + BLEConState * bleConnState = GetConnectionState(connectionHandle, true); + + if (bleConnState != nullptr) + { + memset(bleConnState, 0, sizeof(BLEConState)); + bleConnState->allocated = 1; + bleConnState->connectionHandle = connectionHandle; + bleConnState->bondingHandle = bondingHandle; + } +} + +AbstractBLEManagerImpl::BLEConState * AbstractBLEManagerImpl::GetConnectionState(uint8_t connectionHandle, bool allocate) +{ + uint8_t freeIndex = kMaxConnections; + + for (uint8_t i = 0; i < kMaxConnections; i++) + { + if (mBleConnections[i].allocated == 1) + { + if (mBleConnections[i].connectionHandle == connectionHandle) + { + return &mBleConnections[i]; + } + } + else if (i < freeIndex) + { + freeIndex = i; + } + } + + if (allocate) + { + if (freeIndex < kMaxConnections) + { + return &mBleConnections[freeIndex]; + } + + ChipLogError(DeviceLayer, "Failed to allocate BLEConState"); + } + + return nullptr; +} + +uint8_t AbstractBLEManagerImpl::GetTimerHandle(uint8_t connectionHandle, bool allocate) +{ + uint8_t freeIndex = kMaxConnections; + + for (uint8_t i = 0; i < kMaxConnections; i++) + { + if (mIndConfId[i] == connectionHandle) + { + return i; + } + else if (allocate && i < freeIndex) + { + freeIndex = i; + } + } + + if (freeIndex < kMaxConnections) + { + mIndConfId[freeIndex] = connectionHandle; + } + else if (allocate) + { + ChipLogError(DeviceLayer, "Failed to Save Conn Handle for indication"); + } + + return freeIndex; +} + +CHIP_ERROR AbstractBLEManagerImpl::MapBLEError(int bleErr) +{ + switch (bleErr) + { + case SL_STATUS_OK: + return CHIP_NO_ERROR; + case SL_STATUS_BT_ATT_INVALID_ATT_LENGTH: + return CHIP_ERROR_INVALID_STRING_LENGTH; + case SL_STATUS_INVALID_PARAMETER: + return CHIP_ERROR_INVALID_ARGUMENT; + case SL_STATUS_INVALID_STATE: + return CHIP_ERROR_INCORRECT_STATE; + case SL_STATUS_NOT_SUPPORTED: + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; + default: + return CHIP_ERROR(ChipError::Range::kPlatform, bleErr + CHIP_DEVICE_CONFIG_SILABS_BLE_ERROR_MIN); + } +} + +} // namespace Internal +} // namespace DeviceLayer +} // namespace chip + +#endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE diff --git a/src/platform/silabs/AbstractBLEManagerImpl.h b/src/platform/silabs/AbstractBLEManagerImpl.h new file mode 100644 index 0000000000..b8a0e3b89a --- /dev/null +++ b/src/platform/silabs/AbstractBLEManagerImpl.h @@ -0,0 +1,142 @@ +#pragma once + +#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE + +#include +#include + +#include + +#include "FreeRTOS.h" +#include "timers.h" + +#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) +#include "wfx_sl_ble_init.h" +#else +#include "gatt_db.h" +#include "sl_bgapi.h" +#include "sl_bt_api.h" +#include +#include +#endif // (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + +namespace chip { +namespace DeviceLayer { +namespace Internal { + +using namespace chip::Ble; + +struct ChipDeviceEvent; + +class AbstractBLEManagerImpl : public BLEManager, + private BleLayer, + private BlePlatformDelegate, + private BleApplicationDelegate +{ +public: + virtual ~AbstractBLEManagerImpl() = default; + + CHIP_ERROR _Init(void); + void _Shutdown() {} + bool _IsAdvertisingEnabled(void); + CHIP_ERROR _SetAdvertisingEnabled(bool val); + bool _IsAdvertising(void); + CHIP_ERROR _SetAdvertisingMode(BLEAdvertisingMode mode); + CHIP_ERROR _GetDeviceName(char * buf, size_t bufSize); + CHIP_ERROR _SetDeviceName(const char * deviceName); + uint16_t _NumConnections(void); + void _OnPlatformEvent(const ChipDeviceEvent * event); + BleLayer * _GetBleLayer(void); + void HandleBootEvent(void); + + CHIP_ERROR SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, + const Ble::ChipBleUUID * charId) override; + CHIP_ERROR UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, + const Ble::ChipBleUUID * charId) override; + CHIP_ERROR SendWriteRequest(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, + const Ble::ChipBleUUID * charId, System::PacketBufferHandle pBuf) override; + +protected: + AbstractBLEManagerImpl(); + + virtual CHIP_ERROR PlatformInit(void) = 0; + virtual void PostDriveBLEState(void) = 0; + CHIP_ERROR MapBLEError(int bleErr); + bool RemoveConnection(uint8_t connectionHandle); + void AddConnection(uint8_t connectionHandle, uint8_t bondingHandle); + BLEConState * GetConnectionState(uint8_t conId, bool allocate = false); + uint8_t GetTimerHandle(uint8_t connectionHandle, bool allocate); + +protected: + enum class Flags : uint16_t + { + kAdvertisingEnabled = 0x0001, + kFastAdvertisingEnabled = 0x0002, + kAdvertising = 0x0004, + kRestartAdvertising = 0x0008, + kSiLabsBLEStackInitialize = 0x0010, + kDeviceNameSet = 0x0020, + kExtAdvertisingEnabled = 0x0040, + }; + + enum + { + kMaxConnections = BLE_LAYER_NUM_BLE_ENDPOINTS, + kMaxDeviceNameLength = 21, + kUnusedIndex = 0xFF, + }; + + static constexpr uint8_t kFlagTlvSize = 3; + static constexpr uint8_t kUUIDTlvSize = 4; + static constexpr uint8_t kDeviceNameTlvSize = (2 + kMaxDeviceNameLength); + +#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + struct BLEConState + { + uint16_t mtu : 10; + uint16_t allocated : 1; + uint16_t subscribed : 1; + uint16_t unused : 4; + uint8_t connectionHandle; + uint8_t bondingHandle; + }; +#endif + + BLEConState mBleConnections[kMaxConnections]; + uint8_t mIndConfId[kMaxConnections]; + CHIPoBLEServiceMode mServiceMode; + BitFlags mFlags; + char mDeviceName[kMaxDeviceNameLength + 1]; + uint8_t mAdvertisingSetHandle = 0xff; +#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING + PacketBufferHandle c3AdditionalDataBufferHandle; +#endif + +#if !(SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + BLEChannel * mBleSideChannel = nullptr; +#endif +}; + +inline AbstractBLEManagerImpl::AbstractBLEManagerImpl() = default; + +inline BleLayer * AbstractBLEManagerImpl::_GetBleLayer() +{ + return this; +} + +inline bool AbstractBLEManagerImpl::_IsAdvertisingEnabled(void) +{ + return mFlags.Has(Flags::kAdvertisingEnabled); +} + +inline bool AbstractBLEManagerImpl::_IsAdvertising(void) +{ + return mFlags.Has(Flags::kAdvertising); +} + +} // namespace Internal +} // namespace DeviceLayer +} // namespace chip + +#endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE + diff --git a/src/platform/silabs/BLEManagerImpl.h b/src/platform/silabs/BLEManagerImpl.h index 73c97b80f8..93b7119507 100644 --- a/src/platform/silabs/BLEManagerImpl.h +++ b/src/platform/silabs/BLEManagerImpl.h @@ -24,17 +24,8 @@ #pragma once #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE -#include "FreeRTOS.h" -#include "timers.h" -#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) -#include "wfx_sl_ble_init.h" -#else -#include "gatt_db.h" -#include "sl_bgapi.h" -#include "sl_bt_api.h" -#include -#include -#endif // (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) + +#include "AbstractBLEManagerImpl.h" namespace chip { namespace DeviceLayer { @@ -43,14 +34,12 @@ namespace Internal { using namespace chip::Ble; /** - * Concrete implementation of the BLEManager singleton object for the EFR32 platforms. + * Concrete implementation of the BLEManager singleton object for the Silicon Labs platforms. */ -class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePlatformDelegate, private BleApplicationDelegate +class BLEManagerImpl final : public AbstractBLEManagerImpl { public: - void HandleBootEvent(void); - #if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) // Used for posting the event in the BLE queue void BlePostEvent(SilabsBleWrapper::BleEvent_t * event); @@ -150,132 +139,43 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla #endif private: - // Allow the BLEManager interface class to delegate method calls to - // the implementation methods provided by this class. friend BLEManager; + friend BLEManager & BLEMgr(void); + friend BLEManagerImpl & BLEMgrImpl(void); #if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - // rs91x BLE task handling osMessageQueueId_t sBleEventQueue = NULL; static void sl_ble_event_handling_task(void * args); void sl_ble_init(); void ProcessEvent(SilabsBleWrapper::BleEvent_t inEvent); #endif - // ===== Members that implement the BLEManager internal interface. - - CHIP_ERROR _Init(void); - void _Shutdown() {} - bool _IsAdvertisingEnabled(void); - CHIP_ERROR _SetAdvertisingEnabled(bool val); - bool _IsAdvertising(void); - CHIP_ERROR _SetAdvertisingMode(BLEAdvertisingMode mode); - CHIP_ERROR _GetDeviceName(char * buf, size_t bufSize); - CHIP_ERROR _SetDeviceName(const char * deviceName); - uint16_t _NumConnections(void); - void _OnPlatformEvent(const ChipDeviceEvent * event); - BleLayer * _GetBleLayer(void); - - // ===== Members that implement virtual methods on BlePlatformDelegate. - - CHIP_ERROR SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, - const Ble::ChipBleUUID * charId) override; - CHIP_ERROR UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, - const Ble::ChipBleUUID * charId) override; + CHIP_ERROR PlatformInit(void) override; + void PostDriveBLEState(void) override; CHIP_ERROR CloseConnection(BLE_CONNECTION_OBJECT conId) override; uint16_t GetMTU(BLE_CONNECTION_OBJECT conId) const override; CHIP_ERROR SendIndication(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, const Ble::ChipBleUUID * charId, System::PacketBufferHandle pBuf) override; - CHIP_ERROR SendWriteRequest(BLE_CONNECTION_OBJECT conId, const Ble::ChipBleUUID * svcId, const Ble::ChipBleUUID * charId, - System::PacketBufferHandle pBuf) override; - - // ===== Members that implement virtual methods on BleApplicationDelegate. - void NotifyChipConnectionClosed(BLE_CONNECTION_OBJECT conId) override; - // ===== Members for internal use by the following friends. - - friend BLEManager & BLEMgr(void); - friend BLEManagerImpl & BLEMgrImpl(void); - - static BLEManagerImpl sInstance; - - // ===== Private members reserved for use by this class only. - enum class Flags : uint16_t - { - kAdvertisingEnabled = 0x0001, - kFastAdvertisingEnabled = 0x0002, - kAdvertising = 0x0004, - kRestartAdvertising = 0x0008, - kSiLabsBLEStackInitialize = 0x0010, - kDeviceNameSet = 0x0020, - kExtAdvertisingEnabled = 0x0040, - }; - - enum - { - kMaxConnections = BLE_LAYER_NUM_BLE_ENDPOINTS, - kMaxDeviceNameLength = 21, - kUnusedIndex = 0xFF, - }; - - static constexpr uint8_t kFlagTlvSize = 3; // 1 byte for length, 1b for type and 1b for the Flag value - static constexpr uint8_t kUUIDTlvSize = 4; // 1 byte for length, 1b for type and 2b for the UUID value - static constexpr uint8_t kDeviceNameTlvSize = (2 + kMaxDeviceNameLength); // 1 byte for length, 1b for type and + device name - -#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - // Declared in BLEChannel.h now. - struct BLEConState - { - uint16_t mtu : 10; - uint16_t allocated : 1; - uint16_t subscribed : 1; - uint16_t unused : 4; - uint8_t connectionHandle; - uint8_t bondingHandle; - }; -#endif - - BLEConState mBleConnections[kMaxConnections]; - uint8_t mIndConfId[kMaxConnections]; - CHIPoBLEServiceMode mServiceMode; - BitFlags mFlags; - char mDeviceName[kMaxDeviceNameLength + 1]; - // The advertising set handle allocated from Bluetooth stack. - uint8_t mAdvertisingSetHandle = 0xff; -#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING - PacketBufferHandle c3AdditionalDataBufferHandle; -#endif - -#if !(SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - BLEChannel * mBleSideChannel = nullptr; -#endif // !(SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - - CHIP_ERROR MapBLEError(int bleErr); void DriveBLEState(void); + static void DriveBLEState(intptr_t arg); + static void BleAdvTimeoutHandler(void * arg); CHIP_ERROR ConfigureAdvertisingData(void); #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING CHIP_ERROR EncodeAdditionalDataTlv(); #endif #if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - void HandleRXCharWrite(const SilabsBleWrapper::sl_wfx_msg_t & evt); -#else - void HandleRXCharWrite(volatile sl_bt_msg_t * evt); -#endif - bool RemoveConnection(uint8_t connectionHandle); - void AddConnection(uint8_t connectionHandle, uint8_t bondingHandle); void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs); void CancelBleAdvTimeoutTimer(void); - BLEConState * GetConnectionState(uint8_t conId, bool allocate = false); - static void DriveBLEState(intptr_t arg); - static void BleAdvTimeoutHandler(void * arg); - uint8_t GetTimerHandle(uint8_t connectionHandle, bool allocate); - -#if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) -protected: static void OnSendIndicationTimeout(System::Layer * aLayer, void * appState); +#else + void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs); + void CancelBleAdvTimeoutTimer(void); #endif + + static BLEManagerImpl sInstance; }; /** @@ -300,21 +200,6 @@ inline BLEManagerImpl & BLEMgrImpl(void) return BLEManagerImpl::sInstance; } -inline BleLayer * BLEManagerImpl::_GetBleLayer() -{ - return this; -} - -inline bool BLEManagerImpl::_IsAdvertisingEnabled(void) -{ - return mFlags.Has(Flags::kAdvertisingEnabled); -} - -inline bool BLEManagerImpl::_IsAdvertising(void) -{ - return mFlags.Has(Flags::kAdvertising); -} - } // namespace Internal } // namespace DeviceLayer } // namespace chip diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn index 0346bb40f8..7f983c4252 100644 --- a/src/platform/silabs/SiWx917/BUILD.gn +++ b/src/platform/silabs/SiWx917/BUILD.gn @@ -38,42 +38,43 @@ source_set("logging") { } static_library("SiWx917") { - sources = [ - "${silabs_platform_dir}/BLEManagerImpl.h", - "${silabs_platform_dir}/BlePlatformConfig.h", - "${silabs_platform_dir}/CHIPDevicePlatformConfig.h", - "${silabs_platform_dir}/CHIPDevicePlatformEvent.h", - "${silabs_platform_dir}/CHIPMem-Platform.cpp", - "${silabs_platform_dir}/CHIPPlatformConfig.h", - "${silabs_platform_dir}/ConfigurationManagerImpl.cpp", - "${silabs_platform_dir}/ConfigurationManagerImpl.h", - "${silabs_platform_dir}/ConnectivityManagerImpl.h", - "${silabs_platform_dir}/ConnectivityManagerImpl_WIFI.cpp", - "${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp", - "${silabs_platform_dir}/DiagnosticDataProviderImpl.h", - "${silabs_platform_dir}/InetPlatformConfig.h", - "${silabs_platform_dir}/KeyValueStoreManagerImpl.cpp", - "${silabs_platform_dir}/KeyValueStoreManagerImpl.h", - "${silabs_platform_dir}/MigrationManager.cpp", - "${silabs_platform_dir}/MigrationManager.h", - "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.cpp", - "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h", - "${silabs_platform_dir}/PlatformManagerImpl.cpp", - "${silabs_platform_dir}/PlatformManagerImpl.h", - "${silabs_platform_dir}/SilabsConfig.cpp", - "${silabs_platform_dir}/SilabsConfig.h", - "${silabs_platform_dir}/SystemPlatformConfig.h", - "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.cpp", - "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.h", - "${silabs_platform_dir}/platformAbstraction/SilabsPlatformBase.h", - "${silabs_platform_dir}/platformAbstraction/WiseMcuSpam.cpp", - "../../FreeRTOS/SystemTimeSupport.cpp", - "../../SingletonConfigurationManager.cpp", - "../rs911x/BLEManagerImpl.cpp", - "../rs911x/rsi_ble_config.h", - "../rs911x/wfx_sl_ble_init.cpp", - "../rs911x/wfx_sl_ble_init.h", - "SiWxPlatformInterface.h", + sources = [ + "${silabs_platform_dir}/AbstractBLEManagerImpl.cpp", + "${silabs_platform_dir}/BLEManagerImpl.h", + "${silabs_platform_dir}/BlePlatformConfig.h", + "${silabs_platform_dir}/CHIPDevicePlatformConfig.h", + "${silabs_platform_dir}/CHIPDevicePlatformEvent.h", + "${silabs_platform_dir}/CHIPMem-Platform.cpp", + "${silabs_platform_dir}/CHIPPlatformConfig.h", + "${silabs_platform_dir}/ConfigurationManagerImpl.cpp", + "${silabs_platform_dir}/ConfigurationManagerImpl.h", + "${silabs_platform_dir}/ConnectivityManagerImpl.h", + "${silabs_platform_dir}/ConnectivityManagerImpl_WIFI.cpp", + "${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp", + "${silabs_platform_dir}/DiagnosticDataProviderImpl.h", + "${silabs_platform_dir}/InetPlatformConfig.h", + "${silabs_platform_dir}/KeyValueStoreManagerImpl.cpp", + "${silabs_platform_dir}/KeyValueStoreManagerImpl.h", + "${silabs_platform_dir}/MigrationManager.cpp", + "${silabs_platform_dir}/MigrationManager.h", + "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.cpp", + "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h", + "${silabs_platform_dir}/PlatformManagerImpl.cpp", + "${silabs_platform_dir}/PlatformManagerImpl.h", + "${silabs_platform_dir}/SilabsConfig.cpp", + "${silabs_platform_dir}/SilabsConfig.h", + "${silabs_platform_dir}/SystemPlatformConfig.h", + "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.cpp", + "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.h", + "${silabs_platform_dir}/platformAbstraction/SilabsPlatformBase.h", + "${silabs_platform_dir}/platformAbstraction/WiseMcuSpam.cpp", + "../../FreeRTOS/SystemTimeSupport.cpp", + "../../SingletonConfigurationManager.cpp", + "../rs911x/BLEManagerImpl.cpp", + "../rs911x/rsi_ble_config.h", + "../rs911x/wfx_sl_ble_init.cpp", + "../rs911x/wfx_sl_ble_init.h", + "SiWxPlatformInterface.h", ] public_deps = [ diff --git a/src/platform/silabs/efr32/BLEManagerImpl.cpp b/src/platform/silabs/efr32/BLEManagerImpl.cpp index b5efde3bf7..e15ce52812 100644 --- a/src/platform/silabs/efr32/BLEManagerImpl.cpp +++ b/src/platform/silabs/efr32/BLEManagerImpl.cpp @@ -126,7 +126,7 @@ bool isMATTERoBLECharacteristic(uint16_t characteristic) BLEManagerImpl BLEManagerImpl::sInstance; -CHIP_ERROR BLEManagerImpl::_Init() +CHIP_ERROR BLEManagerImpl::PlatformInit() { // Initialize the CHIP BleLayer. ReturnErrorOnFailure(BleLayer::Init(this, this, &DeviceLayer::SystemLayer())); @@ -161,151 +161,15 @@ CHIP_ERROR BLEManagerImpl::_Init() randomizedAddr.addr[5] |= 0xC0; } - PlatformMgr().ScheduleWork(DriveBLEState, 0); - return CHIP_NO_ERROR; -} - -uint16_t BLEManagerImpl::_NumConnections(void) -{ - uint16_t numCons = 0; - for (uint16_t i = 0; i < kMaxConnections; i++) - { - if (mBleConnections[i].allocated) - { - numCons++; - } - } - - return numCons; -} - -CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val) -{ - CHIP_ERROR err = CHIP_NO_ERROR; - - VerifyOrExit(mServiceMode != ConnectivityManager::kCHIPoBLEServiceMode_NotSupported, err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE); - - if (mFlags.Has(Flags::kAdvertisingEnabled) != val) - { - mFlags.Set(Flags::kAdvertisingEnabled, val); - PlatformMgr().ScheduleWork(DriveBLEState, 0); - } - -exit: - return err; -} - -CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode) -{ - switch (mode) - { - case BLEAdvertisingMode::kFastAdvertising: - mFlags.Set(Flags::kFastAdvertisingEnabled, true); - break; - case BLEAdvertisingMode::kSlowAdvertising: - mFlags.Set(Flags::kFastAdvertisingEnabled, false); - break; - default: - return CHIP_ERROR_INVALID_ARGUMENT; - } - mFlags.Set(Flags::kRestartAdvertising); - PlatformMgr().ScheduleWork(DriveBLEState, 0); - return CHIP_NO_ERROR; -} - -CHIP_ERROR BLEManagerImpl::_GetDeviceName(char * buf, size_t bufSize) -{ - if (strlen(mDeviceName) >= bufSize) - { - return CHIP_ERROR_BUFFER_TOO_SMALL; - } - strcpy(buf, mDeviceName); + PostDriveBLEState(); return CHIP_NO_ERROR; } -CHIP_ERROR BLEManagerImpl::_SetDeviceName(const char * deviceName) +void BLEManagerImpl::PostDriveBLEState(void) { - if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_NotSupported) - { - return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; - } - if (deviceName != NULL && deviceName[0] != 0) - { - if (strlen(deviceName) >= kMaxDeviceNameLength) - { - return CHIP_ERROR_INVALID_ARGUMENT; - } - strcpy(mDeviceName, deviceName); - mFlags.Set(Flags::kDeviceNameSet); - mFlags.Set(Flags::kRestartAdvertising); - ChipLogProgress(DeviceLayer, "Setting device name to : \"%s\"", mDeviceName); - } - else - { - mDeviceName[0] = 0; - } PlatformMgr().ScheduleWork(DriveBLEState, 0); - return CHIP_NO_ERROR; -} - -void BLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) -{ - switch (event->Type) - { - case DeviceEventType::kCHIPoBLESubscribe: { - ChipDeviceEvent connEstEvent; - - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLESubscribe"); - HandleSubscribeReceived(event->CHIPoBLESubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); - connEstEvent.Type = DeviceEventType::kCHIPoBLEConnectionEstablished; - PlatformMgr().PostEventOrDie(&connEstEvent); - } - break; - - case DeviceEventType::kCHIPoBLEUnsubscribe: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEUnsubscribe"); - HandleUnsubscribeReceived(event->CHIPoBLEUnsubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); - } - break; - - case DeviceEventType::kCHIPoBLEWriteReceived: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEWriteReceived"); - HandleWriteReceived(event->CHIPoBLEWriteReceived.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_1_UUID, - PacketBufferHandle::Adopt(event->CHIPoBLEWriteReceived.Data)); - } - break; - - case DeviceEventType::kCHIPoBLEConnectionError: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEConnectionError"); - HandleConnectionError(event->CHIPoBLEConnectionError.ConId, event->CHIPoBLEConnectionError.Reason); - } - break; - - case DeviceEventType::kCHIPoBLEIndicateConfirm: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEIndicateConfirm"); - HandleIndicationConfirmation(event->CHIPoBLEIndicateConfirm.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); - } - break; - - default: - ChipLogProgress(DeviceLayer, "_OnPlatformEvent default: event->Type = %d", event->Type); - break; - } -} - -CHIP_ERROR BLEManagerImpl::SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, - const ChipBleUUID * charId) -{ - ChipLogProgress(DeviceLayer, "BLEManagerImpl::SubscribeCharacteristic() not supported"); - return CHIP_ERROR_NOT_IMPLEMENTED; } -CHIP_ERROR BLEManagerImpl::UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, - const ChipBleUUID * charId) -{ - ChipLogProgress(DeviceLayer, "BLEManagerImpl::UnsubscribeCharacteristic() not supported"); - return CHIP_ERROR_NOT_IMPLEMENTED; -} CHIP_ERROR BLEManagerImpl::CloseConnection(BLE_CONNECTION_OBJECT conId) { @@ -353,37 +217,11 @@ CHIP_ERROR BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const Chi return err; } -CHIP_ERROR BLEManagerImpl::SendWriteRequest(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, const ChipBleUUID * charId, - PacketBufferHandle pBuf) -{ - ChipLogProgress(DeviceLayer, "BLEManagerImpl::SendWriteRequest() not supported"); - return CHIP_ERROR_NOT_IMPLEMENTED; -} - void BLEManagerImpl::NotifyChipConnectionClosed(BLE_CONNECTION_OBJECT conId) { CloseConnection(conId); } -CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr) -{ - switch (bleErr) - { - case SL_STATUS_OK: - return CHIP_NO_ERROR; - case SL_STATUS_BT_ATT_INVALID_ATT_LENGTH: - return CHIP_ERROR_INVALID_STRING_LENGTH; - case SL_STATUS_INVALID_PARAMETER: - return CHIP_ERROR_INVALID_ARGUMENT; - case SL_STATUS_INVALID_STATE: - return CHIP_ERROR_INCORRECT_STATE; - case SL_STATUS_NOT_SUPPORTED: - return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; - default: - return CHIP_ERROR(ChipError::Range::kPlatform, bleErr + CHIP_DEVICE_CONFIG_SILABS_BLE_ERROR_MIN); - } -} - void BLEManagerImpl::DriveBLEState(void) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -770,12 +608,6 @@ void BLEManagerImpl::UpdateMtu(volatile sl_bt_msg_t * evt) } } -void BLEManagerImpl::HandleBootEvent(void) -{ - mFlags.Set(Flags::kSiLabsBLEStackInitialize); - PlatformMgr().ScheduleWork(DriveBLEState, 0); -} - void BLEManagerImpl::HandleConnectEvent(volatile sl_bt_msg_t * evt) { @@ -1045,66 +877,6 @@ void BLEManagerImpl::HandleSoftTimerEvent(volatile sl_bt_msg_t * evt) } } -bool BLEManagerImpl::RemoveConnection(uint8_t connectionHandle) -{ - BLEConState * bleConnState = GetConnectionState(connectionHandle, true); - bool status = false; - - if (bleConnState != NULL) - { - memset(bleConnState, 0, sizeof(BLEConState)); - status = true; - } - - return status; -} - -void BLEManagerImpl::AddConnection(uint8_t connectionHandle, uint8_t bondingHandle) -{ - BLEConState * bleConnState = GetConnectionState(connectionHandle, true); - - if (bleConnState != NULL) - { - memset(bleConnState, 0, sizeof(BLEConState)); - bleConnState->allocated = 1; - bleConnState->connectionHandle = connectionHandle; - bleConnState->bondingHandle = bondingHandle; - } -} - -BLEConState * BLEManagerImpl::GetConnectionState(uint8_t connectionHandle, bool allocate) -{ - uint8_t freeIndex = kMaxConnections; - - for (uint8_t i = 0; i < kMaxConnections; i++) - { - if (mBleConnections[i].allocated == 1) - { - if (mBleConnections[i].connectionHandle == connectionHandle) - { - return &mBleConnections[i]; - } - } - - else if (i < freeIndex) - { - freeIndex = i; - } - } - - if (allocate) - { - if (freeIndex < kMaxConnections) - { - return &mBleConnections[freeIndex]; - } - - ChipLogError(DeviceLayer, "Failed to allocate BLEConState"); - } - - return NULL; -} - #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING CHIP_ERROR BLEManagerImpl::EncodeAdditionalDataTlv() { @@ -1154,37 +926,6 @@ void BLEManagerImpl::HandleC3ReadRequest(volatile sl_bt_msg_t * evt) } #endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING -uint8_t BLEManagerImpl::GetTimerHandle(uint8_t connectionHandle, bool allocate) -{ - uint8_t freeIndex = kMaxConnections; - - for (uint8_t i = 0; i < kMaxConnections; i++) - { - if (mIndConfId[i] == connectionHandle) - { - return i; - } - else if (allocate) - { - if (i < freeIndex) - { - freeIndex = i; - } - } - } - - if (freeIndex < kMaxConnections) - { - mIndConfId[freeIndex] = connectionHandle; - } - else - { - ChipLogError(DeviceLayer, "Failed to Save Conn Handle for indication"); - } - - return freeIndex; -} - void BLEManagerImpl::BleAdvTimeoutHandler(void * arg) { if (BLEMgrImpl().mFlags.Has(Flags::kFastAdvertisingEnabled)) diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn index b3edc814de..f4dd8ac834 100644 --- a/src/platform/silabs/efr32/BUILD.gn +++ b/src/platform/silabs/efr32/BUILD.gn @@ -42,33 +42,34 @@ source_set("logging") { } static_library("efr32") { - sources = [ - "${silabs_platform_dir}/BLEManagerImpl.h", - "${silabs_platform_dir}/BlePlatformConfig.h", - "${silabs_platform_dir}/CHIPDevicePlatformConfig.h", - "${silabs_platform_dir}/CHIPDevicePlatformEvent.h", - "${silabs_platform_dir}/CHIPMem-Platform.cpp", - "${silabs_platform_dir}/CHIPPlatformConfig.h", - "${silabs_platform_dir}/ConfigurationManagerImpl.cpp", - "${silabs_platform_dir}/ConfigurationManagerImpl.h", - "${silabs_platform_dir}/ConnectivityManagerImpl.h", - "${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp", - "${silabs_platform_dir}/DiagnosticDataProviderImpl.h", - "${silabs_platform_dir}/InetPlatformConfig.h", - "${silabs_platform_dir}/KeyValueStoreManagerImpl.cpp", - "${silabs_platform_dir}/KeyValueStoreManagerImpl.h", - "${silabs_platform_dir}/MigrationManager.cpp", - "${silabs_platform_dir}/PlatformManagerImpl.cpp", - "${silabs_platform_dir}/PlatformManagerImpl.h", - "${silabs_platform_dir}/SilabsConfig.cpp", - "${silabs_platform_dir}/SilabsConfig.h", - "${silabs_platform_dir}/SystemPlatformConfig.h", - "${silabs_platform_dir}/platformAbstraction/GsdkSpam.cpp", - "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.cpp", - "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.h", - "${silabs_platform_dir}/platformAbstraction/SilabsPlatformBase.h", - "../../FreeRTOS/SystemTimeSupport.cpp", - "../../SingletonConfigurationManager.cpp", + sources = [ + "${silabs_platform_dir}/AbstractBLEManagerImpl.cpp", + "${silabs_platform_dir}/BLEManagerImpl.h", + "${silabs_platform_dir}/BlePlatformConfig.h", + "${silabs_platform_dir}/CHIPDevicePlatformConfig.h", + "${silabs_platform_dir}/CHIPDevicePlatformEvent.h", + "${silabs_platform_dir}/CHIPMem-Platform.cpp", + "${silabs_platform_dir}/CHIPPlatformConfig.h", + "${silabs_platform_dir}/ConfigurationManagerImpl.cpp", + "${silabs_platform_dir}/ConfigurationManagerImpl.h", + "${silabs_platform_dir}/ConnectivityManagerImpl.h", + "${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp", + "${silabs_platform_dir}/DiagnosticDataProviderImpl.h", + "${silabs_platform_dir}/InetPlatformConfig.h", + "${silabs_platform_dir}/KeyValueStoreManagerImpl.cpp", + "${silabs_platform_dir}/KeyValueStoreManagerImpl.h", + "${silabs_platform_dir}/MigrationManager.cpp", + "${silabs_platform_dir}/PlatformManagerImpl.cpp", + "${silabs_platform_dir}/PlatformManagerImpl.h", + "${silabs_platform_dir}/SilabsConfig.cpp", + "${silabs_platform_dir}/SilabsConfig.h", + "${silabs_platform_dir}/SystemPlatformConfig.h", + "${silabs_platform_dir}/platformAbstraction/GsdkSpam.cpp", + "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.cpp", + "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.h", + "${silabs_platform_dir}/platformAbstraction/SilabsPlatformBase.h", + "../../FreeRTOS/SystemTimeSupport.cpp", + "../../SingletonConfigurationManager.cpp", ] if (chip_enable_ble_rs911x) { diff --git a/src/platform/silabs/rs911x/BLEManagerImpl.cpp b/src/platform/silabs/rs911x/BLEManagerImpl.cpp index 4670732347..c0fe79e84b 100644 --- a/src/platform/silabs/rs911x/BLEManagerImpl.cpp +++ b/src/platform/silabs/rs911x/BLEManagerImpl.cpp @@ -298,7 +298,7 @@ void BLEManagerImpl::sl_ble_init() chip::DeviceLayer::Internal::BLEMgrImpl().HandleBootEvent(); } -CHIP_ERROR BLEManagerImpl::_Init() +CHIP_ERROR BLEManagerImpl::PlatformInit() { CHIP_ERROR err; @@ -319,12 +319,17 @@ CHIP_ERROR BLEManagerImpl::_Init() mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART); mFlags.Set(Flags::kFastAdvertisingEnabled, true); - PlatformMgr().ScheduleWork(DriveBLEState, 0); + PostDriveBLEState(); exit: return err; } +void BLEManagerImpl::PostDriveBLEState(void) +{ + PlatformMgr().ScheduleWork(DriveBLEState, 0); +} + void BLEManagerImpl::OnSendIndicationTimeout(System::Layer * aLayer, void * appState) { // TODO: change the connection handle with the ble device ID @@ -337,151 +342,6 @@ void BLEManagerImpl::OnSendIndicationTimeout(System::Layer * aLayer, void * appS PlatformMgr().PostEventOrDie(&event); } -uint16_t BLEManagerImpl::_NumConnections(void) -{ - uint16_t numCons = 0; - for (uint16_t i = 0; i < kMaxConnections; i++) - { - if (mBleConnections[i].allocated) - { - numCons++; - } - } - - return numCons; -} - -CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val) -{ - CHIP_ERROR err = CHIP_NO_ERROR; - - VerifyOrExit(mServiceMode != ConnectivityManager::kCHIPoBLEServiceMode_NotSupported, err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE); - - if (mFlags.Has(Flags::kAdvertisingEnabled) != val) - { - mFlags.Set(Flags::kAdvertisingEnabled, val); - PlatformMgr().ScheduleWork(DriveBLEState, 0); - } - -exit: - return err; -} - -CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode) -{ - switch (mode) - { - case BLEAdvertisingMode::kFastAdvertising: - mFlags.Set(Flags::kFastAdvertisingEnabled, true); - break; - case BLEAdvertisingMode::kSlowAdvertising: - mFlags.Set(Flags::kFastAdvertisingEnabled, false); - break; - default: - return CHIP_ERROR_INVALID_ARGUMENT; - } - mFlags.Set(Flags::kRestartAdvertising); - PlatformMgr().ScheduleWork(DriveBLEState, 0); - return CHIP_NO_ERROR; -} - -CHIP_ERROR BLEManagerImpl::_GetDeviceName(char * buf, size_t bufSize) -{ - if (strlen(mDeviceName) >= bufSize) - { - return CHIP_ERROR_BUFFER_TOO_SMALL; - } - strcpy(buf, mDeviceName); - return CHIP_NO_ERROR; -} - -CHIP_ERROR BLEManagerImpl::_SetDeviceName(const char * deviceName) -{ - ChipLogProgress(DeviceLayer, "_SetDeviceName Started"); - if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_NotSupported) - { - ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE"); - return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; - } - if (deviceName != NULL && deviceName[0] != 0) - { - if (strlen(deviceName) >= kMaxDeviceNameLength) - { - ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_INVALID_ARGUMENT"); - return CHIP_ERROR_INVALID_ARGUMENT; - } - strcpy(mDeviceName, deviceName); - mFlags.Set(Flags::kDeviceNameSet); - mFlags.Set(Flags::kRestartAdvertising); - ChipLogProgress(DeviceLayer, "Setting device name to : \"%s\"", mDeviceName); - } - else - { - mDeviceName[0] = 0; - } - PlatformMgr().ScheduleWork(DriveBLEState, 0); - ChipLogProgress(DeviceLayer, "_SetDeviceName Ended"); - return CHIP_NO_ERROR; -} - -void BLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) -{ - switch (event->Type) - { - case DeviceEventType::kCHIPoBLESubscribe: { - ChipDeviceEvent connEstEvent; - - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLESubscribe"); - HandleSubscribeReceived(event->CHIPoBLESubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); - connEstEvent.Type = DeviceEventType::kCHIPoBLEConnectionEstablished; - PlatformMgr().PostEventOrDie(&connEstEvent); - } - break; - - case DeviceEventType::kCHIPoBLEUnsubscribe: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEUnsubscribe"); - HandleUnsubscribeReceived(event->CHIPoBLEUnsubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); - } - break; - - case DeviceEventType::kCHIPoBLEWriteReceived: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEWriteReceived"); - HandleWriteReceived(event->CHIPoBLEWriteReceived.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_1_UUID, - PacketBufferHandle::Adopt(event->CHIPoBLEWriteReceived.Data)); - } - break; - - case DeviceEventType::kCHIPoBLEConnectionError: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEConnectionError"); - HandleConnectionError(event->CHIPoBLEConnectionError.ConId, event->CHIPoBLEConnectionError.Reason); - } - break; - - case DeviceEventType::kCHIPoBLEIndicateConfirm: { - ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLEIndicateConfirm"); - HandleIndicationConfirmation(event->CHIPoBLEIndicateConfirm.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID); - } - break; - - default: - ChipLogProgress(DeviceLayer, "_OnPlatformEvent default: event->Type = %d", event->Type); - break; - } -} - -CHIP_ERROR BLEManagerImpl::SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, - const ChipBleUUID * charId) -{ - ChipLogProgress(DeviceLayer, "BLEManagerImpl::SubscribeCharacteristic() not supported"); - return CHIP_ERROR_NOT_IMPLEMENTED; -} - -CHIP_ERROR BLEManagerImpl::UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, - const ChipBleUUID * charId) -{ - ChipLogProgress(DeviceLayer, "BLEManagerImpl::UnsubscribeCharacteristic() not supported"); - return CHIP_ERROR_NOT_IMPLEMENTED; -} CHIP_ERROR BLEManagerImpl::CloseConnection(BLE_CONNECTION_OBJECT conId) { @@ -520,38 +380,12 @@ CHIP_ERROR BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const Chi return CHIP_NO_ERROR; } -CHIP_ERROR BLEManagerImpl::SendWriteRequest(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, const ChipBleUUID * charId, - PacketBufferHandle pBuf) -{ - ChipLogProgress(DeviceLayer, "BLEManagerImpl::SendWriteRequest() not supported"); - return CHIP_ERROR_NOT_IMPLEMENTED; -} - void BLEManagerImpl::NotifyChipConnectionClosed(BLE_CONNECTION_OBJECT conId) { // Nothing to do } // TODO: Need to add RSI BLE STATUS codes -CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr) -{ - switch (bleErr) - { - case SL_STATUS_OK: - return CHIP_NO_ERROR; - case SL_STATUS_BT_ATT_INVALID_ATT_LENGTH: - return CHIP_ERROR_INVALID_STRING_LENGTH; - case SL_STATUS_INVALID_PARAMETER: - return CHIP_ERROR_INVALID_ARGUMENT; - case SL_STATUS_INVALID_STATE: - return CHIP_ERROR_INCORRECT_STATE; - case SL_STATUS_NOT_SUPPORTED: - return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; - default: - return CHIP_ERROR(ChipError::Range::kPlatform, bleErr + CHIP_DEVICE_CONFIG_SILABS_BLE_ERROR_MIN); - } -} - void BLEManagerImpl::DriveBLEState(void) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -821,12 +655,6 @@ void BLEManagerImpl::UpdateMtu(const SilabsBleWrapper::sl_wfx_msg_t & evt) } } -void BLEManagerImpl::HandleBootEvent(void) -{ - mFlags.Set(Flags::kSiLabsBLEStackInitialize); - PlatformMgr().ScheduleWork(DriveBLEState, 0); -} - void BLEManagerImpl::HandleConnectEvent(const SilabsBleWrapper::sl_wfx_msg_t & evt) { AddConnection(evt.connectionHandle, evt.bondingHandle); @@ -968,66 +796,6 @@ void BLEManagerImpl::HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId) PlatformMgr().PostEventOrDie(&event); } -bool BLEManagerImpl::RemoveConnection(uint8_t connectionHandle) -{ - BLEConState * bleConnState = GetConnectionState(connectionHandle, true); - bool status = false; - - if (bleConnState != NULL) - { - memset(bleConnState, 0, sizeof(BLEConState)); - status = true; - } - - return status; -} - -void BLEManagerImpl::AddConnection(uint8_t connectionHandle, uint8_t bondingHandle) -{ - BLEConState * bleConnState = GetConnectionState(connectionHandle, true); - - if (bleConnState != NULL) - { - memset(bleConnState, 0, sizeof(BLEConState)); - bleConnState->allocated = 1; - bleConnState->connectionHandle = connectionHandle; - bleConnState->bondingHandle = bondingHandle; - } -} - -BLEManagerImpl::BLEConState * BLEManagerImpl::GetConnectionState(uint8_t connectionHandle, bool allocate) -{ - uint8_t freeIndex = kMaxConnections; - - for (uint8_t i = 0; i < kMaxConnections; i++) - { - if (mBleConnections[i].allocated == 1) - { - if (mBleConnections[i].connectionHandle == connectionHandle) - { - return &mBleConnections[i]; - } - } - - else if (i < freeIndex) - { - freeIndex = i; - } - } - - if (allocate) - { - if (freeIndex < kMaxConnections) - { - return &mBleConnections[freeIndex]; - } - - ChipLogError(DeviceLayer, "Failed to allocate BLEConState"); - } - - return NULL; -} - #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING CHIP_ERROR BLEManagerImpl::EncodeAdditionalDataTlv() {