for bbc microbit library

Dependencies:   nrf51-sdk

Dependents:   microbit-dal

Fork of nRF51822 by Lancaster University

Committer:
LancasterUniversity
Date:
Wed Apr 06 22:38:43 2016 +0100
Revision:
615:65ea2acfc6a2
Parent:
592:f9574772b816
Child:
616:a8f9b022d8fd
Synchronized with git rev 60a7c0c0
Author: Rohit Grover
bring in the latest changes for BLE::init() where we allow <object, member> tuples for init callback.

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