High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Wed Dec 02 10:29:44 2015 +0000
Revision:
993:4d62b7967c11
Parent:
992:ca834f7ae8ed
Child:
1042:21a86ac7f5b1
Synchronized with git rev 12e27cd4
Author: Rohit Grover
Release 2.1.3
=============

* Improvements to CallChainOfFunctionPointerswithContext:
- add a `detach` function to be able to remove callbacks.
- detach function now return true if a function has been detached and
false otherwise.
- add a function call operator.
- use safe-bool idiom. see : http://www.artima.com/cppsource/safebool.html

* Add SafeBool class which allow to easily declare a safe bool operator in
c++03.

* Improvements to FunctionPointerWithContext:
- fix call propagation
- use safe bool idiom

* Add config file for generating Doxygen.

* Setup for onRadioNotification callback does not call initRadioNotification
anymore.

* GapAdvertisementData now handles replacement and appending of data fields
based on type. Some fields can be replaced with new values, and others
require the payload to be appended.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 716:11b41f651697 1 /* mbed Microcontroller Library
rgrover1 716:11b41f651697 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 716:11b41f651697 3 *
rgrover1 716:11b41f651697 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 716:11b41f651697 5 * you may not use this file except in compliance with the License.
rgrover1 716:11b41f651697 6 * You may obtain a copy of the License at
rgrover1 716:11b41f651697 7 *
rgrover1 716:11b41f651697 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 716:11b41f651697 9 *
rgrover1 716:11b41f651697 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 716:11b41f651697 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 716:11b41f651697 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 716:11b41f651697 13 * See the License for the specific language governing permissions and
rgrover1 716:11b41f651697 14 * limitations under the License.
rgrover1 716:11b41f651697 15 */
rgrover1 716:11b41f651697 16
rgrover1 716:11b41f651697 17 #ifndef __GATT_CLIENT_H__
rgrover1 716:11b41f651697 18 #define __GATT_CLIENT_H__
rgrover1 716:11b41f651697 19
rgrover1 716:11b41f651697 20 #include "Gap.h"
rgrover1 716:11b41f651697 21 #include "GattAttribute.h"
rgrover1 716:11b41f651697 22 #include "ServiceDiscovery.h"
rgrover1 716:11b41f651697 23
rgrover1 716:11b41f651697 24 #include "GattCallbackParamTypes.h"
rgrover1 716:11b41f651697 25
rgrover1 993:4d62b7967c11 26 #include "CallChainOfFunctionPointersWithContext.h"
rgrover1 993:4d62b7967c11 27
rgrover1 716:11b41f651697 28 class GattClient {
rgrover1 716:11b41f651697 29 public:
rgrover1 993:4d62b7967c11 30 typedef FunctionPointerWithContext<const GattReadCallbackParams*> ReadCallback_t;
rgrover1 993:4d62b7967c11 31 typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams*> ReadCallbackChain_t;
rgrover1 716:11b41f651697 32
rgrover1 716:11b41f651697 33 enum WriteOp_t {
rgrover1 993:4d62b7967c11 34 GATT_OP_WRITE_REQ = 0x01, /**< Write request. */
rgrover1 993:4d62b7967c11 35 GATT_OP_WRITE_CMD = 0x02, /**< Write command. */
rgrover1 716:11b41f651697 36 };
rgrover1 716:11b41f651697 37
rgrover1 993:4d62b7967c11 38 typedef FunctionPointerWithContext<const GattWriteCallbackParams*> WriteCallback_t;
rgrover1 993:4d62b7967c11 39 typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> WriteCallbackChain_t;
rgrover1 716:11b41f651697 40
rgrover1 993:4d62b7967c11 41 typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t;
rgrover1 993:4d62b7967c11 42 typedef CallChainOfFunctionPointersWithContext<const GattHVXCallbackParams*> HVXCallbackChain_t;
rgrover1 737:79d95f9b93be 43
rgrover1 716:11b41f651697 44 /*
rgrover1 716:11b41f651697 45 * The following functions are meant to be overridden in the platform-specific sub-class.
rgrover1 716:11b41f651697 46 */
rgrover1 716:11b41f651697 47 public:
rgrover1 716:11b41f651697 48 /**
rgrover1 728:997ba5e7b3b6 49 * Launch service discovery. Once launched, application callbacks will be
rgrover1 993:4d62b7967c11 50 * invoked for matching services or characteristics. isServiceDiscoveryActive()
rgrover1 993:4d62b7967c11 51 * can be used to determine status, and a termination callback (if one was set up)
rgrover1 993:4d62b7967c11 52 * will be invoked at the end. Service discovery can be terminated prematurely,
rgrover1 993:4d62b7967c11 53 * if needed, using terminateServiceDiscovery().
rgrover1 716:11b41f651697 54 *
rgrover1 716:11b41f651697 55 * @param connectionHandle
rgrover1 716:11b41f651697 56 * Handle for the connection with the peer.
rgrover1 716:11b41f651697 57 * @param sc
rgrover1 993:4d62b7967c11 58 * This is the application callback for a matching service. Taken as
rgrover1 716:11b41f651697 59 * NULL by default. Note: service discovery may still be active
rgrover1 716:11b41f651697 60 * when this callback is issued; calling asynchronous BLE-stack
rgrover1 716:11b41f651697 61 * APIs from within this application callback might cause the
rgrover1 716:11b41f651697 62 * stack to abort service discovery. If this becomes an issue, it
rgrover1 993:4d62b7967c11 63 * may be better to make a local copy of the discoveredService and
rgrover1 716:11b41f651697 64 * wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 65 * service.
rgrover1 716:11b41f651697 66 * @param cc
rgrover1 993:4d62b7967c11 67 * This is the application callback for a matching characteristic.
rgrover1 716:11b41f651697 68 * Taken as NULL by default. Note: service discovery may still be
rgrover1 716:11b41f651697 69 * active when this callback is issued; calling asynchronous
rgrover1 716:11b41f651697 70 * BLE-stack APIs from within this application callback might cause
rgrover1 716:11b41f651697 71 * the stack to abort service discovery. If this becomes an issue,
rgrover1 993:4d62b7967c11 72 * it may be better to make a local copy of the discoveredCharacteristic
rgrover1 716:11b41f651697 73 * and wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 74 * characteristic.
rgrover1 716:11b41f651697 75 * @param matchingServiceUUID
rgrover1 993:4d62b7967c11 76 * UUID-based filter for specifying a service in which the application is
rgrover1 716:11b41f651697 77 * interested. By default it is set as the wildcard UUID_UNKNOWN,
rgrover1 716:11b41f651697 78 * in which case it matches all services. If characteristic-UUID
rgrover1 716:11b41f651697 79 * filter (below) is set to the wildcard value, then a service
rgrover1 716:11b41f651697 80 * callback will be invoked for the matching service (or for every
rgrover1 716:11b41f651697 81 * service if the service filter is a wildcard).
rgrover1 716:11b41f651697 82 * @param matchingCharacteristicUUIDIn
rgrover1 993:4d62b7967c11 83 * UUID-based filter for specifying characteristic in which the application
rgrover1 716:11b41f651697 84 * is interested. By default it is set as the wildcard UUID_UKNOWN
rgrover1 716:11b41f651697 85 * to match against any characteristic. If both service-UUID
rgrover1 993:4d62b7967c11 86 * filter and characteristic-UUID filter are used with non-wildcard
rgrover1 716:11b41f651697 87 * values, then only a single characteristic callback is
rgrover1 716:11b41f651697 88 * invoked for the matching characteristic.
rgrover1 716:11b41f651697 89 *
rgrover1 716:11b41f651697 90 * @note Using wildcard values for both service-UUID and characteristic-
rgrover1 993:4d62b7967c11 91 * UUID will result in complete service discovery: callbacks being
rgrover1 716:11b41f651697 92 * called for every service and characteristic.
rgrover1 716:11b41f651697 93 *
rgrover1 716:11b41f651697 94 * @note Providing NULL for the characteristic callback will result in
rgrover1 716:11b41f651697 95 * characteristic discovery being skipped for each matching
rgrover1 716:11b41f651697 96 * service. This allows for an inexpensive method to discover only
rgrover1 716:11b41f651697 97 * services.
rgrover1 716:11b41f651697 98 *
rgrover1 716:11b41f651697 99 * @return
rgrover1 716:11b41f651697 100 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
rgrover1 716:11b41f651697 101 */
rgrover1 716:11b41f651697 102 virtual ble_error_t launchServiceDiscovery(Gap::Handle_t connectionHandle,
rgrover1 716:11b41f651697 103 ServiceDiscovery::ServiceCallback_t sc = NULL,
rgrover1 716:11b41f651697 104 ServiceDiscovery::CharacteristicCallback_t cc = NULL,
rgrover1 716:11b41f651697 105 const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
rgrover1 716:11b41f651697 106 const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
rgrover1 993:4d62b7967c11 107 /* Avoid compiler warnings about unused variables. */
rgrover1 734:4872b70437ce 108 (void)connectionHandle;
rgrover1 734:4872b70437ce 109 (void)sc;
rgrover1 734:4872b70437ce 110 (void)cc;
rgrover1 734:4872b70437ce 111 (void)matchingServiceUUID;
rgrover1 734:4872b70437ce 112 (void)matchingCharacteristicUUIDIn;
rgrover1 734:4872b70437ce 113
rgrover1 993:4d62b7967c11 114 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 115 }
rgrover1 716:11b41f651697 116
rgrover1 716:11b41f651697 117 /**
rgrover1 716:11b41f651697 118 * Launch service discovery for services. Once launched, service discovery will remain
rgrover1 716:11b41f651697 119 * active with service-callbacks being issued back into the application for matching
rgrover1 716:11b41f651697 120 * services. isServiceDiscoveryActive() can be used to
rgrover1 993:4d62b7967c11 121 * determine status, and a termination callback (if set up) will be invoked
rgrover1 993:4d62b7967c11 122 * at the end. Service discovery can be terminated prematurely, if needed,
rgrover1 716:11b41f651697 123 * using terminateServiceDiscovery().
rgrover1 716:11b41f651697 124 *
rgrover1 716:11b41f651697 125 * @param connectionHandle
rgrover1 716:11b41f651697 126 * Handle for the connection with the peer.
rgrover1 716:11b41f651697 127 * @param sc
rgrover1 993:4d62b7967c11 128 * This is the application callback for a matching service. Note: service discovery may still be active
rgrover1 716:11b41f651697 129 * when this callback is issued; calling asynchronous BLE-stack
rgrover1 716:11b41f651697 130 * APIs from within this application callback might cause the
rgrover1 716:11b41f651697 131 * stack to abort service discovery. If this becomes an issue, it
rgrover1 993:4d62b7967c11 132 * may be better to make a local copy of the discoveredService and
rgrover1 716:11b41f651697 133 * wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 134 * service.
rgrover1 716:11b41f651697 135 * @param matchingServiceUUID
rgrover1 993:4d62b7967c11 136 * UUID-based filter for specifying a service in which the application is
rgrover1 716:11b41f651697 137 * interested. By default it is set as the wildcard UUID_UNKNOWN,
rgrover1 716:11b41f651697 138 * in which case it matches all services.
rgrover1 716:11b41f651697 139 *
rgrover1 716:11b41f651697 140 * @return
rgrover1 716:11b41f651697 141 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
rgrover1 716:11b41f651697 142 */
rgrover1 716:11b41f651697 143 virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
rgrover1 716:11b41f651697 144 ServiceDiscovery::ServiceCallback_t callback,
rgrover1 716:11b41f651697 145 const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
rgrover1 742:861ed7eb186d 146 return launchServiceDiscovery(connectionHandle, callback, NULL, matchingServiceUUID); /* We take advantage of the property
rgrover1 742:861ed7eb186d 147 * that providing NULL for the characteristic callback will result in
rgrover1 742:861ed7eb186d 148 * characteristic discovery being skipped for each matching
rgrover1 742:861ed7eb186d 149 * service. This allows for an inexpensive method to discover only
rgrover1 993:4d62b7967c11 150 * services. Porters are free to override this. */
rgrover1 716:11b41f651697 151 }
rgrover1 716:11b41f651697 152
rgrover1 716:11b41f651697 153 /**
rgrover1 716:11b41f651697 154 * Launch service discovery for services. Once launched, service discovery will remain
rgrover1 716:11b41f651697 155 * active with service-callbacks being issued back into the application for matching
rgrover1 716:11b41f651697 156 * services. isServiceDiscoveryActive() can be used to
rgrover1 993:4d62b7967c11 157 * determine status, and a termination callback (if set up) will be invoked
rgrover1 993:4d62b7967c11 158 * at the end. Service discovery can be terminated prematurely, if needed,
rgrover1 716:11b41f651697 159 * using terminateServiceDiscovery().
rgrover1 716:11b41f651697 160 *
rgrover1 716:11b41f651697 161 * @param connectionHandle
rgrover1 716:11b41f651697 162 * Handle for the connection with the peer.
rgrover1 716:11b41f651697 163 * @param sc
rgrover1 993:4d62b7967c11 164 * This is the application callback for a matching service. Note: service discovery may still be active
rgrover1 716:11b41f651697 165 * when this callback is issued; calling asynchronous BLE-stack
rgrover1 716:11b41f651697 166 * APIs from within this application callback might cause the
rgrover1 716:11b41f651697 167 * stack to abort service discovery. If this becomes an issue, it
rgrover1 993:4d62b7967c11 168 * may be better to make a local copy of the discoveredService and
rgrover1 716:11b41f651697 169 * wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 170 * service.
rgrover1 716:11b41f651697 171 * @param startHandle, endHandle
rgrover1 993:4d62b7967c11 172 * Handle range within which to limit the search.
rgrover1 716:11b41f651697 173 *
rgrover1 716:11b41f651697 174 * @return
rgrover1 716:11b41f651697 175 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
rgrover1 716:11b41f651697 176 */
rgrover1 716:11b41f651697 177 virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
rgrover1 716:11b41f651697 178 ServiceDiscovery::ServiceCallback_t callback,
rgrover1 716:11b41f651697 179 GattAttribute::Handle_t startHandle,
rgrover1 716:11b41f651697 180 GattAttribute::Handle_t endHandle) {
rgrover1 993:4d62b7967c11 181 /* Avoid compiler warnings about unused variables. */
rgrover1 734:4872b70437ce 182 (void)connectionHandle;
rgrover1 734:4872b70437ce 183 (void)callback;
rgrover1 734:4872b70437ce 184 (void)startHandle;
rgrover1 734:4872b70437ce 185 (void)endHandle;
rgrover1 734:4872b70437ce 186
rgrover1 993:4d62b7967c11 187 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 188 }
rgrover1 716:11b41f651697 189
rgrover1 716:11b41f651697 190 /**
rgrover1 716:11b41f651697 191 * Is service-discovery currently active?
rgrover1 716:11b41f651697 192 */
rgrover1 716:11b41f651697 193 virtual bool isServiceDiscoveryActive(void) const {
rgrover1 993:4d62b7967c11 194 return false; /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 195 }
rgrover1 716:11b41f651697 196
rgrover1 716:11b41f651697 197 /**
rgrover1 993:4d62b7967c11 198 * Terminate an ongoing service discovery. This should result in an
rgrover1 993:4d62b7967c11 199 * invocation of TerminationCallback if service-discovery is active.
rgrover1 716:11b41f651697 200 */
rgrover1 716:11b41f651697 201 virtual void terminateServiceDiscovery(void) {
rgrover1 993:4d62b7967c11 202 /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 203 }
rgrover1 716:11b41f651697 204
rgrover1 993:4d62b7967c11 205 /* Initiate a GATT Client read procedure by attribute-handle. */
rgrover1 716:11b41f651697 206 virtual ble_error_t read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const {
rgrover1 993:4d62b7967c11 207 /* Avoid compiler warnings about unused variables. */
rgrover1 734:4872b70437ce 208 (void)connHandle;
rgrover1 734:4872b70437ce 209 (void)attributeHandle;
rgrover1 734:4872b70437ce 210 (void)offset;
rgrover1 734:4872b70437ce 211
rgrover1 993:4d62b7967c11 212 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 213 }
rgrover1 716:11b41f651697 214
rgrover1 716:11b41f651697 215 /**
rgrover1 716:11b41f651697 216 * Initiate a GATT Client write procedure.
rgrover1 716:11b41f651697 217 *
rgrover1 716:11b41f651697 218 * @param[in] cmd
rgrover1 993:4d62b7967c11 219 * Command can be either a write-request (which generates a
rgrover1 993:4d62b7967c11 220 * matching response from the peripheral), or a write-command
rgrover1 993:4d62b7967c11 221 * (which doesn't require the connected peer to respond).
rgrover1 716:11b41f651697 222 * @param[in] connHandle
rgrover1 716:11b41f651697 223 * Connection handle.
rgrover1 716:11b41f651697 224 * @param[in] attributeHandle
rgrover1 993:4d62b7967c11 225 * Handle for the target attribtue on the remote GATT server.
rgrover1 716:11b41f651697 226 * @param[in] length
rgrover1 993:4d62b7967c11 227 * Length of the new value.
rgrover1 716:11b41f651697 228 * @param[in] value
rgrover1 993:4d62b7967c11 229 * New value being written.
rgrover1 716:11b41f651697 230 */
rgrover1 716:11b41f651697 231 virtual ble_error_t write(GattClient::WriteOp_t cmd,
rgrover1 716:11b41f651697 232 Gap::Handle_t connHandle,
rgrover1 716:11b41f651697 233 GattAttribute::Handle_t attributeHandle,
rgrover1 716:11b41f651697 234 size_t length,
rgrover1 716:11b41f651697 235 const uint8_t *value) const {
rgrover1 993:4d62b7967c11 236 /* Avoid compiler warnings about unused variables. */
rgrover1 734:4872b70437ce 237 (void)cmd;
rgrover1 734:4872b70437ce 238 (void)connHandle;
rgrover1 734:4872b70437ce 239 (void)attributeHandle;
rgrover1 734:4872b70437ce 240 (void)length;
rgrover1 734:4872b70437ce 241 (void)value;
rgrover1 734:4872b70437ce 242
rgrover1 993:4d62b7967c11 243 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 728:997ba5e7b3b6 244 }
rgrover1 728:997ba5e7b3b6 245
rgrover1 728:997ba5e7b3b6 246 /* Event callback handlers. */
rgrover1 728:997ba5e7b3b6 247 public:
rgrover1 728:997ba5e7b3b6 248 /**
rgrover1 993:4d62b7967c11 249 * Set up a callback for read response events.
rgrover1 993:4d62b7967c11 250 * It is possible to remove registered callbacks using
rgrover1 993:4d62b7967c11 251 * onDataRead().detach(callbackToRemove)
rgrover1 728:997ba5e7b3b6 252 */
rgrover1 728:997ba5e7b3b6 253 void onDataRead(ReadCallback_t callback) {
rgrover1 993:4d62b7967c11 254 onDataReadCallbackChain.add(callback);
rgrover1 993:4d62b7967c11 255 }
rgrover1 993:4d62b7967c11 256
rgrover1 993:4d62b7967c11 257 /**
rgrover1 993:4d62b7967c11 258 * @brief provide access to the callchain of read callbacks
rgrover1 993:4d62b7967c11 259 * It is possible to register callbacks using onDataRead().add(callback);
rgrover1 993:4d62b7967c11 260 * It is possible to unregister callbacks using onDataRead().detach(callback)
rgrover1 993:4d62b7967c11 261 * @return The read callbacks chain
rgrover1 993:4d62b7967c11 262 */
rgrover1 993:4d62b7967c11 263 ReadCallbackChain_t& onDataRead() {
rgrover1 993:4d62b7967c11 264 return onDataReadCallbackChain;
rgrover1 728:997ba5e7b3b6 265 }
rgrover1 728:997ba5e7b3b6 266
rgrover1 728:997ba5e7b3b6 267 /**
rgrover1 993:4d62b7967c11 268 * Set up a callback for write response events.
rgrover1 993:4d62b7967c11 269 * It is possible to remove registered callbacks using
rgrover1 993:4d62b7967c11 270 * onDataWritten().detach(callbackToRemove).
rgrover1 993:4d62b7967c11 271 * @Note: Write commands (issued using writeWoResponse) don't generate a response.
rgrover1 728:997ba5e7b3b6 272 */
rgrover1 768:8914bea92690 273 void onDataWritten(WriteCallback_t callback) {
rgrover1 993:4d62b7967c11 274 onDataWriteCallbackChain.add(callback);
rgrover1 990:53ac0ac3aa39 275 }
rgrover1 990:53ac0ac3aa39 276
rgrover1 990:53ac0ac3aa39 277 /**
rgrover1 993:4d62b7967c11 278 * @brief provide access to the callchain of data written callbacks
rgrover1 993:4d62b7967c11 279 * It is possible to register callbacks using onDataWritten().add(callback);
rgrover1 993:4d62b7967c11 280 * It is possible to unregister callbacks using onDataWritten().detach(callback)
rgrover1 993:4d62b7967c11 281 * @return The data written callbacks chain
rgrover1 993:4d62b7967c11 282 */
rgrover1 993:4d62b7967c11 283 WriteCallbackChain_t& onDataWritten() {
rgrover1 993:4d62b7967c11 284 return onDataWriteCallbackChain;
rgrover1 993:4d62b7967c11 285 }
rgrover1 993:4d62b7967c11 286
rgrover1 993:4d62b7967c11 287 /**
rgrover1 993:4d62b7967c11 288 * Set up a callback for write response events.
rgrover1 993:4d62b7967c11 289 * @Note: Write commands (issued using writeWoResponse) don't generate a response.
rgrover1 768:8914bea92690 290 *
rgrover1 768:8914bea92690 291 * @note: This API is now *deprecated* and will be dropped in the future.
rgrover1 768:8914bea92690 292 * Please use onDataWritten() instead.
rgrover1 768:8914bea92690 293 */
rgrover1 728:997ba5e7b3b6 294 void onDataWrite(WriteCallback_t callback) {
rgrover1 768:8914bea92690 295 onDataWritten(callback);
rgrover1 720:ce8a760a4504 296 }
rgrover1 720:ce8a760a4504 297
rgrover1 716:11b41f651697 298 /**
rgrover1 993:4d62b7967c11 299 * Set up a callback for when serviceDiscovery terminates.
rgrover1 716:11b41f651697 300 */
rgrover1 716:11b41f651697 301 virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
rgrover1 993:4d62b7967c11 302 (void)callback; /* Avoid compiler warnings about ununsed variables. */
rgrover1 734:4872b70437ce 303
rgrover1 993:4d62b7967c11 304 /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 305 }
rgrover1 716:11b41f651697 306
rgrover1 737:79d95f9b93be 307 /**
rgrover1 993:4d62b7967c11 308 * Set up a callback for when the GATT client receives an update event
rgrover1 993:4d62b7967c11 309 * corresponding to a change in the value of a characteristic on the remote
rgrover1 993:4d62b7967c11 310 * GATT server.
rgrover1 993:4d62b7967c11 311 * It is possible to remove registered callbacks using onHVX().detach(callbackToRemove).
rgrover1 737:79d95f9b93be 312 */
rgrover1 737:79d95f9b93be 313 void onHVX(HVXCallback_t callback) {
rgrover1 993:4d62b7967c11 314 onHVXCallbackChain.add(callback);
rgrover1 993:4d62b7967c11 315 }
rgrover1 993:4d62b7967c11 316
rgrover1 993:4d62b7967c11 317
rgrover1 993:4d62b7967c11 318 /**
rgrover1 993:4d62b7967c11 319 * @brief provide access to the callchain of HVX callbacks
rgrover1 993:4d62b7967c11 320 * It is possible to register callbacks using onHVX().add(callback);
rgrover1 993:4d62b7967c11 321 * It is possible to unregister callbacks using onHVX().detach(callback)
rgrover1 993:4d62b7967c11 322 * @return The HVX callbacks chain
rgrover1 993:4d62b7967c11 323 */
rgrover1 993:4d62b7967c11 324 HVXCallbackChain_t& onHVX() {
rgrover1 993:4d62b7967c11 325 return onHVXCallbackChain;
rgrover1 737:79d95f9b93be 326 }
rgrover1 737:79d95f9b93be 327
rgrover1 716:11b41f651697 328 protected:
rgrover1 716:11b41f651697 329 GattClient() {
rgrover1 993:4d62b7967c11 330 /* Empty */
rgrover1 716:11b41f651697 331 }
rgrover1 716:11b41f651697 332
rgrover1 728:997ba5e7b3b6 333 /* Entry points for the underlying stack to report events back to the user. */
rgrover1 728:997ba5e7b3b6 334 public:
rgrover1 728:997ba5e7b3b6 335 void processReadResponse(const GattReadCallbackParams *params) {
rgrover1 993:4d62b7967c11 336 onDataReadCallbackChain(params);
rgrover1 728:997ba5e7b3b6 337 }
rgrover1 728:997ba5e7b3b6 338
rgrover1 728:997ba5e7b3b6 339 void processWriteResponse(const GattWriteCallbackParams *params) {
rgrover1 993:4d62b7967c11 340 onDataWriteCallbackChain(params);
rgrover1 728:997ba5e7b3b6 341 }
rgrover1 728:997ba5e7b3b6 342
rgrover1 737:79d95f9b93be 343 void processHVXEvent(const GattHVXCallbackParams *params) {
rgrover1 993:4d62b7967c11 344 if (onHVXCallbackChain) {
rgrover1 993:4d62b7967c11 345 onHVXCallbackChain(params);
rgrover1 737:79d95f9b93be 346 }
rgrover1 737:79d95f9b93be 347 }
rgrover1 737:79d95f9b93be 348
rgrover1 728:997ba5e7b3b6 349 protected:
rgrover1 993:4d62b7967c11 350 ReadCallbackChain_t onDataReadCallbackChain;
rgrover1 993:4d62b7967c11 351 WriteCallbackChain_t onDataWriteCallbackChain;
rgrover1 993:4d62b7967c11 352 HVXCallbackChain_t onHVXCallbackChain;
rgrover1 728:997ba5e7b3b6 353
rgrover1 716:11b41f651697 354 private:
rgrover1 993:4d62b7967c11 355 /* Disallow copy and assignment. */
rgrover1 716:11b41f651697 356 GattClient(const GattClient &);
rgrover1 716:11b41f651697 357 GattClient& operator=(const GattClient &);
rgrover1 716:11b41f651697 358 };
rgrover1 716:11b41f651697 359
rgrover1 716:11b41f651697 360 #endif // ifndef __GATT_CLIENT_H__