nordic

Fork of nRF51822 by Nordic Semiconductor

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