Updated

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Mon Jan 11 08:51:37 2016 +0000
Revision:
1062:a3fd424b73ca
Parent:
1053:ec4a5b9b254e
Child:
1063:187f9929cb60
Synchronized with git rev b817cf3e
Author: Andres Amaya Garcia
Improve API to facilitate full shutdown procedure

The BLE API exposes a shutdown() function in BLE.h. This function is meant to
be overwridden by platform-specific sub-classes to clear all GAP and GATT
state. However, from the platform-specific implementation it is dificult to
achieve this because the Gap, GattClient, GattServer and SecurityManager
components of the API do not expose any functionality to shutdown.

This commit introduces the following changes:

* Add a static member pointer to Gap, GattClient, GattServer and
SecurityManager that is used to keep track of the initialized objects.
* Add a function member cleanup() to Gap, GattClient, GattServer and
SecurityManager to allow easy reset of the instance's state. This function
is meant to be overriden and called from the derived classes to fully clear the
state of the BLE API and the platform-specific implementation.
* Add a static member function shutdown() to Gap, GattClient, GattServer and
SecurityManager. This function shall be called from the shutdown()
overriding BLE::shutdown() for Gap, GattClient, GattServer and SecurityManager
that will in-turn clear the state of each of the components.

**NOTE:** Platform-specific implementations of this API must be modified to
this changes into account.

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
vcoubard 1052:b55e1ad3e1b3 26 #include "CallChainOfFunctionPointersWithContext.h"
vcoubard 1052:b55e1ad3e1b3 27
rgrover1 716:11b41f651697 28 class GattClient {
rgrover1 716:11b41f651697 29 public:
vcoubard 1052:b55e1ad3e1b3 30 typedef FunctionPointerWithContext<const GattReadCallbackParams*> ReadCallback_t;
vcoubard 1052:b55e1ad3e1b3 31 typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams*> ReadCallbackChain_t;
rgrover1 716:11b41f651697 32
rgrover1 716:11b41f651697 33 enum WriteOp_t {
vcoubard 1048:efb29faf12fc 34 GATT_OP_WRITE_REQ = 0x01, /**< Write request. */
vcoubard 1048:efb29faf12fc 35 GATT_OP_WRITE_CMD = 0x02, /**< Write command. */
rgrover1 716:11b41f651697 36 };
rgrover1 716:11b41f651697 37
vcoubard 1052:b55e1ad3e1b3 38 typedef FunctionPointerWithContext<const GattWriteCallbackParams*> WriteCallback_t;
vcoubard 1052:b55e1ad3e1b3 39 typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> WriteCallbackChain_t;
rgrover1 716:11b41f651697 40
vcoubard 1052:b55e1ad3e1b3 41 typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t;
vcoubard 1052:b55e1ad3e1b3 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
vcoubard 1048:efb29faf12fc 50 * invoked for matching services or characteristics. isServiceDiscoveryActive()
vcoubard 1048:efb29faf12fc 51 * can be used to determine status, and a termination callback (if one was set up)
vcoubard 1048:efb29faf12fc 52 * will be invoked at the end. Service discovery can be terminated prematurely,
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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,
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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-
vcoubard 1048:efb29faf12fc 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)) {
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 121 * determine status, and a termination callback (if set up) will be invoked
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 157 * determine status, and a termination callback (if set up) will be invoked
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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) {
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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 {
vcoubard 1048:efb29faf12fc 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 /**
vcoubard 1048:efb29faf12fc 198 * Terminate an ongoing service discovery. This should result in an
vcoubard 1048:efb29faf12fc 199 * invocation of TerminationCallback if service-discovery is active.
rgrover1 716:11b41f651697 200 */
rgrover1 716:11b41f651697 201 virtual void terminateServiceDiscovery(void) {
vcoubard 1048:efb29faf12fc 202 /* Requesting action from porters: override this API if this capability is supported. */
rgrover1 716:11b41f651697 203 }
rgrover1 716:11b41f651697 204
vcoubard 1048:efb29faf12fc 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 {
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 219 * Command can be either a write-request (which generates a
vcoubard 1048:efb29faf12fc 220 * matching response from the peripheral), or a write-command
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 225 * Handle for the target attribtue on the remote GATT server.
rgrover1 716:11b41f651697 226 * @param[in] length
vcoubard 1048:efb29faf12fc 227 * Length of the new value.
rgrover1 716:11b41f651697 228 * @param[in] value
vcoubard 1048:efb29faf12fc 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 {
vcoubard 1048:efb29faf12fc 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
vcoubard 1048:efb29faf12fc 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 /**
vcoubard 1052:b55e1ad3e1b3 249 * Set up a callback for read response events.
vcoubard 1052:b55e1ad3e1b3 250 * It is possible to remove registered callbacks using
vcoubard 1052:b55e1ad3e1b3 251 * onDataRead().detach(callbackToRemove)
rgrover1 728:997ba5e7b3b6 252 */
rgrover1 728:997ba5e7b3b6 253 void onDataRead(ReadCallback_t callback) {
vcoubard 1052:b55e1ad3e1b3 254 onDataReadCallbackChain.add(callback);
vcoubard 1052:b55e1ad3e1b3 255 }
vcoubard 1052:b55e1ad3e1b3 256
vcoubard 1052:b55e1ad3e1b3 257 /**
vcoubard 1052:b55e1ad3e1b3 258 * @brief provide access to the callchain of read callbacks
vcoubard 1052:b55e1ad3e1b3 259 * It is possible to register callbacks using onDataRead().add(callback);
vcoubard 1052:b55e1ad3e1b3 260 * It is possible to unregister callbacks using onDataRead().detach(callback)
vcoubard 1052:b55e1ad3e1b3 261 * @return The read callbacks chain
vcoubard 1052:b55e1ad3e1b3 262 */
vcoubard 1052:b55e1ad3e1b3 263 ReadCallbackChain_t& onDataRead() {
vcoubard 1052:b55e1ad3e1b3 264 return onDataReadCallbackChain;
rgrover1 728:997ba5e7b3b6 265 }
rgrover1 728:997ba5e7b3b6 266
rgrover1 728:997ba5e7b3b6 267 /**
vcoubard 1048:efb29faf12fc 268 * Set up a callback for write response events.
vcoubard 1052:b55e1ad3e1b3 269 * It is possible to remove registered callbacks using
vcoubard 1052:b55e1ad3e1b3 270 * onDataWritten().detach(callbackToRemove).
vcoubard 1048:efb29faf12fc 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) {
vcoubard 1052:b55e1ad3e1b3 274 onDataWriteCallbackChain.add(callback);
vcoubard 1052:b55e1ad3e1b3 275 }
vcoubard 1052:b55e1ad3e1b3 276
vcoubard 1052:b55e1ad3e1b3 277 /**
vcoubard 1052:b55e1ad3e1b3 278 * @brief provide access to the callchain of data written callbacks
vcoubard 1052:b55e1ad3e1b3 279 * It is possible to register callbacks using onDataWritten().add(callback);
vcoubard 1052:b55e1ad3e1b3 280 * It is possible to unregister callbacks using onDataWritten().detach(callback)
vcoubard 1052:b55e1ad3e1b3 281 * @return The data written callbacks chain
vcoubard 1052:b55e1ad3e1b3 282 */
vcoubard 1052:b55e1ad3e1b3 283 WriteCallbackChain_t& onDataWritten() {
vcoubard 1052:b55e1ad3e1b3 284 return onDataWriteCallbackChain;
rgrover1 990:53ac0ac3aa39 285 }
rgrover1 990:53ac0ac3aa39 286
rgrover1 990:53ac0ac3aa39 287 /**
vcoubard 1048:efb29faf12fc 288 * Set up a callback for write response events.
vcoubard 1048:efb29faf12fc 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 /**
vcoubard 1048:efb29faf12fc 299 * Set up a callback for when serviceDiscovery terminates.
rgrover1 716:11b41f651697 300 */
rgrover1 716:11b41f651697 301 virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
vcoubard 1048:efb29faf12fc 302 (void)callback; /* Avoid compiler warnings about ununsed variables. */
rgrover1 734:4872b70437ce 303
vcoubard 1048:efb29faf12fc 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 /**
vcoubard 1048:efb29faf12fc 308 * Set up a callback for when the GATT client receives an update event
vcoubard 1048:efb29faf12fc 309 * corresponding to a change in the value of a characteristic on the remote
vcoubard 1048:efb29faf12fc 310 * GATT server.
vcoubard 1052:b55e1ad3e1b3 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) {
vcoubard 1052:b55e1ad3e1b3 314 onHVXCallbackChain.add(callback);
vcoubard 1052:b55e1ad3e1b3 315 }
vcoubard 1052:b55e1ad3e1b3 316
vcoubard 1052:b55e1ad3e1b3 317
vcoubard 1052:b55e1ad3e1b3 318 /**
vcoubard 1052:b55e1ad3e1b3 319 * @brief provide access to the callchain of HVX callbacks
vcoubard 1052:b55e1ad3e1b3 320 * It is possible to register callbacks using onHVX().add(callback);
vcoubard 1052:b55e1ad3e1b3 321 * It is possible to unregister callbacks using onHVX().detach(callback)
vcoubard 1052:b55e1ad3e1b3 322 * @return The HVX callbacks chain
vcoubard 1052:b55e1ad3e1b3 323 */
vcoubard 1052:b55e1ad3e1b3 324 HVXCallbackChain_t& onHVX() {
vcoubard 1052:b55e1ad3e1b3 325 return onHVXCallbackChain;
rgrover1 737:79d95f9b93be 326 }
rgrover1 737:79d95f9b93be 327
rgrover1 716:11b41f651697 328 protected:
vcoubard 1062:a3fd424b73ca 329 /**
vcoubard 1062:a3fd424b73ca 330 * Clear all GattClient state of the associated object.
vcoubard 1062:a3fd424b73ca 331 *
vcoubard 1062:a3fd424b73ca 332 * This function is meant to be overridden in the platform-specific
vcoubard 1062:a3fd424b73ca 333 * sub-class. Nevertheless, the sub-class is only expected to clean up its
vcoubard 1062:a3fd424b73ca 334 * state and not the data held in GattClient members. This shall be achieved
vcoubard 1062:a3fd424b73ca 335 * by a call to GattClient::cleanup() from the sub-class' cleanup()
vcoubard 1062:a3fd424b73ca 336 * implementation.
vcoubard 1062:a3fd424b73ca 337 *
vcoubard 1062:a3fd424b73ca 338 * @return BLE_ERROR_NONE on success.
vcoubard 1062:a3fd424b73ca 339 */
vcoubard 1062:a3fd424b73ca 340 virtual ble_error_t cleanup(void) {
vcoubard 1062:a3fd424b73ca 341 onDataReadCallbackChain.clear();
vcoubard 1062:a3fd424b73ca 342 onDataWriteCallbackChain.clear();
vcoubard 1062:a3fd424b73ca 343 onHVXCallbackChain.clear();
vcoubard 1062:a3fd424b73ca 344
vcoubard 1062:a3fd424b73ca 345 return BLE_ERROR_NONE;
vcoubard 1062:a3fd424b73ca 346 }
vcoubard 1062:a3fd424b73ca 347
vcoubard 1062:a3fd424b73ca 348 public:
vcoubard 1062:a3fd424b73ca 349 /**
vcoubard 1062:a3fd424b73ca 350 * Clear all GattClient state of the object pointed to by
vcoubard 1062:a3fd424b73ca 351 * gattClientInstance.
vcoubard 1062:a3fd424b73ca 352 *
vcoubard 1062:a3fd424b73ca 353 * This function is meant to be called by the overridden BLE::shutdown()
vcoubard 1062:a3fd424b73ca 354 * in the platform-specific sub-class.
vcoubard 1062:a3fd424b73ca 355 *
vcoubard 1062:a3fd424b73ca 356 * @return BLE_ERROR_NONE on success.
vcoubard 1062:a3fd424b73ca 357 *
vcoubard 1062:a3fd424b73ca 358 * @note: If gattClientInstance is NULL then it is assumed that Gap has not
vcoubard 1062:a3fd424b73ca 359 * been instantiated and a call to GattClient::shutdown() will succeed.
vcoubard 1062:a3fd424b73ca 360 */
vcoubard 1062:a3fd424b73ca 361 static ble_error_t shutdown(void) {
vcoubard 1062:a3fd424b73ca 362 if (gattClientInstance) {
vcoubard 1062:a3fd424b73ca 363 return gattClientInstance->cleanup();
vcoubard 1062:a3fd424b73ca 364 }
vcoubard 1062:a3fd424b73ca 365 return BLE_ERROR_NONE;
vcoubard 1062:a3fd424b73ca 366 }
vcoubard 1062:a3fd424b73ca 367
vcoubard 1062:a3fd424b73ca 368 protected:
rgrover1 716:11b41f651697 369 GattClient() {
vcoubard 1048:efb29faf12fc 370 /* Empty */
rgrover1 716:11b41f651697 371 }
rgrover1 716:11b41f651697 372
rgrover1 728:997ba5e7b3b6 373 /* Entry points for the underlying stack to report events back to the user. */
rgrover1 728:997ba5e7b3b6 374 public:
rgrover1 728:997ba5e7b3b6 375 void processReadResponse(const GattReadCallbackParams *params) {
vcoubard 1052:b55e1ad3e1b3 376 onDataReadCallbackChain(params);
rgrover1 728:997ba5e7b3b6 377 }
rgrover1 728:997ba5e7b3b6 378
rgrover1 728:997ba5e7b3b6 379 void processWriteResponse(const GattWriteCallbackParams *params) {
vcoubard 1052:b55e1ad3e1b3 380 onDataWriteCallbackChain(params);
rgrover1 728:997ba5e7b3b6 381 }
rgrover1 728:997ba5e7b3b6 382
rgrover1 737:79d95f9b93be 383 void processHVXEvent(const GattHVXCallbackParams *params) {
vcoubard 1052:b55e1ad3e1b3 384 if (onHVXCallbackChain) {
vcoubard 1052:b55e1ad3e1b3 385 onHVXCallbackChain(params);
rgrover1 737:79d95f9b93be 386 }
rgrover1 737:79d95f9b93be 387 }
rgrover1 737:79d95f9b93be 388
rgrover1 728:997ba5e7b3b6 389 protected:
vcoubard 1052:b55e1ad3e1b3 390 ReadCallbackChain_t onDataReadCallbackChain;
vcoubard 1052:b55e1ad3e1b3 391 WriteCallbackChain_t onDataWriteCallbackChain;
vcoubard 1052:b55e1ad3e1b3 392 HVXCallbackChain_t onHVXCallbackChain;
rgrover1 728:997ba5e7b3b6 393
vcoubard 1062:a3fd424b73ca 394 protected:
vcoubard 1062:a3fd424b73ca 395 static GattClient *gattClientInstance; /**< Pointer to the GattClient object instance.
vcoubard 1062:a3fd424b73ca 396 * If NULL, then GattClient has not been initialized. */
vcoubard 1062:a3fd424b73ca 397
rgrover1 716:11b41f651697 398 private:
vcoubard 1048:efb29faf12fc 399 /* Disallow copy and assignment. */
rgrover1 716:11b41f651697 400 GattClient(const GattClient &);
rgrover1 716:11b41f651697 401 GattClient& operator=(const GattClient &);
rgrover1 716:11b41f651697 402 };
rgrover1 716:11b41f651697 403
rgrover1 716:11b41f651697 404 #endif // ifndef __GATT_CLIENT_H__