1

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:35 2015 +0100
Revision:
345:dfde56236c36
Parent:
339:e5e2157e8b44
Child:
346:14b090482fd2
Synchronized with git rev fbfc6d16
Author: Andrew Fernandes
Fix various GCC compilation issues.

Who changed what in which revision?

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