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:53:01 2015 +0100
Revision:
669:7179b4a5aa7d
Parent:
667:875aecb84719
Child:
670:5e4aecd9af5b
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 669:7179b4a5aa7d 20 #include "GapAdvertisingData.h"
rgrover1 669:7179b4a5aa7d 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 669:7179b4a5aa7d 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 567:e4b38e43de7c 44 enum AdvertisementType_t {
rgrover1 567:e4b38e43de7c 45 ADV_IND = 0x00, /**< Connectable undirected. */
rgrover1 567:e4b38e43de7c 46 ADV_DIRECT_IND = 0x01, /**< Connectable directed. */
rgrover1 567:e4b38e43de7c 47 ADV_SCAN_IND = 0x02, /**< Scannable undirected. */
rgrover1 567:e4b38e43de7c 48 ADV_NONCONN_IND = 0x03, /**< Non connectable undirected. */
rgrover1 541:aa30f63e7b3f 49 };
rgrover1 541:aa30f63e7b3f 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 669:7179b4a5aa7d 59 CONNECTION_TIMEOUT = 0x08,
rgrover1 669:7179b4a5aa7d 60 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 669:7179b4a5aa7d 61 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote Device Terminated Connection due to low resources.*/
rgrover1 669:7179b4a5aa7d 62 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote Device Terminated Connection due to power off. */
rgrover1 669:7179b4a5aa7d 63 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 669:7179b4a5aa7d 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 567:e4b38e43de7c 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 567:e4b38e43de7c 82 enum SecurityMode_t {
rgrover1 567:e4b38e43de7c 83 SECURITY_MODE_NO_ACCESS,
rgrover1 567:e4b38e43de7c 84 SECURITY_MODE_ENCRYPTION_OPEN_LINK, /**< require no protection, open link. */
rgrover1 567:e4b38e43de7c 85 SECURITY_MODE_ENCRYPTION_NO_MITM, /**< require encryption, but no MITM protection. */
rgrover1 567:e4b38e43de7c 86 SECURITY_MODE_ENCRYPTION_WITH_MITM, /**< require encryption and MITM protection. */
rgrover1 567:e4b38e43de7c 87 SECURITY_MODE_SIGNED_NO_MITM, /**< require signing or encryption, but no MITM protection. */
rgrover1 567:e4b38e43de7c 88 SECURITY_MODE_SIGNED_WITH_MITM, /**< require signing or encryption, and MITM protection. */
rgrover1 567:e4b38e43de7c 89 };
rgrover1 567:e4b38e43de7c 90
rgrover1 567:e4b38e43de7c 91 /**
rgrover1 567:e4b38e43de7c 92 * @brief Defines possible security status/states.
rgrover1 567:e4b38e43de7c 93 *
rgrover1 567:e4b38e43de7c 94 * @details Defines possible security status/states of a link when requested by getLinkSecurity().
rgrover1 567:e4b38e43de7c 95 */
rgrover1 567:e4b38e43de7c 96 enum LinkSecurityStatus_t {
rgrover1 567:e4b38e43de7c 97 NOT_ENCRYPTED, /**< The link is not secured. */
rgrover1 567:e4b38e43de7c 98 ENCRYPTION_IN_PROGRESS, /**< Link security is being established.*/
rgrover1 567:e4b38e43de7c 99 ENCRYPTED /**< The link is secure.*/
rgrover1 527:493185cebc03 100 };
rgrover1 527:493185cebc03 101
rgrover1 567:e4b38e43de7c 102 enum SecurityIOCapabilities_t {
rgrover1 567:e4b38e43de7c 103 IO_CAPS_DISPLAY_ONLY = 0x00, /**< Display Only. */
rgrover1 567:e4b38e43de7c 104 IO_CAPS_DISPLAY_YESNO = 0x01, /**< Display and Yes/No entry. */
rgrover1 567:e4b38e43de7c 105 IO_CAPS_KEYBOARD_ONLY = 0x02, /**< Keyboard Only. */
rgrover1 567:e4b38e43de7c 106 IO_CAPS_NONE = 0x03, /**< No I/O capabilities. */
rgrover1 567:e4b38e43de7c 107 IO_CAPS_KEYBOARD_DISPLAY = 0x04, /**< Keyboard and Display. */
rgrover1 527:493185cebc03 108 };
rgrover1 527:493185cebc03 109
rgrover1 567:e4b38e43de7c 110 enum SecurityCompletionStatus_t {
rgrover1 567:e4b38e43de7c 111 SEC_STATUS_SUCCESS = 0x00, /**< Procedure completed with success. */
rgrover1 567:e4b38e43de7c 112 SEC_STATUS_TIMEOUT = 0x01, /**< Procedure timed out. */
rgrover1 567:e4b38e43de7c 113 SEC_STATUS_PDU_INVALID = 0x02, /**< Invalid PDU received. */
rgrover1 567:e4b38e43de7c 114 SEC_STATUS_PASSKEY_ENTRY_FAILED = 0x81, /**< Passkey entry failed (user canceled or other). */
rgrover1 567:e4b38e43de7c 115 SEC_STATUS_OOB_NOT_AVAILABLE = 0x82, /**< Out of Band Key not available. */
rgrover1 567:e4b38e43de7c 116 SEC_STATUS_AUTH_REQ = 0x83, /**< Authentication requirements not met. */
rgrover1 567:e4b38e43de7c 117 SEC_STATUS_CONFIRM_VALUE = 0x84, /**< Confirm value failed. */
rgrover1 567:e4b38e43de7c 118 SEC_STATUS_PAIRING_NOT_SUPP = 0x85, /**< Pairing not supported. */
rgrover1 567:e4b38e43de7c 119 SEC_STATUS_ENC_KEY_SIZE = 0x86, /**< Encryption key size. */
rgrover1 567:e4b38e43de7c 120 SEC_STATUS_SMP_CMD_UNSUPPORTED = 0x87, /**< Unsupported SMP command. */
rgrover1 567:e4b38e43de7c 121 SEC_STATUS_UNSPECIFIED = 0x88, /**< Unspecified reason. */
rgrover1 567:e4b38e43de7c 122 SEC_STATUS_REPEATED_ATTEMPTS = 0x89, /**< Too little time elapsed since last attempt. */
rgrover1 567:e4b38e43de7c 123 SEC_STATUS_INVALID_PARAMS = 0x8A, /**< Invalid parameters. */
rgrover1 527:493185cebc03 124 };
rgrover1 527:493185cebc03 125
rgrover1 567:e4b38e43de7c 126 /**
rgrover1 567:e4b38e43de7c 127 * Declaration of type containing a passkey to be used during pairing. This
rgrover1 567:e4b38e43de7c 128 * is passed into initializeSecurity() to specify a pre-programmed passkey
rgrover1 567:e4b38e43de7c 129 * for authentication instead of generating a random one.
rgrover1 567:e4b38e43de7c 130 */
rgrover1 567:e4b38e43de7c 131 static const unsigned PASSKEY_LEN = 6;
rgrover1 567:e4b38e43de7c 132 typedef uint8_t Passkey_t[PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */
rgrover1 567:e4b38e43de7c 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 567:e4b38e43de7c 146 typedef void (*EventCallback_t)(void);
rgrover1 669:7179b4a5aa7d 147 typedef void (*ConnectionEventCallback_t)(Handle_t,
rgrover1 669:7179b4a5aa7d 148 AddressType_t peerAddrType, const Address_t peerAddr,
rgrover1 669:7179b4a5aa7d 149 AddressType_t ownAddrType, const Address_t ownAddr,
rgrover1 669:7179b4a5aa7d 150 const ConnectionParams_t *);
rgrover1 567:e4b38e43de7c 151 typedef void (*HandleSpecificEvent_t)(Handle_t handle);
rgrover1 260:ea7f9f14cc15 152 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 567:e4b38e43de7c 153 typedef void (*RadioNotificationEventCallback_t) (bool radio_active); /* gets passed true for ACTIVE; false for INACTIVE. */
rgrover1 567:e4b38e43de7c 154 typedef void (*SecuritySetupInitiatedCallback_t)(Handle_t, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps);
rgrover1 567:e4b38e43de7c 155 typedef void (*SecuritySetupCompletedCallback_t)(Handle_t, SecurityCompletionStatus_t status);
rgrover1 567:e4b38e43de7c 156 typedef void (*LinkSecuredCallback_t)(Handle_t handle, SecurityMode_t securityMode);
rgrover1 567:e4b38e43de7c 157 typedef void (*PasskeyDisplayCallback_t)(Handle_t handle, const Passkey_t passkey);
rgrover1 260:ea7f9f14cc15 158
rgrover1 669:7179b4a5aa7d 159 struct AdvertisementCallbackParams_t {
rgrover1 669:7179b4a5aa7d 160 Address_t peerAddr;
rgrover1 669:7179b4a5aa7d 161 int8_t rssi;
rgrover1 669:7179b4a5aa7d 162 bool isScanResponse;
rgrover1 669:7179b4a5aa7d 163 AdvertisementType_t type;
rgrover1 669:7179b4a5aa7d 164 uint8_t advertisingDataLen;
rgrover1 669:7179b4a5aa7d 165 const uint8_t *advertisingData;
rgrover1 669:7179b4a5aa7d 166 };
rgrover1 669:7179b4a5aa7d 167 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 534:754131484cf1 168
rgrover1 669:7179b4a5aa7d 169 public:
rgrover1 567:e4b38e43de7c 170 /* These functions must be defined in the sub-class */
rgrover1 669:7179b4a5aa7d 171 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) = 0;
rgrover1 669:7179b4a5aa7d 172 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) = 0;
rgrover1 567:e4b38e43de7c 173 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 567:e4b38e43de7c 174 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 567:e4b38e43de7c 175 virtual ble_error_t stopAdvertising(void) = 0;
rgrover1 567:e4b38e43de7c 176 virtual ble_error_t stopScan() = 0;
rgrover1 567:e4b38e43de7c 177 virtual uint16_t getMinAdvertisingInterval(void) const = 0;
rgrover1 567:e4b38e43de7c 178 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const = 0;
rgrover1 567:e4b38e43de7c 179 virtual uint16_t getMaxAdvertisingInterval(void) const = 0;
rgrover1 567:e4b38e43de7c 180 virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
rgrover1 567:e4b38e43de7c 181 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
rgrover1 567:e4b38e43de7c 182 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
rgrover1 567:e4b38e43de7c 183 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
rgrover1 537:00d5affbb2b2 184
rgrover1 567:e4b38e43de7c 185 virtual ble_error_t purgeAllBondingState(void) = 0;
rgrover1 567:e4b38e43de7c 186 virtual ble_error_t getLinkSecurity(Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) = 0;
rgrover1 537:00d5affbb2b2 187
rgrover1 567:e4b38e43de7c 188 virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
rgrover1 567:e4b38e43de7c 189 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
rgrover1 567:e4b38e43de7c 190 virtual ble_error_t setAppearance(uint16_t appearance) = 0;
rgrover1 567:e4b38e43de7c 191 virtual ble_error_t getAppearance(uint16_t *appearanceP) = 0;
rgrover1 534:754131484cf1 192
rgrover1 669:7179b4a5aa7d 193 virtual ble_error_t setTxPower(int8_t txPower) = 0;
rgrover1 669:7179b4a5aa7d 194 virtual void getPermittedTxPowerValues(const int8_t **, size_t *) = 0;
rgrover1 669:7179b4a5aa7d 195
rgrover1 567:e4b38e43de7c 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 567:e4b38e43de7c 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 567:e4b38e43de7c 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 567:e4b38e43de7c 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 669:7179b4a5aa7d 219 public:
rgrover1 567:e4b38e43de7c 220 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) = 0;
rgrover1 537:00d5affbb2b2 221
rgrover1 567:e4b38e43de7c 222 /* Event callback handlers */
rgrover1 567:e4b38e43de7c 223 void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
rgrover1 567:e4b38e43de7c 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 567:e4b38e43de7c 231 void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
rgrover1 567:e4b38e43de7c 232
rgrover1 567:e4b38e43de7c 233 /**
rgrover1 567:e4b38e43de7c 234 * Set the application callback for radio-notification events.
rgrover1 567:e4b38e43de7c 235 * @param callback
rgrover1 567:e4b38e43de7c 236 * Handler to be executed in response to a radio notification event.
rgrover1 567:e4b38e43de7c 237 */
rgrover1 567:e4b38e43de7c 238 virtual void setOnRadioNotification(RadioNotificationEventCallback_t callback) {onRadioNotification = callback;}
rgrover1 567:e4b38e43de7c 239
rgrover1 567:e4b38e43de7c 240 /**
rgrover1 567:e4b38e43de7c 241 * To indicate that security procedure for link has started.
rgrover1 567:e4b38e43de7c 242 */
rgrover1 567:e4b38e43de7c 243 virtual void setOnSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {onSecuritySetupInitiated = callback;}
rgrover1 567:e4b38e43de7c 244
rgrover1 567:e4b38e43de7c 245 /**
rgrover1 567:e4b38e43de7c 246 * To indicate that security procedure for link has completed.
rgrover1 567:e4b38e43de7c 247 */
rgrover1 567:e4b38e43de7c 248 virtual void setOnSecuritySetupCompleted(SecuritySetupCompletedCallback_t callback) {onSecuritySetupCompleted = callback;}
rgrover1 567:e4b38e43de7c 249
rgrover1 567:e4b38e43de7c 250 /**
rgrover1 567:e4b38e43de7c 251 * To indicate that link with the peer is secured. For bonded devices,
rgrover1 567:e4b38e43de7c 252 * subsequent re-connections with bonded peer will result only in this callback
rgrover1 567:e4b38e43de7c 253 * when the link is secured and setup procedures will not occur unless the
rgrover1 567:e4b38e43de7c 254 * bonding information is either lost or deleted on either or both sides.
rgrover1 567:e4b38e43de7c 255 */
rgrover1 567:e4b38e43de7c 256 virtual void setOnLinkSecured(LinkSecuredCallback_t callback) {onLinkSecured = callback;}
rgrover1 567:e4b38e43de7c 257
rgrover1 567:e4b38e43de7c 258 /**
rgrover1 567:e4b38e43de7c 259 * To indicate that device context is stored persistently.
rgrover1 567:e4b38e43de7c 260 */
rgrover1 567:e4b38e43de7c 261 virtual void setOnSecurityContextStored(HandleSpecificEvent_t callback) {onSecurityContextStored = callback;}
rgrover1 567:e4b38e43de7c 262
rgrover1 567:e4b38e43de7c 263 /**
rgrover1 567:e4b38e43de7c 264 * To set the callback for when the passkey needs to be displayed on a peripheral with DISPLAY capability.
rgrover1 567:e4b38e43de7c 265 */
rgrover1 567:e4b38e43de7c 266 virtual void setOnPasskeyDisplay(PasskeyDisplayCallback_t callback) {onPasskeyDisplay = callback;}
rgrover1 544:840f428d18c7 267
rgrover1 544:840f428d18c7 268 /**
rgrover1 544:840f428d18c7 269 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 544:840f428d18c7 270 * callbacks receive no context and are therefore different from the
rgrover1 567:e4b38e43de7c 271 * onDisconnection callback.
rgrover1 544:840f428d18c7 272 * @param callback
rgrover1 544:840f428d18c7 273 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 567:e4b38e43de7c 274 *
rgrover1 567:e4b38e43de7c 275 * @note the disconnection CallChain should have been merged with
rgrover1 567:e4b38e43de7c 276 * onDisconnctionCallback; but this was not possible because
rgrover1 567:e4b38e43de7c 277 * FunctionPointer (which is a building block for CallChain) doesn't
rgrover1 567:e4b38e43de7c 278 * accept variadic templates.
rgrover1 544:840f428d18c7 279 */
rgrover1 544:840f428d18c7 280 template<typename T>
rgrover1 544:840f428d18c7 281 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 260:ea7f9f14cc15 282
rgrover1 669:7179b4a5aa7d 283 public:
rgrover1 567:e4b38e43de7c 284 GapState_t getState(void) const {
rgrover1 567:e4b38e43de7c 285 return state;
rgrover1 567:e4b38e43de7c 286 }
rgrover1 341:8a104d9d80c1 287
rgrover1 260:ea7f9f14cc15 288 protected:
rgrover1 349:b8b2b3973c47 289 Gap() :
rgrover1 349:b8b2b3973c47 290 state(),
rgrover1 567:e4b38e43de7c 291 onTimeout(NULL),
rgrover1 567:e4b38e43de7c 292 onConnection(NULL),
rgrover1 567:e4b38e43de7c 293 onDisconnection(NULL),
rgrover1 567:e4b38e43de7c 294 onRadioNotification(),
rgrover1 567:e4b38e43de7c 295 onSecuritySetupInitiated(),
rgrover1 567:e4b38e43de7c 296 onSecuritySetupCompleted(),
rgrover1 567:e4b38e43de7c 297 onLinkSecured(),
rgrover1 567:e4b38e43de7c 298 onSecurityContextStored(),
rgrover1 567:e4b38e43de7c 299 onPasskeyDisplay(),
rgrover1 382:dcd0428dadb0 300 onAdvertisementReport(),
rgrover1 349:b8b2b3973c47 301 disconnectionCallChain() {
rgrover1 567:e4b38e43de7c 302 /* empty */
rgrover1 260:ea7f9f14cc15 303 }
rgrover1 260:ea7f9f14cc15 304
rgrover1 260:ea7f9f14cc15 305 public:
rgrover1 669:7179b4a5aa7d 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 567:e4b38e43de7c 308 if (onConnection) {
rgrover1 669:7179b4a5aa7d 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 567:e4b38e43de7c 315 if (onDisconnection) {
rgrover1 567:e4b38e43de7c 316 onDisconnection(handle, reason);
rgrover1 260:ea7f9f14cc15 317 }
rgrover1 260:ea7f9f14cc15 318 disconnectionCallChain.call();
rgrover1 260:ea7f9f14cc15 319 }
rgrover1 260:ea7f9f14cc15 320
rgrover1 567:e4b38e43de7c 321 void processSecuritySetupInitiatedEvent(Handle_t handle, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps) {
rgrover1 567:e4b38e43de7c 322 if (onSecuritySetupInitiated) {
rgrover1 567:e4b38e43de7c 323 onSecuritySetupInitiated(handle, allowBonding, requireMITM, iocaps);
rgrover1 567:e4b38e43de7c 324 }
rgrover1 567:e4b38e43de7c 325 }
rgrover1 567:e4b38e43de7c 326
rgrover1 567:e4b38e43de7c 327 void processSecuritySetupCompletedEvent(Handle_t handle, SecurityCompletionStatus_t status) {
rgrover1 567:e4b38e43de7c 328 if (onSecuritySetupCompleted) {
rgrover1 567:e4b38e43de7c 329 onSecuritySetupCompleted(handle, status);
rgrover1 567:e4b38e43de7c 330 }
rgrover1 567:e4b38e43de7c 331 }
rgrover1 567:e4b38e43de7c 332
rgrover1 567:e4b38e43de7c 333 void processLinkSecuredEvent(Handle_t handle, SecurityMode_t securityMode) {
rgrover1 567:e4b38e43de7c 334 if (onLinkSecured) {
rgrover1 567:e4b38e43de7c 335 onLinkSecured(handle, securityMode);
rgrover1 567:e4b38e43de7c 336 }
rgrover1 567:e4b38e43de7c 337 }
rgrover1 567:e4b38e43de7c 338
rgrover1 567:e4b38e43de7c 339 void processSecurityContextStoredEvent(Handle_t handle) {
rgrover1 567:e4b38e43de7c 340 if (onSecurityContextStored) {
rgrover1 567:e4b38e43de7c 341 onSecurityContextStored(handle);
rgrover1 567:e4b38e43de7c 342 }
rgrover1 567:e4b38e43de7c 343 }
rgrover1 567:e4b38e43de7c 344
rgrover1 567:e4b38e43de7c 345 void processPasskeyDisplayEvent(Handle_t handle, const Passkey_t passkey) {
rgrover1 567:e4b38e43de7c 346 if (onPasskeyDisplay) {
rgrover1 567:e4b38e43de7c 347 onPasskeyDisplay(handle, passkey);
rgrover1 567:e4b38e43de7c 348 }
rgrover1 567:e4b38e43de7c 349 }
rgrover1 567:e4b38e43de7c 350
rgrover1 567:e4b38e43de7c 351 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 567:e4b38e43de7c 352 int8_t rssi,
rgrover1 567:e4b38e43de7c 353 bool isScanResponse,
rgrover1 567:e4b38e43de7c 354 AdvertisementType_t type,
rgrover1 567:e4b38e43de7c 355 uint8_t advertisingDataLen,
rgrover1 567:e4b38e43de7c 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 567:e4b38e43de7c 367 void processEvent(GapEvents::gapEvent_e type) {
rgrover1 567:e4b38e43de7c 368 switch (type) {
rgrover1 567:e4b38e43de7c 369 case GapEvents::GAP_EVENT_TIMEOUT:
rgrover1 567:e4b38e43de7c 370 state.advertising = 0;
rgrover1 567:e4b38e43de7c 371 if (onTimeout) {
rgrover1 567:e4b38e43de7c 372 onTimeout();
rgrover1 567:e4b38e43de7c 373 }
rgrover1 567:e4b38e43de7c 374 break;
rgrover1 567:e4b38e43de7c 375 default:
rgrover1 567:e4b38e43de7c 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 567:e4b38e43de7c 384 EventCallback_t onTimeout;
rgrover1 567:e4b38e43de7c 385 ConnectionEventCallback_t onConnection;
rgrover1 567:e4b38e43de7c 386 DisconnectionEventCallback_t onDisconnection;
rgrover1 567:e4b38e43de7c 387 RadioNotificationEventCallback_t onRadioNotification;
rgrover1 567:e4b38e43de7c 388 SecuritySetupInitiatedCallback_t onSecuritySetupInitiated;
rgrover1 567:e4b38e43de7c 389 SecuritySetupCompletedCallback_t onSecuritySetupCompleted;
rgrover1 567:e4b38e43de7c 390 LinkSecuredCallback_t onLinkSecured;
rgrover1 567:e4b38e43de7c 391 HandleSpecificEvent_t onSecurityContextStored;
rgrover1 567:e4b38e43de7c 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__