gjhn

Dependents:   BLE_GENERALE

Fork of X_NUCLEO_IDB0XA1 by ST

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

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

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

Who changed what in which revision?

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