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 May 26 15:34:04 2016 +0200
Revision:
234:3f6bba52b307
Parent:
232:aead10288880
Child:
236:2a73f3a97452
Fix bug on intervals setting

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