Michael Galis / nRF51822

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:32 2015 +0100
Revision:
331:352bc4a36ea0
Child:
332:b054000833d4
Synchronized with git rev 093cc129
Author: Rohit Grover
nRFDiscovery is now a part of the nRFGattClient object.

Who changed what in which revision?

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