High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:52:06 2015 +0100
Revision:
526:caa67c3187a0
Parent:
524:6e97ab392e2a
Child:
527:493185cebc03
Synchronized with git rev 9bcd7433
Author: Rohit Grover
Rename BLEDevice as BLE. Retain an alias to BLEDevice for the sake of compatibility with old code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 260:ea7f9f14cc15 1 /* mbed Microcontroller Library
rgrover1 260:ea7f9f14cc15 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 260:ea7f9f14cc15 3 *
rgrover1 260:ea7f9f14cc15 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 260:ea7f9f14cc15 5 * you may not use this file except in compliance with the License.
rgrover1 260:ea7f9f14cc15 6 * You may obtain a copy of the License at
rgrover1 260:ea7f9f14cc15 7 *
rgrover1 260:ea7f9f14cc15 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 260:ea7f9f14cc15 9 *
rgrover1 260:ea7f9f14cc15 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 260:ea7f9f14cc15 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 260:ea7f9f14cc15 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 260:ea7f9f14cc15 13 * See the License for the specific language governing permissions and
rgrover1 260:ea7f9f14cc15 14 * limitations under the License.
rgrover1 260:ea7f9f14cc15 15 */
rgrover1 260:ea7f9f14cc15 16
rgrover1 260:ea7f9f14cc15 17 #ifndef __GAP_H__
rgrover1 260:ea7f9f14cc15 18 #define __GAP_H__
rgrover1 260:ea7f9f14cc15 19
rgrover1 526:caa67c3187a0 20 #include "GapAdvertisingData.h"
rgrover1 526:caa67c3187a0 21 #include "GapAdvertisingParams.h"
rgrover1 260:ea7f9f14cc15 22 #include "GapEvents.h"
rgrover1 260:ea7f9f14cc15 23 #include "CallChain.h"
rgrover1 406:cec6778acc66 24 #include "FunctionPointerWithContext.h"
rgrover1 260:ea7f9f14cc15 25
rgrover1 260:ea7f9f14cc15 26 using namespace mbed;
rgrover1 260:ea7f9f14cc15 27
rgrover1 526:caa67c3187a0 28 class GapScanningParams; /* forward declaration */
rgrover1 397:9f5bfae7ea50 29
rgrover1 260:ea7f9f14cc15 30 class Gap {
rgrover1 260:ea7f9f14cc15 31 public:
rgrover1 375:9cb0b006227e 32 enum AddressType_t {
rgrover1 260:ea7f9f14cc15 33 ADDR_TYPE_PUBLIC = 0,
rgrover1 260:ea7f9f14cc15 34 ADDR_TYPE_RANDOM_STATIC,
rgrover1 260:ea7f9f14cc15 35 ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
rgrover1 260:ea7f9f14cc15 36 ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
rgrover1 375:9cb0b006227e 37 };
rgrover1 402:0e714ad205b4 38 typedef enum AddressType_t addr_type_t; /* @Note: deprecated. Use AddressType_t instead. */
rgrover1 260:ea7f9f14cc15 39
rgrover1 260:ea7f9f14cc15 40 static const unsigned ADDR_LEN = 6;
rgrover1 375:9cb0b006227e 41 typedef uint8_t Address_t[ADDR_LEN]; /* 48-bit address, LSB format. */
rgrover1 402:0e714ad205b4 42 typedef Address_t address_t; /* @Note: deprecated. Use Address_t instead. */
rgrover1 260:ea7f9f14cc15 43
rgrover1 380:2109a08c311c 44 enum AdvertisementType_t {
rgrover1 380:2109a08c311c 45 ADV_IND = 0x00, /**< Connectable undirected. */
rgrover1 380:2109a08c311c 46 ADV_DIRECT_IND = 0x01, /**< Connectable directed. */
rgrover1 380:2109a08c311c 47 ADV_SCAN_IND = 0x02, /**< Scannable undirected. */
rgrover1 380:2109a08c311c 48 ADV_NONCONN_IND = 0x03, /**< Non connectable undirected. */
rgrover1 380:2109a08c311c 49 };
rgrover1 380:2109a08c311c 50
rgrover1 260:ea7f9f14cc15 51 /**
rgrover1 260:ea7f9f14cc15 52 * Enumeration for disconnection reasons. The values for these reasons are
rgrover1 260:ea7f9f14cc15 53 * derived from Nordic's implementation; but the reasons are meant to be
rgrover1 260:ea7f9f14cc15 54 * independent of the transport. If you are returned a reason which is not
rgrover1 260:ea7f9f14cc15 55 * covered by this enumeration, then please refer to the underlying
rgrover1 260:ea7f9f14cc15 56 * transport library.
rgrover1 260:ea7f9f14cc15 57 */
rgrover1 260:ea7f9f14cc15 58 enum DisconnectionReason_t {
rgrover1 526:caa67c3187a0 59 CONNECTION_TIMEOUT = 0x08,
rgrover1 526:caa67c3187a0 60 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 526:caa67c3187a0 61 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote Device Terminated Connection due to low resources.*/
rgrover1 526:caa67c3187a0 62 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote Device Terminated Connection due to power off. */
rgrover1 526:caa67c3187a0 63 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 526:caa67c3187a0 64 CONN_INTERVAL_UNACCEPTABLE = 0x3B,
rgrover1 260:ea7f9f14cc15 65 };
rgrover1 260:ea7f9f14cc15 66
rgrover1 260:ea7f9f14cc15 67 /* Describes the current state of the device (more than one bit can be set) */
rgrover1 413:4d5fb1522cfb 68 struct GapState_t {
rgrover1 260:ea7f9f14cc15 69 unsigned advertising : 1; /**< peripheral is currently advertising */
rgrover1 260:ea7f9f14cc15 70 unsigned connected : 1; /**< peripheral is connected to a central */
rgrover1 413:4d5fb1522cfb 71 };
rgrover1 260:ea7f9f14cc15 72
rgrover1 260:ea7f9f14cc15 73 typedef uint16_t Handle_t;
rgrover1 260:ea7f9f14cc15 74
rgrover1 260:ea7f9f14cc15 75 typedef struct {
rgrover1 260:ea7f9f14cc15 76 uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 77 uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 78 uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 79 uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 80 } ConnectionParams_t;
rgrover1 260:ea7f9f14cc15 81
rgrover1 360:7d37e1adef33 82 enum SecurityMode_t {
rgrover1 361:9686f5c882fa 83 SECURITY_MODE_NO_ACCESS,
rgrover1 372:0db007a23f71 84 SECURITY_MODE_ENCRYPTION_OPEN_LINK, /**< require no protection, open link. */
rgrover1 372:0db007a23f71 85 SECURITY_MODE_ENCRYPTION_NO_MITM, /**< require encryption, but no MITM protection. */
rgrover1 372:0db007a23f71 86 SECURITY_MODE_ENCRYPTION_WITH_MITM, /**< require encryption and MITM protection. */
rgrover1 372:0db007a23f71 87 SECURITY_MODE_SIGNED_NO_MITM, /**< require signing or encryption, but no MITM protection. */
rgrover1 372:0db007a23f71 88 SECURITY_MODE_SIGNED_WITH_MITM, /**< require signing or encryption, and MITM protection. */
rgrover1 360:7d37e1adef33 89 };
rgrover1 360:7d37e1adef33 90
rgrover1 352:79d7cb60ae27 91 /**
rgrover1 352:79d7cb60ae27 92 * @brief Defines possible security status/states.
rgrover1 352:79d7cb60ae27 93 *
rgrover1 352:79d7cb60ae27 94 * @details Defines possible security status/states of a link when requested by getLinkSecurity().
rgrover1 352:79d7cb60ae27 95 */
rgrover1 352:79d7cb60ae27 96 enum LinkSecurityStatus_t {
rgrover1 352:79d7cb60ae27 97 NOT_ENCRYPTED, /**< The link is not secured. */
rgrover1 352:79d7cb60ae27 98 ENCRYPTION_IN_PROGRESS, /**< Link security is being established.*/
rgrover1 352:79d7cb60ae27 99 ENCRYPTED /**< The link is secure.*/
rgrover1 352:79d7cb60ae27 100 };
rgrover1 352:79d7cb60ae27 101
rgrover1 357:d4bb5d2b837a 102 enum SecurityIOCapabilities_t {
rgrover1 357:d4bb5d2b837a 103 IO_CAPS_DISPLAY_ONLY = 0x00, /**< Display Only. */
rgrover1 357:d4bb5d2b837a 104 IO_CAPS_DISPLAY_YESNO = 0x01, /**< Display and Yes/No entry. */
rgrover1 357:d4bb5d2b837a 105 IO_CAPS_KEYBOARD_ONLY = 0x02, /**< Keyboard Only. */
rgrover1 357:d4bb5d2b837a 106 IO_CAPS_NONE = 0x03, /**< No I/O capabilities. */
rgrover1 357:d4bb5d2b837a 107 IO_CAPS_KEYBOARD_DISPLAY = 0x04, /**< Keyboard and Display. */
rgrover1 357:d4bb5d2b837a 108 };
rgrover1 357:d4bb5d2b837a 109
rgrover1 359:611485c370f5 110 enum SecurityCompletionStatus_t {
rgrover1 359:611485c370f5 111 SEC_STATUS_SUCCESS = 0x00, /**< Procedure completed with success. */
rgrover1 359:611485c370f5 112 SEC_STATUS_TIMEOUT = 0x01, /**< Procedure timed out. */
rgrover1 359:611485c370f5 113 SEC_STATUS_PDU_INVALID = 0x02, /**< Invalid PDU received. */
rgrover1 367:c3f4ad55ed33 114 SEC_STATUS_PASSKEY_ENTRY_FAILED = 0x81, /**< Passkey entry failed (user canceled or other). */
rgrover1 359:611485c370f5 115 SEC_STATUS_OOB_NOT_AVAILABLE = 0x82, /**< Out of Band Key not available. */
rgrover1 359:611485c370f5 116 SEC_STATUS_AUTH_REQ = 0x83, /**< Authentication requirements not met. */
rgrover1 359:611485c370f5 117 SEC_STATUS_CONFIRM_VALUE = 0x84, /**< Confirm value failed. */
rgrover1 359:611485c370f5 118 SEC_STATUS_PAIRING_NOT_SUPP = 0x85, /**< Pairing not supported. */
rgrover1 359:611485c370f5 119 SEC_STATUS_ENC_KEY_SIZE = 0x86, /**< Encryption key size. */
rgrover1 359:611485c370f5 120 SEC_STATUS_SMP_CMD_UNSUPPORTED = 0x87, /**< Unsupported SMP command. */
rgrover1 359:611485c370f5 121 SEC_STATUS_UNSPECIFIED = 0x88, /**< Unspecified reason. */
rgrover1 359:611485c370f5 122 SEC_STATUS_REPEATED_ATTEMPTS = 0x89, /**< Too little time elapsed since last attempt. */
rgrover1 359:611485c370f5 123 SEC_STATUS_INVALID_PARAMS = 0x8A, /**< Invalid parameters. */
rgrover1 359:611485c370f5 124 };
rgrover1 359:611485c370f5 125
rgrover1 357:d4bb5d2b837a 126 /**
rgrover1 357:d4bb5d2b837a 127 * Declaration of type containing a passkey to be used during pairing. This
rgrover1 357:d4bb5d2b837a 128 * is passed into initializeSecurity() to specify a pre-programmed passkey
rgrover1 357:d4bb5d2b837a 129 * for authentication instead of generating a random one.
rgrover1 357:d4bb5d2b837a 130 */
rgrover1 357:d4bb5d2b837a 131 static const unsigned PASSKEY_LEN = 6;
rgrover1 357:d4bb5d2b837a 132 typedef uint8_t Passkey_t[PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */
rgrover1 357:d4bb5d2b837a 133
rgrover1 260:ea7f9f14cc15 134 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
rgrover1 398:9d7666c2305f 135 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 260:ea7f9f14cc15 136 static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 137 return (durationInMillis * 1000) / UNIT_1_25_MS;
rgrover1 260:ea7f9f14cc15 138 }
rgrover1 260:ea7f9f14cc15 139 static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 140 return (durationInMillis * 1000) / UNIT_0_625_MS;
rgrover1 260:ea7f9f14cc15 141 }
rgrover1 399:1a69d53f00cc 142 static uint16_t ADVERTISEMENT_DURATION_UNITS_TO_MS(uint16_t gapUnits) {
rgrover1 325:501ad8b8bbe5 143 return (gapUnits * UNIT_0_625_MS) / 1000;
rgrover1 325:501ad8b8bbe5 144 }
rgrover1 260:ea7f9f14cc15 145
rgrover1 260:ea7f9f14cc15 146 typedef void (*EventCallback_t)(void);
rgrover1 526:caa67c3187a0 147 typedef void (*ConnectionEventCallback_t)(Handle_t,
rgrover1 526:caa67c3187a0 148 AddressType_t peerAddrType, const Address_t peerAddr,
rgrover1 526:caa67c3187a0 149 AddressType_t ownAddrType, const Address_t ownAddr,
rgrover1 526:caa67c3187a0 150 const ConnectionParams_t *);
rgrover1 349:b8b2b3973c47 151 typedef void (*HandleSpecificEvent_t)(Handle_t handle);
rgrover1 260:ea7f9f14cc15 152 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 341:8a104d9d80c1 153 typedef void (*RadioNotificationEventCallback_t) (bool radio_active); /* gets passed true for ACTIVE; false for INACTIVE. */
rgrover1 363:a3d59a6e5da0 154 typedef void (*SecuritySetupInitiatedCallback_t)(Handle_t, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps);
rgrover1 363:a3d59a6e5da0 155 typedef void (*SecuritySetupCompletedCallback_t)(Handle_t, SecurityCompletionStatus_t status);
rgrover1 362:3b1ff00ad8a4 156 typedef void (*LinkSecuredCallback_t)(Handle_t handle, SecurityMode_t securityMode);
rgrover1 369:9a76cc068644 157 typedef void (*PasskeyDisplayCallback_t)(Handle_t handle, const Passkey_t passkey);
rgrover1 260:ea7f9f14cc15 158
rgrover1 526:caa67c3187a0 159 struct AdvertisementCallbackParams_t {
rgrover1 526:caa67c3187a0 160 Address_t peerAddr;
rgrover1 526:caa67c3187a0 161 int8_t rssi;
rgrover1 526:caa67c3187a0 162 bool isScanResponse;
rgrover1 526:caa67c3187a0 163 AdvertisementType_t type;
rgrover1 526:caa67c3187a0 164 uint8_t advertisingDataLen;
rgrover1 526:caa67c3187a0 165 const uint8_t *advertisingData;
rgrover1 526:caa67c3187a0 166 };
rgrover1 526:caa67c3187a0 167 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 514:1fa338281798 168
rgrover1 526:caa67c3187a0 169 public:
rgrover1 260:ea7f9f14cc15 170 /* These functions must be defined in the sub-class */
rgrover1 526:caa67c3187a0 171 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) = 0;
rgrover1 526:caa67c3187a0 172 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) = 0;
rgrover1 260:ea7f9f14cc15 173 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 260:ea7f9f14cc15 174 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 260:ea7f9f14cc15 175 virtual ble_error_t stopAdvertising(void) = 0;
rgrover1 392:3201f029c2eb 176 virtual ble_error_t stopScan() = 0;
rgrover1 325:501ad8b8bbe5 177 virtual uint16_t getMinAdvertisingInterval(void) const = 0;
rgrover1 325:501ad8b8bbe5 178 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const = 0;
rgrover1 325:501ad8b8bbe5 179 virtual uint16_t getMaxAdvertisingInterval(void) const = 0;
rgrover1 260:ea7f9f14cc15 180 virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
rgrover1 260:ea7f9f14cc15 181 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
rgrover1 260:ea7f9f14cc15 182 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
rgrover1 260:ea7f9f14cc15 183 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
rgrover1 260:ea7f9f14cc15 184
rgrover1 353:5ed63cda3038 185 virtual ble_error_t purgeAllBondingState(void) = 0;
rgrover1 352:79d7cb60ae27 186 virtual ble_error_t getLinkSecurity(Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) = 0;
rgrover1 352:79d7cb60ae27 187
rgrover1 260:ea7f9f14cc15 188 virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
rgrover1 260:ea7f9f14cc15 189 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
rgrover1 260:ea7f9f14cc15 190 virtual ble_error_t setAppearance(uint16_t appearance) = 0;
rgrover1 260:ea7f9f14cc15 191 virtual ble_error_t getAppearance(uint16_t *appearanceP) = 0;
rgrover1 260:ea7f9f14cc15 192
rgrover1 526:caa67c3187a0 193 virtual ble_error_t setTxPower(int8_t txPower) = 0;
rgrover1 526:caa67c3187a0 194 virtual void getPermittedTxPowerValues(const int8_t **, size_t *) = 0;
rgrover1 526:caa67c3187a0 195
rgrover1 407:ca6b956b33d1 196 ble_error_t startScan(const GapScanningParams &scanningParams, void (*callback)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 197 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 198 if (callback) {
rgrover1 407:ca6b956b33d1 199 if ((err = startRadioScan(scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 200 onAdvertisementReport.attach(callback);
rgrover1 407:ca6b956b33d1 201 }
rgrover1 407:ca6b956b33d1 202 }
rgrover1 407:ca6b956b33d1 203
rgrover1 407:ca6b956b33d1 204 return err;
rgrover1 407:ca6b956b33d1 205 }
rgrover1 407:ca6b956b33d1 206
rgrover1 407:ca6b956b33d1 207 template<typename T>
rgrover1 407:ca6b956b33d1 208 ble_error_t startScan(const GapScanningParams &scanningParams, T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 209 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 210 if (object && callbackMember) {
rgrover1 407:ca6b956b33d1 211 if ((err = startRadioScan(scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 212 onAdvertisementReport.attach(object, callbackMember);
rgrover1 407:ca6b956b33d1 213 }
rgrover1 407:ca6b956b33d1 214 }
rgrover1 407:ca6b956b33d1 215
rgrover1 407:ca6b956b33d1 216 return err;
rgrover1 407:ca6b956b33d1 217 }
rgrover1 407:ca6b956b33d1 218
rgrover1 526:caa67c3187a0 219 public:
rgrover1 407:ca6b956b33d1 220 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) = 0;
rgrover1 407:ca6b956b33d1 221
rgrover1 260:ea7f9f14cc15 222 /* Event callback handlers */
rgrover1 260:ea7f9f14cc15 223 void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
rgrover1 260:ea7f9f14cc15 224 void setOnConnection(ConnectionEventCallback_t callback) {onConnection = callback;}
rgrover1 260:ea7f9f14cc15 225
rgrover1 260:ea7f9f14cc15 226 /**
rgrover1 260:ea7f9f14cc15 227 * Set the application callback for disconnection events.
rgrover1 260:ea7f9f14cc15 228 * @param callback
rgrover1 260:ea7f9f14cc15 229 * Pointer to the unique callback.
rgrover1 260:ea7f9f14cc15 230 */
rgrover1 260:ea7f9f14cc15 231 void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
rgrover1 260:ea7f9f14cc15 232
rgrover1 260:ea7f9f14cc15 233 /**
rgrover1 341:8a104d9d80c1 234 * Set the application callback for radio-notification events.
rgrover1 341:8a104d9d80c1 235 * @param callback
rgrover1 367:c3f4ad55ed33 236 * Handler to be executed in response to a radio notification event.
rgrover1 341:8a104d9d80c1 237 */
rgrover1 341:8a104d9d80c1 238 virtual void setOnRadioNotification(RadioNotificationEventCallback_t callback) {onRadioNotification = callback;}
rgrover1 341:8a104d9d80c1 239
rgrover1 341:8a104d9d80c1 240 /**
rgrover1 349:b8b2b3973c47 241 * To indicate that security procedure for link has started.
rgrover1 349:b8b2b3973c47 242 */
rgrover1 364:03a7a439a3bf 243 virtual void setOnSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {onSecuritySetupInitiated = callback;}
rgrover1 349:b8b2b3973c47 244
rgrover1 349:b8b2b3973c47 245 /**
rgrover1 349:b8b2b3973c47 246 * To indicate that security procedure for link has completed.
rgrover1 349:b8b2b3973c47 247 */
rgrover1 364:03a7a439a3bf 248 virtual void setOnSecuritySetupCompleted(SecuritySetupCompletedCallback_t callback) {onSecuritySetupCompleted = callback;}
rgrover1 349:b8b2b3973c47 249
rgrover1 349:b8b2b3973c47 250 /**
rgrover1 349:b8b2b3973c47 251 * To indicate that link with the peer is secured. For bonded devices,
rgrover1 367:c3f4ad55ed33 252 * subsequent re-connections with bonded peer will result only in this callback
rgrover1 349:b8b2b3973c47 253 * when the link is secured and setup procedures will not occur unless the
rgrover1 349:b8b2b3973c47 254 * bonding information is either lost or deleted on either or both sides.
rgrover1 349:b8b2b3973c47 255 */
rgrover1 362:3b1ff00ad8a4 256 virtual void setOnLinkSecured(LinkSecuredCallback_t callback) {onLinkSecured = callback;}
rgrover1 349:b8b2b3973c47 257
rgrover1 349:b8b2b3973c47 258 /**
rgrover1 349:b8b2b3973c47 259 * To indicate that device context is stored persistently.
rgrover1 349:b8b2b3973c47 260 */
rgrover1 349:b8b2b3973c47 261 virtual void setOnSecurityContextStored(HandleSpecificEvent_t callback) {onSecurityContextStored = callback;}
rgrover1 349:b8b2b3973c47 262
rgrover1 349:b8b2b3973c47 263 /**
rgrover1 369:9a76cc068644 264 * To set the callback for when the passkey needs to be displayed on a peripheral with DISPLAY capability.
rgrover1 369:9a76cc068644 265 */
rgrover1 369:9a76cc068644 266 virtual void setOnPasskeyDisplay(PasskeyDisplayCallback_t callback) {onPasskeyDisplay = callback;}
rgrover1 369:9a76cc068644 267
rgrover1 369:9a76cc068644 268 /**
rgrover1 260:ea7f9f14cc15 269 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 260:ea7f9f14cc15 270 * callbacks receive no context and are therefore different from the
rgrover1 260:ea7f9f14cc15 271 * onDisconnection callback.
rgrover1 260:ea7f9f14cc15 272 * @param callback
rgrover1 260:ea7f9f14cc15 273 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 260:ea7f9f14cc15 274 *
rgrover1 260:ea7f9f14cc15 275 * @note the disconnection CallChain should have been merged with
rgrover1 260:ea7f9f14cc15 276 * onDisconnctionCallback; but this was not possible because
rgrover1 260:ea7f9f14cc15 277 * FunctionPointer (which is a building block for CallChain) doesn't
rgrover1 260:ea7f9f14cc15 278 * accept variadic templates.
rgrover1 260:ea7f9f14cc15 279 */
rgrover1 260:ea7f9f14cc15 280 template<typename T>
rgrover1 260:ea7f9f14cc15 281 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 260:ea7f9f14cc15 282
rgrover1 526:caa67c3187a0 283 public:
rgrover1 260:ea7f9f14cc15 284 GapState_t getState(void) const {
rgrover1 260:ea7f9f14cc15 285 return state;
rgrover1 260:ea7f9f14cc15 286 }
rgrover1 260:ea7f9f14cc15 287
rgrover1 260:ea7f9f14cc15 288 protected:
rgrover1 349:b8b2b3973c47 289 Gap() :
rgrover1 349:b8b2b3973c47 290 state(),
rgrover1 349:b8b2b3973c47 291 onTimeout(NULL),
rgrover1 349:b8b2b3973c47 292 onConnection(NULL),
rgrover1 349:b8b2b3973c47 293 onDisconnection(NULL),
rgrover1 349:b8b2b3973c47 294 onRadioNotification(),
rgrover1 364:03a7a439a3bf 295 onSecuritySetupInitiated(),
rgrover1 364:03a7a439a3bf 296 onSecuritySetupCompleted(),
rgrover1 349:b8b2b3973c47 297 onLinkSecured(),
rgrover1 349:b8b2b3973c47 298 onSecurityContextStored(),
rgrover1 369:9a76cc068644 299 onPasskeyDisplay(),
rgrover1 382:dcd0428dadb0 300 onAdvertisementReport(),
rgrover1 349:b8b2b3973c47 301 disconnectionCallChain() {
rgrover1 260:ea7f9f14cc15 302 /* empty */
rgrover1 260:ea7f9f14cc15 303 }
rgrover1 260:ea7f9f14cc15 304
rgrover1 260:ea7f9f14cc15 305 public:
rgrover1 526:caa67c3187a0 306 void processConnectionEvent(Handle_t handle, AddressType_t peerAddrType, const Address_t peerAddr, AddressType_t ownAddrType, const Address_t ownAddr, const ConnectionParams_t *params) {
rgrover1 260:ea7f9f14cc15 307 state.connected = 1;
rgrover1 260:ea7f9f14cc15 308 if (onConnection) {
rgrover1 526:caa67c3187a0 309 onConnection(handle, peerAddrType, peerAddr, ownAddrType, ownAddr, params);
rgrover1 260:ea7f9f14cc15 310 }
rgrover1 260:ea7f9f14cc15 311 }
rgrover1 260:ea7f9f14cc15 312
rgrover1 260:ea7f9f14cc15 313 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
rgrover1 260:ea7f9f14cc15 314 state.connected = 0;
rgrover1 260:ea7f9f14cc15 315 if (onDisconnection) {
rgrover1 260:ea7f9f14cc15 316 onDisconnection(handle, reason);
rgrover1 260:ea7f9f14cc15 317 }
rgrover1 260:ea7f9f14cc15 318 disconnectionCallChain.call();
rgrover1 260:ea7f9f14cc15 319 }
rgrover1 260:ea7f9f14cc15 320
rgrover1 363:a3d59a6e5da0 321 void processSecuritySetupInitiatedEvent(Handle_t handle, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps) {
rgrover1 364:03a7a439a3bf 322 if (onSecuritySetupInitiated) {
rgrover1 364:03a7a439a3bf 323 onSecuritySetupInitiated(handle, allowBonding, requireMITM, iocaps);
rgrover1 349:b8b2b3973c47 324 }
rgrover1 349:b8b2b3973c47 325 }
rgrover1 349:b8b2b3973c47 326
rgrover1 363:a3d59a6e5da0 327 void processSecuritySetupCompletedEvent(Handle_t handle, SecurityCompletionStatus_t status) {
rgrover1 364:03a7a439a3bf 328 if (onSecuritySetupCompleted) {
rgrover1 364:03a7a439a3bf 329 onSecuritySetupCompleted(handle, status);
rgrover1 349:b8b2b3973c47 330 }
rgrover1 349:b8b2b3973c47 331 }
rgrover1 349:b8b2b3973c47 332
rgrover1 362:3b1ff00ad8a4 333 void processLinkSecuredEvent(Handle_t handle, SecurityMode_t securityMode) {
rgrover1 349:b8b2b3973c47 334 if (onLinkSecured) {
rgrover1 362:3b1ff00ad8a4 335 onLinkSecured(handle, securityMode);
rgrover1 349:b8b2b3973c47 336 }
rgrover1 349:b8b2b3973c47 337 }
rgrover1 349:b8b2b3973c47 338
rgrover1 349:b8b2b3973c47 339 void processSecurityContextStoredEvent(Handle_t handle) {
rgrover1 349:b8b2b3973c47 340 if (onSecurityContextStored) {
rgrover1 349:b8b2b3973c47 341 onSecurityContextStored(handle);
rgrover1 349:b8b2b3973c47 342 }
rgrover1 349:b8b2b3973c47 343 }
rgrover1 349:b8b2b3973c47 344
rgrover1 369:9a76cc068644 345 void processPasskeyDisplayEvent(Handle_t handle, const Passkey_t passkey) {
rgrover1 369:9a76cc068644 346 if (onPasskeyDisplay) {
rgrover1 369:9a76cc068644 347 onPasskeyDisplay(handle, passkey);
rgrover1 369:9a76cc068644 348 }
rgrover1 369:9a76cc068644 349 }
rgrover1 369:9a76cc068644 350
rgrover1 405:8fc6e6855806 351 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 382:dcd0428dadb0 352 int8_t rssi,
rgrover1 382:dcd0428dadb0 353 bool isScanResponse,
rgrover1 382:dcd0428dadb0 354 AdvertisementType_t type,
rgrover1 382:dcd0428dadb0 355 uint8_t advertisingDataLen,
rgrover1 382:dcd0428dadb0 356 const uint8_t *advertisingData) {
rgrover1 406:cec6778acc66 357 AdvertisementCallbackParams_t params;
rgrover1 406:cec6778acc66 358 memcpy(params.peerAddr, peerAddr, ADDR_LEN);
rgrover1 406:cec6778acc66 359 params.rssi = rssi;
rgrover1 406:cec6778acc66 360 params.isScanResponse = isScanResponse;
rgrover1 406:cec6778acc66 361 params.type = type;
rgrover1 406:cec6778acc66 362 params.advertisingDataLen = advertisingDataLen;
rgrover1 406:cec6778acc66 363 params.advertisingData = advertisingData;
rgrover1 406:cec6778acc66 364 onAdvertisementReport.call(&params);
rgrover1 382:dcd0428dadb0 365 }
rgrover1 382:dcd0428dadb0 366
rgrover1 260:ea7f9f14cc15 367 void processEvent(GapEvents::gapEvent_e type) {
rgrover1 260:ea7f9f14cc15 368 switch (type) {
rgrover1 260:ea7f9f14cc15 369 case GapEvents::GAP_EVENT_TIMEOUT:
rgrover1 260:ea7f9f14cc15 370 state.advertising = 0;
rgrover1 260:ea7f9f14cc15 371 if (onTimeout) {
rgrover1 260:ea7f9f14cc15 372 onTimeout();
rgrover1 260:ea7f9f14cc15 373 }
rgrover1 260:ea7f9f14cc15 374 break;
rgrover1 267:ad6f6f40eb24 375 default:
rgrover1 267:ad6f6f40eb24 376 break;
rgrover1 260:ea7f9f14cc15 377 }
rgrover1 260:ea7f9f14cc15 378 }
rgrover1 260:ea7f9f14cc15 379
rgrover1 260:ea7f9f14cc15 380 protected:
rgrover1 363:a3d59a6e5da0 381 GapState_t state;
rgrover1 260:ea7f9f14cc15 382
rgrover1 337:e7c2eb38f5cc 383 protected:
rgrover1 363:a3d59a6e5da0 384 EventCallback_t onTimeout;
rgrover1 363:a3d59a6e5da0 385 ConnectionEventCallback_t onConnection;
rgrover1 363:a3d59a6e5da0 386 DisconnectionEventCallback_t onDisconnection;
rgrover1 363:a3d59a6e5da0 387 RadioNotificationEventCallback_t onRadioNotification;
rgrover1 364:03a7a439a3bf 388 SecuritySetupInitiatedCallback_t onSecuritySetupInitiated;
rgrover1 364:03a7a439a3bf 389 SecuritySetupCompletedCallback_t onSecuritySetupCompleted;
rgrover1 363:a3d59a6e5da0 390 LinkSecuredCallback_t onLinkSecured;
rgrover1 363:a3d59a6e5da0 391 HandleSpecificEvent_t onSecurityContextStored;
rgrover1 369:9a76cc068644 392 PasskeyDisplayCallback_t onPasskeyDisplay;
rgrover1 385:6e66d1c6de00 393 AdvertisementReportCallback_t onAdvertisementReport;
rgrover1 363:a3d59a6e5da0 394 CallChain disconnectionCallChain;
rgrover1 260:ea7f9f14cc15 395
rgrover1 260:ea7f9f14cc15 396 private:
rgrover1 260:ea7f9f14cc15 397 /* disallow copy and assignment */
rgrover1 260:ea7f9f14cc15 398 Gap(const Gap &);
rgrover1 260:ea7f9f14cc15 399 Gap& operator=(const Gap &);
rgrover1 260:ea7f9f14cc15 400 };
rgrover1 260:ea7f9f14cc15 401
rgrover1 260:ea7f9f14cc15 402 #endif // ifndef __GAP_H__