Wouter van Kleunen / X_NUCLEO_IDB0XA1

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
wkleunen
Date:
Mon Sep 04 14:15:45 2017 +0000
Revision:
308:6eb827be2e91
Parent:
302:ed6f74ab78f9
Compilation fix for mbed 5.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 130:770ce14d3d15 1 /* mbed Microcontroller Library
Wolfgang Betz 130:770ce14d3d15 2 * Copyright (c) 2006-2013 ARM Limited
Wolfgang Betz 130:770ce14d3d15 3 *
Wolfgang Betz 130:770ce14d3d15 4 * Licensed under the Apache License, Version 2.0 (the "License");
Wolfgang Betz 130:770ce14d3d15 5 * you may not use this file except in compliance with the License.
Wolfgang Betz 130:770ce14d3d15 6 * You may obtain a copy of the License at
Wolfgang Betz 130:770ce14d3d15 7 *
Wolfgang Betz 130:770ce14d3d15 8 * http://www.apache.org/licenses/LICENSE-2.0
Wolfgang Betz 130:770ce14d3d15 9 *
Wolfgang Betz 130:770ce14d3d15 10 * Unless required by applicable law or agreed to in writing, software
Wolfgang Betz 130:770ce14d3d15 11 * distributed under the License is distributed on an "AS IS" BASIS,
Wolfgang Betz 130:770ce14d3d15 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Wolfgang Betz 130:770ce14d3d15 13 * See the License for the specific language governing permissions and
Wolfgang Betz 130:770ce14d3d15 14 * limitations under the License.
Wolfgang Betz 130:770ce14d3d15 15 */
Wolfgang Betz 130:770ce14d3d15 16
Wolfgang Betz 130:770ce14d3d15 17
Wolfgang Betz 130:770ce14d3d15 18 /**
Wolfgang Betz 130:770ce14d3d15 19 ******************************************************************************
Vincent Coubard 255:97adb68decd4 20 * @file BlueNRGGap.cpp
Wolfgang Betz 130:770ce14d3d15 21 * @author STMicroelectronics
Wolfgang Betz 130:770ce14d3d15 22 * @brief Implementation of BLE_API Gap Class
Wolfgang Betz 130:770ce14d3d15 23 ******************************************************************************
Wolfgang Betz 130:770ce14d3d15 24 * @copy
Wolfgang Betz 130:770ce14d3d15 25 *
Wolfgang Betz 130:770ce14d3d15 26 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Wolfgang Betz 130:770ce14d3d15 27 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
Wolfgang Betz 130:770ce14d3d15 28 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
Wolfgang Betz 130:770ce14d3d15 29 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
Wolfgang Betz 130:770ce14d3d15 30 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
Wolfgang Betz 130:770ce14d3d15 31 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Wolfgang Betz 130:770ce14d3d15 32 *
Wolfgang Betz 130:770ce14d3d15 33 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
Andrea Palmieri 229:9981f62cdb1a 34 */
Wolfgang Betz 130:770ce14d3d15 35
Wolfgang Betz 130:770ce14d3d15 36 /** @defgroup BlueNRGGap
Wolfgang Betz 130:770ce14d3d15 37 * @brief BlueNRG BLE_API GAP Adaptation
Wolfgang Betz 130:770ce14d3d15 38 * @{
Wolfgang Betz 130:770ce14d3d15 39 */
Wolfgang Betz 130:770ce14d3d15 40
Wolfgang Betz 130:770ce14d3d15 41 #include "BlueNRGDevice.h"
Vincent Coubard 278:a5209d8cfd61 42 #ifdef YOTTA_CFG_MBED_OS
Vincent Coubard 278:a5209d8cfd61 43 #include "mbed-drivers/mbed.h"
Vincent Coubard 278:a5209d8cfd61 44 #else
Vincent Coubard 278:a5209d8cfd61 45 #include "mbed.h"
Vincent Coubard 302:ed6f74ab78f9 46 #endif
Vincent Coubard 293:5a1f577bf92f 47 #include "ble_payload.h"
Vincent Coubard 293:5a1f577bf92f 48 #include "ble_utils.h"
Vincent Coubard 293:5a1f577bf92f 49 #include "ble_debug.h"
Wolfgang Betz 130:770ce14d3d15 50
Wolfgang Betz 130:770ce14d3d15 51 /*
Wolfgang Betz 130:770ce14d3d15 52 * Utility to process GAP specific events (e.g., Advertising timeout)
Wolfgang Betz 130:770ce14d3d15 53 */
Wolfgang Betz 130:770ce14d3d15 54 void BlueNRGGap::Process(void)
Vincent Coubard 255:97adb68decd4 55 {
Wolfgang Betz 130:770ce14d3d15 56 if(AdvToFlag) {
Wolfgang Betz 130:770ce14d3d15 57 stopAdvertising();
Wolfgang Betz 130:770ce14d3d15 58 }
Wolfgang Betz 130:770ce14d3d15 59
Wolfgang Betz 130:770ce14d3d15 60 }
Wolfgang Betz 130:770ce14d3d15 61
Wolfgang Betz 130:770ce14d3d15 62 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 63 /*!
Vincent Coubard 255:97adb68decd4 64 @brief Sets the advertising parameters and payload for the device.
Wolfgang Betz 130:770ce14d3d15 65 Note: Some data types give error when their adv data is updated using aci_gap_update_adv_data() API
Wolfgang Betz 130:770ce14d3d15 66
Wolfgang Betz 130:770ce14d3d15 67 @params[in] advData
Wolfgang Betz 130:770ce14d3d15 68 The primary advertising data payload
Wolfgang Betz 130:770ce14d3d15 69 @params[in] scanResponse
Wolfgang Betz 130:770ce14d3d15 70 The optional Scan Response payload if the advertising
Wolfgang Betz 130:770ce14d3d15 71 type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED
Wolfgang Betz 130:770ce14d3d15 72 in \ref GapAdveritinngParams
Wolfgang Betz 130:770ce14d3d15 73
Wolfgang Betz 130:770ce14d3d15 74 @returns \ref ble_error_t
Wolfgang Betz 130:770ce14d3d15 75
Wolfgang Betz 130:770ce14d3d15 76 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 77 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 78
Wolfgang Betz 130:770ce14d3d15 79 @retval BLE_ERROR_BUFFER_OVERFLOW
Wolfgang Betz 130:770ce14d3d15 80 The proposed action would cause a buffer overflow. All
Wolfgang Betz 130:770ce14d3d15 81 advertising payloads must be <= 31 bytes, for example.
Wolfgang Betz 130:770ce14d3d15 82
Wolfgang Betz 130:770ce14d3d15 83 @retval BLE_ERROR_NOT_IMPLEMENTED
Wolfgang Betz 130:770ce14d3d15 84 A feature was requested that is not yet supported in the
Wolfgang Betz 130:770ce14d3d15 85 nRF51 firmware or hardware.
Wolfgang Betz 130:770ce14d3d15 86
Wolfgang Betz 130:770ce14d3d15 87 @retval BLE_ERROR_PARAM_OUT_OF_RANGE
Wolfgang Betz 130:770ce14d3d15 88 One of the proposed values is outside the valid range.
Wolfgang Betz 130:770ce14d3d15 89
Wolfgang Betz 130:770ce14d3d15 90 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 91
Wolfgang Betz 130:770ce14d3d15 92 @code
Wolfgang Betz 130:770ce14d3d15 93
Wolfgang Betz 130:770ce14d3d15 94 @endcode
Wolfgang Betz 130:770ce14d3d15 95 */
Wolfgang Betz 130:770ce14d3d15 96 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 97 ble_error_t BlueNRGGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse)
Vincent Coubard 255:97adb68decd4 98 {
Wolfgang Betz 132:51056160fa4a 99 PRINTF("BlueNRGGap::setAdvertisingData\n\r");
Wolfgang Betz 130:770ce14d3d15 100 /* Make sure we don't exceed the advertising payload length */
Wolfgang Betz 130:770ce14d3d15 101 if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
Andrea Palmieri 237:64c2ddbd9329 102 PRINTF("Exceeded the advertising payload length\n\r");
Wolfgang Betz 130:770ce14d3d15 103 return BLE_ERROR_BUFFER_OVERFLOW;
Wolfgang Betz 130:770ce14d3d15 104 }
Vincent Coubard 254:f4d217cadbde 105
Wolfgang Betz 130:770ce14d3d15 106 /* Make sure we have a payload! */
Vincent Coubard 270:ca649990a830 107 if (advData.getPayloadLen() != 0) {
Andrea Palmieri 236:2a73f3a97452 108 PayloadPtr loadPtr(advData.getPayload(), advData.getPayloadLen());
Andrea Palmieri 236:2a73f3a97452 109
Vincent Coubard 253:9665a6f8bbdb 110 /* Align the GAP Service Appearance Char value coherently
Vincent Coubard 253:9665a6f8bbdb 111 This setting is duplicate (see below GapAdvertisingData::APPEARANCE)
Vincent Coubard 253:9665a6f8bbdb 112 since BLE API has an overloaded function for appearance
Vincent Coubard 253:9665a6f8bbdb 113 */
Vincent Coubard 253:9665a6f8bbdb 114 STORE_LE_16(deviceAppearance, advData.getAppearance());
Vincent Coubard 253:9665a6f8bbdb 115 setAppearance((GapAdvertisingData::Appearance)(deviceAppearance[1]<<8|deviceAppearance[0]));
Vincent Coubard 254:f4d217cadbde 116
Vincent Coubard 254:f4d217cadbde 117
Vincent Coubard 255:97adb68decd4 118 for(uint8_t index=0; index<loadPtr.getPayloadUnitCount(); index++) {
Wolfgang Betz 130:770ce14d3d15 119 loadPtr.getUnitAtIndex(index);
Wolfgang Betz 130:770ce14d3d15 120
Wolfgang Betz 132:51056160fa4a 121 PRINTF("adData[%d].length=%d\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getLenPtr()));
Vincent Coubard 255:97adb68decd4 122 PRINTF("adData[%d].AdType=0x%x\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()));
Vincent Coubard 255:97adb68decd4 123
Wolfgang Betz 130:770ce14d3d15 124 switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) {
Vincent Coubard 270:ca649990a830 125 /**< TX Power Level (in dBm) */
Vincent Coubard 270:ca649990a830 126 case GapAdvertisingData::TX_POWER_LEVEL:
Wolfgang Betz 130:770ce14d3d15 127 {
Vincent Coubard 255:97adb68decd4 128 PRINTF("Advertising type: TX_POWER_LEVEL\n\r");
Wolfgang Betz 130:770ce14d3d15 129 int8_t enHighPower = 0;
Wolfgang Betz 130:770ce14d3d15 130 int8_t paLevel = 0;
Andrea Palmieri 251:86df2c289e7c 131
Wolfgang Betz 130:770ce14d3d15 132 int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr();
Andrea Palmieri 251:86df2c289e7c 133 tBleStatus ret = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel);
Andrea Palmieri 251:86df2c289e7c 134 #ifdef DEBUG
Andrea Palmieri 251:86df2c289e7c 135 PRINTF("dbm=%d, ret=%d\n\r", dbm, ret);
Andrea Palmieri 251:86df2c289e7c 136 PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 137 #endif
Andrea Palmieri 251:86df2c289e7c 138 if(ret == BLE_STATUS_SUCCESS) {
Andrea Palmieri 251:86df2c289e7c 139 aci_hal_set_tx_power_level(enHighPower, paLevel);
Andrea Palmieri 251:86df2c289e7c 140 }
Wolfgang Betz 130:770ce14d3d15 141 break;
Wolfgang Betz 130:770ce14d3d15 142 }
Vincent Coubard 270:ca649990a830 143 /**< Appearance */
Vincent Coubard 270:ca649990a830 144 case GapAdvertisingData::APPEARANCE:
Vincent Coubard 253:9665a6f8bbdb 145 {
Vincent Coubard 253:9665a6f8bbdb 146 PRINTF("Advertising type: APPEARANCE\n\r");
Vincent Coubard 253:9665a6f8bbdb 147
Vincent Coubard 253:9665a6f8bbdb 148 GapAdvertisingData::Appearance appearanceP;
Vincent Coubard 253:9665a6f8bbdb 149 memcpy(deviceAppearance, loadPtr.getUnitAtIndex(index).getDataPtr(), 2);
Vincent Coubard 253:9665a6f8bbdb 150
Vincent Coubard 253:9665a6f8bbdb 151 PRINTF("input: deviceAppearance= 0x%x 0x%x\n\r", deviceAppearance[1], deviceAppearance[0]);
Vincent Coubard 253:9665a6f8bbdb 152
Vincent Coubard 253:9665a6f8bbdb 153 appearanceP = (GapAdvertisingData::Appearance)(deviceAppearance[1]<<8|deviceAppearance[0]);
Vincent Coubard 253:9665a6f8bbdb 154 /* Align the GAP Service Appearance Char value coherently */
Vincent Coubard 253:9665a6f8bbdb 155 setAppearance(appearanceP);
Vincent Coubard 253:9665a6f8bbdb 156 break;
Vincent Coubard 253:9665a6f8bbdb 157 }
Vincent Coubard 254:f4d217cadbde 158
Andrea Palmieri 236:2a73f3a97452 159 } // end switch
Andrea Palmieri 236:2a73f3a97452 160
Andrea Palmieri 236:2a73f3a97452 161 } //end for
Andrea Palmieri 236:2a73f3a97452 162
Wolfgang Betz 130:770ce14d3d15 163 }
Vincent Coubard 255:97adb68decd4 164
Vincent Coubard 302:ed6f74ab78f9 165 // update the advertising data in the shield if advertising is running
Vincent Coubard 302:ed6f74ab78f9 166 if (state.advertising == 1) {
Vincent Coubard 302:ed6f74ab78f9 167 tBleStatus ret = hci_le_set_scan_resp_data(scanResponse.getPayloadLen(), scanResponse.getPayload());
Vincent Coubard 302:ed6f74ab78f9 168
Vincent Coubard 302:ed6f74ab78f9 169 if(BLE_STATUS_SUCCESS != ret) {
Vincent Coubard 302:ed6f74ab78f9 170 PRINTF(" error while setting scan response data (ret=0x%x)\n", ret);
Vincent Coubard 302:ed6f74ab78f9 171 switch (ret) {
Vincent Coubard 302:ed6f74ab78f9 172 case BLE_STATUS_TIMEOUT:
Vincent Coubard 302:ed6f74ab78f9 173 return BLE_STACK_BUSY;
Vincent Coubard 302:ed6f74ab78f9 174 default:
Vincent Coubard 302:ed6f74ab78f9 175 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 302:ed6f74ab78f9 176 }
Vincent Coubard 302:ed6f74ab78f9 177 }
Vincent Coubard 302:ed6f74ab78f9 178
Vincent Coubard 302:ed6f74ab78f9 179 ret = hci_le_set_advertising_data(advData.getPayloadLen(), advData.getPayload());
Vincent Coubard 302:ed6f74ab78f9 180 if (ret) {
Vincent Coubard 302:ed6f74ab78f9 181 PRINTF("error while setting the payload\r\n");
Vincent Coubard 302:ed6f74ab78f9 182 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 302:ed6f74ab78f9 183 }
Vincent Coubard 302:ed6f74ab78f9 184 }
Vincent Coubard 302:ed6f74ab78f9 185
Vincent Coubard 270:ca649990a830 186 _advData = advData;
Vincent Coubard 270:ca649990a830 187 _scanResponse = scanResponse;
Vincent Coubard 255:97adb68decd4 188
Wolfgang Betz 130:770ce14d3d15 189 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 190 }
Wolfgang Betz 130:770ce14d3d15 191
Wolfgang Betz 130:770ce14d3d15 192 /*
Wolfgang Betz 130:770ce14d3d15 193 * Utility to set ADV timeout flag
Wolfgang Betz 130:770ce14d3d15 194 */
Wolfgang Betz 130:770ce14d3d15 195 void BlueNRGGap::setAdvToFlag(void) {
Wolfgang Betz 130:770ce14d3d15 196 AdvToFlag = true;
Wolfgang Betz 130:770ce14d3d15 197 }
Wolfgang Betz 130:770ce14d3d15 198
Wolfgang Betz 130:770ce14d3d15 199 /*
Wolfgang Betz 130:770ce14d3d15 200 * ADV timeout callback
Andrea Palmieri 229:9981f62cdb1a 201 */
Wolfgang Betz 138:32e3c4ca7a45 202 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 132:51056160fa4a 203 static void advTimeoutCB(void)
Wolfgang Betz 132:51056160fa4a 204 {
Wolfgang Betz 132:51056160fa4a 205 Gap::GapState_t state;
Vincent Coubard 255:97adb68decd4 206
Wolfgang Betz 132:51056160fa4a 207 state = BlueNRGGap::getInstance().getState();
Wolfgang Betz 132:51056160fa4a 208 if (state.advertising == 1) {
Vincent Coubard 255:97adb68decd4 209
Wolfgang Betz 132:51056160fa4a 210 BlueNRGGap::getInstance().stopAdvertising();
Vincent Coubard 255:97adb68decd4 211
Wolfgang Betz 132:51056160fa4a 212 }
Wolfgang Betz 132:51056160fa4a 213 }
Wolfgang Betz 132:51056160fa4a 214 #else
Wolfgang Betz 130:770ce14d3d15 215 static void advTimeoutCB(void)
Wolfgang Betz 130:770ce14d3d15 216 {
Wolfgang Betz 130:770ce14d3d15 217 Gap::GapState_t state;
Vincent Coubard 255:97adb68decd4 218
Wolfgang Betz 130:770ce14d3d15 219 state = BlueNRGGap::getInstance().getState();
Wolfgang Betz 130:770ce14d3d15 220 if (state.advertising == 1) {
Vincent Coubard 255:97adb68decd4 221
Wolfgang Betz 130:770ce14d3d15 222 BlueNRGGap::getInstance().setAdvToFlag();
Vincent Coubard 255:97adb68decd4 223
wkleunen 308:6eb827be2e91 224 /* disable the callback from the timeout */
wkleunen 308:6eb827be2e91 225 BlueNRGGap::getInstance().getAdvTimeout().detach();
Wolfgang Betz 130:770ce14d3d15 226 }
Wolfgang Betz 130:770ce14d3d15 227 }
Wolfgang Betz 138:32e3c4ca7a45 228 #endif /* AST_FOR_MBED_OS */
Vincent Coubard 255:97adb68decd4 229
Wolfgang Betz 130:770ce14d3d15 230 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 231 /*!
Wolfgang Betz 130:770ce14d3d15 232 @brief Starts the BLE HW, initialising any services that were
Wolfgang Betz 130:770ce14d3d15 233 added before this function was called.
Vincent Coubard 255:97adb68decd4 234
Wolfgang Betz 130:770ce14d3d15 235 @param[in] params
Wolfgang Betz 130:770ce14d3d15 236 Basic advertising details, including the advertising
Wolfgang Betz 130:770ce14d3d15 237 delay, timeout and how the device should be advertised
Vincent Coubard 255:97adb68decd4 238
Wolfgang Betz 130:770ce14d3d15 239 @note All services must be added before calling this function!
Wolfgang Betz 130:770ce14d3d15 240
Wolfgang Betz 130:770ce14d3d15 241 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 242
Wolfgang Betz 130:770ce14d3d15 243 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 244 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 245
Wolfgang Betz 130:770ce14d3d15 246 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 247
Wolfgang Betz 130:770ce14d3d15 248 @code
Wolfgang Betz 130:770ce14d3d15 249
Wolfgang Betz 130:770ce14d3d15 250 @endcode
Wolfgang Betz 130:770ce14d3d15 251 */
Wolfgang Betz 130:770ce14d3d15 252 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 253
Wolfgang Betz 130:770ce14d3d15 254 ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams &params)
Andrea Palmieri 187:2e517d3ddd71 255 {
Andrea Palmieri 187:2e517d3ddd71 256 tBleStatus ret;
Vincent Coubard 270:ca649990a830 257 int err;
Andrea Palmieri 187:2e517d3ddd71 258
Wolfgang Betz 130:770ce14d3d15 259 /* Make sure we support the advertising type */
Wolfgang Betz 130:770ce14d3d15 260 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
Andrea Palmieri 220:e02936f0d4c7 261 /* ToDo: This requires a proper security implementation, etc. */
Wolfgang Betz 130:770ce14d3d15 262 return BLE_ERROR_NOT_IMPLEMENTED;
Wolfgang Betz 130:770ce14d3d15 263 }
Wolfgang Betz 130:770ce14d3d15 264
Wolfgang Betz 130:770ce14d3d15 265 /* Check interval range */
Wolfgang Betz 130:770ce14d3d15 266 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) {
Wolfgang Betz 130:770ce14d3d15 267 /* Min delay is slightly longer for unconnectable devices */
Wolfgang Betz 130:770ce14d3d15 268 if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
Wolfgang Betz 130:770ce14d3d15 269 (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Wolfgang Betz 130:770ce14d3d15 270 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 271 }
Wolfgang Betz 130:770ce14d3d15 272 } else {
Wolfgang Betz 130:770ce14d3d15 273 if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN) ||
Wolfgang Betz 130:770ce14d3d15 274 (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Wolfgang Betz 130:770ce14d3d15 275 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 276 }
Wolfgang Betz 130:770ce14d3d15 277 }
Wolfgang Betz 130:770ce14d3d15 278
Wolfgang Betz 130:770ce14d3d15 279 /* Check timeout is zero for Connectable Directed */
Wolfgang Betz 130:770ce14d3d15 280 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) {
Wolfgang Betz 130:770ce14d3d15 281 /* Timeout must be 0 with this type, although we'll never get here */
Wolfgang Betz 130:770ce14d3d15 282 /* since this isn't implemented yet anyway */
Wolfgang Betz 130:770ce14d3d15 283 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 284 }
Wolfgang Betz 130:770ce14d3d15 285
Wolfgang Betz 130:770ce14d3d15 286 /* Check timeout for other advertising types */
Wolfgang Betz 130:770ce14d3d15 287 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
Wolfgang Betz 130:770ce14d3d15 288 (params.getTimeout() > GapAdvertisingParams::GAP_ADV_PARAMS_TIMEOUT_MAX)) {
Wolfgang Betz 130:770ce14d3d15 289 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 290 }
Wolfgang Betz 130:770ce14d3d15 291
Andrea Palmieri 229:9981f62cdb1a 292 /*
Andrea Palmieri 229:9981f62cdb1a 293 * Advertising filter policy setting
Andrea Palmieri 229:9981f62cdb1a 294 * FIXME: the Security Manager should be implemented
Andrea Palmieri 229:9981f62cdb1a 295 */
Andrea Palmieri 229:9981f62cdb1a 296 AdvertisingPolicyMode_t mode = getAdvertisingPolicyMode();
Andrea Palmieri 229:9981f62cdb1a 297 if(mode != ADV_POLICY_IGNORE_WHITELIST) {
Andrea Palmieri 229:9981f62cdb1a 298 ret = aci_gap_configure_whitelist();
Andrea Palmieri 229:9981f62cdb1a 299 if(ret != BLE_STATUS_SUCCESS) {
Andrea Palmieri 229:9981f62cdb1a 300 PRINTF("aci_gap_configure_whitelist ret=0x%x\n\r", ret);
Andrea Palmieri 229:9981f62cdb1a 301 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 229:9981f62cdb1a 302 }
Andrea Palmieri 229:9981f62cdb1a 303 }
Andrea Palmieri 229:9981f62cdb1a 304
Andrea Palmieri 229:9981f62cdb1a 305 uint8_t advFilterPolicy = NO_WHITE_LIST_USE;
Andrea Palmieri 229:9981f62cdb1a 306 switch(mode) {
Andrea Palmieri 229:9981f62cdb1a 307 case ADV_POLICY_FILTER_SCAN_REQS:
Andrea Palmieri 229:9981f62cdb1a 308 advFilterPolicy = WHITE_LIST_FOR_ONLY_SCAN;
Andrea Palmieri 229:9981f62cdb1a 309 break;
Andrea Palmieri 229:9981f62cdb1a 310 case ADV_POLICY_FILTER_CONN_REQS:
Andrea Palmieri 229:9981f62cdb1a 311 advFilterPolicy = WHITE_LIST_FOR_ONLY_CONN;
Andrea Palmieri 229:9981f62cdb1a 312 break;
Andrea Palmieri 229:9981f62cdb1a 313 case ADV_POLICY_FILTER_ALL_REQS:
Andrea Palmieri 229:9981f62cdb1a 314 advFilterPolicy = WHITE_LIST_FOR_ALL;
Andrea Palmieri 229:9981f62cdb1a 315 break;
Andrea Palmieri 229:9981f62cdb1a 316 default:
Andrea Palmieri 229:9981f62cdb1a 317 advFilterPolicy = NO_WHITE_LIST_USE;
Andrea Palmieri 229:9981f62cdb1a 318 break;
Andrea Palmieri 229:9981f62cdb1a 319 }
Andrea Palmieri 229:9981f62cdb1a 320
Andrea Palmieri 228:25368f053411 321 /* Check the ADV type before setting scan response data */
Andrea Palmieri 228:25368f053411 322 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ||
Andrea Palmieri 228:25368f053411 323 params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED) {
Andrea Palmieri 228:25368f053411 324
Andrea Palmieri 228:25368f053411 325 /* set scan response data */
Vincent Coubard 270:ca649990a830 326 PRINTF(" setting scan response data (_scanResponseLen=%u)\n", _scanResponse.getPayloadLen());
Vincent Coubard 270:ca649990a830 327 ret = hci_le_set_scan_resp_data(_scanResponse.getPayloadLen(), _scanResponse.getPayload());
Andrea Palmieri 228:25368f053411 328
Andrea Palmieri 228:25368f053411 329 if(BLE_STATUS_SUCCESS!=ret) {
Andrea Palmieri 228:25368f053411 330 PRINTF(" error while setting scan response data (ret=0x%x)\n", ret);
Andrea Palmieri 228:25368f053411 331 switch (ret) {
Andrea Palmieri 228:25368f053411 332 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 228:25368f053411 333 return BLE_STACK_BUSY;
Andrea Palmieri 228:25368f053411 334 default:
Andrea Palmieri 228:25368f053411 335 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 228:25368f053411 336 }
Andrea Palmieri 187:2e517d3ddd71 337 }
Andrea Palmieri 228:25368f053411 338 } else {
Andrea Palmieri 228:25368f053411 339 hci_le_set_scan_resp_data(0, NULL);
Andrea Palmieri 187:2e517d3ddd71 340 }
Wolfgang Betz 130:770ce14d3d15 341
Andrea Palmieri 232:aead10288880 342 setAdvParameters();
Andrea Palmieri 232:aead10288880 343 PRINTF("advInterval=%d advType=%d\n\r", advInterval, params.getAdvertisingType());
Wolfgang Betz 130:770ce14d3d15 344
Vincent Coubard 270:ca649990a830 345 err = hci_le_set_advertising_data(_advData.getPayloadLen(), _advData.getPayload());
Vincent Coubard 270:ca649990a830 346
Vincent Coubard 270:ca649990a830 347 if (err) {
Vincent Coubard 270:ca649990a830 348 PRINTF("error while setting the payload\r\n");
Vincent Coubard 270:ca649990a830 349 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 270:ca649990a830 350 }
Vincent Coubard 270:ca649990a830 351
Vincent Coubard 255:97adb68decd4 352 tBDAddr dummy_addr = { 0 };
Vincent Coubard 255:97adb68decd4 353 uint16_t advIntervalMin = advInterval == GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX ? advInterval - 1 : advInterval;
Vincent Coubard 255:97adb68decd4 354 uint16_t advIntervalMax = advIntervalMin + 1;
Vincent Coubard 255:97adb68decd4 355
Vincent Coubard 270:ca649990a830 356 err = hci_le_set_advertising_parameters(
Vincent Coubard 255:97adb68decd4 357 advIntervalMin,
Vincent Coubard 255:97adb68decd4 358 advIntervalMax,
Vincent Coubard 255:97adb68decd4 359 params.getAdvertisingType(),
Vincent Coubard 255:97adb68decd4 360 addr_type,
Vincent Coubard 255:97adb68decd4 361 0x00,
Vincent Coubard 255:97adb68decd4 362 dummy_addr,
Vincent Coubard 255:97adb68decd4 363 /* all channels */ 7,
Vincent Coubard 255:97adb68decd4 364 advFilterPolicy
Vincent Coubard 255:97adb68decd4 365 );
Vincent Coubard 255:97adb68decd4 366
Vincent Coubard 255:97adb68decd4 367 if (err) {
Vincent Coubard 259:323f588e5f57 368 PRINTF("impossible to set advertising parameters\n\r");
Vincent Coubard 259:323f588e5f57 369 PRINTF("advInterval min: %u, advInterval max: %u\n\r", advInterval, advInterval + 1);
Vincent Coubard 259:323f588e5f57 370 PRINTF("advType: %u, advFilterPolicy: %u\n\r", params.getAdvertisingType(), advFilterPolicy);
Vincent Coubard 255:97adb68decd4 371 return BLE_ERROR_INVALID_PARAM;
Vincent Coubard 255:97adb68decd4 372 }
Vincent Coubard 255:97adb68decd4 373
Vincent Coubard 255:97adb68decd4 374 err = hci_le_set_advertise_enable(0x01);
Vincent Coubard 255:97adb68decd4 375 if (err) {
Vincent Coubard 255:97adb68decd4 376 PRINTF("impossible to start advertising\n\r");
Vincent Coubard 255:97adb68decd4 377 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 255:97adb68decd4 378 }
Vincent Coubard 255:97adb68decd4 379
Vincent Coubard 255:97adb68decd4 380 state.advertising = 1;
Wolfgang Betz 130:770ce14d3d15 381
Vincent Coubard 255:97adb68decd4 382 AdvToFlag = false;
Vincent Coubard 255:97adb68decd4 383 if(params.getTimeout() != 0) {
Vincent Coubard 255:97adb68decd4 384 PRINTF("!!! attaching to!!!\n");
Vincent Coubard 255:97adb68decd4 385 #ifdef AST_FOR_MBED_OS
Vincent Coubard 255:97adb68decd4 386 minar::Scheduler::postCallback(advTimeoutCB).delay(minar::milliseconds(params.getTimeout() * 1000));
Vincent Coubard 255:97adb68decd4 387 #else
Vincent Coubard 255:97adb68decd4 388 advTimeout.attach(advTimeoutCB, params.getTimeout() * 1000);
Vincent Coubard 255:97adb68decd4 389 #endif
Vincent Coubard 255:97adb68decd4 390 }
Vincent Coubard 255:97adb68decd4 391
Vincent Coubard 255:97adb68decd4 392 return BLE_ERROR_NONE;
Vincent Coubard 255:97adb68decd4 393
Wolfgang Betz 130:770ce14d3d15 394 }
Wolfgang Betz 130:770ce14d3d15 395
Andrea Palmieri 238:b6454c839f42 396
Wolfgang Betz 130:770ce14d3d15 397 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 398 /*!
Wolfgang Betz 130:770ce14d3d15 399 @brief Stops the BLE HW and disconnects from any devices
Wolfgang Betz 130:770ce14d3d15 400
Wolfgang Betz 130:770ce14d3d15 401 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 402
Wolfgang Betz 130:770ce14d3d15 403 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 404 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 405
Wolfgang Betz 130:770ce14d3d15 406 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 407
Wolfgang Betz 130:770ce14d3d15 408 @code
Wolfgang Betz 130:770ce14d3d15 409
Wolfgang Betz 130:770ce14d3d15 410 @endcode
Wolfgang Betz 130:770ce14d3d15 411 */
Wolfgang Betz 130:770ce14d3d15 412 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 413 ble_error_t BlueNRGGap::stopAdvertising(void)
Wolfgang Betz 130:770ce14d3d15 414 {
Andrea Palmieri 229:9981f62cdb1a 415
Wolfgang Betz 130:770ce14d3d15 416 if(state.advertising == 1) {
Vincent Coubard 255:97adb68decd4 417
Vincent Coubard 255:97adb68decd4 418 int err = hci_le_set_advertise_enable(0);
Vincent Coubard 255:97adb68decd4 419 if (err) {
Vincent Coubard 255:97adb68decd4 420 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Wolfgang Betz 130:770ce14d3d15 421 }
Vincent Coubard 255:97adb68decd4 422
Wolfgang Betz 132:51056160fa4a 423 PRINTF("Advertisement stopped!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 424 //Set GapState_t::advertising state
Wolfgang Betz 130:770ce14d3d15 425 state.advertising = 0;
Wolfgang Betz 130:770ce14d3d15 426 }
Vincent Coubard 255:97adb68decd4 427
Wolfgang Betz 130:770ce14d3d15 428 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 429 }
Wolfgang Betz 130:770ce14d3d15 430
Wolfgang Betz 130:770ce14d3d15 431 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 432 /*!
Wolfgang Betz 130:770ce14d3d15 433 @brief Disconnects if we are connected to a central device
Wolfgang Betz 130:770ce14d3d15 434
Wolfgang Betz 130:770ce14d3d15 435 @param[in] reason
Wolfgang Betz 130:770ce14d3d15 436 Disconnection Reason
Vincent Coubard 255:97adb68decd4 437
Wolfgang Betz 130:770ce14d3d15 438 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 439
Wolfgang Betz 130:770ce14d3d15 440 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 441 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 442
Wolfgang Betz 130:770ce14d3d15 443 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 444
Wolfgang Betz 130:770ce14d3d15 445 @code
Wolfgang Betz 130:770ce14d3d15 446
Wolfgang Betz 130:770ce14d3d15 447 @endcode
Wolfgang Betz 130:770ce14d3d15 448 */
Wolfgang Betz 130:770ce14d3d15 449 /**************************************************************************/
Andrea Palmieri 239:8e93d6e26c55 450 ble_error_t BlueNRGGap::disconnect(Handle_t connectionHandle, Gap::DisconnectionReason_t reason)
Wolfgang Betz 130:770ce14d3d15 451 {
Andrea Palmieri 239:8e93d6e26c55 452 tBleStatus ret;
Andrea Palmieri 142:adf1567d3900 453
Andrea Palmieri 239:8e93d6e26c55 454 ret = aci_gap_terminate(connectionHandle, reason);
Wolfgang Betz 130:770ce14d3d15 455
Andrea Palmieri 239:8e93d6e26c55 456 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 239:8e93d6e26c55 457 PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 239:8e93d6e26c55 458 switch (ret) {
Andrea Palmieri 239:8e93d6e26c55 459 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 239:8e93d6e26c55 460 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 239:8e93d6e26c55 461 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 239:8e93d6e26c55 462 return BLE_STACK_BUSY;
Andrea Palmieri 239:8e93d6e26c55 463 default:
Andrea Palmieri 239:8e93d6e26c55 464 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 130:770ce14d3d15 465 }
Wolfgang Betz 130:770ce14d3d15 466 }
Vincent Coubard 255:97adb68decd4 467
Wolfgang Betz 130:770ce14d3d15 468 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 469 }
Wolfgang Betz 130:770ce14d3d15 470
Wolfgang Betz 130:770ce14d3d15 471 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 472 /*!
Wolfgang Betz 130:770ce14d3d15 473 @brief Disconnects if we are connected to a central device
Wolfgang Betz 130:770ce14d3d15 474
Wolfgang Betz 130:770ce14d3d15 475 @param[in] reason
Wolfgang Betz 130:770ce14d3d15 476 Disconnection Reason
Vincent Coubard 255:97adb68decd4 477
Wolfgang Betz 130:770ce14d3d15 478 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 479
Wolfgang Betz 130:770ce14d3d15 480 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 481 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 482
Wolfgang Betz 130:770ce14d3d15 483 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 484
Wolfgang Betz 130:770ce14d3d15 485 @code
Wolfgang Betz 130:770ce14d3d15 486
Wolfgang Betz 130:770ce14d3d15 487 @endcode
Wolfgang Betz 130:770ce14d3d15 488 */
Wolfgang Betz 130:770ce14d3d15 489 /**************************************************************************/
Andrea Palmieri 239:8e93d6e26c55 490 ble_error_t BlueNRGGap::disconnect(Gap::DisconnectionReason_t reason)
Wolfgang Betz 130:770ce14d3d15 491 {
Andrea Palmieri 239:8e93d6e26c55 492 return disconnect(m_connectionHandle, reason);
Wolfgang Betz 130:770ce14d3d15 493 }
Wolfgang Betz 130:770ce14d3d15 494
Wolfgang Betz 130:770ce14d3d15 495 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 496 /*!
Wolfgang Betz 130:770ce14d3d15 497 @brief Sets the 16-bit connection handle
Vincent Coubard 255:97adb68decd4 498
Andrea Palmieri 239:8e93d6e26c55 499 @param[in] conn_handle
Wolfgang Betz 130:770ce14d3d15 500 Connection Handle which is set in the Gap Instance
Vincent Coubard 255:97adb68decd4 501
Wolfgang Betz 130:770ce14d3d15 502 @returns void
Wolfgang Betz 130:770ce14d3d15 503 */
Wolfgang Betz 130:770ce14d3d15 504 /**************************************************************************/
Andrea Palmieri 239:8e93d6e26c55 505 void BlueNRGGap::setConnectionHandle(uint16_t conn_handle)
Wolfgang Betz 130:770ce14d3d15 506 {
Andrea Palmieri 239:8e93d6e26c55 507 m_connectionHandle = conn_handle;
Wolfgang Betz 130:770ce14d3d15 508 }
Wolfgang Betz 130:770ce14d3d15 509
Wolfgang Betz 130:770ce14d3d15 510 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 511 /*!
Wolfgang Betz 130:770ce14d3d15 512 @brief Gets the 16-bit connection handle
Vincent Coubard 255:97adb68decd4 513
Wolfgang Betz 130:770ce14d3d15 514 @param[in] void
Vincent Coubard 255:97adb68decd4 515
Wolfgang Betz 130:770ce14d3d15 516 @returns uint16_t
Wolfgang Betz 130:770ce14d3d15 517 Connection Handle of the Gap Instance
Wolfgang Betz 130:770ce14d3d15 518 */
Wolfgang Betz 130:770ce14d3d15 519 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 520 uint16_t BlueNRGGap::getConnectionHandle(void)
Wolfgang Betz 130:770ce14d3d15 521 {
Wolfgang Betz 130:770ce14d3d15 522 return m_connectionHandle;
Wolfgang Betz 130:770ce14d3d15 523 }
Wolfgang Betz 130:770ce14d3d15 524
Wolfgang Betz 130:770ce14d3d15 525 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 526 /*!
Wolfgang Betz 130:770ce14d3d15 527 @brief Sets the BLE device address. SetAddress will reset the BLE
Wolfgang Betz 130:770ce14d3d15 528 device and re-initialize BTLE. Will not start advertising.
Wolfgang Betz 130:770ce14d3d15 529
Wolfgang Betz 130:770ce14d3d15 530 @param[in] type
Wolfgang Betz 130:770ce14d3d15 531 Type of Address
Vincent Coubard 255:97adb68decd4 532
Wolfgang Betz 130:770ce14d3d15 533 @param[in] address[6]
Wolfgang Betz 130:770ce14d3d15 534 Value of the Address to be set
Vincent Coubard 255:97adb68decd4 535
Wolfgang Betz 130:770ce14d3d15 536 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 537
Wolfgang Betz 130:770ce14d3d15 538 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 539
Wolfgang Betz 130:770ce14d3d15 540 @code
Wolfgang Betz 130:770ce14d3d15 541
Wolfgang Betz 130:770ce14d3d15 542 @endcode
Wolfgang Betz 130:770ce14d3d15 543 */
Wolfgang Betz 130:770ce14d3d15 544 /**************************************************************************/
Andrea Palmieri 239:8e93d6e26c55 545 ble_error_t BlueNRGGap::setAddress(AddressType_t type, const BLEProtocol::AddressBytes_t address)
Wolfgang Betz 130:770ce14d3d15 546 {
Andrea Palmieri 210:08c4c85ca679 547 if (type > BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE) {
Wolfgang Betz 130:770ce14d3d15 548 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 549 }
Vincent Coubard 255:97adb68decd4 550
Vincent Coubard 268:c0a1e03c5736 551 if(type == BLEProtocol::AddressType::PUBLIC){
Vincent Coubard 268:c0a1e03c5736 552 tBleStatus ret = aci_hal_write_config_data(
Vincent Coubard 268:c0a1e03c5736 553 CONFIG_DATA_PUBADDR_OFFSET,
Vincent Coubard 268:c0a1e03c5736 554 CONFIG_DATA_PUBADDR_LEN,
Vincent Coubard 268:c0a1e03c5736 555 address
Vincent Coubard 268:c0a1e03c5736 556 );
Andrea Palmieri 229:9981f62cdb1a 557 if(ret != BLE_STATUS_SUCCESS) {
Andrea Palmieri 239:8e93d6e26c55 558 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 229:9981f62cdb1a 559 }
Vincent Coubard 268:c0a1e03c5736 560 } else if (type == BLEProtocol::AddressType::RANDOM_STATIC) {
Vincent Coubard 268:c0a1e03c5736 561 // ensure that the random static address is well formed
Vincent Coubard 268:c0a1e03c5736 562 if ((address[5] & 0xC0) != 0xC0) {
Vincent Coubard 268:c0a1e03c5736 563 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Vincent Coubard 268:c0a1e03c5736 564 }
Vincent Coubard 268:c0a1e03c5736 565
Vincent Coubard 268:c0a1e03c5736 566 // thanks to const correctness of the API ...
Vincent Coubard 268:c0a1e03c5736 567 tBDAddr random_address = { 0 };
Vincent Coubard 268:c0a1e03c5736 568 memcpy(random_address, address, sizeof(random_address));
Vincent Coubard 268:c0a1e03c5736 569 int err = hci_le_set_random_address(random_address);
Vincent Coubard 268:c0a1e03c5736 570 if (err) {
Vincent Coubard 268:c0a1e03c5736 571 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Vincent Coubard 268:c0a1e03c5736 572 }
Vincent Coubard 268:c0a1e03c5736 573
Vincent Coubard 268:c0a1e03c5736 574 // It is not possible to get the bluetooth address when it is set
Vincent Coubard 268:c0a1e03c5736 575 // store it locally in class data member
Vincent Coubard 268:c0a1e03c5736 576 memcpy(bdaddr, address, sizeof(bdaddr));
Andrea Palmieri 239:8e93d6e26c55 577 } else {
Vincent Coubard 268:c0a1e03c5736 578 // FIXME random addresses are not supported yet
Vincent Coubard 268:c0a1e03c5736 579 // BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE
Vincent Coubard 268:c0a1e03c5736 580 // BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE
Vincent Coubard 268:c0a1e03c5736 581 return BLE_ERROR_NOT_IMPLEMENTED;
Wolfgang Betz 130:770ce14d3d15 582 }
Vincent Coubard 255:97adb68decd4 583
Vincent Coubard 268:c0a1e03c5736 584 // if we're here then the address was correctly set
Vincent Coubard 268:c0a1e03c5736 585 // commit it inside the addr_type
Vincent Coubard 268:c0a1e03c5736 586 addr_type = type;
Vincent Coubard 268:c0a1e03c5736 587 isSetAddress = true;
Wolfgang Betz 130:770ce14d3d15 588 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 589 }
Andrea Palmieri 229:9981f62cdb1a 590
Wolfgang Betz 130:770ce14d3d15 591 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 592 /*!
Wolfgang Betz 130:770ce14d3d15 593 @brief Returns boolean if the address of the device has been set
Wolfgang Betz 130:770ce14d3d15 594 or not
Vincent Coubard 255:97adb68decd4 595
Wolfgang Betz 130:770ce14d3d15 596 @returns bool
Wolfgang Betz 130:770ce14d3d15 597
Wolfgang Betz 130:770ce14d3d15 598 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 599
Wolfgang Betz 130:770ce14d3d15 600 @code
Wolfgang Betz 130:770ce14d3d15 601
Wolfgang Betz 130:770ce14d3d15 602 @endcode
Wolfgang Betz 130:770ce14d3d15 603 */
Wolfgang Betz 130:770ce14d3d15 604 /**************************************************************************/
Vincent Coubard 255:97adb68decd4 605 bool BlueNRGGap::getIsSetAddress()
Wolfgang Betz 130:770ce14d3d15 606 {
Vincent Coubard 255:97adb68decd4 607 return isSetAddress;
Wolfgang Betz 130:770ce14d3d15 608 }
Wolfgang Betz 130:770ce14d3d15 609
Wolfgang Betz 130:770ce14d3d15 610 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 611 /*!
Wolfgang Betz 130:770ce14d3d15 612 @brief Returns the address of the device if set
Wolfgang Betz 130:770ce14d3d15 613
Wolfgang Betz 130:770ce14d3d15 614 @returns Pointer to the address if Address is set else NULL
Wolfgang Betz 130:770ce14d3d15 615
Wolfgang Betz 130:770ce14d3d15 616 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 617
Wolfgang Betz 130:770ce14d3d15 618 @code
Wolfgang Betz 130:770ce14d3d15 619
Wolfgang Betz 130:770ce14d3d15 620 @endcode
Wolfgang Betz 130:770ce14d3d15 621 */
Wolfgang Betz 130:770ce14d3d15 622 /**************************************************************************/
Vincent Coubard 265:46333d70cf81 623 ble_error_t BlueNRGGap::getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address)
Wolfgang Betz 130:770ce14d3d15 624 {
Andrea Palmieri 229:9981f62cdb1a 625 uint8_t bdaddr[BDADDR_SIZE];
Andrea Palmieri 229:9981f62cdb1a 626 uint8_t data_len_out;
Andrea Palmieri 229:9981f62cdb1a 627
Vincent Coubard 268:c0a1e03c5736 628 // precondition, check that pointers in input are valid
Vincent Coubard 268:c0a1e03c5736 629 if (typeP == NULL || address == NULL) {
Vincent Coubard 268:c0a1e03c5736 630 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 228:25368f053411 631 }
Andrea Palmieri 228:25368f053411 632
Vincent Coubard 268:c0a1e03c5736 633 if (addr_type == BLEProtocol::AddressType::PUBLIC) {
Vincent Coubard 268:c0a1e03c5736 634 tBleStatus ret = aci_hal_read_config_data(CONFIG_DATA_PUBADDR_OFFSET, BDADDR_SIZE, &data_len_out, bdaddr);
Vincent Coubard 268:c0a1e03c5736 635 if(ret != BLE_STATUS_SUCCESS || data_len_out != BDADDR_SIZE) {
Vincent Coubard 268:c0a1e03c5736 636 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 268:c0a1e03c5736 637 }
Vincent Coubard 268:c0a1e03c5736 638 } else if (addr_type == BLEProtocol::AddressType::RANDOM_STATIC) {
Vincent Coubard 268:c0a1e03c5736 639 // FIXME hci_read_bd_addr and
Vincent Coubard 268:c0a1e03c5736 640 // aci_hal_read_config_data CONFIG_DATA_RANDOM_ADDRESS_IDB05A1
Vincent Coubard 268:c0a1e03c5736 641 // does not work, use the address stored in class data member
Vincent Coubard 268:c0a1e03c5736 642 memcpy(bdaddr, this->bdaddr, sizeof(bdaddr));
Vincent Coubard 268:c0a1e03c5736 643 } else {
Vincent Coubard 268:c0a1e03c5736 644 // FIXME: should be implemented with privacy features
Vincent Coubard 268:c0a1e03c5736 645 // BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE
Vincent Coubard 268:c0a1e03c5736 646 // BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE
Vincent Coubard 268:c0a1e03c5736 647 return BLE_ERROR_NOT_IMPLEMENTED;
Andrea Palmieri 229:9981f62cdb1a 648 }
Andrea Palmieri 229:9981f62cdb1a 649
Vincent Coubard 268:c0a1e03c5736 650 *typeP = addr_type;
Vincent Coubard 268:c0a1e03c5736 651 memcpy(address, bdaddr, BDADDR_SIZE);
Vincent Coubard 255:97adb68decd4 652
Wolfgang Betz 130:770ce14d3d15 653 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 654 }
Wolfgang Betz 130:770ce14d3d15 655
Wolfgang Betz 130:770ce14d3d15 656 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 657 /*!
Wolfgang Betz 130:770ce14d3d15 658 @brief obtains preferred connection params
Wolfgang Betz 130:770ce14d3d15 659
Wolfgang Betz 130:770ce14d3d15 660 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 661
Wolfgang Betz 130:770ce14d3d15 662 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 663
Wolfgang Betz 130:770ce14d3d15 664 @code
Wolfgang Betz 130:770ce14d3d15 665
Wolfgang Betz 130:770ce14d3d15 666 @endcode
Wolfgang Betz 130:770ce14d3d15 667 */
Wolfgang Betz 130:770ce14d3d15 668 /**************************************************************************/
Vincent Coubard 255:97adb68decd4 669 ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 670 {
Vincent Coubard 266:b49e28134d83 671 static const size_t parameter_size = 2;
Vincent Coubard 266:b49e28134d83 672
Vincent Coubard 266:b49e28134d83 673 if (!g_preferred_connection_parameters_char_handle) {
Vincent Coubard 266:b49e28134d83 674 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Vincent Coubard 266:b49e28134d83 675 }
Vincent Coubard 266:b49e28134d83 676
Vincent Coubard 266:b49e28134d83 677 // Peripheral preferred connection parameters are an array of 4 uint16_t
Vincent Coubard 266:b49e28134d83 678 uint8_t parameters_packed[parameter_size * 4];
Vincent Coubard 266:b49e28134d83 679 uint16_t bytes_read = 0;
Andrea Palmieri 142:adf1567d3900 680
Vincent Coubard 266:b49e28134d83 681 tBleStatus err = aci_gatt_read_handle_value(
Vincent Coubard 266:b49e28134d83 682 g_preferred_connection_parameters_char_handle + BlueNRGGattServer::CHAR_VALUE_HANDLE,
Vincent Coubard 266:b49e28134d83 683 sizeof(parameters_packed),
Vincent Coubard 266:b49e28134d83 684 &bytes_read,
Vincent Coubard 266:b49e28134d83 685 parameters_packed
Vincent Coubard 266:b49e28134d83 686 );
Vincent Coubard 266:b49e28134d83 687
Vincent Coubard 266:b49e28134d83 688 PRINTF("getPreferredConnectionParams err=0x%02x (bytes_read=%u)\n\r", err, bytes_read);
Vincent Coubard 266:b49e28134d83 689
Vincent Coubard 266:b49e28134d83 690 // check that the read succeed and the result have the expected length
Vincent Coubard 266:b49e28134d83 691 if (err || bytes_read != sizeof(parameters_packed)) {
Vincent Coubard 266:b49e28134d83 692 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 266:b49e28134d83 693 }
Vincent Coubard 266:b49e28134d83 694
Vincent Coubard 266:b49e28134d83 695 // memcpy field by field
Vincent Coubard 266:b49e28134d83 696 memcpy(&params->minConnectionInterval, parameters_packed, parameter_size);
Vincent Coubard 266:b49e28134d83 697 memcpy(&params->maxConnectionInterval, &parameters_packed[parameter_size], parameter_size);
Vincent Coubard 266:b49e28134d83 698 memcpy(&params->slaveLatency, &parameters_packed[2 * parameter_size], parameter_size);
Vincent Coubard 266:b49e28134d83 699 memcpy(&params->connectionSupervisionTimeout, &parameters_packed[3 * parameter_size], parameter_size);
Vincent Coubard 266:b49e28134d83 700
Vincent Coubard 266:b49e28134d83 701 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 702 }
Wolfgang Betz 130:770ce14d3d15 703
Wolfgang Betz 130:770ce14d3d15 704
Wolfgang Betz 130:770ce14d3d15 705 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 706 /*!
Wolfgang Betz 130:770ce14d3d15 707 @brief sets preferred connection params
Wolfgang Betz 130:770ce14d3d15 708
Wolfgang Betz 130:770ce14d3d15 709 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 710
Wolfgang Betz 130:770ce14d3d15 711 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 712
Wolfgang Betz 130:770ce14d3d15 713 @code
Wolfgang Betz 130:770ce14d3d15 714
Wolfgang Betz 130:770ce14d3d15 715 @endcode
Wolfgang Betz 130:770ce14d3d15 716 */
Wolfgang Betz 130:770ce14d3d15 717 /**************************************************************************/
Vincent Coubard 255:97adb68decd4 718 ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 719 {
Vincent Coubard 266:b49e28134d83 720 static const size_t parameter_size = 2;
Vincent Coubard 266:b49e28134d83 721 uint8_t parameters_packed[parameter_size * 4];
Vincent Coubard 266:b49e28134d83 722
Vincent Coubard 266:b49e28134d83 723 // ensure that parameters are correct
Vincent Coubard 266:b49e28134d83 724 // see BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part C]
Vincent Coubard 266:b49e28134d83 725 // section 12.3 PERIPHERAL PREFERRED CONNECTION PARAMETERS CHARACTERISTIC
Vincent Coubard 266:b49e28134d83 726 if (((0x0006 > params->minConnectionInterval) || (params->minConnectionInterval > 0x0C80)) &&
Vincent Coubard 266:b49e28134d83 727 params->minConnectionInterval != 0xFFFF) {
Vincent Coubard 266:b49e28134d83 728 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Vincent Coubard 266:b49e28134d83 729 }
Vincent Coubard 266:b49e28134d83 730
Vincent Coubard 266:b49e28134d83 731 if (((params->minConnectionInterval > params->maxConnectionInterval) || (params->maxConnectionInterval > 0x0C80)) &&
Vincent Coubard 266:b49e28134d83 732 params->maxConnectionInterval != 0xFFFF) {
Vincent Coubard 266:b49e28134d83 733 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Vincent Coubard 266:b49e28134d83 734 }
Vincent Coubard 266:b49e28134d83 735
Vincent Coubard 266:b49e28134d83 736 if (params->slaveLatency > 0x01F3) {
Vincent Coubard 266:b49e28134d83 737 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Vincent Coubard 266:b49e28134d83 738 }
Vincent Coubard 266:b49e28134d83 739
Vincent Coubard 266:b49e28134d83 740 if (((0x000A > params->connectionSupervisionTimeout) || (params->connectionSupervisionTimeout > 0x0C80)) &&
Vincent Coubard 266:b49e28134d83 741 params->connectionSupervisionTimeout != 0xFFFF) {
Vincent Coubard 266:b49e28134d83 742 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Vincent Coubard 266:b49e28134d83 743 }
Andrea Palmieri 142:adf1567d3900 744
Vincent Coubard 266:b49e28134d83 745 // copy the parameters inside the byte array
Vincent Coubard 266:b49e28134d83 746 memcpy(parameters_packed, &params->minConnectionInterval, parameter_size);
Vincent Coubard 266:b49e28134d83 747 memcpy(&parameters_packed[parameter_size], &params->maxConnectionInterval, parameter_size);
Vincent Coubard 266:b49e28134d83 748 memcpy(&parameters_packed[2 * parameter_size], &params->slaveLatency, parameter_size);
Vincent Coubard 266:b49e28134d83 749 memcpy(&parameters_packed[3 * parameter_size], &params->connectionSupervisionTimeout, parameter_size);
Vincent Coubard 266:b49e28134d83 750
Vincent Coubard 266:b49e28134d83 751 tBleStatus err = aci_gatt_update_char_value(
Vincent Coubard 266:b49e28134d83 752 g_gap_service_handle,
Vincent Coubard 266:b49e28134d83 753 g_preferred_connection_parameters_char_handle,
Vincent Coubard 266:b49e28134d83 754 /* offset */ 0,
Vincent Coubard 266:b49e28134d83 755 sizeof(parameters_packed),
Vincent Coubard 266:b49e28134d83 756 parameters_packed
Vincent Coubard 266:b49e28134d83 757 );
Vincent Coubard 266:b49e28134d83 758
Vincent Coubard 266:b49e28134d83 759 if (err) {
Vincent Coubard 266:b49e28134d83 760 PRINTF("setPreferredConnectionParams failed (err=0x%x)!!\n\r", err) ;
Vincent Coubard 266:b49e28134d83 761 switch (err) {
Vincent Coubard 266:b49e28134d83 762 case BLE_STATUS_INVALID_HANDLE:
Vincent Coubard 266:b49e28134d83 763 case BLE_STATUS_INVALID_PARAMETER:
Vincent Coubard 266:b49e28134d83 764 return BLE_ERROR_INVALID_PARAM;
Vincent Coubard 266:b49e28134d83 765 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Vincent Coubard 266:b49e28134d83 766 return BLE_ERROR_NO_MEM;
Vincent Coubard 266:b49e28134d83 767 case BLE_STATUS_TIMEOUT:
Vincent Coubard 266:b49e28134d83 768 return BLE_STACK_BUSY;
Vincent Coubard 266:b49e28134d83 769 default:
Vincent Coubard 266:b49e28134d83 770 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 266:b49e28134d83 771 }
Vincent Coubard 266:b49e28134d83 772 }
Vincent Coubard 266:b49e28134d83 773
Vincent Coubard 266:b49e28134d83 774 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 775 }
Wolfgang Betz 130:770ce14d3d15 776
Wolfgang Betz 130:770ce14d3d15 777 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 778 /*!
Wolfgang Betz 130:770ce14d3d15 779 @brief updates preferred connection params
Wolfgang Betz 130:770ce14d3d15 780
Wolfgang Betz 130:770ce14d3d15 781 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 782
Wolfgang Betz 130:770ce14d3d15 783 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 784
Wolfgang Betz 130:770ce14d3d15 785 @code
Wolfgang Betz 130:770ce14d3d15 786
Wolfgang Betz 130:770ce14d3d15 787 @endcode
Wolfgang Betz 130:770ce14d3d15 788 */
Wolfgang Betz 130:770ce14d3d15 789 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 790 ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 791 {
Vincent Coubard 272:4639da7705e1 792 tBleStatus ret = BLE_STATUS_SUCCESS;
Vincent Coubard 272:4639da7705e1 793
Vincent Coubard 272:4639da7705e1 794 if(gapRole == Gap::CENTRAL) {
Vincent Coubard 272:4639da7705e1 795 ret = aci_gap_start_connection_update(handle,
Vincent Coubard 272:4639da7705e1 796 params->minConnectionInterval,
Vincent Coubard 272:4639da7705e1 797 params->maxConnectionInterval,
Vincent Coubard 272:4639da7705e1 798 params->slaveLatency,
Vincent Coubard 272:4639da7705e1 799 params->connectionSupervisionTimeout,
Vincent Coubard 272:4639da7705e1 800 CONN_L1, CONN_L2);
Vincent Coubard 272:4639da7705e1 801 } else {
Vincent Coubard 272:4639da7705e1 802 ret = aci_l2cap_connection_parameter_update_request(handle,
Vincent Coubard 272:4639da7705e1 803 params->minConnectionInterval,
Vincent Coubard 272:4639da7705e1 804 params->maxConnectionInterval,
Vincent Coubard 272:4639da7705e1 805 params->slaveLatency,
Vincent Coubard 272:4639da7705e1 806 params->connectionSupervisionTimeout);
Vincent Coubard 272:4639da7705e1 807 }
Vincent Coubard 272:4639da7705e1 808
Vincent Coubard 272:4639da7705e1 809 if (BLE_STATUS_SUCCESS != ret){
Vincent Coubard 272:4639da7705e1 810 PRINTF("updateConnectionParams failed (ret=0x%x)!!\n\r", ret) ;
Vincent Coubard 272:4639da7705e1 811 switch (ret) {
Vincent Coubard 272:4639da7705e1 812 case ERR_INVALID_HCI_CMD_PARAMS:
Vincent Coubard 272:4639da7705e1 813 case BLE_STATUS_INVALID_PARAMETER:
Vincent Coubard 272:4639da7705e1 814 return BLE_ERROR_INVALID_PARAM;
Vincent Coubard 272:4639da7705e1 815 case ERR_COMMAND_DISALLOWED:
Vincent Coubard 272:4639da7705e1 816 case BLE_STATUS_NOT_ALLOWED:
Vincent Coubard 272:4639da7705e1 817 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Vincent Coubard 272:4639da7705e1 818 default:
Vincent Coubard 272:4639da7705e1 819 return BLE_ERROR_UNSPECIFIED;
Vincent Coubard 272:4639da7705e1 820 }
Vincent Coubard 272:4639da7705e1 821 }
Andrea Palmieri 142:adf1567d3900 822
Wolfgang Betz 130:770ce14d3d15 823 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 824 }
Wolfgang Betz 130:770ce14d3d15 825
Wolfgang Betz 130:770ce14d3d15 826 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 827 /*!
Vincent Coubard 255:97adb68decd4 828 @brief Sets the Device Name Characteristic
Wolfgang Betz 130:770ce14d3d15 829
Wolfgang Betz 130:770ce14d3d15 830 @param[in] deviceName
Wolfgang Betz 130:770ce14d3d15 831 pointer to device name to be set
Wolfgang Betz 130:770ce14d3d15 832
Wolfgang Betz 130:770ce14d3d15 833 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 834
Wolfgang Betz 130:770ce14d3d15 835 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 836 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 837
Wolfgang Betz 130:770ce14d3d15 838 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 839
Wolfgang Betz 130:770ce14d3d15 840 @code
Wolfgang Betz 130:770ce14d3d15 841
Wolfgang Betz 130:770ce14d3d15 842 @endcode
Wolfgang Betz 130:770ce14d3d15 843 */
Wolfgang Betz 130:770ce14d3d15 844 /**************************************************************************/
Vincent Coubard 255:97adb68decd4 845 ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName)
Wolfgang Betz 130:770ce14d3d15 846 {
Andrea Palmieri 187:2e517d3ddd71 847 tBleStatus ret;
Vincent Coubard 255:97adb68decd4 848 uint8_t nameLen = 0;
Vincent Coubard 255:97adb68decd4 849
Andrea Palmieri 228:25368f053411 850 nameLen = strlen((const char*)deviceName);
Andrea Palmieri 228:25368f053411 851 PRINTF("DeviceName Size=%d\n\r", nameLen);
Andrea Palmieri 228:25368f053411 852
Andrea Palmieri 222:37a7e289ee3d 853 ret = aci_gatt_update_char_value(g_gap_service_handle,
Andrea Palmieri 222:37a7e289ee3d 854 g_device_name_char_handle,
Andrea Palmieri 222:37a7e289ee3d 855 0,
Andrea Palmieri 222:37a7e289ee3d 856 nameLen,
Andrea Palmieri 228:25368f053411 857 deviceName);
Andrea Palmieri 187:2e517d3ddd71 858
Andrea Palmieri 187:2e517d3ddd71 859 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 860 PRINTF("device set name failed (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 861 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 862 case BLE_STATUS_INVALID_HANDLE:
Andrea Palmieri 187:2e517d3ddd71 863 case BLE_STATUS_INVALID_PARAMETER:
Andrea Palmieri 187:2e517d3ddd71 864 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 865 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Andrea Palmieri 187:2e517d3ddd71 866 return BLE_ERROR_NO_MEM;
Andrea Palmieri 187:2e517d3ddd71 867 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 868 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 869 default:
Andrea Palmieri 187:2e517d3ddd71 870 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 871 }
Wolfgang Betz 130:770ce14d3d15 872 }
Wolfgang Betz 130:770ce14d3d15 873
Wolfgang Betz 130:770ce14d3d15 874 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 875 }
Wolfgang Betz 130:770ce14d3d15 876
Wolfgang Betz 130:770ce14d3d15 877 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 878 /*!
Vincent Coubard 255:97adb68decd4 879 @brief Gets the Device Name Characteristic
Wolfgang Betz 130:770ce14d3d15 880
Wolfgang Betz 130:770ce14d3d15 881 @param[in] deviceName
Vincent Coubard 255:97adb68decd4 882 pointer to device name
Wolfgang Betz 130:770ce14d3d15 883
Wolfgang Betz 130:770ce14d3d15 884 @param[in] lengthP
Vincent Coubard 255:97adb68decd4 885 pointer to device name length
Wolfgang Betz 130:770ce14d3d15 886
Wolfgang Betz 130:770ce14d3d15 887 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 888
Wolfgang Betz 130:770ce14d3d15 889 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 890 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 891
Wolfgang Betz 130:770ce14d3d15 892 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 893
Wolfgang Betz 130:770ce14d3d15 894 @code
Wolfgang Betz 130:770ce14d3d15 895
Wolfgang Betz 130:770ce14d3d15 896 @endcode
Wolfgang Betz 130:770ce14d3d15 897 */
Wolfgang Betz 130:770ce14d3d15 898 /**************************************************************************/
Andrea Palmieri 228:25368f053411 899 ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
Andrea Palmieri 228:25368f053411 900 {
Andrea Palmieri 228:25368f053411 901 tBleStatus ret;
Andrea Palmieri 228:25368f053411 902
Andrea Palmieri 229:9981f62cdb1a 903 ret = aci_gatt_read_handle_value(g_device_name_char_handle+BlueNRGGattServer::CHAR_VALUE_HANDLE,
Andrea Palmieri 228:25368f053411 904 *lengthP,
Andrea Palmieri 228:25368f053411 905 (uint16_t *)lengthP,
Andrea Palmieri 228:25368f053411 906 deviceName);
Andrea Palmieri 228:25368f053411 907 PRINTF("getDeviceName ret=0x%02x (lengthP=%d)\n\r", ret, *lengthP);
Andrea Palmieri 228:25368f053411 908 if (ret == BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 909 return BLE_ERROR_NONE;
Andrea Palmieri 228:25368f053411 910 } else {
Andrea Palmieri 228:25368f053411 911 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 912 }
Wolfgang Betz 130:770ce14d3d15 913 }
Wolfgang Betz 130:770ce14d3d15 914
Wolfgang Betz 130:770ce14d3d15 915 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 916 /*!
Vincent Coubard 255:97adb68decd4 917 @brief Sets the Device Appearance Characteristic
Wolfgang Betz 130:770ce14d3d15 918
Wolfgang Betz 130:770ce14d3d15 919 @param[in] appearance
Vincent Coubard 255:97adb68decd4 920 device appearance
Wolfgang Betz 130:770ce14d3d15 921
Wolfgang Betz 130:770ce14d3d15 922 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 923
Wolfgang Betz 130:770ce14d3d15 924 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 925 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 926
Wolfgang Betz 130:770ce14d3d15 927 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 928
Wolfgang Betz 130:770ce14d3d15 929 @code
Wolfgang Betz 130:770ce14d3d15 930
Wolfgang Betz 130:770ce14d3d15 931 @endcode
Wolfgang Betz 130:770ce14d3d15 932 */
Wolfgang Betz 130:770ce14d3d15 933 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 934 ble_error_t BlueNRGGap::setAppearance(GapAdvertisingData::Appearance appearance)
Wolfgang Betz 130:770ce14d3d15 935 {
Andrea Palmieri 187:2e517d3ddd71 936 tBleStatus ret;
Andrea Palmieri 228:25368f053411 937 uint8_t deviceAppearance[2];
Andrea Palmieri 187:2e517d3ddd71 938
Vincent Coubard 255:97adb68decd4 939 STORE_LE_16(deviceAppearance, appearance);
Vincent Coubard 253:9665a6f8bbdb 940 PRINTF("setAppearance= 0x%x 0x%x\n\r", deviceAppearance[1], deviceAppearance[0]);
Vincent Coubard 255:97adb68decd4 941
Andrea Palmieri 228:25368f053411 942 ret = aci_gatt_update_char_value(g_gap_service_handle,
Andrea Palmieri 228:25368f053411 943 g_appearance_char_handle,
Andrea Palmieri 228:25368f053411 944 0, 2, (uint8_t *)deviceAppearance);
Andrea Palmieri 187:2e517d3ddd71 945 if (BLE_STATUS_SUCCESS == ret){
Andrea Palmieri 187:2e517d3ddd71 946 return BLE_ERROR_NONE;
Andrea Palmieri 187:2e517d3ddd71 947 }
Andrea Palmieri 187:2e517d3ddd71 948
Andrea Palmieri 217:23870c55b07e 949 PRINTF("setAppearance failed (ret=0x%x)!!\n\r", ret);
Andrea Palmieri 187:2e517d3ddd71 950 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 951 case BLE_STATUS_INVALID_HANDLE:
Andrea Palmieri 187:2e517d3ddd71 952 case BLE_STATUS_INVALID_PARAMETER:
Andrea Palmieri 187:2e517d3ddd71 953 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 954 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Andrea Palmieri 187:2e517d3ddd71 955 return BLE_ERROR_NO_MEM;
Andrea Palmieri 187:2e517d3ddd71 956 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 957 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 958 default:
Andrea Palmieri 187:2e517d3ddd71 959 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 960 }
Wolfgang Betz 130:770ce14d3d15 961 }
Wolfgang Betz 130:770ce14d3d15 962
Wolfgang Betz 130:770ce14d3d15 963 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 964 /*!
Wolfgang Betz 130:770ce14d3d15 965 @brief Gets the Device Appearance Characteristic
Wolfgang Betz 130:770ce14d3d15 966
Wolfgang Betz 130:770ce14d3d15 967 @param[in] appearance
Vincent Coubard 255:97adb68decd4 968 pointer to device appearance value
Wolfgang Betz 130:770ce14d3d15 969
Wolfgang Betz 130:770ce14d3d15 970 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 971
Wolfgang Betz 130:770ce14d3d15 972 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 973 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 974
Wolfgang Betz 130:770ce14d3d15 975 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 976
Wolfgang Betz 130:770ce14d3d15 977 @code
Wolfgang Betz 130:770ce14d3d15 978
Wolfgang Betz 130:770ce14d3d15 979 @endcode
Wolfgang Betz 130:770ce14d3d15 980 */
Wolfgang Betz 130:770ce14d3d15 981 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 982 ble_error_t BlueNRGGap::getAppearance(GapAdvertisingData::Appearance *appearanceP)
Wolfgang Betz 130:770ce14d3d15 983 {
Andrea Palmieri 228:25368f053411 984 tBleStatus ret;
Andrea Palmieri 228:25368f053411 985 uint16_t lengthP = 2;
Andrea Palmieri 228:25368f053411 986
Andrea Palmieri 229:9981f62cdb1a 987 ret = aci_gatt_read_handle_value(g_appearance_char_handle+BlueNRGGattServer::CHAR_VALUE_HANDLE,
Andrea Palmieri 228:25368f053411 988 lengthP,
Andrea Palmieri 228:25368f053411 989 &lengthP,
Andrea Palmieri 228:25368f053411 990 (uint8_t*)appearanceP);
Andrea Palmieri 228:25368f053411 991 PRINTF("getAppearance ret=0x%02x (lengthP=%d)\n\r", ret, lengthP);
Andrea Palmieri 228:25368f053411 992 if (ret == BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 993 return BLE_ERROR_NONE;
Andrea Palmieri 228:25368f053411 994 } else {
Andrea Palmieri 228:25368f053411 995 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 996 }
Andrea Palmieri 228:25368f053411 997
Wolfgang Betz 130:770ce14d3d15 998 }
Wolfgang Betz 130:770ce14d3d15 999
Andrea Palmieri 160:174387d53809 1000 GapScanningParams* BlueNRGGap::getScanningParams(void)
Andrea Palmieri 160:174387d53809 1001 {
Andrea Palmieri 160:174387d53809 1002 return &_scanningParams;
Andrea Palmieri 160:174387d53809 1003 }
Andrea Palmieri 160:174387d53809 1004
Wolfgang Betz 165:3576598c0889 1005 static void makeConnection(void)
Wolfgang Betz 162:667f97a4db7f 1006 {
Wolfgang Betz 165:3576598c0889 1007 BlueNRGGap::getInstance().createConnection();
Wolfgang Betz 162:667f97a4db7f 1008 }
Wolfgang Betz 162:667f97a4db7f 1009
Wolfgang Betz 132:51056160fa4a 1010 void BlueNRGGap::Discovery_CB(Reason_t reason,
Wolfgang Betz 132:51056160fa4a 1011 uint8_t adv_type,
Andrea Palmieri 229:9981f62cdb1a 1012 uint8_t addr_type,
Wolfgang Betz 132:51056160fa4a 1013 uint8_t *addr,
Wolfgang Betz 132:51056160fa4a 1014 uint8_t *data_length,
Wolfgang Betz 132:51056160fa4a 1015 uint8_t *data,
Wolfgang Betz 132:51056160fa4a 1016 uint8_t *RSSI)
Wolfgang Betz 132:51056160fa4a 1017 {
Wolfgang Betz 132:51056160fa4a 1018 switch (reason) {
Wolfgang Betz 132:51056160fa4a 1019 case DEVICE_FOUND:
Wolfgang Betz 132:51056160fa4a 1020 {
Wolfgang Betz 132:51056160fa4a 1021 GapAdvertisingParams::AdvertisingType_t type;
Wolfgang Betz 132:51056160fa4a 1022 bool isScanResponse = false;
Andrea Palmieri 229:9981f62cdb1a 1023
Andrea Palmieri 229:9981f62cdb1a 1024 /*
Andrea Palmieri 229:9981f62cdb1a 1025 * Whitelisting (scan policy):
Andrea Palmieri 229:9981f62cdb1a 1026 * SCAN_POLICY_FILTER_ALL_ADV (ADV packets only from devs in the White List) &&
Andrea Palmieri 229:9981f62cdb1a 1027 * Private Random Address
Andrea Palmieri 229:9981f62cdb1a 1028 * => scan_results = FALSE
Andrea Palmieri 229:9981f62cdb1a 1029 * FIXME: the Security Manager should be implemented
Andrea Palmieri 229:9981f62cdb1a 1030 */
Andrea Palmieri 229:9981f62cdb1a 1031 ScanningPolicyMode_t mode = getScanningPolicyMode();
Andrea Palmieri 229:9981f62cdb1a 1032 PRINTF("mode=%u addr_type=%u\n\r", mode, addr_type);
Andrea Palmieri 229:9981f62cdb1a 1033 if(mode == Gap::SCAN_POLICY_FILTER_ALL_ADV ||
Andrea Palmieri 229:9981f62cdb1a 1034 (addr_type == RESOLVABLE_PRIVATE_ADDR ||
Andrea Palmieri 229:9981f62cdb1a 1035 addr_type == NON_RESOLVABLE_PRIVATE_ADDR)) {
Andrea Palmieri 229:9981f62cdb1a 1036 return;
Andrea Palmieri 229:9981f62cdb1a 1037 }
Andrea Palmieri 229:9981f62cdb1a 1038
Wolfgang Betz 132:51056160fa4a 1039 switch(adv_type) {
Wolfgang Betz 132:51056160fa4a 1040 case ADV_IND:
Wolfgang Betz 132:51056160fa4a 1041 type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1042 break;
Wolfgang Betz 132:51056160fa4a 1043 case ADV_DIRECT_IND:
Wolfgang Betz 132:51056160fa4a 1044 type = GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED;
Wolfgang Betz 132:51056160fa4a 1045 break;
Wolfgang Betz 132:51056160fa4a 1046 case ADV_SCAN_IND:
Wolfgang Betz 132:51056160fa4a 1047 case SCAN_RSP:
Wolfgang Betz 132:51056160fa4a 1048 type = GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1049 isScanResponse = true;
Wolfgang Betz 132:51056160fa4a 1050 break;
Wolfgang Betz 132:51056160fa4a 1051 case ADV_NONCONN_IND:
Wolfgang Betz 132:51056160fa4a 1052 type = GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED;
Andrea Palmieri 142:adf1567d3900 1053 break;
Andrea Palmieri 142:adf1567d3900 1054 default:
Andrea Palmieri 142:adf1567d3900 1055 type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1056 }
Vincent Coubard 255:97adb68decd4 1057
Andrea Palmieri 217:23870c55b07e 1058 PRINTF("data_length=%d adv peerAddr[%02x %02x %02x %02x %02x %02x] \r\n",
Andrea Palmieri 217:23870c55b07e 1059 *data_length, addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
Andrea Palmieri 238:b6454c839f42 1060 if(!_connecting) {
Andrea Palmieri 238:b6454c839f42 1061 processAdvertisementReport(addr, *RSSI, isScanResponse, type, *data_length, data);
Andrea Palmieri 238:b6454c839f42 1062 }
Andrea Palmieri 160:174387d53809 1063 PRINTF("!!!After processAdvertisementReport\n\r");
Wolfgang Betz 132:51056160fa4a 1064 }
Wolfgang Betz 132:51056160fa4a 1065 break;
Vincent Coubard 255:97adb68decd4 1066
Wolfgang Betz 132:51056160fa4a 1067 case DISCOVERY_COMPLETE:
Wolfgang Betz 132:51056160fa4a 1068 // The discovery is complete. If this is due to a stop scanning (i.e., the device
Wolfgang Betz 132:51056160fa4a 1069 // we are interested in has been found) and a connection has been requested
Andrea Palmieri 229:9981f62cdb1a 1070 // then we start the device connection.
Andrea Palmieri 145:024a552e4715 1071 PRINTF("DISCOVERY_COMPLETE\n\r");
Wolfgang Betz 132:51056160fa4a 1072 _scanning = false;
Wolfgang Betz 132:51056160fa4a 1073
Wolfgang Betz 165:3576598c0889 1074 // Since the DISCOVERY_COMPLETE event can be received during the scanning interval,
Andrea Palmieri 229:9981f62cdb1a 1075 // we need to delay the starting of connection
Wolfgang Betz 165:3576598c0889 1076 uint16_t delay = 2*(_scanningParams.getInterval());
Wolfgang Betz 165:3576598c0889 1077
Andrea Palmieri 217:23870c55b07e 1078 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 162:667f97a4db7f 1079 if(_connecting) {
Wolfgang Betz 165:3576598c0889 1080 minar::Scheduler::postCallback(makeConnection).delay(minar::milliseconds(delay));
Wolfgang Betz 132:51056160fa4a 1081 }
Andrea Palmieri 217:23870c55b07e 1082 #else
Andrea Palmieri 217:23870c55b07e 1083 Clock_Wait(delay);
Andrea Palmieri 217:23870c55b07e 1084 if(_connecting) {
Andrea Palmieri 217:23870c55b07e 1085 makeConnection();
Andrea Palmieri 217:23870c55b07e 1086 }
Andrea Palmieri 217:23870c55b07e 1087 #endif /* AST_FOR_MBED_OS */
Wolfgang Betz 132:51056160fa4a 1088
Wolfgang Betz 132:51056160fa4a 1089 break;
Wolfgang Betz 132:51056160fa4a 1090 }
Wolfgang Betz 132:51056160fa4a 1091 }
Wolfgang Betz 132:51056160fa4a 1092
Wolfgang Betz 132:51056160fa4a 1093 ble_error_t BlueNRGGap::startRadioScan(const GapScanningParams &scanningParams)
Wolfgang Betz 132:51056160fa4a 1094 {
Vincent Coubard 255:97adb68decd4 1095
Wolfgang Betz 165:3576598c0889 1096 tBleStatus ret = BLE_STATUS_SUCCESS;
Andrea Palmieri 222:37a7e289ee3d 1097
Andrea Palmieri 222:37a7e289ee3d 1098 // Stop ADV before scanning
Andrea Palmieri 223:36df860f7ffc 1099 /*
Andrea Palmieri 222:37a7e289ee3d 1100 if (state.advertising == 1) {
Andrea Palmieri 222:37a7e289ee3d 1101 stopAdvertising();
Andrea Palmieri 222:37a7e289ee3d 1102 }
Andrea Palmieri 223:36df860f7ffc 1103 */
Andrea Palmieri 222:37a7e289ee3d 1104
Andrea Palmieri 229:9981f62cdb1a 1105 /*
Andrea Palmieri 229:9981f62cdb1a 1106 * Whitelisting (scan policy):
Andrea Palmieri 229:9981f62cdb1a 1107 * SCAN_POLICY_FILTER_ALL_ADV (ADV packets only from devs in the White List) &&
Andrea Palmieri 229:9981f62cdb1a 1108 * White List is empty
Andrea Palmieri 229:9981f62cdb1a 1109 * => scan operation = FAILURE
Andrea Palmieri 229:9981f62cdb1a 1110 * FIXME: the Security Manager should be implemented
Andrea Palmieri 229:9981f62cdb1a 1111 */
Andrea Palmieri 229:9981f62cdb1a 1112 ScanningPolicyMode_t mode = getScanningPolicyMode();
Andrea Palmieri 229:9981f62cdb1a 1113 uint8_t whiteListSize = whitelistAddresses.size;
Andrea Palmieri 229:9981f62cdb1a 1114 if(whiteListSize == 0 && mode == Gap::SCAN_POLICY_FILTER_ALL_ADV) {
Andrea Palmieri 229:9981f62cdb1a 1115 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 229:9981f62cdb1a 1116 }
Andrea Palmieri 229:9981f62cdb1a 1117
Andrea Palmieri 217:23870c55b07e 1118 ret = btleStartRadioScan(scanningParams.getActiveScanning(),
Andrea Palmieri 217:23870c55b07e 1119 scanningParams.getInterval(),
Andrea Palmieri 217:23870c55b07e 1120 scanningParams.getWindow(),
Andrea Palmieri 217:23870c55b07e 1121 addr_type);
Andrea Palmieri 217:23870c55b07e 1122
Andrea Palmieri 229:9981f62cdb1a 1123 PRINTF("Scanning...\n\r");
Andrea Palmieri 229:9981f62cdb1a 1124 PRINTF("scanningParams.getInterval()=%u[msec]\r\n",(scanningParams.getInterval()*625)/1000);
Andrea Palmieri 229:9981f62cdb1a 1125 PRINTF("scanningParams.getWindow()=%u[msec]\r\n",(scanningParams.getWindow()*625)/1000);
Andrea Palmieri 229:9981f62cdb1a 1126 //PRINTF("_advParams.getInterval()=%u\r\n",_advParams.getInterval());
Andrea Palmieri 229:9981f62cdb1a 1127 //PRINTF("CONN_P1=%u\r\n",(unsigned)CONN_P1);
Andrea Palmieri 229:9981f62cdb1a 1128 //PRINTF("CONN_P2=%u\r\n",(unsigned)CONN_P2);
Andrea Palmieri 217:23870c55b07e 1129 if (BLE_STATUS_SUCCESS == ret){
Andrea Palmieri 217:23870c55b07e 1130 PRINTF("Observation Procedure Started\n");
Andrea Palmieri 217:23870c55b07e 1131 _scanning = true;
Andrea Palmieri 217:23870c55b07e 1132 return BLE_ERROR_NONE;
Andrea Palmieri 145:024a552e4715 1133 }
Andrea Palmieri 217:23870c55b07e 1134
Andrea Palmieri 217:23870c55b07e 1135 // Observer role is not supported by X-NUCLEO-IDB04A1, return BLE_ERROR_NOT_IMPLEMENTED
Andrea Palmieri 217:23870c55b07e 1136 switch (ret) {
Andrea Palmieri 217:23870c55b07e 1137 case BLE_STATUS_INVALID_CID:
Andrea Palmieri 229:9981f62cdb1a 1138 PRINTF("Observation Procedure not implemented!!!\n\r");
Andrea Palmieri 217:23870c55b07e 1139 return BLE_ERROR_NOT_IMPLEMENTED;
Andrea Palmieri 217:23870c55b07e 1140 default:
Andrea Palmieri 229:9981f62cdb1a 1141 PRINTF("Observation Procedure failed (0x%02X)\n\r", ret);
Andrea Palmieri 217:23870c55b07e 1142 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1143 }
Andrea Palmieri 217:23870c55b07e 1144
Wolfgang Betz 130:770ce14d3d15 1145 }
Wolfgang Betz 130:770ce14d3d15 1146
Wolfgang Betz 130:770ce14d3d15 1147 ble_error_t BlueNRGGap::stopScan() {
Wolfgang Betz 165:3576598c0889 1148 tBleStatus ret = BLE_STATUS_SUCCESS;
Andrea Palmieri 229:9981f62cdb1a 1149
Andrea Palmieri 229:9981f62cdb1a 1150 PRINTF("stopScan\n\r");
Andrea Palmieri 217:23870c55b07e 1151 ret = aci_gap_terminate_gap_procedure(GAP_OBSERVATION_PROC);
Vincent Coubard 255:97adb68decd4 1152
Wolfgang Betz 132:51056160fa4a 1153 if (ret != BLE_STATUS_SUCCESS) {
Andrea Palmieri 238:b6454c839f42 1154 PRINTF("GAP Terminate Gap Procedure failed(ret=0x%x)\n", ret);
Vincent Coubard 255:97adb68decd4 1155 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1156 } else {
Wolfgang Betz 132:51056160fa4a 1157 PRINTF("Discovery Procedure Terminated\n");
Vincent Coubard 255:97adb68decd4 1158 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1159 }
Wolfgang Betz 130:770ce14d3d15 1160 }
Wolfgang Betz 130:770ce14d3d15 1161
Wolfgang Betz 130:770ce14d3d15 1162 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1163 /*!
Wolfgang Betz 130:770ce14d3d15 1164 @brief set Tx power level
Wolfgang Betz 130:770ce14d3d15 1165 @param[in] txPower Transmission Power level
Wolfgang Betz 130:770ce14d3d15 1166 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 1167 */
Wolfgang Betz 130:770ce14d3d15 1168 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1169 ble_error_t BlueNRGGap::setTxPower(int8_t txPower)
Wolfgang Betz 130:770ce14d3d15 1170 {
Wolfgang Betz 130:770ce14d3d15 1171 tBleStatus ret;
Vincent Coubard 255:97adb68decd4 1172
Wolfgang Betz 130:770ce14d3d15 1173 int8_t enHighPower = 0;
Andrea Palmieri 201:a9bc2e8b01d7 1174 int8_t paLevel = 0;
Andrea Palmieri 201:a9bc2e8b01d7 1175
Andrea Palmieri 228:25368f053411 1176 ret = getHighPowerAndPALevelValue(txPower, enHighPower, paLevel);
Andrea Palmieri 228:25368f053411 1177 if(ret!=BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 1178 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 1179 }
Andrea Palmieri 201:a9bc2e8b01d7 1180
Vincent Coubard 255:97adb68decd4 1181 PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 1182 ret = aci_hal_set_tx_power_level(enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 1183 if(ret!=BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 1184 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 1185 }
Andrea Palmieri 201:a9bc2e8b01d7 1186
Wolfgang Betz 130:770ce14d3d15 1187 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 1188 }
Wolfgang Betz 130:770ce14d3d15 1189
Wolfgang Betz 130:770ce14d3d15 1190 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1191 /*!
Wolfgang Betz 130:770ce14d3d15 1192 @brief get permitted Tx power values
Wolfgang Betz 130:770ce14d3d15 1193 @param[in] values pointer to pointer to permitted power values
Vincent Coubard 255:97adb68decd4 1194 @param[in] num number of values
Wolfgang Betz 130:770ce14d3d15 1195 */
Wolfgang Betz 130:770ce14d3d15 1196 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1197 void BlueNRGGap::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
Wolfgang Betz 130:770ce14d3d15 1198 static const int8_t permittedTxValues[] = {
Andrea Palmieri 229:9981f62cdb1a 1199 -18, -15, -14, -12, -11, -9, -8, -6, -5, -2, 0, 2, 4, 5, 8
Wolfgang Betz 130:770ce14d3d15 1200 };
Wolfgang Betz 130:770ce14d3d15 1201
Wolfgang Betz 130:770ce14d3d15 1202 *valueArrayPP = permittedTxValues;
Wolfgang Betz 130:770ce14d3d15 1203 *countP = sizeof(permittedTxValues) / sizeof(int8_t);
Wolfgang Betz 130:770ce14d3d15 1204 }
Wolfgang Betz 132:51056160fa4a 1205
Andrea Palmieri 229:9981f62cdb1a 1206 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1207 /*!
Andrea Palmieri 232:aead10288880 1208 @brief Set advertising parameters according to the current state
Andrea Palmieri 232:aead10288880 1209 Parameters value is set taking into account guidelines of the BlueNRG
Andrea Palmieri 232:aead10288880 1210 time slots allocation
Andrea Palmieri 232:aead10288880 1211 */
Andrea Palmieri 232:aead10288880 1212 /**************************************************************************/
Andrea Palmieri 232:aead10288880 1213 void BlueNRGGap::setAdvParameters(void)
Andrea Palmieri 232:aead10288880 1214 {
Andrea Palmieri 232:aead10288880 1215 uint32_t advIntMS;
Andrea Palmieri 232:aead10288880 1216
Andrea Palmieri 232:aead10288880 1217 if(state.connected == 1) {
Andrea Palmieri 232:aead10288880 1218 advIntMS = (conn_min_interval*1.25)-GUARD_INT;
Andrea Palmieri 232:aead10288880 1219 advInterval = _advParams.MSEC_TO_ADVERTISEMENT_DURATION_UNITS(advIntMS);
Vincent Coubard 256:146bb175ce80 1220
Vincent Coubard 259:323f588e5f57 1221 PRINTF("conn_min_interval is equal to %u\r\n", conn_min_interval);
Andrea Palmieri 232:aead10288880 1222 } else {
Andrea Palmieri 232:aead10288880 1223 advInterval = _advParams.getIntervalInADVUnits();
Andrea Palmieri 232:aead10288880 1224 }
Andrea Palmieri 232:aead10288880 1225 }
Andrea Palmieri 232:aead10288880 1226
Andrea Palmieri 232:aead10288880 1227 /**************************************************************************/
Andrea Palmieri 232:aead10288880 1228 /*!
Andrea Palmieri 229:9981f62cdb1a 1229 @brief Set connection parameters according to the current state (ADV and/or SCAN)
Andrea Palmieri 229:9981f62cdb1a 1230 Parameters value is set taking into account guidelines of the BlueNRG
Andrea Palmieri 229:9981f62cdb1a 1231 time slots allocation
Andrea Palmieri 229:9981f62cdb1a 1232 */
Andrea Palmieri 229:9981f62cdb1a 1233 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1234 void BlueNRGGap::setConnectionParameters(void)
Andrea Palmieri 229:9981f62cdb1a 1235 {
Andrea Palmieri 229:9981f62cdb1a 1236 if (state.advertising == 1) {
Andrea Palmieri 229:9981f62cdb1a 1237
Andrea Palmieri 232:aead10288880 1238 if (_scanningParams.getInterval() < advInterval) {
Andrea Palmieri 232:aead10288880 1239 PRINTF("state.adv=1 scanInterval<advInterval\r\n");
Andrea Palmieri 232:aead10288880 1240 scanInterval = advInterval;
Andrea Palmieri 232:aead10288880 1241 scanWindow = advInterval;
Andrea Palmieri 229:9981f62cdb1a 1242 } else {
Andrea Palmieri 232:aead10288880 1243 PRINTF("state.adv=1 scanInterval>=advInterval\r\n");
Andrea Palmieri 229:9981f62cdb1a 1244 scanInterval = _scanningParams.getInterval();
Andrea Palmieri 229:9981f62cdb1a 1245 scanWindow = _scanningParams.getWindow();
Andrea Palmieri 229:9981f62cdb1a 1246 }
Andrea Palmieri 234:3f6bba52b307 1247
Andrea Palmieri 234:3f6bba52b307 1248 if(advInterval>(MAX_INT_CONN-(GUARD_INT/1.25))) { //(4000-GUARD_INT)ms
Andrea Palmieri 234:3f6bba52b307 1249 conn_min_interval = MAX_INT_CONN;
Andrea Palmieri 234:3f6bba52b307 1250 conn_max_interval = MAX_INT_CONN;
Andrea Palmieri 234:3f6bba52b307 1251 } else {
Andrea Palmieri 234:3f6bba52b307 1252 conn_min_interval = (_advParams.ADVERTISEMENT_DURATION_UNITS_TO_MS(advInterval)+GUARD_INT)/1.25;
Andrea Palmieri 234:3f6bba52b307 1253 conn_max_interval = (_advParams.ADVERTISEMENT_DURATION_UNITS_TO_MS(advInterval)+GUARD_INT)/1.25;
Andrea Palmieri 234:3f6bba52b307 1254 }
Andrea Palmieri 229:9981f62cdb1a 1255
Andrea Palmieri 229:9981f62cdb1a 1256 } else {
Andrea Palmieri 229:9981f62cdb1a 1257
Andrea Palmieri 232:aead10288880 1258 PRINTF("state.adv = 0\r\n");
Andrea Palmieri 232:aead10288880 1259
Andrea Palmieri 229:9981f62cdb1a 1260 scanInterval = _scanningParams.getInterval();
Andrea Palmieri 229:9981f62cdb1a 1261 scanWindow = _scanningParams.getWindow();
Andrea Palmieri 234:3f6bba52b307 1262 if(SCAN_DURATION_UNITS_TO_MSEC(scanInterval)>(MAX_INT_CONN*1.25) ||
Andrea Palmieri 234:3f6bba52b307 1263 SCAN_DURATION_UNITS_TO_MSEC(scanInterval)<(MIN_INT_CONN*1.25)) { //(4000)ms || (7.5)ms
Andrea Palmieri 234:3f6bba52b307 1264 conn_min_interval = DEF_INT_CONN;
Andrea Palmieri 234:3f6bba52b307 1265 conn_max_interval = DEF_INT_CONN;
Andrea Palmieri 234:3f6bba52b307 1266 } else {
Andrea Palmieri 234:3f6bba52b307 1267 conn_min_interval = SCAN_DURATION_UNITS_TO_MSEC(scanInterval)/1.25;
Andrea Palmieri 234:3f6bba52b307 1268 conn_max_interval = SCAN_DURATION_UNITS_TO_MSEC(scanInterval)/1.25;
Andrea Palmieri 234:3f6bba52b307 1269 }
Andrea Palmieri 229:9981f62cdb1a 1270 }
Andrea Palmieri 229:9981f62cdb1a 1271 PRINTF("scanInterval=%u[msec]\r\n",SCAN_DURATION_UNITS_TO_MSEC(scanInterval));
Andrea Palmieri 229:9981f62cdb1a 1272 PRINTF("scanWindow()=%u[msec]\r\n",SCAN_DURATION_UNITS_TO_MSEC(scanWindow));
Andrea Palmieri 234:3f6bba52b307 1273 PRINTF("conn_min_interval=%u[msec]\r\n",(unsigned)(conn_min_interval*1.25));
Andrea Palmieri 234:3f6bba52b307 1274 PRINTF("conn_max_interval=%u[msec]\r\n",(unsigned)(conn_max_interval*1.25));
Andrea Palmieri 229:9981f62cdb1a 1275
Andrea Palmieri 229:9981f62cdb1a 1276 }
Andrea Palmieri 229:9981f62cdb1a 1277
Andrea Palmieri 181:749071129d2e 1278 ble_error_t BlueNRGGap::createConnection ()
Wolfgang Betz 132:51056160fa4a 1279 {
Wolfgang Betz 132:51056160fa4a 1280 tBleStatus ret;
Andrea Palmieri 229:9981f62cdb1a 1281
Andrea Palmieri 229:9981f62cdb1a 1282 /*
Andrea Palmieri 229:9981f62cdb1a 1283 Before creating connection, set parameters according
Andrea Palmieri 229:9981f62cdb1a 1284 to previous or current procedure (ADV and/or SCAN)
Andrea Palmieri 229:9981f62cdb1a 1285 */
Andrea Palmieri 229:9981f62cdb1a 1286 setConnectionParameters();
Andrea Palmieri 229:9981f62cdb1a 1287
Wolfgang Betz 132:51056160fa4a 1288 /*
Vincent Coubard 255:97adb68decd4 1289 Scan_Interval, Scan_Window, Peer_Address_Type, Peer_Address, Own_Address_Type, Conn_Interval_Min,
Vincent Coubard 255:97adb68decd4 1290 Conn_Interval_Max, Conn_Latency, Supervision_Timeout, Conn_Len_Min, Conn_Len_Max
Wolfgang Betz 132:51056160fa4a 1291 */
Andrea Palmieri 229:9981f62cdb1a 1292 ret = aci_gap_create_connection(scanInterval,
Andrea Palmieri 229:9981f62cdb1a 1293 scanWindow,
Andrea Palmieri 229:9981f62cdb1a 1294 _peerAddrType,
Wolfgang Betz 163:4c008b1089e9 1295 (unsigned char*)_peerAddr,
Andrea Palmieri 229:9981f62cdb1a 1296 addr_type,
Andrea Palmieri 229:9981f62cdb1a 1297 conn_min_interval, conn_max_interval, 0,
Andrea Palmieri 238:b6454c839f42 1298 SUPERV_TIMEOUT, CONN_L1, CONN_L1);
Wolfgang Betz 165:3576598c0889 1299
Andrea Palmieri 238:b6454c839f42 1300 //_connecting = false;
Vincent Coubard 255:97adb68decd4 1301
Wolfgang Betz 163:4c008b1089e9 1302 if (ret != BLE_STATUS_SUCCESS) {
Andrea Palmieri 229:9981f62cdb1a 1303 PRINTF("Error while starting connection (ret=0x%02X).\n\r", ret);
Wolfgang Betz 132:51056160fa4a 1304 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1305 } else {
Wolfgang Betz 132:51056160fa4a 1306 PRINTF("Connection started.\n");
Andrea Palmieri 238:b6454c839f42 1307 _connecting = false;
Wolfgang Betz 132:51056160fa4a 1308 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1309 }
Wolfgang Betz 132:51056160fa4a 1310 }
Wolfgang Betz 132:51056160fa4a 1311
Wolfgang Betz 132:51056160fa4a 1312 ble_error_t BlueNRGGap::connect (const Gap::Address_t peerAddr,
Wolfgang Betz 132:51056160fa4a 1313 Gap::AddressType_t peerAddrType,
Wolfgang Betz 132:51056160fa4a 1314 const ConnectionParams_t *connectionParams,
Wolfgang Betz 132:51056160fa4a 1315 const GapScanningParams *scanParams)
Wolfgang Betz 132:51056160fa4a 1316 {
Andrea Palmieri 142:adf1567d3900 1317 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 1318 (void)connectionParams;
Vincent Coubard 272:4639da7705e1 1319
Vincent Coubard 272:4639da7705e1 1320 setScanParams(scanParams->getInterval(),
Vincent Coubard 272:4639da7705e1 1321 scanParams->getWindow(),
Vincent Coubard 272:4639da7705e1 1322 scanParams->getTimeout(),
Vincent Coubard 272:4639da7705e1 1323 scanParams->getActiveScanning()
Vincent Coubard 272:4639da7705e1 1324 );
Andrea Palmieri 142:adf1567d3900 1325
Andrea Palmieri 217:23870c55b07e 1326 // Save the peer address
Wolfgang Betz 132:51056160fa4a 1327 for(int i=0; i<BDADDR_SIZE; i++) {
Wolfgang Betz 132:51056160fa4a 1328 _peerAddr[i] = peerAddr[i];
Wolfgang Betz 132:51056160fa4a 1329 }
Andrea Palmieri 229:9981f62cdb1a 1330 _peerAddrType = peerAddrType;
Wolfgang Betz 132:51056160fa4a 1331
Andrea Palmieri 181:749071129d2e 1332 _connecting = true;
Wolfgang Betz 132:51056160fa4a 1333
Wolfgang Betz 132:51056160fa4a 1334 if(_scanning) {
Wolfgang Betz 132:51056160fa4a 1335 stopScan();
Wolfgang Betz 132:51056160fa4a 1336 } else {
Wolfgang Betz 165:3576598c0889 1337 PRINTF("Calling createConnection from connect()\n\r");
Wolfgang Betz 165:3576598c0889 1338 return createConnection();
Wolfgang Betz 132:51056160fa4a 1339 }
Vincent Coubard 255:97adb68decd4 1340
Wolfgang Betz 132:51056160fa4a 1341 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1342 }
Andrea Palmieri 229:9981f62cdb1a 1343
Andrea Palmieri 229:9981f62cdb1a 1344 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1345 /*!
Andrea Palmieri 229:9981f62cdb1a 1346 @brief Set the advertising policy filter mode that will be used in
Andrea Palmieri 229:9981f62cdb1a 1347 the next call to startAdvertising().
Andrea Palmieri 229:9981f62cdb1a 1348
Andrea Palmieri 229:9981f62cdb1a 1349 @returns \ref ble_errror_t
Andrea Palmieri 229:9981f62cdb1a 1350
Andrea Palmieri 229:9981f62cdb1a 1351 @retval BLE_ERROR_NONE
Andrea Palmieri 229:9981f62cdb1a 1352 Everything executed properly.
Andrea Palmieri 229:9981f62cdb1a 1353
Andrea Palmieri 229:9981f62cdb1a 1354 BLE_ERROR_NOT_IMPLEMENTED
Andrea Palmieri 229:9981f62cdb1a 1355 This feature is currently note implemented.
Andrea Palmieri 229:9981f62cdb1a 1356 */
Andrea Palmieri 229:9981f62cdb1a 1357 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1358 ble_error_t BlueNRGGap::setAdvertisingPolicyMode(Gap::AdvertisingPolicyMode_t mode)
Andrea Palmieri 229:9981f62cdb1a 1359 {
Andrea Palmieri 229:9981f62cdb1a 1360 advertisingPolicyMode = mode;
Andrea Palmieri 229:9981f62cdb1a 1361
Andrea Palmieri 229:9981f62cdb1a 1362 return BLE_ERROR_NONE;
Andrea Palmieri 229:9981f62cdb1a 1363 }
Andrea Palmieri 229:9981f62cdb1a 1364
Andrea Palmieri 229:9981f62cdb1a 1365 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1366 /*!
Andrea Palmieri 229:9981f62cdb1a 1367 @brief Set the scanning policy filter mode that will be used in
Andrea Palmieri 229:9981f62cdb1a 1368 the next call to startAdvertising().
Andrea Palmieri 229:9981f62cdb1a 1369
Andrea Palmieri 229:9981f62cdb1a 1370 @returns \ref ble_errror_t
Andrea Palmieri 229:9981f62cdb1a 1371
Andrea Palmieri 229:9981f62cdb1a 1372 @retval BLE_ERROR_NONE
Andrea Palmieri 229:9981f62cdb1a 1373 Everything executed properly.
Andrea Palmieri 229:9981f62cdb1a 1374
Andrea Palmieri 229:9981f62cdb1a 1375 BLE_ERROR_NOT_IMPLEMENTED
Andrea Palmieri 229:9981f62cdb1a 1376 This feature is currently note implemented.
Andrea Palmieri 229:9981f62cdb1a 1377 */
Andrea Palmieri 229:9981f62cdb1a 1378 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1379 ble_error_t BlueNRGGap::setScanningPolicyMode(Gap::ScanningPolicyMode_t mode)
Andrea Palmieri 229:9981f62cdb1a 1380 {
Andrea Palmieri 229:9981f62cdb1a 1381 scanningPolicyMode = mode;
Andrea Palmieri 229:9981f62cdb1a 1382
Andrea Palmieri 229:9981f62cdb1a 1383 return BLE_ERROR_NONE;
Andrea Palmieri 229:9981f62cdb1a 1384 }
Andrea Palmieri 229:9981f62cdb1a 1385
Andrea Palmieri 229:9981f62cdb1a 1386 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1387 /*!
Andrea Palmieri 229:9981f62cdb1a 1388 @brief Get the current advertising policy filter mode.
Andrea Palmieri 229:9981f62cdb1a 1389
Andrea Palmieri 229:9981f62cdb1a 1390 @returns The advertising policy filter mode.
Andrea Palmieri 229:9981f62cdb1a 1391 */
Andrea Palmieri 229:9981f62cdb1a 1392 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1393 Gap::AdvertisingPolicyMode_t BlueNRGGap::getAdvertisingPolicyMode(void) const
Andrea Palmieri 229:9981f62cdb1a 1394 {
Andrea Palmieri 229:9981f62cdb1a 1395 return advertisingPolicyMode;
Andrea Palmieri 229:9981f62cdb1a 1396 }
Andrea Palmieri 229:9981f62cdb1a 1397
Andrea Palmieri 229:9981f62cdb1a 1398 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1399 /*!
Andrea Palmieri 229:9981f62cdb1a 1400 @brief Get the current scanning policy filter mode.
Andrea Palmieri 229:9981f62cdb1a 1401
Andrea Palmieri 229:9981f62cdb1a 1402 @returns The scanning policy filter mode.
Andrea Palmieri 229:9981f62cdb1a 1403
Andrea Palmieri 229:9981f62cdb1a 1404 */
Andrea Palmieri 229:9981f62cdb1a 1405 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1406 Gap::ScanningPolicyMode_t BlueNRGGap::getScanningPolicyMode(void) const
Andrea Palmieri 229:9981f62cdb1a 1407 {
Andrea Palmieri 229:9981f62cdb1a 1408 return scanningPolicyMode;
Andrea Palmieri 229:9981f62cdb1a 1409 }
Andrea Palmieri 229:9981f62cdb1a 1410
Andrea Palmieri 229:9981f62cdb1a 1411 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1412 /*!
Andrea Palmieri 229:9981f62cdb1a 1413 @brief Clear BlueNRGGap's state.
Andrea Palmieri 229:9981f62cdb1a 1414
Andrea Palmieri 229:9981f62cdb1a 1415 @returns ble_error_t
Andrea Palmieri 229:9981f62cdb1a 1416
Andrea Palmieri 229:9981f62cdb1a 1417 @retval BLE_ERROR_NONE
Andrea Palmieri 229:9981f62cdb1a 1418 Everything executed properly
Andrea Palmieri 229:9981f62cdb1a 1419 */
Andrea Palmieri 229:9981f62cdb1a 1420 /**************************************************************************/
Andrea Palmieri 229:9981f62cdb1a 1421 ble_error_t BlueNRGGap::reset(void)
Andrea Palmieri 229:9981f62cdb1a 1422 {
Andrea Palmieri 229:9981f62cdb1a 1423 /* Clear all state that is from the parent, including private members */
Andrea Palmieri 229:9981f62cdb1a 1424 if (Gap::reset() != BLE_ERROR_NONE) {
Andrea Palmieri 229:9981f62cdb1a 1425 return BLE_ERROR_INVALID_STATE;
Andrea Palmieri 229:9981f62cdb1a 1426 }
Andrea Palmieri 229:9981f62cdb1a 1427
Andrea Palmieri 229:9981f62cdb1a 1428 /* Clear derived class members */
Andrea Palmieri 229:9981f62cdb1a 1429 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
Andrea Palmieri 229:9981f62cdb1a 1430
Andrea Palmieri 229:9981f62cdb1a 1431 /* Set the whitelist policy filter modes to IGNORE_WHITELIST */
Andrea Palmieri 229:9981f62cdb1a 1432 advertisingPolicyMode = Gap::ADV_POLICY_IGNORE_WHITELIST;
Andrea Palmieri 229:9981f62cdb1a 1433 scanningPolicyMode = Gap::SCAN_POLICY_IGNORE_WHITELIST;
Andrea Palmieri 229:9981f62cdb1a 1434
Andrea Palmieri 229:9981f62cdb1a 1435 return BLE_ERROR_NONE;
Vincent Coubard 256:146bb175ce80 1436 }
Vincent Coubard 256:146bb175ce80 1437
Vincent Coubard 256:146bb175ce80 1438 void BlueNRGGap::setConnectionInterval(uint16_t interval) {
Vincent Coubard 256:146bb175ce80 1439 conn_min_interval = interval;
Vincent Coubard 256:146bb175ce80 1440 conn_max_interval = interval;
Vincent Coubard 272:4639da7705e1 1441 }
Vincent Coubard 272:4639da7705e1 1442
Vincent Coubard 272:4639da7705e1 1443 void BlueNRGGap::setGapRole(Role_t role)
Vincent Coubard 272:4639da7705e1 1444 {
Vincent Coubard 272:4639da7705e1 1445 gapRole = role;
Vincent Coubard 302:ed6f74ab78f9 1446 }