Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of nRF51822 by
Revision 543:53215259c0d2, committed 2016-01-11
- Comitter:
- vcoubard
- Date:
- Mon Jan 11 10:19:03 2016 +0000
- Parent:
- 542:1bf9c597f44f
- Child:
- 544:9e3d053ad4ec
- Commit message:
- Synchronized with git rev cdd5b921
Author: Vincent Coubard
Relaunch discovery operation when gatt event status is
BLE_GATT_STATUS_SUCCESS.
Report error in the Termination callback
Changed in this revision
--- a/source/btle/btle_discovery.cpp Mon Jan 11 10:19:02 2016 +0000
+++ b/source/btle/btle_discovery.cpp Mon Jan 11 10:19:03 2016 +0000
@@ -97,16 +97,24 @@
case BLE_GATTC_EVT_DESC_DISC_RSP: {
uint16_t conn_handle = p_ble_evt->evt.gattc_evt.conn_handle;
+ uint16_t status = p_ble_evt->evt.gattc_evt.gatt_status;
+ ble_gattc_evt_desc_disc_rsp_t discovered_descriptors = p_ble_evt->evt.gattc_evt.params.desc_disc_rsp;
- if (p_ble_evt->evt.gattc_evt.gatt_status != BLE_GATT_STATUS_SUCCESS) {
- characteristicDescriptorDiscoverer.terminate(conn_handle);
- return;
+ switch(status) {
+ case BLE_GATT_STATUS_SUCCESS:
+ characteristicDescriptorDiscoverer.process(
+ conn_handle,
+ discovered_descriptors
+ );
+ break;
+ case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND:
+ // end of discovery
+ characteristicDescriptorDiscoverer.terminate(conn_handle, BLE_ERROR_NONE);
+ break;
+ default:
+ characteristicDescriptorDiscoverer.terminate(conn_handle, BLE_ERROR_UNSPECIFIED);
+ break;
}
-
- characteristicDescriptorDiscoverer.process(
- conn_handle,
- /* discoveredDescriptors */ p_ble_evt->evt.gattc_evt.params.desc_disc_rsp
- );
} break;
}
--- a/source/nRF5xCharacteristicDescriptorDiscoverer.cpp Mon Jan 11 10:19:02 2016 +0000
+++ b/source/nRF5xCharacteristicDescriptorDiscoverer.cpp Mon Jan 11 10:19:03 2016 +0000
@@ -35,7 +35,8 @@
// check if their is any descriptor to discover
if (descriptorEndHandle < descriptorStartHandle) {
CharacteristicDescriptorDiscovery::TerminationCallbackParams_t termParams = {
- characteristic
+ characteristic,
+ BLE_ERROR_NONE
};
terminationCallback.call(&termParams);
return BLE_ERROR_NONE;
@@ -53,30 +54,13 @@
}
// try to launch the discovery
- ble_gattc_handle_range_t discoveryRange = {
- descriptorStartHandle,
- descriptorEndHandle
- };
- uint32_t err = sd_ble_gattc_descriptors_discover(characteristic.getConnectionHandle(), &discoveryRange);
- switch(err) {
- case NRF_SUCCESS:
- // commit the new discovery to its slot
- *discovery = Discovery(
- characteristic,
- discoveryCallback,
- terminationCallback
- );
+ ble_error_t err = gattc_descriptors_discover(connHandle, descriptorStartHandle, descriptorEndHandle);
+ if(!err) {
+ // commit the new discovery to its slot
+ *discovery = Discovery(characteristic, discoveryCallback, terminationCallback);
+ }
- return BLE_ERROR_NONE;
- case BLE_ERROR_INVALID_CONN_HANDLE:
- return BLE_ERROR_INVALID_PARAM;
- case NRF_ERROR_INVALID_ADDR:
- return BLE_ERROR_PARAM_OUT_OF_RANGE;
- case NRF_ERROR_BUSY:
- return BLE_STACK_BUSY;
- default:
- return BLE_ERROR_UNSPECIFIED;
- }
+ return err;
}
bool nRF5xCharacteristicDescriptorDiscoverer::isActive(const DiscoveredCharacteristic& characteristic) const {
@@ -88,13 +72,13 @@
if(discovery) {
discovery->onDiscovery = emptyDiscoveryCallback;
// call terminate anyway
- discovery->terminate();
+ discovery->terminate(BLE_ERROR_NONE);
discovery->onTerminate = emptyTerminationCallback;
}
}
-void nRF5xCharacteristicDescriptorDiscoverer::process(uint16_t handle, const ble_gattc_evt_desc_disc_rsp_t& descriptors) {
- Discovery* discovery = findRunningDiscovery(handle);
+void nRF5xCharacteristicDescriptorDiscoverer::process(uint16_t connectionHandle, const ble_gattc_evt_desc_disc_rsp_t& descriptors) {
+ Discovery* discovery = findRunningDiscovery(connectionHandle);
if(!discovery) {
error("logic error in nRF5xCharacteristicDescriptorDiscoverer::process !!!");
}
@@ -104,14 +88,30 @@
descriptors.descs[i].handle, UUID(descriptors.descs[i].uuid.uuid)
);
}
+
+ // prepare the next discovery request (if needed)
+ uint16_t startHandle = descriptors.descs[descriptors.count - 1].handle + 1;
+ uint16_t endHandle = discovery->characteristic.getLastHandle();
+
+ if(startHandle > endHandle ||
+ (discovery->onDiscovery == emptyDiscoveryCallback && discovery->onTerminate == emptyTerminationCallback)) {
+ terminate(connectionHandle, BLE_ERROR_NONE);
+ return;
+ }
+
+ ble_error_t err = gattc_descriptors_discover(connectionHandle, startHandle, endHandle);
+ if(err) {
+ terminate(connectionHandle, err);
+ return;
+ }
}
-void nRF5xCharacteristicDescriptorDiscoverer::terminate(uint16_t handle) {
+void nRF5xCharacteristicDescriptorDiscoverer::terminate(uint16_t handle, ble_error_t err) {
Discovery* discovery = findRunningDiscovery(handle);
if(!discovery) {
error("logic error in nRF5xCharacteristicDescriptorDiscoverer::process !!!");
}
- discovery->terminate();
+ discovery->terminate(err);
removeDiscovery(discovery);
}
@@ -165,4 +165,27 @@
bool nRF5xCharacteristicDescriptorDiscoverer::isConnectionInUse(uint16_t connHandle) {
return findRunningDiscovery(connHandle) != NULL;
+}
+
+ble_error_t nRF5xCharacteristicDescriptorDiscoverer::gattc_descriptors_discover(
+ uint16_t connection_handle, uint16_t start_handle, uint16_t end_handle) {
+
+ ble_gattc_handle_range_t discoveryRange = {
+ start_handle,
+ end_handle
+ };
+ uint32_t err = sd_ble_gattc_descriptors_discover(connection_handle, &discoveryRange);
+
+ switch(err) {
+ case NRF_SUCCESS:
+ return BLE_ERROR_NONE;
+ case BLE_ERROR_INVALID_CONN_HANDLE:
+ return BLE_ERROR_INVALID_PARAM;
+ case NRF_ERROR_INVALID_ADDR:
+ return BLE_ERROR_PARAM_OUT_OF_RANGE;
+ case NRF_ERROR_BUSY:
+ return BLE_STACK_BUSY;
+ default:
+ return BLE_ERROR_UNSPECIFIED;
+ }
}
\ No newline at end of file
--- a/source/nRF5xCharacteristicDescriptorDiscoverer.h Mon Jan 11 10:19:02 2016 +0000
+++ b/source/nRF5xCharacteristicDescriptorDiscoverer.h Mon Jan 11 10:19:03 2016 +0000
@@ -73,7 +73,7 @@
/**
* @brief Called by the nordic stack when the discovery is over.
*/
- void terminate(uint16_t handle);
+ void terminate(uint16_t handle, ble_error_t err);
private:
nRF5xCharacteristicDescriptorDiscoverer(const nRF5xCharacteristicDescriptorDiscoverer&);
@@ -105,9 +105,10 @@
onDiscovery.call(¶ms);
}
- void terminate() {
+ void terminate(ble_error_t err) {
CharacteristicDescriptorDiscovery::TerminationCallbackParams_t params = {
- characteristic
+ characteristic,
+ err
};
onTerminate.call(¶ms);
}
@@ -125,6 +126,8 @@
void removeDiscovery(Discovery* discovery);
Discovery* getAvailableDiscoverySlot();
bool isConnectionInUse(uint16_t connHandle);
+ static ble_error_t gattc_descriptors_discover(uint16_t connection_handle, uint16_t start_handle, uint16_t end_handle);
+
size_t maximumConcurrentConnectionsCount;
Discovery *discoveryRunning;
--- a/source/nRF5xServiceDiscovery.cpp Mon Jan 11 10:19:02 2016 +0000
+++ b/source/nRF5xServiceDiscovery.cpp Mon Jan 11 10:19:03 2016 +0000
@@ -78,7 +78,6 @@
void
nRF5xServiceDiscovery::setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response)
{
- characteristicIndex = 0;
numCharacteristics = response->count;
/* Account for the limitation on the number of discovered characteristics we can handle at a time. */
@@ -114,37 +113,38 @@
void
nRF5xServiceDiscovery::progressCharacteristicDiscovery(void)
{
- /* Iterate through the previously discovered characteristics cached in characteristics[]. */
- while ((state == CHARACTERISTIC_DISCOVERY_ACTIVE) && (characteristicIndex < numCharacteristics)) {
+ for(uint8_t i = 0; i < numCharacteristics; ++i) {
+ if(state != CHARACTERISTIC_DISCOVERY_ACTIVE) {
+ return;
+ }
+
if ((matchingCharacteristicUUID == UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) ||
((matchingCharacteristicUUID == characteristics[characteristicIndex].getUUID()) &&
(matchingServiceUUID != UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)))) {
if (characteristicCallback) {
- characteristicCallback(&characteristics[characteristicIndex]);
+ characteristicCallback(&characteristics[i]);
}
}
+ }
- characteristicIndex++;
+ if(state != CHARACTERISTIC_DISCOVERY_ACTIVE) {
+ return;
}
- /* Relaunch discovery of new characteristics beyond the last entry cached in characteristics[]. */
- if (state == CHARACTERISTIC_DISCOVERY_ACTIVE) {
- /* Determine the ending handle of the last cached characteristic. */
- Gap::Handle_t startHandle = characteristics[characteristicIndex - 1].getValueHandle() + 1;
- Gap::Handle_t endHandle = services[serviceIndex].getEndHandle();
- resetDiscoveredCharacteristics(); /* Note: resetDiscoveredCharacteristics() must come after fetching start and end Handles. */
+ Gap::Handle_t startHandle = characteristics[characteristicIndex - 1].getValueHandle() + 1;
+ Gap::Handle_t endHandle = services[serviceIndex].getEndHandle();
+ resetDiscoveredCharacteristics(); /* Note: resetDiscoveredCharacteristics() must come after fetching start and end Handles. */
- if (startHandle < endHandle) {
- ble_gattc_handle_range_t handleRange = {
- .start_handle = startHandle,
- .end_handle = endHandle
- };
- if (sd_ble_gattc_characteristics_discover(connHandle, &handleRange) != NRF_SUCCESS) {
- terminateCharacteristicDiscovery();
- }
- } else {
+ if (startHandle < endHandle) {
+ ble_gattc_handle_range_t handleRange = {
+ .start_handle = startHandle,
+ .end_handle = endHandle
+ };
+ if (sd_ble_gattc_characteristics_discover(connHandle, &handleRange) != NRF_SUCCESS) {
terminateCharacteristicDiscovery();
}
+ } else {
+ terminateCharacteristicDiscovery();
}
}
