54:e2294c844c83 Add support for adding descriptors

This commit is contained in:
Rohit Grover 2014-09-02 13:34:54 +01:00
parent d1a8667c1d
commit d22868169f
4 changed files with 88 additions and 6 deletions

View file

@ -245,3 +245,53 @@ error_t custom_add_in_characteristic(uint16_t service_handle,
return ERROR_NONE;
}
/**************************************************************************/
/*!
@brief Adds a new descriptor to the custom service, assigning
value, a UUID add-on value, etc.
@param[in] char_handle
@param[in] p_uuid The 16-bit value to add to the base UUID
for this descriptor (normally >1
since 1 is typically used by the primary
service).
@param[in] max_length The maximum length of this descriptor
@returns
@retval ERROR_NONE Everything executed normally
*/
/**************************************************************************/
error_t custom_add_in_descriptor(uint16_t char_handle,
ble_uuid_t *p_uuid,
uint8_t *p_data,
uint16_t min_length,
uint16_t max_length,
uint16_t *p_desc_handle)
{
/* Descriptor metadata */
ble_gatts_attr_md_t desc_md = {0};
desc_md.vloc = BLE_GATTS_VLOC_STACK;
desc_md.vlen = (min_length == max_length) ? 0 : 1;
/* Make it readable and writable */
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&desc_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&desc_md.write_perm);
ble_gatts_attr_t attr_desc = {0};
attr_desc.p_uuid = p_uuid;
attr_desc.p_attr_md = &desc_md;
attr_desc.init_len = min_length;
attr_desc.max_len = max_length;
attr_desc.p_value = p_data;
ASSERT_STATUS ( sd_ble_gatts_descriptor_add(char_handle,
&attr_desc,
p_desc_handle));
return ERROR_NONE;
}

View file

@ -38,6 +38,13 @@ error_t custom_add_in_characteristic(uint16_t service_handle,
uint16_t max_length,
ble_gatts_char_handles_t *p_char_handle);
error_t custom_add_in_descriptor(uint16_t char_handle,
ble_uuid_t *p_uuid,
uint8_t *p_data,
uint16_t min_length,
uint16_t max_length,
uint16_t *p_desc_handle);
#ifdef __cplusplus
}
#endif

View file

@ -63,10 +63,10 @@ ble_error_t nRF51GattServer::addService(GattService &service)
nordicUUID = custom_convert_to_nordic_uuid(p_char->getUUID());
ASSERT ( ERROR_NONE ==
custom_add_in_characteristic(service.getHandle(),
custom_add_in_characteristic(BLE_GATT_HANDLE_INVALID,
&nordicUUID,
p_char->getProperties(),
NULL,
p_char->getValuePtr(),
p_char->getInitialLength(),
p_char->getMaxLength(),
&nrfCharacteristicHandles[characteristicCount]),
@ -77,9 +77,28 @@ ble_error_t nRF51GattServer::addService(GattService &service)
p_characteristics[characteristicCount++] = p_char;
p_char->setHandle(charHandle);
if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) {
updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
/* Add optional descriptors if any */
/* ToDo: Make sure we don't overflow the array */
for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) {
GattAttribute *p_desc = p_char->getDescriptor(j);
nordicUUID = custom_convert_to_nordic_uuid(p_desc->getUUID());
ASSERT ( ERROR_NONE ==
custom_add_in_descriptor(BLE_GATT_HANDLE_INVALID,
&nordicUUID,
p_desc->getValuePtr(),
p_desc->getInitialLength(),
p_desc->getMaxLength(),
&nrfDescriptorHandles[descriptorCount]),
BLE_ERROR_PARAM_OUT_OF_RANGE );
uint16_t descHandle = descriptorCount;
p_descriptors[descriptorCount++] = p_desc;
p_desc->setHandle(descHandle);
}
}
serviceCount++;
@ -272,8 +291,10 @@ void nRF51GattServer::hwCallback(ble_evt_t *p_ble_evt)
event = GattServerEvents::GATT_EVENT_DATA_WRITTEN;
break;
case BLE_EVT_TX_COMPLETE:
handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
case BLE_EVT_TX_COMPLETE:
for (uint8_t i = 0; i<p_ble_evt->evt.common_evt.params.tx_complete.count; i++){
handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
}
return;
case BLE_GATTS_EVT_HVC:

View file

@ -24,6 +24,7 @@
#include "public/GattServer.h"
#define BLE_TOTAL_CHARACTERISTICS 10
#define BLE_TOTAL_DESCRIPTORS 10
class nRF51GattServer : public GattServer
{
@ -50,10 +51,13 @@ public:
private:
GattCharacteristic *p_characteristics[BLE_TOTAL_CHARACTERISTICS];
ble_gatts_char_handles_t nrfCharacteristicHandles[BLE_TOTAL_CHARACTERISTICS];
GattAttribute *p_descriptors[BLE_TOTAL_DESCRIPTORS];
uint16_t nrfDescriptorHandles[BLE_TOTAL_DESCRIPTORS];
nRF51GattServer() {
serviceCount = 0;
characteristicCount = 0;
descriptorCount = 0;
};
nRF51GattServer(nRF51GattServer const &);