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:
Fri Mar 18 12:05:22 2016 +0100
Revision:
213:781abfbf2d1c
Parent:
210:08c4c85ca679
Child:
215:e8fa3129410a
Child:
217:23870c55b07e
Let update ADV data while advertising

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");
Wolfgang Betz 130:770ce14d3d15 182 loadPtr.getUnitAtIndex(index).printDataAsString();
Wolfgang Betz 130:770ce14d3d15 183 local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Wolfgang Betz 130:770ce14d3d15 184 local_name = (uint8_t*)loadPtr.getUnitAtIndex(index).getAdTypePtr();
Wolfgang Betz 132:51056160fa4a 185 PRINTF("Advertising type: COMPLETE_LOCAL_NAME local_name=%s\n\r", local_name);
Wolfgang Betz 130:770ce14d3d15 186 //COMPLETE_LOCAL_NAME is only advertising device name. Gatt Device Name is not the same.(Must be set right after GAP/GATT init?)
Wolfgang Betz 130:770ce14d3d15 187
Wolfgang Betz 132:51056160fa4a 188 PRINTF("device_name length=%d\n\r", local_name_length);
Wolfgang Betz 130:770ce14d3d15 189 break;
Wolfgang Betz 130:770ce14d3d15 190 }
Wolfgang Betz 130:770ce14d3d15 191 case GapAdvertisingData::TX_POWER_LEVEL: /**< TX Power Level (in dBm) */
Wolfgang Betz 130:770ce14d3d15 192 {
Wolfgang Betz 132:51056160fa4a 193 PRINTF("Advertising type: TX_POWER_LEVEL\n\r");
Wolfgang Betz 130:770ce14d3d15 194 int8_t enHighPower = 0;
Wolfgang Betz 130:770ce14d3d15 195 int8_t paLevel = 0;
Wolfgang Betz 132:51056160fa4a 196 #ifdef DEBUG
Wolfgang Betz 130:770ce14d3d15 197 int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr();
Wolfgang Betz 130:770ce14d3d15 198 int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 199 #endif
Wolfgang Betz 132:51056160fa4a 200 PRINTF("dbm=%d, dbmActuallySet=%d\n\r", dbm, dbmActuallySet);
Wolfgang Betz 132:51056160fa4a 201 PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 202 aci_hal_set_tx_power_level(enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 203 break;
Wolfgang Betz 130:770ce14d3d15 204 }
Wolfgang Betz 130:770ce14d3d15 205 case GapAdvertisingData::DEVICE_ID: /**< Device ID */
Wolfgang Betz 130:770ce14d3d15 206 {
Wolfgang Betz 130:770ce14d3d15 207 break;
Wolfgang Betz 130:770ce14d3d15 208 }
Wolfgang Betz 130:770ce14d3d15 209 case GapAdvertisingData::SLAVE_CONNECTION_INTERVAL_RANGE: /**< Slave :Connection Interval Range */
Wolfgang Betz 130:770ce14d3d15 210 {
Wolfgang Betz 130:770ce14d3d15 211 break;
Wolfgang Betz 130:770ce14d3d15 212 }
Wolfgang Betz 130:770ce14d3d15 213 case GapAdvertisingData::SERVICE_DATA: /**< Service Data */
Wolfgang Betz 130:770ce14d3d15 214 {
Wolfgang Betz 132:51056160fa4a 215 PRINTF("Advertising type: SERVICE_DATA\n\r");
Wolfgang Betz 130:770ce14d3d15 216 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Wolfgang Betz 132:51056160fa4a 217 PRINTF("Advertising type: SERVICE_DATA (buffSize=%d)\n\r", buffSize);
Wolfgang Betz 130:770ce14d3d15 218 // 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 219 if(buffSize>ADV_DATA_MAX_SIZE-2) {
Wolfgang Betz 130:770ce14d3d15 220 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 221 }
Wolfgang Betz 130:770ce14d3d15 222 for(int i=0; i<buffSize+1; i++) {
Wolfgang Betz 132:51056160fa4a 223 PRINTF("Advertising type: SERVICE_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
Wolfgang Betz 130:770ce14d3d15 224 }
Wolfgang Betz 130:770ce14d3d15 225 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 226 AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data)
Wolfgang Betz 130:770ce14d3d15 227 AdvData[1] = AD_TYPE_SERVICE_DATA;
Wolfgang Betz 130:770ce14d3d15 228 memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
Wolfgang Betz 130:770ce14d3d15 229 break;
Wolfgang Betz 130:770ce14d3d15 230 }
Wolfgang Betz 130:770ce14d3d15 231 case GapAdvertisingData::APPEARANCE:
Wolfgang Betz 130:770ce14d3d15 232 {
Wolfgang Betz 130:770ce14d3d15 233 /*
Wolfgang Betz 130:770ce14d3d15 234 Tested with GapAdvertisingData::GENERIC_PHONE.
Wolfgang Betz 130:770ce14d3d15 235 for other appearances BLE Scanner android app is not behaving properly
Wolfgang Betz 130:770ce14d3d15 236 */
Wolfgang Betz 132:51056160fa4a 237 PRINTF("Advertising type: APPEARANCE\n\r");
Wolfgang Betz 130:770ce14d3d15 238 const char *deviceAppearance = NULL;
Wolfgang Betz 130:770ce14d3d15 239 deviceAppearance = (const char*)loadPtr.getUnitAtIndex(index).getDataPtr(); // to be set later when startAdvertising() is called
Wolfgang Betz 130:770ce14d3d15 240
Wolfgang Betz 132:51056160fa4a 241 #ifdef DEBUG
Wolfgang Betz 130:770ce14d3d15 242 uint8_t Appearance[2] = {0, 0};
Wolfgang Betz 130:770ce14d3d15 243 uint16_t devP = (uint16_t)*deviceAppearance;
Wolfgang Betz 130:770ce14d3d15 244 STORE_LE_16(Appearance, (uint16_t)devP);
Wolfgang Betz 130:770ce14d3d15 245 #endif
Wolfgang Betz 130:770ce14d3d15 246
Wolfgang Betz 132:51056160fa4a 247 PRINTF("input: deviceAppearance= 0x%x 0x%x..., strlen(deviceAppearance)=%d\n\r", Appearance[1], Appearance[0], (uint8_t)*loadPtr.getUnitAtIndex(index).getLenPtr()-1); /**< \ref Appearance */
Wolfgang Betz 130:770ce14d3d15 248
Wolfgang Betz 130:770ce14d3d15 249 aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (uint8_t *)deviceAppearance);//not using array Appearance[2]
Wolfgang Betz 130:770ce14d3d15 250 break;
Wolfgang Betz 130:770ce14d3d15 251 }
Wolfgang Betz 130:770ce14d3d15 252 case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */
Wolfgang Betz 130:770ce14d3d15 253 {
Wolfgang Betz 132:51056160fa4a 254 PRINTF("Advertising type: ADVERTISING_INTERVAL\n\r");
Wolfgang Betz 130:770ce14d3d15 255 advtInterval = (uint16_t)(*loadPtr.getUnitAtIndex(index).getDataPtr());
Wolfgang Betz 135:f0b6cf8ac4fc 256 PRINTF("advtInterval=%d\n\r", (int)advtInterval);
Wolfgang Betz 130:770ce14d3d15 257 break;
Wolfgang Betz 130:770ce14d3d15 258 }
Andrea Palmieri 182:e7cff2f17ef9 259 case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */
Wolfgang Betz 130:770ce14d3d15 260 {
Andrea Palmieri 182:e7cff2f17ef9 261 PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA\n\r");
Andrea Palmieri 182:e7cff2f17ef9 262 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
Andrea Palmieri 182:e7cff2f17ef9 263 PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA (buffSize=%d)\n\r", buffSize);
Andrea Palmieri 182:e7cff2f17ef9 264 // the total ADV DATA LEN should include two more bytes:
Andrea Palmieri 182:e7cff2f17ef9 265 // the buffer size byte;
Andrea Palmieri 182:e7cff2f17ef9 266 // and the Manufacturer Specific Data Type Value byte
Andrea Palmieri 182:e7cff2f17ef9 267 if(buffSize>ADV_DATA_MAX_SIZE-2) {
Andrea Palmieri 182:e7cff2f17ef9 268 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Andrea Palmieri 182:e7cff2f17ef9 269 }
Andrea Palmieri 182:e7cff2f17ef9 270 for(int i=0; i<buffSize+1; i++) {
Andrea Palmieri 182:e7cff2f17ef9 271 PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r",
Andrea Palmieri 182:e7cff2f17ef9 272 i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
Andrea Palmieri 182:e7cff2f17ef9 273 }
Andrea Palmieri 182:e7cff2f17ef9 274 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 275 AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data)
Andrea Palmieri 182:e7cff2f17ef9 276 AdvData[1] = AD_TYPE_MANUFACTURER_SPECIFIC_DATA;
Andrea Palmieri 182:e7cff2f17ef9 277 memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
Wolfgang Betz 130:770ce14d3d15 278 break;
Wolfgang Betz 130:770ce14d3d15 279 }
Wolfgang Betz 130:770ce14d3d15 280
Wolfgang Betz 130:770ce14d3d15 281 }
Wolfgang Betz 130:770ce14d3d15 282 }
Wolfgang Betz 130:770ce14d3d15 283 //Set the SCAN_RSP Payload
Wolfgang Betz 130:770ce14d3d15 284 scan_response_payload = scanResponse.getPayload();
Wolfgang Betz 130:770ce14d3d15 285 scan_rsp_length = scanResponse.getPayloadLen();
Andrea Palmieri 213:781abfbf2d1c 286
Andrea Palmieri 213:781abfbf2d1c 287 // Update the ADV data if we are already in ADV mode
Andrea Palmieri 213:781abfbf2d1c 288 if(AdvLen > 0 && state.advertising == 1) {
Andrea Palmieri 213:781abfbf2d1c 289
Andrea Palmieri 213:781abfbf2d1c 290 tBleStatus ret = aci_gap_update_adv_data(AdvLen, AdvData);
Andrea Palmieri 213:781abfbf2d1c 291 if(BLE_STATUS_SUCCESS!=ret) {
Andrea Palmieri 213:781abfbf2d1c 292 PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret);
Andrea Palmieri 213:781abfbf2d1c 293 switch (ret) {
Andrea Palmieri 213:781abfbf2d1c 294 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 213:781abfbf2d1c 295 return BLE_STACK_BUSY;
Andrea Palmieri 213:781abfbf2d1c 296 default:
Andrea Palmieri 213:781abfbf2d1c 297 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 213:781abfbf2d1c 298 }
Andrea Palmieri 213:781abfbf2d1c 299 }
Andrea Palmieri 213:781abfbf2d1c 300 }
Wolfgang Betz 130:770ce14d3d15 301 }
Wolfgang Betz 130:770ce14d3d15 302 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 303 }
Wolfgang Betz 130:770ce14d3d15 304
Wolfgang Betz 130:770ce14d3d15 305 /*
Wolfgang Betz 130:770ce14d3d15 306 * Utility to set ADV timeout flag
Wolfgang Betz 130:770ce14d3d15 307 */
Wolfgang Betz 130:770ce14d3d15 308 void BlueNRGGap::setAdvToFlag(void) {
Wolfgang Betz 130:770ce14d3d15 309 AdvToFlag = true;
Wolfgang Betz 130:770ce14d3d15 310 }
Wolfgang Betz 130:770ce14d3d15 311
Wolfgang Betz 130:770ce14d3d15 312 /*
Wolfgang Betz 130:770ce14d3d15 313 * ADV timeout callback
Wolfgang Betz 130:770ce14d3d15 314 */
Wolfgang Betz 132:51056160fa4a 315 // ANDREA: mbedOS
Wolfgang Betz 138:32e3c4ca7a45 316 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 132:51056160fa4a 317 static void advTimeoutCB(void)
Wolfgang Betz 132:51056160fa4a 318 {
Wolfgang Betz 132:51056160fa4a 319 Gap::GapState_t state;
Wolfgang Betz 132:51056160fa4a 320
Wolfgang Betz 132:51056160fa4a 321 state = BlueNRGGap::getInstance().getState();
Wolfgang Betz 132:51056160fa4a 322 if (state.advertising == 1) {
Wolfgang Betz 132:51056160fa4a 323
Wolfgang Betz 132:51056160fa4a 324 BlueNRGGap::getInstance().stopAdvertising();
Wolfgang Betz 132:51056160fa4a 325
Wolfgang Betz 132:51056160fa4a 326 }
Wolfgang Betz 132:51056160fa4a 327 }
Wolfgang Betz 132:51056160fa4a 328 #else
Wolfgang Betz 130:770ce14d3d15 329 static void advTimeoutCB(void)
Wolfgang Betz 130:770ce14d3d15 330 {
Wolfgang Betz 130:770ce14d3d15 331 Gap::GapState_t state;
Wolfgang Betz 130:770ce14d3d15 332
Wolfgang Betz 130:770ce14d3d15 333 state = BlueNRGGap::getInstance().getState();
Wolfgang Betz 130:770ce14d3d15 334 if (state.advertising == 1) {
Wolfgang Betz 130:770ce14d3d15 335
Wolfgang Betz 130:770ce14d3d15 336 BlueNRGGap::getInstance().setAdvToFlag();
Wolfgang Betz 130:770ce14d3d15 337
Wolfgang Betz 130:770ce14d3d15 338 Timeout t = BlueNRGGap::getInstance().getAdvTimeout();
Wolfgang Betz 130:770ce14d3d15 339 t.detach(); /* disable the callback from the timeout */
Wolfgang Betz 130:770ce14d3d15 340
Wolfgang Betz 130:770ce14d3d15 341 }
Wolfgang Betz 130:770ce14d3d15 342 }
Wolfgang Betz 138:32e3c4ca7a45 343 #endif /* AST_FOR_MBED_OS */
Wolfgang Betz 130:770ce14d3d15 344
Wolfgang Betz 130:770ce14d3d15 345 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 346 /*!
Wolfgang Betz 130:770ce14d3d15 347 @brief Starts the BLE HW, initialising any services that were
Wolfgang Betz 130:770ce14d3d15 348 added before this function was called.
Wolfgang Betz 130:770ce14d3d15 349
Wolfgang Betz 130:770ce14d3d15 350 @param[in] params
Wolfgang Betz 130:770ce14d3d15 351 Basic advertising details, including the advertising
Wolfgang Betz 130:770ce14d3d15 352 delay, timeout and how the device should be advertised
Wolfgang Betz 130:770ce14d3d15 353
Wolfgang Betz 130:770ce14d3d15 354 @note All services must be added before calling this function!
Wolfgang Betz 130:770ce14d3d15 355
Wolfgang Betz 130:770ce14d3d15 356 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 357
Wolfgang Betz 130:770ce14d3d15 358 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 359 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 360
Wolfgang Betz 130:770ce14d3d15 361 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 362
Wolfgang Betz 130:770ce14d3d15 363 @code
Wolfgang Betz 130:770ce14d3d15 364
Wolfgang Betz 130:770ce14d3d15 365 @endcode
Wolfgang Betz 130:770ce14d3d15 366 */
Wolfgang Betz 130:770ce14d3d15 367 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 368
Wolfgang Betz 130:770ce14d3d15 369 ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams &params)
Andrea Palmieri 187:2e517d3ddd71 370 {
Andrea Palmieri 187:2e517d3ddd71 371 tBleStatus ret;
Andrea Palmieri 187:2e517d3ddd71 372
Wolfgang Betz 130:770ce14d3d15 373 /* Make sure we support the advertising type */
Wolfgang Betz 130:770ce14d3d15 374 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
Wolfgang Betz 130:770ce14d3d15 375 /* ToDo: This requires a propery security implementation, etc. */
Wolfgang Betz 130:770ce14d3d15 376 return BLE_ERROR_NOT_IMPLEMENTED;
Wolfgang Betz 130:770ce14d3d15 377 }
Wolfgang Betz 130:770ce14d3d15 378
Wolfgang Betz 130:770ce14d3d15 379 /* Check interval range */
Wolfgang Betz 130:770ce14d3d15 380 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) {
Wolfgang Betz 130:770ce14d3d15 381 /* Min delay is slightly longer for unconnectable devices */
Wolfgang Betz 130:770ce14d3d15 382 if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
Wolfgang Betz 130:770ce14d3d15 383 (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Wolfgang Betz 130:770ce14d3d15 384 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 385 }
Wolfgang Betz 130:770ce14d3d15 386 } else {
Wolfgang Betz 130:770ce14d3d15 387 if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN) ||
Wolfgang Betz 130:770ce14d3d15 388 (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Wolfgang Betz 130:770ce14d3d15 389 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 390 }
Wolfgang Betz 130:770ce14d3d15 391 }
Wolfgang Betz 130:770ce14d3d15 392
Wolfgang Betz 130:770ce14d3d15 393 /* Check timeout is zero for Connectable Directed */
Wolfgang Betz 130:770ce14d3d15 394 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) {
Wolfgang Betz 130:770ce14d3d15 395 /* Timeout must be 0 with this type, although we'll never get here */
Wolfgang Betz 130:770ce14d3d15 396 /* since this isn't implemented yet anyway */
Wolfgang Betz 130:770ce14d3d15 397 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 398 }
Wolfgang Betz 130:770ce14d3d15 399
Wolfgang Betz 130:770ce14d3d15 400 /* Check timeout for other advertising types */
Wolfgang Betz 130:770ce14d3d15 401 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
Wolfgang Betz 130:770ce14d3d15 402 (params.getTimeout() > GapAdvertisingParams::GAP_ADV_PARAMS_TIMEOUT_MAX)) {
Wolfgang Betz 130:770ce14d3d15 403 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 404 }
Wolfgang Betz 130:770ce14d3d15 405
Wolfgang Betz 130:770ce14d3d15 406 /* set scan response data */
Andrea Palmieri 187:2e517d3ddd71 407 ret = hci_le_set_scan_resp_data(scan_rsp_length, scan_response_payload);
Andrea Palmieri 187:2e517d3ddd71 408 if(BLE_STATUS_SUCCESS!=ret) {
Andrea Palmieri 187:2e517d3ddd71 409 PRINTF(" error while setting scan response data (ret=0x%x)\n", ret);
Andrea Palmieri 187:2e517d3ddd71 410 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 411 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 412 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 413 default:
Andrea Palmieri 187:2e517d3ddd71 414 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 415 }
Andrea Palmieri 187:2e517d3ddd71 416 }
Wolfgang Betz 130:770ce14d3d15 417
Wolfgang Betz 130:770ce14d3d15 418 /*aci_gap_set_discoverable(Advertising_Event_Type, Adv_min_intvl, Adv_Max_Intvl, Addr_Type, Adv_Filter_Policy,
Wolfgang Betz 130:770ce14d3d15 419 Local_Name_Length, local_name, service_uuid_length, service_uuid_list, Slave_conn_intvl_min, Slave_conn_intvl_max);*/
Wolfgang Betz 130:770ce14d3d15 420 /*LINK_LAYER.H DESCRIBES THE ADVERTISING TYPES*/
Wolfgang Betz 130:770ce14d3d15 421
Andrea Palmieri 187:2e517d3ddd71 422 // Enable the else branch if you want to set default device name
Wolfgang Betz 130:770ce14d3d15 423 char* name = NULL;
Wolfgang Betz 130:770ce14d3d15 424 uint8_t nameLen = 0;
Wolfgang Betz 130:770ce14d3d15 425 if(local_name!=NULL) {
Wolfgang Betz 130:770ce14d3d15 426 name = (char*)local_name;
Wolfgang Betz 132:51056160fa4a 427 PRINTF("name=%s\n\r", name);
Wolfgang Betz 130:770ce14d3d15 428 nameLen = local_name_length;
Andrea Palmieri 187:2e517d3ddd71 429 } /*else {
Wolfgang Betz 130:770ce14d3d15 430 char str[] = "ST_BLE_DEV";
Wolfgang Betz 130:770ce14d3d15 431 name = new char[strlen(str)+1];
Wolfgang Betz 130:770ce14d3d15 432 name[0] = AD_TYPE_COMPLETE_LOCAL_NAME;
Wolfgang Betz 130:770ce14d3d15 433 strcpy(name+1, str);
Wolfgang Betz 130:770ce14d3d15 434 nameLen = strlen(name);
Wolfgang Betz 132:51056160fa4a 435 PRINTF("nameLen=%d\n\r", nameLen);
Wolfgang Betz 132:51056160fa4a 436 PRINTF("name=%s\n\r", name);
Andrea Palmieri 187:2e517d3ddd71 437 }*/
Wolfgang Betz 130:770ce14d3d15 438
Wolfgang Betz 130:770ce14d3d15 439 advtInterval = params.getIntervalInADVUnits(); // set advtInterval in case it is not already set by user application
Wolfgang Betz 130:770ce14d3d15 440 ret = aci_gap_set_discoverable(params.getAdvertisingType(), // Advertising_Event_Type
Wolfgang Betz 130:770ce14d3d15 441 advtInterval, // Adv_Interval_Min
Wolfgang Betz 130:770ce14d3d15 442 advtInterval, // Adv_Interval_Max
Wolfgang Betz 130:770ce14d3d15 443 PUBLIC_ADDR, // Address_Type
Wolfgang Betz 130:770ce14d3d15 444 NO_WHITE_LIST_USE, // Adv_Filter_Policy
Wolfgang Betz 130:770ce14d3d15 445 nameLen, //local_name_length, // Local_Name_Length
Wolfgang Betz 130:770ce14d3d15 446 (const char*)name, //local_name, // Local_Name
Wolfgang Betz 130:770ce14d3d15 447 servUuidlength, //Service_Uuid_Length
Wolfgang Betz 130:770ce14d3d15 448 servUuidData, //Service_Uuid_List
Wolfgang Betz 130:770ce14d3d15 449 0, // Slave_Conn_Interval_Min
Wolfgang Betz 130:770ce14d3d15 450 0); // Slave_Conn_Interval_Max
Wolfgang Betz 130:770ce14d3d15 451
Wolfgang Betz 130:770ce14d3d15 452
Wolfgang Betz 132:51056160fa4a 453 PRINTF("!!!setting discoverable (servUuidlength=0x%x)\n", servUuidlength);
Wolfgang Betz 130:770ce14d3d15 454 if(BLE_STATUS_SUCCESS!=ret) {
Wolfgang Betz 132:51056160fa4a 455 PRINTF("error occurred while setting discoverable (ret=0x%x)\n", ret);
Andrea Palmieri 187:2e517d3ddd71 456 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 457 case BLE_STATUS_INVALID_PARAMS:
Andrea Palmieri 187:2e517d3ddd71 458 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 459 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 460 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 461 case ERR_UNSUPPORTED_FEATURE:
Andrea Palmieri 187:2e517d3ddd71 462 return BLE_ERROR_NOT_IMPLEMENTED;
Andrea Palmieri 187:2e517d3ddd71 463 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 464 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 465 default:
Andrea Palmieri 187:2e517d3ddd71 466 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 467 }
Wolfgang Betz 130:770ce14d3d15 468 }
Wolfgang Betz 130:770ce14d3d15 469
Wolfgang Betz 130:770ce14d3d15 470 // Before updating the ADV data, delete COMPLETE_LOCAL_NAME and TX_POWER_LEVEL fields (if present)
Wolfgang Betz 130:770ce14d3d15 471 if(AdvLen>0) {
Wolfgang Betz 130:770ce14d3d15 472 if(name!=NULL) {
Wolfgang Betz 132:51056160fa4a 473 PRINTF("!!!calling aci_gap_delete_ad_type AD_TYPE_COMPLETE_LOCAL_NAME!!!\n");
Wolfgang Betz 130:770ce14d3d15 474 ret = aci_gap_delete_ad_type(AD_TYPE_COMPLETE_LOCAL_NAME);
Andrea Palmieri 187:2e517d3ddd71 475 if (BLE_STATUS_SUCCESS!=ret){
Wolfgang Betz 132:51056160fa4a 476 PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);
Andrea Palmieri 187:2e517d3ddd71 477 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 478 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 479 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 480 default:
Andrea Palmieri 187:2e517d3ddd71 481 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 482 }
Wolfgang Betz 130:770ce14d3d15 483 }
Wolfgang Betz 130:770ce14d3d15 484 }
Wolfgang Betz 130:770ce14d3d15 485
Andrea Palmieri 201:a9bc2e8b01d7 486 // If ADV Data Type is SERVICE DATA or MANUFACTURER SPECIFIC DATA,
Andrea Palmieri 201:a9bc2e8b01d7 487 // we need to delete it to make the needed room in ADV payload
Andrea Palmieri 201:a9bc2e8b01d7 488 if(AdvData[1]==AD_TYPE_SERVICE_DATA || AdvData[1]==AD_TYPE_MANUFACTURER_SPECIFIC_DATA) {
Wolfgang Betz 132:51056160fa4a 489 PRINTF("!!!calling aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL)!!!\n");
Wolfgang Betz 130:770ce14d3d15 490 ret = aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL);
Andrea Palmieri 187:2e517d3ddd71 491 if (BLE_STATUS_SUCCESS!=ret){
Wolfgang Betz 132:51056160fa4a 492 PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);
Andrea Palmieri 187:2e517d3ddd71 493 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 494 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 495 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 496 default:
Andrea Palmieri 187:2e517d3ddd71 497 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 498 }
Wolfgang Betz 130:770ce14d3d15 499 }
Wolfgang Betz 130:770ce14d3d15 500 }
Wolfgang Betz 130:770ce14d3d15 501
Wolfgang Betz 130:770ce14d3d15 502 ret = aci_gap_update_adv_data(AdvLen, AdvData);
Wolfgang Betz 130:770ce14d3d15 503 if(BLE_STATUS_SUCCESS!=ret) {
Wolfgang Betz 132:51056160fa4a 504 PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret);
Andrea Palmieri 187:2e517d3ddd71 505 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 506 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 507 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 508 default:
Andrea Palmieri 187:2e517d3ddd71 509 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 510 }
Wolfgang Betz 130:770ce14d3d15 511 }
Wolfgang Betz 130:770ce14d3d15 512
Andrea Palmieri 187:2e517d3ddd71 513 } // AdvLen>0
Wolfgang Betz 130:770ce14d3d15 514
Wolfgang Betz 130:770ce14d3d15 515 state.advertising = 1;
Wolfgang Betz 130:770ce14d3d15 516
Wolfgang Betz 130:770ce14d3d15 517 AdvToFlag = false;
Wolfgang Betz 130:770ce14d3d15 518 if(params.getTimeout() != 0) {
Wolfgang Betz 132:51056160fa4a 519 PRINTF("!!! attaching to!!!\n");
Wolfgang Betz 132:51056160fa4a 520 // ANDREA: mbedOS
Wolfgang Betz 138:32e3c4ca7a45 521 #ifdef AST_FOR_MBED_OS
Wolfgang Betz 132:51056160fa4a 522 minar::Scheduler::postCallback(advTimeoutCB).delay(minar::milliseconds(params.getTimeout()));
Wolfgang Betz 132:51056160fa4a 523 #else
Wolfgang Betz 130:770ce14d3d15 524 advTimeout.attach(advTimeoutCB, params.getTimeout());
Wolfgang Betz 132:51056160fa4a 525 #endif
Wolfgang Betz 130:770ce14d3d15 526 }
Wolfgang Betz 130:770ce14d3d15 527
Wolfgang Betz 130:770ce14d3d15 528 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 529 }
Wolfgang Betz 130:770ce14d3d15 530
Wolfgang Betz 130:770ce14d3d15 531 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 532 /*!
Wolfgang Betz 130:770ce14d3d15 533 @brief Stops the BLE HW and disconnects from any devices
Wolfgang Betz 130:770ce14d3d15 534
Wolfgang Betz 130:770ce14d3d15 535 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 536
Wolfgang Betz 130:770ce14d3d15 537 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 538 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 539
Wolfgang Betz 130:770ce14d3d15 540 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 541
Wolfgang Betz 130:770ce14d3d15 542 @code
Wolfgang Betz 130:770ce14d3d15 543
Wolfgang Betz 130:770ce14d3d15 544 @endcode
Wolfgang Betz 130:770ce14d3d15 545 */
Wolfgang Betz 130:770ce14d3d15 546 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 547 ble_error_t BlueNRGGap::stopAdvertising(void)
Wolfgang Betz 130:770ce14d3d15 548 {
Wolfgang Betz 130:770ce14d3d15 549 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 550
Wolfgang Betz 130:770ce14d3d15 551 if(state.advertising == 1) {
Wolfgang Betz 130:770ce14d3d15 552 //Set non-discoverable to stop advertising
Wolfgang Betz 130:770ce14d3d15 553 ret = aci_gap_set_non_discoverable();
Wolfgang Betz 130:770ce14d3d15 554
Andrea Palmieri 187:2e517d3ddd71 555 if (BLE_STATUS_SUCCESS!=ret){
Wolfgang Betz 132:51056160fa4a 556 PRINTF("Error in stopping advertisement (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 557 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 558 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 559 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 560 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 561 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 562 default:
Andrea Palmieri 187:2e517d3ddd71 563 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 564 }
Wolfgang Betz 130:770ce14d3d15 565 }
Wolfgang Betz 132:51056160fa4a 566 PRINTF("Advertisement stopped!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 567 //Set GapState_t::advertising state
Wolfgang Betz 130:770ce14d3d15 568 state.advertising = 0;
Wolfgang Betz 130:770ce14d3d15 569 }
Wolfgang Betz 130:770ce14d3d15 570
Wolfgang Betz 130:770ce14d3d15 571 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 572 }
Wolfgang Betz 130:770ce14d3d15 573
Wolfgang Betz 130:770ce14d3d15 574 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 575 /*!
Wolfgang Betz 130:770ce14d3d15 576 @brief Disconnects if we are connected to a central device
Wolfgang Betz 130:770ce14d3d15 577
Wolfgang Betz 130:770ce14d3d15 578 @param[in] reason
Wolfgang Betz 130:770ce14d3d15 579 Disconnection Reason
Wolfgang Betz 130:770ce14d3d15 580
Wolfgang Betz 130:770ce14d3d15 581 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 582
Wolfgang Betz 130:770ce14d3d15 583 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 584 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 585
Wolfgang Betz 130:770ce14d3d15 586 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 587
Wolfgang Betz 130:770ce14d3d15 588 @code
Wolfgang Betz 130:770ce14d3d15 589
Wolfgang Betz 130:770ce14d3d15 590 @endcode
Wolfgang Betz 130:770ce14d3d15 591 */
Wolfgang Betz 130:770ce14d3d15 592 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 593 ble_error_t BlueNRGGap::disconnect(Gap::DisconnectionReason_t reason)
Wolfgang Betz 130:770ce14d3d15 594 {
Andrea Palmieri 142:adf1567d3900 595 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 596 (void)reason;
Andrea Palmieri 142:adf1567d3900 597
Wolfgang Betz 130:770ce14d3d15 598 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 599 //For Reason codes check BlueTooth HCI Spec
Wolfgang Betz 130:770ce14d3d15 600
Wolfgang Betz 130:770ce14d3d15 601 if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) {
Wolfgang Betz 130:770ce14d3d15 602 ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host.
Wolfgang Betz 130:770ce14d3d15 603
Andrea Palmieri 187:2e517d3ddd71 604 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 605 PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 606 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 607 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 608 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 609 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 610 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 611 default:
Andrea Palmieri 187:2e517d3ddd71 612 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 613 }
Wolfgang Betz 130:770ce14d3d15 614 }
Wolfgang Betz 130:770ce14d3d15 615
Wolfgang Betz 132:51056160fa4a 616 //PRINTF("Disconnected from localhost!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 617 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
Wolfgang Betz 130:770ce14d3d15 618 }
Wolfgang Betz 130:770ce14d3d15 619
Wolfgang Betz 130:770ce14d3d15 620 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 621 }
Wolfgang Betz 130:770ce14d3d15 622
Wolfgang Betz 130:770ce14d3d15 623 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 624 /*!
Wolfgang Betz 130:770ce14d3d15 625 @brief Disconnects if we are connected to a central device
Wolfgang Betz 130:770ce14d3d15 626
Wolfgang Betz 130:770ce14d3d15 627 @param[in] reason
Wolfgang Betz 130:770ce14d3d15 628 Disconnection Reason
Wolfgang Betz 130:770ce14d3d15 629
Wolfgang Betz 130:770ce14d3d15 630 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 631
Wolfgang Betz 130:770ce14d3d15 632 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 633 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 634
Wolfgang Betz 130:770ce14d3d15 635 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 636
Wolfgang Betz 130:770ce14d3d15 637 @code
Wolfgang Betz 130:770ce14d3d15 638
Wolfgang Betz 130:770ce14d3d15 639 @endcode
Wolfgang Betz 130:770ce14d3d15 640 */
Wolfgang Betz 130:770ce14d3d15 641 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 642 ble_error_t BlueNRGGap::disconnect(Handle_t connectionHandle, Gap::DisconnectionReason_t reason)
Wolfgang Betz 130:770ce14d3d15 643 {
Andrea Palmieri 142:adf1567d3900 644 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 645 (void)reason;
Andrea Palmieri 142:adf1567d3900 646
Wolfgang Betz 130:770ce14d3d15 647 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 648 //For Reason codes check BlueTooth HCI Spec
Wolfgang Betz 130:770ce14d3d15 649
Wolfgang Betz 130:770ce14d3d15 650 if(connectionHandle != BLE_CONN_HANDLE_INVALID) {
Wolfgang Betz 130:770ce14d3d15 651 ret = aci_gap_terminate(connectionHandle, 0x16);//0x16 Connection Terminated by Local Host.
Wolfgang Betz 130:770ce14d3d15 652
Andrea Palmieri 187:2e517d3ddd71 653 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 654 PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 655 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 656 case ERR_COMMAND_DISALLOWED:
Andrea Palmieri 187:2e517d3ddd71 657 return BLE_ERROR_OPERATION_NOT_PERMITTED;
Andrea Palmieri 187:2e517d3ddd71 658 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 659 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 660 default:
Andrea Palmieri 187:2e517d3ddd71 661 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 662 }
Wolfgang Betz 130:770ce14d3d15 663 }
Wolfgang Betz 130:770ce14d3d15 664
Wolfgang Betz 132:51056160fa4a 665 //PRINTF("Disconnected from localhost!!\n\r") ;
Wolfgang Betz 130:770ce14d3d15 666 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
Wolfgang Betz 130:770ce14d3d15 667 }
Wolfgang Betz 130:770ce14d3d15 668
Wolfgang Betz 130:770ce14d3d15 669 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 670 }
Wolfgang Betz 130:770ce14d3d15 671
Wolfgang Betz 130:770ce14d3d15 672 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 673 /*!
Wolfgang Betz 130:770ce14d3d15 674 @brief Sets the 16-bit connection handle
Wolfgang Betz 130:770ce14d3d15 675
Wolfgang Betz 130:770ce14d3d15 676 @param[in] con_handle
Wolfgang Betz 130:770ce14d3d15 677 Connection Handle which is set in the Gap Instance
Wolfgang Betz 130:770ce14d3d15 678
Wolfgang Betz 130:770ce14d3d15 679 @returns void
Wolfgang Betz 130:770ce14d3d15 680 */
Wolfgang Betz 130:770ce14d3d15 681 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 682 void BlueNRGGap::setConnectionHandle(uint16_t con_handle)
Wolfgang Betz 130:770ce14d3d15 683 {
Wolfgang Betz 130:770ce14d3d15 684 m_connectionHandle = con_handle;
Wolfgang Betz 130:770ce14d3d15 685 }
Wolfgang Betz 130:770ce14d3d15 686
Wolfgang Betz 130:770ce14d3d15 687 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 688 /*!
Wolfgang Betz 130:770ce14d3d15 689 @brief Gets the 16-bit connection handle
Wolfgang Betz 130:770ce14d3d15 690
Wolfgang Betz 130:770ce14d3d15 691 @param[in] void
Wolfgang Betz 130:770ce14d3d15 692
Wolfgang Betz 130:770ce14d3d15 693 @returns uint16_t
Wolfgang Betz 130:770ce14d3d15 694 Connection Handle of the Gap Instance
Wolfgang Betz 130:770ce14d3d15 695 */
Wolfgang Betz 130:770ce14d3d15 696 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 697 uint16_t BlueNRGGap::getConnectionHandle(void)
Wolfgang Betz 130:770ce14d3d15 698 {
Wolfgang Betz 130:770ce14d3d15 699 return m_connectionHandle;
Wolfgang Betz 130:770ce14d3d15 700 }
Wolfgang Betz 130:770ce14d3d15 701
Wolfgang Betz 130:770ce14d3d15 702 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 703 /*!
Wolfgang Betz 130:770ce14d3d15 704 @brief Sets the BLE device address. SetAddress will reset the BLE
Wolfgang Betz 130:770ce14d3d15 705 device and re-initialize BTLE. Will not start advertising.
Wolfgang Betz 130:770ce14d3d15 706
Wolfgang Betz 130:770ce14d3d15 707 @param[in] type
Wolfgang Betz 130:770ce14d3d15 708 Type of Address
Wolfgang Betz 130:770ce14d3d15 709
Wolfgang Betz 130:770ce14d3d15 710 @param[in] address[6]
Wolfgang Betz 130:770ce14d3d15 711 Value of the Address to be set
Wolfgang Betz 130:770ce14d3d15 712
Wolfgang Betz 130:770ce14d3d15 713 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 714
Wolfgang Betz 130:770ce14d3d15 715 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 716
Wolfgang Betz 130:770ce14d3d15 717 @code
Wolfgang Betz 130:770ce14d3d15 718
Wolfgang Betz 130:770ce14d3d15 719 @endcode
Wolfgang Betz 130:770ce14d3d15 720 */
Wolfgang Betz 130:770ce14d3d15 721 /**************************************************************************/
Wolfgang Betz 132:51056160fa4a 722 ble_error_t BlueNRGGap::setAddress(AddressType_t type, const Address_t address)
Wolfgang Betz 130:770ce14d3d15 723 {
Andrea Palmieri 210:08c4c85ca679 724 if (type > BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE) {
Wolfgang Betz 130:770ce14d3d15 725 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 726 }
Wolfgang Betz 130:770ce14d3d15 727
Wolfgang Betz 132:51056160fa4a 728 addr_type = type;
Wolfgang Betz 130:770ce14d3d15 729 //copy address to bdAddr[6]
Wolfgang Betz 130:770ce14d3d15 730 for(int i=0; i<BDADDR_SIZE; i++) {
Wolfgang Betz 130:770ce14d3d15 731 bdaddr[i] = address[i];
Wolfgang Betz 132:51056160fa4a 732 //PRINTF("i[%d]:0x%x\n\r",i,bdaddr[i]);
Wolfgang Betz 130:770ce14d3d15 733 }
Wolfgang Betz 130:770ce14d3d15 734
Wolfgang Betz 130:770ce14d3d15 735 if(!isSetAddress) isSetAddress = true;
Wolfgang Betz 130:770ce14d3d15 736
Wolfgang Betz 130:770ce14d3d15 737 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 738 }
Wolfgang Betz 130:770ce14d3d15 739
Wolfgang Betz 130:770ce14d3d15 740 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 741 /*!
Wolfgang Betz 130:770ce14d3d15 742 @brief Returns boolean if the address of the device has been set
Wolfgang Betz 130:770ce14d3d15 743 or not
Wolfgang Betz 130:770ce14d3d15 744
Wolfgang Betz 130:770ce14d3d15 745 @returns bool
Wolfgang Betz 130:770ce14d3d15 746
Wolfgang Betz 130:770ce14d3d15 747 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 748
Wolfgang Betz 130:770ce14d3d15 749 @code
Wolfgang Betz 130:770ce14d3d15 750
Wolfgang Betz 130:770ce14d3d15 751 @endcode
Wolfgang Betz 130:770ce14d3d15 752 */
Wolfgang Betz 130:770ce14d3d15 753 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 754 bool BlueNRGGap::getIsSetAddress()
Wolfgang Betz 130:770ce14d3d15 755 {
Wolfgang Betz 130:770ce14d3d15 756 return isSetAddress;
Wolfgang Betz 130:770ce14d3d15 757 }
Wolfgang Betz 130:770ce14d3d15 758
Wolfgang Betz 130:770ce14d3d15 759 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 760 /*!
Wolfgang Betz 130:770ce14d3d15 761 @brief Returns the address of the device if set
Wolfgang Betz 130:770ce14d3d15 762
Wolfgang Betz 130:770ce14d3d15 763 @returns Pointer to the address if Address is set else NULL
Wolfgang Betz 130:770ce14d3d15 764
Wolfgang Betz 130:770ce14d3d15 765 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 766
Wolfgang Betz 130:770ce14d3d15 767 @code
Wolfgang Betz 130:770ce14d3d15 768
Wolfgang Betz 130:770ce14d3d15 769 @endcode
Wolfgang Betz 130:770ce14d3d15 770 */
Wolfgang Betz 130:770ce14d3d15 771 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 772 ble_error_t BlueNRGGap::getAddress(AddressType_t *typeP, Address_t address)
Wolfgang Betz 130:770ce14d3d15 773 {
Wolfgang Betz 132:51056160fa4a 774 *typeP = addr_type;//Gap::ADDR_TYPE_PUBLIC;
Wolfgang Betz 130:770ce14d3d15 775
Wolfgang Betz 130:770ce14d3d15 776 if(isSetAddress)
Wolfgang Betz 130:770ce14d3d15 777 {
Wolfgang Betz 130:770ce14d3d15 778 for(int i=0; i<BDADDR_SIZE; i++) {
Wolfgang Betz 130:770ce14d3d15 779 address[i] = bdaddr[i];
Wolfgang Betz 132:51056160fa4a 780 //PRINTF("i[%d]:0x%x\n\r",i,bdaddr[i]);
Wolfgang Betz 130:770ce14d3d15 781 }
Wolfgang Betz 130:770ce14d3d15 782 }
Wolfgang Betz 130:770ce14d3d15 783
Wolfgang Betz 130:770ce14d3d15 784 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 785 }
Wolfgang Betz 130:770ce14d3d15 786
Wolfgang Betz 130:770ce14d3d15 787 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 788 /*!
Wolfgang Betz 130:770ce14d3d15 789 @brief obtains preferred connection params
Wolfgang Betz 130:770ce14d3d15 790
Wolfgang Betz 130:770ce14d3d15 791 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 792
Wolfgang Betz 130:770ce14d3d15 793 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 794
Wolfgang Betz 130:770ce14d3d15 795 @code
Wolfgang Betz 130:770ce14d3d15 796
Wolfgang Betz 130:770ce14d3d15 797 @endcode
Wolfgang Betz 130:770ce14d3d15 798 */
Wolfgang Betz 130:770ce14d3d15 799 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 800 ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 801 {
Andrea Palmieri 142:adf1567d3900 802 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 803 (void)params;
Andrea Palmieri 142:adf1567d3900 804
Wolfgang Betz 130:770ce14d3d15 805 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 806 }
Wolfgang Betz 130:770ce14d3d15 807
Wolfgang Betz 130:770ce14d3d15 808
Wolfgang Betz 130:770ce14d3d15 809 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 810 /*!
Wolfgang Betz 130:770ce14d3d15 811 @brief sets preferred connection params
Wolfgang Betz 130:770ce14d3d15 812
Wolfgang Betz 130:770ce14d3d15 813 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 814
Wolfgang Betz 130:770ce14d3d15 815 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 816
Wolfgang Betz 130:770ce14d3d15 817 @code
Wolfgang Betz 130:770ce14d3d15 818
Wolfgang Betz 130:770ce14d3d15 819 @endcode
Wolfgang Betz 130:770ce14d3d15 820 */
Wolfgang Betz 130:770ce14d3d15 821 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 822 ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 823 {
Andrea Palmieri 142:adf1567d3900 824 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 825 (void)params;
Andrea Palmieri 142:adf1567d3900 826
Wolfgang Betz 130:770ce14d3d15 827 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 828 }
Wolfgang Betz 130:770ce14d3d15 829
Wolfgang Betz 130:770ce14d3d15 830 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 831 /*!
Wolfgang Betz 130:770ce14d3d15 832 @brief updates preferred connection params
Wolfgang Betz 130:770ce14d3d15 833
Wolfgang Betz 130:770ce14d3d15 834 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 835
Wolfgang Betz 130:770ce14d3d15 836 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 837
Wolfgang Betz 130:770ce14d3d15 838 @code
Wolfgang Betz 130:770ce14d3d15 839
Wolfgang Betz 130:770ce14d3d15 840 @endcode
Wolfgang Betz 130:770ce14d3d15 841 */
Wolfgang Betz 130:770ce14d3d15 842 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 843 ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params)
Wolfgang Betz 130:770ce14d3d15 844 {
Andrea Palmieri 142:adf1567d3900 845 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 846 (void) handle;
Andrea Palmieri 142:adf1567d3900 847 (void)params;
Andrea Palmieri 142:adf1567d3900 848
Wolfgang Betz 130:770ce14d3d15 849 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 850 }
Wolfgang Betz 130:770ce14d3d15 851
Wolfgang Betz 130:770ce14d3d15 852 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 853 /*!
Wolfgang Betz 130:770ce14d3d15 854 @brief Sets the Device Name Characteristic
Wolfgang Betz 130:770ce14d3d15 855
Wolfgang Betz 130:770ce14d3d15 856 @param[in] deviceName
Wolfgang Betz 130:770ce14d3d15 857 pointer to device name to be set
Wolfgang Betz 130:770ce14d3d15 858
Wolfgang Betz 130:770ce14d3d15 859 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 860
Wolfgang Betz 130:770ce14d3d15 861 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 862 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 863
Wolfgang Betz 130:770ce14d3d15 864 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 865
Wolfgang Betz 130:770ce14d3d15 866 @code
Wolfgang Betz 130:770ce14d3d15 867
Wolfgang Betz 130:770ce14d3d15 868 @endcode
Wolfgang Betz 130:770ce14d3d15 869 */
Wolfgang Betz 130:770ce14d3d15 870 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 871 ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName)
Wolfgang Betz 130:770ce14d3d15 872 {
Andrea Palmieri 187:2e517d3ddd71 873 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 874 uint8_t nameLen = 0;
Wolfgang Betz 130:770ce14d3d15 875
Wolfgang Betz 130:770ce14d3d15 876 DeviceName = (uint8_t *)deviceName;
Wolfgang Betz 132:51056160fa4a 877 //PRINTF("SetDeviceName=%s\n\r", DeviceName);
Wolfgang Betz 130:770ce14d3d15 878
Wolfgang Betz 130:770ce14d3d15 879 nameLen = strlen((const char*)DeviceName);
Wolfgang Betz 132:51056160fa4a 880 //PRINTF("DeviceName Size=%d\n\r", nameLen);
Wolfgang Betz 130:770ce14d3d15 881
Wolfgang Betz 130:770ce14d3d15 882 ret = aci_gatt_update_char_value(g_gap_service_handle,
Wolfgang Betz 130:770ce14d3d15 883 g_device_name_char_handle,
Wolfgang Betz 130:770ce14d3d15 884 0,
Wolfgang Betz 130:770ce14d3d15 885 nameLen,
Wolfgang Betz 130:770ce14d3d15 886 (uint8_t *)DeviceName);
Andrea Palmieri 187:2e517d3ddd71 887
Andrea Palmieri 187:2e517d3ddd71 888 if (BLE_STATUS_SUCCESS != ret){
Andrea Palmieri 187:2e517d3ddd71 889 PRINTF("device set name failed (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 890 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 891 case BLE_STATUS_INVALID_HANDLE:
Andrea Palmieri 187:2e517d3ddd71 892 case BLE_STATUS_INVALID_PARAMETER:
Andrea Palmieri 187:2e517d3ddd71 893 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 894 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Andrea Palmieri 187:2e517d3ddd71 895 return BLE_ERROR_NO_MEM;
Andrea Palmieri 187:2e517d3ddd71 896 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 897 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 898 default:
Andrea Palmieri 187:2e517d3ddd71 899 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 900 }
Wolfgang Betz 130:770ce14d3d15 901 }
Wolfgang Betz 130:770ce14d3d15 902
Wolfgang Betz 130:770ce14d3d15 903 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 904 }
Wolfgang Betz 130:770ce14d3d15 905
Wolfgang Betz 130:770ce14d3d15 906 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 907 /*!
Wolfgang Betz 130:770ce14d3d15 908 @brief Gets the Device Name Characteristic
Wolfgang Betz 130:770ce14d3d15 909
Wolfgang Betz 130:770ce14d3d15 910 @param[in] deviceName
Wolfgang Betz 130:770ce14d3d15 911 pointer to device name
Wolfgang Betz 130:770ce14d3d15 912
Wolfgang Betz 130:770ce14d3d15 913 @param[in] lengthP
Wolfgang Betz 130:770ce14d3d15 914 pointer to device name length
Wolfgang Betz 130:770ce14d3d15 915
Wolfgang Betz 130:770ce14d3d15 916 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 917
Wolfgang Betz 130:770ce14d3d15 918 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 919 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 920
Wolfgang Betz 130:770ce14d3d15 921 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 922
Wolfgang Betz 130:770ce14d3d15 923 @code
Wolfgang Betz 130:770ce14d3d15 924
Wolfgang Betz 130:770ce14d3d15 925 @endcode
Wolfgang Betz 130:770ce14d3d15 926 */
Wolfgang Betz 130:770ce14d3d15 927 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 928 ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
Wolfgang Betz 130:770ce14d3d15 929 {
Wolfgang Betz 130:770ce14d3d15 930 if(DeviceName==NULL)
Andrea Palmieri 187:2e517d3ddd71 931 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 130:770ce14d3d15 932
Wolfgang Betz 130:770ce14d3d15 933 strcpy((char*)deviceName, (const char*)DeviceName);
Wolfgang Betz 132:51056160fa4a 934 //PRINTF("GetDeviceName=%s\n\r", deviceName);
Wolfgang Betz 130:770ce14d3d15 935
Wolfgang Betz 130:770ce14d3d15 936 *lengthP = strlen((const char*)DeviceName);
Wolfgang Betz 132:51056160fa4a 937 //PRINTF("DeviceName Size=%d\n\r", *lengthP);
Wolfgang Betz 130:770ce14d3d15 938
Wolfgang Betz 130:770ce14d3d15 939 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 940 }
Wolfgang Betz 130:770ce14d3d15 941
Wolfgang Betz 130:770ce14d3d15 942 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 943 /*!
Wolfgang Betz 130:770ce14d3d15 944 @brief Sets the Device Appearance Characteristic
Wolfgang Betz 130:770ce14d3d15 945
Wolfgang Betz 130:770ce14d3d15 946 @param[in] appearance
Wolfgang Betz 130:770ce14d3d15 947 device appearance
Wolfgang Betz 130:770ce14d3d15 948
Wolfgang Betz 130:770ce14d3d15 949 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 950
Wolfgang Betz 130:770ce14d3d15 951 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 952 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 953
Wolfgang Betz 130:770ce14d3d15 954 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 955
Wolfgang Betz 130:770ce14d3d15 956 @code
Wolfgang Betz 130:770ce14d3d15 957
Wolfgang Betz 130:770ce14d3d15 958 @endcode
Wolfgang Betz 130:770ce14d3d15 959 */
Wolfgang Betz 130:770ce14d3d15 960 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 961 ble_error_t BlueNRGGap::setAppearance(GapAdvertisingData::Appearance appearance)
Wolfgang Betz 130:770ce14d3d15 962 {
Andrea Palmieri 187:2e517d3ddd71 963 tBleStatus ret;
Andrea Palmieri 187:2e517d3ddd71 964
Wolfgang Betz 130:770ce14d3d15 965 /*
Wolfgang Betz 130:770ce14d3d15 966 Tested with GapAdvertisingData::GENERIC_PHONE.
Wolfgang Betz 130:770ce14d3d15 967 for other appearances BLE Scanner android app is not behaving properly
Wolfgang Betz 130:770ce14d3d15 968 */
Wolfgang Betz 130:770ce14d3d15 969 //char deviceAppearance[2];
Wolfgang Betz 130:770ce14d3d15 970 STORE_LE_16(deviceAppearance, appearance);
Wolfgang Betz 132:51056160fa4a 971 PRINTF("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]);
Wolfgang Betz 130:770ce14d3d15 972
Andrea Palmieri 187:2e517d3ddd71 973 ret = aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (uint8_t *)deviceAppearance);
Andrea Palmieri 187:2e517d3ddd71 974 if (BLE_STATUS_SUCCESS == ret){
Andrea Palmieri 187:2e517d3ddd71 975 return BLE_ERROR_NONE;
Andrea Palmieri 187:2e517d3ddd71 976 }
Andrea Palmieri 187:2e517d3ddd71 977
Andrea Palmieri 187:2e517d3ddd71 978 PRINTF("setAppearance failed (ret=0x%x)!!\n\r", ret) ;
Andrea Palmieri 187:2e517d3ddd71 979 switch (ret) {
Andrea Palmieri 187:2e517d3ddd71 980 case BLE_STATUS_INVALID_HANDLE:
Andrea Palmieri 187:2e517d3ddd71 981 case BLE_STATUS_INVALID_PARAMETER:
Andrea Palmieri 187:2e517d3ddd71 982 return BLE_ERROR_INVALID_PARAM;
Andrea Palmieri 187:2e517d3ddd71 983 case BLE_STATUS_INSUFFICIENT_RESOURCES:
Andrea Palmieri 187:2e517d3ddd71 984 return BLE_ERROR_NO_MEM;
Andrea Palmieri 187:2e517d3ddd71 985 case BLE_STATUS_TIMEOUT:
Andrea Palmieri 187:2e517d3ddd71 986 return BLE_STACK_BUSY;
Andrea Palmieri 187:2e517d3ddd71 987 default:
Andrea Palmieri 187:2e517d3ddd71 988 return BLE_ERROR_UNSPECIFIED;
Andrea Palmieri 187:2e517d3ddd71 989 }
Wolfgang Betz 130:770ce14d3d15 990 }
Wolfgang Betz 130:770ce14d3d15 991
Wolfgang Betz 130:770ce14d3d15 992 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 993 /*!
Wolfgang Betz 130:770ce14d3d15 994 @brief Gets the Device Appearance Characteristic
Wolfgang Betz 130:770ce14d3d15 995
Wolfgang Betz 130:770ce14d3d15 996 @param[in] appearance
Wolfgang Betz 130:770ce14d3d15 997 pointer to device appearance value
Wolfgang Betz 130:770ce14d3d15 998
Wolfgang Betz 130:770ce14d3d15 999 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 1000
Wolfgang Betz 130:770ce14d3d15 1001 @retval BLE_ERROR_NONE
Wolfgang Betz 130:770ce14d3d15 1002 Everything executed properly
Wolfgang Betz 130:770ce14d3d15 1003
Wolfgang Betz 130:770ce14d3d15 1004 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 1005
Wolfgang Betz 130:770ce14d3d15 1006 @code
Wolfgang Betz 130:770ce14d3d15 1007
Wolfgang Betz 130:770ce14d3d15 1008 @endcode
Wolfgang Betz 130:770ce14d3d15 1009 */
Wolfgang Betz 130:770ce14d3d15 1010 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1011 ble_error_t BlueNRGGap::getAppearance(GapAdvertisingData::Appearance *appearanceP)
Wolfgang Betz 130:770ce14d3d15 1012 {
Wolfgang Betz 130:770ce14d3d15 1013 uint16_t devP;
Wolfgang Betz 130:770ce14d3d15 1014 if(!appearanceP) return BLE_ERROR_PARAM_OUT_OF_RANGE;
Wolfgang Betz 130:770ce14d3d15 1015 devP = ((uint16_t)(0x0000|deviceAppearance[0])) | (((uint16_t)(0x0000|deviceAppearance[1]))<<8);
Wolfgang Betz 130:770ce14d3d15 1016 strcpy((char*)appearanceP, (const char*)&devP);
Wolfgang Betz 130:770ce14d3d15 1017
Wolfgang Betz 130:770ce14d3d15 1018 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 1019 }
Wolfgang Betz 130:770ce14d3d15 1020
Wolfgang Betz 130:770ce14d3d15 1021 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1022 /*!
Wolfgang Betz 130:770ce14d3d15 1023 @brief Gets the value of maximum advertising interval in ms
Wolfgang Betz 130:770ce14d3d15 1024
Wolfgang Betz 130:770ce14d3d15 1025 @returns uint16_t
Wolfgang Betz 130:770ce14d3d15 1026
Wolfgang Betz 130:770ce14d3d15 1027 @retval value of maximum advertising interval in ms
Wolfgang Betz 130:770ce14d3d15 1028
Wolfgang Betz 130:770ce14d3d15 1029 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 1030
Wolfgang Betz 130:770ce14d3d15 1031 @code
Wolfgang Betz 130:770ce14d3d15 1032
Wolfgang Betz 130:770ce14d3d15 1033 @endcode
Wolfgang Betz 130:770ce14d3d15 1034 */
Wolfgang Betz 130:770ce14d3d15 1035 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1036 uint16_t BlueNRGGap::getMaxAdvertisingInterval(void) const {
Wolfgang Betz 130:770ce14d3d15 1037 return advtInterval;
Wolfgang Betz 130:770ce14d3d15 1038 }
Wolfgang Betz 130:770ce14d3d15 1039
Wolfgang Betz 130:770ce14d3d15 1040
Wolfgang Betz 130:770ce14d3d15 1041 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1042 /*!
Wolfgang Betz 130:770ce14d3d15 1043 @brief Gets the value of minimum advertising interval in ms
Wolfgang Betz 130:770ce14d3d15 1044
Wolfgang Betz 130:770ce14d3d15 1045 @returns uint16_t
Wolfgang Betz 130:770ce14d3d15 1046
Wolfgang Betz 130:770ce14d3d15 1047 @retval value of minimum advertising interval in ms
Wolfgang Betz 130:770ce14d3d15 1048
Wolfgang Betz 130:770ce14d3d15 1049 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 1050
Wolfgang Betz 130:770ce14d3d15 1051 @code
Wolfgang Betz 130:770ce14d3d15 1052
Wolfgang Betz 130:770ce14d3d15 1053 @endcode
Wolfgang Betz 130:770ce14d3d15 1054 */
Wolfgang Betz 130:770ce14d3d15 1055 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1056 uint16_t BlueNRGGap::getMinAdvertisingInterval(void) const {
Wolfgang Betz 130:770ce14d3d15 1057 return 0; // minimum Advertising interval is 0
Wolfgang Betz 130:770ce14d3d15 1058 }
Wolfgang Betz 130:770ce14d3d15 1059
Wolfgang Betz 130:770ce14d3d15 1060 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1061 /*!
Wolfgang Betz 130:770ce14d3d15 1062 @brief Gets the value of minimum non connectable advertising interval in ms
Wolfgang Betz 130:770ce14d3d15 1063
Wolfgang Betz 130:770ce14d3d15 1064 @returns uint16_t
Wolfgang Betz 130:770ce14d3d15 1065
Wolfgang Betz 130:770ce14d3d15 1066 @retval value of minimum non connectable advertising interval in ms
Wolfgang Betz 130:770ce14d3d15 1067
Wolfgang Betz 130:770ce14d3d15 1068 @section EXAMPLE
Wolfgang Betz 130:770ce14d3d15 1069
Wolfgang Betz 130:770ce14d3d15 1070 @code
Wolfgang Betz 130:770ce14d3d15 1071
Wolfgang Betz 130:770ce14d3d15 1072 @endcode
Wolfgang Betz 130:770ce14d3d15 1073 */
Wolfgang Betz 130:770ce14d3d15 1074 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1075 uint16_t BlueNRGGap::getMinNonConnectableAdvertisingInterval(void) const {
Wolfgang Betz 130:770ce14d3d15 1076 return BLE_GAP_ADV_NONCON_INTERVAL_MIN;
Wolfgang Betz 130:770ce14d3d15 1077 }
Wolfgang Betz 130:770ce14d3d15 1078
Andrea Palmieri 160:174387d53809 1079 GapScanningParams* BlueNRGGap::getScanningParams(void)
Andrea Palmieri 160:174387d53809 1080 {
Andrea Palmieri 160:174387d53809 1081 return &_scanningParams;
Andrea Palmieri 160:174387d53809 1082 }
Andrea Palmieri 160:174387d53809 1083
Andrea Palmieri 181:749071129d2e 1084 static void radioScanning(void)
Andrea Palmieri 160:174387d53809 1085 {
Andrea Palmieri 160:174387d53809 1086 GapScanningParams* scanningParams = BlueNRGGap::getInstance().getScanningParams();
Andrea Palmieri 160:174387d53809 1087
Andrea Palmieri 187:2e517d3ddd71 1088 BlueNRGGap::getInstance().startRadioScan(*scanningParams);
Andrea Palmieri 160:174387d53809 1089 }
Andrea Palmieri 160:174387d53809 1090
Wolfgang Betz 165:3576598c0889 1091 static void makeConnection(void)
Wolfgang Betz 162:667f97a4db7f 1092 {
Wolfgang Betz 165:3576598c0889 1093 BlueNRGGap::getInstance().createConnection();
Wolfgang Betz 162:667f97a4db7f 1094 }
Wolfgang Betz 162:667f97a4db7f 1095
Wolfgang Betz 130:770ce14d3d15 1096 // ANDREA
Wolfgang Betz 132:51056160fa4a 1097 void BlueNRGGap::Discovery_CB(Reason_t reason,
Wolfgang Betz 132:51056160fa4a 1098 uint8_t adv_type,
Wolfgang Betz 132:51056160fa4a 1099 uint8_t *addr_type,
Wolfgang Betz 132:51056160fa4a 1100 uint8_t *addr,
Wolfgang Betz 132:51056160fa4a 1101 uint8_t *data_length,
Wolfgang Betz 132:51056160fa4a 1102 uint8_t *data,
Wolfgang Betz 132:51056160fa4a 1103 uint8_t *RSSI)
Wolfgang Betz 132:51056160fa4a 1104 {
Andrea Palmieri 142:adf1567d3900 1105 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 1106 (void)addr_type;
Wolfgang Betz 132:51056160fa4a 1107
Wolfgang Betz 132:51056160fa4a 1108 switch (reason) {
Wolfgang Betz 132:51056160fa4a 1109 case DEVICE_FOUND:
Wolfgang Betz 132:51056160fa4a 1110 {
Wolfgang Betz 132:51056160fa4a 1111 GapAdvertisingParams::AdvertisingType_t type;
Wolfgang Betz 132:51056160fa4a 1112 bool isScanResponse = false;
Wolfgang Betz 132:51056160fa4a 1113 switch(adv_type) {
Wolfgang Betz 132:51056160fa4a 1114 case ADV_IND:
Wolfgang Betz 132:51056160fa4a 1115 type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1116 break;
Wolfgang Betz 132:51056160fa4a 1117 case ADV_DIRECT_IND:
Wolfgang Betz 132:51056160fa4a 1118 type = GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED;
Wolfgang Betz 132:51056160fa4a 1119 break;
Wolfgang Betz 132:51056160fa4a 1120 case ADV_SCAN_IND:
Wolfgang Betz 132:51056160fa4a 1121 case SCAN_RSP:
Wolfgang Betz 132:51056160fa4a 1122 type = GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1123 isScanResponse = true;
Wolfgang Betz 132:51056160fa4a 1124 break;
Wolfgang Betz 132:51056160fa4a 1125 case ADV_NONCONN_IND:
Wolfgang Betz 132:51056160fa4a 1126 type = GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED;
Andrea Palmieri 142:adf1567d3900 1127 break;
Andrea Palmieri 142:adf1567d3900 1128 default:
Andrea Palmieri 142:adf1567d3900 1129 type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED;
Wolfgang Betz 132:51056160fa4a 1130 }
Wolfgang Betz 132:51056160fa4a 1131
Wolfgang Betz 132:51056160fa4a 1132 PRINTF("adv peerAddr[%02x %02x %02x %02x %02x %02x] \r\n",
Wolfgang Betz 132:51056160fa4a 1133 addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
Wolfgang Betz 132:51056160fa4a 1134 processAdvertisementReport(addr, *RSSI, isScanResponse, type, *data_length, data);
Andrea Palmieri 160:174387d53809 1135 PRINTF("!!!After processAdvertisementReport\n\r");
Wolfgang Betz 132:51056160fa4a 1136 }
Wolfgang Betz 132:51056160fa4a 1137 break;
Wolfgang Betz 132:51056160fa4a 1138
Wolfgang Betz 132:51056160fa4a 1139 case DISCOVERY_COMPLETE:
Wolfgang Betz 132:51056160fa4a 1140 // The discovery is complete. If this is due to a stop scanning (i.e., the device
Wolfgang Betz 132:51056160fa4a 1141 // we are interested in has been found) and a connection has been requested
Wolfgang Betz 132:51056160fa4a 1142 // then we start the device connection. Otherwise, we restart the scanning.
Andrea Palmieri 145:024a552e4715 1143 PRINTF("DISCOVERY_COMPLETE\n\r");
Wolfgang Betz 132:51056160fa4a 1144 _scanning = false;
Wolfgang Betz 132:51056160fa4a 1145
Wolfgang Betz 165:3576598c0889 1146 // Since the DISCOVERY_COMPLETE event can be received during the scanning interval,
Wolfgang Betz 165:3576598c0889 1147 // we need to delay the starting of connection or re-scanning procedures
Wolfgang Betz 165:3576598c0889 1148 uint16_t delay = 2*(_scanningParams.getInterval());
Wolfgang Betz 165:3576598c0889 1149
Wolfgang Betz 162:667f97a4db7f 1150 if(_connecting) {
Wolfgang Betz 165:3576598c0889 1151 minar::Scheduler::postCallback(makeConnection).delay(minar::milliseconds(delay));
Wolfgang Betz 132:51056160fa4a 1152 } else {
Wolfgang Betz 165:3576598c0889 1153 minar::Scheduler::postCallback(radioScanning).delay(minar::milliseconds(delay));
Wolfgang Betz 132:51056160fa4a 1154 }
Wolfgang Betz 132:51056160fa4a 1155
Wolfgang Betz 132:51056160fa4a 1156 break;
Wolfgang Betz 132:51056160fa4a 1157 }
Wolfgang Betz 132:51056160fa4a 1158 }
Wolfgang Betz 132:51056160fa4a 1159
Wolfgang Betz 132:51056160fa4a 1160 ble_error_t BlueNRGGap::startRadioScan(const GapScanningParams &scanningParams)
Wolfgang Betz 132:51056160fa4a 1161 {
Wolfgang Betz 132:51056160fa4a 1162
Wolfgang Betz 165:3576598c0889 1163 tBleStatus ret = BLE_STATUS_SUCCESS;
Wolfgang Betz 163:4c008b1089e9 1164
Andrea Palmieri 152:4afc5c2fc4f3 1165 PRINTF("Scanning...\n\r");
Wolfgang Betz 163:4c008b1089e9 1166
Wolfgang Betz 132:51056160fa4a 1167 // We received a start scan request from the application level.
Wolfgang Betz 132:51056160fa4a 1168 // If we are on X-NUCLEO-IDB04A1 (playing a single role at time),
Wolfgang Betz 132:51056160fa4a 1169 // we need to re-init our expansion board to specify the GAP CENTRAL ROLE
Andrea Palmieri 145:024a552e4715 1170 if(!btle_reinited) {
Andrea Palmieri 145:024a552e4715 1171 btle_init(isSetAddress, GAP_CENTRAL_ROLE_IDB04A1);
Andrea Palmieri 145:024a552e4715 1172 btle_reinited = true;
Wolfgang Betz 163:4c008b1089e9 1173
Andrea Palmieri 145:024a552e4715 1174 PRINTF("BTLE re-init\n\r");
Andrea Palmieri 145:024a552e4715 1175 }
Wolfgang Betz 132:51056160fa4a 1176
Andrea Palmieri 181:749071129d2e 1177 ret = aci_gap_start_general_discovery_proc(scanningParams.getInterval(),
Wolfgang Betz 163:4c008b1089e9 1178 scanningParams.getWindow(),
Wolfgang Betz 163:4c008b1089e9 1179 addr_type,
Wolfgang Betz 163:4c008b1089e9 1180 1); // 1 to filter duplicates
Wolfgang Betz 156:662bb3992a03 1181
Wolfgang Betz 132:51056160fa4a 1182 if (ret != BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 1183 printf("Start Discovery Procedure failed (0x%02X)\n\r", ret);
Wolfgang Betz 132:51056160fa4a 1184 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1185 } else {
Wolfgang Betz 132:51056160fa4a 1186 PRINTF("Discovery Procedure Started\n");
Wolfgang Betz 132:51056160fa4a 1187 _scanning = true;
Wolfgang Betz 130:770ce14d3d15 1188 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1189 }
Wolfgang Betz 130:770ce14d3d15 1190 }
Wolfgang Betz 130:770ce14d3d15 1191
Wolfgang Betz 130:770ce14d3d15 1192 ble_error_t BlueNRGGap::stopScan() {
Wolfgang Betz 165:3576598c0889 1193 tBleStatus ret = BLE_STATUS_SUCCESS;
Wolfgang Betz 132:51056160fa4a 1194
Wolfgang Betz 132:51056160fa4a 1195 ret = aci_gap_terminate_gap_procedure(GENERAL_DISCOVERY_PROCEDURE);
Wolfgang Betz 132:51056160fa4a 1196
Wolfgang Betz 132:51056160fa4a 1197 if (ret != BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 1198 printf("GAP Terminate Gap Procedure failed\n");
Wolfgang Betz 132:51056160fa4a 1199 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1200 } else {
Wolfgang Betz 132:51056160fa4a 1201 PRINTF("Discovery Procedure Terminated\n");
Wolfgang Betz 130:770ce14d3d15 1202 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1203 }
Wolfgang Betz 130:770ce14d3d15 1204 }
Wolfgang Betz 130:770ce14d3d15 1205
Wolfgang Betz 130:770ce14d3d15 1206 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1207 /*!
Wolfgang Betz 130:770ce14d3d15 1208 @brief set Tx power level
Wolfgang Betz 130:770ce14d3d15 1209 @param[in] txPower Transmission Power level
Wolfgang Betz 130:770ce14d3d15 1210 @returns ble_error_t
Wolfgang Betz 130:770ce14d3d15 1211 */
Wolfgang Betz 130:770ce14d3d15 1212 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1213 ble_error_t BlueNRGGap::setTxPower(int8_t txPower)
Wolfgang Betz 130:770ce14d3d15 1214 {
Wolfgang Betz 130:770ce14d3d15 1215 tBleStatus ret;
Wolfgang Betz 130:770ce14d3d15 1216
Wolfgang Betz 130:770ce14d3d15 1217 int8_t enHighPower = 0;
Andrea Palmieri 201:a9bc2e8b01d7 1218 int8_t paLevel = 0;
Andrea Palmieri 201:a9bc2e8b01d7 1219
Wolfgang Betz 130:770ce14d3d15 1220 int8_t dbmActuallySet = getHighPowerAndPALevelValue(txPower, enHighPower, paLevel);
Andrea Palmieri 201:a9bc2e8b01d7 1221
Andrea Palmieri 201:a9bc2e8b01d7 1222 #ifndef DEBUG
Andrea Palmieri 145:024a552e4715 1223 /* avoid compiler warnings about unused variables */
Andrea Palmieri 201:a9bc2e8b01d7 1224 (void)dbmActuallySet;
Wolfgang Betz 130:770ce14d3d15 1225 #endif
Wolfgang Betz 130:770ce14d3d15 1226
Wolfgang Betz 132:51056160fa4a 1227 PRINTF("txPower=%d, dbmActuallySet=%d\n\r", txPower, dbmActuallySet);
Wolfgang Betz 132:51056160fa4a 1228 PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 1229 ret = aci_hal_set_tx_power_level(enHighPower, paLevel);
Wolfgang Betz 130:770ce14d3d15 1230 if(ret!=BLE_STATUS_SUCCESS) {
Wolfgang Betz 130:770ce14d3d15 1231 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 130:770ce14d3d15 1232 }
Andrea Palmieri 201:a9bc2e8b01d7 1233
Wolfgang Betz 130:770ce14d3d15 1234 return BLE_ERROR_NONE;
Wolfgang Betz 130:770ce14d3d15 1235 }
Wolfgang Betz 130:770ce14d3d15 1236
Wolfgang Betz 130:770ce14d3d15 1237 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1238 /*!
Wolfgang Betz 130:770ce14d3d15 1239 @brief get permitted Tx power values
Wolfgang Betz 130:770ce14d3d15 1240 @param[in] values pointer to pointer to permitted power values
Wolfgang Betz 130:770ce14d3d15 1241 @param[in] num number of values
Wolfgang Betz 130:770ce14d3d15 1242 */
Wolfgang Betz 130:770ce14d3d15 1243 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 1244 void BlueNRGGap::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
Wolfgang Betz 130:770ce14d3d15 1245 static const int8_t permittedTxValues[] = {
Wolfgang Betz 130:770ce14d3d15 1246 -18, -14, -11, -8, -4, -1, 1, 5, -15, -11, -8, -5, -2, 1, 4, 8
Wolfgang Betz 130:770ce14d3d15 1247 };
Wolfgang Betz 130:770ce14d3d15 1248
Wolfgang Betz 130:770ce14d3d15 1249 *valueArrayPP = permittedTxValues;
Wolfgang Betz 130:770ce14d3d15 1250 *countP = sizeof(permittedTxValues) / sizeof(int8_t);
Wolfgang Betz 130:770ce14d3d15 1251 }
Wolfgang Betz 132:51056160fa4a 1252
Andrea Palmieri 181:749071129d2e 1253 ble_error_t BlueNRGGap::createConnection ()
Wolfgang Betz 132:51056160fa4a 1254 {
Wolfgang Betz 132:51056160fa4a 1255 tBleStatus ret;
Wolfgang Betz 132:51056160fa4a 1256
Wolfgang Betz 132:51056160fa4a 1257 /*
Wolfgang Betz 163:4c008b1089e9 1258 Scan_Interval, Scan_Window, Peer_Address_Type, Peer_Address, Own_Address_Type, Conn_Interval_Min,
Wolfgang Betz 163:4c008b1089e9 1259 Conn_Interval_Max, Conn_Latency, Supervision_Timeout, Conn_Len_Min, Conn_Len_Max
Wolfgang Betz 132:51056160fa4a 1260 */
Andrea Palmieri 181:749071129d2e 1261 ret = aci_gap_create_connection(SCAN_P,
Wolfgang Betz 163:4c008b1089e9 1262 SCAN_L,
Wolfgang Betz 163:4c008b1089e9 1263 PUBLIC_ADDR,
Wolfgang Betz 163:4c008b1089e9 1264 (unsigned char*)_peerAddr,
Wolfgang Betz 163:4c008b1089e9 1265 PUBLIC_ADDR,
Wolfgang Betz 163:4c008b1089e9 1266 CONN_P1, CONN_P2, 0,
Wolfgang Betz 163:4c008b1089e9 1267 SUPERV_TIMEOUT, CONN_L1 , CONN_L2);
Wolfgang Betz 165:3576598c0889 1268
Wolfgang Betz 165:3576598c0889 1269 _connecting = false;
Wolfgang Betz 163:4c008b1089e9 1270
Wolfgang Betz 163:4c008b1089e9 1271 if (ret != BLE_STATUS_SUCCESS) {
Wolfgang Betz 132:51056160fa4a 1272 printf("Error while starting connection (ret=0x%02X).\n\r", ret);
Wolfgang Betz 132:51056160fa4a 1273 return BLE_ERROR_UNSPECIFIED;
Wolfgang Betz 132:51056160fa4a 1274 } else {
Wolfgang Betz 132:51056160fa4a 1275 PRINTF("Connection started.\n");
Wolfgang Betz 132:51056160fa4a 1276 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1277 }
Wolfgang Betz 132:51056160fa4a 1278 }
Wolfgang Betz 132:51056160fa4a 1279
Wolfgang Betz 132:51056160fa4a 1280 ble_error_t BlueNRGGap::connect (const Gap::Address_t peerAddr,
Wolfgang Betz 132:51056160fa4a 1281 Gap::AddressType_t peerAddrType,
Wolfgang Betz 132:51056160fa4a 1282 const ConnectionParams_t *connectionParams,
Wolfgang Betz 132:51056160fa4a 1283 const GapScanningParams *scanParams)
Wolfgang Betz 132:51056160fa4a 1284 {
Andrea Palmieri 142:adf1567d3900 1285 /* avoid compiler warnings about unused variables */
Andrea Palmieri 142:adf1567d3900 1286 (void)peerAddrType;
Andrea Palmieri 142:adf1567d3900 1287 (void)connectionParams;
Andrea Palmieri 142:adf1567d3900 1288 (void)scanParams;
Andrea Palmieri 142:adf1567d3900 1289
Andrea Palmieri 187:2e517d3ddd71 1290 // Save the peer address
Wolfgang Betz 132:51056160fa4a 1291 for(int i=0; i<BDADDR_SIZE; i++) {
Wolfgang Betz 132:51056160fa4a 1292 _peerAddr[i] = peerAddr[i];
Wolfgang Betz 132:51056160fa4a 1293 }
Wolfgang Betz 132:51056160fa4a 1294
Andrea Palmieri 181:749071129d2e 1295 _connecting = true;
Wolfgang Betz 132:51056160fa4a 1296
Wolfgang Betz 132:51056160fa4a 1297 if(_scanning) {
Wolfgang Betz 132:51056160fa4a 1298 stopScan();
Wolfgang Betz 132:51056160fa4a 1299 } else {
Wolfgang Betz 165:3576598c0889 1300 PRINTF("Calling createConnection from connect()\n\r");
Wolfgang Betz 165:3576598c0889 1301 return createConnection();
Wolfgang Betz 132:51056160fa4a 1302 }
Wolfgang Betz 132:51056160fa4a 1303
Wolfgang Betz 132:51056160fa4a 1304 return BLE_ERROR_NONE;
Wolfgang Betz 132:51056160fa4a 1305 }