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.
Fork of BLE_API by
Gap.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 __GAP_H__ 00018 #define __GAP_H__ 00019 00020 #include "ble/BLEProtocol.h" 00021 #include "GapAdvertisingData.h" 00022 #include "GapAdvertisingParams.h" 00023 #include "GapScanningParams.h" 00024 #include "GapEvents.h" 00025 #include "CallChainOfFunctionPointersWithContext.h" 00026 #include "FunctionPointerWithContext.h" 00027 #include "deprecate.h" 00028 00029 /* Forward declarations for classes that will only be used for pointers or references in the following. */ 00030 class GapAdvertisingParams; 00031 class GapScanningParams; 00032 class GapAdvertisingData; 00033 00034 class Gap { 00035 /* 00036 * DEPRECATION ALERT: all of the APIs in this `public` block are deprecated. 00037 * They have been relocated to the class BLEProtocol. 00038 */ 00039 public: 00040 /** 00041 * Address-type for BLEProtocol addresses. 00042 * 00043 * @note: deprecated. Use BLEProtocol::AddressType_t instead. 00044 */ 00045 typedef BLEProtocol::AddressType_t AddressType_t; 00046 00047 /** 00048 * Address-type for BLEProtocol addresses. 00049 * @note: deprecated. Use BLEProtocol::AddressType_t instead. 00050 */ 00051 typedef BLEProtocol::AddressType_t addr_type_t; 00052 00053 /** 00054 * Address-type for BLEProtocol addresses. 00055 * \deprecated: Use BLEProtocol::AddressType_t instead. 00056 * 00057 * DEPRECATION ALERT: The following constants have been left in their 00058 * deprecated state to transparenly support existing applications which may 00059 * have used Gap::ADDR_TYPE_*. 00060 */ 00061 enum DeprecatedAddressType_t { 00062 ADDR_TYPE_PUBLIC = BLEProtocol::AddressType::PUBLIC, 00063 ADDR_TYPE_RANDOM_STATIC = BLEProtocol::AddressType::RANDOM_STATIC, 00064 ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE = BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE, 00065 ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE = BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE 00066 }; 00067 00068 static const unsigned ADDR_LEN = BLEProtocol::ADDR_LEN; /**< Length (in octets) of the BLE MAC address. */ 00069 typedef BLEProtocol::AddressBytes_t Address_t; /**< 48-bit address, LSB format. @Note: Deprecated. Use BLEProtocol::AddressBytes_t instead. */ 00070 typedef BLEProtocol::AddressBytes_t address_t; /**< 48-bit address, LSB format. @Note: Deprecated. Use BLEProtocol::AddressBytes_t instead. */ 00071 00072 public: 00073 enum TimeoutSource_t { 00074 TIMEOUT_SRC_ADVERTISING = 0x00, /**< Advertising timeout. */ 00075 TIMEOUT_SRC_SECURITY_REQUEST = 0x01, /**< Security request timeout. */ 00076 TIMEOUT_SRC_SCAN = 0x02, /**< Scanning timeout. */ 00077 TIMEOUT_SRC_CONN = 0x03, /**< Connection timeout. */ 00078 }; 00079 00080 /** 00081 * Enumeration for disconnection reasons. The values for these reasons are 00082 * derived from Nordic's implementation, but the reasons are meant to be 00083 * independent of the transport. If you are returned a reason that is not 00084 * covered by this enumeration, please refer to the underlying 00085 * transport library. 00086 */ 00087 enum DisconnectionReason_t { 00088 CONNECTION_TIMEOUT = 0x08, 00089 REMOTE_USER_TERMINATED_CONNECTION = 0x13, 00090 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote device terminated connection due to low resources.*/ 00091 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote device terminated connection due to power off. */ 00092 LOCAL_HOST_TERMINATED_CONNECTION = 0x16, 00093 CONN_INTERVAL_UNACCEPTABLE = 0x3B, 00094 }; 00095 00096 /** 00097 * Enumeration for whitelist advertising policy filter modes. The possible 00098 * filter modes were obtained from the Bluetooth Core Specification 00099 * 4.2 (Vol. 6), Part B, Section 4.3.2. 00100 * 00101 * @experimental 00102 */ 00103 enum AdvertisingPolicyMode_t { 00104 ADV_POLICY_IGNORE_WHITELIST = 0, 00105 ADV_POLICY_FILTER_SCAN_REQS = 1, 00106 ADV_POLICY_FILTER_CONN_REQS = 2, 00107 ADV_POLICY_FILTER_ALL_REQS = 3, 00108 }; 00109 00110 /** 00111 * Enumeration for whitelist scanning policy filter modes. The possible 00112 * filter modes were obtained from the Bluetooth Core Specification 00113 * 4.2 (Vol. 6), Part B, Section 4.3.3. 00114 * 00115 * @experimental 00116 */ 00117 enum ScanningPolicyMode_t { 00118 SCAN_POLICY_IGNORE_WHITELIST = 0, 00119 SCAN_POLICY_FILTER_ALL_ADV = 1, 00120 }; 00121 00122 /** 00123 * Enumeration for the whitelist initiator policy fiter modes. The possible 00124 * filter modes were obtained from the Bluetooth Core Specification 00125 * 4.2 (vol. 6), Part B, Section 4.4.4. 00126 * 00127 * @experimental 00128 */ 00129 enum InitiatorPolicyMode_t { 00130 INIT_POLICY_IGNORE_WHITELIST = 0, 00131 INIT_POLICY_FILTER_ALL_ADV = 1, 00132 }; 00133 00134 /** 00135 * Representation of a Bluetooth Low Enery Whitelist containing addresses. 00136 * 00137 * @experimental 00138 */ 00139 struct Whitelist_t { 00140 BLEProtocol::Address_t *addresses; 00141 uint8_t size; 00142 uint8_t capacity; 00143 }; 00144 00145 00146 /* Describes the current state of the device (more than one bit can be set). */ 00147 struct GapState_t { 00148 unsigned advertising : 1; /**< Peripheral is currently advertising. */ 00149 unsigned connected : 1; /**< Peripheral is connected to a central. */ 00150 }; 00151 00152 typedef uint16_t Handle_t; /* Type for connection handle. */ 00153 00154 typedef struct { 00155 uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ 00156 uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ 00157 uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ 00158 uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ 00159 } ConnectionParams_t; 00160 00161 enum Role_t { 00162 PERIPHERAL = 0x1, /**< Peripheral Role. */ 00163 CENTRAL = 0x2, /**< Central Role. */ 00164 }; 00165 00166 struct AdvertisementCallbackParams_t { 00167 BLEProtocol::AddressBytes_t peerAddr; 00168 int8_t rssi; 00169 bool isScanResponse; 00170 GapAdvertisingParams::AdvertisingType_t type; 00171 uint8_t advertisingDataLen; 00172 const uint8_t *advertisingData; 00173 }; 00174 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t; 00175 00176 struct ConnectionCallbackParams_t { 00177 Handle_t handle; 00178 Role_t role; 00179 BLEProtocol::AddressType_t peerAddrType; 00180 BLEProtocol::AddressBytes_t peerAddr; 00181 BLEProtocol::AddressType_t ownAddrType; 00182 BLEProtocol::AddressBytes_t ownAddr; 00183 const ConnectionParams_t *connectionParams; 00184 00185 ConnectionCallbackParams_t(Handle_t handleIn, 00186 Role_t roleIn, 00187 BLEProtocol::AddressType_t peerAddrTypeIn, 00188 const uint8_t *peerAddrIn, 00189 BLEProtocol::AddressType_t ownAddrTypeIn, 00190 const uint8_t *ownAddrIn, 00191 const ConnectionParams_t *connectionParamsIn) : 00192 handle(handleIn), 00193 role(roleIn), 00194 peerAddrType(peerAddrTypeIn), 00195 peerAddr(), 00196 ownAddrType(ownAddrTypeIn), 00197 ownAddr(), 00198 connectionParams(connectionParamsIn) { 00199 memcpy(peerAddr, peerAddrIn, ADDR_LEN); 00200 memcpy(ownAddr, ownAddrIn, ADDR_LEN); 00201 } 00202 }; 00203 00204 struct DisconnectionCallbackParams_t { 00205 Handle_t handle; 00206 DisconnectionReason_t reason; 00207 00208 DisconnectionCallbackParams_t(Handle_t handleIn, 00209 DisconnectionReason_t reasonIn) : 00210 handle(handleIn), 00211 reason(reasonIn) 00212 {} 00213 }; 00214 00215 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */ 00216 static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) { 00217 return (durationInMillis * 1000) / UNIT_1_25_MS; 00218 } 00219 00220 typedef FunctionPointerWithContext<TimeoutSource_t> TimeoutEventCallback_t; 00221 typedef CallChainOfFunctionPointersWithContext<TimeoutSource_t> TimeoutEventCallbackChain_t; 00222 00223 typedef FunctionPointerWithContext<const ConnectionCallbackParams_t *> ConnectionEventCallback_t; 00224 typedef CallChainOfFunctionPointersWithContext<const ConnectionCallbackParams_t *> ConnectionEventCallbackChain_t; 00225 00226 typedef FunctionPointerWithContext<const DisconnectionCallbackParams_t*> DisconnectionEventCallback_t; 00227 typedef CallChainOfFunctionPointersWithContext<const DisconnectionCallbackParams_t*> DisconnectionEventCallbackChain_t; 00228 00229 typedef FunctionPointerWithContext<bool> RadioNotificationEventCallback_t; 00230 00231 typedef FunctionPointerWithContext<const Gap *> GapShutdownCallback_t; 00232 typedef CallChainOfFunctionPointersWithContext<const Gap *> GapShutdownCallbackChain_t; 00233 00234 /* 00235 * The following functions are meant to be overridden in the platform-specific sub-class. 00236 */ 00237 public: 00238 /** 00239 * Set the BTLE MAC address and type. Please note that the address format is 00240 * least significant byte first (LSB). Please refer to BLEProtocol::AddressBytes_t. 00241 * 00242 * @return BLE_ERROR_NONE on success. 00243 */ 00244 virtual ble_error_t setAddress(BLEProtocol::AddressType_t type, const BLEProtocol::AddressBytes_t address) { 00245 /* avoid compiler warnings about unused variables */ 00246 (void)type; 00247 (void)address; 00248 00249 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00250 } 00251 00252 /** 00253 * Fetch the BTLE MAC address and type. 00254 * 00255 * @return BLE_ERROR_NONE on success. 00256 */ 00257 virtual ble_error_t getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address) { 00258 /* Avoid compiler warnings about unused variables. */ 00259 (void)typeP; 00260 (void)address; 00261 00262 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00263 } 00264 00265 /** 00266 * @return Minimum Advertising interval in milliseconds for connectable 00267 * undirected and connectable directed event types. 00268 */ 00269 virtual uint16_t getMinAdvertisingInterval(void) const { 00270 return 0; /* Requesting action from porter(s): override this API if this capability is supported. */ 00271 } 00272 00273 /** 00274 * @return Minimum Advertising interval in milliseconds for scannable 00275 * undirected and non-connectable undirected event types. 00276 */ 00277 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const { 00278 return 0; /* Requesting action from porter(s): override this API if this capability is supported. */ 00279 } 00280 00281 /** 00282 * @return Maximum Advertising interval in milliseconds. 00283 */ 00284 virtual uint16_t getMaxAdvertisingInterval(void) const { 00285 return 0xFFFF; /* Requesting action from porter(s): override this API if this capability is supported. */ 00286 } 00287 00288 virtual ble_error_t stopAdvertising(void) { 00289 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00290 } 00291 00292 /** 00293 * Stop scanning. The current scanning parameters remain in effect. 00294 * 00295 * @retval BLE_ERROR_NONE if successfully stopped scanning procedure. 00296 */ 00297 virtual ble_error_t stopScan() { 00298 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00299 } 00300 00301 /** 00302 * Create a connection (GAP Link Establishment). 00303 * 00304 * @param peerAddr 00305 * 48-bit address, LSB format. 00306 * @param peerAddrType 00307 * Address type of the peer. 00308 * @param connectionParams 00309 * Connection parameters. 00310 * @param scanParams 00311 * Paramters to be used while scanning for the peer. 00312 * @return BLE_ERROR_NONE if connection establishment procedure is started 00313 * successfully. The connectionCallChain (if set) will be invoked upon 00314 * a connection event. 00315 */ 00316 virtual ble_error_t connect(const BLEProtocol::AddressBytes_t peerAddr, 00317 BLEProtocol::AddressType_t peerAddrType, 00318 const ConnectionParams_t *connectionParams, 00319 const GapScanningParams *scanParams) { 00320 /* Avoid compiler warnings about unused variables. */ 00321 (void)peerAddr; 00322 (void)peerAddrType; 00323 (void)connectionParams; 00324 (void)scanParams; 00325 00326 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00327 } 00328 00329 /** 00330 * Create a connection (GAP Link Establishment). 00331 * 00332 * \deprecated: This funtion overloads Gap::connect(const BLEProtocol::Address_t peerAddr, 00333 BLEProtocol::AddressType_t peerAddrType, 00334 const ConnectionParams_t *connectionParams, 00335 const GapScanningParams *scanParams) 00336 * to maintain backward compatibility for change from Gap::AddressType_t to BLEProtocol::AddressType_t 00337 */ 00338 ble_error_t connect(const BLEProtocol::AddressBytes_t peerAddr, 00339 DeprecatedAddressType_t peerAddrType, 00340 const ConnectionParams_t *connectionParams, 00341 const GapScanningParams *scanParams) 00342 __deprecated_message("Gap::DeprecatedAddressType_t is deprecated, use BLEProtocol::AddressType_t instead") { 00343 return connect(peerAddr, (BLEProtocol::AddressType_t) peerAddrType, connectionParams, scanParams); 00344 } 00345 00346 /** 00347 * This call initiates the disconnection procedure, and its completion will 00348 * be communicated to the application with an invocation of the 00349 * disconnectionCallback. 00350 * 00351 * @param reason 00352 * The reason for disconnection; to be sent back to the peer. 00353 */ 00354 virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason) { 00355 /* avoid compiler warnings about unused variables */ 00356 (void)connectionHandle; 00357 (void)reason; 00358 00359 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00360 } 00361 00362 /** 00363 * This call initiates the disconnection procedure, and its completion will 00364 * be communicated to the application with an invocation of the 00365 * disconnectionCallback. 00366 * 00367 * @param reason 00368 * The reason for disconnection; to be sent back to the peer. 00369 * 00370 * @note: This version of disconnect() doesn't take a connection handle. It 00371 * works reliably only for stacks that are limited to a single 00372 * connection. This API should be considered *deprecated* in favour of the 00373 * alternative, which takes a connection handle. It will be dropped in the future. 00374 */ 00375 virtual ble_error_t disconnect(DisconnectionReason_t reason) { 00376 /* Avoid compiler warnings about unused variables. */ 00377 (void)reason; 00378 00379 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00380 } 00381 00382 /** 00383 * Get the GAP peripheral preferred connection parameters. These are the 00384 * defaults that the peripheral would like to have in a connection. The 00385 * choice of the connection parameters is eventually up to the central. 00386 * 00387 * @param[out] params 00388 * The structure where the parameters will be stored. Memory 00389 * for this is owned by the caller. 00390 * 00391 * @return BLE_ERROR_NONE if the parameters were successfully filled into 00392 * the given structure pointed to by params. 00393 */ 00394 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) { 00395 /* Avoid compiler warnings about unused variables. */ 00396 (void)params; 00397 00398 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00399 } 00400 00401 /** 00402 * Set the GAP peripheral preferred connection parameters. These are the 00403 * defaults that the peripheral would like to have in a connection. The 00404 * choice of the connection parameters is eventually up to the central. 00405 * 00406 * @param[in] params 00407 * The structure containing the desired parameters. 00408 */ 00409 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) { 00410 /* Avoid compiler warnings about unused variables. */ 00411 (void)params; 00412 00413 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00414 } 00415 00416 /** 00417 * Update connection parameters. 00418 * In the central role this will initiate a Link Layer connection parameter update procedure. 00419 * In the peripheral role, this will send the corresponding L2CAP request and wait for 00420 * the central to perform the procedure. 00421 * 00422 * @param[in] handle 00423 * Connection Handle. 00424 * @param[in] params 00425 * Pointer to desired connection parameters. If NULL is provided on a peripheral role, 00426 * the parameters in the PPCP characteristic of the GAP service will be used instead. 00427 */ 00428 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) { 00429 /* avoid compiler warnings about unused variables */ 00430 (void)handle; 00431 (void)params; 00432 00433 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00434 } 00435 00436 /** 00437 * Set the device name characteristic in the GAP service. 00438 * @param[in] deviceName 00439 * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string. 00440 */ 00441 virtual ble_error_t setDeviceName(const uint8_t *deviceName) { 00442 /* Avoid compiler warnings about unused variables. */ 00443 (void)deviceName; 00444 00445 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00446 } 00447 00448 /** 00449 * Get the value of the device name characteristic in the GAP service. 00450 * @param[out] deviceName 00451 * Pointer to an empty buffer where the UTF-8 *non NULL- 00452 * terminated* string will be placed. Set this 00453 * value to NULL in order to obtain the deviceName-length 00454 * from the 'length' parameter. 00455 * 00456 * @param[in/out] lengthP 00457 * (on input) Length of the buffer pointed to by deviceName; 00458 * (on output) the complete device name length (without the 00459 * null terminator). 00460 * 00461 * @note If the device name is longer than the size of the supplied buffer, 00462 * length will return the complete device name length, and not the 00463 * number of bytes actually returned in deviceName. The application may 00464 * use this information to retry with a suitable buffer size. 00465 */ 00466 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) { 00467 /* avoid compiler warnings about unused variables */ 00468 (void)deviceName; 00469 (void)lengthP; 00470 00471 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00472 } 00473 00474 /** 00475 * Set the appearance characteristic in the GAP service. 00476 * @param[in] appearance 00477 * The new value for the device-appearance. 00478 */ 00479 virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) { 00480 /* Avoid compiler warnings about unused variables. */ 00481 (void)appearance; 00482 00483 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00484 } 00485 00486 /** 00487 * Get the appearance characteristic in the GAP service. 00488 * @param[out] appearance 00489 * The new value for the device-appearance. 00490 */ 00491 virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) { 00492 /* Avoid compiler warnings about unused variables. */ 00493 (void)appearanceP; 00494 00495 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00496 } 00497 00498 /** 00499 * Set the radio's transmit power. 00500 * @param[in] txPower Radio transmit power in dBm. 00501 */ 00502 virtual ble_error_t setTxPower(int8_t txPower) { 00503 /* Avoid compiler warnings about unused variables. */ 00504 (void)txPower; 00505 00506 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00507 } 00508 00509 /** 00510 * Query the underlying stack for permitted arguments for setTxPower(). 00511 * 00512 * @param[out] valueArrayPP 00513 * Out parameter to receive the immutable array of Tx values. 00514 * @param[out] countP 00515 * Out parameter to receive the array's size. 00516 */ 00517 virtual void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) { 00518 /* Avoid compiler warnings about unused variables. */ 00519 (void)valueArrayPP; 00520 (void)countP; 00521 00522 *countP = 0; /* Requesting action from porter(s): override this API if this capability is supported. */ 00523 } 00524 00525 /** 00526 * @return Maximum size of the whitelist. 00527 * 00528 * @experimental 00529 */ 00530 virtual uint8_t getMaxWhitelistSize(void) const 00531 { 00532 return 0; 00533 } 00534 00535 /** 00536 * Get the internal whitelist to be used by the Link Layer when scanning, 00537 * advertising or initiating a connection depending on the filter policies. 00538 * 00539 * @param[in/out] whitelist 00540 * (on input) whitelist.capacity contains the maximum number 00541 * of addresses to be returned. 00542 * (on output) The populated whitelist with copies of the 00543 * addresses in the implementation's whitelist. 00544 * 00545 * @return BLE_ERROR_NONE if the implementation's whitelist was successfully 00546 * copied into the supplied reference. 00547 * 00548 * @experimental 00549 */ 00550 virtual ble_error_t getWhitelist(Whitelist_t &whitelist) const 00551 { 00552 (void) whitelist; 00553 return BLE_ERROR_NOT_IMPLEMENTED; 00554 } 00555 00556 /** 00557 * Set the internal whitelist to be used by the Link Layer when scanning, 00558 * advertising or initiating a connection depending on the filter policies. 00559 * 00560 * @param[in] whitelist 00561 * A reference to a whitelist containing the addresses to 00562 * be added to the internal whitelist. 00563 * 00564 * @return BLE_ERROR_NONE if the implementation's whitelist was successfully 00565 * populated with the addresses in the given whitelist. 00566 * 00567 * @note The whitelist must not contain addresses of type @ref 00568 * BLEProtocol::AddressType_t::RANDOM_PRIVATE_NON_RESOLVABLE, this 00569 * this will result in a @ref BLE_ERROR_INVALID_PARAM since the 00570 * remote peer might change its private address at any time and it 00571 * is not possible to resolve it. 00572 * @note If the input whitelist is larger than @ref getMaxWhitelistSize() 00573 * the @ref BLE_ERROR_PARAM_OUT_OF_RANGE is returned. 00574 * 00575 * @experimental 00576 */ 00577 virtual ble_error_t setWhitelist(const Whitelist_t &whitelist) 00578 { 00579 (void) whitelist; 00580 return BLE_ERROR_NOT_IMPLEMENTED; 00581 } 00582 00583 /** 00584 * Set the advertising policy filter mode to be used in the next call 00585 * to startAdvertising(). 00586 * 00587 * @param[in] mode 00588 * The new advertising policy filter mode. 00589 * 00590 * @return BLE_ERROR_NONE if the specified policy filter mode was set 00591 * successfully. 00592 * 00593 * @experimental 00594 */ 00595 virtual ble_error_t setAdvertisingPolicyMode(AdvertisingPolicyMode_t mode) 00596 { 00597 (void) mode; 00598 return BLE_ERROR_NOT_IMPLEMENTED; 00599 } 00600 00601 /** 00602 * Set the scan policy filter mode to be used in the next call 00603 * to startScan(). 00604 * 00605 * @param[in] mode 00606 * The new scan policy filter mode. 00607 * 00608 * @return BLE_ERROR_NONE if the specified policy filter mode was set 00609 * successfully. 00610 * 00611 * @experimental 00612 */ 00613 virtual ble_error_t setScanningPolicyMode(ScanningPolicyMode_t mode) 00614 { 00615 (void) mode; 00616 return BLE_ERROR_NOT_IMPLEMENTED; 00617 } 00618 00619 /** 00620 * Set the initiator policy filter mode to be used. 00621 * 00622 * @param[in] mode 00623 * The new initiator policy filter mode. 00624 * 00625 * @return BLE_ERROR_NONE if the specified policy filter mode was set 00626 * successfully. 00627 * 00628 * @experimental 00629 */ 00630 virtual ble_error_t setInitiatorPolicyMode(InitiatorPolicyMode_t mode) 00631 { 00632 (void) mode; 00633 return BLE_ERROR_NOT_IMPLEMENTED; 00634 } 00635 00636 /** 00637 * Get the advertising policy filter mode that will be used in the next 00638 * call to startAdvertising(). 00639 * 00640 * @return The set advertising policy filter mode. 00641 * 00642 * @experimental 00643 */ 00644 virtual AdvertisingPolicyMode_t getAdvertisingPolicyMode(void) const 00645 { 00646 return ADV_POLICY_IGNORE_WHITELIST; 00647 } 00648 00649 /** 00650 * Get the scan policy filter mode that will be used in the next 00651 * call to startScan(). 00652 * 00653 * @return The set scan policy filter mode. 00654 * 00655 * @experimental 00656 */ 00657 virtual ScanningPolicyMode_t getScanningPolicyMode(void) const 00658 { 00659 return SCAN_POLICY_IGNORE_WHITELIST; 00660 } 00661 00662 /** 00663 * Get the initiator policy filter mode that will be used. 00664 * 00665 * @return The set scan policy filter mode. 00666 * 00667 * @experimental 00668 */ 00669 virtual InitiatorPolicyMode_t getInitiatorPolicyMode(void) const 00670 { 00671 return INIT_POLICY_IGNORE_WHITELIST; 00672 } 00673 00674 00675 protected: 00676 /* Override the following in the underlying adaptation layer to provide the functionality of scanning. */ 00677 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) { 00678 (void)scanningParams; 00679 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 00680 } 00681 00682 /* 00683 * APIs with non-virtual implementations. 00684 */ 00685 public: 00686 /** 00687 * Returns the current GAP state of the device using a bitmask that 00688 * describes whether the device is advertising or connected. 00689 */ 00690 GapState_t getState(void) const { 00691 return state; 00692 } 00693 00694 /** 00695 * Set the GAP advertising mode to use for this device. 00696 */ 00697 void setAdvertisingType(GapAdvertisingParams::AdvertisingType_t advType) { 00698 _advParams.setAdvertisingType(advType); 00699 } 00700 00701 /** 00702 * @param[in] interval 00703 * Advertising interval in units of milliseconds. Advertising 00704 * is disabled if interval is 0. If interval is smaller than 00705 * the minimum supported value, then the minimum supported 00706 * value is used instead. This minimum value can be discovered 00707 * using getMinAdvertisingInterval(). 00708 * 00709 * This field must be set to 0 if connectionMode is equal 00710 * to ADV_CONNECTABLE_DIRECTED. 00711 * 00712 * @note: Decreasing this value will allow central devices to detect a 00713 * peripheral faster, at the expense of more power being used by the radio 00714 * due to the higher data transmit rate. 00715 * 00716 * @Note: [WARNING] This API previously used 0.625ms as the unit for its 00717 * 'interval' argument. That required an explicit conversion from 00718 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is 00719 * no longer required as the new units are milliseconds. Any application 00720 * code depending on the old semantics needs to be updated accordingly. 00721 */ 00722 void setAdvertisingInterval(uint16_t interval) { 00723 if (interval == 0) { 00724 stopAdvertising(); 00725 } else if (interval < getMinAdvertisingInterval()) { 00726 interval = getMinAdvertisingInterval(); 00727 } 00728 _advParams.setInterval(interval); 00729 } 00730 00731 /** 00732 * @param[in] timeout 00733 * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1 00734 * and 16383). Use 0 to disable the advertising timeout. 00735 */ 00736 void setAdvertisingTimeout(uint16_t timeout) { 00737 _advParams.setTimeout(timeout); 00738 } 00739 00740 /** 00741 * Start advertising. 00742 */ 00743 ble_error_t startAdvertising(void) { 00744 setAdvertisingData(); /* Update the underlying stack. */ 00745 return startAdvertising(_advParams); 00746 } 00747 00748 /** 00749 * Reset any advertising payload prepared from prior calls to 00750 * accumulateAdvertisingPayload(). This automatically propagates the re- 00751 * initialized advertising payload to the underlying stack. 00752 */ 00753 void clearAdvertisingPayload(void) { 00754 _advPayload.clear(); 00755 setAdvertisingData(); 00756 } 00757 00758 /** 00759 * Accumulate an AD structure in the advertising payload. Please note that 00760 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used 00761 * as an additional 31 bytes if the advertising payload is too 00762 * small. 00763 * 00764 * @param[in] flags 00765 * The flags to be added. Please refer to 00766 * GapAdvertisingData::Flags for valid flags. Multiple 00767 * flags may be specified in combination. 00768 */ 00769 ble_error_t accumulateAdvertisingPayload(uint8_t flags) { 00770 ble_error_t rc; 00771 if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) { 00772 return rc; 00773 } 00774 00775 return setAdvertisingData(); 00776 } 00777 00778 /** 00779 * Accumulate an AD structure in the advertising payload. Please note that 00780 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used 00781 * as an additional 31 bytes if the advertising payload is too 00782 * small. 00783 * 00784 * @param app 00785 * The appearance of the peripheral. 00786 */ 00787 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) { 00788 setAppearance(app); 00789 00790 ble_error_t rc; 00791 if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) { 00792 return rc; 00793 } 00794 00795 return setAdvertisingData(); 00796 } 00797 00798 /** 00799 * Accumulate an AD structure in the advertising payload. Please note that 00800 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used 00801 * as an additional 31 bytes if the advertising payload is too 00802 * small. 00803 * 00804 * @param power 00805 * The max transmit power to be used by the controller (in dBm). 00806 */ 00807 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) { 00808 ble_error_t rc; 00809 if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) { 00810 return rc; 00811 } 00812 00813 return setAdvertisingData(); 00814 } 00815 00816 /** 00817 * Accumulate a variable length byte-stream as an AD structure in the 00818 * advertising payload. Please note that the payload is limited to 31 bytes. 00819 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the 00820 * advertising payload is too small. 00821 * 00822 * @param type The type describing the variable length data. 00823 * @param data Data bytes. 00824 * @param len Length of data. 00825 * 00826 * @return BLE_ERROR_NONE if the advertisement payload was updated based on 00827 * matching AD type; otherwise, an appropriate error. 00828 * 00829 * @note When the specified AD type is INCOMPLETE_LIST_16BIT_SERVICE_IDS, 00830 * COMPLETE_LIST_16BIT_SERVICE_IDS, INCOMPLETE_LIST_32BIT_SERVICE_IDS, 00831 * COMPLETE_LIST_32BIT_SERVICE_IDS, INCOMPLETE_LIST_128BIT_SERVICE_IDS, 00832 * COMPLETE_LIST_128BIT_SERVICE_IDS or LIST_128BIT_SOLICITATION_IDS the 00833 * supplied value is appended to the values previously added to the 00834 * payload. 00835 */ 00836 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) { 00837 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) { 00838 setDeviceName(data); 00839 } 00840 00841 ble_error_t rc; 00842 if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) { 00843 return rc; 00844 } 00845 00846 return setAdvertisingData(); 00847 } 00848 00849 /** 00850 * Update a particular ADV field in the advertising payload (based on 00851 * matching type). 00852 * 00853 * @param[in] type The ADV type field describing the variable length data. 00854 * @param[in] data Data bytes. 00855 * @param[in] len Length of data. 00856 * 00857 * @note: If advertisements are enabled, then the update will take effect immediately. 00858 * 00859 * @return BLE_ERROR_NONE if the advertisement payload was updated based on 00860 * matching AD type; otherwise, an appropriate error. 00861 */ 00862 ble_error_t updateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) { 00863 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) { 00864 setDeviceName(data); 00865 } 00866 00867 ble_error_t rc; 00868 if ((rc = _advPayload.updateData(type, data, len)) != BLE_ERROR_NONE) { 00869 return rc; 00870 } 00871 00872 return setAdvertisingData(); 00873 } 00874 00875 /** 00876 * Set up a particular, user-constructed advertisement payload for the 00877 * underlying stack. It would be uncommon for this API to be used directly; 00878 * there are other APIs to build an advertisement payload (see above). 00879 */ 00880 ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) { 00881 _advPayload = payload; 00882 return setAdvertisingData(); 00883 } 00884 00885 /** 00886 * @return Read back advertising data. Useful for storing and 00887 * restoring payload. 00888 */ 00889 const GapAdvertisingData &getAdvertisingPayload(void) const { 00890 return _advPayload; 00891 } 00892 00893 /** 00894 * Accumulate a variable length byte-stream as an AD structure in the 00895 * scanResponse payload. 00896 * 00897 * @param[in] type The type describing the variable length data. 00898 * @param[in] data Data bytes. 00899 * @param[in] len Length of data. 00900 */ 00901 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) { 00902 ble_error_t rc; 00903 if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) { 00904 return rc; 00905 } 00906 00907 return setAdvertisingData(); 00908 } 00909 00910 /** 00911 * Reset any scan response prepared from prior calls to 00912 * accumulateScanResponse(). 00913 * 00914 * Note: This should be followed by a call to setAdvertisingPayload() or 00915 * startAdvertising() before the update takes effect. 00916 */ 00917 void clearScanResponse(void) { 00918 _scanResponse.clear(); 00919 setAdvertisingData(); 00920 } 00921 00922 /** 00923 * Set up parameters for GAP scanning (observer mode). 00924 * @param[in] interval 00925 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00926 * @param[in] window 00927 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00928 * @param[in] timeout 00929 * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables the timeout. 00930 * @param[in] activeScanning 00931 * Set to True if active-scanning is required. This is used to fetch the 00932 * scan response from a peer if possible. 00933 * 00934 * The scanning window divided by the interval determines the duty cycle for 00935 * scanning. For example, if the interval is 100ms and the window is 10ms, 00936 * then the controller will scan for 10 percent of the time. It is possible 00937 * to have the interval and window set to the same value. In this case, 00938 * scanning is continuous, with a change of scanning frequency once every 00939 * interval. 00940 * 00941 * Once the scanning parameters have been configured, scanning can be 00942 * enabled by using startScan(). 00943 * 00944 * @Note: The scan interval and window are recommendations to the BLE stack. 00945 */ 00946 ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX, 00947 uint16_t window = GapScanningParams::SCAN_WINDOW_MAX, 00948 uint16_t timeout = 0, 00949 bool activeScanning = false) { 00950 ble_error_t rc; 00951 if (((rc = _scanningParams.setInterval(interval)) == BLE_ERROR_NONE) && 00952 ((rc = _scanningParams.setWindow(window)) == BLE_ERROR_NONE) && 00953 ((rc = _scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) { 00954 _scanningParams.setActiveScanning(activeScanning); 00955 return BLE_ERROR_NONE; 00956 } 00957 00958 return rc; 00959 } 00960 00961 /** 00962 * Set up the scanInterval parameter for GAP scanning (observer mode). 00963 * @param[in] interval 00964 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00965 * 00966 * The scanning window divided by the interval determines the duty cycle for 00967 * scanning. For example, if the interval is 100ms and the window is 10ms, 00968 * then the controller will scan for 10 percent of the time. It is possible 00969 * to have the interval and window set to the same value. In this case, 00970 * scanning is continuous, with a change of scanning frequency once every 00971 * interval. 00972 * 00973 * Once the scanning parameters have been configured, scanning can be 00974 * enabled by using startScan(). 00975 */ 00976 ble_error_t setScanInterval(uint16_t interval) { 00977 return _scanningParams.setInterval(interval); 00978 } 00979 00980 /** 00981 * Set up the scanWindow parameter for GAP scanning (observer mode). 00982 * @param[in] window 00983 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s]. 00984 * 00985 * The scanning window divided by the interval determines the duty cycle for 00986 * scanning. For example, if the interval is 100ms and the window is 10ms, 00987 * then the controller will scan for 10 percent of the time. It is possible 00988 * to have the interval and window set to the same value. In this case, 00989 * scanning is continuous, with a change of scanning frequency once every 00990 * interval. 00991 * 00992 * Once the scanning parameters have been configured, scanning can be 00993 * enabled by using startScan(). 00994 * 00995 * If scanning is already active, the updated value of scanWindow will be 00996 * propagated to the underlying BLE stack. 00997 */ 00998 ble_error_t setScanWindow(uint16_t window) { 00999 ble_error_t rc; 01000 if ((rc = _scanningParams.setWindow(window)) != BLE_ERROR_NONE) { 01001 return rc; 01002 } 01003 01004 /* If scanning is already active, propagate the new setting to the stack. */ 01005 if (scanningActive) { 01006 return startRadioScan(_scanningParams); 01007 } 01008 01009 return BLE_ERROR_NONE; 01010 } 01011 01012 /** 01013 * Set up parameters for GAP scanning (observer mode). 01014 * @param[in] timeout 01015 * Scan timeout (in seconds) between 0x0001 and 0xFFFF; 0x0000 disables the timeout. 01016 * 01017 * Once the scanning parameters have been configured, scanning can be 01018 * enabled by using startScan(). 01019 * 01020 * If scanning is already active, the updated value of scanTimeout will be 01021 * propagated to the underlying BLE stack. 01022 */ 01023 ble_error_t setScanTimeout(uint16_t timeout) { 01024 ble_error_t rc; 01025 if ((rc = _scanningParams.setTimeout(timeout)) != BLE_ERROR_NONE) { 01026 return rc; 01027 } 01028 01029 /* If scanning is already active, propagate the new settings to the stack. */ 01030 if (scanningActive) { 01031 return startRadioScan(_scanningParams); 01032 } 01033 01034 return BLE_ERROR_NONE; 01035 } 01036 01037 /** 01038 * Set up parameters for GAP scanning (observer mode). 01039 * @param[in] activeScanning 01040 * Set to True if active-scanning is required. This is used to fetch the 01041 * scan response from a peer if possible. 01042 * 01043 * Once the scanning parameters have been configured, scanning can be 01044 * enabled by using startScan(). 01045 * 01046 * If scanning is already in progress, then active-scanning will be enabled 01047 * for the underlying BLE stack. 01048 */ 01049 ble_error_t setActiveScanning(bool activeScanning) { 01050 _scanningParams.setActiveScanning(activeScanning); 01051 01052 /* If scanning is already active, propagate the new settings to the stack. */ 01053 if (scanningActive) { 01054 return startRadioScan(_scanningParams); 01055 } 01056 01057 return BLE_ERROR_NONE; 01058 } 01059 01060 /** 01061 * Start scanning (Observer Procedure) based on the parameters currently in 01062 * effect. 01063 * 01064 * @param[in] callback 01065 * The application-specific callback to be invoked upon 01066 * receiving every advertisement report. This can be passed in 01067 * as NULL, in which case scanning may not be enabled at all. 01068 */ 01069 ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) { 01070 ble_error_t err = BLE_ERROR_NONE; 01071 if (callback) { 01072 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) { 01073 scanningActive = true; 01074 onAdvertisementReport.attach(callback); 01075 } 01076 } 01077 01078 return err; 01079 } 01080 01081 /** 01082 * Same as above, but this takes an (object, method) pair for a callback. 01083 */ 01084 template<typename T> 01085 ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) { 01086 ble_error_t err = BLE_ERROR_NONE; 01087 if (object && callbackMember) { 01088 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) { 01089 scanningActive = true; 01090 onAdvertisementReport.attach(object, callbackMember); 01091 } 01092 } 01093 01094 return err; 01095 } 01096 01097 /** 01098 * Initialize radio-notification events to be generated from the stack. 01099 * This API doesn't need to be called directly. 01100 * 01101 * Radio Notification is a feature that enables ACTIVE and INACTIVE 01102 * (nACTIVE) signals from the stack that notify the application when the 01103 * radio is in use. 01104 * 01105 * The ACTIVE signal is sent before the radio event starts. The nACTIVE 01106 * signal is sent at the end of the radio event. These signals can be used 01107 * by the application programmer to synchronize application logic with radio 01108 * activity. For example, the ACTIVE signal can be used to shut off external 01109 * devices, to manage peak current drawn during periods when the radio is on, 01110 * or to trigger sensor data collection for transmission in the Radio Event. 01111 * 01112 * @return BLE_ERROR_NONE on successful initialization, otherwise an error code. 01113 */ 01114 virtual ble_error_t initRadioNotification(void) { 01115 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */ 01116 } 01117 01118 private: 01119 ble_error_t setAdvertisingData(void) { 01120 return setAdvertisingData(_advPayload, _scanResponse); 01121 } 01122 01123 private: 01124 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) = 0; 01125 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0; 01126 01127 public: 01128 /** 01129 * Accessors to read back currently active advertising params. 01130 */ 01131 GapAdvertisingParams &getAdvertisingParams(void) { 01132 return _advParams; 01133 } 01134 const GapAdvertisingParams &getAdvertisingParams(void) const { 01135 return _advParams; 01136 } 01137 01138 /** 01139 * Set up a particular, user-constructed set of advertisement parameters for 01140 * the underlying stack. It would be uncommon for this API to be used 01141 * directly; there are other APIs to tweak advertisement parameters 01142 * individually. 01143 */ 01144 void setAdvertisingParams(const GapAdvertisingParams &newParams) { 01145 _advParams = newParams; 01146 } 01147 01148 /* Event callback handlers. */ 01149 public: 01150 /** 01151 * Set up a callback for timeout events. Refer to TimeoutSource_t for 01152 * possible event types. 01153 * @note It is possible to unregister callbacks using onTimeout().detach(callback) 01154 */ 01155 void onTimeout(TimeoutEventCallback_t callback) { 01156 timeoutCallbackChain.add(callback); 01157 } 01158 01159 /** 01160 * @brief provide access to the callchain of timeout event callbacks 01161 * It is possible to register callbacks using onTimeout().add(callback); 01162 * It is possible to unregister callbacks using onTimeout().detach(callback) 01163 * @return The timeout event callbacks chain 01164 */ 01165 TimeoutEventCallbackChain_t& onTimeout() { 01166 return timeoutCallbackChain; 01167 } 01168 01169 /** 01170 * Append to a chain of callbacks to be invoked upon GAP connection. 01171 * @note It is possible to unregister callbacks using onConnection().detach(callback) 01172 */ 01173 void onConnection(ConnectionEventCallback_t callback) {connectionCallChain.add(callback);} 01174 01175 template<typename T> 01176 void onConnection(T *tptr, void (T::*mptr)(const ConnectionCallbackParams_t*)) {connectionCallChain.add(tptr, mptr);} 01177 01178 /** 01179 * @brief provide access to the callchain of connection event callbacks 01180 * It is possible to register callbacks using onConnection().add(callback); 01181 * It is possible to unregister callbacks using onConnection().detach(callback) 01182 * @return The connection event callbacks chain 01183 */ 01184 ConnectionEventCallbackChain_t& onConnection() { 01185 return connectionCallChain; 01186 } 01187 01188 /** 01189 * Append to a chain of callbacks to be invoked upon GAP disconnection. 01190 * @note It is possible to unregister callbacks using onDisconnection().detach(callback) 01191 */ 01192 void onDisconnection(DisconnectionEventCallback_t callback) {disconnectionCallChain.add(callback);} 01193 01194 template<typename T> 01195 void onDisconnection(T *tptr, void (T::*mptr)(const DisconnectionCallbackParams_t*)) {disconnectionCallChain.add(tptr, mptr);} 01196 01197 /** 01198 * @brief provide access to the callchain of disconnection event callbacks 01199 * It is possible to register callbacks using onDisconnection().add(callback); 01200 * It is possible to unregister callbacks using onDisconnection().detach(callback) 01201 * @return The disconnection event callbacks chain 01202 */ 01203 DisconnectionEventCallbackChain_t& onDisconnection() { 01204 return disconnectionCallChain; 01205 } 01206 01207 /** 01208 * Set the application callback for radio-notification events. 01209 * 01210 * Radio Notification is a feature that enables ACTIVE and INACTIVE 01211 * (nACTIVE) signals from the stack that notify the application when the 01212 * radio is in use. 01213 * 01214 * The ACTIVE signal is sent before the radio event starts. The nACTIVE 01215 * signal is sent at the end of the radio event. These signals can be used 01216 * by the application programmer to synchronize application logic with radio 01217 * activity. For example, the ACTIVE signal can be used to shut off external 01218 * devices, to manage peak current drawn during periods when the radio is on, 01219 * or to trigger sensor data collection for transmission in the Radio Event. 01220 * 01221 * @param callback 01222 * The application handler to be invoked in response to a radio 01223 * ACTIVE/INACTIVE event. 01224 * 01225 * Or in the other version: 01226 * 01227 * @param tptr 01228 * Pointer to the object of a class defining the member callback 01229 * function (mptr). 01230 * @param mptr 01231 * The member callback (within the context of an object) to be 01232 * invoked in response to a radio ACTIVE/INACTIVE event. 01233 */ 01234 void onRadioNotification(void (*callback)(bool param)) { 01235 radioNotificationCallback.attach(callback); 01236 } 01237 template <typename T> 01238 void onRadioNotification(T *tptr, void (T::*mptr)(bool)) { 01239 radioNotificationCallback.attach(tptr, mptr); 01240 } 01241 01242 /** 01243 * Setup a callback to be invoked to notify the user application that the 01244 * Gap instance is about to shutdown (possibly as a result of a call 01245 * to BLE::shutdown()). 01246 * 01247 * @Note: It is possible to chain together multiple onShutdown callbacks 01248 * (potentially from different modules of an application) to be notified 01249 * before the Gap instance is shutdown. 01250 * 01251 * @Note: It is also possible to set up a callback into a member function of 01252 * some object. 01253 * 01254 * @Note It is possible to unregister a callback using onShutdown().detach(callback) 01255 */ 01256 void onShutdown(const GapShutdownCallback_t& callback) { 01257 shutdownCallChain.add(callback); 01258 } 01259 template <typename T> 01260 void onShutdown(T *objPtr, void (T::*memberPtr)(void)) { 01261 shutdownCallChain.add(objPtr, memberPtr); 01262 } 01263 01264 /** 01265 * @brief provide access to the callchain of shutdown event callbacks 01266 * It is possible to register callbacks using onShutdown().add(callback); 01267 * It is possible to unregister callbacks using onShutdown().detach(callback) 01268 * @return The shutdown event callbacks chain 01269 */ 01270 GapShutdownCallbackChain_t& onShutdown() { 01271 return shutdownCallChain; 01272 } 01273 01274 public: 01275 /** 01276 * Notify all registered onShutdown callbacks that the Gap instance is 01277 * about to be shutdown and clear all Gap state of the 01278 * associated object. 01279 * 01280 * This function is meant to be overridden in the platform-specific 01281 * sub-class. Nevertheless, the sub-class is only expected to reset its 01282 * state and not the data held in Gap members. This shall be achieved by a 01283 * call to Gap::reset() from the sub-class' reset() implementation. 01284 * 01285 * @return BLE_ERROR_NONE on success. 01286 * 01287 * @note: Currently a call to reset() does not reset the advertising and 01288 * scan parameters to default values. 01289 */ 01290 virtual ble_error_t reset(void) { 01291 /* Notify that the instance is about to shutdown */ 01292 shutdownCallChain.call(this); 01293 shutdownCallChain.clear(); 01294 01295 /* Clear Gap state */ 01296 state.advertising = 0; 01297 state.connected = 0; 01298 01299 /* Clear scanning state */ 01300 scanningActive = false; 01301 01302 /* Clear advertising and scanning data */ 01303 _advPayload.clear(); 01304 _scanResponse.clear(); 01305 01306 /* Clear callbacks */ 01307 timeoutCallbackChain.clear(); 01308 connectionCallChain.clear(); 01309 disconnectionCallChain.clear(); 01310 radioNotificationCallback = NULL; 01311 onAdvertisementReport = NULL; 01312 01313 return BLE_ERROR_NONE; 01314 } 01315 01316 protected: 01317 Gap() : 01318 _advParams(), 01319 _advPayload(), 01320 _scanningParams(), 01321 _scanResponse(), 01322 state(), 01323 scanningActive(false), 01324 timeoutCallbackChain(), 01325 radioNotificationCallback(), 01326 onAdvertisementReport(), 01327 connectionCallChain(), 01328 disconnectionCallChain() { 01329 _advPayload.clear(); 01330 _scanResponse.clear(); 01331 } 01332 01333 /* Entry points for the underlying stack to report events back to the user. */ 01334 public: 01335 void processConnectionEvent(Handle_t handle, 01336 Role_t role, 01337 BLEProtocol::AddressType_t peerAddrType, 01338 const BLEProtocol::AddressBytes_t peerAddr, 01339 BLEProtocol::AddressType_t ownAddrType, 01340 const BLEProtocol::AddressBytes_t ownAddr, 01341 const ConnectionParams_t *connectionParams) { 01342 state.connected = 1; 01343 ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams); 01344 connectionCallChain.call(&callbackParams); 01345 } 01346 01347 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) { 01348 state.connected = 0; 01349 DisconnectionCallbackParams_t callbackParams(handle, reason); 01350 disconnectionCallChain.call(&callbackParams); 01351 } 01352 01353 void processAdvertisementReport(const BLEProtocol::AddressBytes_t peerAddr, 01354 int8_t rssi, 01355 bool isScanResponse, 01356 GapAdvertisingParams::AdvertisingType_t type, 01357 uint8_t advertisingDataLen, 01358 const uint8_t *advertisingData) { 01359 AdvertisementCallbackParams_t params; 01360 memcpy(params.peerAddr, peerAddr, ADDR_LEN); 01361 params.rssi = rssi; 01362 params.isScanResponse = isScanResponse; 01363 params.type = type; 01364 params.advertisingDataLen = advertisingDataLen; 01365 params.advertisingData = advertisingData; 01366 onAdvertisementReport.call(¶ms); 01367 } 01368 01369 void processTimeoutEvent(TimeoutSource_t source) { 01370 if (timeoutCallbackChain) { 01371 timeoutCallbackChain(source); 01372 } 01373 } 01374 01375 protected: 01376 GapAdvertisingParams _advParams; 01377 GapAdvertisingData _advPayload; 01378 GapScanningParams _scanningParams; 01379 GapAdvertisingData _scanResponse; 01380 01381 GapState_t state; 01382 bool scanningActive; 01383 01384 protected: 01385 TimeoutEventCallbackChain_t timeoutCallbackChain; 01386 RadioNotificationEventCallback_t radioNotificationCallback; 01387 AdvertisementReportCallback_t onAdvertisementReport; 01388 ConnectionEventCallbackChain_t connectionCallChain; 01389 DisconnectionEventCallbackChain_t disconnectionCallChain; 01390 01391 private: 01392 GapShutdownCallbackChain_t shutdownCallChain; 01393 01394 private: 01395 /* Disallow copy and assignment. */ 01396 Gap(const Gap &); 01397 Gap& operator=(const Gap &); 01398 }; 01399 01400 #endif // ifndef __GAP_H__
Generated on Tue Jul 12 2022 21:14:55 by
1.7.2
