Shuta Nakamae / nRF51822

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:21 2015 +0100
Revision:
238:6e85a2484de7
Parent:
237:f07be5960a98
Child:
239:693a1f145b5a
Synchronized with git rev e3b56992
Author: Rohit Grover
launchCharacteristicDiscovery() returns an error code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 194:c99fc3160091 1 /* mbed Microcontroller Library
rgrover1 194:c99fc3160091 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 194:c99fc3160091 3 *
rgrover1 194:c99fc3160091 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 194:c99fc3160091 5 * you may not use this file except in compliance with the License.
rgrover1 194:c99fc3160091 6 * You may obtain a copy of the License at
rgrover1 194:c99fc3160091 7 *
rgrover1 194:c99fc3160091 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 194:c99fc3160091 9 *
rgrover1 194:c99fc3160091 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 194:c99fc3160091 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 194:c99fc3160091 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 194:c99fc3160091 13 * See the License for the specific language governing permissions and
rgrover1 194:c99fc3160091 14 * limitations under the License.
rgrover1 194:c99fc3160091 15 */
rgrover1 194:c99fc3160091 16
rgrover1 194:c99fc3160091 17 #include "btle_gattc.h"
rgrover1 195:061ed80ffbcf 18 #include "UUID.h"
rgrover1 194:c99fc3160091 19
rgrover1 194:c99fc3160091 20 #define BLE_DB_DISCOVERY_MAX_SRV 4 /**< Maximum number of services supported by this module. This also indicates the maximum number of users allowed to be registered to this module. (one user per service). */
rgrover1 194:c99fc3160091 21 #define BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV 4 /**< Maximum number of characteristics per service supported by this module. */
rgrover1 194:c99fc3160091 22
rgrover1 230:4c2bb92598b7 23 #define SRV_DISC_START_HANDLE 0x0001 /**< The start handle value used during service discovery. */
rgrover1 194:c99fc3160091 24
rgrover1 194:c99fc3160091 25
rgrover1 194:c99fc3160091 26 /**@brief Structure for holding information about the service and the characteristics found during
rgrover1 194:c99fc3160091 27 * the discovery process.
rgrover1 194:c99fc3160091 28 */
rgrover1 195:061ed80ffbcf 29 struct DiscoveredService {
rgrover1 195:061ed80ffbcf 30 void setup(ShortUUIDBytes_t uuidIn, Gap::Handle_t start, Gap::Handle_t end) {
rgrover1 195:061ed80ffbcf 31 uuid = uuidIn;
rgrover1 195:061ed80ffbcf 32 startHandle = start;
rgrover1 195:061ed80ffbcf 33 endHandle = end;
rgrover1 195:061ed80ffbcf 34 }
rgrover1 201:a13ada00eac7 35
rgrover1 208:12b6b06ffcd6 36 ShortUUIDBytes_t uuid; /**< UUID of the service. */
rgrover1 208:12b6b06ffcd6 37 Gap::Handle_t startHandle; /**< Service Handle Range. */
rgrover1 208:12b6b06ffcd6 38 Gap::Handle_t endHandle; /**< Service Handle Range. */
rgrover1 195:061ed80ffbcf 39 };
rgrover1 194:c99fc3160091 40
rgrover1 210:e7749aec4203 41 /**@brief Structure for holding information about the service and the characteristics found during
rgrover1 210:e7749aec4203 42 * the discovery process.
rgrover1 210:e7749aec4203 43 */
rgrover1 210:e7749aec4203 44 struct DiscoveredCharacteristic {
rgrover1 234:80732a210425 45 struct Properties_t {
rgrover1 236:631719c927ed 46 static const uint8_t BROADCAST_PROPERTY_MASK = 0x01;
rgrover1 236:631719c927ed 47 static const uint8_t READ_PROPERTY_MASK = 0x02;
rgrover1 236:631719c927ed 48 static const uint8_t WRITE_WO_RESPONSE_PROPERTY_MASK = 0x04;
rgrover1 236:631719c927ed 49 static const uint8_t WRITE_PROPERTY_MASK = 0x08;
rgrover1 236:631719c927ed 50 static const uint8_t NOTIFY_PROPERTY_MASK = 0x10;
rgrover1 236:631719c927ed 51 static const uint8_t INDICATE_PROPERTY_MASK = 0x20;
rgrover1 236:631719c927ed 52 static const uint8_t AUTH_SIGNED_PROPERTY_MASK = 0x40;
rgrover1 236:631719c927ed 53
rgrover1 234:80732a210425 54 Properties_t() : broadcast(0), read(0), write_wo_resp(0), write(0), notify(0), indicate(0), auth_signed_wr(0) {
rgrover1 234:80732a210425 55 /* empty */
rgrover1 234:80732a210425 56 }
rgrover1 236:631719c927ed 57
rgrover1 234:80732a210425 58 Properties_t(uint8_t props) :
rgrover1 236:631719c927ed 59 broadcast(props & BROADCAST_PROPERTY_MASK),
rgrover1 236:631719c927ed 60 read(props & READ_PROPERTY_MASK),
rgrover1 236:631719c927ed 61 write_wo_resp(props & WRITE_WO_RESPONSE_PROPERTY_MASK),
rgrover1 236:631719c927ed 62 write(props & WRITE_PROPERTY_MASK),
rgrover1 236:631719c927ed 63 notify(props & NOTIFY_PROPERTY_MASK),
rgrover1 236:631719c927ed 64 indicate(props & INDICATE_PROPERTY_MASK),
rgrover1 236:631719c927ed 65 auth_signed_wr(props & AUTH_SIGNED_PROPERTY_MASK) {
rgrover1 234:80732a210425 66 /* empty*/
rgrover1 234:80732a210425 67 }
rgrover1 234:80732a210425 68
rgrover1 234:80732a210425 69 uint8_t broadcast :1; /**< Broadcasting of the value permitted. */
rgrover1 234:80732a210425 70 uint8_t read :1; /**< Reading the value permitted. */
rgrover1 234:80732a210425 71 uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */
rgrover1 234:80732a210425 72 uint8_t write :1; /**< Writing the value with Write Request permitted. */
rgrover1 234:80732a210425 73 uint8_t notify :1; /**< Notications of the value permitted. */
rgrover1 234:80732a210425 74 uint8_t indicate :1; /**< Indications of the value permitted. */
rgrover1 234:80732a210425 75 uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */
rgrover1 234:80732a210425 76 };
rgrover1 234:80732a210425 77
rgrover1 234:80732a210425 78 void setup(ShortUUIDBytes_t uuidIn, Properties_t propsIn, Gap::Handle_t declHandleIn, Gap::Handle_t valueHandleIn) {
rgrover1 210:e7749aec4203 79 uuid = uuidIn;
rgrover1 215:36f6796651ab 80 props = propsIn;
rgrover1 215:36f6796651ab 81 declHandle = declHandleIn;
rgrover1 215:36f6796651ab 82 valueHandle = valueHandleIn;
rgrover1 210:e7749aec4203 83 }
rgrover1 210:e7749aec4203 84
rgrover1 234:80732a210425 85 ShortUUIDBytes_t uuid;
rgrover1 234:80732a210425 86 Properties_t props;
rgrover1 234:80732a210425 87 Gap::Handle_t declHandle;
rgrover1 234:80732a210425 88 Gap::Handle_t valueHandle;
rgrover1 210:e7749aec4203 89 };
rgrover1 210:e7749aec4203 90
rgrover1 222:0ba395e1303d 91 struct DiscoveryStatus {
rgrover1 214:196183e51de3 92 void terminateServiceDiscovery(void) {
rgrover1 214:196183e51de3 93 serviceDiscoveryInProgress = false;
rgrover1 214:196183e51de3 94 printf("end of service discovery\r\n");
rgrover1 214:196183e51de3 95 }
rgrover1 214:196183e51de3 96
rgrover1 214:196183e51de3 97 void terminateCharacteristicDiscovery(void) {
rgrover1 214:196183e51de3 98 characteristicDiscoveryInProgress = false;
rgrover1 214:196183e51de3 99 serviceDiscoveryInProgress = true;
rgrover1 217:c57cbfdfb5ca 100 currSrvInd++; /* Progress service index to keep discovery alive. */
rgrover1 214:196183e51de3 101 }
rgrover1 214:196183e51de3 102
rgrover1 214:196183e51de3 103 void resetDiscoveredServices(void) {
rgrover1 227:7a0bb8545c75 104 srvCount = 0;
rgrover1 227:7a0bb8545c75 105 currSrvInd = 0;
rgrover1 214:196183e51de3 106 memset(services, 0, sizeof(DiscoveredService) * BLE_DB_DISCOVERY_MAX_SRV);
rgrover1 214:196183e51de3 107 }
rgrover1 214:196183e51de3 108
rgrover1 227:7a0bb8545c75 109 void resetDiscoveredCharacteristics(void) {
rgrover1 227:7a0bb8545c75 110 charCount = 0;
rgrover1 227:7a0bb8545c75 111 currCharInd = 0;
rgrover1 227:7a0bb8545c75 112 memset(characteristics, 0, sizeof(DiscoveredCharacteristic) * BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV);
rgrover1 227:7a0bb8545c75 113 }
rgrover1 227:7a0bb8545c75 114
rgrover1 214:196183e51de3 115 void serviceDiscoveryStarted(Gap::Handle_t connectionHandle) {
rgrover1 214:196183e51de3 116 connHandle = connectionHandle;
rgrover1 227:7a0bb8545c75 117 resetDiscoveredServices();
rgrover1 214:196183e51de3 118 serviceDiscoveryInProgress = true;
rgrover1 214:196183e51de3 119 characteristicDiscoveryInProgress = false;
rgrover1 214:196183e51de3 120 }
rgrover1 214:196183e51de3 121
rgrover1 214:196183e51de3 122 void characteristicDiscoveryStarted(Gap::Handle_t connectionHandle) {
rgrover1 214:196183e51de3 123 connHandle = connectionHandle;
rgrover1 227:7a0bb8545c75 124 resetDiscoveredCharacteristics();
rgrover1 214:196183e51de3 125 characteristicDiscoveryInProgress = true;
rgrover1 214:196183e51de3 126 serviceDiscoveryInProgress = false;
rgrover1 214:196183e51de3 127 }
rgrover1 214:196183e51de3 128
rgrover1 225:08f36b78e0f1 129 void setupDiscoveredServices(const ble_gattc_evt_prim_srvc_disc_rsp_t *response) {
rgrover1 225:08f36b78e0f1 130 currSrvInd = 0;
rgrover1 225:08f36b78e0f1 131 srvCount = response->count;
rgrover1 225:08f36b78e0f1 132
rgrover1 233:0b15e714801b 133 /* Account for the limitation on the number of discovered services we can handle at a time. */
rgrover1 233:0b15e714801b 134 if (srvCount > BLE_DB_DISCOVERY_MAX_SRV) {
rgrover1 233:0b15e714801b 135 srvCount = BLE_DB_DISCOVERY_MAX_SRV;
rgrover1 233:0b15e714801b 136 }
rgrover1 233:0b15e714801b 137
rgrover1 225:08f36b78e0f1 138 for (unsigned serviceIndex = 0; serviceIndex < srvCount; serviceIndex++) {
rgrover1 225:08f36b78e0f1 139 services[serviceIndex].setup(response->services[serviceIndex].uuid.uuid,
rgrover1 225:08f36b78e0f1 140 response->services[serviceIndex].handle_range.start_handle,
rgrover1 225:08f36b78e0f1 141 response->services[serviceIndex].handle_range.end_handle);
rgrover1 225:08f36b78e0f1 142 }
rgrover1 225:08f36b78e0f1 143 }
rgrover1 225:08f36b78e0f1 144
rgrover1 225:08f36b78e0f1 145 void setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response) {
rgrover1 225:08f36b78e0f1 146 currCharInd = 0;
rgrover1 225:08f36b78e0f1 147 charCount = response->count;
rgrover1 225:08f36b78e0f1 148
rgrover1 233:0b15e714801b 149 /* Account for the limitation on the number of discovered characteristics we can handle at a time. */
rgrover1 233:0b15e714801b 150 if (charCount > BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV) {
rgrover1 233:0b15e714801b 151 charCount = BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV;
rgrover1 233:0b15e714801b 152 }
rgrover1 233:0b15e714801b 153
rgrover1 225:08f36b78e0f1 154 for (unsigned charIndex = 0; charIndex < charCount; charIndex++) {
rgrover1 225:08f36b78e0f1 155 characteristics[charIndex].setup(response->chars[charIndex].uuid.uuid,
rgrover1 234:80732a210425 156 *(const uint8_t *)(&response->chars[charIndex].char_props),
rgrover1 225:08f36b78e0f1 157 response->chars[charIndex].handle_decl,
rgrover1 225:08f36b78e0f1 158 response->chars[charIndex].handle_value);
rgrover1 225:08f36b78e0f1 159 }
rgrover1 225:08f36b78e0f1 160 }
rgrover1 225:08f36b78e0f1 161
rgrover1 223:cfa98ce48348 162 void progressCharacteristicDiscovery() {
rgrover1 223:cfa98ce48348 163 while (characteristicDiscoveryInProgress && (currCharInd < charCount)) {
rgrover1 231:4362ce7ffbd7 164 /* THIS IS WHERE THE CALLBACK WILL GO */
rgrover1 231:4362ce7ffbd7 165 printf("%x [%u]\r\n", characteristics[currCharInd].uuid, characteristics[currCharInd].valueHandle);
rgrover1 231:4362ce7ffbd7 166
rgrover1 223:cfa98ce48348 167 currCharInd++;
rgrover1 223:cfa98ce48348 168 }
rgrover1 223:cfa98ce48348 169
rgrover1 223:cfa98ce48348 170 if (characteristicDiscoveryInProgress) {
rgrover1 223:cfa98ce48348 171 Gap::Handle_t startHandle = characteristics[currCharInd - 1].valueHandle + 1;
rgrover1 223:cfa98ce48348 172 Gap::Handle_t endHandle = services[currSrvInd].endHandle;
rgrover1 227:7a0bb8545c75 173 resetDiscoveredCharacteristics();
rgrover1 223:cfa98ce48348 174
rgrover1 223:cfa98ce48348 175 if (startHandle < endHandle) {
rgrover1 223:cfa98ce48348 176 ble_gattc_handle_range_t handleRange = {
rgrover1 223:cfa98ce48348 177 .start_handle = startHandle,
rgrover1 223:cfa98ce48348 178 .end_handle = endHandle
rgrover1 223:cfa98ce48348 179 };
rgrover1 223:cfa98ce48348 180 printf("char discovery returned %u\r\n", sd_ble_gattc_characteristics_discover(connHandle, &handleRange));
rgrover1 223:cfa98ce48348 181 } else {
rgrover1 223:cfa98ce48348 182 terminateCharacteristicDiscovery();
rgrover1 223:cfa98ce48348 183 }
rgrover1 223:cfa98ce48348 184 }
rgrover1 223:cfa98ce48348 185 }
rgrover1 223:cfa98ce48348 186
rgrover1 223:cfa98ce48348 187 void progressServiceDiscovery() {
rgrover1 223:cfa98ce48348 188 while (serviceDiscoveryInProgress && (currSrvInd < srvCount)) {
rgrover1 231:4362ce7ffbd7 189 /* THIS IS WHERE THE CALLBACK WILL GO */
rgrover1 231:4362ce7ffbd7 190 printf("%x [%u %u]\r\n", services[currSrvInd].uuid, services[currSrvInd].startHandle, services[currSrvInd].endHandle);
rgrover1 223:cfa98ce48348 191
rgrover1 231:4362ce7ffbd7 192 if (true) { /* characteristic discovery is optional. */
rgrover1 231:4362ce7ffbd7 193 launchCharacteristicDiscovery(connHandle, services[currSrvInd].startHandle, services[currSrvInd].endHandle);
rgrover1 231:4362ce7ffbd7 194 } else {
rgrover1 231:4362ce7ffbd7 195 currSrvInd++; /* Progress service index to keep discovery alive. */
rgrover1 231:4362ce7ffbd7 196 }
rgrover1 223:cfa98ce48348 197 }
rgrover1 223:cfa98ce48348 198 if (serviceDiscoveryInProgress && (srvCount > 0) && (currSrvInd > 0)) {
rgrover1 223:cfa98ce48348 199 Gap::Handle_t endHandle = services[currSrvInd - 1].endHandle;
rgrover1 223:cfa98ce48348 200 resetDiscoveredServices();
rgrover1 227:7a0bb8545c75 201
rgrover1 231:4362ce7ffbd7 202 printf("services discover returned %u\r\n", sd_ble_gattc_primary_services_discover(connHandle, endHandle, NULL));
rgrover1 223:cfa98ce48348 203 }
rgrover1 223:cfa98ce48348 204 }
rgrover1 223:cfa98ce48348 205
rgrover1 216:3443c78324b6 206 DiscoveredService services[BLE_DB_DISCOVERY_MAX_SRV]; /**< Information related to the current service being discovered.
rgrover1 216:3443c78324b6 207 * This is intended for internal use during service discovery. */
rgrover1 216:3443c78324b6 208 DiscoveredCharacteristic characteristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];
rgrover1 205:7b1c55e70f45 209
rgrover1 206:d8c5b97557f2 210 uint16_t connHandle; /**< Connection handle as provided by the SoftDevice. */
rgrover1 209:d24159a1dad5 211 uint8_t currSrvInd; /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/
rgrover1 206:d8c5b97557f2 212 uint8_t srvCount; /**< Number of services at the peers GATT database.*/
rgrover1 206:d8c5b97557f2 213 uint8_t currCharInd; /**< Index of the current characteristic being discovered. This is intended for internal use during service discovery.*/
rgrover1 209:d24159a1dad5 214 uint8_t charCount; /**< Number of characteristics within the service.*/
rgrover1 206:d8c5b97557f2 215
rgrover1 206:d8c5b97557f2 216 bool serviceDiscoveryInProgress;
rgrover1 206:d8c5b97557f2 217 bool characteristicDiscoveryInProgress;
rgrover1 198:a69d3d4797e8 218 };
rgrover1 194:c99fc3160091 219
rgrover1 222:0ba395e1303d 220 static DiscoveryStatus discoveryStatus;
rgrover1 195:061ed80ffbcf 221
rgrover1 237:f07be5960a98 222 ble_error_t launchServiceDiscovery(Gap::Handle_t connectionHandle)
rgrover1 194:c99fc3160091 223 {
rgrover1 214:196183e51de3 224 discoveryStatus.serviceDiscoveryStarted(connectionHandle);
rgrover1 237:f07be5960a98 225
rgrover1 237:f07be5960a98 226 uint32_t rc;
rgrover1 237:f07be5960a98 227 if ((rc = sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL)) != NRF_SUCCESS) {
rgrover1 237:f07be5960a98 228 discoveryStatus.terminateServiceDiscovery();
rgrover1 237:f07be5960a98 229 switch (rc) {
rgrover1 237:f07be5960a98 230 case NRF_ERROR_INVALID_PARAM:
rgrover1 237:f07be5960a98 231 case BLE_ERROR_INVALID_CONN_HANDLE:
rgrover1 237:f07be5960a98 232 return BLE_ERROR_INVALID_PARAM;
rgrover1 237:f07be5960a98 233 case NRF_ERROR_BUSY:
rgrover1 237:f07be5960a98 234 return BLE_STACK_BUSY;
rgrover1 237:f07be5960a98 235 default:
rgrover1 237:f07be5960a98 236 case NRF_ERROR_INVALID_STATE:
rgrover1 237:f07be5960a98 237 return BLE_ERROR_INVALID_STATE;
rgrover1 237:f07be5960a98 238 }
rgrover1 237:f07be5960a98 239 }
rgrover1 237:f07be5960a98 240
rgrover1 237:f07be5960a98 241 return BLE_ERROR_NONE;
rgrover1 194:c99fc3160091 242 }
rgrover1 194:c99fc3160091 243
rgrover1 238:6e85a2484de7 244 ble_error_t launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle) {
rgrover1 214:196183e51de3 245 discoveryStatus.characteristicDiscoveryStarted(connectionHandle);
rgrover1 211:bf81b20ede23 246
rgrover1 211:bf81b20ede23 247 ble_gattc_handle_range_t handleRange = {
rgrover1 211:bf81b20ede23 248 .start_handle = startHandle,
rgrover1 211:bf81b20ede23 249 .end_handle = endHandle
rgrover1 211:bf81b20ede23 250 };
rgrover1 238:6e85a2484de7 251 uint32_t rc;
rgrover1 238:6e85a2484de7 252 if ((rc = sd_ble_gattc_characteristics_discover(connectionHandle, &handleRange)) != NRF_SUCCESS) {
rgrover1 238:6e85a2484de7 253 discoveryStatus.terminateCharacteristicDiscovery();
rgrover1 238:6e85a2484de7 254 switch (rc) {
rgrover1 238:6e85a2484de7 255 case BLE_ERROR_INVALID_CONN_HANDLE:
rgrover1 238:6e85a2484de7 256 case NRF_ERROR_INVALID_ADDR:
rgrover1 238:6e85a2484de7 257 return BLE_ERROR_INVALID_PARAM;
rgrover1 238:6e85a2484de7 258 case NRF_ERROR_BUSY:
rgrover1 238:6e85a2484de7 259 return BLE_STACK_BUSY;
rgrover1 238:6e85a2484de7 260 default:
rgrover1 238:6e85a2484de7 261 case NRF_ERROR_INVALID_STATE:
rgrover1 238:6e85a2484de7 262 return BLE_ERROR_INVALID_STATE;
rgrover1 238:6e85a2484de7 263 }
rgrover1 238:6e85a2484de7 264 }
rgrover1 238:6e85a2484de7 265
rgrover1 238:6e85a2484de7 266 return BLE_ERROR_NONE;
rgrover1 202:3ce954ce3eb8 267 }
rgrover1 202:3ce954ce3eb8 268
rgrover1 194:c99fc3160091 269 void bleGattcEventHandler(const ble_evt_t *p_ble_evt)
rgrover1 194:c99fc3160091 270 {
rgrover1 194:c99fc3160091 271 switch (p_ble_evt->header.evt_id) {
rgrover1 194:c99fc3160091 272 case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
rgrover1 194:c99fc3160091 273 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 235:10bb73f9d15d 274 case BLE_GATT_STATUS_SUCCESS:
rgrover1 225:08f36b78e0f1 275 discoveryStatus.setupDiscoveredServices(&p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp);
rgrover1 195:061ed80ffbcf 276 break;
rgrover1 195:061ed80ffbcf 277
rgrover1 229:6394db9a71ba 278 case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND:
rgrover1 229:6394db9a71ba 279 default:
rgrover1 214:196183e51de3 280 discoveryStatus.terminateServiceDiscovery();
rgrover1 194:c99fc3160091 281 break;
rgrover1 194:c99fc3160091 282 }
rgrover1 194:c99fc3160091 283 break;
rgrover1 194:c99fc3160091 284
rgrover1 235:10bb73f9d15d 285 case BLE_GATTC_EVT_CHAR_DISC_RSP:
rgrover1 194:c99fc3160091 286 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 235:10bb73f9d15d 287 case BLE_GATT_STATUS_SUCCESS:
rgrover1 225:08f36b78e0f1 288 discoveryStatus.setupDiscoveredCharacteristics(&p_ble_evt->evt.gattc_evt.params.char_disc_rsp);
rgrover1 219:681be3608738 289 break;
rgrover1 212:f2316b17d8be 290
rgrover1 229:6394db9a71ba 291 case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND:
rgrover1 229:6394db9a71ba 292 default:
rgrover1 214:196183e51de3 293 discoveryStatus.terminateCharacteristicDiscovery();
rgrover1 212:f2316b17d8be 294 break;
rgrover1 194:c99fc3160091 295 }
rgrover1 194:c99fc3160091 296 break;
rgrover1 194:c99fc3160091 297 }
rgrover1 195:061ed80ffbcf 298
rgrover1 223:cfa98ce48348 299 discoveryStatus.progressCharacteristicDiscovery();
rgrover1 223:cfa98ce48348 300 discoveryStatus.progressServiceDiscovery();
rgrover1 194:c99fc3160091 301 }