From e8554de58c38077928ad66fc6cbccf3eec242c82 Mon Sep 17 00:00:00 2001 From: chirag-silabs <100861685+chirag-silabs@users.noreply.github.com> Date: Thu, 26 Sep 2024 00:17:23 +0530 Subject: [PATCH] [Silabs] Adding Queue for the ble events and removing the semaphore (#35522) * adding queue logic to the semaphore * removing the extern keyword for the queue * cleanup of ble defines and variables * Restyled by whitespace * restyling the PR * removing the temp change * restyling the PR * reverting BLEManagerImpl.h to fix * fixing the build for the 91x ncp * addressing review comments * Restyled by whitespace * Restyled by clang-format * modifying the file to have classes * restyling the PR * Restyled by whitespace * cleanup the unused from the .h file and fixing build * Addressing review comments --------- Co-authored-by: Restyled.io --- src/platform/silabs/BLEManagerImpl.h | 28 +- src/platform/silabs/SiWx917/BUILD.gn | 2 +- src/platform/silabs/efr32/BUILD.gn | 2 +- src/platform/silabs/rs911x/BLEManagerImpl.cpp | 331 ++++++++---------- src/platform/silabs/rs911x/rsi_ble_config.h | 10 - ...{wfx_sl_ble_init.c => wfx_sl_ble_init.cpp} | 197 ++++------- src/platform/silabs/rs911x/wfx_sl_ble_init.h | 122 ++++--- 7 files changed, 301 insertions(+), 391 deletions(-) rename src/platform/silabs/rs911x/{wfx_sl_ble_init.c => wfx_sl_ble_init.cpp} (63%) diff --git a/src/platform/silabs/BLEManagerImpl.h b/src/platform/silabs/BLEManagerImpl.h index 4ff6d9d85413bf..6d901db16e95db 100644 --- a/src/platform/silabs/BLEManagerImpl.h +++ b/src/platform/silabs/BLEManagerImpl.h @@ -30,9 +30,7 @@ #ifdef __cplusplus extern "C" { #endif // __cplusplus -#include -#include -#include +#include "wfx_sl_ble_init.h" #ifdef __cplusplus } #endif // __cplusplus @@ -58,12 +56,14 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla void HandleBootEvent(void); #if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - void HandleConnectEvent(void); - void HandleConnectionCloseEvent(uint16_t reason); - void HandleWriteEvent(rsi_ble_event_write_t evt); - void UpdateMtu(rsi_ble_event_mtu_t evt); + // Used for posting the event in the BLE queue + void BlePostEvent(SilabsBleWrapper::BleEvent_t * event); + void HandleConnectEvent(SilabsBleWrapper::sl_wfx_msg_t * evt); + void HandleConnectionCloseEvent(SilabsBleWrapper::sl_wfx_msg_t * evt); + void HandleWriteEvent(SilabsBleWrapper::sl_wfx_msg_t * evt); + void UpdateMtu(SilabsBleWrapper::sl_wfx_msg_t * evt); void HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId); - void HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt); + void HandleTXCharCCCDWrite(SilabsBleWrapper::sl_wfx_msg_t * evt); void HandleSoftTimerEvent(void); int32_t SendBLEAdvertisementCommand(void); #else @@ -80,7 +80,7 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING #if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - static void HandleC3ReadRequest(rsi_ble_read_req_t * rsi_ble_read_req); + static void HandleC3ReadRequest(SilabsBleWrapper::sl_wfx_msg_t * rsi_ble_read_req); #else #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING static void HandleC3ReadRequest(volatile sl_bt_msg_t * evt); @@ -93,6 +93,14 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla // the implementation methods provided by this class. friend BLEManager; +#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); @@ -186,7 +194,7 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla #endif #if (SLI_SI91X_ENABLE_BLE || RSI_BLE_ENABLE) - void HandleRXCharWrite(rsi_ble_event_write_t * evt); + void HandleRXCharWrite(SilabsBleWrapper::sl_wfx_msg_t * evt); #else void HandleRXCharWrite(volatile sl_bt_msg_t * evt); #endif diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn index 00021eba93f5f9..188f1f3396f7de 100644 --- a/src/platform/silabs/SiWx917/BUILD.gn +++ b/src/platform/silabs/SiWx917/BUILD.gn @@ -64,7 +64,7 @@ static_library("SiWx917") { "../../SingletonConfigurationManager.cpp", "../rs911x/BLEManagerImpl.cpp", "../rs911x/rsi_ble_config.h", - "../rs911x/wfx_sl_ble_init.c", + "../rs911x/wfx_sl_ble_init.cpp", "../rs911x/wfx_sl_ble_init.h", ] diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn index 43c33ec6c4cbf3..4bc881f5f54a27 100644 --- a/src/platform/silabs/efr32/BUILD.gn +++ b/src/platform/silabs/efr32/BUILD.gn @@ -70,7 +70,7 @@ static_library("efr32") { sources += [ "../rs911x/BLEManagerImpl.cpp", "../rs911x/rsi_ble_config.h", - "../rs911x/wfx_sl_ble_init.c", + "../rs911x/wfx_sl_ble_init.cpp", "../rs911x/wfx_sl_ble_init.h", ] } else { diff --git a/src/platform/silabs/rs911x/BLEManagerImpl.cpp b/src/platform/silabs/rs911x/BLEManagerImpl.cpp index 6fea061de76ab8..841fc1a4b6e266 100644 --- a/src/platform/silabs/rs911x/BLEManagerImpl.cpp +++ b/src/platform/silabs/rs911x/BLEManagerImpl.cpp @@ -26,54 +26,42 @@ #include #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE -#include "cmsis_os2.h" #include -#ifndef SLI_SI91X_MCU_INTERFACE -#include "rail.h" + +#include +#include +#include +#include +#include + +#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING +#include #endif + #include #ifdef __cplusplus extern "C" { #endif -#include "FreeRTOS.h" -#include "event_groups.h" -#include "task.h" -#include "timers.h" -#include "wfx_host_events.h" -#include "wfx_rsi.h" #include "wfx_sl_ble_init.h" #if !(SLI_SI91X_MCU_INTERFACE | EXP_BOARD) #include #endif #include -#include #ifdef __cplusplus } #endif -#include -#include -#include -#include -#include -#include - -#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING -#include -#endif - #define BLE_MIN_CONNECTION_INTERVAL_MS 24 #define BLE_MAX_CONNECTION_INTERVAL_MS 40 #define BLE_SLAVE_LATENCY_MS 0 #define BLE_TIMEOUT_MS 400 -#define BLE_DEFAULT_TIMER_PERIOD_MS (1) #define BLE_SEND_INDICATION_TIMER_PERIOD_MS (5000) -extern sl_wfx_msg_t event_msg; +// Used to send the Indication Confirmation +uint8_t dev_address[RSI_DEV_ADDR_LEN]; +uint16_t ble_measurement_hndl; -osSemaphoreId_t sl_ble_event_sem; osSemaphoreId_t sl_rs_ble_init_sem; - osTimerId_t sbleAdvTimeoutTimer; static osThreadId_t sBleThread; @@ -92,115 +80,6 @@ using namespace ::chip; using namespace ::chip::Ble; using namespace ::chip::DeviceLayer::Internal; -void sl_ble_init() -{ - uint8_t randomAddrBLE[RSI_BLE_ADDR_LENGTH] = { 0 }; - uint64_t randomAddr = chip::Crypto::GetRandU64(); - memcpy(randomAddrBLE, &randomAddr, RSI_BLE_ADDR_LENGTH); - // Set the two least significant bits as the first 2 bits of the address has to be '11' to ensure the address is a random - // non-resolvable private address - randomAddrBLE[(RSI_BLE_ADDR_LENGTH - 1)] |= 0xC0; - - // registering the GAP callback functions - rsi_ble_gap_register_callbacks(NULL, NULL, rsi_ble_on_disconnect_event, NULL, NULL, NULL, rsi_ble_on_enhance_conn_status_event, - NULL, NULL, NULL); - - // registering the GATT call back functions - rsi_ble_gatt_register_callbacks(NULL, NULL, NULL, NULL, NULL, NULL, NULL, rsi_ble_on_gatt_write_event, NULL, NULL, - rsi_ble_on_read_req_event, rsi_ble_on_mtu_event, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, rsi_ble_on_event_indication_confirmation, NULL); - - // Exchange of GATT info with BLE stack - - rsi_ble_add_matter_service(); - // initializing the application events map - rsi_ble_app_init_events(); - rsi_ble_set_random_address_with_value(randomAddrBLE); - chip::DeviceLayer::Internal::BLEMgrImpl().HandleBootEvent(); -} - -void sl_ble_event_handling_task(void * args) -{ - int32_t event_id; - - //! This semaphore is waiting for wifi module initialization. - osSemaphoreAcquire(sl_rs_ble_init_sem, osWaitForever); - - // This function initialize BLE and start BLE advertisement. - sl_ble_init(); - - // Application event map - while (1) - { - // checking for events list - event_id = rsi_ble_app_get_event(); - if (event_id == -1) - { - //! This semaphore is waiting for next ble event task - osSemaphoreAcquire(sl_ble_event_sem, osWaitForever); - continue; - } - switch (event_id) - { - case RSI_BLE_CONN_EVENT: { - rsi_ble_app_clear_event(RSI_BLE_CONN_EVENT); - BLEMgrImpl().HandleConnectEvent(); - // Requests the connection parameters change with the remote device - rsi_ble_conn_params_update(event_msg.resp_enh_conn.dev_addr, BLE_MIN_CONNECTION_INTERVAL_MS, - BLE_MAX_CONNECTION_INTERVAL_MS, BLE_SLAVE_LATENCY_MS, BLE_TIMEOUT_MS); - rsi_ble_set_data_len(event_msg.resp_enh_conn.dev_addr, RSI_BLE_TX_OCTETS, RSI_BLE_TX_TIME); - } - break; - case RSI_BLE_DISCONN_EVENT: { - // event invokes when disconnection was completed - BLEMgrImpl().HandleConnectionCloseEvent(event_msg.reason); - // clear the served event - rsi_ble_app_clear_event(RSI_BLE_DISCONN_EVENT); - } - break; - case RSI_BLE_MTU_EVENT: { - // event invokes when write/notification events received - BLEMgrImpl().UpdateMtu(event_msg.rsi_ble_mtu); - // clear the served event - rsi_ble_app_clear_event(RSI_BLE_MTU_EVENT); - } - break; - case RSI_BLE_EVENT_GATT_RD: { -#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING - if (event_msg.rsi_ble_read_req->type == 0) - { - BLEMgrImpl().HandleC3ReadRequest(event_msg.rsi_ble_read_req); - } -#endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING - // clear the served event - rsi_ble_app_clear_event(RSI_BLE_EVENT_GATT_RD); - } - break; - case RSI_BLE_GATT_WRITE_EVENT: { - // event invokes when write/notification events received - BLEMgrImpl().HandleWriteEvent(event_msg.rsi_ble_write); - // clear the served event - rsi_ble_app_clear_event(RSI_BLE_GATT_WRITE_EVENT); - } - break; - case RSI_BLE_GATT_INDICATION_CONFIRMATION: { - BLEMgrImpl().HandleTxConfirmationEvent(1); - rsi_ble_app_clear_event(RSI_BLE_GATT_INDICATION_CONFIRMATION); - } - break; - default: - break; - } - - if (chip::DeviceLayer::ConnectivityMgr().IsWiFiStationConnected()) - { - // Once DUT is connected adding a 500ms delay - // TODO: Fix this with a better event handling - vTaskDelay(pdMS_TO_TICKS(500)); - } - } -} - namespace chip { namespace DeviceLayer { namespace Internal { @@ -228,23 +107,6 @@ namespace { #define TIMER_MS_2_TIMERTICK(ms) ((TIMER_CLK_FREQ * ms) / 1000) #define TIMER_S_2_TIMERTICK(s) (TIMER_CLK_FREQ * s) -#define BLE_MAX_BUFFER_SIZE (3076) -#define BLE_MAX_ADVERTISERS (1) -#define BLE_CONFIG_MAX_PERIODIC_ADVERTISING_SYNC (0) -#define BLE_CONFIG_MAX_SOFTWARE_TIMERS (4) -#define BLE_CONFIG_MIN_TX_POWER (-30) -#define BLE_CONFIG_MAX_TX_POWER (80) -#define BLE_CONFIG_RF_PATH_GAIN_TX (0) -#define BLE_CONFIG_RF_PATH_GAIN_RX (0) - -// Default Connection parameters -#define BLE_CONFIG_MIN_INTERVAL (16) // Time = Value x 1.25 ms = 30ms -#define BLE_CONFIG_MAX_INTERVAL (80) // Time = Value x 1.25 ms = 100ms -#define BLE_CONFIG_LATENCY (0) -#define BLE_CONFIG_TIMEOUT (100) // Time = Value x 10 ms = 1s -#define BLE_CONFIG_MIN_CE_LENGTH (0) // Leave to min value -#define BLE_CONFIG_MAX_CE_LENGTH (0xFFFF) // Leave to max value - const uint8_t UUID_CHIPoBLEService[] = { 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xF6, 0xFF, 0x00, 0x00 }; const uint8_t ShortUUID_CHIPoBLEService[] = { 0xF6, 0xFF }; @@ -253,14 +115,127 @@ const uint8_t ShortUUID_CHIPoBLEService[] = { 0xF6, 0xFF }; BLEManagerImpl BLEManagerImpl::sInstance; +void BLEManagerImpl::ProcessEvent(SilabsBleWrapper::BleEvent_t inEvent) +{ + switch (inEvent.eventType) + { + case SilabsBleWrapper::BleEventType::RSI_BLE_CONN_EVENT: { + BLEMgrImpl().HandleConnectEvent((inEvent.eventData)); + // Requests the connection parameters change with the remote device + rsi_ble_conn_params_update(inEvent.eventData->resp_enh_conn.dev_addr, BLE_MIN_CONNECTION_INTERVAL_MS, + BLE_MAX_CONNECTION_INTERVAL_MS, BLE_SLAVE_LATENCY_MS, BLE_TIMEOUT_MS); + rsi_ble_set_data_len(inEvent.eventData->resp_enh_conn.dev_addr, RSI_BLE_TX_OCTETS, RSI_BLE_TX_TIME); + + // Used to send the Indication confirmation + memcpy(dev_address, inEvent.eventData->resp_enh_conn.dev_addr, RSI_DEV_ADDR_LEN); + ble_measurement_hndl = inEvent.eventData->rsi_ble_measurement_hndl; + } + break; + case SilabsBleWrapper::BleEventType::RSI_BLE_DISCONN_EVENT: { + // event invokes when disconnection was completed + BLEMgrImpl().HandleConnectionCloseEvent(inEvent.eventData); + } + break; + case SilabsBleWrapper::BleEventType::RSI_BLE_MTU_EVENT: { + // event invokes when write/notification events received + BLEMgrImpl().UpdateMtu(inEvent.eventData); + } + break; + case SilabsBleWrapper::BleEventType::RSI_BLE_EVENT_GATT_RD: { +#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING + if (inEvent.eventData->rsi_ble_read_req->type == 0) + { + BLEMgrImpl().HandleC3ReadRequest(&inEvent.eventData); + } +#endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING + } + break; + case SilabsBleWrapper::BleEventType::RSI_BLE_GATT_WRITE_EVENT: { + // event invokes when write/notification events received + BLEMgrImpl().HandleWriteEvent(inEvent.eventData); + } + break; + case SilabsBleWrapper::BleEventType::RSI_BLE_GATT_INDICATION_CONFIRMATION: { + BLEMgrImpl().HandleTxConfirmationEvent(1); + } + break; + default: + break; + } +} + +void BLEManagerImpl::BlePostEvent(SilabsBleWrapper::BleEvent_t * event) +{ + sl_status_t status = osMessageQueuePut(sInstance.sBleEventQueue, event, 0, 0); + if (status != osOK) + { + ChipLogError(DeviceLayer, "BlePostEvent: failed to post event: 0x%lx", status); + // TODO: Handle error, requeue event depending on queue size or notify relevant task, Chipdie, etc. + } +} + +void BLEManagerImpl::sl_ble_event_handling_task(void * args) +{ + sl_status_t status; + SilabsBleWrapper::BleEvent_t bleEvent; + + //! This semaphore is waiting for wifi module initialization. + osSemaphoreAcquire(sl_rs_ble_init_sem, osWaitForever); + + // This function initialize BLE and start BLE advertisement. + sInstance.sl_ble_init(); + + // Application event map + while (1) + { + status = osMessageQueueGet(sInstance.sBleEventQueue, &bleEvent, NULL, osWaitForever); + if (status == osOK) + { + sInstance.ProcessEvent(bleEvent); + } + else + { + ChipLogError(DeviceLayer, "sl_ble_event_handling_task: get event failed: 0x%lx", static_cast(status)); + } + } +} + +void BLEManagerImpl::sl_ble_init() +{ + uint8_t randomAddrBLE[RSI_BLE_ADDR_LENGTH] = { 0 }; + uint64_t randomAddr = chip::Crypto::GetRandU64(); + memcpy(randomAddrBLE, &randomAddr, RSI_BLE_ADDR_LENGTH); + // Set the two least significant bits as the first 2 bits of the address has to be '11' to ensure the address is a random + // non-resolvable private address + randomAddrBLE[(RSI_BLE_ADDR_LENGTH - 1)] |= 0xC0; + + // registering the GAP callback functions + rsi_ble_gap_register_callbacks(NULL, NULL, SilabsBleWrapper::rsi_ble_on_disconnect_event, NULL, NULL, NULL, + SilabsBleWrapper::rsi_ble_on_enhance_conn_status_event, NULL, NULL, NULL); + + // registering the GATT call back functions + rsi_ble_gatt_register_callbacks(NULL, NULL, NULL, NULL, NULL, NULL, NULL, SilabsBleWrapper::rsi_ble_on_gatt_write_event, NULL, + NULL, SilabsBleWrapper::rsi_ble_on_read_req_event, SilabsBleWrapper::rsi_ble_on_mtu_event, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + SilabsBleWrapper::rsi_ble_on_event_indication_confirmation, NULL); + + // Exchange of GATT info with BLE stack + SilabsBleWrapper::rsi_ble_add_matter_service(); + rsi_ble_set_random_address_with_value(randomAddrBLE); + + sInstance.sBleEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL); + VerifyOrDie(sInstance.sBleEventQueue != nullptr); + + chip::DeviceLayer::Internal::BLEMgrImpl().HandleBootEvent(); +} + CHIP_ERROR BLEManagerImpl::_Init() { CHIP_ERROR err; sl_rs_ble_init_sem = osSemaphoreNew(1, 0, NULL); - sl_ble_event_sem = osSemaphoreNew(1, 0, NULL); - sBleThread = osThreadNew(sl_ble_event_handling_task, NULL, &kBleTaskAttr); + sBleThread = osThreadNew(sInstance.sl_ble_event_handling_task, NULL, &kBleTaskAttr); VerifyOrReturnError(sBleThread != nullptr, CHIP_ERROR_INCORRECT_STATE); @@ -465,9 +440,7 @@ CHIP_ERROR BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const Chi PacketBufferHandle data) { int32_t status = 0; - status = rsi_ble_indicate_value(event_msg.resp_enh_conn.dev_addr, event_msg.rsi_ble_measurement_hndl, (data->DataLength()), - data->Start()); - + status = rsi_ble_indicate_value(dev_address, ble_measurement_hndl, data->DataLength(), data->Start()); if (status != RSI_SUCCESS) { ChipLogProgress(DeviceLayer, "indication failed with error code %lx ", status); @@ -761,9 +734,9 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising(void) return err; } -void BLEManagerImpl::UpdateMtu(rsi_ble_event_mtu_t evt) +void BLEManagerImpl::UpdateMtu(SilabsBleWrapper::sl_wfx_msg_t * evt) { - CHIPoBLEConState * bleConnState = GetConnectionState(event_msg.connectionHandle); + CHIPoBLEConState * bleConnState = GetConnectionState(evt->connectionHandle); if (bleConnState != NULL) { // bleConnState->MTU is a 10-bit field inside a uint16_t. We're @@ -775,10 +748,10 @@ void BLEManagerImpl::UpdateMtu(rsi_ble_event_mtu_t evt) // TODO: https://github.com/project-chip/connectedhomeip/issues/2569 // tracks making this safe with a check or explaining why no check // is needed. - ChipLogProgress(DeviceLayer, "DriveBLEState UpdateMtu %d", evt.mtu_size); + ChipLogProgress(DeviceLayer, "DriveBLEState UpdateMtu %d", evt->rsi_ble_mtu.mtu_size); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" - bleConnState->mtu = evt.mtu_size; + bleConnState->mtu = evt->rsi_ble_mtu.mtu_size; #pragma GCC diagnostic pop ; } @@ -790,14 +763,14 @@ void BLEManagerImpl::HandleBootEvent(void) PlatformMgr().ScheduleWork(DriveBLEState, 0); } -void BLEManagerImpl::HandleConnectEvent(void) +void BLEManagerImpl::HandleConnectEvent(SilabsBleWrapper::sl_wfx_msg_t * evt) { - AddConnection(event_msg.connectionHandle, event_msg.bondingHandle); + AddConnection(evt->connectionHandle, evt->bondingHandle); PlatformMgr().ScheduleWork(DriveBLEState, 0); } // TODO:: Implementation need to be done. -void BLEManagerImpl::HandleConnectionCloseEvent(uint16_t reason) +void BLEManagerImpl::HandleConnectionCloseEvent(SilabsBleWrapper::sl_wfx_msg_t * evt) { uint8_t connHandle = 1; @@ -807,7 +780,7 @@ void BLEManagerImpl::HandleConnectionCloseEvent(uint16_t reason) event.Type = DeviceEventType::kCHIPoBLEConnectionError; event.CHIPoBLEConnectionError.ConId = connHandle; - switch (reason) + switch (evt->reason) { case RSI_BT_CTRL_REMOTE_USER_TERMINATED: @@ -819,7 +792,7 @@ void BLEManagerImpl::HandleConnectionCloseEvent(uint16_t reason) event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT; } - ChipLogProgress(DeviceLayer, "BLE GATT connection closed (con %u, reason %x)", connHandle, reason); + ChipLogProgress(DeviceLayer, "BLE GATT connection closed (con %u, reason %x)", connHandle, evt->reason); PlatformMgr().PostEventOrDie(&event); @@ -831,37 +804,37 @@ void BLEManagerImpl::HandleConnectionCloseEvent(uint16_t reason) } } -void BLEManagerImpl::HandleWriteEvent(rsi_ble_event_write_t evt) +void BLEManagerImpl::HandleWriteEvent(SilabsBleWrapper::sl_wfx_msg_t * evt) { - ChipLogProgress(DeviceLayer, "Char Write Req, packet type %d", evt.pkt_type); + ChipLogProgress(DeviceLayer, "Char Write Req, packet type %d", evt->rsi_ble_write.pkt_type); - if (evt.handle[0] == (uint8_t) event_msg.rsi_ble_gatt_server_client_config_hndl) // TODO:: compare the handle exactly + if (evt->rsi_ble_write.handle[0] == (uint8_t) evt->rsi_ble_gatt_server_client_config_hndl) // TODO:: compare the handle exactly { - HandleTXCharCCCDWrite(&evt); + HandleTXCharCCCDWrite(evt); } else { - HandleRXCharWrite(&evt); + HandleRXCharWrite(evt); } } // TODO:: Need to implement this -void BLEManagerImpl::HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt) +void BLEManagerImpl::HandleTXCharCCCDWrite(SilabsBleWrapper::sl_wfx_msg_t * evt) { CHIP_ERROR err = CHIP_NO_ERROR; bool isIndicationEnabled = false; ChipDeviceEvent event; CHIPoBLEConState * bleConnState; - bleConnState = GetConnectionState(event_msg.connectionHandle); + bleConnState = GetConnectionState(evt->connectionHandle); VerifyOrExit(bleConnState != NULL, err = CHIP_ERROR_NO_MEMORY); // Determine if the client is enabling or disabling notification/indication. - if (evt->att_value[0] != 0) + if (evt->rsi_ble_write.att_value[0] != 0) { isIndicationEnabled = true; } - ChipLogProgress(DeviceLayer, "HandleTXcharCCCDWrite - Config Flags value : %d", evt->att_value[0]); + ChipLogProgress(DeviceLayer, "HandleTXcharCCCDWrite - Config Flags value : %d", evt->rsi_ble_write.att_value[0]); ChipLogProgress(DeviceLayer, "CHIPoBLE %s received", isIndicationEnabled ? "subscribe" : "unsubscribe"); if (isIndicationEnabled) @@ -891,13 +864,13 @@ void BLEManagerImpl::HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt) } } -void BLEManagerImpl::HandleRXCharWrite(rsi_ble_event_write_t * evt) +void BLEManagerImpl::HandleRXCharWrite(SilabsBleWrapper::sl_wfx_msg_t * evt) { uint8_t conId = 1; CHIP_ERROR err = CHIP_NO_ERROR; System::PacketBufferHandle buf; - uint16_t writeLen = evt->length; - uint8_t * data = (uint8_t *) evt->att_value; + uint16_t writeLen = evt->rsi_ble_write.length; + uint8_t * data = (uint8_t *) evt->rsi_ble_write.att_value; // Copy the data to a packet buffer. buf = System::PacketBufferHandle::NewWithData(data, writeLen, 0, 0); @@ -1024,9 +997,9 @@ CHIP_ERROR BLEManagerImpl::EncodeAdditionalDataTlv() return err; } -void BLEManagerImpl::HandleC3ReadRequest(rsi_ble_read_req_t * rsi_ble_read_req) +void BLEManagerImpl::HandleC3ReadRequest(SilabsBleWrapper::sl_wfx_msg_t * evt) { - sl_status_t ret = rsi_ble_gatt_read_response(rsi_ble_read_req->dev_addr, GATT_READ_RESP, rsi_ble_read_req->handle, + sl_status_t ret = rsi_ble_gatt_read_response(evt->rsi_ble_read_req.dev_addr, GATT_READ_RESP, evt->rsi_ble_read_req.handle, GATT_READ_ZERO_OFFSET, sInstance.c3AdditionalDataBufferHandle->DataLength(), sInstance.c3AdditionalDataBufferHandle->Start()); if (ret != SL_STATUS_OK) diff --git a/src/platform/silabs/rs911x/rsi_ble_config.h b/src/platform/silabs/rs911x/rsi_ble_config.h index 781ad80a29e7d7..de207a99af1601 100644 --- a/src/platform/silabs/rs911x/rsi_ble_config.h +++ b/src/platform/silabs/rs911x/rsi_ble_config.h @@ -38,15 +38,6 @@ #define RSI_FAILURE -1 #endif -#define RSI_BLE_CONN_EVENT (0x01) -#define RSI_BLE_DISCONN_EVENT (0x02) -#define RSI_BLE_GATT_WRITE_EVENT (0x03) -#define RSI_BLE_MTU_EVENT (0x04) -#define RSI_BLE_GATT_INDICATION_CONFIRMATION (0x05) -#define RSI_BLE_RESP_ATT_VALUE (0x06) -#define RSI_BLE_EVENT_GATT_RD (0x08) -#define RSI_BLE_ADDR_LENGTH 6 - #define RSI_SSID (0x0D) #define RSI_SECTYPE (0x0E) #define RSI_BLE_WLAN_DISCONN_NOTIFY (0x0F) @@ -62,7 +53,6 @@ #define RSI_BLE_DEV_NAME "CCP_DEVICE" #define RSI_BLE_SET_RAND_ADDR "00:23:A7:12:34:56" -#define RSI_BLE_EVENT_GATT_RD (0x08) #define RSI_BLE_ADDR_LENGTH 6 #define CLEAR_WHITELIST (0x00) diff --git a/src/platform/silabs/rs911x/wfx_sl_ble_init.c b/src/platform/silabs/rs911x/wfx_sl_ble_init.cpp similarity index 63% rename from src/platform/silabs/rs911x/wfx_sl_ble_init.c rename to src/platform/silabs/rs911x/wfx_sl_ble_init.cpp index 23bc666b20b528..c1af13e2cd807c 100644 --- a/src/platform/silabs/rs911x/wfx_sl_ble_init.c +++ b/src/platform/silabs/rs911x/wfx_sl_ble_init.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * @file wfx_sl_ble_init.c + * @file wfx_sl_ble_init.cpp * @brief ******************************************************************************* * # License @@ -20,52 +20,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "wfx_sl_ble_init.h" -#include "ble_config.h" -#include "cmsis_os2.h" -#include "silabs_utils.h" -// Global Variables -rsi_ble_t att_list; -sl_wfx_msg_t event_msg; - -extern osSemaphoreId_t sl_ble_event_sem; - -// Memory to initialize driver -uint8_t bt_global_buf[BT_GLOBAL_BUFF_LEN]; -const uint8_t ShortUUID_CHIPoBLEService[] = { 0xF6, 0xFF }; +#include +#include +#include -/*==============================================*/ -/** - * @fn rsi_ble_app_init_events - * @brief initializes the event parameter. - * @param[in] none. - * @return none. - * @section description - * This function is used during BLE initialization. - */ -void rsi_ble_app_init_events() -{ - event_msg.ble_app_event_map = 0; - event_msg.ble_app_event_mask = 0xFFFFFFFF; - event_msg.ble_app_event_mask = event_msg.ble_app_event_mask; // To suppress warning while compiling - return; -} +using namespace chip::DeviceLayer::Internal; -/*==============================================*/ -/** - * @fn rsi_ble_app_clear_event - * @brief clears the specific event. - * @param[in] event_num, specific event number. - * @return none. - * @section description - * This function is used to clear the specific event. - */ -void rsi_ble_app_clear_event(uint32_t event_num) -{ - event_msg.event_num = event_num; - event_msg.ble_app_event_map &= ~BIT(event_num); - return; -} +// Global Variables +SilabsBleWrapper::BleEvent_t bleEvent; /*==============================================*/ /** @@ -76,10 +38,11 @@ void rsi_ble_app_clear_event(uint32_t event_num) * @section description * This callback function is invoked when mtu exhange event is received */ -void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu) +void SilabsBleWrapper::rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu) { - memcpy(&event_msg.rsi_ble_mtu, rsi_ble_mtu, sizeof(rsi_ble_event_mtu_t)); - rsi_ble_app_set_event(RSI_BLE_MTU_EVENT); + bleEvent.eventType = BleEventType::RSI_BLE_MTU_EVENT; + memcpy(&bleEvent.eventData->rsi_ble_mtu, rsi_ble_mtu, sizeof(rsi_ble_event_mtu_t)); + BLEMgrImpl().BlePostEvent(&bleEvent); } /*==============================================*/ @@ -92,11 +55,12 @@ void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu) * @section description * This callback function is invoked when write/notify/indication events are received */ -void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write) +void SilabsBleWrapper::rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write) { - event_msg.event_id = event_id; - memcpy(&event_msg.rsi_ble_write, rsi_ble_write, sizeof(rsi_ble_event_write_t)); - rsi_ble_app_set_event(RSI_BLE_GATT_WRITE_EVENT); + bleEvent.eventType = BleEventType::RSI_BLE_GATT_WRITE_EVENT; + bleEvent.eventData->event_id = event_id; + memcpy(&bleEvent.eventData->rsi_ble_write, rsi_ble_write, sizeof(rsi_ble_event_write_t)); + BLEMgrImpl().BlePostEvent(&bleEvent); } /*==============================================*/ @@ -108,12 +72,13 @@ void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ * @section description * This callback function indicates the status of the connection */ -void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn) +void SilabsBleWrapper::rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn) { - event_msg.connectionHandle = 1; - event_msg.bondingHandle = 255; - memcpy(event_msg.resp_enh_conn.dev_addr, resp_enh_conn->dev_addr, RSI_DEV_ADDR_LEN); - rsi_ble_app_set_event(RSI_BLE_CONN_EVENT); + bleEvent.eventType = BleEventType::RSI_BLE_CONN_EVENT; + bleEvent.eventData->connectionHandle = 1; + bleEvent.eventData->bondingHandle = 255; + memcpy(bleEvent.eventData->resp_enh_conn.dev_addr, resp_enh_conn->dev_addr, RSI_DEV_ADDR_LEN); + BLEMgrImpl().BlePostEvent(&bleEvent); } /*==============================================*/ @@ -126,10 +91,11 @@ void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * * @section description * This callback function indicates disconnected device information and status */ -void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason) +void SilabsBleWrapper::rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason) { - event_msg.reason = reason; - rsi_ble_app_set_event(RSI_BLE_DISCONN_EVENT); + bleEvent.eventType = BleEventType::RSI_BLE_DISCONN_EVENT; + bleEvent.eventData->reason = reason; + BLEMgrImpl().BlePostEvent(&bleEvent); } /*==============================================*/ @@ -141,11 +107,13 @@ void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, u * @return none * @section description */ -void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp) +void SilabsBleWrapper::rsi_ble_on_event_indication_confirmation(uint16_t resp_status, + rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp) { - event_msg.resp_status = resp_status; - memcpy(&event_msg.rsi_ble_event_set_att_rsp, rsi_ble_event_set_att_rsp, sizeof(rsi_ble_set_att_resp_t)); - rsi_ble_app_set_event(RSI_BLE_GATT_INDICATION_CONFIRMATION); + bleEvent.eventType = BleEventType::RSI_BLE_GATT_INDICATION_CONFIRMATION; + bleEvent.eventData->resp_status = resp_status; + memcpy(&bleEvent.eventData->rsi_ble_event_set_att_rsp, rsi_ble_event_set_att_rsp, sizeof(rsi_ble_set_att_resp_t)); + BLEMgrImpl().BlePostEvent(&bleEvent); } /*==============================================*/ @@ -158,53 +126,12 @@ void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_ * @section description * This callback function is invoked when read events are received */ -void rsi_ble_on_read_req_event(uint16_t event_id, rsi_ble_read_req_t * rsi_ble_read_req) -{ - event_msg.event_id = event_id; - memcpy(&event_msg.rsi_ble_read_req, rsi_ble_read_req, sizeof(rsi_ble_read_req_t)); - rsi_ble_app_set_event(RSI_BLE_EVENT_GATT_RD); -} - -/*==============================================*/ -/**s - * @fn rsi_ble_app_get_event - * @brief returns the first set event based on priority - * @param[in] none. - * @return int32_t - * > 0 = event number - * -1 = not received any event - * @section description - * This function returns the highest priority event among all the set events - */ -int32_t rsi_ble_app_get_event(void) +void SilabsBleWrapper::rsi_ble_on_read_req_event(uint16_t event_id, rsi_ble_read_req_t * rsi_ble_read_req) { - uint32_t ix; - - for (ix = 0; ix < 32; ix++) - { - if (event_msg.ble_app_event_map & (1 << ix)) - { - return ix; - } - } - - return (-1); -} - -/*==============================================*/ -/** - * @fn rsi_ble_app_set_event - * @brief set the specific event. - * @param[in] event_num, specific event number. - * @return none. - * @section description - * This function is used to set/raise the specific event. - */ -void rsi_ble_app_set_event(uint32_t event_num) -{ - event_msg.ble_app_event_map |= BIT(event_num); - osSemaphoreRelease(sl_ble_event_sem); - return; + bleEvent.eventType = BleEventType::RSI_BLE_EVENT_GATT_RD; + bleEvent.eventData->event_id = event_id; + memcpy(&bleEvent.eventData->rsi_ble_read_req, rsi_ble_read_req, sizeof(rsi_ble_read_req_t)); + BLEMgrImpl().BlePostEvent(&bleEvent); } /*==============================================*/ @@ -220,8 +147,8 @@ void rsi_ble_app_set_event(uint32_t event_num) * @section description * This function is used to store all attribute records */ -void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid, - uint8_t char_prop) +void SilabsBleWrapper::rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, + uuid_t uuid, uint8_t char_prop) { if ((p_val->DATA_ix + data_len) >= BLE_ATT_REC_SIZE) { //! Check for max data length for the characteristic value @@ -254,7 +181,8 @@ void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t * @section description * This function is used at application to add characteristic attribute */ -void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle, uuid_t att_val_uuid) +void SilabsBleWrapper::rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle, + uuid_t att_val_uuid) { rsi_ble_req_add_att_t new_att = { 0 }; @@ -302,11 +230,11 @@ void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val * This function is used at application to create new service. */ -void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, uint8_t * data, - uint8_t data_len, uint8_t auth_read) +void SilabsBleWrapper::rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, + uint8_t * data, uint8_t data_len, uint8_t auth_read) { rsi_ble_req_add_att_t new_att = { 0 }; - + rsi_ble_t att_list; memset(&new_att, 0, sizeof(rsi_ble_req_add_att_t)); //! preparing the attributes new_att.serv_handler = serv_handler; @@ -364,19 +292,21 @@ void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_t * This function is used at application to create new service. */ -uint32_t rsi_ble_add_matter_service(void) +uint32_t SilabsBleWrapper::rsi_ble_add_matter_service(void) { uuid_t custom_service = { RSI_BLE_MATTER_CUSTOM_SERVICE_UUID }; custom_service.size = RSI_BLE_MATTER_CUSTOM_SERVICE_SIZE; custom_service.val.val16 = RSI_BLE_MATTER_CUSTOM_SERVICE_VALUE_16; uint8_t data[RSI_BLE_MATTER_CUSTOM_SERVICE_DATA_LENGTH] = { RSI_BLE_MATTER_CUSTOM_SERVICE_DATA }; - static const uuid_t custom_characteristic_RX = { .size = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_SIZE, - .reserved = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_RESERVED }, - .val.val128.data1 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_1, - .val.val128.data2 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_2, - .val.val128.data3 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_3, - .val.val128.data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_4 } }; + static const uuid_t custom_characteristic_RX = { + .size = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_SIZE, + .reserved = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_RESERVED }, + .val = { .val128 = { .data1 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_1 }, + .data2 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_2 }, + .data3 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_3 }, + .data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_4 } } } + }; rsi_ble_resp_add_serv_t new_serv_resp = { 0 }; rsi_ble_add_service(custom_service, &new_serv_resp); @@ -393,12 +323,14 @@ uint32_t rsi_ble_add_matter_service(void) RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ, // Set read, write, write without response data, sizeof(data), ATT_REC_IN_HOST); - static const uuid_t custom_characteristic_TX = { .size = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_SIZE, - .reserved = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_RESERVED }, - .val.val128.data1 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_1, - .val.val128.data2 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_2, - .val.val128.data3 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_3, - .val.val128.data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_4 } }; + static const uuid_t custom_characteristic_TX = { + .size = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_SIZE, + .reserved = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_RESERVED }, + .val = { .val128 = { .data1 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_1 }, + .data2 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_2 }, + .data3 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_3 }, + .data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_4 } } } + }; // Adding custom characteristic declaration to the custom service rsi_ble_add_char_serv_att( @@ -408,13 +340,14 @@ uint32_t rsi_ble_add_matter_service(void) new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION, custom_characteristic_TX); // Adding characteristic value attribute to the service - event_msg.rsi_ble_measurement_hndl = new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION; + bleEvent.eventData->rsi_ble_measurement_hndl = + new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION; // Adding characteristic value attribute to the service - event_msg.rsi_ble_gatt_server_client_config_hndl = + bleEvent.eventData->rsi_ble_gatt_server_client_config_hndl = new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_GATT_SERVER_CLIENT_HANDLE_LOCATION; - rsi_ble_add_char_val_att(new_serv_resp.serv_handler, event_msg.rsi_ble_measurement_hndl, custom_characteristic_TX, + rsi_ble_add_char_val_att(new_serv_resp.serv_handler, bleEvent.eventData->rsi_ble_measurement_hndl, custom_characteristic_TX, RSI_BLE_ATT_PROPERTY_WRITE_NO_RESPONSE | RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ | RSI_BLE_ATT_PROPERTY_NOTIFY | RSI_BLE_ATT_PROPERTY_INDICATE, // Set read, write, write without response diff --git a/src/platform/silabs/rs911x/wfx_sl_ble_init.h b/src/platform/silabs/rs911x/wfx_sl_ble_init.h index e3d11e0057a98f..1e770de0727100 100644 --- a/src/platform/silabs/rs911x/wfx_sl_ble_init.h +++ b/src/platform/silabs/rs911x/wfx_sl_ble_init.h @@ -20,61 +20,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#pragma once /** * Include files * */ - -#ifndef WFX_SL_BLE_INIT -#define WFX_SL_BLE_INIT - // BLE include file to refer BLE APIs -#include "FreeRTOS.h" #include "ble_config.h" -#include "event_groups.h" -#include "task.h" -#include "timers.h" +#include "cmsis_os2.h" #include "wfx_host_events.h" #include "wfx_rsi.h" #include #include #include -#if !(SLI_SI91X_MCU_INTERFACE | EXP_BOARD) -#include -#include -#include -#include -#include -#endif #include #include #include #include #include -typedef struct sl_wfx_msg_s -{ - uint8_t connectionHandle; - uint8_t bondingHandle; - uint32_t event_num; - uint16_t reason; - uint16_t event_id; - uint16_t resp_status; - rsi_ble_event_mtu_t rsi_ble_mtu; - rsi_ble_event_write_t rsi_ble_write; - rsi_ble_event_enhance_conn_status_t resp_enh_conn; - rsi_ble_event_disconnect_t * resp_disconnect; - rsi_ble_read_req_t * rsi_ble_read_req; - rsi_ble_set_att_resp_t rsi_ble_event_set_att_rsp; - uint32_t ble_app_event_map; - uint32_t ble_app_event_mask; - uint16_t rsi_ble_measurement_hndl; - uint16_t rsi_ble_gatt_server_client_config_hndl; - uint16_t subscribed; - -} sl_wfx_msg_t; - #define ATT_REC_IN_HOST (0) +#define WFX_QUEUE_SIZE 10 #define RSI_BT_CTRL_REMOTE_USER_TERMINATED (0x4E13) #define RSI_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES (0x4E14) @@ -107,25 +73,65 @@ typedef struct sl_wfx_msg_s #define RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION (4) #define RSI_BLE_CHARACTERISTIC_TX_GATT_SERVER_CLIENT_HANDLE_LOCATION (5) -// ALL Ble functions -void rsi_ble_on_connect_event(rsi_ble_event_conn_status_t * resp_conn); -void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason); -void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn); -void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write); -void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu); -void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp); -void rsi_ble_on_read_req_event(uint16_t event_id, rsi_ble_read_req_t * rsi_ble_read_req); -void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid, - uint8_t char_prop); -void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle, - uuid_t att_val_uuid); -void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, uint8_t * data, - uint8_t data_len, uint8_t auth_read); -uint32_t rsi_ble_add_matter_service(void); -void rsi_ble_app_set_event(uint32_t event_num); -int32_t rsi_ble_app_get_event(void); -void rsi_ble_app_clear_event(uint32_t event_num); -void rsi_ble_app_init_events(); -void rsi_ble_event_handling_task(void); +namespace chip { +namespace DeviceLayer { +namespace Internal { + +class SilabsBleWrapper +{ +public: + enum class BleEventType : uint8_t + { + RSI_BLE_CONN_EVENT, + RSI_BLE_DISCONN_EVENT, + RSI_BLE_GATT_WRITE_EVENT, + RSI_BLE_MTU_EVENT, + RSI_BLE_GATT_INDICATION_CONFIRMATION, + RSI_BLE_RESP_ATT_VALUE, + RSI_BLE_EVENT_GATT_RD + }; + + struct sl_wfx_msg_t + { + uint8_t connectionHandle; + uint8_t bondingHandle; + uint16_t reason; + uint16_t event_id; + uint16_t resp_status; + rsi_ble_event_mtu_t rsi_ble_mtu; + rsi_ble_event_write_t rsi_ble_write; + rsi_ble_event_enhance_conn_status_t resp_enh_conn; + rsi_ble_event_disconnect_t * resp_disconnect; + rsi_ble_read_req_t * rsi_ble_read_req; + rsi_ble_set_att_resp_t rsi_ble_event_set_att_rsp; + uint16_t rsi_ble_measurement_hndl; + uint16_t rsi_ble_gatt_server_client_config_hndl; + uint16_t subscribed; + }; + + struct BleEvent_t + { + BleEventType eventType; + sl_wfx_msg_t * eventData; + }; + + // ALL Ble functions + static void rsi_ble_on_connect_event(rsi_ble_event_conn_status_t * resp_conn); + static void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason); + static void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn); + static void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write); + static void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu); + static void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp); + static void rsi_ble_on_read_req_event(uint16_t event_id, rsi_ble_read_req_t * rsi_ble_read_req); + static void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid, + uint8_t char_prop); + static void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle, + uuid_t att_val_uuid); + static void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, + uint8_t * data, uint8_t data_len, uint8_t auth_read); + static uint32_t rsi_ble_add_matter_service(void); +}; -#endif +} // namespace Internal +} // namespace DeviceLayer +} // namespace chip