Knight KE / Mbed OS Game_Master
Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WFKnight 0:9b3d4731edbb 1 /* mbed Microcontroller Library
WFKnight 0:9b3d4731edbb 2 * Copyright (c) 2006-2013 ARM Limited
WFKnight 0:9b3d4731edbb 3 *
WFKnight 0:9b3d4731edbb 4 * Licensed under the Apache License, Version 2.0 (the "License");
WFKnight 0:9b3d4731edbb 5 * you may not use this file except in compliance with the License.
WFKnight 0:9b3d4731edbb 6 * You may obtain a copy of the License at
WFKnight 0:9b3d4731edbb 7 *
WFKnight 0:9b3d4731edbb 8 * http://www.apache.org/licenses/LICENSE-2.0
WFKnight 0:9b3d4731edbb 9 *
WFKnight 0:9b3d4731edbb 10 * Unless required by applicable law or agreed to in writing, software
WFKnight 0:9b3d4731edbb 11 * distributed under the License is distributed on an "AS IS" BASIS,
WFKnight 0:9b3d4731edbb 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
WFKnight 0:9b3d4731edbb 13 * See the License for the specific language governing permissions and
WFKnight 0:9b3d4731edbb 14 * limitations under the License.
WFKnight 0:9b3d4731edbb 15 */
WFKnight 0:9b3d4731edbb 16
WFKnight 0:9b3d4731edbb 17 #ifndef MBED_GATT_SERVER_H__
WFKnight 0:9b3d4731edbb 18 #define MBED_GATT_SERVER_H__
WFKnight 0:9b3d4731edbb 19
WFKnight 0:9b3d4731edbb 20 #include "Gap.h"
WFKnight 0:9b3d4731edbb 21 #include "GattService.h"
WFKnight 0:9b3d4731edbb 22 #include "GattAttribute.h"
WFKnight 0:9b3d4731edbb 23 #include "GattServerEvents.h"
WFKnight 0:9b3d4731edbb 24 #include "GattCallbackParamTypes.h"
WFKnight 0:9b3d4731edbb 25 #include "CallChainOfFunctionPointersWithContext.h"
WFKnight 0:9b3d4731edbb 26
WFKnight 0:9b3d4731edbb 27 /**
WFKnight 0:9b3d4731edbb 28 * @addtogroup ble
WFKnight 0:9b3d4731edbb 29 * @{
WFKnight 0:9b3d4731edbb 30 * @addtogroup gatt
WFKnight 0:9b3d4731edbb 31 * @{
WFKnight 0:9b3d4731edbb 32 * @addtogroup server
WFKnight 0:9b3d4731edbb 33 * @{
WFKnight 0:9b3d4731edbb 34 */
WFKnight 0:9b3d4731edbb 35
WFKnight 0:9b3d4731edbb 36 /**
WFKnight 0:9b3d4731edbb 37 * Construct and operates a GATT server.
WFKnight 0:9b3d4731edbb 38 *
WFKnight 0:9b3d4731edbb 39 * A Gatt server is a collection of GattService; these services contain
WFKnight 0:9b3d4731edbb 40 * characteristics that a peer connected to the device may read or write.
WFKnight 0:9b3d4731edbb 41 * These characteristics may also emit updates to subscribed clients when their
WFKnight 0:9b3d4731edbb 42 * values change.
WFKnight 0:9b3d4731edbb 43 *
WFKnight 0:9b3d4731edbb 44 * @p Server Layout
WFKnight 0:9b3d4731edbb 45 *
WFKnight 0:9b3d4731edbb 46 * Application code can add a GattService object to the server with the help of
WFKnight 0:9b3d4731edbb 47 * the function addService(). That function registers all the GattCharacteristic
WFKnight 0:9b3d4731edbb 48 * enclosed in the service, as well as all the characteristics descriptors (see
WFKnight 0:9b3d4731edbb 49 * GattAttribute) these characteristics contain. Service registration assigns
WFKnight 0:9b3d4731edbb 50 * a unique handle to the various attributes being part of the service; this
WFKnight 0:9b3d4731edbb 51 * handle should be used for subsequent read or write of these components.
WFKnight 0:9b3d4731edbb 52 *
WFKnight 0:9b3d4731edbb 53 * There are no primitives defined to remove a single service; however, a call to
WFKnight 0:9b3d4731edbb 54 * the function reset() removes all services previously registered in the
WFKnight 0:9b3d4731edbb 55 * GattServer.
WFKnight 0:9b3d4731edbb 56 *
WFKnight 0:9b3d4731edbb 57 * @p Characteristic and attributes access
WFKnight 0:9b3d4731edbb 58 *
WFKnight 0:9b3d4731edbb 59 * Values of the characteristic and the characteristic descriptor present in the
WFKnight 0:9b3d4731edbb 60 * GattServer must be accessed through the handle assigned to them when the service
WFKnight 0:9b3d4731edbb 61 * has been registered; the GattServer class offers several flavors of read()
WFKnight 0:9b3d4731edbb 62 * and write() functions that retrieve or mutate an attribute value.
WFKnight 0:9b3d4731edbb 63 *
WFKnight 0:9b3d4731edbb 64 * Application code can query if a client has subscribed to a given
WFKnight 0:9b3d4731edbb 65 * characteristic's value update by invoking the function areUpdatesEnabled().
WFKnight 0:9b3d4731edbb 66 *
WFKnight 0:9b3d4731edbb 67 * @p Events
WFKnight 0:9b3d4731edbb 68 *
WFKnight 0:9b3d4731edbb 69 * The GattServer allows application code to register several event handlers that
WFKnight 0:9b3d4731edbb 70 * can be used to monitor client and server activities:
WFKnight 0:9b3d4731edbb 71 * - onDataSent(): Register an event handler that is called when a
WFKnight 0:9b3d4731edbb 72 * characteristic value update has been sent to a client.
WFKnight 0:9b3d4731edbb 73 * - onDataWriten(): Register an event handler that is called when a
WFKnight 0:9b3d4731edbb 74 * client has written an attribute of the server.
WFKnight 0:9b3d4731edbb 75 * - onDataRead(): Register an event handler that is called when a
WFKnight 0:9b3d4731edbb 76 * client has read an attribute of the server.
WFKnight 0:9b3d4731edbb 77 * - onUpdatesEnabled: Register an event handler that is called when a
WFKnight 0:9b3d4731edbb 78 * client subscribes to updates of a characteristic.
WFKnight 0:9b3d4731edbb 79 * - onUpdatesDisabled: Register an event handler that is called when a
WFKnight 0:9b3d4731edbb 80 * client unsubscribes from updates of a characteristic.
WFKnight 0:9b3d4731edbb 81 * - onConfimationReceived: Register an event handler that is called
WFKnight 0:9b3d4731edbb 82 * when a client acknowledges a characteristic value notification.
WFKnight 0:9b3d4731edbb 83 *
WFKnight 0:9b3d4731edbb 84 * @note The term characteristic value update is used to represent
WFKnight 0:9b3d4731edbb 85 * Characteristic Value Notification and Characteristic Value Indication when
WFKnight 0:9b3d4731edbb 86 * the nature of the server initiated is not relevant.
WFKnight 0:9b3d4731edbb 87 */
WFKnight 0:9b3d4731edbb 88 class GattServer {
WFKnight 0:9b3d4731edbb 89 public:
WFKnight 0:9b3d4731edbb 90 /**
WFKnight 0:9b3d4731edbb 91 * Event handler invoked when the server has sent data to a client.
WFKnight 0:9b3d4731edbb 92 *
WFKnight 0:9b3d4731edbb 93 * @see onDataSent().
WFKnight 0:9b3d4731edbb 94 */
WFKnight 0:9b3d4731edbb 95 typedef FunctionPointerWithContext<unsigned> DataSentCallback_t;
WFKnight 0:9b3d4731edbb 96
WFKnight 0:9b3d4731edbb 97 /**
WFKnight 0:9b3d4731edbb 98 * Callchain of DataSentCallback_t objects.
WFKnight 0:9b3d4731edbb 99 *
WFKnight 0:9b3d4731edbb 100 * @see onDataSent().
WFKnight 0:9b3d4731edbb 101 */
WFKnight 0:9b3d4731edbb 102 typedef CallChainOfFunctionPointersWithContext<unsigned>
WFKnight 0:9b3d4731edbb 103 DataSentCallbackChain_t;
WFKnight 0:9b3d4731edbb 104
WFKnight 0:9b3d4731edbb 105 /**
WFKnight 0:9b3d4731edbb 106 * Event handler invoked when the client has written an attribute of the
WFKnight 0:9b3d4731edbb 107 * server.
WFKnight 0:9b3d4731edbb 108 *
WFKnight 0:9b3d4731edbb 109 * @see onDataWritten().
WFKnight 0:9b3d4731edbb 110 */
WFKnight 0:9b3d4731edbb 111 typedef FunctionPointerWithContext<const GattWriteCallbackParams*>
WFKnight 0:9b3d4731edbb 112 DataWrittenCallback_t;
WFKnight 0:9b3d4731edbb 113
WFKnight 0:9b3d4731edbb 114 /**
WFKnight 0:9b3d4731edbb 115 * Callchain of DataWrittenCallback_t objects.
WFKnight 0:9b3d4731edbb 116 *
WFKnight 0:9b3d4731edbb 117 * @see onDataWritten().
WFKnight 0:9b3d4731edbb 118 */
WFKnight 0:9b3d4731edbb 119 typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*>
WFKnight 0:9b3d4731edbb 120 DataWrittenCallbackChain_t;
WFKnight 0:9b3d4731edbb 121
WFKnight 0:9b3d4731edbb 122 /**
WFKnight 0:9b3d4731edbb 123 * Event handler invoked when the client has read an attribute of the server.
WFKnight 0:9b3d4731edbb 124 *
WFKnight 0:9b3d4731edbb 125 * @see onDataRead().
WFKnight 0:9b3d4731edbb 126 */
WFKnight 0:9b3d4731edbb 127 typedef FunctionPointerWithContext<const GattReadCallbackParams*>
WFKnight 0:9b3d4731edbb 128 DataReadCallback_t;
WFKnight 0:9b3d4731edbb 129
WFKnight 0:9b3d4731edbb 130 /**
WFKnight 0:9b3d4731edbb 131 * Callchain of DataReadCallback_t.
WFKnight 0:9b3d4731edbb 132 *
WFKnight 0:9b3d4731edbb 133 * @see onDataRead().
WFKnight 0:9b3d4731edbb 134 */
WFKnight 0:9b3d4731edbb 135 typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams*>
WFKnight 0:9b3d4731edbb 136 DataReadCallbackChain_t;
WFKnight 0:9b3d4731edbb 137
WFKnight 0:9b3d4731edbb 138 /**
WFKnight 0:9b3d4731edbb 139 * Event handler invoked when the GattServer is reset.
WFKnight 0:9b3d4731edbb 140 *
WFKnight 0:9b3d4731edbb 141 * @see onShutdown() reset()
WFKnight 0:9b3d4731edbb 142 */
WFKnight 0:9b3d4731edbb 143 typedef FunctionPointerWithContext<const GattServer *>
WFKnight 0:9b3d4731edbb 144 GattServerShutdownCallback_t;
WFKnight 0:9b3d4731edbb 145
WFKnight 0:9b3d4731edbb 146 /**
WFKnight 0:9b3d4731edbb 147 * Callchain of GattServerShutdownCallback_t.
WFKnight 0:9b3d4731edbb 148 *
WFKnight 0:9b3d4731edbb 149 * @see onShutdown() reset()
WFKnight 0:9b3d4731edbb 150 */
WFKnight 0:9b3d4731edbb 151 typedef CallChainOfFunctionPointersWithContext<const GattServer*>
WFKnight 0:9b3d4731edbb 152 GattServerShutdownCallbackChain_t;
WFKnight 0:9b3d4731edbb 153
WFKnight 0:9b3d4731edbb 154 /**
WFKnight 0:9b3d4731edbb 155 * Event handler that handles subscription to characteristic updates,
WFKnight 0:9b3d4731edbb 156 * unsubscription from characteristic updates and notification confirmation.
WFKnight 0:9b3d4731edbb 157 *
WFKnight 0:9b3d4731edbb 158 * @see onUpdatesEnabled() onUpdateDisabled() onConfirmationReceived()
WFKnight 0:9b3d4731edbb 159 */
WFKnight 0:9b3d4731edbb 160 typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;
WFKnight 0:9b3d4731edbb 161
WFKnight 0:9b3d4731edbb 162 protected:
WFKnight 0:9b3d4731edbb 163 /**
WFKnight 0:9b3d4731edbb 164 * Construct a GattServer instance.
WFKnight 0:9b3d4731edbb 165 */
WFKnight 0:9b3d4731edbb 166 GattServer() :
WFKnight 0:9b3d4731edbb 167 serviceCount(0),
WFKnight 0:9b3d4731edbb 168 characteristicCount(0),
WFKnight 0:9b3d4731edbb 169 dataSentCallChain(),
WFKnight 0:9b3d4731edbb 170 dataWrittenCallChain(),
WFKnight 0:9b3d4731edbb 171 dataReadCallChain(),
WFKnight 0:9b3d4731edbb 172 updatesEnabledCallback(NULL),
WFKnight 0:9b3d4731edbb 173 updatesDisabledCallback(NULL),
WFKnight 0:9b3d4731edbb 174 confirmationReceivedCallback(NULL) {
WFKnight 0:9b3d4731edbb 175 }
WFKnight 0:9b3d4731edbb 176
WFKnight 0:9b3d4731edbb 177 /*
WFKnight 0:9b3d4731edbb 178 * The following functions are meant to be overridden in the platform
WFKnight 0:9b3d4731edbb 179 * specific subclass.
WFKnight 0:9b3d4731edbb 180 */
WFKnight 0:9b3d4731edbb 181 public:
WFKnight 0:9b3d4731edbb 182
WFKnight 0:9b3d4731edbb 183 /**
WFKnight 0:9b3d4731edbb 184 * Add a service declaration to the local attribute server table.
WFKnight 0:9b3d4731edbb 185 *
WFKnight 0:9b3d4731edbb 186 * This functions inserts a service declaration in the attribute table
WFKnight 0:9b3d4731edbb 187 * followed by the characteristic declarations (including characteristic
WFKnight 0:9b3d4731edbb 188 * descriptors) present in @p service.
WFKnight 0:9b3d4731edbb 189 *
WFKnight 0:9b3d4731edbb 190 * The process assigns a unique attribute handle to all the elements added
WFKnight 0:9b3d4731edbb 191 * into the attribute table. This handle is an ID that must be used for
WFKnight 0:9b3d4731edbb 192 * subsequent interractions with the elements.
WFKnight 0:9b3d4731edbb 193 *
WFKnight 0:9b3d4731edbb 194 * @note There is no mirror function that removes a single service.
WFKnight 0:9b3d4731edbb 195 * Application code can remove all the registered services by calling
WFKnight 0:9b3d4731edbb 196 * reset().
WFKnight 0:9b3d4731edbb 197 *
WFKnight 0:9b3d4731edbb 198 * @attention Service, characteristics and descriptors objects registered
WFKnight 0:9b3d4731edbb 199 * within the GattServer must remain reachable until reset() is called.
WFKnight 0:9b3d4731edbb 200 *
WFKnight 0:9b3d4731edbb 201 * @param[in] service The service to be added; attribute handle of services,
WFKnight 0:9b3d4731edbb 202 * characteristic and characteristic descriptors are updated by the
WFKnight 0:9b3d4731edbb 203 * process.
WFKnight 0:9b3d4731edbb 204 *
WFKnight 0:9b3d4731edbb 205 * @return BLE_ERROR_NONE if the service was successfully added.
WFKnight 0:9b3d4731edbb 206 */
WFKnight 0:9b3d4731edbb 207 virtual ble_error_t addService(GattService &service)
WFKnight 0:9b3d4731edbb 208 {
WFKnight 0:9b3d4731edbb 209 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 210 (void)service;
WFKnight 0:9b3d4731edbb 211
WFKnight 0:9b3d4731edbb 212 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 213 is supported. */
WFKnight 0:9b3d4731edbb 214 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 215 }
WFKnight 0:9b3d4731edbb 216
WFKnight 0:9b3d4731edbb 217 /**
WFKnight 0:9b3d4731edbb 218 * Read the value of an attribute present in the local GATT server.
WFKnight 0:9b3d4731edbb 219 *
WFKnight 0:9b3d4731edbb 220 * @param[in] attributeHandle Handle of the attribute to read.
WFKnight 0:9b3d4731edbb 221 * @param[out] buffer A buffer to hold the value being read.
WFKnight 0:9b3d4731edbb 222 * @param[in,out] lengthP Length of the buffer being supplied. If the
WFKnight 0:9b3d4731edbb 223 * attribute value is longer than the size of the supplied buffer, this
WFKnight 0:9b3d4731edbb 224 * variable holds upon return the total attribute value length (excluding
WFKnight 0:9b3d4731edbb 225 * offset). The application may use this information to allocate a suitable
WFKnight 0:9b3d4731edbb 226 * buffer size.
WFKnight 0:9b3d4731edbb 227 *
WFKnight 0:9b3d4731edbb 228 * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
WFKnight 0:9b3d4731edbb 229 *
WFKnight 0:9b3d4731edbb 230 * @attention read(Gap::Handle_t, GattAttribute::Handle_t, uint8_t *, uint16_t *)
WFKnight 0:9b3d4731edbb 231 * must be used to read Client Characteristic Configuration Descriptor (CCCD)
WFKnight 0:9b3d4731edbb 232 * because the value of this type of attribute depends on the connection.
WFKnight 0:9b3d4731edbb 233 */
WFKnight 0:9b3d4731edbb 234 virtual ble_error_t read(
WFKnight 0:9b3d4731edbb 235 GattAttribute::Handle_t attributeHandle,
WFKnight 0:9b3d4731edbb 236 uint8_t buffer[],
WFKnight 0:9b3d4731edbb 237 uint16_t *lengthP
WFKnight 0:9b3d4731edbb 238 ) {
WFKnight 0:9b3d4731edbb 239 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 240 (void)attributeHandle;
WFKnight 0:9b3d4731edbb 241 (void)buffer;
WFKnight 0:9b3d4731edbb 242 (void)lengthP;
WFKnight 0:9b3d4731edbb 243
WFKnight 0:9b3d4731edbb 244 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 245 is supported. */
WFKnight 0:9b3d4731edbb 246 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 247 }
WFKnight 0:9b3d4731edbb 248
WFKnight 0:9b3d4731edbb 249 /**
WFKnight 0:9b3d4731edbb 250 * Read the value of an attribute present in the local GATT server.
WFKnight 0:9b3d4731edbb 251 *
WFKnight 0:9b3d4731edbb 252 * The connection handle allows application code to read the value of a
WFKnight 0:9b3d4731edbb 253 * Client Characteristic Configuration Descriptor for a given connection.
WFKnight 0:9b3d4731edbb 254 *
WFKnight 0:9b3d4731edbb 255 * @param[in] connectionHandle Connection handle.
WFKnight 0:9b3d4731edbb 256 * @param[in] attributeHandle Attribute handle for the value attribute of
WFKnight 0:9b3d4731edbb 257 * the characteristic.
WFKnight 0:9b3d4731edbb 258 * @param[out] buffer A buffer to hold the value being read.
WFKnight 0:9b3d4731edbb 259 * @param[in,out] lengthP Length of the buffer being supplied. If the
WFKnight 0:9b3d4731edbb 260 * attribute value is longer than the size of the supplied buffer, this
WFKnight 0:9b3d4731edbb 261 * variable holds upon return the total attribute value length (excluding
WFKnight 0:9b3d4731edbb 262 * offset). The application may use this information to allocate a suitable
WFKnight 0:9b3d4731edbb 263 * buffer size.
WFKnight 0:9b3d4731edbb 264 *
WFKnight 0:9b3d4731edbb 265 * @return BLE_ERROR_NONE if a value was read successfully into the buffer.
WFKnight 0:9b3d4731edbb 266 */
WFKnight 0:9b3d4731edbb 267 virtual ble_error_t read(
WFKnight 0:9b3d4731edbb 268 Gap::Handle_t connectionHandle,
WFKnight 0:9b3d4731edbb 269 GattAttribute::Handle_t attributeHandle,
WFKnight 0:9b3d4731edbb 270 uint8_t *buffer,
WFKnight 0:9b3d4731edbb 271 uint16_t *lengthP
WFKnight 0:9b3d4731edbb 272 ) {
WFKnight 0:9b3d4731edbb 273 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 274 (void)connectionHandle;
WFKnight 0:9b3d4731edbb 275 (void)attributeHandle;
WFKnight 0:9b3d4731edbb 276 (void)buffer;
WFKnight 0:9b3d4731edbb 277 (void)lengthP;
WFKnight 0:9b3d4731edbb 278
WFKnight 0:9b3d4731edbb 279 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 280 is supported. */
WFKnight 0:9b3d4731edbb 281 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 282 }
WFKnight 0:9b3d4731edbb 283
WFKnight 0:9b3d4731edbb 284 /**
WFKnight 0:9b3d4731edbb 285 * Update the value of an attribute present in the local GATT server.
WFKnight 0:9b3d4731edbb 286 *
WFKnight 0:9b3d4731edbb 287 * @param[in] attributeHandle Handle of the attribute to write.
WFKnight 0:9b3d4731edbb 288 * @param[in] value A pointer to a buffer holding the new value.
WFKnight 0:9b3d4731edbb 289 * @param[in] size Size in bytes of the new value (in bytes).
WFKnight 0:9b3d4731edbb 290 * @param[in] localOnly If this flag is false and the attribute handle
WFKnight 0:9b3d4731edbb 291 * written is a characteristic value, then the server sends an update
WFKnight 0:9b3d4731edbb 292 * containing the new value to all clients that have subscribed to the
WFKnight 0:9b3d4731edbb 293 * characteristic's notifications or indications. Otherwise, the update does
WFKnight 0:9b3d4731edbb 294 * not generate a single server initiated event.
WFKnight 0:9b3d4731edbb 295 *
WFKnight 0:9b3d4731edbb 296 * @return BLE_ERROR_NONE if the attribute value has been successfully
WFKnight 0:9b3d4731edbb 297 * updated.
WFKnight 0:9b3d4731edbb 298 */
WFKnight 0:9b3d4731edbb 299 virtual ble_error_t write(
WFKnight 0:9b3d4731edbb 300 GattAttribute::Handle_t attributeHandle,
WFKnight 0:9b3d4731edbb 301 const uint8_t *value,
WFKnight 0:9b3d4731edbb 302 uint16_t size,
WFKnight 0:9b3d4731edbb 303 bool localOnly = false
WFKnight 0:9b3d4731edbb 304 ) {
WFKnight 0:9b3d4731edbb 305 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 306 (void)attributeHandle;
WFKnight 0:9b3d4731edbb 307 (void)value;
WFKnight 0:9b3d4731edbb 308 (void)size;
WFKnight 0:9b3d4731edbb 309 (void)localOnly;
WFKnight 0:9b3d4731edbb 310
WFKnight 0:9b3d4731edbb 311 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 312 is supported. */
WFKnight 0:9b3d4731edbb 313 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 314 }
WFKnight 0:9b3d4731edbb 315
WFKnight 0:9b3d4731edbb 316 /**
WFKnight 0:9b3d4731edbb 317 * Update the value of an attribute present in the local GATT server.
WFKnight 0:9b3d4731edbb 318 *
WFKnight 0:9b3d4731edbb 319 * The connection handle parameter allows application code to direct
WFKnight 0:9b3d4731edbb 320 * notification or indication resulting from the update to a specific client.
WFKnight 0:9b3d4731edbb 321 *
WFKnight 0:9b3d4731edbb 322 * @param[in] connectionHandle Connection handle.
WFKnight 0:9b3d4731edbb 323 * @param[in] attributeHandle Handle for the value attribute of the
WFKnight 0:9b3d4731edbb 324 * characteristic.
WFKnight 0:9b3d4731edbb 325 * @param[in] value A pointer to a buffer holding the new value.
WFKnight 0:9b3d4731edbb 326 * @param[in] size Size of the new value (in bytes).
WFKnight 0:9b3d4731edbb 327 * @param[in] localOnly If this flag is false and the attribute handle
WFKnight 0:9b3d4731edbb 328 * written is a characteristic value, then the server sends an update
WFKnight 0:9b3d4731edbb 329 * containing the new value to the client identified by the parameter
WFKnight 0:9b3d4731edbb 330 * @p connectionHandle if it is subscribed to the characteristic's
WFKnight 0:9b3d4731edbb 331 * notifications or indications. Otherwise, the update does not generate a
WFKnight 0:9b3d4731edbb 332 * single server initiated event.
WFKnight 0:9b3d4731edbb 333 *
WFKnight 0:9b3d4731edbb 334 * @return BLE_ERROR_NONE if the attribute value has been successfully
WFKnight 0:9b3d4731edbb 335 * updated.
WFKnight 0:9b3d4731edbb 336 */
WFKnight 0:9b3d4731edbb 337 virtual ble_error_t write(
WFKnight 0:9b3d4731edbb 338 Gap::Handle_t connectionHandle,
WFKnight 0:9b3d4731edbb 339 GattAttribute::Handle_t attributeHandle,
WFKnight 0:9b3d4731edbb 340 const uint8_t *value,
WFKnight 0:9b3d4731edbb 341 uint16_t size,
WFKnight 0:9b3d4731edbb 342 bool localOnly = false
WFKnight 0:9b3d4731edbb 343 ) {
WFKnight 0:9b3d4731edbb 344 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 345 (void)connectionHandle;
WFKnight 0:9b3d4731edbb 346 (void)attributeHandle;
WFKnight 0:9b3d4731edbb 347 (void)value;
WFKnight 0:9b3d4731edbb 348 (void)size;
WFKnight 0:9b3d4731edbb 349 (void)localOnly;
WFKnight 0:9b3d4731edbb 350
WFKnight 0:9b3d4731edbb 351 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 352 is supported. */
WFKnight 0:9b3d4731edbb 353 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 354 }
WFKnight 0:9b3d4731edbb 355
WFKnight 0:9b3d4731edbb 356 /**
WFKnight 0:9b3d4731edbb 357 * Determine if one of the connected clients has subscribed to notifications
WFKnight 0:9b3d4731edbb 358 * or indications of the characteristic in input.
WFKnight 0:9b3d4731edbb 359 *
WFKnight 0:9b3d4731edbb 360 * @param[in] characteristic The characteristic.
WFKnight 0:9b3d4731edbb 361 * @param[out] enabledP Upon return, *enabledP is true if updates are
WFKnight 0:9b3d4731edbb 362 * enabled for a connected client; otherwise, *enabledP is false.
WFKnight 0:9b3d4731edbb 363 *
WFKnight 0:9b3d4731edbb 364 * @return BLE_ERROR_NONE if the connection and handle are found. False
WFKnight 0:9b3d4731edbb 365 * otherwise.
WFKnight 0:9b3d4731edbb 366 */
WFKnight 0:9b3d4731edbb 367 virtual ble_error_t areUpdatesEnabled(
WFKnight 0:9b3d4731edbb 368 const GattCharacteristic &characteristic,
WFKnight 0:9b3d4731edbb 369 bool *enabledP
WFKnight 0:9b3d4731edbb 370 ) {
WFKnight 0:9b3d4731edbb 371 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 372 (void)characteristic;
WFKnight 0:9b3d4731edbb 373 (void)enabledP;
WFKnight 0:9b3d4731edbb 374
WFKnight 0:9b3d4731edbb 375 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 376 is supported. */
WFKnight 0:9b3d4731edbb 377 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 378 }
WFKnight 0:9b3d4731edbb 379
WFKnight 0:9b3d4731edbb 380 /**
WFKnight 0:9b3d4731edbb 381 * Determine if an identified client has subscribed to notifications or
WFKnight 0:9b3d4731edbb 382 * indications of a given characteristic.
WFKnight 0:9b3d4731edbb 383 *
WFKnight 0:9b3d4731edbb 384 * @param[in] connectionHandle The connection handle.
WFKnight 0:9b3d4731edbb 385 * @param[in] characteristic The characteristic.
WFKnight 0:9b3d4731edbb 386 * @param[out] enabledP Upon return, *enabledP is true if the client
WFKnight 0:9b3d4731edbb 387 * identified by @p connectionHandle has subscribed to notifications or
WFKnight 0:9b3d4731edbb 388 * indications of @p characteristic; otherwise, *enabledP is false.
WFKnight 0:9b3d4731edbb 389 *
WFKnight 0:9b3d4731edbb 390 * @return BLE_ERROR_NONE if the connection and handle are found. False
WFKnight 0:9b3d4731edbb 391 * otherwise.
WFKnight 0:9b3d4731edbb 392 */
WFKnight 0:9b3d4731edbb 393 virtual ble_error_t areUpdatesEnabled(
WFKnight 0:9b3d4731edbb 394 Gap::Handle_t connectionHandle,
WFKnight 0:9b3d4731edbb 395 const GattCharacteristic &characteristic,
WFKnight 0:9b3d4731edbb 396 bool *enabledP
WFKnight 0:9b3d4731edbb 397 ) {
WFKnight 0:9b3d4731edbb 398 /* Avoid compiler warnings about unused variables. */
WFKnight 0:9b3d4731edbb 399 (void)connectionHandle;
WFKnight 0:9b3d4731edbb 400 (void)characteristic;
WFKnight 0:9b3d4731edbb 401 (void)enabledP;
WFKnight 0:9b3d4731edbb 402
WFKnight 0:9b3d4731edbb 403 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 404 is supported. */
WFKnight 0:9b3d4731edbb 405 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 406 }
WFKnight 0:9b3d4731edbb 407
WFKnight 0:9b3d4731edbb 408 /**
WFKnight 0:9b3d4731edbb 409 * Indicate if the underlying stack emit events when an attribute is read by
WFKnight 0:9b3d4731edbb 410 * a client.
WFKnight 0:9b3d4731edbb 411 *
WFKnight 0:9b3d4731edbb 412 * @attention This function should be overridden to return true if
WFKnight 0:9b3d4731edbb 413 * applicable.
WFKnight 0:9b3d4731edbb 414 *
WFKnight 0:9b3d4731edbb 415 * @return true if onDataRead is supported; false otherwise.
WFKnight 0:9b3d4731edbb 416 */
WFKnight 0:9b3d4731edbb 417 virtual bool isOnDataReadAvailable() const
WFKnight 0:9b3d4731edbb 418 {
WFKnight 0:9b3d4731edbb 419 /* Requesting action from porters: override this API if this capability
WFKnight 0:9b3d4731edbb 420 is supported. */
WFKnight 0:9b3d4731edbb 421 return false;
WFKnight 0:9b3d4731edbb 422 }
WFKnight 0:9b3d4731edbb 423
WFKnight 0:9b3d4731edbb 424 /*
WFKnight 0:9b3d4731edbb 425 * APIs with nonvirtual implementations.
WFKnight 0:9b3d4731edbb 426 */
WFKnight 0:9b3d4731edbb 427 public:
WFKnight 0:9b3d4731edbb 428 /**
WFKnight 0:9b3d4731edbb 429 * Add an event handler that monitors emission of characteristic value
WFKnight 0:9b3d4731edbb 430 * updates.
WFKnight 0:9b3d4731edbb 431 *
WFKnight 0:9b3d4731edbb 432 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 433 *
WFKnight 0:9b3d4731edbb 434 * @note It is possible to chain together multiple onDataSent callbacks
WFKnight 0:9b3d4731edbb 435 * (potentially from different modules of an application).
WFKnight 0:9b3d4731edbb 436 */
WFKnight 0:9b3d4731edbb 437 void onDataSent(const DataSentCallback_t &callback)
WFKnight 0:9b3d4731edbb 438 {
WFKnight 0:9b3d4731edbb 439 dataSentCallChain.add(callback);
WFKnight 0:9b3d4731edbb 440 }
WFKnight 0:9b3d4731edbb 441
WFKnight 0:9b3d4731edbb 442 /**
WFKnight 0:9b3d4731edbb 443 * Add an event handler that monitors emission of characteristic value
WFKnight 0:9b3d4731edbb 444 * updates.
WFKnight 0:9b3d4731edbb 445 *
WFKnight 0:9b3d4731edbb 446 * @param[in] objPtr Pointer to the instance that is used to invoke the
WFKnight 0:9b3d4731edbb 447 * event handler.
WFKnight 0:9b3d4731edbb 448 * @param[in] memberPtr Event handler being registered. It is a member
WFKnight 0:9b3d4731edbb 449 * function.
WFKnight 0:9b3d4731edbb 450 */
WFKnight 0:9b3d4731edbb 451 template <typename T>
WFKnight 0:9b3d4731edbb 452 void onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count))
WFKnight 0:9b3d4731edbb 453 {
WFKnight 0:9b3d4731edbb 454 dataSentCallChain.add(objPtr, memberPtr);
WFKnight 0:9b3d4731edbb 455 }
WFKnight 0:9b3d4731edbb 456
WFKnight 0:9b3d4731edbb 457 /**
WFKnight 0:9b3d4731edbb 458 * Access the callchain of data sent event handlers.
WFKnight 0:9b3d4731edbb 459 *
WFKnight 0:9b3d4731edbb 460 * @return A reference to the DATA_SENT event callback chain.
WFKnight 0:9b3d4731edbb 461 */
WFKnight 0:9b3d4731edbb 462 DataSentCallbackChain_t &onDataSent()
WFKnight 0:9b3d4731edbb 463 {
WFKnight 0:9b3d4731edbb 464 return dataSentCallChain;
WFKnight 0:9b3d4731edbb 465 }
WFKnight 0:9b3d4731edbb 466
WFKnight 0:9b3d4731edbb 467 /**
WFKnight 0:9b3d4731edbb 468 * Set an event handler that is called after
WFKnight 0:9b3d4731edbb 469 * a connected peer has written an attribute.
WFKnight 0:9b3d4731edbb 470 *
WFKnight 0:9b3d4731edbb 471 * @param[in] callback The event handler being registered.
WFKnight 0:9b3d4731edbb 472 *
WFKnight 0:9b3d4731edbb 473 * @attention It is possible to set multiple event handlers. Registered
WFKnight 0:9b3d4731edbb 474 * handlers may be removed with onDataWritten().detach(callback).
WFKnight 0:9b3d4731edbb 475 */
WFKnight 0:9b3d4731edbb 476 void onDataWritten(const DataWrittenCallback_t &callback)
WFKnight 0:9b3d4731edbb 477 {
WFKnight 0:9b3d4731edbb 478 dataWrittenCallChain.add(callback);
WFKnight 0:9b3d4731edbb 479 }
WFKnight 0:9b3d4731edbb 480
WFKnight 0:9b3d4731edbb 481 /**
WFKnight 0:9b3d4731edbb 482 * Set an event handler that is called after
WFKnight 0:9b3d4731edbb 483 * a connected peer has written an attribute.
WFKnight 0:9b3d4731edbb 484 *
WFKnight 0:9b3d4731edbb 485 * @param[in] objPtr Pointer to the instance that is used to invoke the
WFKnight 0:9b3d4731edbb 486 * event handler (@p memberPtr).
WFKnight 0:9b3d4731edbb 487 * @param[in] memberPtr Event handler being registered. It is a member
WFKnight 0:9b3d4731edbb 488 * function.
WFKnight 0:9b3d4731edbb 489 */
WFKnight 0:9b3d4731edbb 490 template <typename T>
WFKnight 0:9b3d4731edbb 491 void onDataWritten(
WFKnight 0:9b3d4731edbb 492 T *objPtr,
WFKnight 0:9b3d4731edbb 493 void (T::*memberPtr)(const GattWriteCallbackParams *context)
WFKnight 0:9b3d4731edbb 494 ) {
WFKnight 0:9b3d4731edbb 495 dataWrittenCallChain.add(objPtr, memberPtr);
WFKnight 0:9b3d4731edbb 496 }
WFKnight 0:9b3d4731edbb 497
WFKnight 0:9b3d4731edbb 498 /**
WFKnight 0:9b3d4731edbb 499 * Access the callchain of data written event handlers.
WFKnight 0:9b3d4731edbb 500 *
WFKnight 0:9b3d4731edbb 501 * @return A reference to the data written event callbacks chain.
WFKnight 0:9b3d4731edbb 502 *
WFKnight 0:9b3d4731edbb 503 * @note It is possible to register callbacks using
WFKnight 0:9b3d4731edbb 504 * onDataWritten().add(callback).
WFKnight 0:9b3d4731edbb 505 *
WFKnight 0:9b3d4731edbb 506 * @note It is possible to unregister callbacks using
WFKnight 0:9b3d4731edbb 507 * onDataWritten().detach(callback).
WFKnight 0:9b3d4731edbb 508 */
WFKnight 0:9b3d4731edbb 509 DataWrittenCallbackChain_t &onDataWritten()
WFKnight 0:9b3d4731edbb 510 {
WFKnight 0:9b3d4731edbb 511 return dataWrittenCallChain;
WFKnight 0:9b3d4731edbb 512 }
WFKnight 0:9b3d4731edbb 513
WFKnight 0:9b3d4731edbb 514 /**
WFKnight 0:9b3d4731edbb 515 * Set an event handler that monitors attribute reads from connected clients.
WFKnight 0:9b3d4731edbb 516 *
WFKnight 0:9b3d4731edbb 517 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 518 *
WFKnight 0:9b3d4731edbb 519 * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
WFKnight 0:9b3d4731edbb 520 * else BLE_ERROR_NONE.
WFKnight 0:9b3d4731edbb 521 *
WFKnight 0:9b3d4731edbb 522 * @note This functionality may not be available on all underlying stacks.
WFKnight 0:9b3d4731edbb 523 * Application code may work around that limitation by monitoring read
WFKnight 0:9b3d4731edbb 524 * requests instead of read events.
WFKnight 0:9b3d4731edbb 525 *
WFKnight 0:9b3d4731edbb 526 * @see GattCharacteristic::setReadAuthorizationCallback()
WFKnight 0:9b3d4731edbb 527 * @see isOnDataReadAvailable().
WFKnight 0:9b3d4731edbb 528 *
WFKnight 0:9b3d4731edbb 529 * @attention It is possible to set multiple event handlers. Registered
WFKnight 0:9b3d4731edbb 530 * handlers may be removed with onDataRead().detach(callback).
WFKnight 0:9b3d4731edbb 531 */
WFKnight 0:9b3d4731edbb 532 ble_error_t onDataRead(const DataReadCallback_t &callback)
WFKnight 0:9b3d4731edbb 533 {
WFKnight 0:9b3d4731edbb 534 if (!isOnDataReadAvailable()) {
WFKnight 0:9b3d4731edbb 535 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 536 }
WFKnight 0:9b3d4731edbb 537
WFKnight 0:9b3d4731edbb 538 dataReadCallChain.add(callback);
WFKnight 0:9b3d4731edbb 539 return BLE_ERROR_NONE;
WFKnight 0:9b3d4731edbb 540 }
WFKnight 0:9b3d4731edbb 541
WFKnight 0:9b3d4731edbb 542 /**
WFKnight 0:9b3d4731edbb 543 * Set an event handler that monitors attribute reads from connected clients.
WFKnight 0:9b3d4731edbb 544 *
WFKnight 0:9b3d4731edbb 545 * @param[in] objPtr Pointer to the instance that is used to invoke the
WFKnight 0:9b3d4731edbb 546 * event handler (@p memberPtr).
WFKnight 0:9b3d4731edbb 547 * @param[in] memberPtr Event handler being registered. It is a member
WFKnight 0:9b3d4731edbb 548 * function.
WFKnight 0:9b3d4731edbb 549 */
WFKnight 0:9b3d4731edbb 550 template <typename T>
WFKnight 0:9b3d4731edbb 551 ble_error_t onDataRead(
WFKnight 0:9b3d4731edbb 552 T *objPtr,
WFKnight 0:9b3d4731edbb 553 void (T::*memberPtr)(const GattReadCallbackParams *context)
WFKnight 0:9b3d4731edbb 554 ) {
WFKnight 0:9b3d4731edbb 555 if (!isOnDataReadAvailable()) {
WFKnight 0:9b3d4731edbb 556 return BLE_ERROR_NOT_IMPLEMENTED;
WFKnight 0:9b3d4731edbb 557 }
WFKnight 0:9b3d4731edbb 558
WFKnight 0:9b3d4731edbb 559 dataReadCallChain.add(objPtr, memberPtr);
WFKnight 0:9b3d4731edbb 560 return BLE_ERROR_NONE;
WFKnight 0:9b3d4731edbb 561 }
WFKnight 0:9b3d4731edbb 562
WFKnight 0:9b3d4731edbb 563 /**
WFKnight 0:9b3d4731edbb 564 * Access the callchain of data read event handlers.
WFKnight 0:9b3d4731edbb 565 *
WFKnight 0:9b3d4731edbb 566 * @return A reference to the data read event callbacks chain.
WFKnight 0:9b3d4731edbb 567 *
WFKnight 0:9b3d4731edbb 568 * @note It is possible to register callbacks using
WFKnight 0:9b3d4731edbb 569 * onDataRead().add(callback).
WFKnight 0:9b3d4731edbb 570 *
WFKnight 0:9b3d4731edbb 571 * @note It is possible to unregister callbacks using
WFKnight 0:9b3d4731edbb 572 * onDataRead().detach(callback).
WFKnight 0:9b3d4731edbb 573 */
WFKnight 0:9b3d4731edbb 574 DataReadCallbackChain_t &onDataRead()
WFKnight 0:9b3d4731edbb 575 {
WFKnight 0:9b3d4731edbb 576 return dataReadCallChain;
WFKnight 0:9b3d4731edbb 577 }
WFKnight 0:9b3d4731edbb 578
WFKnight 0:9b3d4731edbb 579 /**
WFKnight 0:9b3d4731edbb 580 * Set an event handler that monitors shutdown or reset of the GattServer.
WFKnight 0:9b3d4731edbb 581 *
WFKnight 0:9b3d4731edbb 582 * The event handler is invoked when the GattServer instance is about
WFKnight 0:9b3d4731edbb 583 * to be shut down. This can result in a call to reset() or BLE::reset().
WFKnight 0:9b3d4731edbb 584 *
WFKnight 0:9b3d4731edbb 585 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 586 *
WFKnight 0:9b3d4731edbb 587 * @note It is possible to set up multiple shutdown event handlers.
WFKnight 0:9b3d4731edbb 588 *
WFKnight 0:9b3d4731edbb 589 * @note It is possible to unregister a callback using
WFKnight 0:9b3d4731edbb 590 * onShutdown().detach(callback)
WFKnight 0:9b3d4731edbb 591 */
WFKnight 0:9b3d4731edbb 592 void onShutdown(const GattServerShutdownCallback_t &callback)
WFKnight 0:9b3d4731edbb 593 {
WFKnight 0:9b3d4731edbb 594 shutdownCallChain.add(callback);
WFKnight 0:9b3d4731edbb 595 }
WFKnight 0:9b3d4731edbb 596
WFKnight 0:9b3d4731edbb 597 /**
WFKnight 0:9b3d4731edbb 598 * Set an event handler that monitors shutdown or reset of the GattServer.
WFKnight 0:9b3d4731edbb 599 *
WFKnight 0:9b3d4731edbb 600 * The event handler is invoked when the GattServer instance is about
WFKnight 0:9b3d4731edbb 601 * to be shut down. This can result of a call to reset() or BLE::reset().
WFKnight 0:9b3d4731edbb 602 *
WFKnight 0:9b3d4731edbb 603 * @param[in] objPtr Pointer to the instance that is used to invoke the
WFKnight 0:9b3d4731edbb 604 * event handler (@p memberPtr).
WFKnight 0:9b3d4731edbb 605 * @param[in] memberPtr Event handler being registered. It is a member
WFKnight 0:9b3d4731edbb 606 * function.
WFKnight 0:9b3d4731edbb 607 */
WFKnight 0:9b3d4731edbb 608 template <typename T>
WFKnight 0:9b3d4731edbb 609 void onShutdown(T *objPtr, void (T::*memberPtr)(const GattServer *))
WFKnight 0:9b3d4731edbb 610 {
WFKnight 0:9b3d4731edbb 611 shutdownCallChain.add(objPtr, memberPtr);
WFKnight 0:9b3d4731edbb 612 }
WFKnight 0:9b3d4731edbb 613
WFKnight 0:9b3d4731edbb 614 /**
WFKnight 0:9b3d4731edbb 615 * Access the callchain of shutdown event handlers.
WFKnight 0:9b3d4731edbb 616 *
WFKnight 0:9b3d4731edbb 617 * @return A reference to the shutdown event callbacks chain.
WFKnight 0:9b3d4731edbb 618 *
WFKnight 0:9b3d4731edbb 619 * @note It is possible to register callbacks using
WFKnight 0:9b3d4731edbb 620 * onShutdown().add(callback).
WFKnight 0:9b3d4731edbb 621 *
WFKnight 0:9b3d4731edbb 622 * @note It is possible to unregister callbacks using
WFKnight 0:9b3d4731edbb 623 * onShutdown().detach(callback).
WFKnight 0:9b3d4731edbb 624 */
WFKnight 0:9b3d4731edbb 625 GattServerShutdownCallbackChain_t& onShutdown()
WFKnight 0:9b3d4731edbb 626 {
WFKnight 0:9b3d4731edbb 627 return shutdownCallChain;
WFKnight 0:9b3d4731edbb 628 }
WFKnight 0:9b3d4731edbb 629
WFKnight 0:9b3d4731edbb 630 /**
WFKnight 0:9b3d4731edbb 631 * Set up an event handler that monitors subscription to characteristic
WFKnight 0:9b3d4731edbb 632 * updates.
WFKnight 0:9b3d4731edbb 633 *
WFKnight 0:9b3d4731edbb 634 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 635 */
WFKnight 0:9b3d4731edbb 636 void onUpdatesEnabled(EventCallback_t callback)
WFKnight 0:9b3d4731edbb 637 {
WFKnight 0:9b3d4731edbb 638 updatesEnabledCallback = callback;
WFKnight 0:9b3d4731edbb 639 }
WFKnight 0:9b3d4731edbb 640
WFKnight 0:9b3d4731edbb 641 /**
WFKnight 0:9b3d4731edbb 642 * Set up an event handler that monitors unsubscription from characteristic
WFKnight 0:9b3d4731edbb 643 * updates.
WFKnight 0:9b3d4731edbb 644 *
WFKnight 0:9b3d4731edbb 645 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 646 */
WFKnight 0:9b3d4731edbb 647 void onUpdatesDisabled(EventCallback_t callback)
WFKnight 0:9b3d4731edbb 648 {
WFKnight 0:9b3d4731edbb 649 updatesDisabledCallback = callback;
WFKnight 0:9b3d4731edbb 650 }
WFKnight 0:9b3d4731edbb 651
WFKnight 0:9b3d4731edbb 652 /**
WFKnight 0:9b3d4731edbb 653 * Set up an event handler that monitors notification acknowledgment.
WFKnight 0:9b3d4731edbb 654 *
WFKnight 0:9b3d4731edbb 655 * The event handler is called when a client sends a confirmation that it has
WFKnight 0:9b3d4731edbb 656 * correctly received a notification from the server.
WFKnight 0:9b3d4731edbb 657 *
WFKnight 0:9b3d4731edbb 658 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 659 */
WFKnight 0:9b3d4731edbb 660 void onConfirmationReceived(EventCallback_t callback)
WFKnight 0:9b3d4731edbb 661 {
WFKnight 0:9b3d4731edbb 662 confirmationReceivedCallback = callback;
WFKnight 0:9b3d4731edbb 663 }
WFKnight 0:9b3d4731edbb 664
WFKnight 0:9b3d4731edbb 665 /* Entry points for the underlying stack to report events back to the user. */
WFKnight 0:9b3d4731edbb 666 protected:
WFKnight 0:9b3d4731edbb 667 /**
WFKnight 0:9b3d4731edbb 668 * Helper function that notifies all registered handlers of an occurrence
WFKnight 0:9b3d4731edbb 669 * of a data written event.
WFKnight 0:9b3d4731edbb 670 *
WFKnight 0:9b3d4731edbb 671 * @attention Vendor implementation must invoke this function after one of
WFKnight 0:9b3d4731edbb 672 * the GattServer attributes has been written.
WFKnight 0:9b3d4731edbb 673 *
WFKnight 0:9b3d4731edbb 674 * @param[in] params The data written parameters passed to the registered
WFKnight 0:9b3d4731edbb 675 * handlers.
WFKnight 0:9b3d4731edbb 676 */
WFKnight 0:9b3d4731edbb 677 void handleDataWrittenEvent(const GattWriteCallbackParams *params)
WFKnight 0:9b3d4731edbb 678 {
WFKnight 0:9b3d4731edbb 679 dataWrittenCallChain.call(params);
WFKnight 0:9b3d4731edbb 680 }
WFKnight 0:9b3d4731edbb 681
WFKnight 0:9b3d4731edbb 682 /**
WFKnight 0:9b3d4731edbb 683 * Helper function that notifies all registered handlers of an occurrence
WFKnight 0:9b3d4731edbb 684 * of a data read event.
WFKnight 0:9b3d4731edbb 685 *
WFKnight 0:9b3d4731edbb 686 * @attention Vendor implementation must invoke this function after one of
WFKnight 0:9b3d4731edbb 687 * the GattServer attributes has been read.
WFKnight 0:9b3d4731edbb 688 *
WFKnight 0:9b3d4731edbb 689 * @param[in] params The data read parameters passed to the registered
WFKnight 0:9b3d4731edbb 690 * handlers.
WFKnight 0:9b3d4731edbb 691 */
WFKnight 0:9b3d4731edbb 692 void handleDataReadEvent(const GattReadCallbackParams *params)
WFKnight 0:9b3d4731edbb 693 {
WFKnight 0:9b3d4731edbb 694 dataReadCallChain.call(params);
WFKnight 0:9b3d4731edbb 695 }
WFKnight 0:9b3d4731edbb 696
WFKnight 0:9b3d4731edbb 697 /**
WFKnight 0:9b3d4731edbb 698 * Helper function that notifies the registered handler of an occurrence
WFKnight 0:9b3d4731edbb 699 * of updates enabled, updates disabled or confirmation received events.
WFKnight 0:9b3d4731edbb 700 *
WFKnight 0:9b3d4731edbb 701 * @attention Vendor implementation must invoke this function when a client
WFKnight 0:9b3d4731edbb 702 * subscribes to characteristic updates, unsubscribes from characteristic
WFKnight 0:9b3d4731edbb 703 * updates or a notification confirmation has been received.
WFKnight 0:9b3d4731edbb 704 *
WFKnight 0:9b3d4731edbb 705 * @param[in] type The type of event that occurred.
WFKnight 0:9b3d4731edbb 706 * @param[in] attributeHandle The handle of the attribute concerned by the
WFKnight 0:9b3d4731edbb 707 * event.
WFKnight 0:9b3d4731edbb 708 */
WFKnight 0:9b3d4731edbb 709 void handleEvent(
WFKnight 0:9b3d4731edbb 710 GattServerEvents::gattEvent_e type,
WFKnight 0:9b3d4731edbb 711 GattAttribute::Handle_t attributeHandle
WFKnight 0:9b3d4731edbb 712 ) {
WFKnight 0:9b3d4731edbb 713 switch (type) {
WFKnight 0:9b3d4731edbb 714 case GattServerEvents::GATT_EVENT_UPDATES_ENABLED:
WFKnight 0:9b3d4731edbb 715 if (updatesEnabledCallback) {
WFKnight 0:9b3d4731edbb 716 updatesEnabledCallback(attributeHandle);
WFKnight 0:9b3d4731edbb 717 }
WFKnight 0:9b3d4731edbb 718 break;
WFKnight 0:9b3d4731edbb 719 case GattServerEvents::GATT_EVENT_UPDATES_DISABLED:
WFKnight 0:9b3d4731edbb 720 if (updatesDisabledCallback) {
WFKnight 0:9b3d4731edbb 721 updatesDisabledCallback(attributeHandle);
WFKnight 0:9b3d4731edbb 722 }
WFKnight 0:9b3d4731edbb 723 break;
WFKnight 0:9b3d4731edbb 724 case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED:
WFKnight 0:9b3d4731edbb 725 if (confirmationReceivedCallback) {
WFKnight 0:9b3d4731edbb 726 confirmationReceivedCallback(attributeHandle);
WFKnight 0:9b3d4731edbb 727 }
WFKnight 0:9b3d4731edbb 728 break;
WFKnight 0:9b3d4731edbb 729 default:
WFKnight 0:9b3d4731edbb 730 break;
WFKnight 0:9b3d4731edbb 731 }
WFKnight 0:9b3d4731edbb 732 }
WFKnight 0:9b3d4731edbb 733
WFKnight 0:9b3d4731edbb 734 /**
WFKnight 0:9b3d4731edbb 735 * Helper function that notifies all registered handlers of an occurrence
WFKnight 0:9b3d4731edbb 736 * of a data sent event.
WFKnight 0:9b3d4731edbb 737 *
WFKnight 0:9b3d4731edbb 738 * @attention Vendor implementation must invoke this function after the
WFKnight 0:9b3d4731edbb 739 * emission of a notification or an indication.
WFKnight 0:9b3d4731edbb 740 *
WFKnight 0:9b3d4731edbb 741 * @param[in] count Number of packets sent.
WFKnight 0:9b3d4731edbb 742 */
WFKnight 0:9b3d4731edbb 743 void handleDataSentEvent(unsigned count)
WFKnight 0:9b3d4731edbb 744 {
WFKnight 0:9b3d4731edbb 745 dataSentCallChain.call(count);
WFKnight 0:9b3d4731edbb 746 }
WFKnight 0:9b3d4731edbb 747
WFKnight 0:9b3d4731edbb 748 public:
WFKnight 0:9b3d4731edbb 749 /**
WFKnight 0:9b3d4731edbb 750 * Shut down the GattServer instance.
WFKnight 0:9b3d4731edbb 751 *
WFKnight 0:9b3d4731edbb 752 * This function notifies all event handlers listening for shutdown events
WFKnight 0:9b3d4731edbb 753 * that the GattServer is about to be shut down; then it clears all
WFKnight 0:9b3d4731edbb 754 * GattServer state.
WFKnight 0:9b3d4731edbb 755 *
WFKnight 0:9b3d4731edbb 756 * @note This function is meant to be overridden in the platform-specific
WFKnight 0:9b3d4731edbb 757 * subclass. Overides must call the parent function before any cleanup.
WFKnight 0:9b3d4731edbb 758 *
WFKnight 0:9b3d4731edbb 759 * @return BLE_ERROR_NONE on success.
WFKnight 0:9b3d4731edbb 760 */
WFKnight 0:9b3d4731edbb 761 virtual ble_error_t reset(void)
WFKnight 0:9b3d4731edbb 762 {
WFKnight 0:9b3d4731edbb 763 /* Notify that the instance is about to shutdown */
WFKnight 0:9b3d4731edbb 764 shutdownCallChain.call(this);
WFKnight 0:9b3d4731edbb 765 shutdownCallChain.clear();
WFKnight 0:9b3d4731edbb 766
WFKnight 0:9b3d4731edbb 767 serviceCount = 0;
WFKnight 0:9b3d4731edbb 768 characteristicCount = 0;
WFKnight 0:9b3d4731edbb 769
WFKnight 0:9b3d4731edbb 770 dataSentCallChain.clear();
WFKnight 0:9b3d4731edbb 771 dataWrittenCallChain.clear();
WFKnight 0:9b3d4731edbb 772 dataReadCallChain.clear();
WFKnight 0:9b3d4731edbb 773 updatesEnabledCallback = NULL;
WFKnight 0:9b3d4731edbb 774 updatesDisabledCallback = NULL;
WFKnight 0:9b3d4731edbb 775 confirmationReceivedCallback = NULL;
WFKnight 0:9b3d4731edbb 776
WFKnight 0:9b3d4731edbb 777 return BLE_ERROR_NONE;
WFKnight 0:9b3d4731edbb 778 }
WFKnight 0:9b3d4731edbb 779
WFKnight 0:9b3d4731edbb 780 protected:
WFKnight 0:9b3d4731edbb 781 /**
WFKnight 0:9b3d4731edbb 782 * The total number of services added to the ATT table.
WFKnight 0:9b3d4731edbb 783 */
WFKnight 0:9b3d4731edbb 784 uint8_t serviceCount;
WFKnight 0:9b3d4731edbb 785
WFKnight 0:9b3d4731edbb 786 /**
WFKnight 0:9b3d4731edbb 787 * The total number of characteristics added to the ATT table.
WFKnight 0:9b3d4731edbb 788 */
WFKnight 0:9b3d4731edbb 789 uint8_t characteristicCount;
WFKnight 0:9b3d4731edbb 790
WFKnight 0:9b3d4731edbb 791 private:
WFKnight 0:9b3d4731edbb 792 /**
WFKnight 0:9b3d4731edbb 793 * Callchain containing all registered callback handlers for data sent
WFKnight 0:9b3d4731edbb 794 * events.
WFKnight 0:9b3d4731edbb 795 */
WFKnight 0:9b3d4731edbb 796 DataSentCallbackChain_t dataSentCallChain;
WFKnight 0:9b3d4731edbb 797
WFKnight 0:9b3d4731edbb 798 /**
WFKnight 0:9b3d4731edbb 799 * Callchain containing all registered callback handlers for data written
WFKnight 0:9b3d4731edbb 800 * events.
WFKnight 0:9b3d4731edbb 801 */
WFKnight 0:9b3d4731edbb 802 DataWrittenCallbackChain_t dataWrittenCallChain;
WFKnight 0:9b3d4731edbb 803
WFKnight 0:9b3d4731edbb 804 /**
WFKnight 0:9b3d4731edbb 805 * Callchain containing all registered callback handlers for data read
WFKnight 0:9b3d4731edbb 806 * events.
WFKnight 0:9b3d4731edbb 807 */
WFKnight 0:9b3d4731edbb 808 DataReadCallbackChain_t dataReadCallChain;
WFKnight 0:9b3d4731edbb 809
WFKnight 0:9b3d4731edbb 810 /**
WFKnight 0:9b3d4731edbb 811 * Callchain containing all registered callback handlers for shutdown
WFKnight 0:9b3d4731edbb 812 * events.
WFKnight 0:9b3d4731edbb 813 */
WFKnight 0:9b3d4731edbb 814 GattServerShutdownCallbackChain_t shutdownCallChain;
WFKnight 0:9b3d4731edbb 815
WFKnight 0:9b3d4731edbb 816 /**
WFKnight 0:9b3d4731edbb 817 * The registered callback handler for updates enabled events.
WFKnight 0:9b3d4731edbb 818 */
WFKnight 0:9b3d4731edbb 819 EventCallback_t updatesEnabledCallback;
WFKnight 0:9b3d4731edbb 820
WFKnight 0:9b3d4731edbb 821 /**
WFKnight 0:9b3d4731edbb 822 * The registered callback handler for updates disabled events.
WFKnight 0:9b3d4731edbb 823 */
WFKnight 0:9b3d4731edbb 824 EventCallback_t updatesDisabledCallback;
WFKnight 0:9b3d4731edbb 825
WFKnight 0:9b3d4731edbb 826 /**
WFKnight 0:9b3d4731edbb 827 * The registered callback handler for confirmation received events.
WFKnight 0:9b3d4731edbb 828 */
WFKnight 0:9b3d4731edbb 829 EventCallback_t confirmationReceivedCallback;
WFKnight 0:9b3d4731edbb 830
WFKnight 0:9b3d4731edbb 831 private:
WFKnight 0:9b3d4731edbb 832 /* Disallow copy and assignment. */
WFKnight 0:9b3d4731edbb 833 GattServer(const GattServer &);
WFKnight 0:9b3d4731edbb 834 GattServer& operator=(const GattServer &);
WFKnight 0:9b3d4731edbb 835 };
WFKnight 0:9b3d4731edbb 836
WFKnight 0:9b3d4731edbb 837 /**
WFKnight 0:9b3d4731edbb 838 * @}
WFKnight 0:9b3d4731edbb 839 * @}
WFKnight 0:9b3d4731edbb 840 * @}
WFKnight 0:9b3d4731edbb 841 */
WFKnight 0:9b3d4731edbb 842
WFKnight 0:9b3d4731edbb 843 #endif /* ifndef MBED_GATT_SERVER_H__ */