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:
Andrea Palmieri
Date:
Thu Jun 09 17:16:36 2016 +0200
Revision:
236:2a73f3a97452
Parent:
234:3f6bba52b307
Child:
237:64c2ddbd9329
Fix issue on ADV payload de-allocation

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