Attempting to publish a tree

Dependencies:   nrf51-sdk

Dependents:   microbit-dal

Fork of nRF51822 by Lancaster University

Committer:
cefn
Date:
Wed Jun 01 17:41:42 2016 +0000
Revision:
624:3ef324d9f2df
Parent:
616:a8f9b022d8fd
Attempting to publish a tree

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LancasterUniversity 615:65ea2acfc6a2 1 /* mbed Microcontroller Library
LancasterUniversity 615:65ea2acfc6a2 2 * Copyright (c) 2006-2013 ARM Limited
LancasterUniversity 615:65ea2acfc6a2 3 *
LancasterUniversity 615:65ea2acfc6a2 4 * Licensed under the Apache License, Version 2.0 (the "License");
LancasterUniversity 615:65ea2acfc6a2 5 * you may not use this file except in compliance with the License.
LancasterUniversity 615:65ea2acfc6a2 6 * You may obtain a copy of the License at
LancasterUniversity 615:65ea2acfc6a2 7 *
LancasterUniversity 615:65ea2acfc6a2 8 * http://www.apache.org/licenses/LICENSE-2.0
LancasterUniversity 615:65ea2acfc6a2 9 *
LancasterUniversity 615:65ea2acfc6a2 10 * Unless required by applicable law or agreed to in writing, software
LancasterUniversity 615:65ea2acfc6a2 11 * distributed under the License is distributed on an "AS IS" BASIS,
LancasterUniversity 615:65ea2acfc6a2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
LancasterUniversity 615:65ea2acfc6a2 13 * See the License for the specific language governing permissions and
LancasterUniversity 615:65ea2acfc6a2 14 * limitations under the License.
LancasterUniversity 615:65ea2acfc6a2 15 */
LancasterUniversity 615:65ea2acfc6a2 16
LancasterUniversity 615:65ea2acfc6a2 17 #include "nRF5xServiceDiscovery.h"
LancasterUniversity 615:65ea2acfc6a2 18
LancasterUniversity 615:65ea2acfc6a2 19 ble_error_t
LancasterUniversity 615:65ea2acfc6a2 20 nRF5xServiceDiscovery::launchCharacteristicDiscovery(Gap::Handle_t connectionHandle,
LancasterUniversity 615:65ea2acfc6a2 21 Gap::Handle_t startHandle,
LancasterUniversity 615:65ea2acfc6a2 22 Gap::Handle_t endHandle)
LancasterUniversity 615:65ea2acfc6a2 23 {
LancasterUniversity 615:65ea2acfc6a2 24 characteristicDiscoveryStarted(connectionHandle);
LancasterUniversity 615:65ea2acfc6a2 25
LancasterUniversity 615:65ea2acfc6a2 26 ble_gattc_handle_range_t handleRange = {
LancasterUniversity 615:65ea2acfc6a2 27 .start_handle = startHandle,
LancasterUniversity 615:65ea2acfc6a2 28 .end_handle = endHandle
LancasterUniversity 615:65ea2acfc6a2 29 };
LancasterUniversity 616:a8f9b022d8fd 30 uint32_t rc = sd_ble_gattc_characteristics_discover(connectionHandle, &handleRange);
LancasterUniversity 616:a8f9b022d8fd 31 ble_error_t err = BLE_ERROR_NONE;
LancasterUniversity 616:a8f9b022d8fd 32
LancasterUniversity 616:a8f9b022d8fd 33 switch (rc) {
LancasterUniversity 616:a8f9b022d8fd 34 case NRF_SUCCESS:
LancasterUniversity 616:a8f9b022d8fd 35 err = BLE_ERROR_NONE;
LancasterUniversity 616:a8f9b022d8fd 36 break;
LancasterUniversity 616:a8f9b022d8fd 37 case BLE_ERROR_INVALID_CONN_HANDLE:
LancasterUniversity 616:a8f9b022d8fd 38 case NRF_ERROR_INVALID_ADDR:
LancasterUniversity 616:a8f9b022d8fd 39 err = BLE_ERROR_INVALID_PARAM;
LancasterUniversity 616:a8f9b022d8fd 40 break;
LancasterUniversity 616:a8f9b022d8fd 41 case NRF_ERROR_BUSY:
LancasterUniversity 616:a8f9b022d8fd 42 err = BLE_STACK_BUSY;
LancasterUniversity 616:a8f9b022d8fd 43 break;
LancasterUniversity 616:a8f9b022d8fd 44 case NRF_ERROR_INVALID_STATE:
LancasterUniversity 616:a8f9b022d8fd 45 err = BLE_ERROR_INVALID_STATE;
LancasterUniversity 616:a8f9b022d8fd 46 break;
LancasterUniversity 616:a8f9b022d8fd 47 default:
LancasterUniversity 616:a8f9b022d8fd 48 err = BLE_ERROR_UNSPECIFIED;
LancasterUniversity 616:a8f9b022d8fd 49 break;
LancasterUniversity 615:65ea2acfc6a2 50 }
LancasterUniversity 615:65ea2acfc6a2 51
LancasterUniversity 616:a8f9b022d8fd 52 if (err) {
LancasterUniversity 616:a8f9b022d8fd 53 terminateCharacteristicDiscovery(err);
LancasterUniversity 616:a8f9b022d8fd 54 }
LancasterUniversity 616:a8f9b022d8fd 55 return err;
LancasterUniversity 615:65ea2acfc6a2 56 }
LancasterUniversity 615:65ea2acfc6a2 57
LancasterUniversity 615:65ea2acfc6a2 58 void
LancasterUniversity 615:65ea2acfc6a2 59 nRF5xServiceDiscovery::setupDiscoveredServices(const ble_gattc_evt_prim_srvc_disc_rsp_t *response)
LancasterUniversity 615:65ea2acfc6a2 60 {
LancasterUniversity 615:65ea2acfc6a2 61 serviceIndex = 0;
LancasterUniversity 615:65ea2acfc6a2 62 numServices = response->count;
LancasterUniversity 615:65ea2acfc6a2 63
LancasterUniversity 615:65ea2acfc6a2 64 /* Account for the limitation on the number of discovered services we can handle at a time. */
LancasterUniversity 615:65ea2acfc6a2 65 if (numServices > BLE_DB_DISCOVERY_MAX_SRV) {
LancasterUniversity 615:65ea2acfc6a2 66 numServices = BLE_DB_DISCOVERY_MAX_SRV;
LancasterUniversity 615:65ea2acfc6a2 67 }
LancasterUniversity 615:65ea2acfc6a2 68
LancasterUniversity 615:65ea2acfc6a2 69 serviceUUIDDiscoveryQueue.reset();
LancasterUniversity 615:65ea2acfc6a2 70 for (unsigned serviceIndex = 0; serviceIndex < numServices; serviceIndex++) {
LancasterUniversity 615:65ea2acfc6a2 71 if (response->services[serviceIndex].uuid.type == BLE_UUID_TYPE_UNKNOWN) {
LancasterUniversity 615:65ea2acfc6a2 72 serviceUUIDDiscoveryQueue.enqueue(serviceIndex);
LancasterUniversity 615:65ea2acfc6a2 73 services[serviceIndex].setup(response->services[serviceIndex].handle_range.start_handle,
LancasterUniversity 615:65ea2acfc6a2 74 response->services[serviceIndex].handle_range.end_handle);
LancasterUniversity 615:65ea2acfc6a2 75 } else {
LancasterUniversity 615:65ea2acfc6a2 76 services[serviceIndex].setup(response->services[serviceIndex].uuid.uuid,
LancasterUniversity 615:65ea2acfc6a2 77 response->services[serviceIndex].handle_range.start_handle,
LancasterUniversity 615:65ea2acfc6a2 78 response->services[serviceIndex].handle_range.end_handle);
LancasterUniversity 615:65ea2acfc6a2 79 }
LancasterUniversity 615:65ea2acfc6a2 80 }
LancasterUniversity 615:65ea2acfc6a2 81
LancasterUniversity 615:65ea2acfc6a2 82 /* Trigger discovery of service UUID if necessary. */
LancasterUniversity 615:65ea2acfc6a2 83 if (serviceUUIDDiscoveryQueue.getCount()) {
LancasterUniversity 615:65ea2acfc6a2 84 serviceUUIDDiscoveryQueue.triggerFirst();
LancasterUniversity 615:65ea2acfc6a2 85 }
LancasterUniversity 615:65ea2acfc6a2 86 }
LancasterUniversity 615:65ea2acfc6a2 87
LancasterUniversity 615:65ea2acfc6a2 88 void
LancasterUniversity 615:65ea2acfc6a2 89 nRF5xServiceDiscovery::setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response)
LancasterUniversity 615:65ea2acfc6a2 90 {
LancasterUniversity 615:65ea2acfc6a2 91 numCharacteristics = response->count;
LancasterUniversity 615:65ea2acfc6a2 92
LancasterUniversity 615:65ea2acfc6a2 93 /* Account for the limitation on the number of discovered characteristics we can handle at a time. */
LancasterUniversity 615:65ea2acfc6a2 94 if (numCharacteristics > BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV) {
LancasterUniversity 615:65ea2acfc6a2 95 numCharacteristics = BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV;
LancasterUniversity 615:65ea2acfc6a2 96 }
LancasterUniversity 615:65ea2acfc6a2 97
LancasterUniversity 615:65ea2acfc6a2 98 charUUIDDiscoveryQueue.reset();
LancasterUniversity 615:65ea2acfc6a2 99 for (unsigned charIndex = 0; charIndex < numCharacteristics; charIndex++) {
LancasterUniversity 615:65ea2acfc6a2 100 if (response->chars[charIndex].uuid.type == BLE_UUID_TYPE_UNKNOWN) {
LancasterUniversity 615:65ea2acfc6a2 101 charUUIDDiscoveryQueue.enqueue(charIndex);
LancasterUniversity 615:65ea2acfc6a2 102 characteristics[charIndex].setup(gattc,
LancasterUniversity 615:65ea2acfc6a2 103 connHandle,
LancasterUniversity 615:65ea2acfc6a2 104 response->chars[charIndex].char_props,
LancasterUniversity 615:65ea2acfc6a2 105 response->chars[charIndex].handle_decl,
LancasterUniversity 615:65ea2acfc6a2 106 response->chars[charIndex].handle_value);
LancasterUniversity 615:65ea2acfc6a2 107 } else {
LancasterUniversity 615:65ea2acfc6a2 108 characteristics[charIndex].setup(gattc,
LancasterUniversity 615:65ea2acfc6a2 109 connHandle,
LancasterUniversity 615:65ea2acfc6a2 110 response->chars[charIndex].uuid.uuid,
LancasterUniversity 615:65ea2acfc6a2 111 response->chars[charIndex].char_props,
LancasterUniversity 615:65ea2acfc6a2 112 response->chars[charIndex].handle_decl,
LancasterUniversity 615:65ea2acfc6a2 113 response->chars[charIndex].handle_value);
LancasterUniversity 615:65ea2acfc6a2 114 }
LancasterUniversity 615:65ea2acfc6a2 115 }
LancasterUniversity 615:65ea2acfc6a2 116
LancasterUniversity 615:65ea2acfc6a2 117 /* Trigger discovery of char UUID if necessary. */
LancasterUniversity 615:65ea2acfc6a2 118 if (charUUIDDiscoveryQueue.getCount()) {
LancasterUniversity 615:65ea2acfc6a2 119 charUUIDDiscoveryQueue.triggerFirst();
LancasterUniversity 615:65ea2acfc6a2 120 }
LancasterUniversity 615:65ea2acfc6a2 121 }
LancasterUniversity 615:65ea2acfc6a2 122
LancasterUniversity 615:65ea2acfc6a2 123 void
LancasterUniversity 615:65ea2acfc6a2 124 nRF5xServiceDiscovery::progressCharacteristicDiscovery(void)
LancasterUniversity 615:65ea2acfc6a2 125 {
LancasterUniversity 616:a8f9b022d8fd 126 if (state != CHARACTERISTIC_DISCOVERY_ACTIVE) {
LancasterUniversity 616:a8f9b022d8fd 127 return;
LancasterUniversity 616:a8f9b022d8fd 128 }
LancasterUniversity 616:a8f9b022d8fd 129
LancasterUniversity 616:a8f9b022d8fd 130 if ((discoveredCharacteristic != nRF5xDiscoveredCharacteristic()) && (numCharacteristics > 0)) {
LancasterUniversity 616:a8f9b022d8fd 131 discoveredCharacteristic.setLastHandle(characteristics[0].getDeclHandle() - 1);
LancasterUniversity 616:a8f9b022d8fd 132
LancasterUniversity 615:65ea2acfc6a2 133 if ((matchingCharacteristicUUID == UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) ||
LancasterUniversity 616:a8f9b022d8fd 134 ((matchingCharacteristicUUID == discoveredCharacteristic.getUUID()) &&
LancasterUniversity 615:65ea2acfc6a2 135 (matchingServiceUUID != UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)))) {
LancasterUniversity 615:65ea2acfc6a2 136 if (characteristicCallback) {
LancasterUniversity 616:a8f9b022d8fd 137 characteristicCallback(&discoveredCharacteristic);
LancasterUniversity 615:65ea2acfc6a2 138 }
LancasterUniversity 615:65ea2acfc6a2 139 }
LancasterUniversity 615:65ea2acfc6a2 140 }
LancasterUniversity 615:65ea2acfc6a2 141
LancasterUniversity 616:a8f9b022d8fd 142 for (uint8_t i = 0; i < numCharacteristics; ++i) {
LancasterUniversity 616:a8f9b022d8fd 143 if (state != CHARACTERISTIC_DISCOVERY_ACTIVE) {
LancasterUniversity 616:a8f9b022d8fd 144 return;
LancasterUniversity 616:a8f9b022d8fd 145 }
LancasterUniversity 616:a8f9b022d8fd 146
LancasterUniversity 616:a8f9b022d8fd 147 if (i == (numCharacteristics - 1)) {
LancasterUniversity 616:a8f9b022d8fd 148 discoveredCharacteristic = characteristics[i];
LancasterUniversity 616:a8f9b022d8fd 149 break;
LancasterUniversity 616:a8f9b022d8fd 150 } else {
LancasterUniversity 616:a8f9b022d8fd 151 characteristics[i].setLastHandle(characteristics[i + 1].getDeclHandle() - 1);
LancasterUniversity 616:a8f9b022d8fd 152 }
LancasterUniversity 615:65ea2acfc6a2 153
LancasterUniversity 616:a8f9b022d8fd 154 if ((matchingCharacteristicUUID == UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) ||
LancasterUniversity 616:a8f9b022d8fd 155 ((matchingCharacteristicUUID == characteristics[i].getUUID()) &&
LancasterUniversity 616:a8f9b022d8fd 156 (matchingServiceUUID != UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)))) {
LancasterUniversity 616:a8f9b022d8fd 157 if (characteristicCallback) {
LancasterUniversity 616:a8f9b022d8fd 158 characteristicCallback(&characteristics[i]);
LancasterUniversity 615:65ea2acfc6a2 159 }
LancasterUniversity 615:65ea2acfc6a2 160 }
LancasterUniversity 615:65ea2acfc6a2 161 }
LancasterUniversity 616:a8f9b022d8fd 162
LancasterUniversity 616:a8f9b022d8fd 163 if (state != CHARACTERISTIC_DISCOVERY_ACTIVE) {
LancasterUniversity 616:a8f9b022d8fd 164 return;
LancasterUniversity 616:a8f9b022d8fd 165 }
LancasterUniversity 616:a8f9b022d8fd 166
LancasterUniversity 616:a8f9b022d8fd 167 Gap::Handle_t startHandle = (numCharacteristics > 0) ? characteristics[numCharacteristics - 1].getValueHandle() + 1 : SRV_DISC_END_HANDLE;
LancasterUniversity 616:a8f9b022d8fd 168 Gap::Handle_t endHandle = services[serviceIndex].getEndHandle();
LancasterUniversity 616:a8f9b022d8fd 169 resetDiscoveredCharacteristics(); /* Note: resetDiscoveredCharacteristics() must come after fetching start and end Handles. */
LancasterUniversity 616:a8f9b022d8fd 170
LancasterUniversity 616:a8f9b022d8fd 171 if (startHandle < endHandle) {
LancasterUniversity 616:a8f9b022d8fd 172 ble_gattc_handle_range_t handleRange = {
LancasterUniversity 616:a8f9b022d8fd 173 .start_handle = startHandle,
LancasterUniversity 616:a8f9b022d8fd 174 .end_handle = endHandle
LancasterUniversity 616:a8f9b022d8fd 175 };
LancasterUniversity 616:a8f9b022d8fd 176 if (sd_ble_gattc_characteristics_discover(connHandle, &handleRange) != NRF_SUCCESS) {
LancasterUniversity 616:a8f9b022d8fd 177 terminateCharacteristicDiscovery(BLE_ERROR_UNSPECIFIED);
LancasterUniversity 616:a8f9b022d8fd 178 }
LancasterUniversity 616:a8f9b022d8fd 179 } else {
LancasterUniversity 616:a8f9b022d8fd 180 terminateCharacteristicDiscovery(BLE_ERROR_NONE);
LancasterUniversity 616:a8f9b022d8fd 181 }
LancasterUniversity 615:65ea2acfc6a2 182 }
LancasterUniversity 615:65ea2acfc6a2 183
LancasterUniversity 615:65ea2acfc6a2 184 void
LancasterUniversity 615:65ea2acfc6a2 185 nRF5xServiceDiscovery::progressServiceDiscovery(void)
LancasterUniversity 615:65ea2acfc6a2 186 {
LancasterUniversity 615:65ea2acfc6a2 187 /* Iterate through the previously discovered services cached in services[]. */
LancasterUniversity 615:65ea2acfc6a2 188 while ((state == SERVICE_DISCOVERY_ACTIVE) && (serviceIndex < numServices)) {
LancasterUniversity 615:65ea2acfc6a2 189 if ((matchingServiceUUID == UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) ||
LancasterUniversity 615:65ea2acfc6a2 190 (matchingServiceUUID == services[serviceIndex].getUUID())) {
LancasterUniversity 615:65ea2acfc6a2 191
LancasterUniversity 615:65ea2acfc6a2 192 if (serviceCallback && (matchingCharacteristicUUID == UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN))) {
LancasterUniversity 615:65ea2acfc6a2 193 serviceCallback(&services[serviceIndex]);
LancasterUniversity 615:65ea2acfc6a2 194 }
LancasterUniversity 615:65ea2acfc6a2 195
LancasterUniversity 615:65ea2acfc6a2 196 if ((state == SERVICE_DISCOVERY_ACTIVE) && characteristicCallback) {
LancasterUniversity 615:65ea2acfc6a2 197 launchCharacteristicDiscovery(connHandle, services[serviceIndex].getStartHandle(), services[serviceIndex].getEndHandle());
LancasterUniversity 615:65ea2acfc6a2 198 } else {
LancasterUniversity 615:65ea2acfc6a2 199 serviceIndex++;
LancasterUniversity 615:65ea2acfc6a2 200 }
LancasterUniversity 615:65ea2acfc6a2 201 } else {
LancasterUniversity 615:65ea2acfc6a2 202 serviceIndex++;
LancasterUniversity 615:65ea2acfc6a2 203 }
LancasterUniversity 615:65ea2acfc6a2 204 }
LancasterUniversity 615:65ea2acfc6a2 205
LancasterUniversity 615:65ea2acfc6a2 206 /* Relaunch discovery of new services beyond the last entry cached in services[]. */
LancasterUniversity 615:65ea2acfc6a2 207 if ((state == SERVICE_DISCOVERY_ACTIVE) && (numServices > 0) && (serviceIndex > 0)) {
LancasterUniversity 615:65ea2acfc6a2 208 /* Determine the ending handle of the last cached service. */
LancasterUniversity 615:65ea2acfc6a2 209 Gap::Handle_t endHandle = services[serviceIndex - 1].getEndHandle();
LancasterUniversity 615:65ea2acfc6a2 210 resetDiscoveredServices(); /* Note: resetDiscoveredServices() must come after fetching endHandle. */
LancasterUniversity 615:65ea2acfc6a2 211
LancasterUniversity 615:65ea2acfc6a2 212 if (endHandle == SRV_DISC_END_HANDLE) {
LancasterUniversity 615:65ea2acfc6a2 213 terminateServiceDiscovery();
LancasterUniversity 615:65ea2acfc6a2 214 } else {
LancasterUniversity 615:65ea2acfc6a2 215 if (sd_ble_gattc_primary_services_discover(connHandle, endHandle, NULL) != NRF_SUCCESS) {
LancasterUniversity 615:65ea2acfc6a2 216 terminateServiceDiscovery();
LancasterUniversity 615:65ea2acfc6a2 217 }
LancasterUniversity 615:65ea2acfc6a2 218 }
LancasterUniversity 615:65ea2acfc6a2 219 }
LancasterUniversity 615:65ea2acfc6a2 220 }
LancasterUniversity 615:65ea2acfc6a2 221
LancasterUniversity 615:65ea2acfc6a2 222 void
LancasterUniversity 615:65ea2acfc6a2 223 nRF5xServiceDiscovery::ServiceUUIDDiscoveryQueue::triggerFirst(void)
LancasterUniversity 615:65ea2acfc6a2 224 {
LancasterUniversity 615:65ea2acfc6a2 225 while (numIndices) { /* loop until a call to char_value_by_uuid_read() succeeds or we run out of pending indices. */
LancasterUniversity 615:65ea2acfc6a2 226 parentDiscoveryObject->state = DISCOVER_SERVICE_UUIDS;
LancasterUniversity 615:65ea2acfc6a2 227
LancasterUniversity 615:65ea2acfc6a2 228 unsigned serviceIndex = getFirst();
LancasterUniversity 615:65ea2acfc6a2 229 ble_uuid_t uuid = {
LancasterUniversity 615:65ea2acfc6a2 230 .uuid = BLE_UUID_SERVICE_PRIMARY,
LancasterUniversity 615:65ea2acfc6a2 231 .type = BLE_UUID_TYPE_BLE,
LancasterUniversity 615:65ea2acfc6a2 232 };
LancasterUniversity 615:65ea2acfc6a2 233 ble_gattc_handle_range_t handleRange = {
LancasterUniversity 615:65ea2acfc6a2 234 .start_handle = parentDiscoveryObject->services[serviceIndex].getStartHandle(),
LancasterUniversity 615:65ea2acfc6a2 235 .end_handle = parentDiscoveryObject->services[serviceIndex].getEndHandle(),
LancasterUniversity 615:65ea2acfc6a2 236 };
LancasterUniversity 615:65ea2acfc6a2 237 if (sd_ble_gattc_char_value_by_uuid_read(parentDiscoveryObject->connHandle, &uuid, &handleRange) == NRF_SUCCESS) {
LancasterUniversity 615:65ea2acfc6a2 238 return;
LancasterUniversity 615:65ea2acfc6a2 239 }
LancasterUniversity 615:65ea2acfc6a2 240
LancasterUniversity 615:65ea2acfc6a2 241 /* Skip this service if we fail to launch a read for its service-declaration
LancasterUniversity 615:65ea2acfc6a2 242 * attribute. Its UUID will remain INVALID, and it may not match any filters. */
LancasterUniversity 615:65ea2acfc6a2 243 dequeue();
LancasterUniversity 615:65ea2acfc6a2 244 }
LancasterUniversity 615:65ea2acfc6a2 245
LancasterUniversity 615:65ea2acfc6a2 246 /* Switch back to service discovery upon exhausting the service-indices pending UUID discovery. */
LancasterUniversity 615:65ea2acfc6a2 247 if (parentDiscoveryObject->state == DISCOVER_SERVICE_UUIDS) {
LancasterUniversity 615:65ea2acfc6a2 248 parentDiscoveryObject->state = SERVICE_DISCOVERY_ACTIVE;
LancasterUniversity 615:65ea2acfc6a2 249 }
LancasterUniversity 615:65ea2acfc6a2 250 }
LancasterUniversity 615:65ea2acfc6a2 251
LancasterUniversity 615:65ea2acfc6a2 252 void
LancasterUniversity 615:65ea2acfc6a2 253 nRF5xServiceDiscovery::CharUUIDDiscoveryQueue::triggerFirst(void)
LancasterUniversity 615:65ea2acfc6a2 254 {
LancasterUniversity 615:65ea2acfc6a2 255 while (numIndices) { /* loop until a call to char_value_by_uuid_read() succeeds or we run out of pending indices. */
LancasterUniversity 615:65ea2acfc6a2 256 parentDiscoveryObject->state = DISCOVER_CHARACTERISTIC_UUIDS;
LancasterUniversity 615:65ea2acfc6a2 257
LancasterUniversity 615:65ea2acfc6a2 258 unsigned charIndex = getFirst();
LancasterUniversity 615:65ea2acfc6a2 259 ble_uuid_t uuid = {
LancasterUniversity 615:65ea2acfc6a2 260 .uuid = BLE_UUID_CHARACTERISTIC,
LancasterUniversity 615:65ea2acfc6a2 261 .type = BLE_UUID_TYPE_BLE,
LancasterUniversity 615:65ea2acfc6a2 262 };
LancasterUniversity 615:65ea2acfc6a2 263 ble_gattc_handle_range_t handleRange = { };
LancasterUniversity 615:65ea2acfc6a2 264 handleRange.start_handle = parentDiscoveryObject->characteristics[charIndex].getDeclHandle();
LancasterUniversity 615:65ea2acfc6a2 265 handleRange.end_handle = parentDiscoveryObject->characteristics[charIndex].getDeclHandle() + 1;
LancasterUniversity 615:65ea2acfc6a2 266 if (sd_ble_gattc_char_value_by_uuid_read(parentDiscoveryObject->connHandle, &uuid, &handleRange) == NRF_SUCCESS) {
LancasterUniversity 615:65ea2acfc6a2 267 return;
LancasterUniversity 615:65ea2acfc6a2 268 }
LancasterUniversity 615:65ea2acfc6a2 269
LancasterUniversity 615:65ea2acfc6a2 270 /* Skip this service if we fail to launch a read for its service-declaration
LancasterUniversity 615:65ea2acfc6a2 271 * attribute. Its UUID will remain INVALID, and it may not match any filters. */
LancasterUniversity 615:65ea2acfc6a2 272 dequeue();
LancasterUniversity 615:65ea2acfc6a2 273 }
LancasterUniversity 615:65ea2acfc6a2 274
LancasterUniversity 615:65ea2acfc6a2 275 /* Switch back to service discovery upon exhausting the service-indices pending UUID discovery. */
LancasterUniversity 615:65ea2acfc6a2 276 if (parentDiscoveryObject->state == DISCOVER_CHARACTERISTIC_UUIDS) {
LancasterUniversity 615:65ea2acfc6a2 277 parentDiscoveryObject->state = CHARACTERISTIC_DISCOVERY_ACTIVE;
LancasterUniversity 615:65ea2acfc6a2 278 }
LancasterUniversity 615:65ea2acfc6a2 279 }
LancasterUniversity 615:65ea2acfc6a2 280
LancasterUniversity 615:65ea2acfc6a2 281 void
LancasterUniversity 615:65ea2acfc6a2 282 nRF5xServiceDiscovery::processDiscoverUUIDResponse(const ble_gattc_evt_char_val_by_uuid_read_rsp_t *response)
LancasterUniversity 615:65ea2acfc6a2 283 {
LancasterUniversity 615:65ea2acfc6a2 284 if (state == DISCOVER_SERVICE_UUIDS) {
LancasterUniversity 615:65ea2acfc6a2 285 if ((response->count == 1) && (response->value_len == UUID::LENGTH_OF_LONG_UUID)) {
LancasterUniversity 615:65ea2acfc6a2 286 UUID::LongUUIDBytes_t uuid;
LancasterUniversity 616:a8f9b022d8fd 287 memcpy(uuid, response->handle_value[0].p_value, UUID::LENGTH_OF_LONG_UUID);
LancasterUniversity 615:65ea2acfc6a2 288
LancasterUniversity 615:65ea2acfc6a2 289 unsigned serviceIndex = serviceUUIDDiscoveryQueue.dequeue();
LancasterUniversity 616:a8f9b022d8fd 290 services[serviceIndex].setupLongUUID(uuid, UUID::LSB);
LancasterUniversity 615:65ea2acfc6a2 291
LancasterUniversity 615:65ea2acfc6a2 292 serviceUUIDDiscoveryQueue.triggerFirst();
LancasterUniversity 615:65ea2acfc6a2 293 } else {
LancasterUniversity 615:65ea2acfc6a2 294 serviceUUIDDiscoveryQueue.dequeue();
LancasterUniversity 615:65ea2acfc6a2 295 }
LancasterUniversity 615:65ea2acfc6a2 296 } else if (state == DISCOVER_CHARACTERISTIC_UUIDS) {
LancasterUniversity 615:65ea2acfc6a2 297 if ((response->count == 1) && (response->value_len == UUID::LENGTH_OF_LONG_UUID + 1 /* props */ + 2 /* value handle */)) {
LancasterUniversity 615:65ea2acfc6a2 298 UUID::LongUUIDBytes_t uuid;
LancasterUniversity 616:a8f9b022d8fd 299
LancasterUniversity 616:a8f9b022d8fd 300 memcpy(uuid, &(response->handle_value[0].p_value[3]), UUID::LENGTH_OF_LONG_UUID);
LancasterUniversity 615:65ea2acfc6a2 301
LancasterUniversity 615:65ea2acfc6a2 302 unsigned charIndex = charUUIDDiscoveryQueue.dequeue();
LancasterUniversity 616:a8f9b022d8fd 303 characteristics[charIndex].setupLongUUID(uuid, UUID::LSB);
LancasterUniversity 615:65ea2acfc6a2 304
LancasterUniversity 615:65ea2acfc6a2 305 charUUIDDiscoveryQueue.triggerFirst();
LancasterUniversity 615:65ea2acfc6a2 306 } else {
LancasterUniversity 615:65ea2acfc6a2 307 charUUIDDiscoveryQueue.dequeue();
LancasterUniversity 615:65ea2acfc6a2 308 }
LancasterUniversity 615:65ea2acfc6a2 309 }
rgrover1 393:0f7c5048efb3 310 }