Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

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