my version with changed conversion between duration units

Fork of BLE_API by Bluetooth Low Energy

Committer:
jslater8
Date:
Wed Aug 05 14:20:04 2015 +0000
Revision:
758:85c13328a10a
Parent:
754:9b391fb5c5d7
Conversion from Interval duration units to milliseconds now in GapAdvertisingParams.h and changed getInterval to properly convert back to milliseconds

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 710:b2e1a2660ec2 1 /* mbed Microcontroller Library
rgrover1 710:b2e1a2660ec2 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 710:b2e1a2660ec2 3 *
rgrover1 710:b2e1a2660ec2 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 710:b2e1a2660ec2 5 * you may not use this file except in compliance with the License.
rgrover1 710:b2e1a2660ec2 6 * You may obtain a copy of the License at
rgrover1 710:b2e1a2660ec2 7 *
rgrover1 710:b2e1a2660ec2 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 710:b2e1a2660ec2 9 *
rgrover1 710:b2e1a2660ec2 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 710:b2e1a2660ec2 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 710:b2e1a2660ec2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 710:b2e1a2660ec2 13 * See the License for the specific language governing permissions and
rgrover1 710:b2e1a2660ec2 14 * limitations under the License.
rgrover1 710:b2e1a2660ec2 15 */
rgrover1 710:b2e1a2660ec2 16
rgrover1 710:b2e1a2660ec2 17 #ifndef __GAP_H__
rgrover1 710:b2e1a2660ec2 18 #define __GAP_H__
rgrover1 710:b2e1a2660ec2 19
rgrover1 710:b2e1a2660ec2 20 #include "GapAdvertisingData.h"
rgrover1 710:b2e1a2660ec2 21 #include "GapAdvertisingParams.h"
rgrover1 710:b2e1a2660ec2 22 #include "GapScanningParams.h"
rgrover1 710:b2e1a2660ec2 23 #include "GapEvents.h"
rgrover1 710:b2e1a2660ec2 24 #include "CallChain.h"
rgrover1 710:b2e1a2660ec2 25 #include "FunctionPointerWithContext.h"
rgrover1 710:b2e1a2660ec2 26
rgrover1 710:b2e1a2660ec2 27 using namespace mbed;
rgrover1 710:b2e1a2660ec2 28
rgrover1 710:b2e1a2660ec2 29 /* Forward declarations for classes which will only be used for pointers or references in the following. */
rgrover1 710:b2e1a2660ec2 30 class GapAdvertisingParams;
rgrover1 710:b2e1a2660ec2 31 class GapScanningParams;
rgrover1 710:b2e1a2660ec2 32 class GapAdvertisingData;
rgrover1 710:b2e1a2660ec2 33
rgrover1 710:b2e1a2660ec2 34 class Gap {
rgrover1 710:b2e1a2660ec2 35 public:
rgrover1 710:b2e1a2660ec2 36 enum AddressType_t {
rgrover1 710:b2e1a2660ec2 37 ADDR_TYPE_PUBLIC = 0,
rgrover1 710:b2e1a2660ec2 38 ADDR_TYPE_RANDOM_STATIC,
rgrover1 710:b2e1a2660ec2 39 ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
rgrover1 710:b2e1a2660ec2 40 ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
rgrover1 710:b2e1a2660ec2 41 };
rgrover1 710:b2e1a2660ec2 42 typedef enum AddressType_t addr_type_t; /* @Note: deprecated. Use AddressType_t instead. */
rgrover1 710:b2e1a2660ec2 43
rgrover1 710:b2e1a2660ec2 44 static const unsigned ADDR_LEN = 6;
rgrover1 710:b2e1a2660ec2 45 typedef uint8_t Address_t[ADDR_LEN]; /* 48-bit address, LSB format. */
rgrover1 710:b2e1a2660ec2 46 typedef Address_t address_t; /* @Note: deprecated. Use Address_t instead. */
rgrover1 710:b2e1a2660ec2 47
rgrover1 710:b2e1a2660ec2 48 enum TimeoutSource_t {
rgrover1 710:b2e1a2660ec2 49 TIMEOUT_SRC_ADVERTISING = 0x00, /**< Advertising timeout. */
rgrover1 710:b2e1a2660ec2 50 TIMEOUT_SRC_SECURITY_REQUEST = 0x01, /**< Security request timeout. */
rgrover1 710:b2e1a2660ec2 51 TIMEOUT_SRC_SCAN = 0x02, /**< Scanning timeout. */
rgrover1 710:b2e1a2660ec2 52 TIMEOUT_SRC_CONN = 0x03, /**< Connection timeout. */
rgrover1 710:b2e1a2660ec2 53 };
rgrover1 710:b2e1a2660ec2 54
rgrover1 710:b2e1a2660ec2 55 /**
rgrover1 710:b2e1a2660ec2 56 * Enumeration for disconnection reasons. The values for these reasons are
rgrover1 710:b2e1a2660ec2 57 * derived from Nordic's implementation; but the reasons are meant to be
rgrover1 710:b2e1a2660ec2 58 * independent of the transport. If you are returned a reason which is not
rgrover1 710:b2e1a2660ec2 59 * covered by this enumeration, then please refer to the underlying
rgrover1 710:b2e1a2660ec2 60 * transport library.
rgrover1 710:b2e1a2660ec2 61 */
rgrover1 710:b2e1a2660ec2 62 enum DisconnectionReason_t {
rgrover1 710:b2e1a2660ec2 63 CONNECTION_TIMEOUT = 0x08,
rgrover1 710:b2e1a2660ec2 64 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 710:b2e1a2660ec2 65 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote Device Terminated Connection due to low resources.*/
rgrover1 710:b2e1a2660ec2 66 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote Device Terminated Connection due to power off. */
rgrover1 710:b2e1a2660ec2 67 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 710:b2e1a2660ec2 68 CONN_INTERVAL_UNACCEPTABLE = 0x3B,
rgrover1 710:b2e1a2660ec2 69 };
rgrover1 710:b2e1a2660ec2 70
rgrover1 710:b2e1a2660ec2 71 /* Describes the current state of the device (more than one bit can be set) */
rgrover1 710:b2e1a2660ec2 72 struct GapState_t {
rgrover1 710:b2e1a2660ec2 73 unsigned advertising : 1; /**< peripheral is currently advertising */
rgrover1 710:b2e1a2660ec2 74 unsigned connected : 1; /**< peripheral is connected to a central */
rgrover1 710:b2e1a2660ec2 75 };
rgrover1 710:b2e1a2660ec2 76
rgrover1 710:b2e1a2660ec2 77 typedef uint16_t Handle_t; /* Type for connection handle. */
rgrover1 710:b2e1a2660ec2 78
rgrover1 710:b2e1a2660ec2 79 typedef struct {
rgrover1 710:b2e1a2660ec2 80 uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 81 uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 82 uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 83 uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 84 } ConnectionParams_t;
rgrover1 710:b2e1a2660ec2 85
rgrover1 710:b2e1a2660ec2 86 enum Role_t {
rgrover1 710:b2e1a2660ec2 87 PERIPHERAL = 0x1, /**< Peripheral Role. */
rgrover1 710:b2e1a2660ec2 88 CENTRAL = 0x2, /**< Central Role. */
rgrover1 710:b2e1a2660ec2 89 };
rgrover1 710:b2e1a2660ec2 90
rgrover1 710:b2e1a2660ec2 91 struct AdvertisementCallbackParams_t {
rgrover1 710:b2e1a2660ec2 92 Address_t peerAddr;
rgrover1 710:b2e1a2660ec2 93 int8_t rssi;
rgrover1 710:b2e1a2660ec2 94 bool isScanResponse;
rgrover1 710:b2e1a2660ec2 95 GapAdvertisingParams::AdvertisingType_t type;
rgrover1 710:b2e1a2660ec2 96 uint8_t advertisingDataLen;
rgrover1 710:b2e1a2660ec2 97 const uint8_t *advertisingData;
rgrover1 710:b2e1a2660ec2 98 };
rgrover1 710:b2e1a2660ec2 99 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 710:b2e1a2660ec2 100
rgrover1 710:b2e1a2660ec2 101 struct ConnectionCallbackParams_t {
rgrover1 710:b2e1a2660ec2 102 Handle_t handle;
rgrover1 710:b2e1a2660ec2 103 Role_t role;
rgrover1 710:b2e1a2660ec2 104 AddressType_t peerAddrType;
rgrover1 710:b2e1a2660ec2 105 Address_t peerAddr;
rgrover1 710:b2e1a2660ec2 106 AddressType_t ownAddrType;
rgrover1 710:b2e1a2660ec2 107 Address_t ownAddr;
rgrover1 710:b2e1a2660ec2 108 const ConnectionParams_t *connectionParams;
rgrover1 710:b2e1a2660ec2 109
rgrover1 710:b2e1a2660ec2 110 ConnectionCallbackParams_t(Handle_t handleIn,
rgrover1 710:b2e1a2660ec2 111 Role_t roleIn,
rgrover1 710:b2e1a2660ec2 112 AddressType_t peerAddrTypeIn,
rgrover1 710:b2e1a2660ec2 113 const uint8_t *peerAddrIn,
rgrover1 710:b2e1a2660ec2 114 AddressType_t ownAddrTypeIn,
rgrover1 710:b2e1a2660ec2 115 const uint8_t *ownAddrIn,
rgrover1 710:b2e1a2660ec2 116 const ConnectionParams_t *connectionParamsIn) :
rgrover1 710:b2e1a2660ec2 117 handle(handleIn),
rgrover1 710:b2e1a2660ec2 118 role(roleIn),
rgrover1 710:b2e1a2660ec2 119 peerAddrType(peerAddrTypeIn),
rgrover1 710:b2e1a2660ec2 120 peerAddr(),
rgrover1 710:b2e1a2660ec2 121 ownAddrType(ownAddrTypeIn),
rgrover1 710:b2e1a2660ec2 122 ownAddr(),
rgrover1 710:b2e1a2660ec2 123 connectionParams(connectionParamsIn) {
rgrover1 710:b2e1a2660ec2 124 memcpy(peerAddr, peerAddrIn, ADDR_LEN);
rgrover1 710:b2e1a2660ec2 125 memcpy(ownAddr, ownAddrIn, ADDR_LEN);
rgrover1 710:b2e1a2660ec2 126 }
rgrover1 710:b2e1a2660ec2 127 };
rgrover1 710:b2e1a2660ec2 128
rgrover1 710:b2e1a2660ec2 129 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
rgrover1 710:b2e1a2660ec2 130 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 710:b2e1a2660ec2 131
rgrover1 710:b2e1a2660ec2 132 typedef void (*TimeoutEventCallback_t)(TimeoutSource_t source);
rgrover1 710:b2e1a2660ec2 133 typedef void (*ConnectionEventCallback_t)(const ConnectionCallbackParams_t *params);
rgrover1 710:b2e1a2660ec2 134 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 753:0f60274cd3ad 135 typedef FunctionPointerWithContext<bool> RadioNotificationEventCallback_t;
rgrover1 710:b2e1a2660ec2 136
rgrover1 710:b2e1a2660ec2 137 /*
rgrover1 710:b2e1a2660ec2 138 * The following functions are meant to be overridden in the platform-specific sub-class.
rgrover1 710:b2e1a2660ec2 139 */
rgrover1 710:b2e1a2660ec2 140 public:
rgrover1 710:b2e1a2660ec2 141 /**
rgrover1 710:b2e1a2660ec2 142 * Set the BTLE MAC address and type. Please note that the address format is
rgrover1 710:b2e1a2660ec2 143 * LSB (least significant byte first). Please refer to Address_t.
rgrover1 710:b2e1a2660ec2 144 *
rgrover1 710:b2e1a2660ec2 145 * @return BLE_ERROR_NONE on success.
rgrover1 710:b2e1a2660ec2 146 */
rgrover1 710:b2e1a2660ec2 147 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) {
rgrover1 734:4872b70437ce 148 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 149 (void)type;
rgrover1 734:4872b70437ce 150 (void)address;
rgrover1 734:4872b70437ce 151
rgrover1 728:997ba5e7b3b6 152 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 153 }
rgrover1 710:b2e1a2660ec2 154
rgrover1 710:b2e1a2660ec2 155 /**
rgrover1 710:b2e1a2660ec2 156 * Fetch the BTLE MAC address and type.
rgrover1 710:b2e1a2660ec2 157 *
rgrover1 710:b2e1a2660ec2 158 * @return BLE_ERROR_NONE on success.
rgrover1 710:b2e1a2660ec2 159 */
rgrover1 710:b2e1a2660ec2 160 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) {
rgrover1 734:4872b70437ce 161 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 162 (void)typeP;
rgrover1 734:4872b70437ce 163 (void)address;
rgrover1 734:4872b70437ce 164
rgrover1 728:997ba5e7b3b6 165 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 166 }
rgrover1 710:b2e1a2660ec2 167
rgrover1 710:b2e1a2660ec2 168 /**
rgrover1 710:b2e1a2660ec2 169 * @return Minimum Advertising interval in milliseconds.
rgrover1 710:b2e1a2660ec2 170 */
rgrover1 710:b2e1a2660ec2 171 virtual uint16_t getMinAdvertisingInterval(void) const {
rgrover1 742:861ed7eb186d 172 return 0; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 173 }
rgrover1 710:b2e1a2660ec2 174
rgrover1 710:b2e1a2660ec2 175 /**
rgrover1 710:b2e1a2660ec2 176 * @return Minimum Advertising interval in milliseconds for non-connectible mode.
rgrover1 710:b2e1a2660ec2 177 */
rgrover1 710:b2e1a2660ec2 178 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const {
rgrover1 742:861ed7eb186d 179 return 0; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 180 }
rgrover1 710:b2e1a2660ec2 181
rgrover1 710:b2e1a2660ec2 182 /**
rgrover1 710:b2e1a2660ec2 183 * @return Maximum Advertising interval in milliseconds.
rgrover1 710:b2e1a2660ec2 184 */
rgrover1 710:b2e1a2660ec2 185 virtual uint16_t getMaxAdvertisingInterval(void) const {
rgrover1 742:861ed7eb186d 186 return 0xFFFF; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 187 }
rgrover1 710:b2e1a2660ec2 188
rgrover1 710:b2e1a2660ec2 189 virtual ble_error_t stopAdvertising(void) {
rgrover1 728:997ba5e7b3b6 190 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 191 }
rgrover1 710:b2e1a2660ec2 192
rgrover1 710:b2e1a2660ec2 193 /**
rgrover1 710:b2e1a2660ec2 194 * Stop scanning. The current scanning parameters remain in effect.
rgrover1 710:b2e1a2660ec2 195 *
rgrover1 710:b2e1a2660ec2 196 * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
rgrover1 710:b2e1a2660ec2 197 */
rgrover1 710:b2e1a2660ec2 198 virtual ble_error_t stopScan() {
rgrover1 728:997ba5e7b3b6 199 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 200 }
rgrover1 710:b2e1a2660ec2 201
rgrover1 710:b2e1a2660ec2 202 /**
rgrover1 710:b2e1a2660ec2 203 * Create a connection (GAP Link Establishment).
rgrover1 710:b2e1a2660ec2 204 *
rgrover1 710:b2e1a2660ec2 205 * @param peerAddr
rgrover1 710:b2e1a2660ec2 206 * 48-bit address, LSB format.
rgrover1 710:b2e1a2660ec2 207 * @param peerAddrType
rgrover1 710:b2e1a2660ec2 208 * Address type of the peer.
rgrover1 710:b2e1a2660ec2 209 * @param connectionParams
rgrover1 710:b2e1a2660ec2 210 * Connection parameters.
rgrover1 710:b2e1a2660ec2 211 * @param scanParams
rgrover1 710:b2e1a2660ec2 212 * Paramters to be used while scanning for the peer.
rgrover1 710:b2e1a2660ec2 213 * @return BLE_ERROR_NONE if connection establishment procedure is started
rgrover1 710:b2e1a2660ec2 214 * successfully. The connectionCallback (if set) will be invoked upon
rgrover1 710:b2e1a2660ec2 215 * a connection event.
rgrover1 710:b2e1a2660ec2 216 */
rgrover1 710:b2e1a2660ec2 217 virtual ble_error_t connect(const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 218 Gap::AddressType_t peerAddrType,
rgrover1 710:b2e1a2660ec2 219 const ConnectionParams_t *connectionParams,
rgrover1 710:b2e1a2660ec2 220 const GapScanningParams *scanParams) {
rgrover1 734:4872b70437ce 221 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 222 (void)peerAddr;
rgrover1 734:4872b70437ce 223 (void)peerAddrType;
rgrover1 734:4872b70437ce 224 (void)connectionParams;
rgrover1 734:4872b70437ce 225 (void)scanParams;
rgrover1 734:4872b70437ce 226
rgrover1 728:997ba5e7b3b6 227 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 228 }
rgrover1 710:b2e1a2660ec2 229
rgrover1 710:b2e1a2660ec2 230 /**
rgrover1 710:b2e1a2660ec2 231 * This call initiates the disconnection procedure, and its completion will
rgrover1 710:b2e1a2660ec2 232 * be communicated to the application with an invocation of the
rgrover1 710:b2e1a2660ec2 233 * disconnectionCallback.
rgrover1 710:b2e1a2660ec2 234 *
rgrover1 710:b2e1a2660ec2 235 * @param reason
rgrover1 710:b2e1a2660ec2 236 * The reason for disconnection to be sent back to the peer.
rgrover1 710:b2e1a2660ec2 237 */
rgrover1 710:b2e1a2660ec2 238 virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason) {
rgrover1 734:4872b70437ce 239 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 240 (void)connectionHandle;
rgrover1 734:4872b70437ce 241 (void)reason;
rgrover1 734:4872b70437ce 242
rgrover1 728:997ba5e7b3b6 243 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 244 }
rgrover1 710:b2e1a2660ec2 245
rgrover1 710:b2e1a2660ec2 246 /**
rgrover1 710:b2e1a2660ec2 247 * This call initiates the disconnection procedure, and its completion will
rgrover1 710:b2e1a2660ec2 248 * be communicated to the application with an invocation of the
rgrover1 710:b2e1a2660ec2 249 * disconnectionCallback.
rgrover1 710:b2e1a2660ec2 250 *
rgrover1 710:b2e1a2660ec2 251 * @param reason
rgrover1 710:b2e1a2660ec2 252 * The reason for disconnection to be sent back to the peer.
rgrover1 710:b2e1a2660ec2 253 *
rgrover1 710:b2e1a2660ec2 254 * @note: this version of disconnect() doesn't take a connection handle. It
rgrover1 710:b2e1a2660ec2 255 * will work reliably only for stacks which are limited to a single
rgrover1 710:b2e1a2660ec2 256 * connection. This API should be considered *deprecated* in favour of the
rgrover1 710:b2e1a2660ec2 257 * altertive which takes a connection handle. It will be dropped in the future.
rgrover1 710:b2e1a2660ec2 258 */
rgrover1 710:b2e1a2660ec2 259 virtual ble_error_t disconnect(DisconnectionReason_t reason) {
rgrover1 734:4872b70437ce 260 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 261 (void)reason;
rgrover1 734:4872b70437ce 262
rgrover1 728:997ba5e7b3b6 263 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 264 }
rgrover1 710:b2e1a2660ec2 265
rgrover1 710:b2e1a2660ec2 266 /**
rgrover1 710:b2e1a2660ec2 267 * Get the GAP peripheral preferred connection parameters. These are the
rgrover1 710:b2e1a2660ec2 268 * defaults that the peripheral would like to have in a connection. The
rgrover1 710:b2e1a2660ec2 269 * choice of the connection parameters is eventually up to the central.
rgrover1 710:b2e1a2660ec2 270 *
rgrover1 710:b2e1a2660ec2 271 * @param[out] params
rgrover1 710:b2e1a2660ec2 272 * The structure where the parameters will be stored. Memory
rgrover1 710:b2e1a2660ec2 273 * for this is owned by the caller.
rgrover1 710:b2e1a2660ec2 274 *
rgrover1 710:b2e1a2660ec2 275 * @return BLE_ERROR_NONE if the parameters were successfully filled into
rgrover1 710:b2e1a2660ec2 276 * the given structure pointed to by params.
rgrover1 710:b2e1a2660ec2 277 */
rgrover1 710:b2e1a2660ec2 278 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) {
rgrover1 734:4872b70437ce 279 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 280 (void)params;
rgrover1 734:4872b70437ce 281
rgrover1 728:997ba5e7b3b6 282 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 283 }
rgrover1 710:b2e1a2660ec2 284
rgrover1 710:b2e1a2660ec2 285 /**
rgrover1 710:b2e1a2660ec2 286 * Set the GAP peripheral preferred connection parameters. These are the
rgrover1 710:b2e1a2660ec2 287 * defaults that the peripheral would like to have in a connection. The
rgrover1 710:b2e1a2660ec2 288 * choice of the connection parameters is eventually up to the central.
rgrover1 710:b2e1a2660ec2 289 *
rgrover1 710:b2e1a2660ec2 290 * @param[in] params
rgrover1 710:b2e1a2660ec2 291 * The structure containing the desired parameters.
rgrover1 710:b2e1a2660ec2 292 */
rgrover1 710:b2e1a2660ec2 293 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) {
rgrover1 734:4872b70437ce 294 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 295 (void)params;
rgrover1 734:4872b70437ce 296
rgrover1 728:997ba5e7b3b6 297 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 298 }
rgrover1 710:b2e1a2660ec2 299
rgrover1 710:b2e1a2660ec2 300 /**
rgrover1 710:b2e1a2660ec2 301 * Update connection parameters while in the peripheral role.
rgrover1 710:b2e1a2660ec2 302 * @details In the peripheral role, this will send the corresponding L2CAP request to the connected peer and wait for
rgrover1 710:b2e1a2660ec2 303 * the central to perform the procedure.
rgrover1 710:b2e1a2660ec2 304 * @param[in] handle
rgrover1 710:b2e1a2660ec2 305 * Connection Handle
rgrover1 710:b2e1a2660ec2 306 * @param[in] params
rgrover1 710:b2e1a2660ec2 307 * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
rgrover1 710:b2e1a2660ec2 308 * the parameters in the PPCP characteristic of the GAP service will be used instead.
rgrover1 710:b2e1a2660ec2 309 */
rgrover1 710:b2e1a2660ec2 310 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) {
rgrover1 734:4872b70437ce 311 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 312 (void)handle;
rgrover1 734:4872b70437ce 313 (void)params;
rgrover1 734:4872b70437ce 314
rgrover1 728:997ba5e7b3b6 315 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 316 }
rgrover1 710:b2e1a2660ec2 317
rgrover1 710:b2e1a2660ec2 318 /**
rgrover1 710:b2e1a2660ec2 319 * Set the device name characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 320 * @param[in] deviceName
rgrover1 710:b2e1a2660ec2 321 * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
rgrover1 710:b2e1a2660ec2 322 */
rgrover1 710:b2e1a2660ec2 323 virtual ble_error_t setDeviceName(const uint8_t *deviceName) {
rgrover1 734:4872b70437ce 324 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 325 (void)deviceName;
rgrover1 734:4872b70437ce 326
rgrover1 728:997ba5e7b3b6 327 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 328 }
rgrover1 710:b2e1a2660ec2 329
rgrover1 710:b2e1a2660ec2 330 /**
rgrover1 710:b2e1a2660ec2 331 * Get the value of the device name characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 332 * @param[out] deviceName
rgrover1 710:b2e1a2660ec2 333 * Pointer to an empty buffer where the UTF-8 *non NULL-
rgrover1 710:b2e1a2660ec2 334 * terminated* string will be placed. Set this
rgrover1 710:b2e1a2660ec2 335 * value to NULL in order to obtain the deviceName-length
rgrover1 710:b2e1a2660ec2 336 * from the 'length' parameter.
rgrover1 710:b2e1a2660ec2 337 *
rgrover1 710:b2e1a2660ec2 338 * @param[in/out] lengthP
rgrover1 710:b2e1a2660ec2 339 * (on input) Length of the buffer pointed to by deviceName;
rgrover1 710:b2e1a2660ec2 340 * (on output) the complete device name length (without the
rgrover1 710:b2e1a2660ec2 341 * null terminator).
rgrover1 710:b2e1a2660ec2 342 *
rgrover1 710:b2e1a2660ec2 343 * @note If the device name is longer than the size of the supplied buffer,
rgrover1 710:b2e1a2660ec2 344 * length will return the complete device name length, and not the
rgrover1 710:b2e1a2660ec2 345 * number of bytes actually returned in deviceName. The application may
rgrover1 710:b2e1a2660ec2 346 * use this information to retry with a suitable buffer size.
rgrover1 710:b2e1a2660ec2 347 */
rgrover1 710:b2e1a2660ec2 348 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) {
rgrover1 734:4872b70437ce 349 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 350 (void)deviceName;
rgrover1 734:4872b70437ce 351 (void)lengthP;
rgrover1 734:4872b70437ce 352
rgrover1 728:997ba5e7b3b6 353 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 354 }
rgrover1 710:b2e1a2660ec2 355
rgrover1 710:b2e1a2660ec2 356 /**
rgrover1 710:b2e1a2660ec2 357 * Set the appearance characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 358 * @param[in] appearance
rgrover1 710:b2e1a2660ec2 359 * The new value for the device-appearance.
rgrover1 710:b2e1a2660ec2 360 */
rgrover1 710:b2e1a2660ec2 361 virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) {
rgrover1 734:4872b70437ce 362 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 363 (void)appearance;
rgrover1 734:4872b70437ce 364
rgrover1 728:997ba5e7b3b6 365 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 366 }
rgrover1 710:b2e1a2660ec2 367
rgrover1 710:b2e1a2660ec2 368 /**
rgrover1 710:b2e1a2660ec2 369 * Get the appearance characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 370 * @param[out] appearance
rgrover1 710:b2e1a2660ec2 371 * The new value for the device-appearance.
rgrover1 710:b2e1a2660ec2 372 */
rgrover1 710:b2e1a2660ec2 373 virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) {
rgrover1 734:4872b70437ce 374 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 375 (void)appearanceP;
rgrover1 734:4872b70437ce 376
rgrover1 728:997ba5e7b3b6 377 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 378 }
rgrover1 710:b2e1a2660ec2 379
rgrover1 710:b2e1a2660ec2 380 /**
rgrover1 710:b2e1a2660ec2 381 * Set the radio's transmit power.
rgrover1 710:b2e1a2660ec2 382 * @param[in] txPower Radio transmit power in dBm.
rgrover1 710:b2e1a2660ec2 383 */
rgrover1 710:b2e1a2660ec2 384 virtual ble_error_t setTxPower(int8_t txPower) {
rgrover1 734:4872b70437ce 385 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 386 (void)txPower;
rgrover1 734:4872b70437ce 387
rgrover1 728:997ba5e7b3b6 388 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 389 }
rgrover1 710:b2e1a2660ec2 390
rgrover1 710:b2e1a2660ec2 391 /**
rgrover1 710:b2e1a2660ec2 392 * Query the underlying stack for permitted arguments for setTxPower().
rgrover1 710:b2e1a2660ec2 393 *
rgrover1 710:b2e1a2660ec2 394 * @param[out] valueArrayPP
rgrover1 710:b2e1a2660ec2 395 * Out parameter to receive the immutable array of Tx values.
rgrover1 710:b2e1a2660ec2 396 * @param[out] countP
rgrover1 710:b2e1a2660ec2 397 * Out parameter to receive the array's size.
rgrover1 710:b2e1a2660ec2 398 */
rgrover1 710:b2e1a2660ec2 399 virtual void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
rgrover1 734:4872b70437ce 400 /* avoid compiler warnings about unused variables */
rgrover1 734:4872b70437ce 401 (void)valueArrayPP;
rgrover1 734:4872b70437ce 402 (void)countP;
rgrover1 734:4872b70437ce 403
rgrover1 742:861ed7eb186d 404 *countP = 0; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 405 }
rgrover1 710:b2e1a2660ec2 406
rgrover1 710:b2e1a2660ec2 407 protected:
rgrover1 710:b2e1a2660ec2 408 /* Override the following in the underlying adaptation layer to provide the functionality of scanning. */
rgrover1 710:b2e1a2660ec2 409 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) {
rgrover1 728:997ba5e7b3b6 410 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 411 }
rgrover1 710:b2e1a2660ec2 412
rgrover1 710:b2e1a2660ec2 413 /*
rgrover1 710:b2e1a2660ec2 414 * APIs with non-virtual implementations.
rgrover1 710:b2e1a2660ec2 415 */
rgrover1 710:b2e1a2660ec2 416 public:
rgrover1 710:b2e1a2660ec2 417 /**
rgrover1 710:b2e1a2660ec2 418 * Returns the current GAP state of the device using a bitmask which
rgrover1 710:b2e1a2660ec2 419 * describes whether the device is advertising and/or connected.
rgrover1 710:b2e1a2660ec2 420 */
rgrover1 710:b2e1a2660ec2 421 GapState_t getState(void) const {
rgrover1 710:b2e1a2660ec2 422 return state;
rgrover1 710:b2e1a2660ec2 423 }
rgrover1 710:b2e1a2660ec2 424
rgrover1 710:b2e1a2660ec2 425 /**
rgrover1 710:b2e1a2660ec2 426 * Set the GAP advertising mode to use for this device.
rgrover1 710:b2e1a2660ec2 427 */
rgrover1 710:b2e1a2660ec2 428 void setAdvertisingType(GapAdvertisingParams::AdvertisingType_t advType) {
rgrover1 710:b2e1a2660ec2 429 _advParams.setAdvertisingType(advType);
rgrover1 710:b2e1a2660ec2 430 }
rgrover1 710:b2e1a2660ec2 431
rgrover1 710:b2e1a2660ec2 432 /**
rgrover1 710:b2e1a2660ec2 433 * @param[in] interval
rgrover1 710:b2e1a2660ec2 434 * Advertising interval in units of milliseconds. Advertising
rgrover1 710:b2e1a2660ec2 435 * is disabled if interval is 0. If interval is smaller than
rgrover1 710:b2e1a2660ec2 436 * the minimum supported value, then the minimum supported
rgrover1 710:b2e1a2660ec2 437 * value is used instead. This minimum value can be discovered
rgrover1 710:b2e1a2660ec2 438 * using getMinAdvertisingInterval().
rgrover1 710:b2e1a2660ec2 439 *
rgrover1 710:b2e1a2660ec2 440 * This field must be set to 0 if connectionMode is equal
rgrover1 710:b2e1a2660ec2 441 * to ADV_CONNECTABLE_DIRECTED.
rgrover1 710:b2e1a2660ec2 442 *
rgrover1 710:b2e1a2660ec2 443 * @note: Decreasing this value will allow central devices to detect a
rgrover1 710:b2e1a2660ec2 444 * peripheral faster at the expense of more power being used by the radio
rgrover1 710:b2e1a2660ec2 445 * due to the higher data transmit rate.
rgrover1 710:b2e1a2660ec2 446 *
rgrover1 710:b2e1a2660ec2 447 * @note: This API is now *deprecated* and will be dropped in the future.
rgrover1 710:b2e1a2660ec2 448 * You should use the parallel API from Gap directly. A former call to
rgrover1 710:b2e1a2660ec2 449 * ble.setAdvertisingInterval(...) should now be achieved using
rgrover1 710:b2e1a2660ec2 450 * ble.gap().setAdvertisingInterval(...).
rgrover1 710:b2e1a2660ec2 451 *
rgrover1 710:b2e1a2660ec2 452 * @Note: [WARNING] This API previously used 0.625ms as the unit for its
rgrover1 710:b2e1a2660ec2 453 * 'interval' argument. That required an explicit conversion from
rgrover1 710:b2e1a2660ec2 454 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is
rgrover1 710:b2e1a2660ec2 455 * no longer required as the new units are milliseconds. Any application
rgrover1 710:b2e1a2660ec2 456 * code depending on the old semantics would need to be updated accordingly.
rgrover1 710:b2e1a2660ec2 457 */
rgrover1 710:b2e1a2660ec2 458 void setAdvertisingInterval(uint16_t interval) {
rgrover1 710:b2e1a2660ec2 459 if (interval == 0) {
rgrover1 710:b2e1a2660ec2 460 stopAdvertising();
rgrover1 710:b2e1a2660ec2 461 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 710:b2e1a2660ec2 462 interval = getMinAdvertisingInterval();
rgrover1 710:b2e1a2660ec2 463 }
jslater8 758:85c13328a10a 464 _advParams.setInterval(GapAdvertisingParams::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 710:b2e1a2660ec2 465 }
rgrover1 710:b2e1a2660ec2 466
rgrover1 710:b2e1a2660ec2 467 /**
rgrover1 710:b2e1a2660ec2 468 * @param[in] timeout
rgrover1 710:b2e1a2660ec2 469 * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
rgrover1 710:b2e1a2660ec2 470 * and 16383). Use 0 to disable the advertising timeout.
rgrover1 710:b2e1a2660ec2 471 */
rgrover1 710:b2e1a2660ec2 472 void setAdvertisingTimeout(uint16_t timeout) {
rgrover1 710:b2e1a2660ec2 473 _advParams.setTimeout(timeout);
rgrover1 710:b2e1a2660ec2 474 }
rgrover1 710:b2e1a2660ec2 475
rgrover1 710:b2e1a2660ec2 476 /**
rgrover1 710:b2e1a2660ec2 477 * Start advertising.
rgrover1 710:b2e1a2660ec2 478 */
rgrover1 710:b2e1a2660ec2 479 ble_error_t startAdvertising(void) {
rgrover1 710:b2e1a2660ec2 480 setAdvertisingData(); /* update the underlying stack */
rgrover1 710:b2e1a2660ec2 481 return startAdvertising(_advParams);
rgrover1 710:b2e1a2660ec2 482 }
rgrover1 710:b2e1a2660ec2 483
rgrover1 710:b2e1a2660ec2 484 /**
rgrover1 710:b2e1a2660ec2 485 * Reset any advertising payload prepared from prior calls to
rgrover1 710:b2e1a2660ec2 486 * accumulateAdvertisingPayload(). This automatically propagates the re-
rgrover1 710:b2e1a2660ec2 487 * initialized adv payload to the underlying stack.
rgrover1 710:b2e1a2660ec2 488 *
rgrover1 710:b2e1a2660ec2 489 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 710:b2e1a2660ec2 490 * startAdvertising() before the update takes effect.
rgrover1 710:b2e1a2660ec2 491 */
rgrover1 710:b2e1a2660ec2 492 void clearAdvertisingPayload(void) {
rgrover1 710:b2e1a2660ec2 493 _advPayload.clear();
rgrover1 710:b2e1a2660ec2 494 setAdvertisingData();
rgrover1 710:b2e1a2660ec2 495 }
rgrover1 710:b2e1a2660ec2 496
rgrover1 710:b2e1a2660ec2 497 /**
rgrover1 710:b2e1a2660ec2 498 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 710:b2e1a2660ec2 499 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 710:b2e1a2660ec2 500 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 710:b2e1a2660ec2 501 * small.
rgrover1 710:b2e1a2660ec2 502 *
rgrover1 710:b2e1a2660ec2 503 * @param[in] flags
rgrover1 710:b2e1a2660ec2 504 * The flags to be added. Please refer to
rgrover1 710:b2e1a2660ec2 505 * GapAdvertisingData::Flags for valid flags. Multiple
rgrover1 710:b2e1a2660ec2 506 * flags may be specified in combination.
rgrover1 710:b2e1a2660ec2 507 */
rgrover1 710:b2e1a2660ec2 508 ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
rgrover1 710:b2e1a2660ec2 509 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 510 if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 511 return rc;
rgrover1 710:b2e1a2660ec2 512 }
rgrover1 710:b2e1a2660ec2 513
rgrover1 710:b2e1a2660ec2 514 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 515 }
rgrover1 710:b2e1a2660ec2 516
rgrover1 710:b2e1a2660ec2 517 /**
rgrover1 710:b2e1a2660ec2 518 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 710:b2e1a2660ec2 519 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 710:b2e1a2660ec2 520 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 710:b2e1a2660ec2 521 * small.
rgrover1 710:b2e1a2660ec2 522 *
rgrover1 710:b2e1a2660ec2 523 * @param app
rgrover1 710:b2e1a2660ec2 524 * The appearance of the peripheral.
rgrover1 710:b2e1a2660ec2 525 */
rgrover1 710:b2e1a2660ec2 526 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
rgrover1 710:b2e1a2660ec2 527 setAppearance(app);
rgrover1 710:b2e1a2660ec2 528
rgrover1 710:b2e1a2660ec2 529 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 530 if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 531 return rc;
rgrover1 710:b2e1a2660ec2 532 }
rgrover1 710:b2e1a2660ec2 533
rgrover1 710:b2e1a2660ec2 534 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 535 }
rgrover1 710:b2e1a2660ec2 536
rgrover1 710:b2e1a2660ec2 537 /**
rgrover1 710:b2e1a2660ec2 538 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 710:b2e1a2660ec2 539 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 710:b2e1a2660ec2 540 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 710:b2e1a2660ec2 541 * small.
rgrover1 710:b2e1a2660ec2 542 *
rgrover1 710:b2e1a2660ec2 543 * @param app
rgrover1 710:b2e1a2660ec2 544 * The max transmit power to be used by the controller. This is
rgrover1 710:b2e1a2660ec2 545 * only a hint.
rgrover1 710:b2e1a2660ec2 546 */
rgrover1 710:b2e1a2660ec2 547 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
rgrover1 710:b2e1a2660ec2 548 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 549 if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 550 return rc;
rgrover1 710:b2e1a2660ec2 551 }
rgrover1 710:b2e1a2660ec2 552
rgrover1 710:b2e1a2660ec2 553 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 554 }
rgrover1 710:b2e1a2660ec2 555
rgrover1 710:b2e1a2660ec2 556 /**
rgrover1 710:b2e1a2660ec2 557 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 710:b2e1a2660ec2 558 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 710:b2e1a2660ec2 559 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 710:b2e1a2660ec2 560 * advertising payload proves to be too small.
rgrover1 710:b2e1a2660ec2 561 *
rgrover1 710:b2e1a2660ec2 562 * @param type The type which describes the variable length data.
rgrover1 710:b2e1a2660ec2 563 * @param data data bytes.
rgrover1 710:b2e1a2660ec2 564 * @param len length of data.
rgrover1 710:b2e1a2660ec2 565 */
rgrover1 710:b2e1a2660ec2 566 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 710:b2e1a2660ec2 567 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 710:b2e1a2660ec2 568 setDeviceName(data);
rgrover1 710:b2e1a2660ec2 569 }
rgrover1 710:b2e1a2660ec2 570
rgrover1 710:b2e1a2660ec2 571 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 572 if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 573 return rc;
rgrover1 710:b2e1a2660ec2 574 }
rgrover1 710:b2e1a2660ec2 575
rgrover1 710:b2e1a2660ec2 576 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 577 }
rgrover1 710:b2e1a2660ec2 578
rgrover1 710:b2e1a2660ec2 579 /**
rgrover1 710:b2e1a2660ec2 580 * Setup a particular, user-constructed advertisement payload for the
rgrover1 710:b2e1a2660ec2 581 * underlying stack. It would be uncommon for this API to be used directly;
rgrover1 710:b2e1a2660ec2 582 * there are other APIs to build an advertisement payload (see above).
rgrover1 710:b2e1a2660ec2 583 */
rgrover1 710:b2e1a2660ec2 584 ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) {
rgrover1 710:b2e1a2660ec2 585 _advPayload = payload;
rgrover1 710:b2e1a2660ec2 586 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 587 }
rgrover1 710:b2e1a2660ec2 588
rgrover1 710:b2e1a2660ec2 589 /**
rgrover1 710:b2e1a2660ec2 590 * @return Read back advertising data. Useful for storing and
rgrover1 710:b2e1a2660ec2 591 * restoring payload.
rgrover1 710:b2e1a2660ec2 592 */
rgrover1 710:b2e1a2660ec2 593 const GapAdvertisingData &getAdvertisingPayload(void) const {
rgrover1 710:b2e1a2660ec2 594 return _advPayload;
rgrover1 710:b2e1a2660ec2 595 }
rgrover1 710:b2e1a2660ec2 596
rgrover1 710:b2e1a2660ec2 597 /**
rgrover1 710:b2e1a2660ec2 598 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 710:b2e1a2660ec2 599 * scanResponse payload.
rgrover1 710:b2e1a2660ec2 600 *
rgrover1 710:b2e1a2660ec2 601 * @param[in] type The type which describes the variable length data.
rgrover1 710:b2e1a2660ec2 602 * @param[in] data data bytes.
rgrover1 710:b2e1a2660ec2 603 * @param[in] len length of data.
rgrover1 710:b2e1a2660ec2 604 */
rgrover1 710:b2e1a2660ec2 605 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 710:b2e1a2660ec2 606 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 607 if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 608 return rc;
rgrover1 710:b2e1a2660ec2 609 }
rgrover1 710:b2e1a2660ec2 610
rgrover1 710:b2e1a2660ec2 611 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 612 }
rgrover1 710:b2e1a2660ec2 613
rgrover1 710:b2e1a2660ec2 614 /**
rgrover1 710:b2e1a2660ec2 615 * Reset any scan response prepared from prior calls to
rgrover1 710:b2e1a2660ec2 616 * accumulateScanResponse().
rgrover1 710:b2e1a2660ec2 617 *
rgrover1 710:b2e1a2660ec2 618 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 710:b2e1a2660ec2 619 * startAdvertising() before the update takes effect.
rgrover1 710:b2e1a2660ec2 620 */
rgrover1 710:b2e1a2660ec2 621 void clearScanResponse(void) {
rgrover1 710:b2e1a2660ec2 622 _scanResponse.clear();
rgrover1 710:b2e1a2660ec2 623 setAdvertisingData();
rgrover1 710:b2e1a2660ec2 624 }
rgrover1 710:b2e1a2660ec2 625
rgrover1 710:b2e1a2660ec2 626 /**
rgrover1 710:b2e1a2660ec2 627 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 628 * @param[in] interval
rgrover1 710:b2e1a2660ec2 629 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 630 * @param[in] window
rgrover1 710:b2e1a2660ec2 631 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 632 * @param[in] timeout
rgrover1 710:b2e1a2660ec2 633 * Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 710:b2e1a2660ec2 634 * @param[in] activeScanning
rgrover1 710:b2e1a2660ec2 635 * Set to True if active-scanning is required. This is used to fetch the
rgrover1 710:b2e1a2660ec2 636 * scan response from a peer if possible.
rgrover1 710:b2e1a2660ec2 637 *
rgrover1 710:b2e1a2660ec2 638 * The scanning window divided by the interval determines the duty cycle for
rgrover1 710:b2e1a2660ec2 639 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 710:b2e1a2660ec2 640 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 710:b2e1a2660ec2 641 * to have the interval and window set to the same value. In this case,
rgrover1 710:b2e1a2660ec2 642 * scanning is continuous, with a change of scanning frequency once every
rgrover1 710:b2e1a2660ec2 643 * interval.
rgrover1 710:b2e1a2660ec2 644 *
rgrover1 710:b2e1a2660ec2 645 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 646 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 647 *
rgrover1 710:b2e1a2660ec2 648 * @Note: The scan interval and window are recommendations to the BLE stack.
rgrover1 710:b2e1a2660ec2 649 */
rgrover1 710:b2e1a2660ec2 650 ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
rgrover1 710:b2e1a2660ec2 651 uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
rgrover1 710:b2e1a2660ec2 652 uint16_t timeout = 0,
rgrover1 710:b2e1a2660ec2 653 bool activeScanning = false) {
rgrover1 710:b2e1a2660ec2 654 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 655 if (((rc = _scanningParams.setInterval(interval)) == BLE_ERROR_NONE) &&
rgrover1 710:b2e1a2660ec2 656 ((rc = _scanningParams.setWindow(window)) == BLE_ERROR_NONE) &&
rgrover1 710:b2e1a2660ec2 657 ((rc = _scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) {
rgrover1 710:b2e1a2660ec2 658 _scanningParams.setActiveScanning(activeScanning);
rgrover1 710:b2e1a2660ec2 659 return BLE_ERROR_NONE;
rgrover1 710:b2e1a2660ec2 660 }
rgrover1 710:b2e1a2660ec2 661
rgrover1 710:b2e1a2660ec2 662 return rc;
rgrover1 710:b2e1a2660ec2 663 }
rgrover1 710:b2e1a2660ec2 664
rgrover1 710:b2e1a2660ec2 665 /**
rgrover1 710:b2e1a2660ec2 666 * Setup the scanInterval parameter for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 667 * @param[in] interval
rgrover1 710:b2e1a2660ec2 668 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 669 *
rgrover1 710:b2e1a2660ec2 670 * The scanning window divided by the interval determines the duty cycle for
rgrover1 710:b2e1a2660ec2 671 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 710:b2e1a2660ec2 672 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 710:b2e1a2660ec2 673 * to have the interval and window set to the same value. In this case,
rgrover1 710:b2e1a2660ec2 674 * scanning is continuous, with a change of scanning frequency once every
rgrover1 710:b2e1a2660ec2 675 * interval.
rgrover1 710:b2e1a2660ec2 676 *
rgrover1 710:b2e1a2660ec2 677 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 678 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 679 */
rgrover1 710:b2e1a2660ec2 680 ble_error_t setScanInterval(uint16_t interval) {
rgrover1 710:b2e1a2660ec2 681 return _scanningParams.setInterval(interval);
rgrover1 710:b2e1a2660ec2 682 }
rgrover1 710:b2e1a2660ec2 683
rgrover1 710:b2e1a2660ec2 684 /**
rgrover1 710:b2e1a2660ec2 685 * Setup the scanWindow parameter for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 686 * @param[in] window
rgrover1 710:b2e1a2660ec2 687 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 688 *
rgrover1 710:b2e1a2660ec2 689 * The scanning window divided by the interval determines the duty cycle for
rgrover1 710:b2e1a2660ec2 690 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 710:b2e1a2660ec2 691 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 710:b2e1a2660ec2 692 * to have the interval and window set to the same value. In this case,
rgrover1 710:b2e1a2660ec2 693 * scanning is continuous, with a change of scanning frequency once every
rgrover1 710:b2e1a2660ec2 694 * interval.
rgrover1 710:b2e1a2660ec2 695 *
rgrover1 710:b2e1a2660ec2 696 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 697 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 698 */
rgrover1 710:b2e1a2660ec2 699 ble_error_t setScanWindow(uint16_t window) {
rgrover1 710:b2e1a2660ec2 700 return _scanningParams.setWindow(window);
rgrover1 710:b2e1a2660ec2 701 }
rgrover1 710:b2e1a2660ec2 702
rgrover1 710:b2e1a2660ec2 703 /**
rgrover1 710:b2e1a2660ec2 704 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 705 * @param[in] timeout
rgrover1 710:b2e1a2660ec2 706 * Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 710:b2e1a2660ec2 707 *
rgrover1 710:b2e1a2660ec2 708 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 709 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 710 */
rgrover1 710:b2e1a2660ec2 711 ble_error_t setScanTimeout(uint16_t timeout) {
rgrover1 710:b2e1a2660ec2 712 return _scanningParams.setTimeout(timeout);
rgrover1 710:b2e1a2660ec2 713 }
rgrover1 710:b2e1a2660ec2 714
rgrover1 710:b2e1a2660ec2 715 /**
rgrover1 710:b2e1a2660ec2 716 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 717 * @param[in] activeScanning
rgrover1 710:b2e1a2660ec2 718 * Set to True if active-scanning is required. This is used to fetch the
rgrover1 710:b2e1a2660ec2 719 * scan response from a peer if possible.
rgrover1 710:b2e1a2660ec2 720 *
rgrover1 710:b2e1a2660ec2 721 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 722 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 723 */
rgrover1 710:b2e1a2660ec2 724 void setActiveScanning(bool activeScanning) {
rgrover1 710:b2e1a2660ec2 725 _scanningParams.setActiveScanning(activeScanning);
rgrover1 710:b2e1a2660ec2 726 }
rgrover1 710:b2e1a2660ec2 727
rgrover1 710:b2e1a2660ec2 728 /**
rgrover1 710:b2e1a2660ec2 729 * Start scanning (Observer Procedure) based on the parameters currently in
rgrover1 710:b2e1a2660ec2 730 * effect.
rgrover1 710:b2e1a2660ec2 731 *
rgrover1 710:b2e1a2660ec2 732 * @param[in] callback
rgrover1 710:b2e1a2660ec2 733 * The application specific callback to be invoked upon
rgrover1 710:b2e1a2660ec2 734 * receiving every advertisement report. This can be passed in
rgrover1 710:b2e1a2660ec2 735 * as NULL, in which case scanning may not be enabled at all.
rgrover1 710:b2e1a2660ec2 736 */
rgrover1 710:b2e1a2660ec2 737 ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
rgrover1 710:b2e1a2660ec2 738 ble_error_t err = BLE_ERROR_NONE;
rgrover1 710:b2e1a2660ec2 739 if (callback) {
rgrover1 710:b2e1a2660ec2 740 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 741 onAdvertisementReport.attach(callback);
rgrover1 710:b2e1a2660ec2 742 }
rgrover1 710:b2e1a2660ec2 743 }
rgrover1 710:b2e1a2660ec2 744
rgrover1 710:b2e1a2660ec2 745 return err;
rgrover1 710:b2e1a2660ec2 746 }
rgrover1 710:b2e1a2660ec2 747
rgrover1 710:b2e1a2660ec2 748 /**
rgrover1 710:b2e1a2660ec2 749 * Same as above, but this takes an (object, method) pair for a callback.
rgrover1 710:b2e1a2660ec2 750 */
rgrover1 710:b2e1a2660ec2 751 template<typename T>
rgrover1 710:b2e1a2660ec2 752 ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
rgrover1 710:b2e1a2660ec2 753 ble_error_t err = BLE_ERROR_NONE;
rgrover1 710:b2e1a2660ec2 754 if (object && callbackMember) {
rgrover1 710:b2e1a2660ec2 755 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 756 onAdvertisementReport.attach(object, callbackMember);
rgrover1 710:b2e1a2660ec2 757 }
rgrover1 710:b2e1a2660ec2 758 }
rgrover1 710:b2e1a2660ec2 759
rgrover1 710:b2e1a2660ec2 760 return err;
rgrover1 710:b2e1a2660ec2 761 }
rgrover1 710:b2e1a2660ec2 762
rgrover1 753:0f60274cd3ad 763 /**
rgrover1 753:0f60274cd3ad 764 * Initialize radio-notification events to be generated from the stack.
rgrover1 753:0f60274cd3ad 765 * This API doesn't need to be called directly;
rgrover1 753:0f60274cd3ad 766 *
rgrover1 753:0f60274cd3ad 767 * Radio Notification is a feature that enables ACTIVE and INACTIVE
rgrover1 753:0f60274cd3ad 768 * (nACTIVE) signals from the stack that notify the application when the
rgrover1 753:0f60274cd3ad 769 * radio is in use.
rgrover1 753:0f60274cd3ad 770 *
rgrover1 753:0f60274cd3ad 771 * The ACTIVE signal is sent before the Radio Event starts. The nACTIVE
rgrover1 753:0f60274cd3ad 772 * signal is sent at the end of the Radio Event. These signals can be used
rgrover1 753:0f60274cd3ad 773 * by the application programmer to synchronize application logic with radio
rgrover1 753:0f60274cd3ad 774 * activity. For example, the ACTIVE signal can be used to shut off external
rgrover1 753:0f60274cd3ad 775 * devices to manage peak current drawn during periods when the radio is on,
rgrover1 753:0f60274cd3ad 776 * or to trigger sensor data collection for transmission in the Radio Event.
rgrover1 753:0f60274cd3ad 777 *
rgrover1 753:0f60274cd3ad 778 * @return BLE_ERROR_NONE on successful initialization, otherwise an error code.
rgrover1 753:0f60274cd3ad 779 */
rgrover1 753:0f60274cd3ad 780 virtual ble_error_t initRadioNotification(void) {
rgrover1 753:0f60274cd3ad 781 return BLE_ERROR_NOT_IMPLEMENTED; /* Requesting action from porter(s): override this API if this capability is supported. */
rgrover1 753:0f60274cd3ad 782 }
rgrover1 753:0f60274cd3ad 783
rgrover1 710:b2e1a2660ec2 784 private:
rgrover1 710:b2e1a2660ec2 785 ble_error_t setAdvertisingData(void) {
rgrover1 710:b2e1a2660ec2 786 return setAdvertisingData(_advPayload, _scanResponse);
rgrover1 710:b2e1a2660ec2 787 }
rgrover1 710:b2e1a2660ec2 788
rgrover1 710:b2e1a2660ec2 789 private:
rgrover1 710:b2e1a2660ec2 790 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 710:b2e1a2660ec2 791 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 710:b2e1a2660ec2 792
rgrover1 710:b2e1a2660ec2 793 public:
rgrover1 710:b2e1a2660ec2 794 /**
rgrover1 710:b2e1a2660ec2 795 * Accessors to read back currently active advertising params.
rgrover1 710:b2e1a2660ec2 796 */
rgrover1 710:b2e1a2660ec2 797 GapAdvertisingParams &getAdvertisingParams(void) {
rgrover1 710:b2e1a2660ec2 798 return _advParams;
rgrover1 710:b2e1a2660ec2 799 }
rgrover1 710:b2e1a2660ec2 800 const GapAdvertisingParams &getAdvertisingParams(void) const {
rgrover1 710:b2e1a2660ec2 801 return _advParams;
rgrover1 710:b2e1a2660ec2 802 }
rgrover1 710:b2e1a2660ec2 803
rgrover1 710:b2e1a2660ec2 804 /**
rgrover1 710:b2e1a2660ec2 805 * Setup a particular, user-constructed set of advertisement parameters for
rgrover1 710:b2e1a2660ec2 806 * the underlying stack. It would be uncommon for this API to be used
rgrover1 710:b2e1a2660ec2 807 * directly; there are other APIs to tweak advertisement parameters
rgrover1 710:b2e1a2660ec2 808 * individually.
rgrover1 710:b2e1a2660ec2 809 */
rgrover1 710:b2e1a2660ec2 810 void setAdvertisingParams(const GapAdvertisingParams &newParams) {
rgrover1 710:b2e1a2660ec2 811 _advParams = newParams;
rgrover1 710:b2e1a2660ec2 812 }
rgrover1 710:b2e1a2660ec2 813
rgrover1 710:b2e1a2660ec2 814 /* Event callback handlers. */
rgrover1 710:b2e1a2660ec2 815 public:
rgrover1 710:b2e1a2660ec2 816 /**
rgrover1 710:b2e1a2660ec2 817 * Setup a callback for timeout events. Refer to TimeoutSource_t for
rgrover1 710:b2e1a2660ec2 818 * possible event types.
rgrover1 710:b2e1a2660ec2 819 */
rgrover1 710:b2e1a2660ec2 820 void onTimeout(TimeoutEventCallback_t callback) {timeoutCallback = callback;}
rgrover1 710:b2e1a2660ec2 821
rgrover1 710:b2e1a2660ec2 822 /**
rgrover1 710:b2e1a2660ec2 823 * Setup a callback for connection events. Refer to ConnectionEventCallback_t.
rgrover1 710:b2e1a2660ec2 824 */
rgrover1 710:b2e1a2660ec2 825 void onConnection(ConnectionEventCallback_t callback) {connectionCallback = callback;}
rgrover1 710:b2e1a2660ec2 826
rgrover1 710:b2e1a2660ec2 827 /**
rgrover1 710:b2e1a2660ec2 828 * Set the application callback for disconnection events.
rgrover1 710:b2e1a2660ec2 829 * @param callback
rgrover1 710:b2e1a2660ec2 830 * Pointer to the unique callback.
rgrover1 710:b2e1a2660ec2 831 */
rgrover1 710:b2e1a2660ec2 832 void onDisconnection(DisconnectionEventCallback_t callback) {disconnectionCallback = callback;}
rgrover1 710:b2e1a2660ec2 833
rgrover1 710:b2e1a2660ec2 834 /**
rgrover1 710:b2e1a2660ec2 835 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 710:b2e1a2660ec2 836 * callbacks receive no context and are therefore different from the
rgrover1 710:b2e1a2660ec2 837 * disconnectionCallback callback.
rgrover1 710:b2e1a2660ec2 838 * @param callback
rgrover1 710:b2e1a2660ec2 839 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 710:b2e1a2660ec2 840 */
rgrover1 710:b2e1a2660ec2 841 template<typename T>
rgrover1 710:b2e1a2660ec2 842 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 710:b2e1a2660ec2 843
rgrover1 710:b2e1a2660ec2 844 /**
rgrover1 710:b2e1a2660ec2 845 * Set the application callback for radio-notification events.
rgrover1 710:b2e1a2660ec2 846 *
rgrover1 710:b2e1a2660ec2 847 * Radio Notification is a feature that enables ACTIVE and INACTIVE
rgrover1 710:b2e1a2660ec2 848 * (nACTIVE) signals from the stack that notify the application when the
rgrover1 753:0f60274cd3ad 849 * radio is in use.
rgrover1 710:b2e1a2660ec2 850 *
rgrover1 710:b2e1a2660ec2 851 * The ACTIVE signal is sent before the Radio Event starts. The nACTIVE
rgrover1 710:b2e1a2660ec2 852 * signal is sent at the end of the Radio Event. These signals can be used
rgrover1 710:b2e1a2660ec2 853 * by the application programmer to synchronize application logic with radio
rgrover1 710:b2e1a2660ec2 854 * activity. For example, the ACTIVE signal can be used to shut off external
rgrover1 710:b2e1a2660ec2 855 * devices to manage peak current drawn during periods when the radio is on,
rgrover1 710:b2e1a2660ec2 856 * or to trigger sensor data collection for transmission in the Radio Event.
rgrover1 710:b2e1a2660ec2 857 *
rgrover1 710:b2e1a2660ec2 858 * @param callback
rgrover1 710:b2e1a2660ec2 859 * The application handler to be invoked in response to a radio
rgrover1 710:b2e1a2660ec2 860 * ACTIVE/INACTIVE event.
rgrover1 754:9b391fb5c5d7 861 *
rgrover1 754:9b391fb5c5d7 862 * or in the other version:
rgrover1 754:9b391fb5c5d7 863 *
rgrover1 754:9b391fb5c5d7 864 * @param tptr
rgrover1 754:9b391fb5c5d7 865 * Pointer to the object of a class defining the member callback
rgrover1 754:9b391fb5c5d7 866 * function (mptr).
rgrover1 754:9b391fb5c5d7 867 * @param mptr
rgrover1 754:9b391fb5c5d7 868 * The member callback (within the context of an object) to be
rgrover1 754:9b391fb5c5d7 869 * invoked in response to a radio ACTIVE/INACTIVE event.
rgrover1 710:b2e1a2660ec2 870 */
rgrover1 753:0f60274cd3ad 871 void onRadioNotification(void (*callback)(bool param)) {
rgrover1 753:0f60274cd3ad 872 radioNotificationCallback.attach(callback);
rgrover1 753:0f60274cd3ad 873 initRadioNotification();
rgrover1 753:0f60274cd3ad 874 }
rgrover1 753:0f60274cd3ad 875 template <typename T>
rgrover1 753:0f60274cd3ad 876 void onRadioNotification(T *tptr, void (T::*mptr)(bool)) {
rgrover1 753:0f60274cd3ad 877 radioNotificationCallback.attach(tptr, mptr);
rgrover1 753:0f60274cd3ad 878 initRadioNotification();
rgrover1 753:0f60274cd3ad 879 }
rgrover1 710:b2e1a2660ec2 880
rgrover1 710:b2e1a2660ec2 881 protected:
rgrover1 710:b2e1a2660ec2 882 Gap() :
rgrover1 710:b2e1a2660ec2 883 _advParams(),
rgrover1 710:b2e1a2660ec2 884 _advPayload(),
rgrover1 710:b2e1a2660ec2 885 _scanningParams(),
rgrover1 710:b2e1a2660ec2 886 _scanResponse(),
rgrover1 710:b2e1a2660ec2 887 state(),
rgrover1 710:b2e1a2660ec2 888 timeoutCallback(NULL),
rgrover1 710:b2e1a2660ec2 889 connectionCallback(NULL),
rgrover1 710:b2e1a2660ec2 890 disconnectionCallback(NULL),
rgrover1 710:b2e1a2660ec2 891 radioNotificationCallback(),
rgrover1 710:b2e1a2660ec2 892 onAdvertisementReport(),
rgrover1 710:b2e1a2660ec2 893 disconnectionCallChain() {
rgrover1 710:b2e1a2660ec2 894 _advPayload.clear();
rgrover1 710:b2e1a2660ec2 895 _scanResponse.clear();
rgrover1 710:b2e1a2660ec2 896 }
rgrover1 710:b2e1a2660ec2 897
rgrover1 710:b2e1a2660ec2 898 /* Entry points for the underlying stack to report events back to the user. */
rgrover1 710:b2e1a2660ec2 899 public:
rgrover1 710:b2e1a2660ec2 900 void processConnectionEvent(Handle_t handle,
rgrover1 710:b2e1a2660ec2 901 Role_t role,
rgrover1 710:b2e1a2660ec2 902 AddressType_t peerAddrType,
rgrover1 710:b2e1a2660ec2 903 const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 904 AddressType_t ownAddrType,
rgrover1 710:b2e1a2660ec2 905 const Address_t ownAddr,
rgrover1 710:b2e1a2660ec2 906 const ConnectionParams_t *connectionParams) {
rgrover1 710:b2e1a2660ec2 907 state.connected = 1;
rgrover1 710:b2e1a2660ec2 908 if (connectionCallback) {
rgrover1 710:b2e1a2660ec2 909 ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams);
rgrover1 710:b2e1a2660ec2 910 connectionCallback(&callbackParams);
rgrover1 710:b2e1a2660ec2 911 }
rgrover1 710:b2e1a2660ec2 912 }
rgrover1 710:b2e1a2660ec2 913
rgrover1 710:b2e1a2660ec2 914 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
rgrover1 710:b2e1a2660ec2 915 state.connected = 0;
rgrover1 710:b2e1a2660ec2 916 if (disconnectionCallback) {
rgrover1 710:b2e1a2660ec2 917 disconnectionCallback(handle, reason);
rgrover1 710:b2e1a2660ec2 918 }
rgrover1 710:b2e1a2660ec2 919 disconnectionCallChain.call();
rgrover1 710:b2e1a2660ec2 920 }
rgrover1 710:b2e1a2660ec2 921
rgrover1 710:b2e1a2660ec2 922 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 923 int8_t rssi,
rgrover1 710:b2e1a2660ec2 924 bool isScanResponse,
rgrover1 710:b2e1a2660ec2 925 GapAdvertisingParams::AdvertisingType_t type,
rgrover1 710:b2e1a2660ec2 926 uint8_t advertisingDataLen,
rgrover1 710:b2e1a2660ec2 927 const uint8_t *advertisingData) {
rgrover1 710:b2e1a2660ec2 928 AdvertisementCallbackParams_t params;
rgrover1 710:b2e1a2660ec2 929 memcpy(params.peerAddr, peerAddr, ADDR_LEN);
rgrover1 710:b2e1a2660ec2 930 params.rssi = rssi;
rgrover1 710:b2e1a2660ec2 931 params.isScanResponse = isScanResponse;
rgrover1 710:b2e1a2660ec2 932 params.type = type;
rgrover1 710:b2e1a2660ec2 933 params.advertisingDataLen = advertisingDataLen;
rgrover1 710:b2e1a2660ec2 934 params.advertisingData = advertisingData;
rgrover1 710:b2e1a2660ec2 935 onAdvertisementReport.call(&params);
rgrover1 710:b2e1a2660ec2 936 }
rgrover1 710:b2e1a2660ec2 937
rgrover1 710:b2e1a2660ec2 938 void processTimeoutEvent(TimeoutSource_t source) {
rgrover1 710:b2e1a2660ec2 939 if (timeoutCallback) {
rgrover1 710:b2e1a2660ec2 940 timeoutCallback(source);
rgrover1 710:b2e1a2660ec2 941 }
rgrover1 710:b2e1a2660ec2 942 }
rgrover1 710:b2e1a2660ec2 943
rgrover1 710:b2e1a2660ec2 944 protected:
rgrover1 710:b2e1a2660ec2 945 GapAdvertisingParams _advParams;
rgrover1 710:b2e1a2660ec2 946 GapAdvertisingData _advPayload;
rgrover1 710:b2e1a2660ec2 947 GapScanningParams _scanningParams;
rgrover1 710:b2e1a2660ec2 948 GapAdvertisingData _scanResponse;
rgrover1 710:b2e1a2660ec2 949
rgrover1 710:b2e1a2660ec2 950 GapState_t state;
rgrover1 710:b2e1a2660ec2 951
rgrover1 710:b2e1a2660ec2 952 protected:
rgrover1 710:b2e1a2660ec2 953 TimeoutEventCallback_t timeoutCallback;
rgrover1 710:b2e1a2660ec2 954 ConnectionEventCallback_t connectionCallback;
rgrover1 710:b2e1a2660ec2 955 DisconnectionEventCallback_t disconnectionCallback;
rgrover1 710:b2e1a2660ec2 956 RadioNotificationEventCallback_t radioNotificationCallback;
rgrover1 710:b2e1a2660ec2 957 AdvertisementReportCallback_t onAdvertisementReport;
rgrover1 710:b2e1a2660ec2 958 CallChain disconnectionCallChain;
rgrover1 710:b2e1a2660ec2 959
rgrover1 710:b2e1a2660ec2 960 private:
rgrover1 710:b2e1a2660ec2 961 /* disallow copy and assignment */
rgrover1 710:b2e1a2660ec2 962 Gap(const Gap &);
rgrover1 710:b2e1a2660ec2 963 Gap& operator=(const Gap &);
rgrover1 710:b2e1a2660ec2 964 };
rgrover1 710:b2e1a2660ec2 965
rgrover1 710:b2e1a2660ec2 966 #endif // ifndef __GAP_H__