test code 123

Dependencies:   mbed

Fork of LinkNode-Test by Qi Yao

Committer:
youkee
Date:
Fri Oct 28 13:04:10 2016 +0000
Revision:
1:b0d4fbbdb244
Parent:
0:1ad0e04b1bc5
ghhbfdd

Who changed what in which revision?

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