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:
Wolfgang Betz
Date:
Wed Oct 28 14:04:55 2015 +0100
Revision:
156:662bb3992a03
Parent:
154:357d698334ba
Child:
157:e27f00b5e251
Workaround for discovery latencies

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