Sergey Solodunov / nRF51822

Dependencies:   nrf51-sdk

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Thu Jul 02 09:08:44 2015 +0100
Revision:
362:6fa0d4d555f6
Synchronized with git rev 2716309c
Author: Rohit Grover
Release 0.4.0
=============

This is a major release which introduces the GATT Client functionality. It
aligns with release 0.4.0 of BLE_API.

Enhancements
~~~~~~~~~~~~

* Introduce GattClient. This includes functionality for service-discovery,
connections, and attribute-reads and writes. You'll find a demo program for
LEDBlinker on the mbed.org Bluetooth team page to use the new APIs. Some of
the GATT client functionality hasn't been implemented yet, but the APIs have
been added.

* We've added an implementation for the abstract base class for
SecurityManager. All security related APIs have been moved into that.

* There has been a major cleanup of APIs under BLE. APIs have now been
categorized as belonging to Gap, GattServer, GattClient, or SecurityManager.
There are accessors to get references for Gap, GattServer, GattClient, and
SecurityManager. A former call to ble.setAddress(...) is now expected to be
achieved with ble.gap().setAddress(...).

* We've cleaned up our APIs, and this has resulted in dropping some APIs like
BLE::reset().

* We've also dropped GattServer::initializeGattDatabase(). THis was added at
some point to support controllers where a commit point was needed to
indicate when the application had finished constructing the GATT database.
This API would get called internally before Gap::startAdvertising(). We now
expect the underlying port to do the equivalent of initializeGattDatabase()
implicitly upon Gap::startAdvertising().

* We've added a version of Gap::disconnect() which takes a connection handle.
The previous API (which did not take a connection handle) has been
deprecated; it will still work for situations where there's only a single
active connection. We hold on to that API to allow existing code to migrate
to the new API.

Bugfixes
~~~~~~~~

* None.

Who changed what in which revision?

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