library for BLE_GAP_backpack

Dependencies:   nrf51-sdk

Fork of nRF51822 by Nordic Semiconductor

Committer:
vcoubard
Date:
Mon Jan 11 10:19:19 2016 +0000
Revision:
567:e1800bd55a9e
Parent:
566:e425ad9e5d6e
Child:
570:f162898cb6c4
Synchronized with git rev 59ced0b4
Author: Vincent Coubard
rename remainingCharacteristic member, now it is named
discoveredCharacteristic. Add doc to the discovery process and the
rationale behind discoveredCharacteristic member.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 544:9e3d053ad4ec 1 /* mbed Microcontroller Library
vcoubard 544:9e3d053ad4ec 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 544:9e3d053ad4ec 3 *
vcoubard 544:9e3d053ad4ec 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 544:9e3d053ad4ec 5 * you may not use this file except in compliance with the License.
vcoubard 544:9e3d053ad4ec 6 * You may obtain a copy of the License at
vcoubard 544:9e3d053ad4ec 7 *
vcoubard 544:9e3d053ad4ec 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 544:9e3d053ad4ec 9 *
vcoubard 544:9e3d053ad4ec 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 544:9e3d053ad4ec 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 544:9e3d053ad4ec 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 544:9e3d053ad4ec 13 * See the License for the specific language governing permissions and
vcoubard 544:9e3d053ad4ec 14 * limitations under the License.
vcoubard 544:9e3d053ad4ec 15 */
vcoubard 544:9e3d053ad4ec 16
vcoubard 544:9e3d053ad4ec 17 #ifndef __NRF_SERVICE_DISCOVERY_H__
vcoubard 544:9e3d053ad4ec 18 #define __NRF_SERVICE_DISCOVERY_H__
vcoubard 544:9e3d053ad4ec 19
vcoubard 544:9e3d053ad4ec 20 #include "ble/ServiceDiscovery.h"
vcoubard 544:9e3d053ad4ec 21 #include "ble/DiscoveredService.h"
vcoubard 544:9e3d053ad4ec 22 #include "nRF5xDiscoveredCharacteristic.h"
vcoubard 544:9e3d053ad4ec 23
vcoubard 544:9e3d053ad4ec 24 #include "ble.h"
vcoubard 544:9e3d053ad4ec 25 #include "ble_gattc.h"
vcoubard 544:9e3d053ad4ec 26
vcoubard 544:9e3d053ad4ec 27 class nRF5xGattClient; /* forward declaration */
vcoubard 544:9e3d053ad4ec 28
vcoubard 544:9e3d053ad4ec 29 class nRF5xServiceDiscovery : public ServiceDiscovery
vcoubard 544:9e3d053ad4ec 30 {
vcoubard 544:9e3d053ad4ec 31 public:
vcoubard 544:9e3d053ad4ec 32 static const uint16_t SRV_DISC_START_HANDLE = 0x0001; /**< The start handle value used during service discovery. */
vcoubard 544:9e3d053ad4ec 33 static const uint16_t SRV_DISC_END_HANDLE = 0xFFFF; /**< The end handle value used during service discovery. */
vcoubard 544:9e3d053ad4ec 34
vcoubard 544:9e3d053ad4ec 35 public:
vcoubard 544:9e3d053ad4ec 36 static const unsigned BLE_DB_DISCOVERY_MAX_SRV = 4; /**< Maximum number of services we can retain information for after a single discovery. */
vcoubard 544:9e3d053ad4ec 37 static const unsigned BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV = 4; /**< Maximum number of characteristics per service we can retain information for. */
vcoubard 544:9e3d053ad4ec 38
vcoubard 544:9e3d053ad4ec 39 public:
vcoubard 544:9e3d053ad4ec 40 nRF5xServiceDiscovery(nRF5xGattClient *gattcIn) :
vcoubard 544:9e3d053ad4ec 41 gattc(gattcIn),
vcoubard 544:9e3d053ad4ec 42 serviceIndex(0),
vcoubard 544:9e3d053ad4ec 43 numServices(0),
vcoubard 544:9e3d053ad4ec 44 numCharacteristics(0),
vcoubard 544:9e3d053ad4ec 45 state(INACTIVE),
vcoubard 544:9e3d053ad4ec 46 services(),
vcoubard 544:9e3d053ad4ec 47 characteristics(),
vcoubard 544:9e3d053ad4ec 48 serviceUUIDDiscoveryQueue(this),
vcoubard 544:9e3d053ad4ec 49 charUUIDDiscoveryQueue(this),
vcoubard 544:9e3d053ad4ec 50 onTerminationCallback(NULL) {
vcoubard 544:9e3d053ad4ec 51 /* empty */
vcoubard 544:9e3d053ad4ec 52 }
vcoubard 544:9e3d053ad4ec 53
vcoubard 544:9e3d053ad4ec 54 virtual ble_error_t launch(Gap::Handle_t connectionHandle,
vcoubard 544:9e3d053ad4ec 55 ServiceDiscovery::ServiceCallback_t sc,
vcoubard 544:9e3d053ad4ec 56 ServiceDiscovery::CharacteristicCallback_t cc,
vcoubard 544:9e3d053ad4ec 57 const UUID &matchingServiceUUIDIn,
vcoubard 544:9e3d053ad4ec 58 const UUID &matchingCharacteristicUUIDIn)
vcoubard 544:9e3d053ad4ec 59 {
vcoubard 544:9e3d053ad4ec 60 if (isActive()) {
vcoubard 544:9e3d053ad4ec 61 return BLE_ERROR_INVALID_STATE;
vcoubard 544:9e3d053ad4ec 62 }
vcoubard 544:9e3d053ad4ec 63
vcoubard 544:9e3d053ad4ec 64 serviceCallback = sc;
vcoubard 544:9e3d053ad4ec 65 characteristicCallback = cc;
vcoubard 544:9e3d053ad4ec 66 matchingServiceUUID = matchingServiceUUIDIn;
vcoubard 544:9e3d053ad4ec 67 matchingCharacteristicUUID = matchingCharacteristicUUIDIn;
vcoubard 544:9e3d053ad4ec 68
vcoubard 544:9e3d053ad4ec 69 serviceDiscoveryStarted(connectionHandle);
vcoubard 544:9e3d053ad4ec 70
vcoubard 544:9e3d053ad4ec 71 uint32_t rc;
vcoubard 544:9e3d053ad4ec 72 if ((rc = sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL)) != NRF_SUCCESS) {
vcoubard 544:9e3d053ad4ec 73 terminate();
vcoubard 544:9e3d053ad4ec 74 switch (rc) {
vcoubard 544:9e3d053ad4ec 75 case NRF_ERROR_INVALID_PARAM:
vcoubard 544:9e3d053ad4ec 76 case BLE_ERROR_INVALID_CONN_HANDLE:
vcoubard 544:9e3d053ad4ec 77 return BLE_ERROR_INVALID_PARAM;
vcoubard 544:9e3d053ad4ec 78 case NRF_ERROR_BUSY:
vcoubard 544:9e3d053ad4ec 79 return BLE_STACK_BUSY;
vcoubard 544:9e3d053ad4ec 80 default:
vcoubard 544:9e3d053ad4ec 81 case NRF_ERROR_INVALID_STATE:
vcoubard 544:9e3d053ad4ec 82 return BLE_ERROR_INVALID_STATE;
vcoubard 544:9e3d053ad4ec 83 }
vcoubard 544:9e3d053ad4ec 84 }
vcoubard 544:9e3d053ad4ec 85
vcoubard 544:9e3d053ad4ec 86 return BLE_ERROR_NONE;
vcoubard 544:9e3d053ad4ec 87 }
vcoubard 544:9e3d053ad4ec 88
vcoubard 544:9e3d053ad4ec 89 virtual bool isActive(void) const {
vcoubard 544:9e3d053ad4ec 90 return state != INACTIVE;
vcoubard 544:9e3d053ad4ec 91 }
vcoubard 544:9e3d053ad4ec 92
vcoubard 544:9e3d053ad4ec 93 virtual void terminate(void) {
vcoubard 544:9e3d053ad4ec 94 terminateServiceDiscovery();
vcoubard 544:9e3d053ad4ec 95 }
vcoubard 544:9e3d053ad4ec 96
vcoubard 567:e1800bd55a9e 97 void terminate(Gap::Handle_t connectionHandle) {
vcoubard 567:e1800bd55a9e 98 if(connHandle == connectionHandle) {
vcoubard 567:e1800bd55a9e 99 terminate();
vcoubard 567:e1800bd55a9e 100 }
vcoubard 567:e1800bd55a9e 101 }
vcoubard 567:e1800bd55a9e 102
vcoubard 565:cf03471a4ec4 103 virtual void onTermination(ServiceDiscovery::TerminationCallback_t callback) {
vcoubard 565:cf03471a4ec4 104 onTerminationCallback = callback;
vcoubard 544:9e3d053ad4ec 105 }
vcoubard 544:9e3d053ad4ec 106
vcoubard 544:9e3d053ad4ec 107 private:
vcoubard 544:9e3d053ad4ec 108 ble_error_t launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle);
vcoubard 544:9e3d053ad4ec 109
vcoubard 544:9e3d053ad4ec 110 private:
vcoubard 544:9e3d053ad4ec 111 void setupDiscoveredServices(const ble_gattc_evt_prim_srvc_disc_rsp_t *response);
vcoubard 544:9e3d053ad4ec 112 void setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response);
vcoubard 544:9e3d053ad4ec 113
vcoubard 544:9e3d053ad4ec 114 void triggerServiceUUIDDiscovery(void);
vcoubard 544:9e3d053ad4ec 115 void processDiscoverUUIDResponse(const ble_gattc_evt_char_val_by_uuid_read_rsp_t *response);
vcoubard 544:9e3d053ad4ec 116 void removeFirstServiceNeedingUUIDDiscovery(void);
vcoubard 544:9e3d053ad4ec 117
vcoubard 544:9e3d053ad4ec 118 void terminateServiceDiscovery(void) {
vcoubard 567:e1800bd55a9e 119 discoveredCharacteristic = nRF5xDiscoveredCharacteristic();
vcoubard 567:e1800bd55a9e 120
vcoubard 544:9e3d053ad4ec 121 bool wasActive = isActive();
vcoubard 544:9e3d053ad4ec 122 state = INACTIVE;
vcoubard 544:9e3d053ad4ec 123
vcoubard 544:9e3d053ad4ec 124 if (wasActive && onTerminationCallback) {
vcoubard 544:9e3d053ad4ec 125 onTerminationCallback(connHandle);
vcoubard 544:9e3d053ad4ec 126 }
vcoubard 544:9e3d053ad4ec 127 }
vcoubard 544:9e3d053ad4ec 128
vcoubard 567:e1800bd55a9e 129 void terminateCharacteristicDiscovery(ble_error_t err) {
vcoubard 544:9e3d053ad4ec 130 if (state == CHARACTERISTIC_DISCOVERY_ACTIVE) {
vcoubard 567:e1800bd55a9e 131 if(discoveredCharacteristic != nRF5xDiscoveredCharacteristic()) {
vcoubard 567:e1800bd55a9e 132 if(err == BLE_ERROR_NONE) {
vcoubard 567:e1800bd55a9e 133 // fullfill the last characteristic
vcoubard 567:e1800bd55a9e 134 discoveredCharacteristic.setLastHandle(services[serviceIndex].getEndHandle());
vcoubard 567:e1800bd55a9e 135
vcoubard 567:e1800bd55a9e 136 if ((matchingCharacteristicUUID == UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) ||
vcoubard 567:e1800bd55a9e 137 ((matchingCharacteristicUUID == discoveredCharacteristic.getUUID()) &&
vcoubard 567:e1800bd55a9e 138 (matchingServiceUUID != UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)))) {
vcoubard 567:e1800bd55a9e 139 if (characteristicCallback) {
vcoubard 567:e1800bd55a9e 140 characteristicCallback(&discoveredCharacteristic);
vcoubard 567:e1800bd55a9e 141 }
vcoubard 567:e1800bd55a9e 142 }
vcoubard 567:e1800bd55a9e 143 }
vcoubard 567:e1800bd55a9e 144 discoveredCharacteristic = nRF5xDiscoveredCharacteristic();
vcoubard 567:e1800bd55a9e 145 }
vcoubard 567:e1800bd55a9e 146
vcoubard 544:9e3d053ad4ec 147 state = SERVICE_DISCOVERY_ACTIVE;
vcoubard 544:9e3d053ad4ec 148 }
vcoubard 544:9e3d053ad4ec 149 serviceIndex++; /* Progress service index to keep discovery alive. */
vcoubard 544:9e3d053ad4ec 150 }
vcoubard 544:9e3d053ad4ec 151
vcoubard 544:9e3d053ad4ec 152 private:
vcoubard 544:9e3d053ad4ec 153 void resetDiscoveredServices(void) {
vcoubard 544:9e3d053ad4ec 154 numServices = 0;
vcoubard 544:9e3d053ad4ec 155 serviceIndex = 0;
vcoubard 544:9e3d053ad4ec 156 }
vcoubard 544:9e3d053ad4ec 157
vcoubard 544:9e3d053ad4ec 158 void resetDiscoveredCharacteristics(void) {
vcoubard 544:9e3d053ad4ec 159 numCharacteristics = 0;
vcoubard 544:9e3d053ad4ec 160 }
vcoubard 544:9e3d053ad4ec 161
vcoubard 544:9e3d053ad4ec 162 private:
vcoubard 544:9e3d053ad4ec 163 void serviceDiscoveryStarted(Gap::Handle_t connectionHandle) {
vcoubard 544:9e3d053ad4ec 164 connHandle = connectionHandle;
vcoubard 544:9e3d053ad4ec 165 resetDiscoveredServices();
vcoubard 544:9e3d053ad4ec 166 state = SERVICE_DISCOVERY_ACTIVE;
vcoubard 544:9e3d053ad4ec 167 }
vcoubard 544:9e3d053ad4ec 168
vcoubard 544:9e3d053ad4ec 169 private:
vcoubard 544:9e3d053ad4ec 170 void characteristicDiscoveryStarted(Gap::Handle_t connectionHandle) {
vcoubard 544:9e3d053ad4ec 171 connHandle = connectionHandle;
vcoubard 544:9e3d053ad4ec 172 resetDiscoveredCharacteristics();
vcoubard 544:9e3d053ad4ec 173 state = CHARACTERISTIC_DISCOVERY_ACTIVE;
vcoubard 544:9e3d053ad4ec 174 }
vcoubard 544:9e3d053ad4ec 175
vcoubard 544:9e3d053ad4ec 176 private:
vcoubard 544:9e3d053ad4ec 177 /**
vcoubard 544:9e3d053ad4ec 178 * A datatype to contain service-indices for which long UUIDs need to be
vcoubard 544:9e3d053ad4ec 179 * discovered using read_val_by_uuid().
vcoubard 544:9e3d053ad4ec 180 */
vcoubard 544:9e3d053ad4ec 181 class ServiceUUIDDiscoveryQueue {
vcoubard 544:9e3d053ad4ec 182 public:
vcoubard 544:9e3d053ad4ec 183 ServiceUUIDDiscoveryQueue(nRF5xServiceDiscovery *parent) :
vcoubard 544:9e3d053ad4ec 184 numIndices(0),
vcoubard 544:9e3d053ad4ec 185 serviceIndices(),
vcoubard 544:9e3d053ad4ec 186 parentDiscoveryObject(parent) {
vcoubard 544:9e3d053ad4ec 187 /* empty */
vcoubard 544:9e3d053ad4ec 188 }
vcoubard 544:9e3d053ad4ec 189
vcoubard 544:9e3d053ad4ec 190 public:
vcoubard 544:9e3d053ad4ec 191 void reset(void) {
vcoubard 544:9e3d053ad4ec 192 numIndices = 0;
vcoubard 544:9e3d053ad4ec 193 for (unsigned i = 0; i < BLE_DB_DISCOVERY_MAX_SRV; i++) {
vcoubard 544:9e3d053ad4ec 194 serviceIndices[i] = INVALID_INDEX;
vcoubard 544:9e3d053ad4ec 195 }
vcoubard 544:9e3d053ad4ec 196 }
vcoubard 544:9e3d053ad4ec 197 void enqueue(int serviceIndex) {
vcoubard 544:9e3d053ad4ec 198 serviceIndices[numIndices++] = serviceIndex;
vcoubard 544:9e3d053ad4ec 199 }
vcoubard 544:9e3d053ad4ec 200 int dequeue(void) {
vcoubard 544:9e3d053ad4ec 201 if (numIndices == 0) {
vcoubard 544:9e3d053ad4ec 202 return INVALID_INDEX;
vcoubard 544:9e3d053ad4ec 203 }
vcoubard 544:9e3d053ad4ec 204
vcoubard 544:9e3d053ad4ec 205 unsigned valueToReturn = serviceIndices[0];
vcoubard 544:9e3d053ad4ec 206 numIndices--;
vcoubard 544:9e3d053ad4ec 207 for (unsigned i = 0; i < numIndices; i++) {
vcoubard 544:9e3d053ad4ec 208 serviceIndices[i] = serviceIndices[i + 1];
vcoubard 544:9e3d053ad4ec 209 }
vcoubard 544:9e3d053ad4ec 210
vcoubard 544:9e3d053ad4ec 211 return valueToReturn;
vcoubard 544:9e3d053ad4ec 212 }
vcoubard 544:9e3d053ad4ec 213 unsigned getFirst(void) const {
vcoubard 544:9e3d053ad4ec 214 return serviceIndices[0];
vcoubard 544:9e3d053ad4ec 215 }
vcoubard 544:9e3d053ad4ec 216 size_t getCount(void) const {
vcoubard 544:9e3d053ad4ec 217 return numIndices;
vcoubard 544:9e3d053ad4ec 218 }
vcoubard 544:9e3d053ad4ec 219
vcoubard 544:9e3d053ad4ec 220 /**
vcoubard 544:9e3d053ad4ec 221 * Trigger UUID discovery for the first of the enqueued ServiceIndices.
vcoubard 544:9e3d053ad4ec 222 */
vcoubard 544:9e3d053ad4ec 223 void triggerFirst(void);
vcoubard 544:9e3d053ad4ec 224
vcoubard 544:9e3d053ad4ec 225 private:
vcoubard 544:9e3d053ad4ec 226 static const int INVALID_INDEX = -1;
vcoubard 544:9e3d053ad4ec 227
vcoubard 544:9e3d053ad4ec 228 private:
vcoubard 544:9e3d053ad4ec 229 size_t numIndices;
vcoubard 544:9e3d053ad4ec 230 int serviceIndices[BLE_DB_DISCOVERY_MAX_SRV];
vcoubard 544:9e3d053ad4ec 231
vcoubard 544:9e3d053ad4ec 232 nRF5xServiceDiscovery *parentDiscoveryObject;
vcoubard 544:9e3d053ad4ec 233 };
vcoubard 544:9e3d053ad4ec 234 friend class ServiceUUIDDiscoveryQueue;
vcoubard 544:9e3d053ad4ec 235
vcoubard 544:9e3d053ad4ec 236 /**
vcoubard 544:9e3d053ad4ec 237 * A datatype to contain characteristic-indices for which long UUIDs need to
vcoubard 544:9e3d053ad4ec 238 * be discovered using read_val_by_uuid().
vcoubard 544:9e3d053ad4ec 239 */
vcoubard 544:9e3d053ad4ec 240 class CharUUIDDiscoveryQueue {
vcoubard 544:9e3d053ad4ec 241 public:
vcoubard 544:9e3d053ad4ec 242 CharUUIDDiscoveryQueue(nRF5xServiceDiscovery *parent) :
vcoubard 544:9e3d053ad4ec 243 numIndices(0),
vcoubard 544:9e3d053ad4ec 244 charIndices(),
vcoubard 544:9e3d053ad4ec 245 parentDiscoveryObject(parent) {
vcoubard 544:9e3d053ad4ec 246 /* empty */
vcoubard 544:9e3d053ad4ec 247 }
vcoubard 544:9e3d053ad4ec 248
vcoubard 544:9e3d053ad4ec 249 public:
vcoubard 544:9e3d053ad4ec 250 void reset(void) {
vcoubard 544:9e3d053ad4ec 251 numIndices = 0;
vcoubard 544:9e3d053ad4ec 252 for (unsigned i = 0; i < BLE_DB_DISCOVERY_MAX_SRV; i++) {
vcoubard 544:9e3d053ad4ec 253 charIndices[i] = INVALID_INDEX;
vcoubard 544:9e3d053ad4ec 254 }
vcoubard 544:9e3d053ad4ec 255 }
vcoubard 544:9e3d053ad4ec 256 void enqueue(int serviceIndex) {
vcoubard 544:9e3d053ad4ec 257 charIndices[numIndices++] = serviceIndex;
vcoubard 544:9e3d053ad4ec 258 }
vcoubard 544:9e3d053ad4ec 259 int dequeue(void) {
vcoubard 544:9e3d053ad4ec 260 if (numIndices == 0) {
vcoubard 544:9e3d053ad4ec 261 return INVALID_INDEX;
vcoubard 544:9e3d053ad4ec 262 }
vcoubard 544:9e3d053ad4ec 263
vcoubard 544:9e3d053ad4ec 264 unsigned valueToReturn = charIndices[0];
vcoubard 544:9e3d053ad4ec 265 numIndices--;
vcoubard 544:9e3d053ad4ec 266 for (unsigned i = 0; i < numIndices; i++) {
vcoubard 544:9e3d053ad4ec 267 charIndices[i] = charIndices[i + 1];
vcoubard 544:9e3d053ad4ec 268 }
vcoubard 544:9e3d053ad4ec 269
vcoubard 544:9e3d053ad4ec 270 return valueToReturn;
vcoubard 544:9e3d053ad4ec 271 }
vcoubard 544:9e3d053ad4ec 272 unsigned getFirst(void) const {
vcoubard 544:9e3d053ad4ec 273 return charIndices[0];
vcoubard 544:9e3d053ad4ec 274 }
vcoubard 544:9e3d053ad4ec 275 size_t getCount(void) const {
vcoubard 544:9e3d053ad4ec 276 return numIndices;
vcoubard 544:9e3d053ad4ec 277 }
vcoubard 544:9e3d053ad4ec 278
vcoubard 544:9e3d053ad4ec 279 /**
vcoubard 544:9e3d053ad4ec 280 * Trigger UUID discovery for the first of the enqueued charIndices.
vcoubard 544:9e3d053ad4ec 281 */
vcoubard 544:9e3d053ad4ec 282 void triggerFirst(void);
vcoubard 544:9e3d053ad4ec 283
vcoubard 544:9e3d053ad4ec 284 private:
vcoubard 544:9e3d053ad4ec 285 static const int INVALID_INDEX = -1;
vcoubard 544:9e3d053ad4ec 286
vcoubard 544:9e3d053ad4ec 287 private:
vcoubard 544:9e3d053ad4ec 288 size_t numIndices;
vcoubard 544:9e3d053ad4ec 289 int charIndices[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];
vcoubard 544:9e3d053ad4ec 290
vcoubard 544:9e3d053ad4ec 291 nRF5xServiceDiscovery *parentDiscoveryObject;
vcoubard 544:9e3d053ad4ec 292 };
vcoubard 544:9e3d053ad4ec 293 friend class CharUUIDDiscoveryQueue;
vcoubard 544:9e3d053ad4ec 294
vcoubard 544:9e3d053ad4ec 295 private:
vcoubard 544:9e3d053ad4ec 296 friend void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
vcoubard 544:9e3d053ad4ec 297 void progressCharacteristicDiscovery(void);
vcoubard 544:9e3d053ad4ec 298 void progressServiceDiscovery(void);
vcoubard 544:9e3d053ad4ec 299
vcoubard 544:9e3d053ad4ec 300 private:
vcoubard 544:9e3d053ad4ec 301 nRF5xGattClient *gattc;
vcoubard 544:9e3d053ad4ec 302
vcoubard 544:9e3d053ad4ec 303 private:
vcoubard 544:9e3d053ad4ec 304 uint8_t serviceIndex; /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/
vcoubard 544:9e3d053ad4ec 305 uint8_t numServices; /**< Number of services at the peers GATT database.*/
vcoubard 544:9e3d053ad4ec 306 uint8_t numCharacteristics; /**< Number of characteristics within the service.*/
vcoubard 544:9e3d053ad4ec 307
vcoubard 544:9e3d053ad4ec 308 enum State_t {
vcoubard 544:9e3d053ad4ec 309 INACTIVE,
vcoubard 544:9e3d053ad4ec 310 SERVICE_DISCOVERY_ACTIVE,
vcoubard 544:9e3d053ad4ec 311 CHARACTERISTIC_DISCOVERY_ACTIVE,
vcoubard 544:9e3d053ad4ec 312 DISCOVER_SERVICE_UUIDS,
vcoubard 544:9e3d053ad4ec 313 DISCOVER_CHARACTERISTIC_UUIDS,
vcoubard 544:9e3d053ad4ec 314 } state;
vcoubard 544:9e3d053ad4ec 315
vcoubard 544:9e3d053ad4ec 316 DiscoveredService services[BLE_DB_DISCOVERY_MAX_SRV]; /**< Information related to the current service being discovered.
vcoubard 544:9e3d053ad4ec 317 * This is intended for internal use during service discovery. */
vcoubard 544:9e3d053ad4ec 318 nRF5xDiscoveredCharacteristic characteristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];
vcoubard 544:9e3d053ad4ec 319
vcoubard 544:9e3d053ad4ec 320 ServiceUUIDDiscoveryQueue serviceUUIDDiscoveryQueue;
vcoubard 544:9e3d053ad4ec 321 CharUUIDDiscoveryQueue charUUIDDiscoveryQueue;
vcoubard 544:9e3d053ad4ec 322
vcoubard 544:9e3d053ad4ec 323 TerminationCallback_t onTerminationCallback;
vcoubard 567:e1800bd55a9e 324
vcoubard 567:e1800bd55a9e 325 /*
vcoubard 567:e1800bd55a9e 326 * The currently discovered characteristic. Discovery of a characteristic
vcoubard 567:e1800bd55a9e 327 * is a two phase process.
vcoubard 567:e1800bd55a9e 328 * First, declaration handle is fetched, it provide the UUID, the value handle and
vcoubard 567:e1800bd55a9e 329 * the properties of a characteristic.
vcoubard 567:e1800bd55a9e 330 * Second, the next declaration handle is fetched, with its declaration handle, it is
vcoubard 567:e1800bd55a9e 331 * possible to compute the last handle of the discovered characteristic and fill the
vcoubard 567:e1800bd55a9e 332 * missing part of the object.
vcoubard 567:e1800bd55a9e 333 * If there is no remaining characteristic to discover, the last handle of the
vcoubard 567:e1800bd55a9e 334 * discovered characteristic will be set to the last handle of its enclosing service.
vcoubard 567:e1800bd55a9e 335 */
vcoubard 567:e1800bd55a9e 336 nRF5xDiscoveredCharacteristic discoveredCharacteristic;
vcoubard 544:9e3d053ad4ec 337 };
vcoubard 544:9e3d053ad4ec 338
rgrover1 388:db85a09c27ef 339 #endif /*__NRF_SERVICE_DISCOVERY_H__*/