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

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

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

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

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

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

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

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

Committer:
Andrea Palmieri
Date:
Tue Apr 26 14:44:54 2016 +0200
Revision:
228:25368f053411
Parent:
224:d8669b6b3175
Child:
229:9981f62cdb1a
Fix issues

- Address
- Appearance (get/set)
- DeviceName (get/set)
- TxPower (set)
- Scan Response

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 130:770ce14d3d15 1 /* mbed Microcontroller Library
Wolfgang Betz 130:770ce14d3d15 2 * Copyright (c) 2006-2013 ARM Limited
Wolfgang Betz 130:770ce14d3d15 3 *
Wolfgang Betz 130:770ce14d3d15 4 * Licensed under the Apache License, Version 2.0 (the "License");
Wolfgang Betz 130:770ce14d3d15 5 * you may not use this file except in compliance with the License.
Wolfgang Betz 130:770ce14d3d15 6 * You may obtain a copy of the License at
Wolfgang Betz 130:770ce14d3d15 7 *
Wolfgang Betz 130:770ce14d3d15 8 * http://www.apache.org/licenses/LICENSE-2.0
Wolfgang Betz 130:770ce14d3d15 9 *
Wolfgang Betz 130:770ce14d3d15 10 * Unless required by applicable law or agreed to in writing, software
Wolfgang Betz 130:770ce14d3d15 11 * distributed under the License is distributed on an "AS IS" BASIS,
Wolfgang Betz 130:770ce14d3d15 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Wolfgang Betz 130:770ce14d3d15 13 * See the License for the specific language governing permissions and
Wolfgang Betz 130:770ce14d3d15 14 * limitations under the License.
Wolfgang Betz 130:770ce14d3d15 15 */
Wolfgang Betz 130:770ce14d3d15 16
Wolfgang Betz 130:770ce14d3d15 17
Wolfgang Betz 130:770ce14d3d15 18 /**
Wolfgang Betz 130:770ce14d3d15 19 ******************************************************************************
Wolfgang Betz 130:770ce14d3d15 20 * @file BlueNRGGap.cpp
Wolfgang Betz 130:770ce14d3d15 21 * @author STMicroelectronics
Wolfgang Betz 130:770ce14d3d15 22 * @brief Implementation of BLE_API Gap Class
Wolfgang Betz 130:770ce14d3d15 23 ******************************************************************************
Wolfgang Betz 130:770ce14d3d15 24 * @copy
Wolfgang Betz 130:770ce14d3d15 25 *
Wolfgang Betz 130:770ce14d3d15 26 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Wolfgang Betz 130:770ce14d3d15 27 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
Wolfgang Betz 130:770ce14d3d15 28 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
Wolfgang Betz 130:770ce14d3d15 29 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
Wolfgang Betz 130:770ce14d3d15 30 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
Wolfgang Betz 130:770ce14d3d15 31 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Wolfgang Betz 130:770ce14d3d15 32 *
Wolfgang Betz 130:770ce14d3d15 33 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
Wolfgang Betz 130:770ce14d3d15 34 */
Wolfgang Betz 130:770ce14d3d15 35
Wolfgang Betz 130:770ce14d3d15 36 // ANDREA: Changed some types (e.g., tHalUint8 --> uint8_t)
Wolfgang Betz 130:770ce14d3d15 37
Wolfgang Betz 130:770ce14d3d15 38 /** @defgroup BlueNRGGap
Wolfgang Betz 130:770ce14d3d15 39 * @brief BlueNRG BLE_API GAP Adaptation
Wolfgang Betz 130:770ce14d3d15 40 * @{
Wolfgang Betz 130:770ce14d3d15 41 */
Wolfgang Betz 130:770ce14d3d15 42
Wolfgang Betz 130:770ce14d3d15 43 #include "BlueNRGDevice.h"
Wolfgang Betz 144:bdf5e8432131 44 #include "mbed-drivers/mbed.h"
Wolfgang Betz 130:770ce14d3d15 45 #include "Payload.h"
Wolfgang Betz 130:770ce14d3d15 46 #include "Utils.h"
Wolfgang Betz 132:51056160fa4a 47 #include "debug.h"
Wolfgang Betz 130:770ce14d3d15 48
Wolfgang Betz 130:770ce14d3d15 49 //Local Variables
Wolfgang Betz 130:770ce14d3d15 50 //const char *local_name = NULL;
Wolfgang Betz 130:770ce14d3d15 51 //uint8_t local_name_length = 0;
Wolfgang Betz 130:770ce14d3d15 52 const uint8_t *scan_response_payload = NULL;
Wolfgang Betz 130:770ce14d3d15 53 uint8_t scan_rsp_length = 0;
Wolfgang Betz 130:770ce14d3d15 54
Wolfgang Betz 130:770ce14d3d15 55 uint32_t advtInterval = BLUENRG_GAP_ADV_INTERVAL_MAX;
Wolfgang Betz 130:770ce14d3d15 56
Wolfgang Betz 130:770ce14d3d15 57 /*
Wolfgang Betz 130:770ce14d3d15 58 * Utility to process GAP specific events (e.g., Advertising timeout)
Wolfgang Betz 130:770ce14d3d15 59 */
Wolfgang Betz 130:770ce14d3d15 60 void BlueNRGGap::Process(void)
Wolfgang Betz 130:770ce14d3d15 61 {
Wolfgang Betz 130:770ce14d3d15 62 if(AdvToFlag) {
Wolfgang Betz 130:770ce14d3d15 63 stopAdvertising();
Wolfgang Betz 130:770ce14d3d15 64 }
Wolfgang Betz 130:770ce14d3d15 65
Wolfgang Betz 130:770ce14d3d15 66 }
Wolfgang Betz 130:770ce14d3d15 67
Wolfgang Betz 130:770ce14d3d15 68 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 69 /*!
Wolfgang Betz 130:770ce14d3d15 70 @brief Sets the advertising parameters and payload for the device.
Wolfgang Betz 130:770ce14d3d15 71 Note: Some data types give error when their adv data is updated using aci_gap_update_adv_data() API
Wolfgang Betz 130:770ce14d3d15 72
Wolfgang Betz 130:770ce14d3d15 73 @params[in] advData
Wolfgang Betz 130:770ce14d3d15 74 The primary advertising data payload
Wolfgang Betz 130:770ce14d3d15 75 @params[in] scanResponse
Wolfgang Betz 130:770ce14d3d15 76 The optional Scan Response payload if the advertising
Wolfgang Betz 130:770ce14d3d15 77 type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED
Wolfgang Betz 130:770ce14d3d15 78 in \ref GapAdveritinngParams
Wolfgang Betz 130:770ce14d3d15 79
Wolfgang Betz 130:770ce14d3d15 80 @returns \ref ble_error_t
Wolfgang Betz 130:770ce14d3d15 81
Wolfgang Betz 130:770ce14d3d15 82 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 83 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 84
Wolfgang Betz 130:770ce14d3d15 85 @retval BLE_ERROR_BUFFER_OVERFLOW
Wolfgang Betz 130:770ce14d3d15 86 The proposed action would cause a buffer overflow. All
Wolfgang Betz 130:770ce14d3d15 87 advertising payloads must be <= 31 bytes, for example.
Wolfgang Betz 130:770ce14d3d15 88
Wolfgang Betz 130:770ce14d3d15 89 @retval BLE_ERROR_NOT_IMPLEMENTED
Wolfgang Betz 130:770ce14d3d15 90 A feature was requested that is not yet supported in the
Wolfgang Betz 130:770ce14d3d15 91 nRF51 firmware or hardware.
Wolfgang Betz 130:770ce14d3d15 92
Wolfgang Betz 130:770ce14d3d15 93 @retval BLE_ERROR_PARAM_OUT_OF_RANGE
Wolfgang Betz 130:770ce14d3d15 94 One of the proposed values is outside the valid range.
Wolfgang Betz 130:770ce14d3d15 95
Wolfgang Betz 130:770ce14d3d15 96 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 97
Wolfgang Betz 130:770ce14d3d15 98 @code
Wolfgang Betz 130:770ce14d3d15 99
Wolfgang Betz 130:770ce14d3d15 100 @endcode
Wolfgang Betz 130:770ce14d3d15 101 */
Wolfgang Betz 130:770ce14d3d15 102 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 103 ble_error_t BlueNRGGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse)
Wolfgang Betz 130:770ce14d3d15 104 {
Wolfgang Betz 132:51056160fa4a 105 PRINTF("BlueNRGGap::setAdvertisingData\n\r");
Wolfgang Betz 130:770ce14d3d15 106 /* Make sure we don't exceed the advertising payload length */
Wolfgang Betz 130:770ce14d3d15 107 if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
Wolfgang Betz 130:770ce14d3d15 108 return BLE_ERROR_BUFFER_OVERFLOW;
Wolfgang Betz 130:770ce14d3d15 109 }
Wolfgang Betz 130:770ce14d3d15 110
Wolfgang Betz 130:770ce14d3d15 111 /* Make sure we have a payload! */
Wolfgang Betz 130:770ce14d3d15 112 if (advData.getPayloadLen() <= 0) {
Wolfgang Betz 130:770ce14d3d15 113 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 114 } else {
Wolfgang Betz 130:770ce14d3d15 115 PayloadPtr loadPtr(advData.getPayload(), advData.getPayloadLen());
Wolfgang Betz 130:770ce14d3d15 116 for(uint8_t index=0; index<loadPtr.getPayloadUnitCount(); index++) {
Wolfgang Betz 130:770ce14d3d15 117 loadPtr.getUnitAtIndex(index);
Wolfgang Betz 130:770ce14d3d15 118
Wolfgang Betz 132:51056160fa4a 119 PRINTF("adData[%d].length=%d\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getLenPtr()));
Wolfgang Betz 132:51056160fa4a 120 PRINTF("adData[%d].AdType=0x%x\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()));
Wolfgang Betz 130:770ce14d3d15 121
Wolfgang Betz 130:770ce14d3d15 122 switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) {
Wolfgang Betz 130:770ce14d3d15 123 case GapAdvertisingData::FLAGS: /* ref *Flags */
Wolfgang Betz 130:770ce14d3d15 124 {
Wolfgang Betz 132:51056160fa4a 125 PRINTF("Advertising type: FLAGS\n\r");
Wolfgang Betz 130:770ce14d3d15 126 //Check if Flags are OK. BlueNRG only supports LE Mode.
Wolfgang Betz 130:770ce14d3d15 127 uint8_t *flags = loadPtr.getUnitAtIndex(index).getDataPtr();
Wolfgang Betz 130:770ce14d3d15 128 if((*flags & GapAdvertisingData::BREDR_NOT_SUPPORTED) != GapAdvertisingData::BREDR_NOT_SUPPORTED) {
Wolfgang Betz 132:51056160fa4a 129 PRINTF("BlueNRG does not support BR/EDR Mode");
Wolfgang Betz 130:770ce14d3d15 130 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 131 }
Wolfgang Betz 130:770ce14d3d15 132
Wolfgang Betz 130:770ce14d3d15 133 break;
Wolfgang Betz 130:770ce14d3d15 134 }
Wolfgang Betz 130:770ce14d3d15 135 case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS: /**< Incomplete list of 16-bit Service IDs */
Wolfgang Betz 130:770ce14d3d15 136 case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS: /**< Complete list of 16-bit Service IDs */
Andrea Palmieri 189:30fa96fa8ec4 137 case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */
Andrea Palmieri 189:30fa96fa8ec4 138 case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS: /**< Complete list of 128-bit Service IDs */
Wolfgang Betz 130:770ce14d3d15 139 {
Andrea Palmieri 189:30fa96fa8ec4 140 PRINTF("Advertising type: INCOMPLETE_LIST SERVICE_IDS/COMPLETE_LIST SERVICE_IDS\n\r");
Wolfgang Betz 130:770ce14d3d15 141
Wolfgang Betz 130:770ce14d3d15 142 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Wolfgang Betz 130:770ce14d3d15 143 // The total lenght should include the Data Type Value
Wolfgang Betz 130:770ce14d3d15 144 if(buffSize>UUID_BUFFER_SIZE-1) {
Andrea Palmieri 189:30fa96fa8ec4 145 return BLE_ERROR_INVALID_PARAM;
Wolfgang Betz 130:770ce14d3d15 146 }
Wolfgang Betz 130:770ce14d3d15 147
Wolfgang Betz 130:770ce14d3d15 148 servUuidlength = buffSize+1; // +1 to include the Data Type Value
Wolfgang Betz 130:770ce14d3d15 149 servUuidData[0] = (uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()); //Data Type Value
Wolfgang Betz 130:770ce14d3d15 150
Wolfgang Betz 132:51056160fa4a 151 PRINTF("servUuidlength=%d servUuidData[0]=%d buffSize=%d\n\r", servUuidlength, servUuidData[0], buffSize);
Wolfgang Betz 130:770ce14d3d15 152 // Save the Service UUID list just after the Data Type Value field
Wolfgang Betz 130:770ce14d3d15 153 memcpy(servUuidData+1, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
Andrea Palmieri 189:30fa96fa8ec4 154 #ifdef DEBUG
Wolfgang Betz 130:770ce14d3d15 155 for(unsigned i=0; i<servUuidlength; i++) {
Wolfgang Betz 132:51056160fa4a 156 PRINTF("servUuidData[%d] = 0x%x\n\r", i, servUuidData[i]);
Wolfgang Betz 130:770ce14d3d15 157 }
Wolfgang Betz 130:770ce14d3d15 158
Wolfgang Betz 130:770ce14d3d15 159 for(unsigned i=0; i<buffSize; i++) {
Wolfgang Betz 132:51056160fa4a 160 PRINTF("loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
Wolfgang Betz 130:770ce14d3d15 161 }
Andrea Palmieri 189:30fa96fa8ec4 162 #endif /* DEBUG */
Wolfgang Betz 130:770ce14d3d15 163 break;
Wolfgang Betz 130:770ce14d3d15 164 }
Wolfgang Betz 130:770ce14d3d15 165 case GapAdvertisingData::INCOMPLETE_LIST_32BIT_SERVICE_IDS: /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
Wolfgang Betz 130:770ce14d3d15 166 {
Wolfgang Betz 132:51056160fa4a 167 PRINTF("Advertising type: INCOMPLETE_LIST_32BIT_SERVICE_IDS\n\r");
Wolfgang Betz 130:770ce14d3d15 168 return BLE_ERROR_NOT_IMPLEMENTED;
Wolfgang Betz 130:770ce14d3d15 169 }
Wolfgang Betz 130:770ce14d3d15 170 case GapAdvertisingData::COMPLETE_LIST_32BIT_SERVICE_IDS: /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
Wolfgang Betz 130:770ce14d3d15 171 {
Wolfgang Betz 132:51056160fa4a 172 PRINTF("Advertising type: COMPLETE_LIST_32BIT_SERVICE_IDS\n\r");
Wolfgang Betz 130:770ce14d3d15 173 return BLE_ERROR_NOT_IMPLEMENTED;
Wolfgang Betz 130:770ce14d3d15 174 }
Wolfgang Betz 130:770ce14d3d15 175 case GapAdvertisingData::SHORTENED_LOCAL_NAME: /**< Shortened Local Name */
Wolfgang Betz 130:770ce14d3d15 176 {
Wolfgang Betz 130:770ce14d3d15 177 break;
Wolfgang Betz 130:770ce14d3d15 178 }
Wolfgang Betz 130:770ce14d3d15 179 case GapAdvertisingData::COMPLETE_LOCAL_NAME: /**< Complete Local Name */
Wolfgang Betz 130:770ce14d3d15 180 {
Wolfgang Betz 132:51056160fa4a 181 PRINTF("Advertising type: COMPLETE_LOCAL_NAME\n\r");
Andrea Palmieri 222:37a7e289ee3d 182 loadPtr.getUnitAtIndex(index).printDataAsString();
Andrea Palmieri 222:37a7e289ee3d 183 local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Andrea Palmieri 222:37a7e289ee3d 184 // The total lenght should include the Data Type Value
Andrea Palmieri 222:37a7e289ee3d 185 if(local_name_length>LOCAL_NAME_MAX_SIZE-1) {
Andrea Palmieri 222:37a7e289ee3d 186 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 222:37a7e289ee3d 187 }
Andrea Palmieri 222:37a7e289ee3d 188 local_name[0] = (uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()); //Data Type Value
Andrea Palmieri 222:37a7e289ee3d 189 memcpy(local_name+1, (uint8_t*)loadPtr.getUnitAtIndex(index).getDataPtr(), local_name_length-1);
Andrea Palmieri 222:37a7e289ee3d 190 PRINTF("Advertising type: COMPLETE_LOCAL_NAME local_name=%s local_name_length=%d\n\r", local_name, local_name_length);
Andrea Palmieri 222:37a7e289ee3d 191
Wolfgang Betz 130:770ce14d3d15 192 break;
Wolfgang Betz 130:770ce14d3d15 193 }
Wolfgang Betz 130:770ce14d3d15 194 case GapAdvertisingData::TX_POWER_LEVEL: /**< TX Power Level (in dBm) */
Wolfgang Betz 130:770ce14d3d15 195 {
Wolfgang Betz 132:51056160fa4a 196 PRINTF("Advertising type: TX_POWER_LEVEL\n\r");
Wolfgang Betz 130:770ce14d3d15 197 int8_t enHighPower = 0;
Wolfgang Betz 130:770ce14d3d15 198 int8_t paLevel = 0;
Wolfgang Betz 132:51056160fa4a 199 #ifdef DEBUG
Wolfgang Betz 130:770ce14d3d15 200 int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr();
Wolfgang Betz 130:770ce14d3d15 201 int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 202 #endif
Wolfgang Betz 132:51056160fa4a 203 PRINTF("dbm=%d, dbmActuallySet=%d\n\r", dbm, dbmActuallySet);
Wolfgang Betz 132:51056160fa4a 204 PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 205 aci_hal_set_tx_power_level(enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 206 break;
Wolfgang Betz 130:770ce14d3d15 207 }
Wolfgang Betz 130:770ce14d3d15 208 case GapAdvertisingData::DEVICE_ID: /**< Device ID */
Wolfgang Betz 130:770ce14d3d15 209 {
Wolfgang Betz 130:770ce14d3d15 210 break;
Wolfgang Betz 130:770ce14d3d15 211 }
Wolfgang Betz 130:770ce14d3d15 212 case GapAdvertisingData::SLAVE_CONNECTION_INTERVAL_RANGE: /**< Slave :Connection Interval Range */
Wolfgang Betz 130:770ce14d3d15 213 {
Wolfgang Betz 130:770ce14d3d15 214 break;
Wolfgang Betz 130:770ce14d3d15 215 }
Wolfgang Betz 130:770ce14d3d15 216 case GapAdvertisingData::SERVICE_DATA: /**< Service Data */
Wolfgang Betz 130:770ce14d3d15 217 {
Wolfgang Betz 132:51056160fa4a 218 PRINTF("Advertising type: SERVICE_DATA\n\r");
Wolfgang Betz 130:770ce14d3d15 219 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Wolfgang Betz 132:51056160fa4a 220 PRINTF("Advertising type: SERVICE_DATA (buffSize=%d)\n\r", buffSize);
Wolfgang Betz 130:770ce14d3d15 221 // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Service Data Type Value byte
Wolfgang Betz 130:770ce14d3d15 222 if(buffSize>ADV_DATA_MAX_SIZE-2) {
Wolfgang Betz 130:770ce14d3d15 223 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 224 }
Wolfgang Betz 130:770ce14d3d15 225 for(int i=0; i<buffSize+1; i++) {
Wolfgang Betz 132:51056160fa4a 226 PRINTF("Advertising type: SERVICE_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
Wolfgang Betz 130:770ce14d3d15 227 }
Wolfgang Betz 130:770ce14d3d15 228 AdvLen = buffSize+2; // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Service Data Type Value byte
Wolfgang Betz 130:770ce14d3d15 229 AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data)
Wolfgang Betz 130:770ce14d3d15 230 AdvData[1] = AD_TYPE_SERVICE_DATA;
Wolfgang Betz 130:770ce14d3d15 231 memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
Wolfgang Betz 130:770ce14d3d15 232 break;
Wolfgang Betz 130:770ce14d3d15 233 }
Andrea Palmieri 228:25368f053411 234 case GapAdvertisingData::APPEARANCE: /**< Appearance */
Wolfgang Betz 130:770ce14d3d15 235 {
Wolfgang Betz 132:51056160fa4a 236 PRINTF("Advertising type: APPEARANCE\n\r");
Andrea Palmieri 228:25368f053411 237 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Andrea Palmieri 228:25368f053411 238 if(buffSize>ADV_DATA_MAX_SIZE-2) {
Andrea Palmieri 228:25368f053411 239 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 240 }
Andrea Palmieri 228:25368f053411 241 GapAdvertisingData::Appearance appearanceP;
Andrea Palmieri 228:25368f053411 242 memcpy(deviceAppearance, loadPtr.getUnitAtIndex(index).getDataPtr(), 2);
Wolfgang Betz 130:770ce14d3d15 243
Andrea Palmieri 228:25368f053411 244 PRINTF("input: deviceAppearance= 0x%x 0x%x\n\r", deviceAppearance[1], deviceAppearance[0]);
Andrea Palmieri 228:25368f053411 245
Andrea Palmieri 228:25368f053411 246 appearanceP = (GapAdvertisingData::Appearance)(deviceAppearance[1]<<8|deviceAppearance[0]);
Andrea Palmieri 228:25368f053411 247 /* Align the GAP Service Appearance Char value coherently */
Andrea Palmieri 228:25368f053411 248 setAppearance(appearanceP);
Wolfgang Betz 130:770ce14d3d15 249 break;
Wolfgang Betz 130:770ce14d3d15 250 }
Wolfgang Betz 130:770ce14d3d15 251 case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */
Wolfgang Betz 130:770ce14d3d15 252 {
Wolfgang Betz 132:51056160fa4a 253 PRINTF("Advertising type: ADVERTISING_INTERVAL\n\r");
Wolfgang Betz 130:770ce14d3d15 254 advtInterval = (uint16_t)(*loadPtr.getUnitAtIndex(index).getDataPtr());
Wolfgang Betz 135:f0b6cf8ac4fc 255 PRINTF("advtInterval=%d\n\r", (int)advtInterval);
Wolfgang Betz 130:770ce14d3d15 256 break;
Wolfgang Betz 130:770ce14d3d15 257 }
Andrea Palmieri 182:e7cff2f17ef9 258 case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */
Wolfgang Betz 130:770ce14d3d15 259 {
Andrea Palmieri 182:e7cff2f17ef9 260 PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA\n\r");
Andrea Palmieri 182:e7cff2f17ef9 261 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Andrea Palmieri 182:e7cff2f17ef9 262 PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA (buffSize=%d)\n\r", buffSize);
Andrea Palmieri 182:e7cff2f17ef9 263 // the total ADV DATA LEN should include two more bytes:
Andrea Palmieri 182:e7cff2f17ef9 264 // the buffer size byte;
Andrea Palmieri 182:e7cff2f17ef9 265 // and the Manufacturer Specific Data Type Value byte
Andrea Palmieri 182:e7cff2f17ef9 266 if(buffSize>ADV_DATA_MAX_SIZE-2) {
Andrea Palmieri 182:e7cff2f17ef9 267 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 182:e7cff2f17ef9 268 }
Andrea Palmieri 182:e7cff2f17ef9 269 for(int i=0; i<buffSize+1; i++) {
Andrea Palmieri 182:e7cff2f17ef9 270 PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r",
Andrea Palmieri 182:e7cff2f17ef9 271 i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
Andrea Palmieri 182:e7cff2f17ef9 272 }
Andrea Palmieri 182:e7cff2f17ef9 273 AdvLen = buffSize+2; // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Manufacturer Specific Data Type Value byte
Andrea Palmieri 182:e7cff2f17ef9 274 AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data)
Andrea Palmieri 182:e7cff2f17ef9 275 AdvData[1] = AD_TYPE_MANUFACTURER_SPECIFIC_DATA;
Andrea Palmieri 182:e7cff2f17ef9 276 memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
Wolfgang Betz 130:770ce14d3d15 277 break;
Wolfgang Betz 130:770ce14d3d15 278 }
Wolfgang Betz 130:770ce14d3d15 279
Wolfgang Betz 130:770ce14d3d15 280 }
Wolfgang Betz 130:770ce14d3d15 281 }
Wolfgang Betz 130:770ce14d3d15 282 //Set the SCAN_RSP Payload
Wolfgang Betz 130:770ce14d3d15 283 scan_response_payload = scanResponse.getPayload();
Wolfgang Betz 130:770ce14d3d15 284 scan_rsp_length = scanResponse.getPayloadLen();
Andrea Palmieri 213:781abfbf2d1c 285
Andrea Palmieri 213:781abfbf2d1c 286 // Update the ADV data if we are already in ADV mode
Andrea Palmieri 213:781abfbf2d1c 287 if(AdvLen > 0 && state.advertising == 1) {
Andrea Palmieri 213:781abfbf2d1c 288
Andrea Palmieri 213:781abfbf2d1c 289 tBleStatus ret = aci_gap_update_adv_data(AdvLen, AdvData);
Andrea Palmieri 213:781abfbf2d1c 290 if(BLE_STATUS_SUCCESS!=ret) {
Andrea Palmieri 213:781abfbf2d1c 291 PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret);
Andrea Palmieri 213:781abfbf2d1c 292 switch (ret) {
Andrea Palmieri 213:781abfbf2d1c 293 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 213:781abfbf2d1c 294 return BLE_STACK_BUSY;
Andrea Palmieri 213:781abfbf2d1c 295 default:
Andrea Palmieri 213:781abfbf2d1c 296 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 213:781abfbf2d1c 297 }
Andrea Palmieri 213:781abfbf2d1c 298 }
Andrea Palmieri 213:781abfbf2d1c 299 }
Wolfgang Betz 130:770ce14d3d15 300 }
Wolfgang Betz 130:770ce14d3d15 301 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 302 }
Wolfgang Betz 130:770ce14d3d15 303
Wolfgang Betz 130:770ce14d3d15 304 /*
Wolfgang Betz 130:770ce14d3d15 305 * Utility to set ADV timeout flag
Wolfgang Betz 130:770ce14d3d15 306 */
Wolfgang Betz 130:770ce14d3d15 307 void BlueNRGGap::setAdvToFlag(void) {
Wolfgang Betz 130:770ce14d3d15 308 AdvToFlag = true;
Wolfgang Betz 130:770ce14d3d15 309 }
Wolfgang Betz 130:770ce14d3d15 310
Wolfgang Betz 130:770ce14d3d15 311 /*
Wolfgang Betz 130:770ce14d3d15 312 * ADV timeout callback
Wolfgang Betz 130:770ce14d3d15 313 */
Wolfgang Betz 132:51056160fa4a 314 // ANDREA: mbedOS
Wolfgang Betz 138:32e3c4ca7a45 315 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 132:51056160fa4a 316 static void advTimeoutCB(void)
Wolfgang Betz 132:51056160fa4a 317 {
Wolfgang Betz 132:51056160fa4a 318 Gap::GapState_t state;
Wolfgang Betz 132:51056160fa4a 319
Wolfgang Betz 132:51056160fa4a 320 state = BlueNRGGap::getInstance().getState();
Wolfgang Betz 132:51056160fa4a 321 if (state.advertising == 1) {
Wolfgang Betz 132:51056160fa4a 322
Wolfgang Betz 132:51056160fa4a 323 BlueNRGGap::getInstance().stopAdvertising();
Wolfgang Betz 132:51056160fa4a 324
Wolfgang Betz 132:51056160fa4a 325 }
Wolfgang Betz 132:51056160fa4a 326 }
Wolfgang Betz 132:51056160fa4a 327 #else
Wolfgang Betz 130:770ce14d3d15 328 static void advTimeoutCB(void)
Wolfgang Betz 130:770ce14d3d15 329 {
Wolfgang Betz 130:770ce14d3d15 330 Gap::GapState_t state;
Wolfgang Betz 130:770ce14d3d15 331
Wolfgang Betz 130:770ce14d3d15 332 state = BlueNRGGap::getInstance().getState();
Wolfgang Betz 130:770ce14d3d15 333 if (state.advertising == 1) {
Wolfgang Betz 130:770ce14d3d15 334
Wolfgang Betz 130:770ce14d3d15 335 BlueNRGGap::getInstance().setAdvToFlag();
Wolfgang Betz 130:770ce14d3d15 336
Wolfgang Betz 130:770ce14d3d15 337 Timeout t = BlueNRGGap::getInstance().getAdvTimeout();
Wolfgang Betz 130:770ce14d3d15 338 t.detach(); /* disable the callback from the timeout */
Wolfgang Betz 130:770ce14d3d15 339
Wolfgang Betz 130:770ce14d3d15 340 }
Wolfgang Betz 130:770ce14d3d15 341 }
Wolfgang Betz 138:32e3c4ca7a45 342 #endif /* AST_FOR_MBED_OS */
Wolfgang Betz 130:770ce14d3d15 343
Wolfgang Betz 130:770ce14d3d15 344 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 345 /*!
Wolfgang Betz 130:770ce14d3d15 346 @brief Starts the BLE HW, initialising any services that were
Wolfgang Betz 130:770ce14d3d15 347 added before this function was called.
Wolfgang Betz 130:770ce14d3d15 348
Wolfgang Betz 130:770ce14d3d15 349 @param[in] params
Wolfgang Betz 130:770ce14d3d15 350 Basic advertising details, including the advertising
Wolfgang Betz 130:770ce14d3d15 351 delay, timeout and how the device should be advertised
Wolfgang Betz 130:770ce14d3d15 352
Wolfgang Betz 130:770ce14d3d15 353 @note All services must be added before calling this function!
Wolfgang Betz 130:770ce14d3d15 354
Wolfgang Betz 130:770ce14d3d15 355 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 356
Wolfgang Betz 130:770ce14d3d15 357 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 358 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 359
Wolfgang Betz 130:770ce14d3d15 360 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 361
Wolfgang Betz 130:770ce14d3d15 362 @code
Wolfgang Betz 130:770ce14d3d15 363
Wolfgang Betz 130:770ce14d3d15 364 @endcode
Wolfgang Betz 130:770ce14d3d15 365 */
Wolfgang Betz 130:770ce14d3d15 366 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 367
Wolfgang Betz 130:770ce14d3d15 368 ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams &params)
Andrea Palmieri 187:2e517d3ddd71 369 {
Andrea Palmieri 187:2e517d3ddd71 370 tBleStatus ret;
Andrea Palmieri 187:2e517d3ddd71 371
Wolfgang Betz 130:770ce14d3d15 372 /* Make sure we support the advertising type */
Wolfgang Betz 130:770ce14d3d15 373 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
Andrea Palmieri 220:e02936f0d4c7 374 /* ToDo: This requires a proper security implementation, etc. */
Wolfgang Betz 130:770ce14d3d15 375 return BLE_ERROR_NOT_IMPLEMENTED;
Wolfgang Betz 130:770ce14d3d15 376 }
Wolfgang Betz 130:770ce14d3d15 377
Wolfgang Betz 130:770ce14d3d15 378 /* Check interval range */
Wolfgang Betz 130:770ce14d3d15 379 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) {
Wolfgang Betz 130:770ce14d3d15 380 /* Min delay is slightly longer for unconnectable devices */
Wolfgang Betz 130:770ce14d3d15 381 if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
Wolfgang Betz 130:770ce14d3d15 382 (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Wolfgang Betz 130:770ce14d3d15 383 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 384 }
Wolfgang Betz 130:770ce14d3d15 385 } else {
Wolfgang Betz 130:770ce14d3d15 386 if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN) ||
Wolfgang Betz 130:770ce14d3d15 387 (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Wolfgang Betz 130:770ce14d3d15 388 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 389 }
Wolfgang Betz 130:770ce14d3d15 390 }
Wolfgang Betz 130:770ce14d3d15 391
Wolfgang Betz 130:770ce14d3d15 392 /* Check timeout is zero for Connectable Directed */
Wolfgang Betz 130:770ce14d3d15 393 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) {
Wolfgang Betz 130:770ce14d3d15 394 /* Timeout must be 0 with this type, although we'll never get here */
Wolfgang Betz 130:770ce14d3d15 395 /* since this isn't implemented yet anyway */
Wolfgang Betz 130:770ce14d3d15 396 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 397 }
Wolfgang Betz 130:770ce14d3d15 398
Wolfgang Betz 130:770ce14d3d15 399 /* Check timeout for other advertising types */
Wolfgang Betz 130:770ce14d3d15 400 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
Wolfgang Betz 130:770ce14d3d15 401 (params.getTimeout() > GapAdvertisingParams::GAP_ADV_PARAMS_TIMEOUT_MAX)) {
Wolfgang Betz 130:770ce14d3d15 402 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 403 }
Wolfgang Betz 130:770ce14d3d15 404
Andrea Palmieri 228:25368f053411 405 /* Check the ADV type before setting scan response data */
Andrea Palmieri 228:25368f053411 406 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ||
Andrea Palmieri 228:25368f053411 407 params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED) {
Andrea Palmieri 228:25368f053411 408
Andrea Palmieri 228:25368f053411 409 /* set scan response data */
Andrea Palmieri 228:25368f053411 410 PRINTF(" setting scan response data (scan_rsp_length=%u)\n", scan_rsp_length);
Andrea Palmieri 228:25368f053411 411 ret = hci_le_set_scan_resp_data(scan_rsp_length, scan_response_payload);
Andrea Palmieri 228:25368f053411 412
Andrea Palmieri 228:25368f053411 413 if(BLE_STATUS_SUCCESS!=ret) {
Andrea Palmieri 228:25368f053411 414 PRINTF(" error while setting scan response data (ret=0x%x)\n", ret);
Andrea Palmieri 228:25368f053411 415 switch (ret) {
Andrea Palmieri 228:25368f053411 416 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 228:25368f053411 417 return BLE_STACK_BUSY;
Andrea Palmieri 228:25368f053411 418 default:
Andrea Palmieri 228:25368f053411 419 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 228:25368f053411 420 }
Andrea Palmieri 187:2e517d3ddd71 421 }
Andrea Palmieri 228:25368f053411 422 } else {
Andrea Palmieri 228:25368f053411 423 hci_le_set_scan_resp_data(0, NULL);
Andrea Palmieri 187:2e517d3ddd71 424 }
Wolfgang Betz 130:770ce14d3d15 425
Andrea Palmieri 220:e02936f0d4c7 426 advtInterval = params.getIntervalInADVUnits();
Andrea Palmieri 223:36df860f7ffc 427 printf("advtInterval=%ld advType=%d\n\r", advtInterval, params.getAdvertisingType());
Wolfgang Betz 130:770ce14d3d15 428
Andrea Palmieri 220:e02936f0d4c7 429 ret = aci_gap_set_discoverable(params.getAdvertisingType(), // AdvType
Andrea Palmieri 220:e02936f0d4c7 430 advtInterval, // AdvIntervMin
Andrea Palmieri 220:e02936f0d4c7 431 advtInterval, // AdvIntervMax
Andrea Palmieri 228:25368f053411 432 addr_type, // OwnAddrType
Andrea Palmieri 220:e02936f0d4c7 433 NO_WHITE_LIST_USE, // AdvFilterPolicy
Andrea Palmieri 220:e02936f0d4c7 434 local_name_length, // LocalNameLen
Andrea Palmieri 220:e02936f0d4c7 435 (const char*)local_name, // LocalName
Andrea Palmieri 220:e02936f0d4c7 436 servUuidlength, // ServiceUUIDLen
Andrea Palmieri 220:e02936f0d4c7 437 servUuidData, // ServiceUUIDList
Andrea Palmieri 220:e02936f0d4c7 438 0, // SlaveConnIntervMin
Andrea Palmieri 220:e02936f0d4c7 439 0); // SlaveConnIntervMax
Wolfgang Betz 130:770ce14d3d15 440
Wolfgang Betz 130:770ce14d3d15 441
Andrea Palmieri 223:36df860f7ffc 442 printf("!!!setting discoverable (servUuidlength=0x%x)\n\r", servUuidlength);
Wolfgang Betz 130:770ce14d3d15 443 if(BLE_STATUS_SUCCESS!=ret) {
Andrea Palmieri 223:36df860f7ffc 444 printf("error occurred while setting discoverable (ret=0x%x)\n\r", ret);
Andrea Palmieri 187:2e517d3ddd71 445 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 446 case BLE_STATUS_INVALID_PARAMS:
Andrea Palmieri 187:2e517d3ddd71 447 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 448 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 449 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 450 case ERR_UNSUPPORTED_FEATURE:
Andrea Palmieri 187:2e517d3ddd71 451 return BLE_ERROR_NOT_IMPLEMENTED;
Andrea Palmieri 187:2e517d3ddd71 452 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 453 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 454 default:
Andrea Palmieri 187:2e517d3ddd71 455 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 456 }
Wolfgang Betz 130:770ce14d3d15 457 }
Wolfgang Betz 130:770ce14d3d15 458
Wolfgang Betz 130:770ce14d3d15 459 // Before updating the ADV data, delete COMPLETE_LOCAL_NAME and TX_POWER_LEVEL fields (if present)
Andrea Palmieri 228:25368f053411 460 if(AdvLen > 0) {
Andrea Palmieri 228:25368f053411 461 if(local_name_length > 0) {
Wolfgang Betz 132:51056160fa4a 462 PRINTF("!!!calling aci_gap_delete_ad_type AD_TYPE_COMPLETE_LOCAL_NAME!!!\n");
Wolfgang Betz 130:770ce14d3d15 463 ret = aci_gap_delete_ad_type(AD_TYPE_COMPLETE_LOCAL_NAME);
Andrea Palmieri 187:2e517d3ddd71 464 if (BLE_STATUS_SUCCESS!=ret){
Wolfgang Betz 132:51056160fa4a 465 PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);
Andrea Palmieri 187:2e517d3ddd71 466 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 467 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 468 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 469 default:
Andrea Palmieri 187:2e517d3ddd71 470 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 471 }
Wolfgang Betz 130:770ce14d3d15 472 }
Wolfgang Betz 130:770ce14d3d15 473 }
Wolfgang Betz 130:770ce14d3d15 474
Andrea Palmieri 201:a9bc2e8b01d7 475 // If ADV Data Type is SERVICE DATA or MANUFACTURER SPECIFIC DATA,
Andrea Palmieri 201:a9bc2e8b01d7 476 // we need to delete it to make the needed room in ADV payload
Andrea Palmieri 201:a9bc2e8b01d7 477 if(AdvData[1]==AD_TYPE_SERVICE_DATA || AdvData[1]==AD_TYPE_MANUFACTURER_SPECIFIC_DATA) {
Wolfgang Betz 132:51056160fa4a 478 PRINTF("!!!calling aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL)!!!\n");
Wolfgang Betz 130:770ce14d3d15 479 ret = aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL);
Andrea Palmieri 187:2e517d3ddd71 480 if (BLE_STATUS_SUCCESS!=ret){
Wolfgang Betz 132:51056160fa4a 481 PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);
Andrea Palmieri 187:2e517d3ddd71 482 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 483 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 484 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 485 default:
Andrea Palmieri 187:2e517d3ddd71 486 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 487 }
Wolfgang Betz 130:770ce14d3d15 488 }
Wolfgang Betz 130:770ce14d3d15 489 }
Wolfgang Betz 130:770ce14d3d15 490
Wolfgang Betz 130:770ce14d3d15 491 ret = aci_gap_update_adv_data(AdvLen, AdvData);
Wolfgang Betz 130:770ce14d3d15 492 if(BLE_STATUS_SUCCESS!=ret) {
Wolfgang Betz 132:51056160fa4a 493 PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret);
Andrea Palmieri 187:2e517d3ddd71 494 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 495 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 496 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 497 default:
Andrea Palmieri 187:2e517d3ddd71 498 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 499 }
Wolfgang Betz 130:770ce14d3d15 500 }
Andrea Palmieri 228:25368f053411 501
Andrea Palmieri 187:2e517d3ddd71 502 } // AdvLen>0
Wolfgang Betz 130:770ce14d3d15 503
Andrea Palmieri 228:25368f053411 504 if(deviceAppearance != 0) {
Andrea Palmieri 228:25368f053411 505 PRINTF("deviceAppearance != 0\n\r");
Andrea Palmieri 228:25368f053411 506 uint8_t appearance[] = {3, AD_TYPE_APPEARANCE, deviceAppearance[0], deviceAppearance[1]};
Andrea Palmieri 228:25368f053411 507 aci_gap_update_adv_data(4, appearance);
Andrea Palmieri 228:25368f053411 508 }
Andrea Palmieri 228:25368f053411 509
Wolfgang Betz 130:770ce14d3d15 510 state.advertising = 1;
Wolfgang Betz 130:770ce14d3d15 511
Wolfgang Betz 130:770ce14d3d15 512 AdvToFlag = false;
Wolfgang Betz 130:770ce14d3d15 513 if(params.getTimeout() != 0) {
Wolfgang Betz 132:51056160fa4a 514 PRINTF("!!! attaching to!!!\n");
Wolfgang Betz 132:51056160fa4a 515 // ANDREA: mbedOS
Wolfgang Betz 138:32e3c4ca7a45 516 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 132:51056160fa4a 517 minar::Scheduler::postCallback(advTimeoutCB).delay(minar::milliseconds(params.getTimeout()));
Wolfgang Betz 132:51056160fa4a 518 #else
Wolfgang Betz 130:770ce14d3d15 519 advTimeout.attach(advTimeoutCB, params.getTimeout());
Wolfgang Betz 132:51056160fa4a 520 #endif
Wolfgang Betz 130:770ce14d3d15 521 }
Wolfgang Betz 130:770ce14d3d15 522
Wolfgang Betz 130:770ce14d3d15 523 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 524 }
Wolfgang Betz 130:770ce14d3d15 525
Wolfgang Betz 130:770ce14d3d15 526 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 527 /*!
Wolfgang Betz 130:770ce14d3d15 528 @brief Stops the BLE HW and disconnects from any devices
Wolfgang Betz 130:770ce14d3d15 529
Wolfgang Betz 130:770ce14d3d15 530 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 531
Wolfgang Betz 130:770ce14d3d15 532 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 533 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 534
Wolfgang Betz 130:770ce14d3d15 535 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 536
Wolfgang Betz 130:770ce14d3d15 537 @code
Wolfgang Betz 130:770ce14d3d15 538
Wolfgang Betz 130:770ce14d3d15 539 @endcode
Wolfgang Betz 130:770ce14d3d15 540 */
Wolfgang Betz 130:770ce14d3d15 541 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 542 ble_error_t BlueNRGGap::stopAdvertising(void)
Wolfgang Betz 130:770ce14d3d15 543 {
Wolfgang Betz 130:770ce14d3d15 544 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 545
Wolfgang Betz 130:770ce14d3d15 546 if(state.advertising == 1) {
Wolfgang Betz 130:770ce14d3d15 547 //Set non-discoverable to stop advertising
Wolfgang Betz 130:770ce14d3d15 548 ret = aci_gap_set_non_discoverable();
Wolfgang Betz 130:770ce14d3d15 549
Andrea Palmieri 187:2e517d3ddd71 550 if (BLE_STATUS_SUCCESS!=ret){
Wolfgang Betz 132:51056160fa4a 551 PRINTF("Error in stopping advertisement (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 552 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 553 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 554 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 555 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 556 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 557 default:
Andrea Palmieri 187:2e517d3ddd71 558 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 559 }
Wolfgang Betz 130:770ce14d3d15 560 }
Wolfgang Betz 132:51056160fa4a 561 PRINTF("Advertisement stopped!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 562 //Set GapState_t::advertising state
Wolfgang Betz 130:770ce14d3d15 563 state.advertising = 0;
Wolfgang Betz 130:770ce14d3d15 564 }
Wolfgang Betz 130:770ce14d3d15 565
Wolfgang Betz 130:770ce14d3d15 566 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 567 }
Wolfgang Betz 130:770ce14d3d15 568
Wolfgang Betz 130:770ce14d3d15 569 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 570 /*!
Wolfgang Betz 130:770ce14d3d15 571 @brief Disconnects if we are connected to a central device
Wolfgang Betz 130:770ce14d3d15 572
Wolfgang Betz 130:770ce14d3d15 573 @param[in] reason
Wolfgang Betz 130:770ce14d3d15 574 Disconnection Reason
Wolfgang Betz 130:770ce14d3d15 575
Wolfgang Betz 130:770ce14d3d15 576 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 577
Wolfgang Betz 130:770ce14d3d15 578 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 579 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 580
Wolfgang Betz 130:770ce14d3d15 581 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 582
Wolfgang Betz 130:770ce14d3d15 583 @code
Wolfgang Betz 130:770ce14d3d15 584
Wolfgang Betz 130:770ce14d3d15 585 @endcode
Wolfgang Betz 130:770ce14d3d15 586 */
Wolfgang Betz 130:770ce14d3d15 587 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 588 ble_error_t BlueNRGGap::disconnect(Gap::DisconnectionReason_t reason)
Wolfgang Betz 130:770ce14d3d15 589 {
Andrea Palmieri 142:adf1567d3900 590 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 591 (void)reason;
Andrea Palmieri 142:adf1567d3900 592
Wolfgang Betz 130:770ce14d3d15 593 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 594 //For Reason codes check BlueTooth HCI Spec
Wolfgang Betz 130:770ce14d3d15 595
Wolfgang Betz 130:770ce14d3d15 596 if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) {
Wolfgang Betz 130:770ce14d3d15 597 ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host.
Wolfgang Betz 130:770ce14d3d15 598
Andrea Palmieri 187:2e517d3ddd71 599 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 600 PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 601 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 602 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 603 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 604 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 605 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 606 default:
Andrea Palmieri 187:2e517d3ddd71 607 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 608 }
Wolfgang Betz 130:770ce14d3d15 609 }
Wolfgang Betz 130:770ce14d3d15 610
Wolfgang Betz 132:51056160fa4a 611 //PRINTF("Disconnected from localhost!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 612 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
Wolfgang Betz 130:770ce14d3d15 613 }
Wolfgang Betz 130:770ce14d3d15 614
Wolfgang Betz 130:770ce14d3d15 615 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 616 }
Wolfgang Betz 130:770ce14d3d15 617
Wolfgang Betz 130:770ce14d3d15 618 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 619 /*!
Wolfgang Betz 130:770ce14d3d15 620 @brief Disconnects if we are connected to a central device
Wolfgang Betz 130:770ce14d3d15 621
Wolfgang Betz 130:770ce14d3d15 622 @param[in] reason
Wolfgang Betz 130:770ce14d3d15 623 Disconnection Reason
Wolfgang Betz 130:770ce14d3d15 624
Wolfgang Betz 130:770ce14d3d15 625 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 626
Wolfgang Betz 130:770ce14d3d15 627 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 628 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 629
Wolfgang Betz 130:770ce14d3d15 630 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 631
Wolfgang Betz 130:770ce14d3d15 632 @code
Wolfgang Betz 130:770ce14d3d15 633
Wolfgang Betz 130:770ce14d3d15 634 @endcode
Wolfgang Betz 130:770ce14d3d15 635 */
Wolfgang Betz 130:770ce14d3d15 636 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 637 ble_error_t BlueNRGGap::disconnect(Handle_t connectionHandle, Gap::DisconnectionReason_t reason)
Wolfgang Betz 130:770ce14d3d15 638 {
Andrea Palmieri 142:adf1567d3900 639 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 640 (void)reason;
Andrea Palmieri 142:adf1567d3900 641
Wolfgang Betz 130:770ce14d3d15 642 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 643 //For Reason codes check BlueTooth HCI Spec
Wolfgang Betz 130:770ce14d3d15 644
Wolfgang Betz 130:770ce14d3d15 645 if(connectionHandle != BLE_CONN_HANDLE_INVALID) {
Wolfgang Betz 130:770ce14d3d15 646 ret = aci_gap_terminate(connectionHandle, 0x16);//0x16 Connection Terminated by Local Host.
Wolfgang Betz 130:770ce14d3d15 647
Andrea Palmieri 187:2e517d3ddd71 648 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 649 PRINTF("Error in GAP termination (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 130:770ce14d3d15 659
Wolfgang Betz 132:51056160fa4a 660 //PRINTF("Disconnected from localhost!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 661 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
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 Sets the 16-bit connection handle
Wolfgang Betz 130:770ce14d3d15 670
Wolfgang Betz 130:770ce14d3d15 671 @param[in] con_handle
Wolfgang Betz 130:770ce14d3d15 672 Connection Handle which is set in the Gap Instance
Wolfgang Betz 130:770ce14d3d15 673
Wolfgang Betz 130:770ce14d3d15 674 @returns void
Wolfgang Betz 130:770ce14d3d15 675 */
Wolfgang Betz 130:770ce14d3d15 676 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 677 void BlueNRGGap::setConnectionHandle(uint16_t con_handle)
Wolfgang Betz 130:770ce14d3d15 678 {
Wolfgang Betz 130:770ce14d3d15 679 m_connectionHandle = con_handle;
Wolfgang Betz 130:770ce14d3d15 680 }
Wolfgang Betz 130:770ce14d3d15 681
Wolfgang Betz 130:770ce14d3d15 682 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 683 /*!
Wolfgang Betz 130:770ce14d3d15 684 @brief Gets the 16-bit connection handle
Wolfgang Betz 130:770ce14d3d15 685
Wolfgang Betz 130:770ce14d3d15 686 @param[in] void
Wolfgang Betz 130:770ce14d3d15 687
Wolfgang Betz 130:770ce14d3d15 688 @returns uint16_t
Wolfgang Betz 130:770ce14d3d15 689 Connection Handle of the Gap Instance
Wolfgang Betz 130:770ce14d3d15 690 */
Wolfgang Betz 130:770ce14d3d15 691 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 692 uint16_t BlueNRGGap::getConnectionHandle(void)
Wolfgang Betz 130:770ce14d3d15 693 {
Wolfgang Betz 130:770ce14d3d15 694 return m_connectionHandle;
Wolfgang Betz 130:770ce14d3d15 695 }
Wolfgang Betz 130:770ce14d3d15 696
Wolfgang Betz 130:770ce14d3d15 697 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 698 /*!
Wolfgang Betz 130:770ce14d3d15 699 @brief Sets the BLE device address. SetAddress will reset the BLE
Wolfgang Betz 130:770ce14d3d15 700 device and re-initialize BTLE. Will not start advertising.
Wolfgang Betz 130:770ce14d3d15 701
Wolfgang Betz 130:770ce14d3d15 702 @param[in] type
Wolfgang Betz 130:770ce14d3d15 703 Type of Address
Wolfgang Betz 130:770ce14d3d15 704
Wolfgang Betz 130:770ce14d3d15 705 @param[in] address[6]
Wolfgang Betz 130:770ce14d3d15 706 Value of the Address to be set
Wolfgang Betz 130:770ce14d3d15 707
Wolfgang Betz 130:770ce14d3d15 708 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 709
Wolfgang Betz 130:770ce14d3d15 710 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 711
Wolfgang Betz 130:770ce14d3d15 712 @code
Wolfgang Betz 130:770ce14d3d15 713
Wolfgang Betz 130:770ce14d3d15 714 @endcode
Wolfgang Betz 130:770ce14d3d15 715 */
Wolfgang Betz 130:770ce14d3d15 716 /**************************************************************************/
Andrea Palmieri 228:25368f053411 717 /*
Wolfgang Betz 132:51056160fa4a 718 ble_error_t BlueNRGGap::setAddress(AddressType_t type, const Address_t address)
Wolfgang Betz 130:770ce14d3d15 719 {
Andrea Palmieri 228:25368f053411 720 tBleStatus ret;
Andrea Palmieri 228:25368f053411 721
Andrea Palmieri 210:08c4c85ca679 722 if (type > BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE) {
Wolfgang Betz 130:770ce14d3d15 723 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 724 }
Wolfgang Betz 130:770ce14d3d15 725
Wolfgang Betz 132:51056160fa4a 726 addr_type = type;
Andrea Palmieri 228:25368f053411 727
Andrea Palmieri 228:25368f053411 728 // If Address Type is other than PUBLIC, the given Address is ignored
Andrea Palmieri 228:25368f053411 729 if(addr_type == BLEProtocol::AddressType::PUBLIC){
Andrea Palmieri 228:25368f053411 730 ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
Andrea Palmieri 228:25368f053411 731 CONFIG_DATA_PUBADDR_LEN,
Andrea Palmieri 228:25368f053411 732 address);
Andrea Palmieri 228:25368f053411 733 printf("setAddress (ret=0x%02X)\n\r", ret);
Wolfgang Betz 130:770ce14d3d15 734 }
Wolfgang Betz 130:770ce14d3d15 735
Wolfgang Betz 130:770ce14d3d15 736 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 737 }
Andrea Palmieri 228:25368f053411 738 */
Wolfgang Betz 130:770ce14d3d15 739 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 740 /*!
Wolfgang Betz 130:770ce14d3d15 741 @brief Returns boolean if the address of the device has been set
Wolfgang Betz 130:770ce14d3d15 742 or not
Wolfgang Betz 130:770ce14d3d15 743
Wolfgang Betz 130:770ce14d3d15 744 @returns bool
Wolfgang Betz 130:770ce14d3d15 745
Wolfgang Betz 130:770ce14d3d15 746 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 747
Wolfgang Betz 130:770ce14d3d15 748 @code
Wolfgang Betz 130:770ce14d3d15 749
Wolfgang Betz 130:770ce14d3d15 750 @endcode
Wolfgang Betz 130:770ce14d3d15 751 */
Wolfgang Betz 130:770ce14d3d15 752 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 753 bool BlueNRGGap::getIsSetAddress()
Wolfgang Betz 130:770ce14d3d15 754 {
Wolfgang Betz 130:770ce14d3d15 755 return isSetAddress;
Wolfgang Betz 130:770ce14d3d15 756 }
Wolfgang Betz 130:770ce14d3d15 757
Wolfgang Betz 130:770ce14d3d15 758 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 759 /*!
Wolfgang Betz 130:770ce14d3d15 760 @brief Returns the address of the device if set
Wolfgang Betz 130:770ce14d3d15 761
Wolfgang Betz 130:770ce14d3d15 762 @returns Pointer to the address if Address is set else NULL
Wolfgang Betz 130:770ce14d3d15 763
Wolfgang Betz 130:770ce14d3d15 764 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 765
Wolfgang Betz 130:770ce14d3d15 766 @code
Wolfgang Betz 130:770ce14d3d15 767
Wolfgang Betz 130:770ce14d3d15 768 @endcode
Wolfgang Betz 130:770ce14d3d15 769 */
Wolfgang Betz 130:770ce14d3d15 770 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 771 ble_error_t BlueNRGGap::getAddress(AddressType_t *typeP, Address_t address)
Wolfgang Betz 130:770ce14d3d15 772 {
Andrea Palmieri 228:25368f053411 773 if(typeP != NULL) {
Andrea Palmieri 228:25368f053411 774 *typeP = addr_type;
Andrea Palmieri 228:25368f053411 775 }
Andrea Palmieri 228:25368f053411 776
Andrea Palmieri 228:25368f053411 777 hci_read_bd_addr(bdaddr);
Andrea Palmieri 228:25368f053411 778 if(address != NULL) {
Andrea Palmieri 228:25368f053411 779 memcpy(address, bdaddr, BDADDR_SIZE);
Wolfgang Betz 130:770ce14d3d15 780 }
Wolfgang Betz 130:770ce14d3d15 781
Wolfgang Betz 130:770ce14d3d15 782 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 783 }
Wolfgang Betz 130:770ce14d3d15 784
Wolfgang Betz 130:770ce14d3d15 785 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 786 /*!
Wolfgang Betz 130:770ce14d3d15 787 @brief obtains preferred connection params
Wolfgang Betz 130:770ce14d3d15 788
Wolfgang Betz 130:770ce14d3d15 789 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 790
Wolfgang Betz 130:770ce14d3d15 791 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 792
Wolfgang Betz 130:770ce14d3d15 793 @code
Wolfgang Betz 130:770ce14d3d15 794
Wolfgang Betz 130:770ce14d3d15 795 @endcode
Wolfgang Betz 130:770ce14d3d15 796 */
Wolfgang Betz 130:770ce14d3d15 797 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 798 ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 799 {
Andrea Palmieri 142:adf1567d3900 800 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 801 (void)params;
Andrea Palmieri 142:adf1567d3900 802
Wolfgang Betz 130:770ce14d3d15 803 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 804 }
Wolfgang Betz 130:770ce14d3d15 805
Wolfgang Betz 130:770ce14d3d15 806
Wolfgang Betz 130:770ce14d3d15 807 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 808 /*!
Wolfgang Betz 130:770ce14d3d15 809 @brief sets preferred connection params
Wolfgang Betz 130:770ce14d3d15 810
Wolfgang Betz 130:770ce14d3d15 811 @returns ble_error_t
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 ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 821 {
Andrea Palmieri 142:adf1567d3900 822 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 823 (void)params;
Andrea Palmieri 142:adf1567d3900 824
Wolfgang Betz 130:770ce14d3d15 825 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 826 }
Wolfgang Betz 130:770ce14d3d15 827
Wolfgang Betz 130:770ce14d3d15 828 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 829 /*!
Wolfgang Betz 130:770ce14d3d15 830 @brief updates preferred connection params
Wolfgang Betz 130:770ce14d3d15 831
Wolfgang Betz 130:770ce14d3d15 832 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 833
Wolfgang Betz 130:770ce14d3d15 834 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 835
Wolfgang Betz 130:770ce14d3d15 836 @code
Wolfgang Betz 130:770ce14d3d15 837
Wolfgang Betz 130:770ce14d3d15 838 @endcode
Wolfgang Betz 130:770ce14d3d15 839 */
Wolfgang Betz 130:770ce14d3d15 840 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 841 ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 842 {
Andrea Palmieri 142:adf1567d3900 843 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 844 (void) handle;
Andrea Palmieri 142:adf1567d3900 845 (void)params;
Andrea Palmieri 142:adf1567d3900 846
Wolfgang Betz 130:770ce14d3d15 847 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 848 }
Wolfgang Betz 130:770ce14d3d15 849
Wolfgang Betz 130:770ce14d3d15 850 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 851 /*!
Wolfgang Betz 130:770ce14d3d15 852 @brief Sets the Device Name Characteristic
Wolfgang Betz 130:770ce14d3d15 853
Wolfgang Betz 130:770ce14d3d15 854 @param[in] deviceName
Wolfgang Betz 130:770ce14d3d15 855 pointer to device name to be set
Wolfgang Betz 130:770ce14d3d15 856
Wolfgang Betz 130:770ce14d3d15 857 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 858
Wolfgang Betz 130:770ce14d3d15 859 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 860 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 861
Wolfgang Betz 130:770ce14d3d15 862 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 863
Wolfgang Betz 130:770ce14d3d15 864 @code
Wolfgang Betz 130:770ce14d3d15 865
Wolfgang Betz 130:770ce14d3d15 866 @endcode
Wolfgang Betz 130:770ce14d3d15 867 */
Wolfgang Betz 130:770ce14d3d15 868 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 869 ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName)
Wolfgang Betz 130:770ce14d3d15 870 {
Andrea Palmieri 187:2e517d3ddd71 871 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 872 uint8_t nameLen = 0;
Wolfgang Betz 130:770ce14d3d15 873
Andrea Palmieri 228:25368f053411 874 nameLen = strlen((const char*)deviceName);
Andrea Palmieri 228:25368f053411 875 PRINTF("DeviceName Size=%d\n\r", nameLen);
Andrea Palmieri 228:25368f053411 876
Andrea Palmieri 222:37a7e289ee3d 877 ret = aci_gatt_update_char_value(g_gap_service_handle,
Andrea Palmieri 222:37a7e289ee3d 878 g_device_name_char_handle,
Andrea Palmieri 222:37a7e289ee3d 879 0,
Andrea Palmieri 222:37a7e289ee3d 880 nameLen,
Andrea Palmieri 228:25368f053411 881 deviceName);
Andrea Palmieri 187:2e517d3ddd71 882
Andrea Palmieri 187:2e517d3ddd71 883 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 884 PRINTF("device set name failed (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 885 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 886 case BLE_STATUS_INVALID_HANDLE:
Andrea Palmieri 187:2e517d3ddd71 887 case BLE_STATUS_INVALID_PARAMETER:
Andrea Palmieri 187:2e517d3ddd71 888 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 889 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Andrea Palmieri 187:2e517d3ddd71 890 return BLE_ERROR_NO_MEM;
Andrea Palmieri 187:2e517d3ddd71 891 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 892 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 893 default:
Andrea Palmieri 187:2e517d3ddd71 894 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 895 }
Wolfgang Betz 130:770ce14d3d15 896 }
Wolfgang Betz 130:770ce14d3d15 897
Wolfgang Betz 130:770ce14d3d15 898 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 899 }
Wolfgang Betz 130:770ce14d3d15 900
Wolfgang Betz 130:770ce14d3d15 901 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 902 /*!
Wolfgang Betz 130:770ce14d3d15 903 @brief Gets the Device Name Characteristic
Wolfgang Betz 130:770ce14d3d15 904
Wolfgang Betz 130:770ce14d3d15 905 @param[in] deviceName
Wolfgang Betz 130:770ce14d3d15 906 pointer to device name
Wolfgang Betz 130:770ce14d3d15 907
Wolfgang Betz 130:770ce14d3d15 908 @param[in] lengthP
Wolfgang Betz 130:770ce14d3d15 909 pointer to device name length
Wolfgang Betz 130:770ce14d3d15 910
Wolfgang Betz 130:770ce14d3d15 911 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 912
Wolfgang Betz 130:770ce14d3d15 913 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 914 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 915
Wolfgang Betz 130:770ce14d3d15 916 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 917
Wolfgang Betz 130:770ce14d3d15 918 @code
Wolfgang Betz 130:770ce14d3d15 919
Wolfgang Betz 130:770ce14d3d15 920 @endcode
Wolfgang Betz 130:770ce14d3d15 921 */
Wolfgang Betz 130:770ce14d3d15 922 /**************************************************************************/
Andrea Palmieri 228:25368f053411 923 ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
Andrea Palmieri 228:25368f053411 924 {
Andrea Palmieri 228:25368f053411 925 tBleStatus ret;
Andrea Palmieri 228:25368f053411 926
Andrea Palmieri 228:25368f053411 927 ret = aci_gatt_read_handle_value(g_device_name_char_handle+CHAR_VALUE_OFFSET,
Andrea Palmieri 228:25368f053411 928 *lengthP,
Andrea Palmieri 228:25368f053411 929 (uint16_t *)lengthP,
Andrea Palmieri 228:25368f053411 930 deviceName);
Andrea Palmieri 228:25368f053411 931 PRINTF("getDeviceName ret=0x%02x (lengthP=%d)\n\r", ret, *lengthP);
Andrea Palmieri 228:25368f053411 932 if (ret == BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 933 return BLE_ERROR_NONE;
Andrea Palmieri 228:25368f053411 934 } else {
Andrea Palmieri 228:25368f053411 935 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 936 }
Wolfgang Betz 130:770ce14d3d15 937 }
Wolfgang Betz 130:770ce14d3d15 938
Wolfgang Betz 130:770ce14d3d15 939 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 940 /*!
Wolfgang Betz 130:770ce14d3d15 941 @brief Sets the Device Appearance Characteristic
Wolfgang Betz 130:770ce14d3d15 942
Wolfgang Betz 130:770ce14d3d15 943 @param[in] appearance
Wolfgang Betz 130:770ce14d3d15 944 device appearance
Wolfgang Betz 130:770ce14d3d15 945
Wolfgang Betz 130:770ce14d3d15 946 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 947
Wolfgang Betz 130:770ce14d3d15 948 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 949 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 950
Wolfgang Betz 130:770ce14d3d15 951 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 952
Wolfgang Betz 130:770ce14d3d15 953 @code
Wolfgang Betz 130:770ce14d3d15 954
Wolfgang Betz 130:770ce14d3d15 955 @endcode
Wolfgang Betz 130:770ce14d3d15 956 */
Wolfgang Betz 130:770ce14d3d15 957 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 958 ble_error_t BlueNRGGap::setAppearance(GapAdvertisingData::Appearance appearance)
Wolfgang Betz 130:770ce14d3d15 959 {
Andrea Palmieri 187:2e517d3ddd71 960 tBleStatus ret;
Andrea Palmieri 228:25368f053411 961 uint8_t deviceAppearance[2];
Andrea Palmieri 187:2e517d3ddd71 962
Wolfgang Betz 130:770ce14d3d15 963 STORE_LE_16(deviceAppearance, appearance);
Wolfgang Betz 132:51056160fa4a 964 PRINTF("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]);
Wolfgang Betz 130:770ce14d3d15 965
Andrea Palmieri 228:25368f053411 966 ret = aci_gatt_update_char_value(g_gap_service_handle,
Andrea Palmieri 228:25368f053411 967 g_appearance_char_handle,
Andrea Palmieri 228:25368f053411 968 0, 2, (uint8_t *)deviceAppearance);
Andrea Palmieri 187:2e517d3ddd71 969 if (BLE_STATUS_SUCCESS == ret){
Andrea Palmieri 187:2e517d3ddd71 970 return BLE_ERROR_NONE;
Andrea Palmieri 187:2e517d3ddd71 971 }
Andrea Palmieri 187:2e517d3ddd71 972
Andrea Palmieri 217:23870c55b07e 973 PRINTF("setAppearance failed (ret=0x%x)!!\n\r", ret);
Andrea Palmieri 187:2e517d3ddd71 974 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 975 case BLE_STATUS_INVALID_HANDLE:
Andrea Palmieri 187:2e517d3ddd71 976 case BLE_STATUS_INVALID_PARAMETER:
Andrea Palmieri 187:2e517d3ddd71 977 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 978 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Andrea Palmieri 187:2e517d3ddd71 979 return BLE_ERROR_NO_MEM;
Andrea Palmieri 187:2e517d3ddd71 980 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 981 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 982 default:
Andrea Palmieri 187:2e517d3ddd71 983 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 984 }
Wolfgang Betz 130:770ce14d3d15 985 }
Wolfgang Betz 130:770ce14d3d15 986
Wolfgang Betz 130:770ce14d3d15 987 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 988 /*!
Wolfgang Betz 130:770ce14d3d15 989 @brief Gets the Device Appearance Characteristic
Wolfgang Betz 130:770ce14d3d15 990
Wolfgang Betz 130:770ce14d3d15 991 @param[in] appearance
Wolfgang Betz 130:770ce14d3d15 992 pointer to device appearance value
Wolfgang Betz 130:770ce14d3d15 993
Wolfgang Betz 130:770ce14d3d15 994 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 995
Wolfgang Betz 130:770ce14d3d15 996 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 997 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 998
Wolfgang Betz 130:770ce14d3d15 999 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 1000
Wolfgang Betz 130:770ce14d3d15 1001 @code
Wolfgang Betz 130:770ce14d3d15 1002
Wolfgang Betz 130:770ce14d3d15 1003 @endcode
Wolfgang Betz 130:770ce14d3d15 1004 */
Wolfgang Betz 130:770ce14d3d15 1005 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1006 ble_error_t BlueNRGGap::getAppearance(GapAdvertisingData::Appearance *appearanceP)
Wolfgang Betz 130:770ce14d3d15 1007 {
Andrea Palmieri 228:25368f053411 1008 tBleStatus ret;
Andrea Palmieri 228:25368f053411 1009 uint16_t lengthP = 2;
Andrea Palmieri 228:25368f053411 1010
Andrea Palmieri 228:25368f053411 1011 ret = aci_gatt_read_handle_value(g_appearance_char_handle+CHAR_VALUE_OFFSET,
Andrea Palmieri 228:25368f053411 1012 lengthP,
Andrea Palmieri 228:25368f053411 1013 &lengthP,
Andrea Palmieri 228:25368f053411 1014 (uint8_t*)appearanceP);
Andrea Palmieri 228:25368f053411 1015 PRINTF("getAppearance ret=0x%02x (lengthP=%d)\n\r", ret, lengthP);
Andrea Palmieri 228:25368f053411 1016 if (ret == BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 1017 return BLE_ERROR_NONE;
Andrea Palmieri 228:25368f053411 1018 } else {
Andrea Palmieri 228:25368f053411 1019 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 1020 }
Andrea Palmieri 228:25368f053411 1021
Wolfgang Betz 130:770ce14d3d15 1022 }
Wolfgang Betz 130:770ce14d3d15 1023
Andrea Palmieri 160:174387d53809 1024 GapScanningParams* BlueNRGGap::getScanningParams(void)
Andrea Palmieri 160:174387d53809 1025 {
Andrea Palmieri 160:174387d53809 1026 return &_scanningParams;
Andrea Palmieri 160:174387d53809 1027 }
Andrea Palmieri 160:174387d53809 1028
Andrea Palmieri 181:749071129d2e 1029 static void radioScanning(void)
Andrea Palmieri 160:174387d53809 1030 {
Andrea Palmieri 160:174387d53809 1031 GapScanningParams* scanningParams = BlueNRGGap::getInstance().getScanningParams();
Andrea Palmieri 160:174387d53809 1032
Andrea Palmieri 187:2e517d3ddd71 1033 BlueNRGGap::getInstance().startRadioScan(*scanningParams);
Andrea Palmieri 160:174387d53809 1034 }
Andrea Palmieri 160:174387d53809 1035
Wolfgang Betz 165:3576598c0889 1036 static void makeConnection(void)
Wolfgang Betz 162:667f97a4db7f 1037 {
Wolfgang Betz 165:3576598c0889 1038 BlueNRGGap::getInstance().createConnection();
Wolfgang Betz 162:667f97a4db7f 1039 }
Wolfgang Betz 162:667f97a4db7f 1040
Wolfgang Betz 130:770ce14d3d15 1041 // ANDREA
Wolfgang Betz 132:51056160fa4a 1042 void BlueNRGGap::Discovery_CB(Reason_t reason,
Wolfgang Betz 132:51056160fa4a 1043 uint8_t adv_type,
Wolfgang Betz 132:51056160fa4a 1044 uint8_t *addr_type,
Wolfgang Betz 132:51056160fa4a 1045 uint8_t *addr,
Wolfgang Betz 132:51056160fa4a 1046 uint8_t *data_length,
Wolfgang Betz 132:51056160fa4a 1047 uint8_t *data,
Wolfgang Betz 132:51056160fa4a 1048 uint8_t *RSSI)
Wolfgang Betz 132:51056160fa4a 1049 {
Andrea Palmieri 142:adf1567d3900 1050 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 1051 (void)addr_type;
Wolfgang Betz 132:51056160fa4a 1052
Wolfgang Betz 132:51056160fa4a 1053 switch (reason) {
Wolfgang Betz 132:51056160fa4a 1054 case DEVICE_FOUND:
Wolfgang Betz 132:51056160fa4a 1055 {
Wolfgang Betz 132:51056160fa4a 1056 GapAdvertisingParams::AdvertisingType_t type;
Wolfgang Betz 132:51056160fa4a 1057 bool isScanResponse = false;
Wolfgang Betz 132:51056160fa4a 1058 switch(adv_type) {
Wolfgang Betz 132:51056160fa4a 1059 case ADV_IND:
Wolfgang Betz 132:51056160fa4a 1060 type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1061 break;
Wolfgang Betz 132:51056160fa4a 1062 case ADV_DIRECT_IND:
Wolfgang Betz 132:51056160fa4a 1063 type = GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED;
Wolfgang Betz 132:51056160fa4a 1064 break;
Wolfgang Betz 132:51056160fa4a 1065 case ADV_SCAN_IND:
Wolfgang Betz 132:51056160fa4a 1066 case SCAN_RSP:
Wolfgang Betz 132:51056160fa4a 1067 type = GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1068 isScanResponse = true;
Wolfgang Betz 132:51056160fa4a 1069 break;
Wolfgang Betz 132:51056160fa4a 1070 case ADV_NONCONN_IND:
Wolfgang Betz 132:51056160fa4a 1071 type = GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED;
Andrea Palmieri 142:adf1567d3900 1072 break;
Andrea Palmieri 142:adf1567d3900 1073 default:
Andrea Palmieri 142:adf1567d3900 1074 type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1075 }
Wolfgang Betz 132:51056160fa4a 1076
Andrea Palmieri 217:23870c55b07e 1077 PRINTF("data_length=%d adv peerAddr[%02x %02x %02x %02x %02x %02x] \r\n",
Andrea Palmieri 217:23870c55b07e 1078 *data_length, addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
Wolfgang Betz 132:51056160fa4a 1079 processAdvertisementReport(addr, *RSSI, isScanResponse, type, *data_length, data);
Andrea Palmieri 160:174387d53809 1080 PRINTF("!!!After processAdvertisementReport\n\r");
Wolfgang Betz 132:51056160fa4a 1081 }
Wolfgang Betz 132:51056160fa4a 1082 break;
Wolfgang Betz 132:51056160fa4a 1083
Wolfgang Betz 132:51056160fa4a 1084 case DISCOVERY_COMPLETE:
Wolfgang Betz 132:51056160fa4a 1085 // The discovery is complete. If this is due to a stop scanning (i.e., the device
Wolfgang Betz 132:51056160fa4a 1086 // we are interested in has been found) and a connection has been requested
Wolfgang Betz 132:51056160fa4a 1087 // then we start the device connection. Otherwise, we restart the scanning.
Andrea Palmieri 145:024a552e4715 1088 PRINTF("DISCOVERY_COMPLETE\n\r");
Wolfgang Betz 132:51056160fa4a 1089 _scanning = false;
Wolfgang Betz 132:51056160fa4a 1090
Wolfgang Betz 165:3576598c0889 1091 // Since the DISCOVERY_COMPLETE event can be received during the scanning interval,
Wolfgang Betz 165:3576598c0889 1092 // we need to delay the starting of connection or re-scanning procedures
Wolfgang Betz 165:3576598c0889 1093 uint16_t delay = 2*(_scanningParams.getInterval());
Wolfgang Betz 165:3576598c0889 1094
Andrea Palmieri 217:23870c55b07e 1095 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 162:667f97a4db7f 1096 if(_connecting) {
Wolfgang Betz 165:3576598c0889 1097 minar::Scheduler::postCallback(makeConnection).delay(minar::milliseconds(delay));
Wolfgang Betz 132:51056160fa4a 1098 } else {
Wolfgang Betz 165:3576598c0889 1099 minar::Scheduler::postCallback(radioScanning).delay(minar::milliseconds(delay));
Wolfgang Betz 132:51056160fa4a 1100 }
Andrea Palmieri 217:23870c55b07e 1101 #else
Andrea Palmieri 217:23870c55b07e 1102 Clock_Wait(delay);
Andrea Palmieri 217:23870c55b07e 1103 if(_connecting) {
Andrea Palmieri 217:23870c55b07e 1104 makeConnection();
Andrea Palmieri 217:23870c55b07e 1105 } else {
Andrea Palmieri 217:23870c55b07e 1106 radioScanning();
Andrea Palmieri 217:23870c55b07e 1107 }
Andrea Palmieri 217:23870c55b07e 1108 #endif /* AST_FOR_MBED_OS */
Wolfgang Betz 132:51056160fa4a 1109
Wolfgang Betz 132:51056160fa4a 1110 break;
Wolfgang Betz 132:51056160fa4a 1111 }
Wolfgang Betz 132:51056160fa4a 1112 }
Wolfgang Betz 132:51056160fa4a 1113
Wolfgang Betz 132:51056160fa4a 1114 ble_error_t BlueNRGGap::startRadioScan(const GapScanningParams &scanningParams)
Wolfgang Betz 132:51056160fa4a 1115 {
Wolfgang Betz 132:51056160fa4a 1116
Wolfgang Betz 165:3576598c0889 1117 tBleStatus ret = BLE_STATUS_SUCCESS;
Andrea Palmieri 222:37a7e289ee3d 1118
Andrea Palmieri 222:37a7e289ee3d 1119 // Stop ADV before scanning
Andrea Palmieri 223:36df860f7ffc 1120 /*
Andrea Palmieri 222:37a7e289ee3d 1121 if (state.advertising == 1) {
Andrea Palmieri 222:37a7e289ee3d 1122 stopAdvertising();
Andrea Palmieri 222:37a7e289ee3d 1123 }
Andrea Palmieri 223:36df860f7ffc 1124 */
Andrea Palmieri 222:37a7e289ee3d 1125
Andrea Palmieri 152:4afc5c2fc4f3 1126 PRINTF("Scanning...\n\r");
Andrea Palmieri 217:23870c55b07e 1127 ret = btleStartRadioScan(scanningParams.getActiveScanning(),
Andrea Palmieri 217:23870c55b07e 1128 scanningParams.getInterval(),
Andrea Palmieri 217:23870c55b07e 1129 scanningParams.getWindow(),
Andrea Palmieri 217:23870c55b07e 1130 addr_type);
Andrea Palmieri 217:23870c55b07e 1131
Andrea Palmieri 217:23870c55b07e 1132
Andrea Palmieri 217:23870c55b07e 1133 if (BLE_STATUS_SUCCESS == ret){
Andrea Palmieri 217:23870c55b07e 1134 PRINTF("Observation Procedure Started\n");
Andrea Palmieri 217:23870c55b07e 1135 _scanning = true;
Andrea Palmieri 217:23870c55b07e 1136 return BLE_ERROR_NONE;
Andrea Palmieri 145:024a552e4715 1137 }
Andrea Palmieri 217:23870c55b07e 1138
Andrea Palmieri 217:23870c55b07e 1139 // Observer role is not supported by X-NUCLEO-IDB04A1, return BLE_ERROR_NOT_IMPLEMENTED
Andrea Palmieri 217:23870c55b07e 1140 switch (ret) {
Andrea Palmieri 217:23870c55b07e 1141 case BLE_STATUS_INVALID_CID:
Andrea Palmieri 217:23870c55b07e 1142 printf("Observation Procedure not implemented!!!\n\r");
Andrea Palmieri 217:23870c55b07e 1143 return BLE_ERROR_NOT_IMPLEMENTED;
Andrea Palmieri 217:23870c55b07e 1144 default:
Andrea Palmieri 217:23870c55b07e 1145 printf("Observation Procedure failed (0x%02X)\n\r", ret);
Andrea Palmieri 217:23870c55b07e 1146 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1147 }
Andrea Palmieri 217:23870c55b07e 1148
Wolfgang Betz 130:770ce14d3d15 1149 }
Wolfgang Betz 130:770ce14d3d15 1150
Wolfgang Betz 130:770ce14d3d15 1151 ble_error_t BlueNRGGap::stopScan() {
Wolfgang Betz 165:3576598c0889 1152 tBleStatus ret = BLE_STATUS_SUCCESS;
Wolfgang Betz 132:51056160fa4a 1153
Andrea Palmieri 217:23870c55b07e 1154 ret = aci_gap_terminate_gap_procedure(GAP_OBSERVATION_PROC);
Wolfgang Betz 132:51056160fa4a 1155
Wolfgang Betz 132:51056160fa4a 1156 if (ret != BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 1157 printf("GAP Terminate Gap Procedure failed\n");
Wolfgang Betz 132:51056160fa4a 1158 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1159 } else {
Wolfgang Betz 132:51056160fa4a 1160 PRINTF("Discovery Procedure Terminated\n");
Wolfgang Betz 130:770ce14d3d15 1161 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1162 }
Wolfgang Betz 130:770ce14d3d15 1163 }
Wolfgang Betz 130:770ce14d3d15 1164
Wolfgang Betz 130:770ce14d3d15 1165 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1166 /*!
Wolfgang Betz 130:770ce14d3d15 1167 @brief set Tx power level
Wolfgang Betz 130:770ce14d3d15 1168 @param[in] txPower Transmission Power level
Wolfgang Betz 130:770ce14d3d15 1169 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 1170 */
Wolfgang Betz 130:770ce14d3d15 1171 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1172 ble_error_t BlueNRGGap::setTxPower(int8_t txPower)
Wolfgang Betz 130:770ce14d3d15 1173 {
Wolfgang Betz 130:770ce14d3d15 1174 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 1175
Wolfgang Betz 130:770ce14d3d15 1176 int8_t enHighPower = 0;
Andrea Palmieri 201:a9bc2e8b01d7 1177 int8_t paLevel = 0;
Andrea Palmieri 201:a9bc2e8b01d7 1178
Andrea Palmieri 228:25368f053411 1179 ret = getHighPowerAndPALevelValue(txPower, enHighPower, paLevel);
Andrea Palmieri 228:25368f053411 1180 if(ret!=BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 1181 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 228:25368f053411 1182 }
Andrea Palmieri 201:a9bc2e8b01d7 1183
Wolfgang Betz 132:51056160fa4a 1184 PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 1185 ret = aci_hal_set_tx_power_level(enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 1186 if(ret!=BLE_STATUS_SUCCESS) {
Andrea Palmieri 228:25368f053411 1187 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 1188 }
Andrea Palmieri 201:a9bc2e8b01d7 1189
Wolfgang Betz 130:770ce14d3d15 1190 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 1191 }
Wolfgang Betz 130:770ce14d3d15 1192
Wolfgang Betz 130:770ce14d3d15 1193 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1194 /*!
Wolfgang Betz 130:770ce14d3d15 1195 @brief get permitted Tx power values
Wolfgang Betz 130:770ce14d3d15 1196 @param[in] values pointer to pointer to permitted power values
Wolfgang Betz 130:770ce14d3d15 1197 @param[in] num number of values
Wolfgang Betz 130:770ce14d3d15 1198 */
Wolfgang Betz 130:770ce14d3d15 1199 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1200 void BlueNRGGap::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
Wolfgang Betz 130:770ce14d3d15 1201 static const int8_t permittedTxValues[] = {
Andrea Palmieri 228:25368f053411 1202 -18, -15, -14, -12, -11, -9, -8, -6, -5 -2, 0, 2, 4, 5, 8
Wolfgang Betz 130:770ce14d3d15 1203 };
Wolfgang Betz 130:770ce14d3d15 1204
Wolfgang Betz 130:770ce14d3d15 1205 *valueArrayPP = permittedTxValues;
Wolfgang Betz 130:770ce14d3d15 1206 *countP = sizeof(permittedTxValues) / sizeof(int8_t);
Wolfgang Betz 130:770ce14d3d15 1207 }
Wolfgang Betz 132:51056160fa4a 1208
Andrea Palmieri 181:749071129d2e 1209 ble_error_t BlueNRGGap::createConnection ()
Wolfgang Betz 132:51056160fa4a 1210 {
Wolfgang Betz 132:51056160fa4a 1211 tBleStatus ret;
Andrea Palmieri 222:37a7e289ee3d 1212 GapScanningParams* scanningParams = getScanningParams();
Wolfgang Betz 132:51056160fa4a 1213
Wolfgang Betz 132:51056160fa4a 1214 /*
Wolfgang Betz 163:4c008b1089e9 1215 Scan_Interval, Scan_Window, Peer_Address_Type, Peer_Address, Own_Address_Type, Conn_Interval_Min,
Wolfgang Betz 163:4c008b1089e9 1216 Conn_Interval_Max, Conn_Latency, Supervision_Timeout, Conn_Len_Min, Conn_Len_Max
Wolfgang Betz 132:51056160fa4a 1217 */
Andrea Palmieri 222:37a7e289ee3d 1218 ret = aci_gap_create_connection(scanningParams->getInterval(),
Andrea Palmieri 222:37a7e289ee3d 1219 scanningParams->getWindow(),
Wolfgang Betz 163:4c008b1089e9 1220 PUBLIC_ADDR,
Wolfgang Betz 163:4c008b1089e9 1221 (unsigned char*)_peerAddr,
Wolfgang Betz 163:4c008b1089e9 1222 PUBLIC_ADDR,
Wolfgang Betz 163:4c008b1089e9 1223 CONN_P1, CONN_P2, 0,
Andrea Palmieri 220:e02936f0d4c7 1224 SUPERV_TIMEOUT, CONN_L1 , CONN_L1);
Wolfgang Betz 165:3576598c0889 1225
Wolfgang Betz 165:3576598c0889 1226 _connecting = false;
Wolfgang Betz 163:4c008b1089e9 1227
Wolfgang Betz 163:4c008b1089e9 1228 if (ret != BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 1229 printf("Error while starting connection (ret=0x%02X).\n\r", ret);
Wolfgang Betz 132:51056160fa4a 1230 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1231 } else {
Wolfgang Betz 132:51056160fa4a 1232 PRINTF("Connection started.\n");
Wolfgang Betz 132:51056160fa4a 1233 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1234 }
Wolfgang Betz 132:51056160fa4a 1235 }
Wolfgang Betz 132:51056160fa4a 1236
Wolfgang Betz 132:51056160fa4a 1237 ble_error_t BlueNRGGap::connect (const Gap::Address_t peerAddr,
Wolfgang Betz 132:51056160fa4a 1238 Gap::AddressType_t peerAddrType,
Wolfgang Betz 132:51056160fa4a 1239 const ConnectionParams_t *connectionParams,
Wolfgang Betz 132:51056160fa4a 1240 const GapScanningParams *scanParams)
Wolfgang Betz 132:51056160fa4a 1241 {
Andrea Palmieri 142:adf1567d3900 1242 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 1243 (void)peerAddrType;
Andrea Palmieri 142:adf1567d3900 1244 (void)connectionParams;
Andrea Palmieri 142:adf1567d3900 1245 (void)scanParams;
Andrea Palmieri 142:adf1567d3900 1246
Andrea Palmieri 217:23870c55b07e 1247 // Save the peer address
Wolfgang Betz 132:51056160fa4a 1248 for(int i=0; i<BDADDR_SIZE; i++) {
Wolfgang Betz 132:51056160fa4a 1249 _peerAddr[i] = peerAddr[i];
Wolfgang Betz 132:51056160fa4a 1250 }
Wolfgang Betz 132:51056160fa4a 1251
Andrea Palmieri 181:749071129d2e 1252 _connecting = true;
Wolfgang Betz 132:51056160fa4a 1253
Wolfgang Betz 132:51056160fa4a 1254 if(_scanning) {
Wolfgang Betz 132:51056160fa4a 1255 stopScan();
Wolfgang Betz 132:51056160fa4a 1256 } else {
Wolfgang Betz 165:3576598c0889 1257 PRINTF("Calling createConnection from connect()\n\r");
Wolfgang Betz 165:3576598c0889 1258 return createConnection();
Wolfgang Betz 132:51056160fa4a 1259 }
Wolfgang Betz 132:51056160fa4a 1260
Wolfgang Betz 132:51056160fa4a 1261 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1262 }