gjhn

Dependents:   BLE_GENERALE

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
Andrea Palmieri
Date:
Thu Nov 19 14:51:40 2015 +0100
Revision:
186:7e3a549b9678
Parent:
182:e7cff2f17ef9
Parent:
181:749071129d2e
Child:
187:2e517d3ddd71
Merge branch 'apalmieri' of ssh://codex.cro.st.com/x-nucleodev/x-nucleo-idb0xa1-mbedos into apalmieri

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

Conflicts:
source/BlueNRGGap.cpp

Who changed what in which revision?

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