BLE_API wrapper library for STMicroelectronics' BlueNRG Bluetooth Low Energy expansion board shield (Component)

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 are Arduino compatible with an exception: instead of using pin D13 for the SPI clock, they use pin D3. The default configuration for this library is having the SPI clock on pin D3.

To be fully Arduino compatible, X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 need a small HW patch.

For X-NUCLEO-IDB04A1 this patch consists in removing zero resistor R10 and instead soldering zero resistor R11. For X-NUCLEO-IDB05A1 this patch consists in removing zero resistor R4 and instead soldering zero resistor R6.

In case you patch your board, then you also have to configure this library to use pin D13 to drive the SPI clock (see macro IDB0XA1_D13_PATCH in file x_nucleo_idb0xa1_targets.h).

If you use pin D13 for the SPI clock, please be aware that on STM32 Nucleo boards you may not drive the LED, otherwise you will get a conflict: the LED on STM32 Nucleo boards is connected to pin D13.

Referring to the current list of tested platforms (see X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 pages), the patch is required by ST-Nucleo-F103RB; ST-Nucleo-F302R8; ST-Nucleo-F411RE; and ST-Nucleo-F446RE.

Committer:
Vincent Coubard
Date:
Thu Sep 15 10:51:32 2016 +0100
Branch:
9bb31e3d89ab51aca24fe8b1162853fbc70fe791
Revision:
270:ca649990a830
Parent:
268:c0a1e03c5736
Child:
272:4639da7705e1
Sync with 9bb31e3d89ab51aca24fe8b1162853fbc70fe791

2016-07-13 15:02:10+02:00: Andrea Palmieri
Clean implementation of setAdvertisingData() and startAdvertising()

Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>

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