abc
Fork of BLE_API by
public/BLEDevice.h@341:8a104d9d80c1, 2015-04-15 (annotated)
- 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?
User | Revision | Line number | New 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__ |