Updated

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Mon Jan 11 08:51:42 2016 +0000
Revision:
1074:1fedc77d9add
Parent:
1072:dd09fe419587
Child:
1075:0d0dafb54bc9
Synchronized with git rev cd809e2a
Author: Andres Amaya Garcia
Modify shutdown API and functionality

Modify the shutdown API to remove the static shutdown function in Gap,
SecurityManager, GattClient and GattServer. Futhermore, remove the static
references to Gap, SecurityManager, GattClient and GattServer objects inside
their own classes. The cleanup method is renamed to `reset()` and made public.
Finally, additional functionality is added to the reset implementation in
Gap.

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 1074:1fedc77d9add 219 * Command can be either a write-request (which generates a
vcoubard 1074:1fedc77d9add 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 1074:1fedc77d9add 249 * Set up a callback for read response events.
vcoubard 1074:1fedc77d9add 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 1074:1fedc77d9add 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 1074:1fedc77d9add 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 1074:1fedc77d9add 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 1074:1fedc77d9add 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 1074:1fedc77d9add 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 1074:1fedc77d9add 324 HVXCallbackChain_t& onHVX() {
vcoubard 1052:b55e1ad3e1b3 325 return onHVXCallbackChain;
rgrover1 737:79d95f9b93be 326 }
rgrover1 737:79d95f9b93be 327
vcoubard 1074:1fedc77d9add 328 public:
vcoubard 1074:1fedc77d9add 329 /**
vcoubard 1074:1fedc77d9add 330 * Clear all GattClient state of the associated object.
vcoubard 1074:1fedc77d9add 331 *
vcoubard 1074:1fedc77d9add 332 * This function is meant to be overridden in the platform-specific
vcoubard 1074:1fedc77d9add 333 * sub-class. Nevertheless, the sub-class is only expected to reset its
vcoubard 1074:1fedc77d9add 334 * state and not the data held in GattClient members. This shall be achieved
vcoubard 1074:1fedc77d9add 335 * by a call to GattClient::reset() from the sub-class' reset()
vcoubard 1074:1fedc77d9add 336 * implementation.
vcoubard 1074:1fedc77d9add 337 *
vcoubard 1074:1fedc77d9add 338 * @return BLE_ERROR_NONE on success.
vcoubard 1074:1fedc77d9add 339 */
vcoubard 1074:1fedc77d9add 340 virtual ble_error_t reset(void) {
vcoubard 1074:1fedc77d9add 341 onDataReadCallbackChain.clear();
vcoubard 1074:1fedc77d9add 342 onDataWriteCallbackChain.clear();
vcoubard 1074:1fedc77d9add 343 onHVXCallbackChain.clear();
vcoubard 1074:1fedc77d9add 344
vcoubard 1074:1fedc77d9add 345 return BLE_ERROR_NONE;
vcoubard 1074:1fedc77d9add 346 }
vcoubard 1074:1fedc77d9add 347
rgrover1 716:11b41f651697 348 protected:
rgrover1 716:11b41f651697 349 GattClient() {
vcoubard 1048:efb29faf12fc 350 /* Empty */
rgrover1 716:11b41f651697 351 }
rgrover1 716:11b41f651697 352
rgrover1 728:997ba5e7b3b6 353 /* Entry points for the underlying stack to report events back to the user. */
rgrover1 728:997ba5e7b3b6 354 public:
rgrover1 728:997ba5e7b3b6 355 void processReadResponse(const GattReadCallbackParams *params) {
vcoubard 1052:b55e1ad3e1b3 356 onDataReadCallbackChain(params);
rgrover1 728:997ba5e7b3b6 357 }
rgrover1 728:997ba5e7b3b6 358
rgrover1 728:997ba5e7b3b6 359 void processWriteResponse(const GattWriteCallbackParams *params) {
vcoubard 1052:b55e1ad3e1b3 360 onDataWriteCallbackChain(params);
rgrover1 728:997ba5e7b3b6 361 }
rgrover1 728:997ba5e7b3b6 362
rgrover1 737:79d95f9b93be 363 void processHVXEvent(const GattHVXCallbackParams *params) {
vcoubard 1052:b55e1ad3e1b3 364 if (onHVXCallbackChain) {
vcoubard 1052:b55e1ad3e1b3 365 onHVXCallbackChain(params);
rgrover1 737:79d95f9b93be 366 }
rgrover1 737:79d95f9b93be 367 }
rgrover1 737:79d95f9b93be 368
rgrover1 728:997ba5e7b3b6 369 protected:
vcoubard 1052:b55e1ad3e1b3 370 ReadCallbackChain_t onDataReadCallbackChain;
vcoubard 1052:b55e1ad3e1b3 371 WriteCallbackChain_t onDataWriteCallbackChain;
vcoubard 1052:b55e1ad3e1b3 372 HVXCallbackChain_t onHVXCallbackChain;
rgrover1 728:997ba5e7b3b6 373
rgrover1 716:11b41f651697 374 private:
vcoubard 1048:efb29faf12fc 375 /* Disallow copy and assignment. */
rgrover1 716:11b41f651697 376 GattClient(const GattClient &);
rgrover1 716:11b41f651697 377 GattClient& operator=(const GattClient &);
rgrover1 716:11b41f651697 378 };
rgrover1 716:11b41f651697 379
rgrover1 716:11b41f651697 380 #endif // ifndef __GATT_CLIENT_H__