High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Wed Apr 06 19:15:30 2016 +0100
Revision:
1179:4ab722f8dca0
Parent:
1165:0717ca5ed305
Child:
1183:1589830dbdb7
Synchronized with git rev ca632aaf
Author: Andres Amaya Garcia
Update Gap state after advertising times out

The BLE API was not updating the Gap internal state when the advertising stops
because of a user timeout. This commit fixes the issue by updating the internal
state structure in Gap just before the registered callbacks are notified of the
advertising timeout.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 1131:692ddf04fc42 1 /* mbed Microcontroller Library
vcoubard 1131:692ddf04fc42 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 1131:692ddf04fc42 3 *
vcoubard 1131:692ddf04fc42 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 1131:692ddf04fc42 5 * you may not use this file except in compliance with the License.
vcoubard 1131:692ddf04fc42 6 * You may obtain a copy of the License at
vcoubard 1131:692ddf04fc42 7 *
vcoubard 1131:692ddf04fc42 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 1131:692ddf04fc42 9 *
vcoubard 1131:692ddf04fc42 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 1131:692ddf04fc42 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 1131:692ddf04fc42 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 1131:692ddf04fc42 13 * See the License for the specific language governing permissions and
vcoubard 1131:692ddf04fc42 14 * limitations under the License.
vcoubard 1131:692ddf04fc42 15 */
vcoubard 1131:692ddf04fc42 16
vcoubard 1131:692ddf04fc42 17 #ifndef __GATT_SERVER_H__
vcoubard 1131:692ddf04fc42 18 #define __GATT_SERVER_H__
vcoubard 1131:692ddf04fc42 19
vcoubard 1131:692ddf04fc42 20 #include "Gap.h"
vcoubard 1131:692ddf04fc42 21 #include "GattService.h"
vcoubard 1131:692ddf04fc42 22 #include "GattAttribute.h"
vcoubard 1131:692ddf04fc42 23 #include "GattServerEvents.h"
vcoubard 1131:692ddf04fc42 24 #include "GattCallbackParamTypes.h"
vcoubard 1131:692ddf04fc42 25 #include "CallChainOfFunctionPointersWithContext.h"
vcoubard 1131:692ddf04fc42 26
vcoubard 1131:692ddf04fc42 27 class GattServer {
vcoubard 1131:692ddf04fc42 28 public:
vcoubard 1179:4ab722f8dca0 29 /* Event callback handlers. */
vcoubard 1131:692ddf04fc42 30 typedef FunctionPointerWithContext<unsigned> DataSentCallback_t;
vcoubard 1131:692ddf04fc42 31 typedef CallChainOfFunctionPointersWithContext<unsigned> DataSentCallbackChain_t;
vcoubard 1131:692ddf04fc42 32
vcoubard 1131:692ddf04fc42 33 typedef FunctionPointerWithContext<const GattWriteCallbackParams*> DataWrittenCallback_t;
vcoubard 1135:22aada733dbd 34 typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> DataWrittenCallbackChain_t;
vcoubard 1131:692ddf04fc42 35
vcoubard 1131:692ddf04fc42 36 typedef FunctionPointerWithContext<const GattReadCallbackParams*> DataReadCallback_t;
vcoubard 1131:692ddf04fc42 37 typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams *> DataReadCallbackChain_t;
vcoubard 1131:692ddf04fc42 38
vcoubard 1135:22aada733dbd 39 typedef FunctionPointerWithContext<const GattServer *> GattServerShutdownCallback_t;
vcoubard 1135:22aada733dbd 40 typedef CallChainOfFunctionPointersWithContext<const GattServer *> GattServerShutdownCallbackChain_t;
vcoubard 1135:22aada733dbd 41
vcoubard 1131:692ddf04fc42 42 typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;
vcoubard 1131:692ddf04fc42 43
vcoubard 1131:692ddf04fc42 44 protected:
vcoubard 1131:692ddf04fc42 45 GattServer() :
vcoubard 1131:692ddf04fc42 46 serviceCount(0),
vcoubard 1131:692ddf04fc42 47 characteristicCount(0),
vcoubard 1131:692ddf04fc42 48 dataSentCallChain(),
vcoubard 1131:692ddf04fc42 49 dataWrittenCallChain(),
vcoubard 1131:692ddf04fc42 50 dataReadCallChain(),
vcoubard 1131:692ddf04fc42 51 updatesEnabledCallback(NULL),
vcoubard 1131:692ddf04fc42 52 updatesDisabledCallback(NULL),
vcoubard 1131:692ddf04fc42 53 confirmationReceivedCallback(NULL) {
vcoubard 1131:692ddf04fc42 54 /* empty */
vcoubard 1131:692ddf04fc42 55 }
vcoubard 1131:692ddf04fc42 56
vcoubard 1131:692ddf04fc42 57 /*
vcoubard 1131:692ddf04fc42 58 * The following functions are meant to be overridden in the platform-specific sub-class.
vcoubard 1131:692ddf04fc42 59 */
vcoubard 1131:692ddf04fc42 60 public:
vcoubard 1131:692ddf04fc42 61
vcoubard 1131:692ddf04fc42 62 /**
vcoubard 1131:692ddf04fc42 63 * Add a service declaration to the local server ATT table. Also add the
vcoubard 1131:692ddf04fc42 64 * characteristics contained within.
vcoubard 1131:692ddf04fc42 65 */
vcoubard 1131:692ddf04fc42 66 virtual ble_error_t addService(GattService &service) {
vcoubard 1131:692ddf04fc42 67 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 68 (void)service;
vcoubard 1131:692ddf04fc42 69
vcoubard 1131:692ddf04fc42 70 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 71 }
vcoubard 1131:692ddf04fc42 72
vcoubard 1131:692ddf04fc42 73 /**
vcoubard 1131:692ddf04fc42 74 * Read the value of a characteristic from the local GATT server.
vcoubard 1131:692ddf04fc42 75 * @param[in] attributeHandle
vcoubard 1131:692ddf04fc42 76 * Attribute handle for the value attribute of the characteristic.
vcoubard 1131:692ddf04fc42 77 * @param[out] buffer
vcoubard 1131:692ddf04fc42 78 * A buffer to hold the value being read.
vcoubard 1179:4ab722f8dca0 79 * @param[in/out] lengthP
vcoubard 1131:692ddf04fc42 80 * Length of the buffer being supplied. If the attribute
vcoubard 1131:692ddf04fc42 81 * value is longer than the size of the supplied buffer,
vcoubard 1131:692ddf04fc42 82 * this variable will hold upon return the total attribute value length
vcoubard 1131:692ddf04fc42 83 * (excluding offset). The application may use this
vcoubard 1131:692ddf04fc42 84 * information to allocate a suitable buffer size.
vcoubard 1131:692ddf04fc42 85 *
vcoubard 1131:692ddf04fc42 86 * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
vcoubard 1131:692ddf04fc42 87 */
vcoubard 1131:692ddf04fc42 88 virtual ble_error_t read(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) {
vcoubard 1131:692ddf04fc42 89 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 90 (void)attributeHandle;
vcoubard 1131:692ddf04fc42 91 (void)buffer;
vcoubard 1131:692ddf04fc42 92 (void)lengthP;
vcoubard 1131:692ddf04fc42 93
vcoubard 1131:692ddf04fc42 94 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 95 }
vcoubard 1131:692ddf04fc42 96
vcoubard 1131:692ddf04fc42 97 /**
vcoubard 1131:692ddf04fc42 98 * Read the value of a characteristic from the local GATT server.
vcoubard 1131:692ddf04fc42 99 * @param[in] connectionHandle
vcoubard 1131:692ddf04fc42 100 * Connection handle.
vcoubard 1131:692ddf04fc42 101 * @param[in] attributeHandle
vcoubard 1131:692ddf04fc42 102 * Attribute handle for the value attribute of the characteristic.
vcoubard 1131:692ddf04fc42 103 * @param[out] buffer
vcoubard 1131:692ddf04fc42 104 * A buffer to hold the value being read.
vcoubard 1179:4ab722f8dca0 105 * @param[in/out] lengthP
vcoubard 1131:692ddf04fc42 106 * Length of the buffer being supplied. If the attribute
vcoubard 1131:692ddf04fc42 107 * value is longer than the size of the supplied buffer,
vcoubard 1131:692ddf04fc42 108 * this variable will hold upon return the total attribute value length
vcoubard 1131:692ddf04fc42 109 * (excluding offset). The application may use this
vcoubard 1131:692ddf04fc42 110 * information to allocate a suitable buffer size.
vcoubard 1131:692ddf04fc42 111 *
vcoubard 1131:692ddf04fc42 112 * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
vcoubard 1131:692ddf04fc42 113 *
vcoubard 1131:692ddf04fc42 114 * @note This API is a version of the above, with an additional connection handle
vcoubard 1131:692ddf04fc42 115 * parameter to allow fetches for connection-specific multivalued
vcoubard 1131:692ddf04fc42 116 * attributes (such as the CCCDs).
vcoubard 1131:692ddf04fc42 117 */
vcoubard 1131:692ddf04fc42 118 virtual ble_error_t read(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) {
vcoubard 1131:692ddf04fc42 119 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 120 (void)connectionHandle;
vcoubard 1131:692ddf04fc42 121 (void)attributeHandle;
vcoubard 1131:692ddf04fc42 122 (void)buffer;
vcoubard 1131:692ddf04fc42 123 (void)lengthP;
vcoubard 1131:692ddf04fc42 124
vcoubard 1131:692ddf04fc42 125 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 126 }
vcoubard 1131:692ddf04fc42 127
vcoubard 1131:692ddf04fc42 128 /**
vcoubard 1131:692ddf04fc42 129 * Update the value of a characteristic on the local GATT server.
vcoubard 1131:692ddf04fc42 130 *
vcoubard 1131:692ddf04fc42 131 * @param[in] attributeHandle
vcoubard 1131:692ddf04fc42 132 * Handle for the value attribute of the characteristic.
vcoubard 1131:692ddf04fc42 133 * @param[in] value
vcoubard 1131:692ddf04fc42 134 * A pointer to a buffer holding the new value.
vcoubard 1131:692ddf04fc42 135 * @param[in] size
vcoubard 1131:692ddf04fc42 136 * Size of the new value (in bytes).
vcoubard 1131:692ddf04fc42 137 * @param[in] localOnly
vcoubard 1131:692ddf04fc42 138 * Should this update be kept on the local
vcoubard 1131:692ddf04fc42 139 * GATT server regardless of the state of the
vcoubard 1131:692ddf04fc42 140 * notify/indicate flag in the CCCD for this
vcoubard 1131:692ddf04fc42 141 * Characteristic? If set to true, no notification
vcoubard 1131:692ddf04fc42 142 * or indication is generated.
vcoubard 1131:692ddf04fc42 143 *
vcoubard 1131:692ddf04fc42 144 * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
vcoubard 1131:692ddf04fc42 145 */
vcoubard 1131:692ddf04fc42 146 virtual ble_error_t write(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false) {
vcoubard 1131:692ddf04fc42 147 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 148 (void)attributeHandle;
vcoubard 1131:692ddf04fc42 149 (void)value;
vcoubard 1131:692ddf04fc42 150 (void)size;
vcoubard 1131:692ddf04fc42 151 (void)localOnly;
vcoubard 1131:692ddf04fc42 152
vcoubard 1131:692ddf04fc42 153 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 154 }
vcoubard 1131:692ddf04fc42 155
vcoubard 1131:692ddf04fc42 156 /**
vcoubard 1131:692ddf04fc42 157 * Update the value of a characteristic on the local GATT server. A version
vcoubard 1131:692ddf04fc42 158 * of the same as the above, with a connection handle parameter to allow updates
vcoubard 1131:692ddf04fc42 159 * for connection-specific multivalued attributes (such as the CCCDs).
vcoubard 1131:692ddf04fc42 160 *
vcoubard 1131:692ddf04fc42 161 * @param[in] connectionHandle
vcoubard 1131:692ddf04fc42 162 * Connection handle.
vcoubard 1131:692ddf04fc42 163 * @param[in] attributeHandle
vcoubard 1131:692ddf04fc42 164 * Handle for the value attribute of the characteristic.
vcoubard 1131:692ddf04fc42 165 * @param[in] value
vcoubard 1131:692ddf04fc42 166 * A pointer to a buffer holding the new value.
vcoubard 1131:692ddf04fc42 167 * @param[in] size
vcoubard 1131:692ddf04fc42 168 * Size of the new value (in bytes).
vcoubard 1131:692ddf04fc42 169 * @param[in] localOnly
vcoubard 1131:692ddf04fc42 170 * Should this update be kept on the local
vcoubard 1131:692ddf04fc42 171 * GattServer regardless of the state of the
vcoubard 1131:692ddf04fc42 172 * notify/indicate flag in the CCCD for this
vcoubard 1131:692ddf04fc42 173 * Characteristic? If set to true, no notification
vcoubard 1131:692ddf04fc42 174 * or indication is generated.
vcoubard 1131:692ddf04fc42 175 *
vcoubard 1131:692ddf04fc42 176 * @return BLE_ERROR_NONE if we have successfully set the value of the attribute.
vcoubard 1131:692ddf04fc42 177 */
vcoubard 1131:692ddf04fc42 178 virtual ble_error_t write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false) {
vcoubard 1131:692ddf04fc42 179 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 180 (void)connectionHandle;
vcoubard 1131:692ddf04fc42 181 (void)attributeHandle;
vcoubard 1131:692ddf04fc42 182 (void)value;
vcoubard 1131:692ddf04fc42 183 (void)size;
vcoubard 1131:692ddf04fc42 184 (void)localOnly;
vcoubard 1131:692ddf04fc42 185
vcoubard 1131:692ddf04fc42 186 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 187 }
vcoubard 1131:692ddf04fc42 188
vcoubard 1131:692ddf04fc42 189 /**
vcoubard 1131:692ddf04fc42 190 * Determine the updates-enabled status (notification or indication) for the current connection from a characteristic's CCCD.
vcoubard 1131:692ddf04fc42 191 *
vcoubard 1179:4ab722f8dca0 192 * @param characteristic
vcoubard 1131:692ddf04fc42 193 * The characteristic.
vcoubard 1131:692ddf04fc42 194 * @param[out] enabledP
vcoubard 1131:692ddf04fc42 195 * Upon return, *enabledP is true if updates are enabled, else false.
vcoubard 1131:692ddf04fc42 196 *
vcoubard 1131:692ddf04fc42 197 * @return BLE_ERROR_NONE if the connection and handle are found. False otherwise.
vcoubard 1131:692ddf04fc42 198 */
vcoubard 1131:692ddf04fc42 199 virtual ble_error_t areUpdatesEnabled(const GattCharacteristic &characteristic, bool *enabledP) {
vcoubard 1131:692ddf04fc42 200 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 201 (void)characteristic;
vcoubard 1131:692ddf04fc42 202 (void)enabledP;
vcoubard 1131:692ddf04fc42 203
vcoubard 1131:692ddf04fc42 204 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 205 }
vcoubard 1131:692ddf04fc42 206
vcoubard 1131:692ddf04fc42 207 /**
vcoubard 1131:692ddf04fc42 208 * Determine the connection-specific updates-enabled status (notification or indication) from a characteristic's CCCD.
vcoubard 1131:692ddf04fc42 209 *
vcoubard 1179:4ab722f8dca0 210 * @param connectionHandle
vcoubard 1131:692ddf04fc42 211 * The connection handle.
vcoubard 1131:692ddf04fc42 212 * @param[out] enabledP
vcoubard 1131:692ddf04fc42 213 * Upon return, *enabledP is true if updates are enabled, else false.
vcoubard 1131:692ddf04fc42 214 *
vcoubard 1179:4ab722f8dca0 215 * @param characteristic
vcoubard 1179:4ab722f8dca0 216 * The characteristic.
vcoubard 1179:4ab722f8dca0 217 *
vcoubard 1131:692ddf04fc42 218 * @return BLE_ERROR_NONE if the connection and handle are found. False otherwise.
vcoubard 1131:692ddf04fc42 219 */
vcoubard 1131:692ddf04fc42 220 virtual ble_error_t areUpdatesEnabled(Gap::Handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP) {
vcoubard 1131:692ddf04fc42 221 /* Avoid compiler warnings about unused variables. */
vcoubard 1131:692ddf04fc42 222 (void)connectionHandle;
vcoubard 1131:692ddf04fc42 223 (void)characteristic;
vcoubard 1131:692ddf04fc42 224 (void)enabledP;
vcoubard 1131:692ddf04fc42 225
vcoubard 1131:692ddf04fc42 226 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 227 }
vcoubard 1131:692ddf04fc42 228
vcoubard 1131:692ddf04fc42 229 /**
vcoubard 1131:692ddf04fc42 230 * A virtual function to allow underlying stacks to indicate if they support
vcoubard 1131:692ddf04fc42 231 * onDataRead(). It should be overridden to return true as applicable.
vcoubard 1131:692ddf04fc42 232 */
vcoubard 1131:692ddf04fc42 233 virtual bool isOnDataReadAvailable() const {
vcoubard 1131:692ddf04fc42 234 return false; /* Requesting action from porters: override this API if this capability is supported. */
vcoubard 1131:692ddf04fc42 235 }
vcoubard 1131:692ddf04fc42 236
vcoubard 1131:692ddf04fc42 237 /*
vcoubard 1131:692ddf04fc42 238 * APIs with non-virtual implementations.
vcoubard 1131:692ddf04fc42 239 */
vcoubard 1131:692ddf04fc42 240 public:
vcoubard 1131:692ddf04fc42 241 /**
vcoubard 1131:692ddf04fc42 242 * Add a callback for the GATT event DATA_SENT (which is triggered when
vcoubard 1131:692ddf04fc42 243 * updates are sent out by GATT in the form of notifications).
vcoubard 1131:692ddf04fc42 244 *
vcoubard 1179:4ab722f8dca0 245 * @Note: It is possible to chain together multiple onDataSent callbacks
vcoubard 1179:4ab722f8dca0 246 * (potentially from different modules of an application) to receive updates
vcoubard 1179:4ab722f8dca0 247 * to characteristics.
vcoubard 1165:0717ca5ed305 248 *
vcoubard 1179:4ab722f8dca0 249 * @Note: It is also possible to set up a callback into a member function of
vcoubard 1179:4ab722f8dca0 250 * some object.
vcoubard 1131:692ddf04fc42 251 */
vcoubard 1179:4ab722f8dca0 252 void onDataSent(const DataSentCallback_t& callback) {dataSentCallChain.add(callback);}
vcoubard 1131:692ddf04fc42 253 template <typename T>
vcoubard 1131:692ddf04fc42 254 void onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
vcoubard 1131:692ddf04fc42 255 dataSentCallChain.add(objPtr, memberPtr);
vcoubard 1131:692ddf04fc42 256 }
vcoubard 1131:692ddf04fc42 257
vcoubard 1131:692ddf04fc42 258 /**
vcoubard 1179:4ab722f8dca0 259 * @brief get the callback chain called when the event DATA_EVENT is triggered.
vcoubard 1131:692ddf04fc42 260 */
vcoubard 1135:22aada733dbd 261 DataSentCallbackChain_t& onDataSent() {
vcoubard 1131:692ddf04fc42 262 return dataSentCallChain;
vcoubard 1131:692ddf04fc42 263 }
vcoubard 1131:692ddf04fc42 264
vcoubard 1131:692ddf04fc42 265 /**
vcoubard 1131:692ddf04fc42 266 * Set up a callback for when an attribute has its value updated by or at the
vcoubard 1131:692ddf04fc42 267 * connected peer. For a peripheral, this callback is triggered when the local
vcoubard 1131:692ddf04fc42 268 * GATT server has an attribute updated by a write command from the peer.
vcoubard 1131:692ddf04fc42 269 * For a central, this callback is triggered when a response is received for
vcoubard 1131:692ddf04fc42 270 * a write request.
vcoubard 1131:692ddf04fc42 271 *
vcoubard 1179:4ab722f8dca0 272 * @Note: It is possible to chain together multiple onDataWritten callbacks
vcoubard 1131:692ddf04fc42 273 * (potentially from different modules of an application) to receive updates
vcoubard 1131:692ddf04fc42 274 * to characteristics. Many services, such as DFU and UART, add their own
vcoubard 1131:692ddf04fc42 275 * onDataWritten callbacks behind the scenes to trap interesting events.
vcoubard 1131:692ddf04fc42 276 *
vcoubard 1179:4ab722f8dca0 277 * @Note: It is also possible to set up a callback into a member function of
vcoubard 1131:692ddf04fc42 278 * some object.
vcoubard 1135:22aada733dbd 279 *
vcoubard 1179:4ab722f8dca0 280 * @Note It is possible to unregister a callback using onDataWritten().detach(callback)
vcoubard 1131:692ddf04fc42 281 */
vcoubard 1179:4ab722f8dca0 282 void onDataWritten(const DataWrittenCallback_t& callback) {dataWrittenCallChain.add(callback);}
vcoubard 1131:692ddf04fc42 283 template <typename T>
vcoubard 1131:692ddf04fc42 284 void onDataWritten(T *objPtr, void (T::*memberPtr)(const GattWriteCallbackParams *context)) {
vcoubard 1131:692ddf04fc42 285 dataWrittenCallChain.add(objPtr, memberPtr);
vcoubard 1131:692ddf04fc42 286 }
vcoubard 1131:692ddf04fc42 287
vcoubard 1131:692ddf04fc42 288 /**
vcoubard 1179:4ab722f8dca0 289 * @brief provide access to the callchain of data written event callbacks
vcoubard 1179:4ab722f8dca0 290 * It is possible to register callbacks using onDataWritten().add(callback);
vcoubard 1179:4ab722f8dca0 291 * It is possible to unregister callbacks using onDataWritten().detach(callback)
vcoubard 1179:4ab722f8dca0 292 * @return The data written event callbacks chain
vcoubard 1135:22aada733dbd 293 */
vcoubard 1131:692ddf04fc42 294 DataWrittenCallbackChain_t& onDataWritten() {
vcoubard 1131:692ddf04fc42 295 return dataWrittenCallChain;
vcoubard 1131:692ddf04fc42 296 }
vcoubard 1131:692ddf04fc42 297
vcoubard 1131:692ddf04fc42 298 /**
vcoubard 1131:692ddf04fc42 299 * Setup a callback to be invoked on the peripheral when an attribute is
vcoubard 1131:692ddf04fc42 300 * being read by a remote client.
vcoubard 1131:692ddf04fc42 301 *
vcoubard 1179:4ab722f8dca0 302 * @Note: This functionality may not be available on all underlying stacks.
vcoubard 1131:692ddf04fc42 303 * You could use GattCharacteristic::setReadAuthorizationCallback() as an
vcoubard 1131:692ddf04fc42 304 * alternative. Refer to isOnDataReadAvailable().
vcoubard 1131:692ddf04fc42 305 *
vcoubard 1179:4ab722f8dca0 306 * @Note: It is possible to chain together multiple onDataRead callbacks
vcoubard 1131:692ddf04fc42 307 * (potentially from different modules of an application) to receive updates
vcoubard 1131:692ddf04fc42 308 * to characteristics. Services may add their own onDataRead callbacks
vcoubard 1131:692ddf04fc42 309 * behind the scenes to trap interesting events.
vcoubard 1131:692ddf04fc42 310 *
vcoubard 1179:4ab722f8dca0 311 * @Note: It is also possible to set up a callback into a member function of
vcoubard 1131:692ddf04fc42 312 * some object.
vcoubard 1131:692ddf04fc42 313 *
vcoubard 1179:4ab722f8dca0 314 * @Note It is possible to unregister a callback using onDataRead().detach(callback)
vcoubard 1179:4ab722f8dca0 315 *
vcoubard 1179:4ab722f8dca0 316 * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
vcoubard 1179:4ab722f8dca0 317 * else BLE_ERROR_NONE.
vcoubard 1131:692ddf04fc42 318 */
vcoubard 1131:692ddf04fc42 319 ble_error_t onDataRead(const DataReadCallback_t& callback) {
vcoubard 1131:692ddf04fc42 320 if (!isOnDataReadAvailable()) {
vcoubard 1131:692ddf04fc42 321 return BLE_ERROR_NOT_IMPLEMENTED;
vcoubard 1131:692ddf04fc42 322 }
vcoubard 1131:692ddf04fc42 323
vcoubard 1131:692ddf04fc42 324 dataReadCallChain.add(callback);
vcoubard 1131:692ddf04fc42 325 return BLE_ERROR_NONE;
vcoubard 1131:692ddf04fc42 326 }
vcoubard 1131:692ddf04fc42 327 template <typename T>
vcoubard 1131:692ddf04fc42 328 ble_error_t onDataRead(T *objPtr, void (T::*memberPtr)(const GattReadCallbackParams *context)) {
vcoubard 1131:692ddf04fc42 329 if (!isOnDataReadAvailable()) {
vcoubard 1131:692ddf04fc42 330 return BLE_ERROR_NOT_IMPLEMENTED;
vcoubard 1131:692ddf04fc42 331 }
vcoubard 1131:692ddf04fc42 332
vcoubard 1131:692ddf04fc42 333 dataReadCallChain.add(objPtr, memberPtr);
vcoubard 1131:692ddf04fc42 334 return BLE_ERROR_NONE;
vcoubard 1131:692ddf04fc42 335 }
vcoubard 1131:692ddf04fc42 336
vcoubard 1131:692ddf04fc42 337 /**
vcoubard 1179:4ab722f8dca0 338 * @brief provide access to the callchain of data read event callbacks
vcoubard 1179:4ab722f8dca0 339 * It is possible to register callbacks using onDataRead().add(callback);
vcoubard 1179:4ab722f8dca0 340 * It is possible to unregister callbacks using onDataRead().detach(callback)
vcoubard 1179:4ab722f8dca0 341 * @return The data read event callbacks chain
vcoubard 1131:692ddf04fc42 342 */
vcoubard 1131:692ddf04fc42 343 DataReadCallbackChain_t& onDataRead() {
vcoubard 1131:692ddf04fc42 344 return dataReadCallChain;
vcoubard 1131:692ddf04fc42 345 }
vcoubard 1131:692ddf04fc42 346
vcoubard 1131:692ddf04fc42 347 /**
vcoubard 1135:22aada733dbd 348 * Setup a callback to be invoked to notify the user application that the
vcoubard 1135:22aada733dbd 349 * GattServer instance is about to shutdown (possibly as a result of a call
vcoubard 1135:22aada733dbd 350 * to BLE::shutdown()).
vcoubard 1135:22aada733dbd 351 *
vcoubard 1179:4ab722f8dca0 352 * @Note: It is possible to chain together multiple onShutdown callbacks
vcoubard 1135:22aada733dbd 353 * (potentially from different modules of an application) to be notified
vcoubard 1135:22aada733dbd 354 * before the GattServer is shutdown.
vcoubard 1135:22aada733dbd 355 *
vcoubard 1179:4ab722f8dca0 356 * @Note: It is also possible to set up a callback into a member function of
vcoubard 1135:22aada733dbd 357 * some object.
vcoubard 1135:22aada733dbd 358 *
vcoubard 1179:4ab722f8dca0 359 * @Note It is possible to unregister a callback using onShutdown().detach(callback)
vcoubard 1135:22aada733dbd 360 */
vcoubard 1135:22aada733dbd 361 void onShutdown(const GattServerShutdownCallback_t& callback) {
vcoubard 1135:22aada733dbd 362 shutdownCallChain.add(callback);
vcoubard 1135:22aada733dbd 363 }
vcoubard 1135:22aada733dbd 364 template <typename T>
vcoubard 1135:22aada733dbd 365 void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
vcoubard 1135:22aada733dbd 366 shutdownCallChain.add(objPtr, memberPtr);
vcoubard 1135:22aada733dbd 367 }
vcoubard 1135:22aada733dbd 368
vcoubard 1135:22aada733dbd 369 /**
vcoubard 1179:4ab722f8dca0 370 * @brief provide access to the callchain of shutdown event callbacks
vcoubard 1179:4ab722f8dca0 371 * It is possible to register callbacks using onShutdown().add(callback);
vcoubard 1179:4ab722f8dca0 372 * It is possible to unregister callbacks using onShutdown().detach(callback)
vcoubard 1179:4ab722f8dca0 373 * @return The shutdown event callbacks chain
vcoubard 1135:22aada733dbd 374 */
vcoubard 1135:22aada733dbd 375 GattServerShutdownCallbackChain_t& onShutdown() {
vcoubard 1135:22aada733dbd 376 return shutdownCallChain;
vcoubard 1135:22aada733dbd 377 }
vcoubard 1135:22aada733dbd 378
vcoubard 1135:22aada733dbd 379 /**
vcoubard 1131:692ddf04fc42 380 * Set up a callback for when notifications or indications are enabled for a
vcoubard 1131:692ddf04fc42 381 * characteristic on the local GATT server.
vcoubard 1131:692ddf04fc42 382 */
vcoubard 1179:4ab722f8dca0 383 void onUpdatesEnabled(EventCallback_t callback) {updatesEnabledCallback = callback;}
vcoubard 1131:692ddf04fc42 384
vcoubard 1131:692ddf04fc42 385 /**
vcoubard 1131:692ddf04fc42 386 * Set up a callback for when notifications or indications are disabled for a
vcoubard 1131:692ddf04fc42 387 * characteristic on the local GATT server.
vcoubard 1131:692ddf04fc42 388 */
vcoubard 1179:4ab722f8dca0 389 void onUpdatesDisabled(EventCallback_t callback) {updatesDisabledCallback = callback;}
vcoubard 1131:692ddf04fc42 390
vcoubard 1131:692ddf04fc42 391 /**
vcoubard 1131:692ddf04fc42 392 * Set up a callback for when the GATT server receives a response for an
vcoubard 1131:692ddf04fc42 393 * indication event sent previously.
vcoubard 1131:692ddf04fc42 394 */
vcoubard 1179:4ab722f8dca0 395 void onConfirmationReceived(EventCallback_t callback) {confirmationReceivedCallback = callback;}
vcoubard 1131:692ddf04fc42 396
vcoubard 1131:692ddf04fc42 397 /* Entry points for the underlying stack to report events back to the user. */
vcoubard 1131:692ddf04fc42 398 protected:
vcoubard 1131:692ddf04fc42 399 void handleDataWrittenEvent(const GattWriteCallbackParams *params) {
vcoubard 1131:692ddf04fc42 400 dataWrittenCallChain.call(params);
vcoubard 1131:692ddf04fc42 401 }
vcoubard 1131:692ddf04fc42 402
vcoubard 1131:692ddf04fc42 403 void handleDataReadEvent(const GattReadCallbackParams *params) {
vcoubard 1131:692ddf04fc42 404 dataReadCallChain.call(params);
vcoubard 1131:692ddf04fc42 405 }
vcoubard 1131:692ddf04fc42 406
vcoubard 1131:692ddf04fc42 407 void handleEvent(GattServerEvents::gattEvent_e type, GattAttribute::Handle_t attributeHandle) {
vcoubard 1131:692ddf04fc42 408 switch (type) {
vcoubard 1131:692ddf04fc42 409 case GattServerEvents::GATT_EVENT_UPDATES_ENABLED:
vcoubard 1131:692ddf04fc42 410 if (updatesEnabledCallback) {
vcoubard 1131:692ddf04fc42 411 updatesEnabledCallback(attributeHandle);
vcoubard 1131:692ddf04fc42 412 }
vcoubard 1131:692ddf04fc42 413 break;
vcoubard 1131:692ddf04fc42 414 case GattServerEvents::GATT_EVENT_UPDATES_DISABLED:
vcoubard 1131:692ddf04fc42 415 if (updatesDisabledCallback) {
vcoubard 1131:692ddf04fc42 416 updatesDisabledCallback(attributeHandle);
vcoubard 1131:692ddf04fc42 417 }
vcoubard 1131:692ddf04fc42 418 break;
vcoubard 1131:692ddf04fc42 419 case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED:
vcoubard 1131:692ddf04fc42 420 if (confirmationReceivedCallback) {
vcoubard 1131:692ddf04fc42 421 confirmationReceivedCallback(attributeHandle);
vcoubard 1131:692ddf04fc42 422 }
vcoubard 1131:692ddf04fc42 423 break;
vcoubard 1131:692ddf04fc42 424 default:
vcoubard 1131:692ddf04fc42 425 break;
vcoubard 1131:692ddf04fc42 426 }
vcoubard 1131:692ddf04fc42 427 }
vcoubard 1131:692ddf04fc42 428
vcoubard 1131:692ddf04fc42 429 void handleDataSentEvent(unsigned count) {
vcoubard 1131:692ddf04fc42 430 dataSentCallChain.call(count);
vcoubard 1131:692ddf04fc42 431 }
vcoubard 1131:692ddf04fc42 432
vcoubard 1135:22aada733dbd 433 public:
vcoubard 1135:22aada733dbd 434 /**
vcoubard 1135:22aada733dbd 435 * Notify all registered onShutdown callbacks that the GattServer is
vcoubard 1135:22aada733dbd 436 * about to be shutdown and clear all GattServer state of the
vcoubard 1135:22aada733dbd 437 * associated object.
vcoubard 1135:22aada733dbd 438 *
vcoubard 1135:22aada733dbd 439 * This function is meant to be overridden in the platform-specific
vcoubard 1135:22aada733dbd 440 * sub-class. Nevertheless, the sub-class is only expected to reset its
vcoubard 1135:22aada733dbd 441 * state and not the data held in GattServer members. This shall be achieved
vcoubard 1135:22aada733dbd 442 * by a call to GattServer::reset() from the sub-class' reset()
vcoubard 1135:22aada733dbd 443 * implementation.
vcoubard 1135:22aada733dbd 444 *
vcoubard 1135:22aada733dbd 445 * @return BLE_ERROR_NONE on success.
vcoubard 1135:22aada733dbd 446 */
vcoubard 1135:22aada733dbd 447 virtual ble_error_t reset(void) {
vcoubard 1135:22aada733dbd 448 /* Notify that the instance is about to shutdown */
vcoubard 1135:22aada733dbd 449 shutdownCallChain.call(this);
vcoubard 1135:22aada733dbd 450 shutdownCallChain.clear();
vcoubard 1135:22aada733dbd 451
vcoubard 1135:22aada733dbd 452 serviceCount = 0;
vcoubard 1135:22aada733dbd 453 characteristicCount = 0;
vcoubard 1135:22aada733dbd 454
vcoubard 1135:22aada733dbd 455 dataSentCallChain.clear();
vcoubard 1135:22aada733dbd 456 dataWrittenCallChain.clear();
vcoubard 1135:22aada733dbd 457 dataReadCallChain.clear();
vcoubard 1135:22aada733dbd 458 updatesEnabledCallback = NULL;
vcoubard 1135:22aada733dbd 459 updatesDisabledCallback = NULL;
vcoubard 1135:22aada733dbd 460 confirmationReceivedCallback = NULL;
vcoubard 1135:22aada733dbd 461
vcoubard 1135:22aada733dbd 462 return BLE_ERROR_NONE;
vcoubard 1135:22aada733dbd 463 }
vcoubard 1135:22aada733dbd 464
vcoubard 1131:692ddf04fc42 465 protected:
vcoubard 1131:692ddf04fc42 466 uint8_t serviceCount;
vcoubard 1131:692ddf04fc42 467 uint8_t characteristicCount;
vcoubard 1131:692ddf04fc42 468
vcoubard 1131:692ddf04fc42 469 private:
vcoubard 1135:22aada733dbd 470 DataSentCallbackChain_t dataSentCallChain;
vcoubard 1135:22aada733dbd 471 DataWrittenCallbackChain_t dataWrittenCallChain;
vcoubard 1135:22aada733dbd 472 DataReadCallbackChain_t dataReadCallChain;
vcoubard 1135:22aada733dbd 473 GattServerShutdownCallbackChain_t shutdownCallChain;
vcoubard 1135:22aada733dbd 474 EventCallback_t updatesEnabledCallback;
vcoubard 1135:22aada733dbd 475 EventCallback_t updatesDisabledCallback;
vcoubard 1135:22aada733dbd 476 EventCallback_t confirmationReceivedCallback;
vcoubard 1131:692ddf04fc42 477
vcoubard 1131:692ddf04fc42 478 private:
vcoubard 1131:692ddf04fc42 479 /* Disallow copy and assignment. */
vcoubard 1131:692ddf04fc42 480 GattServer(const GattServer &);
vcoubard 1131:692ddf04fc42 481 GattServer& operator=(const GattServer &);
vcoubard 1131:692ddf04fc42 482 };
vcoubard 1131:692ddf04fc42 483
vcoubard 1179:4ab722f8dca0 484 #endif // ifndef __GATT_SERVER_H__