diff --git a/src/include/platform/CHIPDeviceEvent.h b/src/include/platform/CHIPDeviceEvent.h index 7c352b7ded3246..d5266f422ae0dd 100644 --- a/src/include/platform/CHIPDeviceEvent.h +++ b/src/include/platform/CHIPDeviceEvent.h @@ -226,6 +226,7 @@ enum InternalEventTypes kCHIPoBLEWriteReceived, kCHIPoBLEIndicateConfirm, kCHIPoBLEConnectionError, + kCHIPoBLENotifyConfirm }; static_assert(kEventTypeNotSet == 0, "kEventTypeNotSet must be defined as 0"); @@ -393,6 +394,10 @@ struct ChipDeviceEvent final CHIP_ERROR Reason; } CHIPoBLEConnectionError; struct + { + BLE_CONNECTION_OBJECT ConId; + } CHIPoBLENotifyConfirm; + struct { bool RoleChanged : 1; bool AddressChanged : 1; diff --git a/src/platform/EFR32/BLEManagerImpl.cpp b/src/platform/EFR32/BLEManagerImpl.cpp index 67c968b9f9451f..59deff77e5d2f5 100644 --- a/src/platform/EFR32/BLEManagerImpl.cpp +++ b/src/platform/EFR32/BLEManagerImpl.cpp @@ -291,7 +291,7 @@ void BLEManagerImpl::bluetoothStackEventHandler(void * p_arg) if (sl_bt_gatt_server_confirmation == StatusFlags) { - sInstance.HandleTxConfirmationEvent(bluetooth_evt); + sInstance.HandleTxConfirmationEvent(bluetooth_evt->data.evt_gatt_server_characteristic_status.connection); } else if ((bluetooth_evt->data.evt_gatt_server_characteristic_status.characteristic == gattdb_CHIPoBLEChar_Tx) && (bluetooth_evt->data.evt_gatt_server_characteristic_status.status_flags == gatt_server_client_config)) @@ -452,6 +452,12 @@ void BLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) } break; + case DeviceEventType::kCHIPoBLENotifyConfirm: { + ChipLogProgress(DeviceLayer, "_OnPlatformEvent kCHIPoBLENotifyConfirm"); + HandleTxConfirmationEvent(event->CHIPoBLENotifyConfirm.ConId); + } + break; + default: ChipLogProgress(DeviceLayer, "_OnPlatformEvent default: event->Type = %d", event->Type); break; @@ -502,23 +508,31 @@ bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUU sl_status_t ret; uint16_t cId = (UUIDsMatch(&ChipUUID_CHIPoBLEChar_RX, charId) ? gattdb_CHIPoBLEChar_Rx : gattdb_CHIPoBLEChar_Tx); uint8_t timerHandle = GetTimerHandle(conId, true); + ChipDeviceEvent event; VerifyOrExit(((conState != NULL) && (conState->subscribed != 0)), err = CHIP_ERROR_INVALID_ARGUMENT); VerifyOrExit(timerHandle != kMaxConnections, err = CHIP_ERROR_NO_MEMORY); - // start timer for light indication confirmation. Long delay for spake2 indication + // start timer for light notification confirmation. Long delay for spake2 indication sl_bt_system_set_soft_timer(TIMER_S_2_TIMERTICK(6), timerHandle, true); - ret = sl_bt_gatt_server_send_indication(conId, cId, (data->DataLength()), data->Start()); - + ret = sl_bt_gatt_server_send_notification(conId, cId, (data->DataLength()), data->Start()); err = MapBLEError(ret); + if (err == CHIP_NO_ERROR) + { + event.Type = DeviceEventType::kCHIPoBLENotifyConfirm; + event.CHIPoBLENotifyConfirm.ConId = conId; + PlatformMgr().PostEvent(&event); + } + exit: if (err != CHIP_NO_ERROR) { ChipLogError(DeviceLayer, "BLEManagerImpl::SendIndication() failed: %s", ErrorStr(err)); return false; } + return true; } @@ -558,6 +572,8 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr) 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; default: return ChipError::Encapsulate(ChipError::Range::kPlatform, bleErr + CHIP_DEVICE_CONFIG_EFR32_BLE_ERROR_MIN); } @@ -887,19 +903,20 @@ void BLEManagerImpl::HandleTXCharCCCDWrite(volatile sl_bt_msg_t * evt) { CHIP_ERROR err = CHIP_NO_ERROR; CHIPoBLEConState * bleConnState; - bool indicationsEnabled; + bool isDisabled; ChipDeviceEvent event; bleConnState = GetConnectionState(evt->data.evt_gatt_server_user_write_request.connection); - VerifyOrExit(bleConnState != NULL, err = CHIP_ERROR_NO_MEMORY); - // Determine if the client is enabling or disabling indications. - indicationsEnabled = (evt->data.evt_gatt_server_characteristic_status.client_config_flags == gatt_indication); + // Determine if the client is enabling or disabling notification/indication. + isDisabled = (evt->data.evt_gatt_server_characteristic_status.client_config_flags == sl_bt_gatt_disable); - ChipLogProgress(DeviceLayer, "CHIPoBLE %s received", indicationsEnabled ? "subscribe" : "unsubscribe"); + ChipLogProgress(DeviceLayer, "HandleTXcharCCCDWrite - Config Flags value : %d", + evt->data.evt_gatt_server_characteristic_status.client_config_flags); + ChipLogProgress(DeviceLayer, "CHIPoBLE %s received", isDisabled ? "unsubscribe" : "subscribe"); - if (indicationsEnabled) + if (!isDisabled) { // If indications are not already enabled for the connection... if (!bleConnState->subscribed) @@ -959,10 +976,10 @@ void BLEManagerImpl::HandleRXCharWrite(volatile sl_bt_msg_t * evt) } } -void BLEManagerImpl::HandleTxConfirmationEvent(volatile sl_bt_msg_t * evt) +void BLEManagerImpl::HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId) { ChipDeviceEvent event; - uint8_t timerHandle = sInstance.GetTimerHandle(evt->data.evt_gatt_server_characteristic_status.connection); + uint8_t timerHandle = sInstance.GetTimerHandle(conId); ChipLogProgress(DeviceLayer, "Tx Confirmation received"); @@ -974,7 +991,7 @@ void BLEManagerImpl::HandleTxConfirmationEvent(volatile sl_bt_msg_t * evt) } event.Type = DeviceEventType::kCHIPoBLEIndicateConfirm; - event.CHIPoBLEIndicateConfirm.ConId = evt->data.evt_gatt_server_characteristic_status.connection; + event.CHIPoBLEIndicateConfirm.ConId = conId; PlatformMgr().PostEvent(&event); } diff --git a/src/platform/EFR32/BLEManagerImpl.h b/src/platform/EFR32/BLEManagerImpl.h index b00c99a8f99bb1..b1b40dd977a7ec 100644 --- a/src/platform/EFR32/BLEManagerImpl.h +++ b/src/platform/EFR32/BLEManagerImpl.h @@ -139,7 +139,7 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla void HandleWriteEvent(volatile sl_bt_msg_t * evt); void HandleTXCharCCCDWrite(volatile sl_bt_msg_t * evt); void HandleRXCharWrite(volatile sl_bt_msg_t * evt); - void HandleTxConfirmationEvent(volatile sl_bt_msg_t * evt); + void HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId); void HandleSoftTimerEvent(volatile sl_bt_msg_t * evt); bool RemoveConnection(uint8_t connectionHandle); void AddConnection(uint8_t connectionHandle, uint8_t bondingHandle); diff --git a/src/platform/EFR32/gatt.xml b/src/platform/EFR32/gatt.xml index fddd8a951779a7..f4cb14332347ff 100644 --- a/src/platform/EFR32/gatt.xml +++ b/src/platform/EFR32/gatt.xml @@ -19,80 +19,88 @@ - + Abstract: The generic_access service contains generic information about the device. All available Characteristics are readonly. - + - + Empty Example - + + + + - + - + Abstract: The external appearance of this device. The values are composed of a category (10-bits) and sub-categories (6-bits). 0000 - + + + - + Abstract: The Device Information Service exposes manufacturer and/or vendor information about a device. Summary: This service exposes manufacturer information about a device. The Device Information Service is instantiated as a Primary Service. Only one instance of the Device Information Service is exposed on a device. - + - + Abstract: The value of this characteristic is a UTF-8 string representing the name of the manufacturer of the device. Silicon Labs - + + + - + - + Abstract: The value of this characteristic is a UTF-8 string representing the model number assigned by the device vendor. Blue Gecko - + + + - + - + Abstract: The SYSTEM ID characteristic consists of a structure with two fields. The first field are the LSOs and the second field contains the MSOs. This is a 64-bit structure which consists of a 40-bit manufacturer-defined identifier concatenated with a 24 bit unique Organizationally Unique Identifier (OUI). The OUI is issued by the IEEE Registration Authority (http://standards.ieee.org/regauth/index.html) and is required to be used in accordance with IEEE Standard 802-2001.6 while the least significant 40 bits are manufacturer defined. If System ID generated based on a Bluetooth Device Address, it is required to be done as follows. System ID and the Bluetooth Device Address have a very similar structure: a Bluetooth Device Address is 48 bits in length and consists of a 24 bit Company Assigned Identifier (manufacturer defined identifier) concatenated with a 24 bit Company Identifier (OUI). In order to encapsulate a Bluetooth Device Address as System ID, the Company Identifier is concatenated with 0xFFFE followed by the Company Assigned Identifier of the Bluetooth Address. For more guidelines related to EUI-64, refer to http://standards.ieee.org/develop/regauth/tut/eui64.pdf. Examples: If the system ID is based of a Bluetooth Device Address with a Company Identifier (OUI) is 0x123456 and the Company Assigned Identifier is 0x9ABCDE, then the System Identifier is required to be 0x123456FFFE9ABCDE. 000102030405 - + + + - - - - Abstract: The Silicon Labs OTA Service enables over-the-air firmware update of the device. - - - - Abstract: Silicon Labs OTA Control. - - - - - + Custom service - + - + Custom characteristic - 0x00 - + 00 + + + + - + - + Custom characteristic - 0x00 - + 00 + + + + + + + diff --git a/src/platform/EFR32/gatt_db.c b/src/platform/EFR32/gatt_db.c index 4b58ed9091743d..1a173698a9be9e 100644 --- a/src/platform/EFR32/gatt_db.c +++ b/src/platform/EFR32/gatt_db.c @@ -54,7 +54,7 @@ GATT_DATA(const sli_bt_gattdb_value_t gattdb_attribute_field_26) = { .len = 16, 0x1d, } }; GATT_DATA(sli_bt_gattdb_attribute_chrvalue_t - gattdb_attribute_field_24) = { .properties = 0x2e, + gattdb_attribute_field_24) = { .properties = 0x3e, .max_len = 247, .len = 1, .data = { @@ -352,7 +352,7 @@ GATT_DATA(const sli_bt_gattdb_attribute_t gattdb_attributes_map[]) = { .caps = 0xffff, .state = 0x00, .datatype = 0x05, - .characteristic = { .properties = 0x2e, .char_uuid = 0x8001 } }, + .characteristic = { .properties = 0x3e, .char_uuid = 0x8001 } }, { .handle = 0x19, .uuid = 0x8001, .permissions = 0x807, @@ -366,7 +366,7 @@ GATT_DATA(const sli_bt_gattdb_attribute_t gattdb_attributes_map[]) = { .caps = 0xffff, .state = 0x00, .datatype = 0x03, - .configdata = { .flags = 0x02, .clientconfig_index = 0x01 } }, + .configdata = { .flags = 0x03, .clientconfig_index = 0x01 } }, { .handle = 0x1b, .uuid = 0x0000, .permissions = 0x801,