gjhn

Dependents:   BLE_GENERALE

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
Andrea Palmieri
Date:
Thu Mar 31 11:06:20 2016 +0200
Revision:
217:23870c55b07e
Parent:
213:781abfbf2d1c
Child:
220:e02936f0d4c7
Fix GAP role and scanning procedure

Observer is only supported by X-NUCLEO-IDB05A1;
Minor change

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

Who changed what in which revision?

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