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

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

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

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

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

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

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

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

Committer:
Vincent Coubard
Date:
Thu Sep 15 10:49:39 2016 +0100
Branch:
sync_with_github
Revision:
253:9665a6f8bbdb
Parent:
252:0c2cb16a7166
Child:
254:f4d217cadbde
Sync with 4607c9b8b84bb61287ac96092cab09641a8e8c37\nMinor adjustements to sync with the github repository at this point in time.

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