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

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

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

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

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

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

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

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

Committer:
Andrea Palmieri
Date:
Thu Jan 14 11:19:43 2016 +0100
Revision:
212:8b5ff0f0186f
Parent:
203:5b9c78101d45
Parent:
210:08c4c85ca679
Child:
215:e8fa3129410a
Merge branch 'master' of https://github.com/ARMmbed/ble-x-nucleo-idb0xa1 into mbed_classic

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