Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
BLE.h
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #ifndef __BLE_H__ 00018 #define __BLE_H__ 00019 00020 #include "blecommon.h" 00021 #include "Gap.h" 00022 #include "GattServer.h" 00023 #include "GattClient.h" 00024 00025 #include "ble/FunctionPointerWithContext.h" 00026 00027 #ifdef YOTTA_CFG_MBED_OS 00028 #include "mbed-drivers/mbed_error.h" 00029 #else 00030 #include "mbed_error.h" 00031 #endif 00032 00033 /* Forward declaration for the implementation class */ 00034 class BLEInstanceBase; 00035 00036 /** 00037 * The base class used to abstract away BLE-capable radio transceivers or SOCs, 00038 * so that the BLE API can work with any radio transparently. 00039 */ 00040 class BLE 00041 { 00042 public: 00043 typedef unsigned InstanceID_t; /**< The type returned by BLE::getInstanceID(). */ 00044 00045 /** 00046 * Parameters provided to the callback registered by onEventsToProcess 00047 * when there is events to process. 00048 */ 00049 struct OnEventsToProcessCallbackContext { 00050 /** 00051 * The ble instance which have events to process. 00052 */ 00053 BLE& ble; 00054 }; 00055 00056 /** 00057 * Callback type used by the onEventsToProcess function. 00058 */ 00059 typedef FunctionPointerWithContext<OnEventsToProcessCallbackContext*> OnEventsToProcessCallback_t; 00060 00061 /** 00062 * The context provided to init-completion-callbacks (see init() below). 00063 * 00064 * @param ble 00065 * A reference to the BLE instance being initialized. 00066 * @param error 00067 * Captures the result of initialization. It is set to 00068 * BLE_ERROR_NONE if initialization completed successfully. Else 00069 * the error value is implementation specific. 00070 */ 00071 struct InitializationCompleteCallbackContext { 00072 BLE& ble; /**< Reference to the BLE object that has been initialized */ 00073 ble_error_t error; /**< Error status of the initialization. It is set to BLE_ERROR_NONE if initialization completed successfully. */ 00074 }; 00075 00076 /** 00077 * The signature for function-pointer like callbacks for initialization-completion. 00078 * 00079 * @note There are two versions of init(). In addition to the simple 00080 * function-pointer, init() can also take a <Object, member> tuple as its 00081 * callback target. In case of the latter, the following declaration doesn't apply. 00082 */ 00083 typedef void (*InitializationCompleteCallback_t)(InitializationCompleteCallbackContext *context); 00084 00085 /** 00086 * Initialize the BLE controller. This should be called before using 00087 * anything else in the BLE API. 00088 * 00089 * init() hands control to the underlying BLE module to accomplish 00090 * initialization. This initialization may tacitly depend on other hardware 00091 * setup (such as clocks or power-modes) that happens early on during 00092 * system startup. It may not be safe to call init() from a global static 00093 * context where ordering is compiler-specific and can't be guaranteed - it 00094 * is safe to call BLE::init() from within main(). 00095 * 00096 * @param initCompleteCallback 00097 * A callback for when initialization completes for a BLE 00098 * instance. This is an optional parameter; if no callback is 00099 * set up the application can still determine the status of 00100 * initialization using BLE::hasInitialized() (see below). 00101 * 00102 * @return BLE_ERROR_NONE if the initialization procedure was started 00103 * successfully. 00104 * 00105 * @note If init() returns BLE_ERROR_NONE, the underlying stack must invoke 00106 * the initialization completion callback at some point. 00107 * 00108 * @note Nearly all BLE APIs would return 00109 * BLE_ERROR_INITIALIZATION_INCOMPLETE if used on an instance before the 00110 * corresponding transport is initialized. 00111 * 00112 * @note There are two versions of init(). In addition to the simple 00113 * function-pointer, init() can also take an <Object, member> tuple as its 00114 * callback target. 00115 */ 00116 ble_error_t init(InitializationCompleteCallback_t initCompleteCallback = NULL) { 00117 FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(initCompleteCallback); 00118 return initImplementation(callback); 00119 } 00120 00121 /** 00122 * An alternate declaration for init(). This one takes an <Object, member> tuple as its 00123 * callback target. 00124 */ 00125 template<typename T> 00126 ble_error_t init(T *object, void (T::*initCompleteCallback)(InitializationCompleteCallbackContext *context)) { 00127 FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(object, initCompleteCallback); 00128 return initImplementation(callback); 00129 } 00130 00131 /** 00132 * @return true if initialization has completed for the underlying BLE 00133 * transport. 00134 * 00135 * The application can set up a callback to signal completion of 00136 * initialization when using init(). Otherwise, this method can be used to 00137 * poll the state of initialization. 00138 */ 00139 bool hasInitialized (void) const; 00140 00141 /** 00142 * Purge the BLE stack of GATT and GAP state. init() must be called 00143 * afterwards to re-instate services and GAP state. This API offers a way to 00144 * repopulate the GATT database with new services and characteristics. 00145 */ 00146 ble_error_t shutdown(void); 00147 00148 /** 00149 * This call allows the application to get the BLE stack version information. 00150 * 00151 * @return A pointer to a const string representing the version. 00152 * 00153 * @note The string returned is owned by BLE API. 00154 */ 00155 const char *getVersion(void); 00156 00157 /** 00158 * Accessor to Gap. All Gap related functionality requires 00159 * going through this accessor. 00160 * 00161 * @return A reference to a Gap object associated to this BLE instance. 00162 */ 00163 Gap &gap(); 00164 00165 /** 00166 * A const alternative to gap(). 00167 * 00168 * @return A const reference to a Gap object associated to this BLE instance. 00169 */ 00170 const Gap &gap() const; 00171 00172 /** 00173 * Accessor to GattServer. All GattServer related functionality requires 00174 * going through this accessor. 00175 * 00176 * @return A reference to a GattServer object associated to this BLE instance. 00177 */ 00178 GattServer& gattServer(); 00179 00180 /** 00181 * A const alternative to gattServer(). 00182 * 00183 * @return A const reference to a GattServer object associated to this BLE instance. 00184 */ 00185 const GattServer& gattServer() const; 00186 00187 /** 00188 * Accessors to GattClient. All GattClient related functionality requires going 00189 * through this accessor. 00190 * 00191 * @return A reference to a GattClient object associated to this BLE instance. 00192 */ 00193 GattClient& gattClient(); 00194 00195 /** 00196 * A const alternative to gattClient(). 00197 * 00198 * @return A const reference to a GattClient object associated to this BLE instance. 00199 */ 00200 const GattClient& gattClient() const; 00201 00202 /** 00203 * Accessors to SecurityManager. All SecurityManager related functionality requires 00204 * going through this accessor. 00205 * 00206 * @return A reference to a SecurityManager object associated to this BLE instance. 00207 */ 00208 SecurityManager& securityManager(); 00209 00210 /** 00211 * A const alternative to securityManager(). 00212 * 00213 * @return A const reference to a SecurityManager object associated to this BLE instance. 00214 */ 00215 const SecurityManager& securityManager() const; 00216 00217 /** 00218 * Yield control to the BLE stack or to other tasks waiting for events. This 00219 * is a sleep function that will return when there is an application-specific 00220 * interrupt, but the MCU might wake up several times before 00221 * returning (to service the stack). This is not always interchangeable with 00222 * WFE(). 00223 */ 00224 void waitForEvent(void); 00225 00226 public: 00227 /** 00228 * The value of the BLE::InstanceID_t for the default BLE instance. 00229 */ 00230 static const InstanceID_t DEFAULT_INSTANCE = 0; 00231 #ifndef YOTTA_CFG_BLE_INSTANCES_COUNT 00232 /** 00233 * The number of permitted BLE instances for the application. 00234 */ 00235 static const InstanceID_t NUM_INSTANCES = 1; 00236 #else 00237 /** 00238 * The number of permitted BLE instances for the application. 00239 */ 00240 static const InstanceID_t NUM_INSTANCES = YOTTA_CFG_BLE_INSTANCES_COUNT; 00241 #endif 00242 00243 /** 00244 * Get a reference to the BLE singleton corresponding to a given interface. 00245 * There is a static array of BLE singletons. 00246 * 00247 * @note Calling Instance() is preferred over constructing a BLE object 00248 * directly, as it returns references to singletons. 00249 * 00250 * @param[in] id 00251 * Instance-ID. This should be less than NUM_INSTANCES 00252 * for the returned BLE singleton to be useful. 00253 * 00254 * @return A reference to a single object. 00255 */ 00256 static BLE &Instance(InstanceID_t id = DEFAULT_INSTANCE); 00257 00258 /** 00259 * Constructor for a handle to a BLE instance (the BLE stack). BLE handles 00260 * are thin wrappers around a transport object (that is, ptr. to 00261 * BLEInstanceBase). 00262 * 00263 * It is better to create BLE objects as singletons accessed through the 00264 * Instance() method. If multiple BLE handles are constructed for the same 00265 * interface (using this constructor), they will share the same underlying 00266 * transport object. 00267 */ 00268 BLE(InstanceID_t instanceID = DEFAULT_INSTANCE); 00269 00270 /** 00271 * Fetch the ID of a BLE instance. Typically there would only be the DEFAULT_INSTANCE. 00272 */ 00273 InstanceID_t getInstanceID(void) const { 00274 return instanceID; 00275 } 00276 00277 /* 00278 * Deprecation alert! 00279 * All of the following are deprecated and may be dropped in a future 00280 * release. Documentation should refer to alternative APIs. 00281 */ 00282 00283 /* GAP specific APIs. */ 00284 public: 00285 /** 00286 * Set the BTLE MAC address and type. 00287 * @return BLE_ERROR_NONE on success. 00288 * 00289 * @deprecated You should use the parallel API from Gap directly, refer to 00290 * Gap::setAddress(). A former call to 00291 * ble.setAddress(...) should be replaced with 00292 * ble.gap().setAddress(...). 00293 */ 00294 ble_error_t setAddress(BLEProtocol::AddressType_t type, const BLEProtocol::AddressBytes_t address) { 00295 return gap().setAddress(type, address); 00296 } 00297 00298 /** 00299 * Fetch the Bluetooth Low Energy MAC address and type. 00300 * @return BLE_ERROR_NONE on success. 00301 * 00302 * @deprecated You should use the parallel API from Gap directly, refer to 00303 * Gap::getAddress(). A former call to 00304 * ble.getAddress(...) should be replaced with 00305 * ble.gap().getAddress(...). 00306 */ 00307 ble_error_t getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address) { 00308 return gap().getAddress(typeP, address); 00309 } 00310 00311 /** 00312 * Set the GAP advertising mode to use for this device. 00313 * 00314 * @deprecated You should use the parallel API from Gap directly, refer to 00315 * Gap::setAdvertisingType(). A former call to 00316 * ble.setAdvertisingType(...) should be replaced with 00317 * ble.gap().setAdvertisingType(...). 00318 */ 00319 void setAdvertisingType(GapAdvertisingParams::AdvertisingType advType) { 00320 gap().setAdvertisingType(advType); 00321 } 00322 00323 /** 00324 * @param[in] interval 00325 * Advertising interval in units of milliseconds. Advertising 00326 * is disabled if interval is 0. If interval is smaller than 00327 * the minimum supported value, then the minimum supported 00328 * value is used instead. This minimum value can be discovered 00329 * using getMinAdvertisingInterval(). 00330 * 00331 * This field must be set to 0 if connectionMode is equal 00332 * to ADV_CONNECTABLE_DIRECTED. 00333 * 00334 * @note Decreasing this value allows central devices to detect a 00335 * peripheral faster, at the expense of more power being used by the radio 00336 * due to the higher data transmit rate. 00337 * 00338 * @deprecated You should use the parallel API from Gap directly, refer to 00339 * Gap::setAdvertisingInterval(). A former call to 00340 * ble.setAdvertisingInterval(...) should be replaced with 00341 * ble.gap().setAdvertisingInterval(...). 00342 * 00343 * @note WARNING: This API previously used 0.625ms as the unit for its 00344 * 'interval' argument. That required an explicit conversion from 00345 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is 00346 * no longer required as the new units are milliseconds. Any application 00347 * code depending on the old semantics needs to be updated accordingly. 00348 */ 00349 void setAdvertisingInterval (uint16_t interval) { 00350 gap().setAdvertisingInterval(interval); 00351 } 00352 00353 /** 00354 * @return Minimum Advertising interval in milliseconds. 00355 * 00356 * @deprecated You should use the parallel API from Gap directly, refer to 00357 * Gap::getMinAdvertisingInterval(). A former call to 00358 * ble.getMinAdvertisingInterval(...) should be replaced with 00359 * ble.gap().getMinAdvertisingInterval(...). 00360 */ 00361 uint16_t getMinAdvertisingInterval (void) const { 00362 return gap().getMinAdvertisingInterval(); 00363 } 00364 00365 /** 00366 * @return Minimum Advertising interval in milliseconds for non-connectible mode. 00367 * 00368 * @deprecated You should use the parallel API from Gap directly, refer to 00369 * Gap::MinNonConnectableAdvertisingInterval(). A former call to 00370 * ble.getMinNonConnectableAdvertisingInterval(...) should be replaced with 00371 * ble.gap().getMinNonConnectableAdvertisingInterval(...). 00372 */ 00373 uint16_t getMinNonConnectableAdvertisingInterval (void) const { 00374 return gap().getMinNonConnectableAdvertisingInterval(); 00375 } 00376 00377 /** 00378 * @return Maximum Advertising interval in milliseconds. 00379 * 00380 * @deprecated You should use the parallel API from Gap directly, refer to 00381 * Gap::getMaxAdvertisingInterval(). A former call to 00382 * ble.getMaxAdvertisingInterval(...) should be replaced with 00383 * ble.gap().getMaxAdvertisingInterval(...). 00384 */ 00385 uint16_t getMaxAdvertisingInterval (void) const { 00386 return gap().getMaxAdvertisingInterval(); 00387 } 00388 00389 /** 00390 * @param[in] timeout 00391 * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1 00392 * and 16383). Use 0 to disable the advertising timeout. 00393 * 00394 * @deprecated You should use the parallel API from Gap directly, refer to 00395 * Gap::setAdvertisingTimeout(). A former call to 00396 * ble.setAdvertisingTimeout(...) should be replaced with 00397 * ble.gap().setAdvertisingTimeout(...). 00398 */ 00399 void setAdvertisingTimeout (uint16_t timeout) { 00400 gap().setAdvertisingTimeout(timeout); 00401 } 00402 00403 /** 00404 * Set up a particular, user-constructed set of advertisement parameters for 00405 * the underlying stack. It would be uncommon for this API to be used 00406 * directly; there are other APIs to tweak advertisement parameters 00407 * individually (see above). 00408 * 00409 * @deprecated You should use the parallel API from Gap directly, refer to 00410 * Gap::setAdvertisingParams(). A former call to 00411 * ble.setAdvertisingParams(...) should be replaced with 00412 * ble.gap().setAdvertisingParams(...). 00413 */ 00414 void setAdvertisingParams(const GapAdvertisingParams &advParams) { 00415 gap().setAdvertisingParams(advParams); 00416 } 00417 00418 /** 00419 * @return Read back advertising parameters. Useful for storing and 00420 * restoring parameters rapidly. 00421 * 00422 * @deprecated You should use the parallel API from Gap directly, refer to 00423 * Gap::getAdvertisingParams(). A former call to 00424 * ble.getAdvertisingParams(...) should be replaced with 00425 * ble.gap().getAdvertisingParams(...). 00426 */ 00427 const GapAdvertisingParams &getAdvertisingParams (void) const { 00428 return gap().getAdvertisingParams(); 00429 } 00430 00431 /** 00432 * Accumulate an AD structure in the advertising payload. Please note that 00433 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used 00434 * as an additional 31 bytes if the advertising payload is too 00435 * small. 00436 * 00437 * @param[in] flags 00438 * The flags to add. Please refer to 00439 * GapAdvertisingData::Flags for valid flags. Multiple 00440 * flags may be specified in combination. 00441 * 00442 * @deprecated You should use the parallel API from Gap directly, refer to 00443 * Gap::accumulateAdvertisingPayload(uint8_t). A former call to 00444 * ble.accumulateAdvertisingPayload(flags) should be replaced with 00445 * ble.gap().accumulateAdvertisingPayload(flags). 00446 */ 00447 ble_error_t accumulateAdvertisingPayload(uint8_t flags) { 00448 return gap().accumulateAdvertisingPayload(flags); 00449 } 00450 00451 /** 00452 * Accumulate an AD structure in the advertising payload. Please note that 00453 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used 00454 * as an additional 31 bytes if the advertising payload is too 00455 * small. 00456 * 00457 * @param[in] app 00458 * The appearance of the peripheral. 00459 * 00460 * @deprecated You should use the parallel API from Gap directly, refer to 00461 * Gap::accumulateAdvertisingPayload(GapAdvertisingData::Appearance). 00462 * A former call to ble.accumulateAdvertisingPayload(appearance) 00463 * should be replaced with 00464 * ble.gap().accumulateAdvertisingPayload(appearance). 00465 */ 00466 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) { 00467 return gap().accumulateAdvertisingPayload(app); 00468 } 00469 00470 /** 00471 * Accumulate an AD structure in the advertising payload. Please note that 00472 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used 00473 * as an additional 31 bytes if the advertising payload is too 00474 * small. 00475 * 00476 * @param[in] power 00477 * The max transmit power to be used by the controller. This 00478 * is only a hint. 00479 * 00480 * @deprecated You should use the parallel API from Gap directly, refer to 00481 * Gap::accumulateAdvertisingPayloadTxPower(). A former call to 00482 * ble.accumulateAdvertisingPayloadTxPower(txPower) should be replaced with 00483 * ble.gap().accumulateAdvertisingPayloadTxPower(txPower). 00484 */ 00485 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) { 00486 return gap().accumulateAdvertisingPayloadTxPower(power); 00487 } 00488 00489 /** 00490 * Accumulate a variable length byte-stream as an AD structure in the 00491 * advertising payload. Please note that the payload is limited to 31 bytes. 00492 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the 00493 * advertising payload is too small. 00494 * 00495 * @param type The type that describes the variable length data. 00496 * @param data Data bytes. 00497 * @param len Data length. 00498 * 00499 * @deprecated You should use the parallel API from Gap directly, refer to 00500 * Gap::accumulateAdvertisingPayload(GapAdvertisingData::DataType, const uint8_t, uint8_t). 00501 * A former call to ble.accumulateAdvertisingPayload(...) should 00502 * be replaced with ble.gap().accumulateAdvertisingPayload(...). 00503 */ 00504 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) { 00505 return gap().accumulateAdvertisingPayload(type, data, len); 00506 } 00507 00508 /** 00509 * Setup a particular, user-constructed advertisement payload for the 00510 * underlying stack. It would be uncommon for this API to be used directly; 00511 * there are other APIs to build an advertisement payload (see above). 00512 * 00513 * @deprecated You should use the parallel API from Gap directly, refer to 00514 * Gap::setAdvertisingData(). A former call to 00515 * ble.setAdvertisingData(...) should be replaced with 00516 * ble.gap().setAdvertisingPayload(...). 00517 */ 00518 ble_error_t setAdvertisingData(const GapAdvertisingData &advData) { 00519 return gap().setAdvertisingPayload(advData); 00520 } 00521 00522 /** 00523 * @return Read back advertising data. Useful for storing and 00524 * restoring payload. 00525 * 00526 * @deprecated You should use the parallel API from Gap directly, refer to 00527 * Gap::getAdvertisingData(). A former call to 00528 * ble.getAdvertisingData(...) should be replaced with 00529 * ble.gap().getAdvertisingPayload()(...). 00530 */ 00531 const GapAdvertisingData &getAdvertisingData (void) const { 00532 return gap().getAdvertisingPayload(); 00533 } 00534 00535 /** 00536 * Reset any advertising payload prepared from prior calls to 00537 * accumulateAdvertisingPayload(). This automatically propagates the re- 00538 * initialized advertising payload to the underlying stack. 00539 * 00540 * @deprecated You should use the parallel API from Gap directly, refer to 00541 * Gap::clearAdvertisingPayload(). A former call to 00542 * ble.clearAdvertisingPayload(...) should be replaced with 00543 * ble.gap().clearAdvertisingPayload(...). 00544 */ 00545 void clearAdvertisingPayload(void) { 00546 gap().clearAdvertisingPayload(); 00547 } 00548 00549 /** 00550 * Dynamically reset the accumulated advertising 00551 * payload and scanResponse. The application must clear and re- 00552 * accumulates a new advertising payload (and scanResponse) before using this 00553 * API. 00554 * 00555 * @return BLE_ERROR_NONE when the advertising payload is set successfully. 00556 * 00557 * @deprecated You should use the parallel API from Gap directly, refer to 00558 * Gap::setAdvertisingPayload(). 00559 * 00560 * @note The new APIs in Gap update the underlying advertisement payload 00561 * implicitly. 00562 */ 00563 ble_error_t setAdvertisingPayload(void) { 00564 return BLE_ERROR_NONE; 00565 } 00566 00567 /** 00568 * Accumulate a variable length byte-stream as an AD structure in the 00569 * scanResponse payload. 00570 * 00571 * @param[in] type The type that describes the variable length data. 00572 * @param[in] data Data bytes. 00573 * @param[in] len Data length. 00574 * 00575 * @deprecated You should use the parallel API from Gap directly, refer to 00576 * Gap::accumulateScanResponse(). A former call to 00577 * ble.accumulateScanResponse(...) should be replaced with 00578 * ble.gap().accumulateScanResponse(...). 00579 */ 00580 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) { 00581 return gap().accumulateScanResponse(type, data, len); 00582 } 00583 00584 /** 00585 * Reset any scan response prepared from prior calls to 00586 * accumulateScanResponse(). 00587 * 00588 * @deprecated You should use the parallel API from Gap directly, refer to 00589 * Gap::clearScanResponse(). A former call to 00590 * ble.clearScanResponse(...) should be replaced with 00591 * ble.gap().clearScanResponse(...). 00592 */ 00593 void clearScanResponse(void) { 00594 gap().clearScanResponse(); 00595 } 00596 00597 /** 00598 * Start advertising. 00599 * 00600 * @deprecated You should use the parallel API from Gap directly, refer to 00601 * Gap::startAdvertising(). A former call to 00602 * ble.startAdvertising(...) should be replaced with 00603 * ble.gap().startAdvertising(...). 00604 */ 00605 ble_error_t startAdvertising(void) { 00606 return gap().startAdvertising(); 00607 } 00608 00609 /** 00610 * Stop advertising. 00611 * 00612 * @deprecated You should use the parallel API from Gap directly, refer to 00613 * Gap::stopAdvertising(). A former call to 00614 * ble.stopAdvertising(...) should be replaced with 00615 * ble.gap().stopAdvertising(...). 00616 */ 00617 ble_error_t stopAdvertising(void) { 00618 return gap().stopAdvertising(); 00619 } 00620 00621 /** 00622 * Set up parameters for GAP scanning (observer mode). 00623 * @param[in] interval 00624 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00625 * @param[in] window 00626 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00627 * @param[in] timeout 00628 * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables timeout. 00629 * @param[in] activeScanning 00630 * Set to True if active-scanning is required. This is used to fetch the 00631 * scan response from a peer if possible. 00632 * 00633 * The scanning window divided by the interval determines the duty cycle for 00634 * scanning. For example, if the interval is 100ms and the window is 10ms, 00635 * then the controller will scan for 10 percent of the time. It is possible 00636 * to have the interval and window set to the same value. In this case, 00637 * scanning is continuous, with a change of scanning frequency once every 00638 * interval. 00639 * 00640 * Once the scanning parameters have been configured, scanning can be 00641 * enabled by using startScan(). 00642 * 00643 * @note The scan interval and window are recommendations to the BLE stack. 00644 * 00645 * @deprecated You should use the parallel API from Gap directly, refer to 00646 * Gap::setScanParams(). A former call to 00647 * ble.setScanParams(...) should be replaced with 00648 * ble.gap().setScanParams(...). 00649 */ 00650 ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX, 00651 uint16_t window = GapScanningParams::SCAN_WINDOW_MAX, 00652 uint16_t timeout = 0, 00653 bool activeScanning = false) { 00654 return gap().setScanParams(interval, window, timeout, activeScanning); 00655 } 00656 00657 /** 00658 * Set up the scanInterval parameter for GAP scanning (observer mode). 00659 * @param[in] interval 00660 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00661 * 00662 * The scanning window divided by the interval determines the duty cycle for 00663 * scanning. For example, if the interval is 100ms and the window is 10ms, 00664 * then the controller will scan for 10 percent of the time. It is possible 00665 * to have the interval and window set to the same value. In this case, 00666 * scanning is continuous, with a change of scanning frequency once every 00667 * interval. 00668 * 00669 * Once the scanning parameters have been configured, scanning can be 00670 * enabled by using startScan(). 00671 * 00672 * @deprecated You should use the parallel API from Gap directly, refer to 00673 * Gap::setScanInterval(). A former call to 00674 * ble.setScanInterval(interval) should be replaced with 00675 * ble.gap().setScanInterval(interval). 00676 */ 00677 ble_error_t setScanInterval(uint16_t interval) { 00678 return gap().setScanInterval(interval); 00679 } 00680 00681 /** 00682 * Set up the scanWindow parameter for GAP scanning (observer mode). 00683 * @param[in] window 00684 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00685 * 00686 * The scanning window divided by the interval determines the duty cycle for 00687 * scanning. For example, if the interval is 100ms and the window is 10ms, 00688 * then the controller will scan for 10 percent of the time. It is possible 00689 * to have the interval and window set to the same value. In this case, 00690 * scanning is continuous, with a change of scanning frequency once every 00691 * interval. 00692 * 00693 * Once the scanning parameters have been configured, scanning can be 00694 * enabled by using startScan(). 00695 * 00696 * @deprecated You should use the parallel API from Gap directly, refer to 00697 * Gap::setScanWindow(). A former call to 00698 * ble.setScanWindow(window) should be replaced with 00699 * ble.gap().setScanWindow(window). 00700 */ 00701 ble_error_t setScanWindow(uint16_t window) { 00702 return gap().setScanWindow(window); 00703 } 00704 00705 /** 00706 * Set up parameters for GAP scanning (observer mode). 00707 * @param[in] timeout 00708 * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables timeout. 00709 * 00710 * The scanning window divided by the interval determines the duty cycle for 00711 * scanning. For example, if the interval is 100ms and the window is 10ms, 00712 * then the controller will scan for 10 percent of the time. It is possible 00713 * to have the interval and window set to the same value. In this case, 00714 * scanning is continuous, with a change of scanning frequency once every 00715 * interval. 00716 * 00717 * Once the scanning parameters have been configured, scanning can be 00718 * enabled by using startScan(). 00719 * 00720 * @note The scan interval and window are recommendations to the BLE stack. 00721 * 00722 * @deprecated You should use the parallel API from Gap directly, refer to 00723 * Gap::setScanTimeout(). A former call to 00724 * ble.setScanTimeout(...) should be replaced with 00725 * ble.gap().setScanTimeout(...). 00726 */ 00727 ble_error_t setScanTimeout(uint16_t timeout) { 00728 return gap().setScanTimeout(timeout); 00729 } 00730 00731 /** 00732 * Set up parameters for GAP scanning (observer mode). 00733 * @param[in] activeScanning 00734 * Set to True if active-scanning is required. This is used to fetch the 00735 * scan response from a peer if possible. 00736 * 00737 * Once the scanning parameters have been configured, scanning can be 00738 * enabled by using startScan(). 00739 * 00740 * @deprecated You should use the parallel API from Gap directly, refer to 00741 * Gap::setActiveScan(). A former call to 00742 * ble.setActiveScan(...) should be replaced with 00743 * ble.gap().setActiveScanning(...). 00744 */ 00745 void setActiveScan(bool activeScanning) { 00746 gap().setActiveScanning(activeScanning); 00747 } 00748 00749 /** 00750 * Start scanning (Observer Procedure) based on the parameters currently in 00751 * effect. 00752 * 00753 * @param[in] callback 00754 * The application-specific callback to be invoked upon 00755 * receiving every advertisement report. This can be passed in 00756 * as NULL, in which case scanning may not be enabled at all. 00757 * 00758 * @deprecated You should use the parallel API from Gap directly, refer to 00759 * Gap::startScan(). A former call to 00760 * ble.startScan(callback) should be replaced with 00761 * ble.gap().startScan(callback). 00762 */ 00763 ble_error_t startScan(void (*callback)(const Gap::AdvertisementCallbackParams_t *params)) { 00764 return gap().startScan(callback); 00765 } 00766 00767 /** 00768 * Same as above, but this takes an (object, method) pair for a callback. 00769 * 00770 * @deprecated You should use the parallel API from Gap directly, refer to 00771 * Gap::startScan(). A former call to 00772 * ble.startScan(callback) should be replaced with 00773 * ble.gap().startScan(object, callback). 00774 */ 00775 template<typename T> 00776 ble_error_t startScan(T *object, void (T::*memberCallback)(const Gap::AdvertisementCallbackParams_t *params)); 00777 00778 /** 00779 * Stop scanning. The current scanning parameters remain in effect. 00780 * 00781 * @retval BLE_ERROR_NONE if successfully stopped scanning procedure. 00782 * 00783 * @deprecated You should use the parallel API from Gap directly, refer to 00784 * Gap::stopScan(). A former call to 00785 * ble.stopScan() should be replaced with 00786 * ble.gap().stopScan(). 00787 */ 00788 ble_error_t stopScan(void) { 00789 return gap().stopScan(); 00790 } 00791 00792 /** 00793 * Create a connection (GAP Link Establishment). 00794 * @param peerAddr 00795 * 48-bit address, LSB format. 00796 * @param peerAddrType 00797 * Address type of the peer. 00798 * @param connectionParams 00799 * Connection parameters. 00800 * @param scanParams 00801 * Paramters to use while scanning for the peer. 00802 * @return BLE_ERROR_NONE if connection establishment procedure is started 00803 * successfully. The onConnection callback (if set) is invoked upon 00804 * a connection event. 00805 * 00806 * @deprecated You should use the parallel API from Gap directly, refer to 00807 * Gap::connect(). A former call to 00808 * ble.connect(...) should be replaced with 00809 * ble.gap().connect(...). 00810 */ 00811 ble_error_t connect(const BLEProtocol::AddressBytes_t peerAddr, 00812 BLEProtocol::AddressType_t peerAddrType = BLEProtocol::AddressType::RANDOM_STATIC, 00813 const Gap::ConnectionParams_t *connectionParams = NULL, 00814 const GapScanningParams *scanParams = NULL) { 00815 return gap().connect(peerAddr, peerAddrType, connectionParams, scanParams); 00816 } 00817 00818 /** 00819 * This call initiates the disconnection procedure, and its completion is 00820 * communicated to the application with an invocation of the 00821 * onDisconnection callback. 00822 * 00823 * @param[in] connectionHandle 00824 * @param[in] reason 00825 * The reason for disconnection; sent back to the peer. 00826 */ 00827 ble_error_t disconnect(Gap::Handle_t connectionHandle, Gap::DisconnectionReason_t reason) { 00828 return gap().disconnect(connectionHandle, reason); 00829 } 00830 00831 /** 00832 * This call initiates the disconnection procedure, and its completion 00833 * is communicated to the application with an invocation of the 00834 * onDisconnection callback. 00835 * 00836 * @param reason 00837 * The reason for disconnection; sent back to the peer. 00838 * 00839 * @deprecated You should use the parallel API from Gap directly, refer to 00840 * Gap::disconnect(). A former call to 00841 * ble.disconnect(reason) should be replaced with 00842 * ble.gap().disconnect(reason). 00843 * 00844 * @note This version of disconnect() doesn't take a connection handle. It 00845 * works reliably only for stacks that are limited to a single 00846 * connection. 00847 */ 00848 ble_error_t disconnect(Gap::DisconnectionReason_t reason) { 00849 return gap().disconnect(reason); 00850 } 00851 00852 /** 00853 * Returns the current Gap state of the device using a bitmask that 00854 * describes whether the device is advertising or connected. 00855 * 00856 * @deprecated You should use the parallel API from Gap directly, refer to 00857 * Gap::getState(). A former call to 00858 * ble.getGapState() should be replaced with 00859 * ble.gap().getState(). 00860 */ 00861 Gap::GapState_t getGapState(void) const { 00862 return gap().getState(); 00863 } 00864 00865 /** 00866 * Get the GAP peripheral's preferred connection parameters. These are the 00867 * defaults that the peripheral would like to have in a connection. The 00868 * choice of the connection parameters is eventually up to the central. 00869 * 00870 * @param[out] params 00871 * The structure where the parameters will be stored. Memory 00872 * for this is owned by the caller. 00873 * 00874 * @return BLE_ERROR_NONE if the parameters were successfully filled into 00875 * the given structure pointed to by params. 00876 * 00877 * @deprecated You should use the parallel API from Gap directly, refer to 00878 * Gap::getPreferredConnectionParams(). A former call to 00879 * ble.getPreferredConnectionParams() should be replaced with 00880 * ble.gap().getPreferredConnectionParams(). 00881 */ 00882 ble_error_t getPreferredConnectionParams(Gap::ConnectionParams_t *params) { 00883 return gap().getPreferredConnectionParams(params); 00884 } 00885 00886 /** 00887 * Set the GAP peripheral's preferred connection parameters. These are the 00888 * defaults that the peripheral would like to have in a connection. The 00889 * choice of the connection parameters is eventually up to the central. 00890 * 00891 * @param[in] params 00892 * The structure containing the desired parameters. 00893 * 00894 * @deprecated You should use the parallel API from Gap directly, refer to 00895 * Gap::setPreferredConnectionParams(). A former call to 00896 * ble.setPreferredConnectionParams() should be replaced with 00897 * ble.gap().setPreferredConnectionParams(). 00898 */ 00899 ble_error_t setPreferredConnectionParams(const Gap::ConnectionParams_t *params) { 00900 return gap().setPreferredConnectionParams(params); 00901 } 00902 00903 /** 00904 * Update connection parameters while in the peripheral role. 00905 * @details In the peripheral role, this will send the corresponding L2CAP request to the connected peer and wait for 00906 * the central to perform the procedure. 00907 * @param[in] handle 00908 * Connection Handle 00909 * @param[in] params 00910 * Pointer to desired connection parameters. If NULL is provided on a peripheral role, 00911 * the parameters in the PPCP characteristic of the GAP service will be used instead. 00912 * 00913 * @deprecated You should use the parallel API from Gap directly, refer to 00914 * Gap::updateConnectionParams(). A former call to 00915 * ble.updateConnectionParams() should be replaced with 00916 * ble.gap().updateConnectionParams(). 00917 */ 00918 ble_error_t updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) { 00919 return gap().updateConnectionParams(handle, params); 00920 } 00921 00922 /** 00923 * Set the device name characteristic in the Gap service. 00924 * @param[in] deviceName 00925 * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string. 00926 * 00927 * @deprecated You should use the parallel API from Gap directly, refer to 00928 * Gap::setDeviceName(). A former call to 00929 * ble.setDeviceName() should be replaced with 00930 * ble.gap().setDeviceName(). 00931 */ 00932 ble_error_t setDeviceName(const uint8_t *deviceName) { 00933 return gap().setDeviceName(deviceName); 00934 } 00935 00936 /** 00937 * Get the value of the device name characteristic in the Gap service. 00938 * @param[out] deviceName 00939 * Pointer to an empty buffer where the UTF-8 *non NULL- 00940 * terminated* string will be placed. Set this 00941 * value to NULL in order to obtain the deviceName-length 00942 * from the 'length' parameter. 00943 * 00944 * @param[in,out] lengthP 00945 * (on input) Length of the buffer pointed to by deviceName; 00946 * (on output) the complete device name length (without the 00947 * null terminator). 00948 * 00949 * @note If the device name is longer than the size of the supplied buffer, 00950 * length will return the complete device name length, and not the 00951 * number of bytes actually returned in deviceName. The application may 00952 * use this information to retry with a suitable buffer size. 00953 * 00954 * @deprecated You should use the parallel API from Gap directly, refer to 00955 * Gap::getDeviceName(). A former call to 00956 * ble.getDeviceName() should be replaced with 00957 * ble.gap().getDeviceName(). 00958 */ 00959 ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) { 00960 return gap().getDeviceName(deviceName, lengthP); 00961 } 00962 00963 /** 00964 * Set the appearance characteristic in the Gap service. 00965 * @param[in] appearance 00966 * The new value for the device-appearance. 00967 * 00968 * @deprecated You should use the parallel API from Gap directly, refer to 00969 * Gap::setAppearance(). A former call to 00970 * ble.setAppearance() should be replaced with 00971 * ble.gap().setAppearance(). 00972 */ 00973 ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) { 00974 return gap().setAppearance(appearance); 00975 } 00976 00977 /** 00978 * Get the appearance characteristic in the Gap service. 00979 * @param[out] appearanceP 00980 * The new value for the device-appearance. 00981 * 00982 * @deprecated You should use the parallel API from Gap directly, refer to 00983 * Gap::getAppearance(). A former call to 00984 * ble.getAppearance() should be replaced with 00985 * ble.gap().getAppearance(). 00986 */ 00987 ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) { 00988 return gap().getAppearance(appearanceP); 00989 } 00990 00991 /** 00992 * Set the radio's transmit power. 00993 * @param[in] txPower Radio transmit power in dBm. 00994 * 00995 * @deprecated You should use the parallel API from Gap directly, refer to 00996 * Gap::setTxPower(). A former call to 00997 * ble.setTxPower() should be replaced with 00998 * ble.gap().setTxPower(). 00999 */ 01000 ble_error_t setTxPower(int8_t txPower) { 01001 return gap().setTxPower(txPower); 01002 } 01003 01004 /** 01005 * Query the underlying stack for permitted arguments for setTxPower(). 01006 * 01007 * @param[out] valueArrayPP 01008 * Out parameter to receive the immutable array of Tx values. 01009 * @param[out] countP 01010 * Out parameter to receive the array's size. 01011 * 01012 * @deprecated You should use the parallel API from Gap directly, refer to 01013 * Gap::getPermittedTxPowerValues(). A former call to 01014 * ble.getPermittedTxPowerValues() should be replaced with 01015 * ble.gap().getPermittedTxPowerValues(). 01016 */ 01017 void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) { 01018 gap().getPermittedTxPowerValues(valueArrayPP, countP); 01019 } 01020 01021 /** 01022 * Add a service declaration to the local server ATT table. Also add the 01023 * characteristics contained within. 01024 * 01025 * @deprecated You should use the parallel API from GattServer directly, refer to 01026 * GattServer::addService(). A former call 01027 * to ble.addService() should be replaced with 01028 * ble.gattServer().addService(). 01029 */ 01030 ble_error_t addService(GattService &service) { 01031 return gattServer().addService(service); 01032 } 01033 01034 /** 01035 * Read the value of a characteristic from the local GattServer. 01036 * @param[in] attributeHandle 01037 * Attribute handle for the value attribute of the characteristic. 01038 * @param[out] buffer 01039 * A buffer to hold the value being read. 01040 * @param[in,out] lengthP 01041 * Length of the buffer being supplied. If the attribute 01042 * value is longer than the size of the supplied buffer, 01043 * this variable will return the total attribute value length 01044 * (excluding offset). The application may use this 01045 * information to allocate a suitable buffer size. 01046 * 01047 * @return BLE_ERROR_NONE if a value was read successfully into the buffer. 01048 * 01049 * @deprecated You should use the parallel API from GattServer directly, 01050 * GattServer::read(GattAttribute::Handle_t,uint8_t,uint16_t). A former call 01051 * to ble.readCharacteristicValue() should be replaced with 01052 * ble.gattServer().read(). 01053 */ 01054 ble_error_t readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) { 01055 return gattServer().read(attributeHandle, buffer, lengthP); 01056 } 01057 01058 /** 01059 * Read the value of a characteristic from the local GattServer. 01060 * @param[in] connectionHandle 01061 * Connection Handle. 01062 * @param[in] attributeHandle 01063 * Attribute handle for the value attribute of the characteristic. 01064 * @param[out] buffer 01065 * A buffer to hold the value being read. 01066 * @param[in,out] lengthP 01067 * Length of the buffer being supplied. If the attribute 01068 * value is longer than the size of the supplied buffer, 01069 * this variable will return the total attribute value length 01070 * (excluding offset). The application may use this 01071 * information to allocate a suitable buffer size. 01072 * 01073 * @return BLE_ERROR_NONE if a value was read successfully into the buffer. 01074 * 01075 * @note This API is a version of the above, with an additional connection handle 01076 * parameter to allow fetches for connection-specific multivalued 01077 * attributes (such as the CCCDs). 01078 * 01079 * @deprecated You should use the parallel API from GattServer directly, refer to 01080 * GattServer::read(Gap::Handle_t,GattAttribute::Handle_t,uint8_t,uint16_t). 01081 * A former call to ble.readCharacteristicValue() should be replaced with 01082 * ble.gattServer().read(). 01083 */ 01084 ble_error_t readCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP) { 01085 return gattServer().read(connectionHandle, attributeHandle, buffer, lengthP); 01086 } 01087 01088 /** 01089 * Update the value of a characteristic on the local GattServer. 01090 * 01091 * @param[in] attributeHandle 01092 * Handle for the value attribute of the characteristic. 01093 * @param[in] value 01094 * A pointer to a buffer holding the new value. 01095 * @param[in] size 01096 * Size of the new value (in bytes). 01097 * @param[in] localOnly 01098 * Should this update be kept on the local 01099 * GattServer regardless of the state of the 01100 * notify/indicate flag in the CCCD for this 01101 * characteristic? If set to true, no notification 01102 * or indication is generated. 01103 * 01104 * @return BLE_ERROR_NONE if we have successfully set the value of the attribute. 01105 * 01106 * @deprecated You should use the parallel API from GattServer directly, refer to 01107 * GattServer::write(GattAttribute::Handle_t,const uint8_t,uint16_t,bool). 01108 * A former call to ble.updateCharacteristicValue() should be replaced with 01109 * ble.gattServer().write(). 01110 */ 01111 ble_error_t updateCharacteristicValue(GattAttribute::Handle_t attributeHandle, 01112 const uint8_t *value, 01113 uint16_t size, 01114 bool localOnly = false) { 01115 return gattServer().write(attributeHandle, value, size, localOnly); 01116 } 01117 01118 /** 01119 * Update the value of a characteristic on the local GattServer. A version 01120 * of the above, with a connection handle parameter to allow updates 01121 * for connection-specific multivalued attributes (such as the CCCDs). 01122 * 01123 * @param[in] connectionHandle 01124 * Connection Handle. 01125 * @param[in] attributeHandle 01126 * Handle for the value attribute of the Characteristic. 01127 * @param[in] value 01128 * A pointer to a buffer holding the new value. 01129 * @param[in] size 01130 * Size of the new value (in bytes). 01131 * @param[in] localOnly 01132 * Should this update be kept on the local 01133 * GattServer regardless of the state of the 01134 * notify/indicate flag in the CCCD for this 01135 * Characteristic? If set to true, no notification 01136 * or indication is generated. 01137 * 01138 * @return BLE_ERROR_NONE if we have successfully set the value of the attribute. 01139 * 01140 * @deprecated You should use the parallel API from GattServer directly, refer to 01141 * GattServer::write(Gap::Handle_t,GattAttribute::Handle_t,const uint8_t,uint16_t,bool). 01142 * A former call to ble.updateCharacteristicValue() should be replaced with 01143 * ble.gattServer().write(). 01144 */ 01145 ble_error_t updateCharacteristicValue(Gap::Handle_t connectionHandle, 01146 GattAttribute::Handle_t attributeHandle, 01147 const uint8_t *value, 01148 uint16_t size, 01149 bool localOnly = false) { 01150 return gattServer().write(connectionHandle, attributeHandle, value, size, localOnly); 01151 } 01152 01153 /** 01154 * Enable the BLE stack's Security Manager. The Security Manager implements 01155 * the cryptographic algorithms and protocol exchanges that allow two 01156 * devices to securely exchange data and privately detect each other. 01157 * Calling this API is a prerequisite for encryption and pairing (bonding). 01158 * 01159 * @param[in] enableBonding Allow for bonding. 01160 * @param[in] requireMITM Require protection against man-in-the-middle attacks. 01161 * @param[in] iocaps To specify the I/O capabilities of this peripheral, 01162 * such as availability of a display or keyboard, to 01163 * support out-of-band exchanges of security data. 01164 * @param[in] passkey To specify a static passkey. 01165 * 01166 * @return BLE_ERROR_NONE on success. 01167 * 01168 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01169 * SecurityManager.init(). A former 01170 * call to ble.initializeSecurity(...) should be replaced with 01171 * ble.securityManager().init(...). 01172 */ 01173 ble_error_t initializeSecurity(bool enableBonding = true, 01174 bool requireMITM = true, 01175 SecurityManager::SecurityIOCapabilities_t iocaps = SecurityManager::IO_CAPS_NONE, 01176 const SecurityManager::Passkey_t passkey = NULL) { 01177 return securityManager().init(enableBonding, requireMITM, iocaps, passkey); 01178 } 01179 01180 /** 01181 * Get the security status of a connection. 01182 * 01183 * @param[in] connectionHandle Handle to identify the connection. 01184 * @param[out] securityStatusP Security status. 01185 * 01186 * @return BLE_SUCCESS or appropriate error code indicating the reason of failure. 01187 * 01188 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01189 * SecurityManager::getLinkSecurity(). A former 01190 * call to ble.getLinkSecurity(...) should be replaced with 01191 * ble.securityManager().getLinkSecurity(...). 01192 */ 01193 ble_error_t getLinkSecurity(Gap::Handle_t connectionHandle, SecurityManager::LinkSecurityStatus_t *securityStatusP) { 01194 return securityManager().getLinkSecurity(connectionHandle, securityStatusP); 01195 } 01196 01197 /** 01198 * Delete all peer device context and all related bonding information from 01199 * the database within the security manager. 01200 * 01201 * @retval BLE_ERROR_NONE On success; else returns an error code indicating the reason for the failure. 01202 * @retval BLE_ERROR_INVALID_STATE If the API is called without module initialization or 01203 * application registration. 01204 * 01205 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01206 * SecurityManager::purgeAllBondingState(). A former 01207 * call to ble.purgeAllBondingState() should be replaced with 01208 * ble.securityManager().purgeAllBondingState(). 01209 */ 01210 ble_error_t purgeAllBondingState(void) { 01211 return securityManager().purgeAllBondingState(); 01212 } 01213 01214 /** 01215 * Set up a callback for timeout events. Refer to Gap::TimeoutSource_t for 01216 * possible event types. 01217 * 01218 * @deprecated You should use the parallel API from Gap directly, refer to 01219 * Gap::onTimeout(). A former call 01220 * to ble.onTimeout(callback) should be replaced with 01221 * ble.gap().onTimeout(callback). 01222 */ 01223 void onTimeout(Gap::TimeoutEventCallback_t timeoutCallback) { 01224 gap().onTimeout(timeoutCallback); 01225 } 01226 01227 /** 01228 * Set up a callback for connection events. Refer to Gap::ConnectionEventCallback_t. 01229 * 01230 * @deprecated You should use the parallel API from Gap directly, refer to 01231 * Gap::onConnection(). A former call 01232 * to ble.onConnection(callback) should be replaced with 01233 * ble.gap().onConnection(callback). 01234 */ 01235 void onConnection(Gap::ConnectionEventCallback_t connectionCallback) { 01236 gap().onConnection(connectionCallback); 01237 } 01238 01239 /** 01240 * Append to a chain of callbacks to be invoked upon GAP disconnection. 01241 * 01242 * @deprecated You should use the parallel API from Gap directly, refer to 01243 * Gap::onDisconnection(). A former call 01244 * to ble.onDisconnection(callback) should be replaced with 01245 * ble.gap().onDisconnection(callback). 01246 */ 01247 void onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback) { 01248 gap().onDisconnection(disconnectionCallback); 01249 } 01250 01251 /** 01252 * The same as onDisconnection(), but allows an object reference and member function 01253 * to be added to the chain of callbacks. 01254 * 01255 * @deprecated You should use the parallel API from Gap directly, refer to 01256 * Gap::onDisconnection(). A former call 01257 * to ble.onDisconnection(callback) should be replaced with 01258 * ble.gap().onDisconnection(callback). 01259 */ 01260 template<typename T> 01261 void onDisconnection(T *tptr, void (T::*mptr)(const Gap::DisconnectionCallbackParams_t*)) { 01262 gap().onDisconnection(tptr, mptr); 01263 } 01264 01265 /** 01266 * Radio Notification is a feature that enables ACTIVE and INACTIVE 01267 * (nACTIVE) signals from the stack. These notify the application when the 01268 * radio is in use. The signal is sent using software interrupt. 01269 * 01270 * The ACTIVE signal is sent before the radio event starts. The nACTIVE 01271 * signal is sent at the end of the radio event. These signals can be used 01272 * by the application programmer to synchronize application logic with radio 01273 * activity. For example, the ACTIVE signal can be used to shut off external 01274 * devices to manage peak current drawn during periods when the radio is on, 01275 * or to trigger sensor data collection for transmission in the radio event. 01276 * 01277 * @param callback 01278 * The application handler to be invoked in response to a radio 01279 * ACTIVE/INACTIVE event. 01280 * 01281 * @deprecated You should use the parallel API from Gap directly, refer to 01282 * Gap::onRadioNotification(). A former call 01283 * to ble.onRadioNotification(...) should be replaced with 01284 * ble.gap().onRadioNotification(...). 01285 */ 01286 void onRadioNotification(void (*callback)(bool)) { 01287 gap().onRadioNotification(callback); 01288 } 01289 01290 /** 01291 * Add a callback for the GATT event DATA_SENT (which is triggered when 01292 * updates are sent out by GATT in the form of notifications). 01293 * 01294 * @note It is possible to chain together multiple onDataSent callbacks 01295 * (potentially from different modules of an application) to receive updates 01296 * to characteristics. 01297 * 01298 * @note It is also possible to set up a callback into a member function of 01299 * some object. 01300 * 01301 * @deprecated You should use the parallel API from GattServer directly, refer to 01302 * GattServer::onDataSent(). A former call 01303 * to ble.onDataSent(...) should be replaced with 01304 * ble.gattServer().onDataSent(...). 01305 */ 01306 void onDataSent(void (*callback)(unsigned count)) { 01307 gattServer().onDataSent(callback); 01308 } 01309 01310 /** 01311 * The same as onDataSent(), but allows an object reference and member function 01312 * to be added to the chain of callbacks. 01313 * 01314 * @deprecated You should use the parallel API from GattServer directly, refer to 01315 * GattServer::onDataSent(). A former call 01316 * to ble.onDataSent(...) should be replaced with 01317 * ble.gattServer().onDataSent(...). 01318 */ 01319 template <typename T> void onDataSent(T * objPtr, void (T::*memberPtr)(unsigned count)) { 01320 gattServer().onDataSent(objPtr, memberPtr); 01321 } 01322 01323 /** 01324 * Set up a callback for when an attribute has its value updated by or at the 01325 * connected peer. For a peripheral, this callback is triggered when the local 01326 * GATT server has an attribute updated by a write command from the peer. 01327 * For a Central, this callback is triggered when a response is received for 01328 * a write request. 01329 * 01330 * @note It is possible to chain together multiple onDataWritten callbacks 01331 * (potentially from different modules of an application) to receive updates 01332 * to characteristics. Many services, such as DFU and UART, add their own 01333 * onDataWritten callbacks behind the scenes to trap interesting events. 01334 * 01335 * @note It is also possible to set up a callback into a member function of 01336 * some object. 01337 * 01338 * @deprecated You should use the parallel API from GattServer directly, refer to 01339 * GattServer::onDataWritten(). A former call 01340 * to ble.onDataWritten(...) should be replaced with 01341 * ble.gattServer().onDataWritten(...). 01342 */ 01343 void onDataWritten(void (*callback)(const GattWriteCallbackParams *eventDataP)) { 01344 gattServer().onDataWritten(callback); 01345 } 01346 01347 /** 01348 * The same as onDataWritten(), but allows an object reference and member function 01349 * to be added to the chain of callbacks. 01350 * 01351 * @deprecated You should use the parallel API from GattServer directly, refer to 01352 * GattServer::onDataWritten(). A former call 01353 * to ble.onDataWritten(...) should be replaced with 01354 * ble.gattServer().onDataWritten(...). 01355 */ 01356 template <typename T> void onDataWritten(T * objPtr, void (T::*memberPtr)(const GattWriteCallbackParams *context)) { 01357 gattServer().onDataWritten(objPtr, memberPtr); 01358 } 01359 01360 /** 01361 * Set up a callback to be invoked on the peripheral when an attribute is 01362 * being read by a remote client. 01363 * 01364 * @note This functionality may not be available on all underlying stacks. 01365 * You could use GattCharacteristic::setReadAuthorizationCallback() as an 01366 * alternative. 01367 * 01368 * @note It is possible to chain together multiple onDataRead callbacks 01369 * (potentially from different modules of an application) to receive updates 01370 * to characteristics. Services may add their own onDataRead callbacks 01371 * behind the scenes to trap interesting events. 01372 * 01373 * @note It is also possible to set up a callback into a member function of 01374 * some object. 01375 * 01376 * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available; 01377 * else BLE_ERROR_NONE. 01378 * 01379 * @deprecated You should use the parallel API from GattServer directly, refer to 01380 * GattServer::onDataRead(). A former call 01381 * to ble.onDataRead(...) should be replaced with 01382 * ble.gattServer().onDataRead(...). 01383 */ 01384 ble_error_t onDataRead(void (*callback)(const GattReadCallbackParams *eventDataP)) { 01385 return gattServer().onDataRead(callback); 01386 } 01387 01388 /** 01389 * The same as onDataRead(), but allows an object reference and member function 01390 * to be added to the chain of callbacks. 01391 * 01392 * @deprecated You should use the parallel API from GattServer directly, refer to 01393 * GattServer::onDataRead(). A former call 01394 * to ble.onDataRead(...) should be replaced with 01395 * ble.gattServer().onDataRead(...). 01396 */ 01397 template <typename T> ble_error_t onDataRead(T * objPtr, void (T::*memberPtr)(const GattReadCallbackParams *context)) { 01398 return gattServer().onDataRead(objPtr, memberPtr); 01399 } 01400 01401 /** 01402 * Set up a callback for when notifications or indications are enabled for a 01403 * characteristic on the local GattServer. 01404 * 01405 * @deprecated You should use the parallel API from GattServer directly, refer to 01406 * GattServer::onUpdatesEnabled(). A former call 01407 * to ble.onUpdatesEnabled(callback) should be replaced with 01408 * ble.gattServer().onUpdatesEnabled(callback). 01409 */ 01410 void onUpdatesEnabled(GattServer::EventCallback_t callback) { 01411 gattServer().onUpdatesEnabled(callback); 01412 } 01413 01414 /** 01415 * Set up a callback for when notifications or indications are disabled for a 01416 * characteristic on the local GattServer. 01417 * 01418 * @deprecated You should use the parallel API from GattServer directly, refer to 01419 * GattServer::onUpdatesDisabled(). A former call 01420 * to ble.onUpdatesEnabled(callback) should be replaced with 01421 * ble.gattServer().onUpdatesEnabled(callback). 01422 */ 01423 void onUpdatesDisabled(GattServer::EventCallback_t callback) { 01424 gattServer().onUpdatesDisabled(callback); 01425 } 01426 01427 /** 01428 * Set up a callback for when the GATT server receives a response for an 01429 * indication event sent previously. 01430 * 01431 * @deprecated You should use the parallel API from GattServer directly, refer to 01432 * GattServer::onConfirmationReceived(). A former call 01433 * to ble.onConfirmationReceived(callback) should be replaced with 01434 * ble.gattServer().onConfirmationReceived(callback). 01435 */ 01436 void onConfirmationReceived(GattServer::EventCallback_t callback) { 01437 gattServer().onConfirmationReceived(callback); 01438 } 01439 01440 /** 01441 * Set up a callback for when the security setup procedure (key generation 01442 * and exchange) for a link has started. This will be skipped for bonded 01443 * devices. The callback is passed in parameters received from the peer's 01444 * security request: bool allowBonding, bool requireMITM, and 01445 * SecurityIOCapabilities_t. 01446 * 01447 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01448 * SecurityManager::onSecuritySetupInitiated(). A former 01449 * call to ble.onSecuritySetupInitiated(callback) should be replaced with 01450 * ble.securityManager().onSecuritySetupInitiated(callback). 01451 */ 01452 void onSecuritySetupInitiated(SecurityManager::SecuritySetupInitiatedCallback_t callback) { 01453 securityManager().onSecuritySetupInitiated(callback); 01454 } 01455 01456 /** 01457 * Set up a callback for when the security setup procedure (key generation 01458 * and exchange) for a link has completed. This will be skipped for bonded 01459 * devices. The callback is passed in the success/failure status of the 01460 * security setup procedure. 01461 * 01462 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01463 * SecurityManager::onSecuritySetupCompleted(). A former 01464 * call to ble.onSecuritySetupCompleted(callback) should be replaced with 01465 * ble.securityManager().onSecuritySetupCompleted(callback). 01466 */ 01467 void onSecuritySetupCompleted(SecurityManager::SecuritySetupCompletedCallback_t callback) { 01468 securityManager().onSecuritySetupCompleted(callback); 01469 } 01470 01471 /** 01472 * Set up a callback for when a link with the peer is secured. For bonded 01473 * devices, subsequent reconnections with a bonded peer will result only in 01474 * this callback when the link is secured, and setup procedures will not 01475 * occur unless the bonding information is either lost or deleted on either 01476 * or both sides. The callback is passed in a SecurityManager::SecurityMode_t according 01477 * to the level of security in effect for the secured link. 01478 * 01479 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01480 * SecurityManager::onLinkSecured(). A former 01481 * call to ble.onLinkSecured(callback) should be replaced with 01482 * ble.securityManager().onLinkSecured(callback). 01483 */ 01484 void onLinkSecured(SecurityManager::LinkSecuredCallback_t callback) { 01485 securityManager().onLinkSecured(callback); 01486 } 01487 01488 /** 01489 * Set up a callback for successful bonding, meaning that link-specific security 01490 * context is stored persistently for a peer device. 01491 * 01492 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01493 * SecurityManager::onSecurityContextStored(). A former 01494 * call to ble.onSecurityContextStored(callback) should be replaced with 01495 * ble.securityManager().onSecurityContextStored(callback). 01496 */ 01497 void onSecurityContextStored(SecurityManager::HandleSpecificEvent_t callback) { 01498 securityManager().onSecurityContextStored(callback); 01499 } 01500 01501 /** 01502 * Set up a callback for when the passkey needs to be displayed on a 01503 * peripheral with DISPLAY capability. This happens when security is 01504 * configured to prevent Man-In-The-Middle attacks, and the peers need to exchange 01505 * a passkey (or PIN) to authenticate the connection 01506 * attempt. 01507 * 01508 * @deprecated You should use the parallel API from SecurityManager directly, refer to 01509 * SecurityManager::onPasskeyDisplay(). A former 01510 * call to ble.onPasskeyDisplay(callback) should be replaced with 01511 * ble.securityManager().onPasskeyDisplay(callback). 01512 */ 01513 void onPasskeyDisplay(SecurityManager::PasskeyDisplayCallback_t callback) { 01514 return securityManager().onPasskeyDisplay(callback); 01515 } 01516 01517 /** 01518 * Process ALL pending events living in the BLE stack . 01519 * Return once all events have been consumed. 01520 * This function is called by user in their while loop (mbed Classic) 01521 * or automatically by Minar (mbed OS) when BLE event processing is scheduled. 01522 * Internally, this function will call BLEInstanceBase::processEvent. 01523 */ 01524 void processEvents(); 01525 01526 /** 01527 * Register a hook which will be called every time the BLE stack has pending 01528 * work. 01529 * By registering a callback, user code can know when event processing has to be 01530 * scheduled. 01531 * Callback format is void (*)(BLE& ble); 01532 */ 01533 void onEventsToProcess(const OnEventsToProcessCallback_t& callback); 01534 01535 private: 01536 01537 friend class BLEInstanceBase; 01538 01539 /** 01540 * This function allow the BLE stack to signal that their is work to do and 01541 * event processing should be done (BLE::processEvent()). 01542 * This function should be called by the port of BLE_API, it shouldn't be 01543 * accessible to end users. 01544 */ 01545 void signalEventsToProcess(); 01546 01547 /** 01548 * Implementation of init() [internal to BLE_API]. 01549 * 01550 * The implementation is separated into a private method because it isn't 01551 * suitable to be included in the header. 01552 */ 01553 ble_error_t initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback); 01554 01555 private: 01556 BLE(const BLE&); 01557 BLE &operator=(const BLE &); 01558 01559 private: 01560 InstanceID_t instanceID; 01561 BLEInstanceBase *transport; /* The device-specific backend */ 01562 OnEventsToProcessCallback_t whenEventsToProcess; 01563 }; 01564 01565 typedef BLE BLEDevice; /**< @deprecated This type alias is retained for the 01566 * sake of compatibility with older 01567 * code. Will be dropped at some point soon.*/ 01568 01569 #endif /* ifndef __BLE_H__ */
Generated on Tue Jul 12 2022 18:19:27 by
