Lightly modified version of the BLE stack, that doesn't bring up a DFUService by default... as we have our own.

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Wed Apr 15 09:05:11 2015 +0100
Revision:
341:8a104d9d80c1
Parent:
336:896e159d3af6
Child:
342:152bd9c825d6
Synchronized with git rev 8b631fc0
Author: Rohit Grover
Release 0.3.2
=============

Enhancements
~~~~~~~~~~~~

* Add new API: onRadioNotification(). Radio Notification is a feature that
enables ACTIVE and INACTIVE (nACTIVE) signals from the stack that notify the
application when the radio is in use. The ACTIVE signal is sent before the
Radio Event starts. The nACTIVE signal is sent at the end of the Radio
Event. These signals can be used by the application programmer to
synchronize application logic with radio activity. For example, the ACTIVE
signal can be used to shut off external devices to manage peak current drawn
during periods when the radio is on, or to trigger sensor data collection
for transmission in the Radio Event.

* merge contents of several .cpp files under common/* into .h files under public/*.
e.g. GattService, GapAdvertisingData, UUID.

* Add a note to the documentation for setAdvertisingInterval() to warn users
about the new units for 'interval'.

* get rid of a few deprecated APIs: setAdvertisingData() and startAdvertising().

Bugfixes
~~~~~~~~

none.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 257:7a50601356cc 1 /* mbed Microcontroller Library
rgrover1 257:7a50601356cc 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 257:7a50601356cc 3 *
rgrover1 257:7a50601356cc 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 257:7a50601356cc 5 * you may not use this file except in compliance with the License.
rgrover1 257:7a50601356cc 6 * You may obtain a copy of the License at
rgrover1 257:7a50601356cc 7 *
rgrover1 257:7a50601356cc 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 257:7a50601356cc 9 *
rgrover1 257:7a50601356cc 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 257:7a50601356cc 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 257:7a50601356cc 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 257:7a50601356cc 13 * See the License for the specific language governing permissions and
rgrover1 257:7a50601356cc 14 * limitations under the License.
rgrover1 257:7a50601356cc 15 */
rgrover1 257:7a50601356cc 16
rgrover1 257:7a50601356cc 17 #ifndef __BLE_DEVICE__
rgrover1 257:7a50601356cc 18 #define __BLE_DEVICE__
rgrover1 257:7a50601356cc 19
rgrover1 257:7a50601356cc 20 #include "blecommon.h"
rgrover1 257:7a50601356cc 21 #include "Gap.h"
rgrover1 257:7a50601356cc 22 #include "GattServer.h"
rgrover1 257:7a50601356cc 23 #include "BLEDeviceInstanceBase.h"
rgrover1 257:7a50601356cc 24
rgrover1 257:7a50601356cc 25 /**
rgrover1 257:7a50601356cc 26 * The base class used to abstract away BLE capable radio transceivers or SOCs,
rgrover1 257:7a50601356cc 27 * to enable this BLE API to work with any radio transparently.
rgrover1 257:7a50601356cc 28 */
rgrover1 257:7a50601356cc 29 class BLEDevice
rgrover1 257:7a50601356cc 30 {
rgrover1 257:7a50601356cc 31 public:
rgrover1 257:7a50601356cc 32 /**
rgrover1 257:7a50601356cc 33 * Initialize the BLE controller. This should be called before using
rgrover1 257:7a50601356cc 34 * anything else in the BLE_API.
rgrover1 257:7a50601356cc 35 */
rgrover1 257:7a50601356cc 36 ble_error_t init();
rgrover1 257:7a50601356cc 37 ble_error_t reset(void);
rgrover1 257:7a50601356cc 38
rgrover1 257:7a50601356cc 39 /**
rgrover1 257:7a50601356cc 40 * Purge the BLE stack of GATT and GAP state. init() must be called afterwards to re-instate services and GAP state.
rgrover1 257:7a50601356cc 41 */
rgrover1 257:7a50601356cc 42 ble_error_t shutdown(void);
rgrover1 257:7a50601356cc 43
rgrover1 257:7a50601356cc 44 /* GAP specific APIs */
rgrover1 257:7a50601356cc 45 public:
rgrover1 257:7a50601356cc 46 /**
rgrover1 257:7a50601356cc 47 * Set the BTLE MAC address and type.
rgrover1 257:7a50601356cc 48 * @return BLE_ERROR_NONE on success.
rgrover1 257:7a50601356cc 49 */
rgrover1 257:7a50601356cc 50 ble_error_t setAddress(Gap::addr_type_t type, const Gap::address_t address);
rgrover1 257:7a50601356cc 51
rgrover1 257:7a50601356cc 52 /**
rgrover1 257:7a50601356cc 53 * Fetch the BTLE MAC address and type.
rgrover1 257:7a50601356cc 54 * @return BLE_ERROR_NONE on success.
rgrover1 257:7a50601356cc 55 */
rgrover1 257:7a50601356cc 56 ble_error_t getAddress(Gap::addr_type_t *typeP, Gap::address_t address);
rgrover1 257:7a50601356cc 57
rgrover1 257:7a50601356cc 58 /**
rgrover1 257:7a50601356cc 59 * @param[in] advType
rgrover1 257:7a50601356cc 60 * The GAP advertising mode to use for this device. Valid
rgrover1 257:7a50601356cc 61 * values are defined in AdvertisingType:
rgrover1 257:7a50601356cc 62 *
rgrover1 257:7a50601356cc 63 * \par ADV_NON_CONNECTABLE_UNDIRECTED
rgrover1 257:7a50601356cc 64 * All connections to the peripheral device will be refused.
rgrover1 257:7a50601356cc 65 *
rgrover1 257:7a50601356cc 66 * \par ADV_CONNECTABLE_DIRECTED
rgrover1 257:7a50601356cc 67 * Only connections from a pre-defined central device will be
rgrover1 257:7a50601356cc 68 * accepted.
rgrover1 257:7a50601356cc 69 *
rgrover1 257:7a50601356cc 70 * \par ADV_CONNECTABLE_UNDIRECTED
rgrover1 257:7a50601356cc 71 * Any central device can connect to this peripheral.
rgrover1 257:7a50601356cc 72 *
rgrover1 257:7a50601356cc 73 * \par ADV_SCANNABLE_UNDIRECTED
rgrover1 300:d9a39f759a6a 74 * Include support for Scan Response payloads.
rgrover1 257:7a50601356cc 75 *
rgrover1 257:7a50601356cc 76 * \par
rgrover1 257:7a50601356cc 77 * See Bluetooth Core Specification 4.0 (Vol. 3), Part C,
rgrover1 257:7a50601356cc 78 * Section 9.3 and Core Specification 4.0 (Vol. 6), Part B,
rgrover1 257:7a50601356cc 79 * Section 2.3.1 for further information on GAP connection
rgrover1 257:7a50601356cc 80 * modes
rgrover1 257:7a50601356cc 81 */
rgrover1 257:7a50601356cc 82 void setAdvertisingType(GapAdvertisingParams::AdvertisingType);
rgrover1 257:7a50601356cc 83
rgrover1 257:7a50601356cc 84 /**
rgrover1 257:7a50601356cc 85 * @param[in] interval
rgrover1 325:501ad8b8bbe5 86 * Advertising interval in units of milliseconds. Advertising
rgrover1 325:501ad8b8bbe5 87 * is disabled if interval is 0. If interval is smaller than
rgrover1 325:501ad8b8bbe5 88 * the minimum supported value, then the minimum supported
rgrover1 325:501ad8b8bbe5 89 * value is used instead.
rgrover1 257:7a50601356cc 90 *
rgrover1 257:7a50601356cc 91 * \par
rgrover1 257:7a50601356cc 92 * Decreasing this value will allow central devices to detect
rgrover1 257:7a50601356cc 93 * your peripheral faster at the expense of more power being
rgrover1 257:7a50601356cc 94 * used by the radio due to the higher data transmit rate.
rgrover1 257:7a50601356cc 95 *
rgrover1 257:7a50601356cc 96 * \par
rgrover1 257:7a50601356cc 97 * This field must be set to 0 if connectionMode is equal
rgrover1 257:7a50601356cc 98 * to ADV_CONNECTABLE_DIRECTED
rgrover1 257:7a50601356cc 99 *
rgrover1 257:7a50601356cc 100 * \par
rgrover1 257:7a50601356cc 101 * See Bluetooth Core Specification, Vol 3., Part C,
rgrover1 257:7a50601356cc 102 * Appendix A for suggested advertising intervals.
rgrover1 334:6bc1223306b9 103 *
rgrover1 334:6bc1223306b9 104 * @Note: [WARNING] This API previously used 0.625ms as the unit for its
rgrover1 334:6bc1223306b9 105 * 'interval' argument. That required an explicit conversion from
rgrover1 334:6bc1223306b9 106 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is
rgrover1 334:6bc1223306b9 107 * no longer required as the new units are milliseconds. Any application
rgrover1 334:6bc1223306b9 108 * code depending on the old semantics would need to be updated accordingly.
rgrover1 257:7a50601356cc 109 */
rgrover1 257:7a50601356cc 110 void setAdvertisingInterval(uint16_t interval);
rgrover1 257:7a50601356cc 111
rgrover1 257:7a50601356cc 112 /**
rgrover1 325:501ad8b8bbe5 113 * @return Minimum Advertising interval in milliseconds.
rgrover1 325:501ad8b8bbe5 114 */
rgrover1 325:501ad8b8bbe5 115 uint16_t getMinAdvertisingInterval(void) const;
rgrover1 325:501ad8b8bbe5 116 /**
rgrover1 325:501ad8b8bbe5 117 * @return Minimum Advertising interval in milliseconds for non connectible mode.
rgrover1 325:501ad8b8bbe5 118 */
rgrover1 325:501ad8b8bbe5 119 uint16_t getMinNonConnectableAdvertisingInterval(void) const;
rgrover1 325:501ad8b8bbe5 120 /**
rgrover1 325:501ad8b8bbe5 121 * @return Maximum Advertising interval in milliseconds.
rgrover1 325:501ad8b8bbe5 122 */
rgrover1 325:501ad8b8bbe5 123 uint16_t getMaxAdvertisingInterval(void) const;
rgrover1 325:501ad8b8bbe5 124
rgrover1 325:501ad8b8bbe5 125 /**
rgrover1 257:7a50601356cc 126 * @param[in] timeout
rgrover1 257:7a50601356cc 127 * Advertising timeout between 0x1 and 0x3FFF (1 and 16383)
rgrover1 257:7a50601356cc 128 * in seconds. Enter 0 to disable the advertising timeout.
rgrover1 257:7a50601356cc 129 */
rgrover1 257:7a50601356cc 130 void setAdvertisingTimeout(uint16_t timeout);
rgrover1 257:7a50601356cc 131
rgrover1 257:7a50601356cc 132 /**
rgrover1 257:7a50601356cc 133 * Please refer to the APIs above.
rgrover1 257:7a50601356cc 134 */
rgrover1 257:7a50601356cc 135 void setAdvertisingParams(const GapAdvertisingParams &advParams);
rgrover1 257:7a50601356cc 136
rgrover1 257:7a50601356cc 137 /**
rgrover1 257:7a50601356cc 138 * This API is typically used as an internal helper to udpate the transport
rgrover1 257:7a50601356cc 139 * backend with advertising data before starting to advertise. It may also
rgrover1 257:7a50601356cc 140 * be explicity used to dynamically reset the accumulated advertising
rgrover1 257:7a50601356cc 141 * payload and scanResponse; to do this, the application can clear and re-
rgrover1 257:7a50601356cc 142 * accumulate a new advertising payload (and scanResponse) before using this
rgrover1 257:7a50601356cc 143 * API.
rgrover1 257:7a50601356cc 144 */
rgrover1 257:7a50601356cc 145 ble_error_t setAdvertisingPayload(void);
rgrover1 257:7a50601356cc 146
rgrover1 257:7a50601356cc 147 /**
rgrover1 257:7a50601356cc 148 * Reset any advertising payload prepared from prior calls to
rgrover1 257:7a50601356cc 149 * accumulateAdvertisingPayload().
rgrover1 257:7a50601356cc 150 */
rgrover1 257:7a50601356cc 151 void clearAdvertisingPayload(void);
rgrover1 257:7a50601356cc 152
rgrover1 257:7a50601356cc 153 /**
rgrover1 257:7a50601356cc 154 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 257:7a50601356cc 155 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 257:7a50601356cc 156 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 257:7a50601356cc 157 * small.
rgrover1 257:7a50601356cc 158 *
rgrover1 257:7a50601356cc 159 * @param flags
rgrover1 257:7a50601356cc 160 * The flags to be added. Multiple flags may be specified in
rgrover1 257:7a50601356cc 161 * combination.
rgrover1 257:7a50601356cc 162 */
rgrover1 257:7a50601356cc 163 ble_error_t accumulateAdvertisingPayload(uint8_t flags);
rgrover1 257:7a50601356cc 164
rgrover1 257:7a50601356cc 165 /**
rgrover1 257:7a50601356cc 166 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 257:7a50601356cc 167 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 257:7a50601356cc 168 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 257:7a50601356cc 169 * small.
rgrover1 257:7a50601356cc 170 *
rgrover1 257:7a50601356cc 171 * @param app
rgrover1 257:7a50601356cc 172 * The appearance of the peripheral.
rgrover1 257:7a50601356cc 173 */
rgrover1 257:7a50601356cc 174 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app);
rgrover1 257:7a50601356cc 175
rgrover1 257:7a50601356cc 176 /**
rgrover1 257:7a50601356cc 177 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 257:7a50601356cc 178 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 257:7a50601356cc 179 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 257:7a50601356cc 180 * small.
rgrover1 257:7a50601356cc 181 *
rgrover1 257:7a50601356cc 182 * @param app
rgrover1 257:7a50601356cc 183 * The max transmit power to be used by the controller. This is
rgrover1 257:7a50601356cc 184 * only a hint.
rgrover1 257:7a50601356cc 185 */
rgrover1 257:7a50601356cc 186 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power);
rgrover1 257:7a50601356cc 187
rgrover1 257:7a50601356cc 188 /**
rgrover1 257:7a50601356cc 189 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 257:7a50601356cc 190 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 257:7a50601356cc 191 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 257:7a50601356cc 192 * advertising payload proves to be too small.
rgrover1 257:7a50601356cc 193 *
rgrover1 257:7a50601356cc 194 * @param type The type which describes the variable length data.
rgrover1 257:7a50601356cc 195 * @param data data bytes.
rgrover1 257:7a50601356cc 196 * @param len length of data.
rgrover1 257:7a50601356cc 197 */
rgrover1 257:7a50601356cc 198 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len);
rgrover1 257:7a50601356cc 199
rgrover1 257:7a50601356cc 200 /**
rgrover1 257:7a50601356cc 201 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 257:7a50601356cc 202 * scanResponse payload.
rgrover1 257:7a50601356cc 203 *
rgrover1 257:7a50601356cc 204 * @param type The type which describes the variable length data.
rgrover1 257:7a50601356cc 205 * @param data data bytes.
rgrover1 257:7a50601356cc 206 * @param len length of data.
rgrover1 257:7a50601356cc 207 */
rgrover1 257:7a50601356cc 208 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len);
rgrover1 257:7a50601356cc 209
rgrover1 257:7a50601356cc 210 /**
rgrover1 257:7a50601356cc 211 * Start advertising (GAP Discoverable, Connectable modes, Broadcast
rgrover1 257:7a50601356cc 212 * Procedure).
rgrover1 257:7a50601356cc 213 */
rgrover1 257:7a50601356cc 214 ble_error_t startAdvertising(void);
rgrover1 257:7a50601356cc 215
rgrover1 257:7a50601356cc 216 /**
rgrover1 257:7a50601356cc 217 * Stop advertising (GAP Discoverable, Connectable modes, Broadcast
rgrover1 257:7a50601356cc 218 * Procedure).
rgrover1 257:7a50601356cc 219 */
rgrover1 257:7a50601356cc 220 ble_error_t stopAdvertising(void);
rgrover1 257:7a50601356cc 221
rgrover1 335:dea9e14b7ddc 222 /**
rgrover1 335:dea9e14b7ddc 223 * This call initiates the disconnection procedure, and its completion will
rgrover1 335:dea9e14b7ddc 224 * be communicated to the application with an invocation of the
rgrover1 335:dea9e14b7ddc 225 * onDisconnection callback.
rgrover1 335:dea9e14b7ddc 226 *
rgrover1 335:dea9e14b7ddc 227 * @param reason
rgrover1 335:dea9e14b7ddc 228 * The reason for disconnection to be sent back to the peer.
rgrover1 335:dea9e14b7ddc 229 */
rgrover1 257:7a50601356cc 230 ble_error_t disconnect(Gap::DisconnectionReason_t reason);
rgrover1 257:7a50601356cc 231
rgrover1 257:7a50601356cc 232 /* APIs to set GAP callbacks. */
rgrover1 257:7a50601356cc 233 void onTimeout(Gap::EventCallback_t timeoutCallback);
rgrover1 257:7a50601356cc 234
rgrover1 257:7a50601356cc 235 void onConnection(Gap::ConnectionEventCallback_t connectionCallback);
rgrover1 257:7a50601356cc 236 /**
rgrover1 257:7a50601356cc 237 * Used to setup a callback for GAP disconnection.
rgrover1 257:7a50601356cc 238 */
rgrover1 257:7a50601356cc 239 void onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback);
rgrover1 257:7a50601356cc 240
rgrover1 257:7a50601356cc 241 /**
rgrover1 257:7a50601356cc 242 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 257:7a50601356cc 243 * callbacks receive no context and are therefore different from the
rgrover1 257:7a50601356cc 244 * onDisconnection callback.
rgrover1 257:7a50601356cc 245 */
rgrover1 257:7a50601356cc 246 template<typename T>
rgrover1 257:7a50601356cc 247 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void));
rgrover1 257:7a50601356cc 248
rgrover1 257:7a50601356cc 249 /**
rgrover1 261:b275bfc773b9 250 * Add a callback for the GATT event DATA_SENT (which is triggered when
rgrover1 261:b275bfc773b9 251 * updates are sent out by GATT in the form of notifications).
rgrover1 259:a95264ad705c 252 *
rgrover1 259:a95264ad705c 253 * @Note: it is possible to chain together multiple onDataSent callbacks
rgrover1 259:a95264ad705c 254 * (potentially from different modules of an application) to receive updates
rgrover1 260:ea7f9f14cc15 255 * to characteristics.
rgrover1 259:a95264ad705c 256 *
rgrover1 259:a95264ad705c 257 * @Note: it is also possible to setup a callback into a member function of
rgrover1 259:a95264ad705c 258 * some object.
rgrover1 257:7a50601356cc 259 */
rgrover1 259:a95264ad705c 260 void onDataSent(void (*callback)(unsigned count));
rgrover1 259:a95264ad705c 261 template <typename T> void onDataSent(T * objPtr, void (T::*memberPtr)(unsigned count));
rgrover1 257:7a50601356cc 262
rgrover1 257:7a50601356cc 263 /**
rgrover1 257:7a50601356cc 264 * Setup a callback for when a characteristic has its value updated by a
rgrover1 257:7a50601356cc 265 * client.
rgrover1 257:7a50601356cc 266 *
rgrover1 257:7a50601356cc 267 * @Note: it is possible to chain together multiple onDataWritten callbacks
rgrover1 257:7a50601356cc 268 * (potentially from different modules of an application) to receive updates
rgrover1 257:7a50601356cc 269 * to characteristics. Many services, such as DFU and UART add their own
rgrover1 257:7a50601356cc 270 * onDataWritten callbacks behind the scenes to trap interesting events.
rgrover1 257:7a50601356cc 271 *
rgrover1 257:7a50601356cc 272 * @Note: it is also possible to setup a callback into a member function of
rgrover1 257:7a50601356cc 273 * some object.
rgrover1 257:7a50601356cc 274 */
rgrover1 257:7a50601356cc 275 void onDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP));
rgrover1 257:7a50601356cc 276 template <typename T> void onDataWritten(T * objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context));
rgrover1 257:7a50601356cc 277
rgrover1 300:d9a39f759a6a 278 /**
rgrover1 300:d9a39f759a6a 279 * Setup a callback for when a characteristic is being read by a client.
rgrover1 300:d9a39f759a6a 280 *
rgrover1 300:d9a39f759a6a 281 * @Note: this functionality may not be available on all underlying stacks.
rgrover1 300:d9a39f759a6a 282 * You could use GattCharacteristic::setReadAuthorizationCallback() as an
rgrover1 300:d9a39f759a6a 283 * alternative.
rgrover1 300:d9a39f759a6a 284 *
rgrover1 300:d9a39f759a6a 285 * @Note: it is possible to chain together multiple onDataRead callbacks
rgrover1 300:d9a39f759a6a 286 * (potentially from different modules of an application) to receive updates
rgrover1 300:d9a39f759a6a 287 * to characteristics. Services may add their own onDataRead callbacks
rgrover1 300:d9a39f759a6a 288 * behind the scenes to trap interesting events.
rgrover1 300:d9a39f759a6a 289 *
rgrover1 300:d9a39f759a6a 290 * @Note: it is also possible to setup a callback into a member function of
rgrover1 300:d9a39f759a6a 291 * some object.
rgrover1 300:d9a39f759a6a 292 *
rgrover1 300:d9a39f759a6a 293 * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
rgrover1 300:d9a39f759a6a 294 * else BLE_ERROR_NONE.
rgrover1 300:d9a39f759a6a 295 */
rgrover1 300:d9a39f759a6a 296 ble_error_t onDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP));
rgrover1 300:d9a39f759a6a 297 template <typename T> ble_error_t onDataRead(T * objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context));
rgrover1 300:d9a39f759a6a 298
rgrover1 257:7a50601356cc 299 void onUpdatesEnabled(GattServer::EventCallback_t callback);
rgrover1 257:7a50601356cc 300 void onUpdatesDisabled(GattServer::EventCallback_t callback);
rgrover1 257:7a50601356cc 301 void onConfirmationReceived(GattServer::EventCallback_t callback);
rgrover1 257:7a50601356cc 302
rgrover1 257:7a50601356cc 303 /**
rgrover1 341:8a104d9d80c1 304 * Radio Notification is a feature that enables ACTIVE and INACTIVE
rgrover1 341:8a104d9d80c1 305 * (nACTIVE) signals from the stack that notify the application when the
rgrover1 341:8a104d9d80c1 306 * radio is in use. The signal is sent using software interrupt.
rgrover1 341:8a104d9d80c1 307 *
rgrover1 341:8a104d9d80c1 308 * The ACTIVE signal is sent before the Radio Event starts. The nACTIVE
rgrover1 341:8a104d9d80c1 309 * signal is sent at the end of the Radio Event. These signals can be used
rgrover1 341:8a104d9d80c1 310 * by the application programmer to synchronize application logic with radio
rgrover1 341:8a104d9d80c1 311 * activity. For example, the ACTIVE signal can be used to shut off external
rgrover1 341:8a104d9d80c1 312 * devices to manage peak current drawn during periods when the radio is on,
rgrover1 341:8a104d9d80c1 313 * or to trigger sensor data collection for transmission in the Radio Event.
rgrover1 341:8a104d9d80c1 314 *
rgrover1 341:8a104d9d80c1 315 * @param callback
rgrover1 341:8a104d9d80c1 316 * The application handler to be invoked in response to a radio
rgrover1 341:8a104d9d80c1 317 * ACTIVE/INACTIVE event.
rgrover1 341:8a104d9d80c1 318 */
rgrover1 341:8a104d9d80c1 319 void onRadioNotification(Gap::RadioNotificationEventCallback_t callback);
rgrover1 341:8a104d9d80c1 320
rgrover1 341:8a104d9d80c1 321 /**
rgrover1 257:7a50601356cc 322 * Add a service declaration to the local server ATT table. Also add the
rgrover1 257:7a50601356cc 323 * characteristics contained within.
rgrover1 257:7a50601356cc 324 */
rgrover1 257:7a50601356cc 325 ble_error_t addService(GattService &service);
rgrover1 257:7a50601356cc 326
rgrover1 336:896e159d3af6 327 /**
rgrover1 336:896e159d3af6 328 * Returns the current GAP state of the device using a bitmask which
rgrover1 336:896e159d3af6 329 * describes whether the device is advertising and/or connected.
rgrover1 336:896e159d3af6 330 */
rgrover1 257:7a50601356cc 331 Gap::GapState_t getGapState(void) const;
rgrover1 257:7a50601356cc 332
rgrover1 257:7a50601356cc 333 /**
rgrover1 257:7a50601356cc 334 * @param[in/out] lengthP
rgrover1 257:7a50601356cc 335 * input: Length in bytes to be read,
rgrover1 257:7a50601356cc 336 * output: Total length of attribute value upon successful return.
rgrover1 257:7a50601356cc 337 */
rgrover1 328:1fd12f67ed7a 338 ble_error_t readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP);
rgrover1 257:7a50601356cc 339
rgrover1 257:7a50601356cc 340 /**
rgrover1 257:7a50601356cc 341 * @param localOnly
rgrover1 257:7a50601356cc 342 * Only update the characteristic locally regardless of notify/indicate flags in the CCCD.
rgrover1 257:7a50601356cc 343 */
rgrover1 328:1fd12f67ed7a 344 ble_error_t updateCharacteristicValue(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false);
rgrover1 257:7a50601356cc 345
rgrover1 257:7a50601356cc 346 /**
rgrover1 257:7a50601356cc 347 * Yield control to the BLE stack or to other tasks waiting for events. This
rgrover1 257:7a50601356cc 348 * is a sleep function which will return when there is an application
rgrover1 257:7a50601356cc 349 * specific interrupt, but the MCU might wake up several times before
rgrover1 257:7a50601356cc 350 * returning (to service the stack). This is not always interchangeable with
rgrover1 257:7a50601356cc 351 * WFE().
rgrover1 257:7a50601356cc 352 */
rgrover1 257:7a50601356cc 353 void waitForEvent(void);
rgrover1 257:7a50601356cc 354
rgrover1 257:7a50601356cc 355 ble_error_t getPreferredConnectionParams(Gap::ConnectionParams_t *params);
rgrover1 257:7a50601356cc 356 ble_error_t setPreferredConnectionParams(const Gap::ConnectionParams_t *params);
rgrover1 257:7a50601356cc 357 ble_error_t updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params);
rgrover1 257:7a50601356cc 358
rgrover1 257:7a50601356cc 359 /**
rgrover1 257:7a50601356cc 360 * This call allows the application to get the BLE stack version information.
rgrover1 257:7a50601356cc 361 *
rgrover1 257:7a50601356cc 362 * @return A pointer to a const string representing the version.
rgrover1 257:7a50601356cc 363 * Note: The string is owned by the BLE_API.
rgrover1 257:7a50601356cc 364 */
rgrover1 257:7a50601356cc 365 const char *getVersion(void);
rgrover1 257:7a50601356cc 366
rgrover1 257:7a50601356cc 367 /**
rgrover1 257:7a50601356cc 368 * Set the device name characteristic in the GAP service.
rgrover1 257:7a50601356cc 369 * @param deviceName The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
rgrover1 257:7a50601356cc 370 */
rgrover1 257:7a50601356cc 371 ble_error_t setDeviceName(const uint8_t *deviceName);
rgrover1 257:7a50601356cc 372
rgrover1 257:7a50601356cc 373 /**
rgrover1 257:7a50601356cc 374 * Get the value of the device name characteristic in the GAP service.
rgrover1 257:7a50601356cc 375 * @param[out] deviceName Pointer to an empty buffer where the UTF-8 *non NULL-
rgrover1 257:7a50601356cc 376 * terminated* string will be placed. Set this
rgrover1 257:7a50601356cc 377 * value to NULL in order to obtain the deviceName-length
rgrover1 257:7a50601356cc 378 * from the 'length' parameter.
rgrover1 257:7a50601356cc 379 *
rgrover1 257:7a50601356cc 380 * @param[in/out] lengthP (on input) Length of the buffer pointed to by deviceName;
rgrover1 257:7a50601356cc 381 * (on output) the complete device name length (without the
rgrover1 257:7a50601356cc 382 * null terminator).
rgrover1 257:7a50601356cc 383 *
rgrover1 257:7a50601356cc 384 * @note If the device name is longer than the size of the supplied buffer,
rgrover1 257:7a50601356cc 385 * length will return the complete device name length,
rgrover1 257:7a50601356cc 386 * and not the number of bytes actually returned in deviceName.
rgrover1 257:7a50601356cc 387 * The application may use this information to retry with a suitable buffer size.
rgrover1 257:7a50601356cc 388 *
rgrover1 257:7a50601356cc 389 * Sample use:
rgrover1 257:7a50601356cc 390 * uint8_t deviceName[20];
rgrover1 257:7a50601356cc 391 * unsigned length = sizeof(deviceName);
rgrover1 257:7a50601356cc 392 * ble.getDeviceName(deviceName, &length);
rgrover1 257:7a50601356cc 393 * if (length < sizeof(deviceName)) {
rgrover1 257:7a50601356cc 394 * deviceName[length] = 0;
rgrover1 257:7a50601356cc 395 * }
rgrover1 257:7a50601356cc 396 * DEBUG("length: %u, deviceName: %s\r\n", length, deviceName);
rgrover1 257:7a50601356cc 397 */
rgrover1 257:7a50601356cc 398 ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP);
rgrover1 257:7a50601356cc 399
rgrover1 257:7a50601356cc 400 /**
rgrover1 257:7a50601356cc 401 * Set the appearance characteristic in the GAP service.
rgrover1 257:7a50601356cc 402 * @param[in] appearance The new value for the device-appearance.
rgrover1 257:7a50601356cc 403 */
rgrover1 257:7a50601356cc 404 ble_error_t setAppearance(uint16_t appearance);
rgrover1 257:7a50601356cc 405
rgrover1 257:7a50601356cc 406 /**
rgrover1 257:7a50601356cc 407 * Set the appearance characteristic in the GAP service.
rgrover1 257:7a50601356cc 408 * @param[out] appearance The new value for the device-appearance.
rgrover1 257:7a50601356cc 409 */
rgrover1 257:7a50601356cc 410 ble_error_t getAppearance(uint16_t *appearanceP);
rgrover1 257:7a50601356cc 411
rgrover1 257:7a50601356cc 412 /**
rgrover1 257:7a50601356cc 413 * Set the radio's transmit power.
rgrover1 257:7a50601356cc 414 * @param[in] txPower Radio transmit power in dBm.
rgrover1 257:7a50601356cc 415 */
rgrover1 257:7a50601356cc 416 ble_error_t setTxPower(int8_t txPower);
rgrover1 257:7a50601356cc 417
rgrover1 305:71367f7cd078 418 /**
rgrover1 305:71367f7cd078 419 * Query the underlying stack for permitted arguments for setTxPower().
rgrover1 305:71367f7cd078 420 *
rgrover1 305:71367f7cd078 421 * @param[out] valueArrayPP
rgrover1 305:71367f7cd078 422 * Out parameter to receive the immutable array of Tx values.
rgrover1 305:71367f7cd078 423 * @param[out] countP
rgrover1 305:71367f7cd078 424 * Out parameter to receive the array's size.
rgrover1 305:71367f7cd078 425 */
rgrover1 305:71367f7cd078 426 void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP);
rgrover1 305:71367f7cd078 427
rgrover1 257:7a50601356cc 428 public:
rgrover1 257:7a50601356cc 429 BLEDevice() : transport(createBLEDeviceInstance()), advParams(), advPayload(), scanResponse(), needToSetAdvPayload(true) {
rgrover1 257:7a50601356cc 430 advPayload.clear();
rgrover1 257:7a50601356cc 431 scanResponse.clear();
rgrover1 257:7a50601356cc 432 }
rgrover1 257:7a50601356cc 433
rgrover1 257:7a50601356cc 434 private:
rgrover1 257:7a50601356cc 435 BLEDeviceInstanceBase *const transport; /* the device specific backend */
rgrover1 257:7a50601356cc 436
rgrover1 257:7a50601356cc 437 GapAdvertisingParams advParams;
rgrover1 257:7a50601356cc 438 GapAdvertisingData advPayload;
rgrover1 257:7a50601356cc 439 GapAdvertisingData scanResponse;
rgrover1 257:7a50601356cc 440
rgrover1 257:7a50601356cc 441 /* Accumulation of AD structures in the advertisement payload should
rgrover1 257:7a50601356cc 442 * eventually result in a call to the target's setAdvertisingData() before
rgrover1 257:7a50601356cc 443 * the server begins advertising. This flag marks the status of the pending update.*/
rgrover1 257:7a50601356cc 444 bool needToSetAdvPayload;
rgrover1 257:7a50601356cc 445 };
rgrover1 257:7a50601356cc 446
rgrover1 257:7a50601356cc 447 /* BLEDevice methods. Most of these simply forward the calls to the underlying
rgrover1 257:7a50601356cc 448 * transport.*/
rgrover1 257:7a50601356cc 449
rgrover1 257:7a50601356cc 450 inline ble_error_t
rgrover1 257:7a50601356cc 451 BLEDevice::reset(void)
rgrover1 257:7a50601356cc 452 {
rgrover1 257:7a50601356cc 453 return transport->reset();
rgrover1 257:7a50601356cc 454 }
rgrover1 257:7a50601356cc 455
rgrover1 257:7a50601356cc 456 inline ble_error_t
rgrover1 257:7a50601356cc 457 BLEDevice::shutdown(void)
rgrover1 257:7a50601356cc 458 {
rgrover1 257:7a50601356cc 459 clearAdvertisingPayload();
rgrover1 257:7a50601356cc 460 return transport->shutdown();
rgrover1 257:7a50601356cc 461 }
rgrover1 257:7a50601356cc 462
rgrover1 257:7a50601356cc 463 inline ble_error_t
rgrover1 257:7a50601356cc 464 BLEDevice::setAddress(Gap::addr_type_t type, const Gap::address_t address)
rgrover1 257:7a50601356cc 465 {
rgrover1 257:7a50601356cc 466 return transport->getGap().setAddress(type, address);
rgrover1 257:7a50601356cc 467 }
rgrover1 257:7a50601356cc 468
rgrover1 257:7a50601356cc 469 inline ble_error_t
rgrover1 257:7a50601356cc 470 BLEDevice::getAddress(Gap::addr_type_t *typeP, Gap::address_t address)
rgrover1 257:7a50601356cc 471 {
rgrover1 257:7a50601356cc 472 return transport->getGap().getAddress(typeP, address);
rgrover1 257:7a50601356cc 473 }
rgrover1 257:7a50601356cc 474
rgrover1 257:7a50601356cc 475 inline void
rgrover1 257:7a50601356cc 476 BLEDevice::setAdvertisingType(GapAdvertisingParams::AdvertisingType advType)
rgrover1 257:7a50601356cc 477 {
rgrover1 257:7a50601356cc 478 advParams.setAdvertisingType(advType);
rgrover1 257:7a50601356cc 479 }
rgrover1 257:7a50601356cc 480
rgrover1 257:7a50601356cc 481 inline void
rgrover1 257:7a50601356cc 482 BLEDevice::setAdvertisingInterval(uint16_t interval)
rgrover1 257:7a50601356cc 483 {
rgrover1 325:501ad8b8bbe5 484 if (interval == 0) {
rgrover1 325:501ad8b8bbe5 485 stopAdvertising();
rgrover1 325:501ad8b8bbe5 486 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 325:501ad8b8bbe5 487 interval = getMinAdvertisingInterval();
rgrover1 325:501ad8b8bbe5 488 }
rgrover1 325:501ad8b8bbe5 489 advParams.setInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 325:501ad8b8bbe5 490 }
rgrover1 325:501ad8b8bbe5 491
rgrover1 325:501ad8b8bbe5 492 inline uint16_t
rgrover1 325:501ad8b8bbe5 493 BLEDevice::getMinAdvertisingInterval(void) const {
rgrover1 325:501ad8b8bbe5 494 return transport->getGap().getMinAdvertisingInterval();
rgrover1 325:501ad8b8bbe5 495 }
rgrover1 325:501ad8b8bbe5 496
rgrover1 325:501ad8b8bbe5 497 inline uint16_t
rgrover1 325:501ad8b8bbe5 498 BLEDevice::getMinNonConnectableAdvertisingInterval(void) const {
rgrover1 325:501ad8b8bbe5 499 return transport->getGap().getMinNonConnectableAdvertisingInterval();
rgrover1 325:501ad8b8bbe5 500 }
rgrover1 325:501ad8b8bbe5 501
rgrover1 325:501ad8b8bbe5 502 inline uint16_t
rgrover1 325:501ad8b8bbe5 503 BLEDevice::getMaxAdvertisingInterval(void) const {
rgrover1 325:501ad8b8bbe5 504 return transport->getGap().getMaxAdvertisingInterval();
rgrover1 257:7a50601356cc 505 }
rgrover1 257:7a50601356cc 506
rgrover1 257:7a50601356cc 507 inline void
rgrover1 257:7a50601356cc 508 BLEDevice::setAdvertisingTimeout(uint16_t timeout)
rgrover1 257:7a50601356cc 509 {
rgrover1 257:7a50601356cc 510 advParams.setTimeout(timeout);
rgrover1 257:7a50601356cc 511 }
rgrover1 257:7a50601356cc 512
rgrover1 257:7a50601356cc 513 inline void
rgrover1 257:7a50601356cc 514 BLEDevice::setAdvertisingParams(const GapAdvertisingParams &newAdvParams)
rgrover1 257:7a50601356cc 515 {
rgrover1 257:7a50601356cc 516 advParams = newAdvParams;
rgrover1 257:7a50601356cc 517 }
rgrover1 257:7a50601356cc 518
rgrover1 257:7a50601356cc 519 inline void
rgrover1 257:7a50601356cc 520 BLEDevice::clearAdvertisingPayload(void)
rgrover1 257:7a50601356cc 521 {
rgrover1 257:7a50601356cc 522 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 523 advPayload.clear();
rgrover1 257:7a50601356cc 524 }
rgrover1 257:7a50601356cc 525
rgrover1 257:7a50601356cc 526 inline ble_error_t
rgrover1 257:7a50601356cc 527 BLEDevice::accumulateAdvertisingPayload(uint8_t flags)
rgrover1 257:7a50601356cc 528 {
rgrover1 257:7a50601356cc 529 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 530 return advPayload.addFlags(flags);
rgrover1 257:7a50601356cc 531 }
rgrover1 257:7a50601356cc 532
rgrover1 257:7a50601356cc 533 inline ble_error_t
rgrover1 257:7a50601356cc 534 BLEDevice::accumulateAdvertisingPayload(GapAdvertisingData::Appearance app)
rgrover1 257:7a50601356cc 535 {
rgrover1 257:7a50601356cc 536 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 537 transport->getGap().setAppearance(app);
rgrover1 257:7a50601356cc 538 return advPayload.addAppearance(app);
rgrover1 257:7a50601356cc 539 }
rgrover1 257:7a50601356cc 540
rgrover1 257:7a50601356cc 541 inline ble_error_t
rgrover1 257:7a50601356cc 542 BLEDevice::accumulateAdvertisingPayloadTxPower(int8_t txPower)
rgrover1 257:7a50601356cc 543 {
rgrover1 257:7a50601356cc 544 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 545 return advPayload.addTxPower(txPower);
rgrover1 257:7a50601356cc 546 }
rgrover1 257:7a50601356cc 547
rgrover1 257:7a50601356cc 548 inline ble_error_t
rgrover1 257:7a50601356cc 549 BLEDevice::accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len)
rgrover1 257:7a50601356cc 550 {
rgrover1 257:7a50601356cc 551 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 552 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 257:7a50601356cc 553 transport->getGap().setDeviceName(data);
rgrover1 257:7a50601356cc 554 }
rgrover1 257:7a50601356cc 555 return advPayload.addData(type, data, len);
rgrover1 257:7a50601356cc 556 }
rgrover1 257:7a50601356cc 557
rgrover1 257:7a50601356cc 558 inline ble_error_t
rgrover1 257:7a50601356cc 559 BLEDevice::accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len)
rgrover1 257:7a50601356cc 560 {
rgrover1 257:7a50601356cc 561 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 562 return scanResponse.addData(type, data, len);
rgrover1 257:7a50601356cc 563 }
rgrover1 257:7a50601356cc 564
rgrover1 257:7a50601356cc 565 inline ble_error_t
rgrover1 257:7a50601356cc 566 BLEDevice::setAdvertisingPayload(void) {
rgrover1 257:7a50601356cc 567 needToSetAdvPayload = false;
rgrover1 257:7a50601356cc 568 return transport->getGap().setAdvertisingData(advPayload, scanResponse);
rgrover1 257:7a50601356cc 569 }
rgrover1 257:7a50601356cc 570
rgrover1 257:7a50601356cc 571 inline ble_error_t
rgrover1 257:7a50601356cc 572 BLEDevice::startAdvertising(void)
rgrover1 257:7a50601356cc 573 {
rgrover1 257:7a50601356cc 574 ble_error_t rc;
rgrover1 257:7a50601356cc 575 if ((rc = transport->getGattServer().initializeGATTDatabase()) != BLE_ERROR_NONE) {
rgrover1 257:7a50601356cc 576 return rc;
rgrover1 257:7a50601356cc 577 }
rgrover1 257:7a50601356cc 578 if (needToSetAdvPayload) {
rgrover1 257:7a50601356cc 579 if ((rc = setAdvertisingPayload()) != BLE_ERROR_NONE) {
rgrover1 257:7a50601356cc 580 return rc;
rgrover1 257:7a50601356cc 581 }
rgrover1 257:7a50601356cc 582 }
rgrover1 257:7a50601356cc 583
rgrover1 257:7a50601356cc 584 return transport->getGap().startAdvertising(advParams);
rgrover1 257:7a50601356cc 585 }
rgrover1 257:7a50601356cc 586
rgrover1 257:7a50601356cc 587 inline ble_error_t
rgrover1 257:7a50601356cc 588 BLEDevice::stopAdvertising(void)
rgrover1 257:7a50601356cc 589 {
rgrover1 257:7a50601356cc 590 return transport->getGap().stopAdvertising();
rgrover1 257:7a50601356cc 591 }
rgrover1 257:7a50601356cc 592
rgrover1 257:7a50601356cc 593 inline ble_error_t
rgrover1 257:7a50601356cc 594 BLEDevice::disconnect(Gap::DisconnectionReason_t reason)
rgrover1 257:7a50601356cc 595 {
rgrover1 257:7a50601356cc 596 return transport->getGap().disconnect(reason);
rgrover1 257:7a50601356cc 597 }
rgrover1 257:7a50601356cc 598
rgrover1 257:7a50601356cc 599 inline void
rgrover1 257:7a50601356cc 600 BLEDevice::onTimeout(Gap::EventCallback_t timeoutCallback)
rgrover1 257:7a50601356cc 601 {
rgrover1 257:7a50601356cc 602 transport->getGap().setOnTimeout(timeoutCallback);
rgrover1 257:7a50601356cc 603 }
rgrover1 257:7a50601356cc 604
rgrover1 257:7a50601356cc 605 inline void
rgrover1 257:7a50601356cc 606 BLEDevice::onConnection(Gap::ConnectionEventCallback_t connectionCallback)
rgrover1 257:7a50601356cc 607 {
rgrover1 257:7a50601356cc 608 transport->getGap().setOnConnection(connectionCallback);
rgrover1 257:7a50601356cc 609 }
rgrover1 257:7a50601356cc 610
rgrover1 257:7a50601356cc 611 inline void
rgrover1 257:7a50601356cc 612 BLEDevice::onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback)
rgrover1 257:7a50601356cc 613 {
rgrover1 257:7a50601356cc 614 transport->getGap().setOnDisconnection(disconnectionCallback);
rgrover1 257:7a50601356cc 615 }
rgrover1 257:7a50601356cc 616
rgrover1 257:7a50601356cc 617 template<typename T>
rgrover1 257:7a50601356cc 618 inline void
rgrover1 257:7a50601356cc 619 BLEDevice::addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {
rgrover1 257:7a50601356cc 620 transport->getGap().addToDisconnectionCallChain(tptr, mptr);
rgrover1 257:7a50601356cc 621 }
rgrover1 257:7a50601356cc 622
rgrover1 257:7a50601356cc 623 inline void
rgrover1 259:a95264ad705c 624 BLEDevice::onDataSent(void (*callback)(unsigned count)) {
rgrover1 257:7a50601356cc 625 transport->getGattServer().setOnDataSent(callback);
rgrover1 257:7a50601356cc 626 }
rgrover1 257:7a50601356cc 627
rgrover1 259:a95264ad705c 628 template <typename T> inline void
rgrover1 259:a95264ad705c 629 BLEDevice::onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
rgrover1 259:a95264ad705c 630 transport->getGattServer().setOnDataSent(objPtr, memberPtr);
rgrover1 259:a95264ad705c 631 }
rgrover1 259:a95264ad705c 632
rgrover1 257:7a50601356cc 633 inline void
rgrover1 257:7a50601356cc 634 BLEDevice::onDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP)) {
rgrover1 257:7a50601356cc 635 transport->getGattServer().setOnDataWritten(callback);
rgrover1 257:7a50601356cc 636 }
rgrover1 257:7a50601356cc 637
rgrover1 257:7a50601356cc 638 template <typename T> inline void
rgrover1 257:7a50601356cc 639 BLEDevice::onDataWritten(T *objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context)) {
rgrover1 257:7a50601356cc 640 transport->getGattServer().setOnDataWritten(objPtr, memberPtr);
rgrover1 257:7a50601356cc 641 }
rgrover1 257:7a50601356cc 642
rgrover1 300:d9a39f759a6a 643 inline ble_error_t
rgrover1 300:d9a39f759a6a 644 BLEDevice::onDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP)) {
rgrover1 300:d9a39f759a6a 645 return transport->getGattServer().setOnDataRead(callback);
rgrover1 300:d9a39f759a6a 646 }
rgrover1 300:d9a39f759a6a 647
rgrover1 300:d9a39f759a6a 648 template <typename T> inline ble_error_t
rgrover1 300:d9a39f759a6a 649 BLEDevice::onDataRead(T *objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context)) {
rgrover1 300:d9a39f759a6a 650 return transport->getGattServer().setOnDataRead(objPtr, memberPtr);
rgrover1 300:d9a39f759a6a 651 }
rgrover1 300:d9a39f759a6a 652
rgrover1 257:7a50601356cc 653 inline void
rgrover1 257:7a50601356cc 654 BLEDevice::onUpdatesEnabled(GattServer::EventCallback_t callback)
rgrover1 257:7a50601356cc 655 {
rgrover1 257:7a50601356cc 656 transport->getGattServer().setOnUpdatesEnabled(callback);
rgrover1 257:7a50601356cc 657 }
rgrover1 257:7a50601356cc 658
rgrover1 257:7a50601356cc 659 inline void
rgrover1 257:7a50601356cc 660 BLEDevice::onUpdatesDisabled(GattServer::EventCallback_t callback)
rgrover1 257:7a50601356cc 661 {
rgrover1 257:7a50601356cc 662 transport->getGattServer().setOnUpdatesDisabled(callback);
rgrover1 257:7a50601356cc 663 }
rgrover1 257:7a50601356cc 664
rgrover1 257:7a50601356cc 665 inline void
rgrover1 257:7a50601356cc 666 BLEDevice::onConfirmationReceived(GattServer::EventCallback_t callback)
rgrover1 257:7a50601356cc 667 {
rgrover1 257:7a50601356cc 668 transport->getGattServer().setOnConfirmationReceived(callback);
rgrover1 257:7a50601356cc 669 }
rgrover1 257:7a50601356cc 670
rgrover1 341:8a104d9d80c1 671 inline void
rgrover1 341:8a104d9d80c1 672 BLEDevice::onRadioNotification(Gap::RadioNotificationEventCallback_t callback)
rgrover1 341:8a104d9d80c1 673 {
rgrover1 341:8a104d9d80c1 674 transport->getGap().setOnRadioNotification(callback);
rgrover1 341:8a104d9d80c1 675 }
rgrover1 341:8a104d9d80c1 676
rgrover1 257:7a50601356cc 677 inline ble_error_t
rgrover1 257:7a50601356cc 678 BLEDevice::addService(GattService &service)
rgrover1 257:7a50601356cc 679 {
rgrover1 257:7a50601356cc 680 return transport->getGattServer().addService(service);
rgrover1 257:7a50601356cc 681 }
rgrover1 257:7a50601356cc 682
rgrover1 257:7a50601356cc 683 inline Gap::GapState_t
rgrover1 257:7a50601356cc 684 BLEDevice::getGapState(void) const
rgrover1 257:7a50601356cc 685 {
rgrover1 257:7a50601356cc 686 return transport->getGap().getState();
rgrover1 257:7a50601356cc 687 }
rgrover1 257:7a50601356cc 688
rgrover1 328:1fd12f67ed7a 689 inline ble_error_t BLEDevice::readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP)
rgrover1 257:7a50601356cc 690 {
rgrover1 328:1fd12f67ed7a 691 return transport->getGattServer().readValue(attributeHandle, buffer, lengthP);
rgrover1 257:7a50601356cc 692 }
rgrover1 257:7a50601356cc 693
rgrover1 257:7a50601356cc 694 inline ble_error_t
rgrover1 328:1fd12f67ed7a 695 BLEDevice::updateCharacteristicValue(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly)
rgrover1 257:7a50601356cc 696 {
rgrover1 328:1fd12f67ed7a 697 return transport->getGattServer().updateValue(attributeHandle, const_cast<uint8_t *>(value), size, localOnly);
rgrover1 257:7a50601356cc 698 }
rgrover1 257:7a50601356cc 699
rgrover1 257:7a50601356cc 700 inline void
rgrover1 257:7a50601356cc 701 BLEDevice::waitForEvent(void)
rgrover1 257:7a50601356cc 702 {
rgrover1 257:7a50601356cc 703 transport->waitForEvent();
rgrover1 257:7a50601356cc 704 }
rgrover1 257:7a50601356cc 705
rgrover1 257:7a50601356cc 706 inline ble_error_t
rgrover1 257:7a50601356cc 707 BLEDevice::getPreferredConnectionParams(Gap::ConnectionParams_t *params)
rgrover1 257:7a50601356cc 708 {
rgrover1 257:7a50601356cc 709 return transport->getGap().getPreferredConnectionParams(params);
rgrover1 257:7a50601356cc 710 }
rgrover1 257:7a50601356cc 711
rgrover1 257:7a50601356cc 712 inline ble_error_t
rgrover1 257:7a50601356cc 713 BLEDevice::setPreferredConnectionParams(const Gap::ConnectionParams_t *params)
rgrover1 257:7a50601356cc 714 {
rgrover1 257:7a50601356cc 715 return transport->getGap().setPreferredConnectionParams(params);
rgrover1 257:7a50601356cc 716 }
rgrover1 257:7a50601356cc 717
rgrover1 257:7a50601356cc 718 inline ble_error_t
rgrover1 257:7a50601356cc 719 BLEDevice::updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) {
rgrover1 257:7a50601356cc 720 return transport->getGap().updateConnectionParams(handle, params);
rgrover1 257:7a50601356cc 721 }
rgrover1 257:7a50601356cc 722
rgrover1 257:7a50601356cc 723 inline const char *
rgrover1 257:7a50601356cc 724 BLEDevice::getVersion(void)
rgrover1 257:7a50601356cc 725 {
rgrover1 257:7a50601356cc 726 return transport->getVersion();
rgrover1 257:7a50601356cc 727 }
rgrover1 257:7a50601356cc 728
rgrover1 257:7a50601356cc 729 inline ble_error_t
rgrover1 257:7a50601356cc 730 BLEDevice::setDeviceName(const uint8_t *deviceName)
rgrover1 257:7a50601356cc 731 {
rgrover1 257:7a50601356cc 732 return transport->getGap().setDeviceName(deviceName);
rgrover1 257:7a50601356cc 733 }
rgrover1 257:7a50601356cc 734
rgrover1 257:7a50601356cc 735 inline ble_error_t
rgrover1 257:7a50601356cc 736 BLEDevice::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
rgrover1 257:7a50601356cc 737 {
rgrover1 257:7a50601356cc 738 return transport->getGap().getDeviceName(deviceName, lengthP);
rgrover1 257:7a50601356cc 739 }
rgrover1 257:7a50601356cc 740
rgrover1 257:7a50601356cc 741 inline ble_error_t
rgrover1 257:7a50601356cc 742 BLEDevice::setAppearance(uint16_t appearance)
rgrover1 257:7a50601356cc 743 {
rgrover1 257:7a50601356cc 744 return transport->getGap().setAppearance(appearance);
rgrover1 257:7a50601356cc 745 }
rgrover1 257:7a50601356cc 746
rgrover1 257:7a50601356cc 747 inline ble_error_t
rgrover1 257:7a50601356cc 748 BLEDevice::getAppearance(uint16_t *appearanceP)
rgrover1 257:7a50601356cc 749 {
rgrover1 257:7a50601356cc 750 return transport->getGap().getAppearance(appearanceP);
rgrover1 257:7a50601356cc 751 }
rgrover1 257:7a50601356cc 752
rgrover1 257:7a50601356cc 753 inline ble_error_t
rgrover1 257:7a50601356cc 754 BLEDevice::setTxPower(int8_t txPower)
rgrover1 257:7a50601356cc 755 {
rgrover1 257:7a50601356cc 756 return transport->setTxPower(txPower);
rgrover1 257:7a50601356cc 757 }
rgrover1 257:7a50601356cc 758
rgrover1 305:71367f7cd078 759 inline void
rgrover1 305:71367f7cd078 760 BLEDevice::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP)
rgrover1 305:71367f7cd078 761 {
rgrover1 305:71367f7cd078 762 transport->getPermittedTxPowerValues(valueArrayPP, countP);
rgrover1 305:71367f7cd078 763 }
rgrover1 305:71367f7cd078 764
rgrover1 257:7a50601356cc 765 #endif // ifndef __BLE_DEVICE__