Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of X_NUCLEO_IDB0XA1 by
source/BlueNRGGap.cpp@236:2a73f3a97452, 2016-06-09 (annotated)
- Committer:
- Andrea Palmieri
- Date:
- Thu Jun 09 17:16:36 2016 +0200
- Revision:
- 236:2a73f3a97452
- Parent:
- 234:3f6bba52b307
- Child:
- 237:64c2ddbd9329
Fix issue on ADV payload de-allocation
Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>
Who changed what in which revision?
User | Revision | Line number | New 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>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
Andrea Palmieri |
229:9981f62cdb1a | 34 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 35 | |
Wolfgang Betz |
130:770ce14d3d15 | 36 | /** @defgroup BlueNRGGap |
Wolfgang Betz |
130:770ce14d3d15 | 37 | * @brief BlueNRG BLE_API GAP Adaptation |
Wolfgang Betz |
130:770ce14d3d15 | 38 | * @{ |
Wolfgang Betz |
130:770ce14d3d15 | 39 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 40 | |
Wolfgang Betz |
130:770ce14d3d15 | 41 | #include "BlueNRGDevice.h" |
Wolfgang Betz |
144:bdf5e8432131 | 42 | #include "mbed-drivers/mbed.h" |
Wolfgang Betz |
130:770ce14d3d15 | 43 | #include "Payload.h" |
Wolfgang Betz |
130:770ce14d3d15 | 44 | #include "Utils.h" |
Wolfgang Betz |
132:51056160fa4a | 45 | #include "debug.h" |
Wolfgang Betz |
130:770ce14d3d15 | 46 | |
Wolfgang Betz |
130:770ce14d3d15 | 47 | //Local Variables |
Wolfgang Betz |
130:770ce14d3d15 | 48 | //const char *local_name = NULL; |
Wolfgang Betz |
130:770ce14d3d15 | 49 | //uint8_t local_name_length = 0; |
Wolfgang Betz |
130:770ce14d3d15 | 50 | |
Wolfgang Betz |
130:770ce14d3d15 | 51 | /* |
Wolfgang Betz |
130:770ce14d3d15 | 52 | * Utility to process GAP specific events (e.g., Advertising timeout) |
Wolfgang Betz |
130:770ce14d3d15 | 53 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 54 | void BlueNRGGap::Process(void) |
Wolfgang Betz |
130:770ce14d3d15 | 55 | { |
Wolfgang Betz |
130:770ce14d3d15 | 56 | if(AdvToFlag) { |
Wolfgang Betz |
130:770ce14d3d15 | 57 | stopAdvertising(); |
Wolfgang Betz |
130:770ce14d3d15 | 58 | } |
Wolfgang Betz |
130:770ce14d3d15 | 59 | |
Wolfgang Betz |
130:770ce14d3d15 | 60 | } |
Wolfgang Betz |
130:770ce14d3d15 | 61 | |
Wolfgang Betz |
130:770ce14d3d15 | 62 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 63 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 64 | @brief Sets the advertising parameters and payload for the device. |
Wolfgang Betz |
130:770ce14d3d15 | 65 | Note: Some data types give error when their adv data is updated using aci_gap_update_adv_data() API |
Wolfgang Betz |
130:770ce14d3d15 | 66 | |
Wolfgang Betz |
130:770ce14d3d15 | 67 | @params[in] advData |
Wolfgang Betz |
130:770ce14d3d15 | 68 | The primary advertising data payload |
Wolfgang Betz |
130:770ce14d3d15 | 69 | @params[in] scanResponse |
Wolfgang Betz |
130:770ce14d3d15 | 70 | The optional Scan Response payload if the advertising |
Wolfgang Betz |
130:770ce14d3d15 | 71 | type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED |
Wolfgang Betz |
130:770ce14d3d15 | 72 | in \ref GapAdveritinngParams |
Wolfgang Betz |
130:770ce14d3d15 | 73 | |
Wolfgang Betz |
130:770ce14d3d15 | 74 | @returns \ref ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 75 | |
Wolfgang Betz |
130:770ce14d3d15 | 76 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 77 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 78 | |
Wolfgang Betz |
130:770ce14d3d15 | 79 | @retval BLE_ERROR_BUFFER_OVERFLOW |
Wolfgang Betz |
130:770ce14d3d15 | 80 | The proposed action would cause a buffer overflow. All |
Wolfgang Betz |
130:770ce14d3d15 | 81 | advertising payloads must be <= 31 bytes, for example. |
Wolfgang Betz |
130:770ce14d3d15 | 82 | |
Wolfgang Betz |
130:770ce14d3d15 | 83 | @retval BLE_ERROR_NOT_IMPLEMENTED |
Wolfgang Betz |
130:770ce14d3d15 | 84 | A feature was requested that is not yet supported in the |
Wolfgang Betz |
130:770ce14d3d15 | 85 | nRF51 firmware or hardware. |
Wolfgang Betz |
130:770ce14d3d15 | 86 | |
Wolfgang Betz |
130:770ce14d3d15 | 87 | @retval BLE_ERROR_PARAM_OUT_OF_RANGE |
Wolfgang Betz |
130:770ce14d3d15 | 88 | One of the proposed values is outside the valid range. |
Wolfgang Betz |
130:770ce14d3d15 | 89 | |
Wolfgang Betz |
130:770ce14d3d15 | 90 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 91 | |
Wolfgang Betz |
130:770ce14d3d15 | 92 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 93 | |
Wolfgang Betz |
130:770ce14d3d15 | 94 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 95 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 96 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 97 | ble_error_t BlueNRGGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) |
Wolfgang Betz |
130:770ce14d3d15 | 98 | { |
Wolfgang Betz |
132:51056160fa4a | 99 | PRINTF("BlueNRGGap::setAdvertisingData\n\r"); |
Wolfgang Betz |
130:770ce14d3d15 | 100 | /* Make sure we don't exceed the advertising payload length */ |
Wolfgang Betz |
130:770ce14d3d15 | 101 | if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) { |
Wolfgang Betz |
130:770ce14d3d15 | 102 | return BLE_ERROR_BUFFER_OVERFLOW; |
Wolfgang Betz |
130:770ce14d3d15 | 103 | } |
Wolfgang Betz |
130:770ce14d3d15 | 104 | |
Wolfgang Betz |
130:770ce14d3d15 | 105 | /* Make sure we have a payload! */ |
Andrea Palmieri |
229:9981f62cdb1a | 106 | if (advData.getPayloadLen() == 0) { |
Andrea Palmieri |
229:9981f62cdb1a | 107 | PRINTF("advData.getPayloadLen() == 0\n\r"); |
Andrea Palmieri |
229:9981f62cdb1a | 108 | //return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Andrea Palmieri |
229:9981f62cdb1a | 109 | local_name_length = 0; |
Andrea Palmieri |
229:9981f62cdb1a | 110 | servUuidlength = 0; |
Andrea Palmieri |
229:9981f62cdb1a | 111 | AdvLen = 0; |
Andrea Palmieri |
236:2a73f3a97452 | 112 | } else { |
Andrea Palmieri |
236:2a73f3a97452 | 113 | PayloadPtr loadPtr(advData.getPayload(), advData.getPayloadLen()); |
Andrea Palmieri |
236:2a73f3a97452 | 114 | |
Wolfgang Betz |
130:770ce14d3d15 | 115 | for(uint8_t index=0; index<loadPtr.getPayloadUnitCount(); index++) { |
Wolfgang Betz |
130:770ce14d3d15 | 116 | loadPtr.getUnitAtIndex(index); |
Wolfgang Betz |
130:770ce14d3d15 | 117 | |
Wolfgang Betz |
132:51056160fa4a | 118 | PRINTF("adData[%d].length=%d\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getLenPtr())); |
Wolfgang Betz |
132:51056160fa4a | 119 | PRINTF("adData[%d].AdType=0x%x\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr())); |
Wolfgang Betz |
130:770ce14d3d15 | 120 | |
Wolfgang Betz |
130:770ce14d3d15 | 121 | switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) { |
Wolfgang Betz |
130:770ce14d3d15 | 122 | case GapAdvertisingData::FLAGS: /* ref *Flags */ |
Wolfgang Betz |
130:770ce14d3d15 | 123 | { |
Wolfgang Betz |
132:51056160fa4a | 124 | PRINTF("Advertising type: FLAGS\n\r"); |
Wolfgang Betz |
130:770ce14d3d15 | 125 | //Check if Flags are OK. BlueNRG only supports LE Mode. |
Wolfgang Betz |
130:770ce14d3d15 | 126 | uint8_t *flags = loadPtr.getUnitAtIndex(index).getDataPtr(); |
Wolfgang Betz |
130:770ce14d3d15 | 127 | if((*flags & GapAdvertisingData::BREDR_NOT_SUPPORTED) != GapAdvertisingData::BREDR_NOT_SUPPORTED) { |
Wolfgang Betz |
132:51056160fa4a | 128 | PRINTF("BlueNRG does not support BR/EDR Mode"); |
Wolfgang Betz |
130:770ce14d3d15 | 129 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Wolfgang Betz |
130:770ce14d3d15 | 130 | } |
Wolfgang Betz |
130:770ce14d3d15 | 131 | |
Wolfgang Betz |
130:770ce14d3d15 | 132 | break; |
Wolfgang Betz |
130:770ce14d3d15 | 133 | } |
Wolfgang Betz |
130:770ce14d3d15 | 134 | case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS: /**< Incomplete list of 16-bit Service IDs */ |
Wolfgang Betz |
130:770ce14d3d15 | 135 | case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS: /**< Complete list of 16-bit Service IDs */ |
Andrea Palmieri |
189:30fa96fa8ec4 | 136 | case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */ |
Andrea Palmieri |
189:30fa96fa8ec4 | 137 | case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS: /**< Complete list of 128-bit Service IDs */ |
Wolfgang Betz |
130:770ce14d3d15 | 138 | { |
Andrea Palmieri |
189:30fa96fa8ec4 | 139 | PRINTF("Advertising type: INCOMPLETE_LIST SERVICE_IDS/COMPLETE_LIST SERVICE_IDS\n\r"); |
Wolfgang Betz |
130:770ce14d3d15 | 140 | |
Wolfgang Betz |
130:770ce14d3d15 | 141 | uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; |
Wolfgang Betz |
130:770ce14d3d15 | 142 | // The total lenght should include the Data Type Value |
Wolfgang Betz |
130:770ce14d3d15 | 143 | if(buffSize>UUID_BUFFER_SIZE-1) { |
Andrea Palmieri |
189:30fa96fa8ec4 | 144 | return BLE_ERROR_INVALID_PARAM; |
Wolfgang Betz |
130:770ce14d3d15 | 145 | } |
Wolfgang Betz |
130:770ce14d3d15 | 146 | |
Wolfgang Betz |
130:770ce14d3d15 | 147 | servUuidlength = buffSize+1; // +1 to include the Data Type Value |
Wolfgang Betz |
130:770ce14d3d15 | 148 | servUuidData[0] = (uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()); //Data Type Value |
Wolfgang Betz |
130:770ce14d3d15 | 149 | |
Wolfgang Betz |
132:51056160fa4a | 150 | PRINTF("servUuidlength=%d servUuidData[0]=%d buffSize=%d\n\r", servUuidlength, servUuidData[0], buffSize); |
Wolfgang Betz |
130:770ce14d3d15 | 151 | // Save the Service UUID list just after the Data Type Value field |
Wolfgang Betz |
130:770ce14d3d15 | 152 | memcpy(servUuidData+1, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); |
Andrea Palmieri |
189:30fa96fa8ec4 | 153 | #ifdef DEBUG |
Wolfgang Betz |
130:770ce14d3d15 | 154 | for(unsigned i=0; i<servUuidlength; i++) { |
Wolfgang Betz |
132:51056160fa4a | 155 | PRINTF("servUuidData[%d] = 0x%x\n\r", i, servUuidData[i]); |
Wolfgang Betz |
130:770ce14d3d15 | 156 | } |
Wolfgang Betz |
130:770ce14d3d15 | 157 | |
Wolfgang Betz |
130:770ce14d3d15 | 158 | for(unsigned i=0; i<buffSize; i++) { |
Andrea Palmieri |
236:2a73f3a97452 | 159 | PRINTF("loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", |
Andrea Palmieri |
236:2a73f3a97452 | 160 | 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 |
229:9981f62cdb1a | 184 | // The total length should include the Data Type Value |
Andrea Palmieri |
229:9981f62cdb1a | 185 | if(local_name_length>ADV_DATA_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 | } |
Andrea Palmieri |
229:9981f62cdb1a | 225 | #ifdef DEBUG |
Wolfgang Betz |
130:770ce14d3d15 | 226 | for(int i=0; i<buffSize+1; i++) { |
Andrea Palmieri |
236:2a73f3a97452 | 227 | PRINTF("Advertising type: SERVICE_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", |
Andrea Palmieri |
236:2a73f3a97452 | 228 | i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]); |
Wolfgang Betz |
130:770ce14d3d15 | 229 | } |
Andrea Palmieri |
229:9981f62cdb1a | 230 | #endif |
Wolfgang Betz |
130:770ce14d3d15 | 231 | 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 | 232 | AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data) |
Wolfgang Betz |
130:770ce14d3d15 | 233 | AdvData[1] = AD_TYPE_SERVICE_DATA; |
Wolfgang Betz |
130:770ce14d3d15 | 234 | memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); |
Wolfgang Betz |
130:770ce14d3d15 | 235 | break; |
Wolfgang Betz |
130:770ce14d3d15 | 236 | } |
Andrea Palmieri |
228:25368f053411 | 237 | case GapAdvertisingData::APPEARANCE: /**< Appearance */ |
Wolfgang Betz |
130:770ce14d3d15 | 238 | { |
Wolfgang Betz |
132:51056160fa4a | 239 | PRINTF("Advertising type: APPEARANCE\n\r"); |
Andrea Palmieri |
228:25368f053411 | 240 | uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; |
Andrea Palmieri |
228:25368f053411 | 241 | if(buffSize>ADV_DATA_MAX_SIZE-2) { |
Andrea Palmieri |
228:25368f053411 | 242 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Andrea Palmieri |
228:25368f053411 | 243 | } |
Andrea Palmieri |
228:25368f053411 | 244 | GapAdvertisingData::Appearance appearanceP; |
Andrea Palmieri |
228:25368f053411 | 245 | memcpy(deviceAppearance, loadPtr.getUnitAtIndex(index).getDataPtr(), 2); |
Wolfgang Betz |
130:770ce14d3d15 | 246 | |
Andrea Palmieri |
228:25368f053411 | 247 | PRINTF("input: deviceAppearance= 0x%x 0x%x\n\r", deviceAppearance[1], deviceAppearance[0]); |
Andrea Palmieri |
228:25368f053411 | 248 | |
Andrea Palmieri |
228:25368f053411 | 249 | appearanceP = (GapAdvertisingData::Appearance)(deviceAppearance[1]<<8|deviceAppearance[0]); |
Andrea Palmieri |
228:25368f053411 | 250 | /* Align the GAP Service Appearance Char value coherently */ |
Andrea Palmieri |
228:25368f053411 | 251 | setAppearance(appearanceP); |
Wolfgang Betz |
130:770ce14d3d15 | 252 | break; |
Wolfgang Betz |
130:770ce14d3d15 | 253 | } |
Wolfgang Betz |
130:770ce14d3d15 | 254 | case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */ |
Wolfgang Betz |
130:770ce14d3d15 | 255 | { |
Wolfgang Betz |
132:51056160fa4a | 256 | PRINTF("Advertising type: ADVERTISING_INTERVAL\n\r"); |
Andrea Palmieri |
232:aead10288880 | 257 | //uint32_t advInt = (uint32_t)(*loadPtr.getUnitAtIndex(index).getDataPtr()); |
Wolfgang Betz |
130:770ce14d3d15 | 258 | break; |
Wolfgang Betz |
130:770ce14d3d15 | 259 | } |
Andrea Palmieri |
182:e7cff2f17ef9 | 260 | case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */ |
Wolfgang Betz |
130:770ce14d3d15 | 261 | { |
Andrea Palmieri |
182:e7cff2f17ef9 | 262 | PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA\n\r"); |
Andrea Palmieri |
182:e7cff2f17ef9 | 263 | uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; |
Andrea Palmieri |
182:e7cff2f17ef9 | 264 | PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA (buffSize=%d)\n\r", buffSize); |
Andrea Palmieri |
182:e7cff2f17ef9 | 265 | // the total ADV DATA LEN should include two more bytes: |
Andrea Palmieri |
182:e7cff2f17ef9 | 266 | // the buffer size byte; |
Andrea Palmieri |
182:e7cff2f17ef9 | 267 | // and the Manufacturer Specific Data Type Value byte |
Andrea Palmieri |
182:e7cff2f17ef9 | 268 | if(buffSize>ADV_DATA_MAX_SIZE-2) { |
Andrea Palmieri |
182:e7cff2f17ef9 | 269 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Andrea Palmieri |
182:e7cff2f17ef9 | 270 | } |
Andrea Palmieri |
229:9981f62cdb1a | 271 | #ifdef DBEUG |
Andrea Palmieri |
182:e7cff2f17ef9 | 272 | for(int i=0; i<buffSize+1; i++) { |
Andrea Palmieri |
182:e7cff2f17ef9 | 273 | PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", |
Andrea Palmieri |
182:e7cff2f17ef9 | 274 | i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]); |
Andrea Palmieri |
182:e7cff2f17ef9 | 275 | } |
Andrea Palmieri |
229:9981f62cdb1a | 276 | #endif |
Andrea Palmieri |
182:e7cff2f17ef9 | 277 | 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 | 278 | AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data) |
Andrea Palmieri |
182:e7cff2f17ef9 | 279 | AdvData[1] = AD_TYPE_MANUFACTURER_SPECIFIC_DATA; |
Andrea Palmieri |
182:e7cff2f17ef9 | 280 | memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); |
Wolfgang Betz |
130:770ce14d3d15 | 281 | break; |
Wolfgang Betz |
130:770ce14d3d15 | 282 | } |
Andrea Palmieri |
236:2a73f3a97452 | 283 | } // end switch |
Andrea Palmieri |
236:2a73f3a97452 | 284 | |
Andrea Palmieri |
236:2a73f3a97452 | 285 | } //end for |
Andrea Palmieri |
236:2a73f3a97452 | 286 | |
Andrea Palmieri |
236:2a73f3a97452 | 287 | //Set the SCAN_RSP Payload |
Andrea Palmieri |
236:2a73f3a97452 | 288 | if(scanResponse.getPayloadLen() > 0) { |
Andrea Palmieri |
236:2a73f3a97452 | 289 | scan_response_payload = scanResponse.getPayload(); |
Andrea Palmieri |
236:2a73f3a97452 | 290 | scan_rsp_length = scanResponse.getPayloadLen(); |
Wolfgang Betz |
130:770ce14d3d15 | 291 | } |
Andrea Palmieri |
213:781abfbf2d1c | 292 | |
Andrea Palmieri |
213:781abfbf2d1c | 293 | // Update the ADV data if we are already in ADV mode |
Andrea Palmieri |
213:781abfbf2d1c | 294 | if(AdvLen > 0 && state.advertising == 1) { |
Andrea Palmieri |
213:781abfbf2d1c | 295 | |
Andrea Palmieri |
213:781abfbf2d1c | 296 | tBleStatus ret = aci_gap_update_adv_data(AdvLen, AdvData); |
Andrea Palmieri |
213:781abfbf2d1c | 297 | if(BLE_STATUS_SUCCESS!=ret) { |
Andrea Palmieri |
213:781abfbf2d1c | 298 | PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret); |
Andrea Palmieri |
213:781abfbf2d1c | 299 | switch (ret) { |
Andrea Palmieri |
213:781abfbf2d1c | 300 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
213:781abfbf2d1c | 301 | return BLE_STACK_BUSY; |
Andrea Palmieri |
213:781abfbf2d1c | 302 | default: |
Andrea Palmieri |
213:781abfbf2d1c | 303 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
213:781abfbf2d1c | 304 | } |
Andrea Palmieri |
213:781abfbf2d1c | 305 | } |
Andrea Palmieri |
213:781abfbf2d1c | 306 | } |
Wolfgang Betz |
130:770ce14d3d15 | 307 | } |
Wolfgang Betz |
130:770ce14d3d15 | 308 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 309 | } |
Wolfgang Betz |
130:770ce14d3d15 | 310 | |
Wolfgang Betz |
130:770ce14d3d15 | 311 | /* |
Wolfgang Betz |
130:770ce14d3d15 | 312 | * Utility to set ADV timeout flag |
Wolfgang Betz |
130:770ce14d3d15 | 313 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 314 | void BlueNRGGap::setAdvToFlag(void) { |
Wolfgang Betz |
130:770ce14d3d15 | 315 | AdvToFlag = true; |
Wolfgang Betz |
130:770ce14d3d15 | 316 | } |
Wolfgang Betz |
130:770ce14d3d15 | 317 | |
Wolfgang Betz |
130:770ce14d3d15 | 318 | /* |
Wolfgang Betz |
130:770ce14d3d15 | 319 | * ADV timeout callback |
Andrea Palmieri |
229:9981f62cdb1a | 320 | */ |
Wolfgang Betz |
138:32e3c4ca7a45 | 321 | #ifdef AST_FOR_MBED_OS |
Wolfgang Betz |
132:51056160fa4a | 322 | static void advTimeoutCB(void) |
Wolfgang Betz |
132:51056160fa4a | 323 | { |
Wolfgang Betz |
132:51056160fa4a | 324 | Gap::GapState_t state; |
Wolfgang Betz |
132:51056160fa4a | 325 | |
Wolfgang Betz |
132:51056160fa4a | 326 | state = BlueNRGGap::getInstance().getState(); |
Wolfgang Betz |
132:51056160fa4a | 327 | if (state.advertising == 1) { |
Wolfgang Betz |
132:51056160fa4a | 328 | |
Wolfgang Betz |
132:51056160fa4a | 329 | BlueNRGGap::getInstance().stopAdvertising(); |
Wolfgang Betz |
132:51056160fa4a | 330 | |
Wolfgang Betz |
132:51056160fa4a | 331 | } |
Wolfgang Betz |
132:51056160fa4a | 332 | } |
Wolfgang Betz |
132:51056160fa4a | 333 | #else |
Wolfgang Betz |
130:770ce14d3d15 | 334 | static void advTimeoutCB(void) |
Wolfgang Betz |
130:770ce14d3d15 | 335 | { |
Wolfgang Betz |
130:770ce14d3d15 | 336 | Gap::GapState_t state; |
Wolfgang Betz |
130:770ce14d3d15 | 337 | |
Wolfgang Betz |
130:770ce14d3d15 | 338 | state = BlueNRGGap::getInstance().getState(); |
Wolfgang Betz |
130:770ce14d3d15 | 339 | if (state.advertising == 1) { |
Wolfgang Betz |
130:770ce14d3d15 | 340 | |
Wolfgang Betz |
130:770ce14d3d15 | 341 | BlueNRGGap::getInstance().setAdvToFlag(); |
Wolfgang Betz |
130:770ce14d3d15 | 342 | |
Wolfgang Betz |
130:770ce14d3d15 | 343 | Timeout t = BlueNRGGap::getInstance().getAdvTimeout(); |
Wolfgang Betz |
130:770ce14d3d15 | 344 | t.detach(); /* disable the callback from the timeout */ |
Wolfgang Betz |
130:770ce14d3d15 | 345 | |
Wolfgang Betz |
130:770ce14d3d15 | 346 | } |
Wolfgang Betz |
130:770ce14d3d15 | 347 | } |
Wolfgang Betz |
138:32e3c4ca7a45 | 348 | #endif /* AST_FOR_MBED_OS */ |
Wolfgang Betz |
130:770ce14d3d15 | 349 | |
Wolfgang Betz |
130:770ce14d3d15 | 350 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 351 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 352 | @brief Starts the BLE HW, initialising any services that were |
Wolfgang Betz |
130:770ce14d3d15 | 353 | added before this function was called. |
Wolfgang Betz |
130:770ce14d3d15 | 354 | |
Wolfgang Betz |
130:770ce14d3d15 | 355 | @param[in] params |
Wolfgang Betz |
130:770ce14d3d15 | 356 | Basic advertising details, including the advertising |
Wolfgang Betz |
130:770ce14d3d15 | 357 | delay, timeout and how the device should be advertised |
Wolfgang Betz |
130:770ce14d3d15 | 358 | |
Wolfgang Betz |
130:770ce14d3d15 | 359 | @note All services must be added before calling this function! |
Wolfgang Betz |
130:770ce14d3d15 | 360 | |
Wolfgang Betz |
130:770ce14d3d15 | 361 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 362 | |
Wolfgang Betz |
130:770ce14d3d15 | 363 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 364 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 365 | |
Wolfgang Betz |
130:770ce14d3d15 | 366 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 367 | |
Wolfgang Betz |
130:770ce14d3d15 | 368 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 369 | |
Wolfgang Betz |
130:770ce14d3d15 | 370 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 371 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 372 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 373 | |
Wolfgang Betz |
130:770ce14d3d15 | 374 | ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams ¶ms) |
Andrea Palmieri |
187:2e517d3ddd71 | 375 | { |
Andrea Palmieri |
187:2e517d3ddd71 | 376 | tBleStatus ret; |
Andrea Palmieri |
187:2e517d3ddd71 | 377 | |
Wolfgang Betz |
130:770ce14d3d15 | 378 | /* Make sure we support the advertising type */ |
Wolfgang Betz |
130:770ce14d3d15 | 379 | if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) { |
Andrea Palmieri |
220:e02936f0d4c7 | 380 | /* ToDo: This requires a proper security implementation, etc. */ |
Wolfgang Betz |
130:770ce14d3d15 | 381 | return BLE_ERROR_NOT_IMPLEMENTED; |
Wolfgang Betz |
130:770ce14d3d15 | 382 | } |
Wolfgang Betz |
130:770ce14d3d15 | 383 | |
Wolfgang Betz |
130:770ce14d3d15 | 384 | /* Check interval range */ |
Wolfgang Betz |
130:770ce14d3d15 | 385 | if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) { |
Wolfgang Betz |
130:770ce14d3d15 | 386 | /* Min delay is slightly longer for unconnectable devices */ |
Wolfgang Betz |
130:770ce14d3d15 | 387 | if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) || |
Wolfgang Betz |
130:770ce14d3d15 | 388 | (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) { |
Wolfgang Betz |
130:770ce14d3d15 | 389 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Wolfgang Betz |
130:770ce14d3d15 | 390 | } |
Wolfgang Betz |
130:770ce14d3d15 | 391 | } else { |
Wolfgang Betz |
130:770ce14d3d15 | 392 | if ((params.getIntervalInADVUnits() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN) || |
Wolfgang Betz |
130:770ce14d3d15 | 393 | (params.getIntervalInADVUnits() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_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 | |
Wolfgang Betz |
130:770ce14d3d15 | 398 | /* Check timeout is zero for Connectable Directed */ |
Wolfgang Betz |
130:770ce14d3d15 | 399 | if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) { |
Wolfgang Betz |
130:770ce14d3d15 | 400 | /* Timeout must be 0 with this type, although we'll never get here */ |
Wolfgang Betz |
130:770ce14d3d15 | 401 | /* since this isn't implemented yet anyway */ |
Wolfgang Betz |
130:770ce14d3d15 | 402 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Wolfgang Betz |
130:770ce14d3d15 | 403 | } |
Wolfgang Betz |
130:770ce14d3d15 | 404 | |
Wolfgang Betz |
130:770ce14d3d15 | 405 | /* Check timeout for other advertising types */ |
Wolfgang Betz |
130:770ce14d3d15 | 406 | if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && |
Wolfgang Betz |
130:770ce14d3d15 | 407 | (params.getTimeout() > GapAdvertisingParams::GAP_ADV_PARAMS_TIMEOUT_MAX)) { |
Wolfgang Betz |
130:770ce14d3d15 | 408 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Wolfgang Betz |
130:770ce14d3d15 | 409 | } |
Wolfgang Betz |
130:770ce14d3d15 | 410 | |
Andrea Palmieri |
229:9981f62cdb1a | 411 | /* |
Andrea Palmieri |
229:9981f62cdb1a | 412 | * Advertising filter policy setting |
Andrea Palmieri |
229:9981f62cdb1a | 413 | * FIXME: the Security Manager should be implemented |
Andrea Palmieri |
229:9981f62cdb1a | 414 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 415 | AdvertisingPolicyMode_t mode = getAdvertisingPolicyMode(); |
Andrea Palmieri |
229:9981f62cdb1a | 416 | if(mode != ADV_POLICY_IGNORE_WHITELIST) { |
Andrea Palmieri |
229:9981f62cdb1a | 417 | ret = aci_gap_configure_whitelist(); |
Andrea Palmieri |
229:9981f62cdb1a | 418 | if(ret != BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
229:9981f62cdb1a | 419 | PRINTF("aci_gap_configure_whitelist ret=0x%x\n\r", ret); |
Andrea Palmieri |
229:9981f62cdb1a | 420 | return BLE_ERROR_OPERATION_NOT_PERMITTED; |
Andrea Palmieri |
229:9981f62cdb1a | 421 | } |
Andrea Palmieri |
229:9981f62cdb1a | 422 | } |
Andrea Palmieri |
229:9981f62cdb1a | 423 | |
Andrea Palmieri |
229:9981f62cdb1a | 424 | uint8_t advFilterPolicy = NO_WHITE_LIST_USE; |
Andrea Palmieri |
229:9981f62cdb1a | 425 | switch(mode) { |
Andrea Palmieri |
229:9981f62cdb1a | 426 | case ADV_POLICY_FILTER_SCAN_REQS: |
Andrea Palmieri |
229:9981f62cdb1a | 427 | advFilterPolicy = WHITE_LIST_FOR_ONLY_SCAN; |
Andrea Palmieri |
229:9981f62cdb1a | 428 | break; |
Andrea Palmieri |
229:9981f62cdb1a | 429 | case ADV_POLICY_FILTER_CONN_REQS: |
Andrea Palmieri |
229:9981f62cdb1a | 430 | advFilterPolicy = WHITE_LIST_FOR_ONLY_CONN; |
Andrea Palmieri |
229:9981f62cdb1a | 431 | break; |
Andrea Palmieri |
229:9981f62cdb1a | 432 | case ADV_POLICY_FILTER_ALL_REQS: |
Andrea Palmieri |
229:9981f62cdb1a | 433 | advFilterPolicy = WHITE_LIST_FOR_ALL; |
Andrea Palmieri |
229:9981f62cdb1a | 434 | break; |
Andrea Palmieri |
229:9981f62cdb1a | 435 | default: |
Andrea Palmieri |
229:9981f62cdb1a | 436 | advFilterPolicy = NO_WHITE_LIST_USE; |
Andrea Palmieri |
229:9981f62cdb1a | 437 | break; |
Andrea Palmieri |
229:9981f62cdb1a | 438 | } |
Andrea Palmieri |
229:9981f62cdb1a | 439 | |
Andrea Palmieri |
228:25368f053411 | 440 | /* Check the ADV type before setting scan response data */ |
Andrea Palmieri |
228:25368f053411 | 441 | if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED || |
Andrea Palmieri |
228:25368f053411 | 442 | params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED) { |
Andrea Palmieri |
228:25368f053411 | 443 | |
Andrea Palmieri |
228:25368f053411 | 444 | /* set scan response data */ |
Andrea Palmieri |
228:25368f053411 | 445 | PRINTF(" setting scan response data (scan_rsp_length=%u)\n", scan_rsp_length); |
Andrea Palmieri |
228:25368f053411 | 446 | ret = hci_le_set_scan_resp_data(scan_rsp_length, scan_response_payload); |
Andrea Palmieri |
228:25368f053411 | 447 | |
Andrea Palmieri |
228:25368f053411 | 448 | if(BLE_STATUS_SUCCESS!=ret) { |
Andrea Palmieri |
228:25368f053411 | 449 | PRINTF(" error while setting scan response data (ret=0x%x)\n", ret); |
Andrea Palmieri |
228:25368f053411 | 450 | switch (ret) { |
Andrea Palmieri |
228:25368f053411 | 451 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
228:25368f053411 | 452 | return BLE_STACK_BUSY; |
Andrea Palmieri |
228:25368f053411 | 453 | default: |
Andrea Palmieri |
228:25368f053411 | 454 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
228:25368f053411 | 455 | } |
Andrea Palmieri |
187:2e517d3ddd71 | 456 | } |
Andrea Palmieri |
228:25368f053411 | 457 | } else { |
Andrea Palmieri |
228:25368f053411 | 458 | hci_le_set_scan_resp_data(0, NULL); |
Andrea Palmieri |
187:2e517d3ddd71 | 459 | } |
Wolfgang Betz |
130:770ce14d3d15 | 460 | |
Andrea Palmieri |
232:aead10288880 | 461 | //advInterval = params.getIntervalInADVUnits(); |
Andrea Palmieri |
232:aead10288880 | 462 | setAdvParameters(); |
Andrea Palmieri |
232:aead10288880 | 463 | PRINTF("advInterval=%d advType=%d\n\r", advInterval, params.getAdvertisingType()); |
Wolfgang Betz |
130:770ce14d3d15 | 464 | |
Andrea Palmieri |
229:9981f62cdb1a | 465 | /* Setting discoverable mode */ |
Andrea Palmieri |
220:e02936f0d4c7 | 466 | ret = aci_gap_set_discoverable(params.getAdvertisingType(), // AdvType |
Andrea Palmieri |
232:aead10288880 | 467 | advInterval, // AdvIntervMin |
Andrea Palmieri |
232:aead10288880 | 468 | advInterval, // AdvIntervMax |
Andrea Palmieri |
228:25368f053411 | 469 | addr_type, // OwnAddrType |
Andrea Palmieri |
229:9981f62cdb1a | 470 | advFilterPolicy, // AdvFilterPolicy |
Andrea Palmieri |
220:e02936f0d4c7 | 471 | local_name_length, // LocalNameLen |
Andrea Palmieri |
220:e02936f0d4c7 | 472 | (const char*)local_name, // LocalName |
Andrea Palmieri |
220:e02936f0d4c7 | 473 | servUuidlength, // ServiceUUIDLen |
Andrea Palmieri |
220:e02936f0d4c7 | 474 | servUuidData, // ServiceUUIDList |
Andrea Palmieri |
220:e02936f0d4c7 | 475 | 0, // SlaveConnIntervMin |
Andrea Palmieri |
220:e02936f0d4c7 | 476 | 0); // SlaveConnIntervMax |
Wolfgang Betz |
130:770ce14d3d15 | 477 | |
Wolfgang Betz |
130:770ce14d3d15 | 478 | |
Andrea Palmieri |
229:9981f62cdb1a | 479 | PRINTF("!!!setting discoverable (servUuidlength=0x%x)\n\r", servUuidlength); |
Wolfgang Betz |
130:770ce14d3d15 | 480 | if(BLE_STATUS_SUCCESS!=ret) { |
Andrea Palmieri |
229:9981f62cdb1a | 481 | PRINTF("error occurred while setting discoverable (ret=0x%x)\n\r", ret); |
Andrea Palmieri |
187:2e517d3ddd71 | 482 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 483 | case BLE_STATUS_INVALID_PARAMS: |
Andrea Palmieri |
187:2e517d3ddd71 | 484 | return BLE_ERROR_INVALID_PARAM; |
Andrea Palmieri |
187:2e517d3ddd71 | 485 | case ERR_COMMAND_DISALLOWED: |
Andrea Palmieri |
187:2e517d3ddd71 | 486 | return BLE_ERROR_OPERATION_NOT_PERMITTED; |
Andrea Palmieri |
187:2e517d3ddd71 | 487 | case ERR_UNSUPPORTED_FEATURE: |
Andrea Palmieri |
187:2e517d3ddd71 | 488 | return BLE_ERROR_NOT_IMPLEMENTED; |
Andrea Palmieri |
187:2e517d3ddd71 | 489 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 490 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 491 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 492 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 493 | } |
Wolfgang Betz |
130:770ce14d3d15 | 494 | } |
Wolfgang Betz |
130:770ce14d3d15 | 495 | |
Wolfgang Betz |
130:770ce14d3d15 | 496 | // Before updating the ADV data, delete COMPLETE_LOCAL_NAME and TX_POWER_LEVEL fields (if present) |
Andrea Palmieri |
228:25368f053411 | 497 | if(AdvLen > 0) { |
Andrea Palmieri |
228:25368f053411 | 498 | if(local_name_length > 0) { |
Wolfgang Betz |
132:51056160fa4a | 499 | PRINTF("!!!calling aci_gap_delete_ad_type AD_TYPE_COMPLETE_LOCAL_NAME!!!\n"); |
Wolfgang Betz |
130:770ce14d3d15 | 500 | ret = aci_gap_delete_ad_type(AD_TYPE_COMPLETE_LOCAL_NAME); |
Andrea Palmieri |
187:2e517d3ddd71 | 501 | if (BLE_STATUS_SUCCESS!=ret){ |
Wolfgang Betz |
132:51056160fa4a | 502 | PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret); |
Andrea Palmieri |
187:2e517d3ddd71 | 503 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 504 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 505 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 506 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 507 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 508 | } |
Wolfgang Betz |
130:770ce14d3d15 | 509 | } |
Wolfgang Betz |
130:770ce14d3d15 | 510 | } |
Wolfgang Betz |
130:770ce14d3d15 | 511 | |
Andrea Palmieri |
201:a9bc2e8b01d7 | 512 | // If ADV Data Type is SERVICE DATA or MANUFACTURER SPECIFIC DATA, |
Andrea Palmieri |
201:a9bc2e8b01d7 | 513 | // we need to delete it to make the needed room in ADV payload |
Andrea Palmieri |
201:a9bc2e8b01d7 | 514 | if(AdvData[1]==AD_TYPE_SERVICE_DATA || AdvData[1]==AD_TYPE_MANUFACTURER_SPECIFIC_DATA) { |
Wolfgang Betz |
132:51056160fa4a | 515 | PRINTF("!!!calling aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL)!!!\n"); |
Wolfgang Betz |
130:770ce14d3d15 | 516 | ret = aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL); |
Andrea Palmieri |
187:2e517d3ddd71 | 517 | if (BLE_STATUS_SUCCESS!=ret){ |
Wolfgang Betz |
132:51056160fa4a | 518 | PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret); |
Andrea Palmieri |
187:2e517d3ddd71 | 519 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 520 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 521 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 522 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 523 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 524 | } |
Wolfgang Betz |
130:770ce14d3d15 | 525 | } |
Wolfgang Betz |
130:770ce14d3d15 | 526 | } |
Wolfgang Betz |
130:770ce14d3d15 | 527 | |
Wolfgang Betz |
130:770ce14d3d15 | 528 | ret = aci_gap_update_adv_data(AdvLen, AdvData); |
Wolfgang Betz |
130:770ce14d3d15 | 529 | if(BLE_STATUS_SUCCESS!=ret) { |
Wolfgang Betz |
132:51056160fa4a | 530 | PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret); |
Andrea Palmieri |
187:2e517d3ddd71 | 531 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 532 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 533 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 534 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 535 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 536 | } |
Wolfgang Betz |
130:770ce14d3d15 | 537 | } |
Andrea Palmieri |
228:25368f053411 | 538 | |
Andrea Palmieri |
187:2e517d3ddd71 | 539 | } // AdvLen>0 |
Wolfgang Betz |
130:770ce14d3d15 | 540 | |
Andrea Palmieri |
228:25368f053411 | 541 | if(deviceAppearance != 0) { |
Andrea Palmieri |
228:25368f053411 | 542 | PRINTF("deviceAppearance != 0\n\r"); |
Andrea Palmieri |
228:25368f053411 | 543 | uint8_t appearance[] = {3, AD_TYPE_APPEARANCE, deviceAppearance[0], deviceAppearance[1]}; |
Andrea Palmieri |
228:25368f053411 | 544 | aci_gap_update_adv_data(4, appearance); |
Andrea Palmieri |
228:25368f053411 | 545 | } |
Andrea Palmieri |
228:25368f053411 | 546 | |
Wolfgang Betz |
130:770ce14d3d15 | 547 | state.advertising = 1; |
Wolfgang Betz |
130:770ce14d3d15 | 548 | |
Wolfgang Betz |
130:770ce14d3d15 | 549 | AdvToFlag = false; |
Wolfgang Betz |
130:770ce14d3d15 | 550 | if(params.getTimeout() != 0) { |
Wolfgang Betz |
132:51056160fa4a | 551 | PRINTF("!!! attaching to!!!\n"); |
Wolfgang Betz |
138:32e3c4ca7a45 | 552 | #ifdef AST_FOR_MBED_OS |
Andrea Palmieri |
229:9981f62cdb1a | 553 | minar::Scheduler::postCallback(advTimeoutCB).delay(minar::milliseconds(params.getTimeout() * 1000)); |
Wolfgang Betz |
132:51056160fa4a | 554 | #else |
Andrea Palmieri |
229:9981f62cdb1a | 555 | advTimeout.attach(advTimeoutCB, params.getTimeout() * 1000); |
Wolfgang Betz |
132:51056160fa4a | 556 | #endif |
Wolfgang Betz |
130:770ce14d3d15 | 557 | } |
Wolfgang Betz |
130:770ce14d3d15 | 558 | |
Wolfgang Betz |
130:770ce14d3d15 | 559 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 560 | } |
Wolfgang Betz |
130:770ce14d3d15 | 561 | |
Wolfgang Betz |
130:770ce14d3d15 | 562 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 563 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 564 | @brief Stops the BLE HW and disconnects from any devices |
Wolfgang Betz |
130:770ce14d3d15 | 565 | |
Wolfgang Betz |
130:770ce14d3d15 | 566 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 567 | |
Wolfgang Betz |
130:770ce14d3d15 | 568 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 569 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 570 | |
Wolfgang Betz |
130:770ce14d3d15 | 571 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 572 | |
Wolfgang Betz |
130:770ce14d3d15 | 573 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 574 | |
Wolfgang Betz |
130:770ce14d3d15 | 575 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 576 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 577 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 578 | ble_error_t BlueNRGGap::stopAdvertising(void) |
Wolfgang Betz |
130:770ce14d3d15 | 579 | { |
Wolfgang Betz |
130:770ce14d3d15 | 580 | tBleStatus ret; |
Andrea Palmieri |
229:9981f62cdb1a | 581 | |
Wolfgang Betz |
130:770ce14d3d15 | 582 | if(state.advertising == 1) { |
Wolfgang Betz |
130:770ce14d3d15 | 583 | //Set non-discoverable to stop advertising |
Wolfgang Betz |
130:770ce14d3d15 | 584 | ret = aci_gap_set_non_discoverable(); |
Wolfgang Betz |
130:770ce14d3d15 | 585 | |
Andrea Palmieri |
187:2e517d3ddd71 | 586 | if (BLE_STATUS_SUCCESS!=ret){ |
Wolfgang Betz |
132:51056160fa4a | 587 | PRINTF("Error in stopping advertisement (ret=0x%x)!!\n\r", ret) ; |
Andrea Palmieri |
187:2e517d3ddd71 | 588 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 589 | case ERR_COMMAND_DISALLOWED: |
Andrea Palmieri |
187:2e517d3ddd71 | 590 | return BLE_ERROR_OPERATION_NOT_PERMITTED; |
Andrea Palmieri |
187:2e517d3ddd71 | 591 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 592 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 593 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 594 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 595 | } |
Wolfgang Betz |
130:770ce14d3d15 | 596 | } |
Wolfgang Betz |
132:51056160fa4a | 597 | PRINTF("Advertisement stopped!!\n\r") ; |
Wolfgang Betz |
130:770ce14d3d15 | 598 | //Set GapState_t::advertising state |
Wolfgang Betz |
130:770ce14d3d15 | 599 | state.advertising = 0; |
Wolfgang Betz |
130:770ce14d3d15 | 600 | } |
Wolfgang Betz |
130:770ce14d3d15 | 601 | |
Wolfgang Betz |
130:770ce14d3d15 | 602 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 603 | } |
Wolfgang Betz |
130:770ce14d3d15 | 604 | |
Wolfgang Betz |
130:770ce14d3d15 | 605 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 606 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 607 | @brief Disconnects if we are connected to a central device |
Wolfgang Betz |
130:770ce14d3d15 | 608 | |
Wolfgang Betz |
130:770ce14d3d15 | 609 | @param[in] reason |
Wolfgang Betz |
130:770ce14d3d15 | 610 | Disconnection Reason |
Wolfgang Betz |
130:770ce14d3d15 | 611 | |
Wolfgang Betz |
130:770ce14d3d15 | 612 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 613 | |
Wolfgang Betz |
130:770ce14d3d15 | 614 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 615 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 616 | |
Wolfgang Betz |
130:770ce14d3d15 | 617 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 618 | |
Wolfgang Betz |
130:770ce14d3d15 | 619 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 620 | |
Wolfgang Betz |
130:770ce14d3d15 | 621 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 622 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 623 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 624 | ble_error_t BlueNRGGap::disconnect(Gap::DisconnectionReason_t reason) |
Wolfgang Betz |
130:770ce14d3d15 | 625 | { |
Andrea Palmieri |
142:adf1567d3900 | 626 | /* avoid compiler warnings about unused variables */ |
Andrea Palmieri |
142:adf1567d3900 | 627 | (void)reason; |
Andrea Palmieri |
142:adf1567d3900 | 628 | |
Wolfgang Betz |
130:770ce14d3d15 | 629 | tBleStatus ret; |
Wolfgang Betz |
130:770ce14d3d15 | 630 | //For Reason codes check BlueTooth HCI Spec |
Wolfgang Betz |
130:770ce14d3d15 | 631 | |
Wolfgang Betz |
130:770ce14d3d15 | 632 | if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) { |
Wolfgang Betz |
130:770ce14d3d15 | 633 | ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host. |
Wolfgang Betz |
130:770ce14d3d15 | 634 | |
Andrea Palmieri |
187:2e517d3ddd71 | 635 | if (BLE_STATUS_SUCCESS != ret){ |
Andrea Palmieri |
187:2e517d3ddd71 | 636 | PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ; |
Andrea Palmieri |
187:2e517d3ddd71 | 637 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 638 | case ERR_COMMAND_DISALLOWED: |
Andrea Palmieri |
187:2e517d3ddd71 | 639 | return BLE_ERROR_OPERATION_NOT_PERMITTED; |
Andrea Palmieri |
187:2e517d3ddd71 | 640 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 641 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 642 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 643 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 644 | } |
Wolfgang Betz |
130:770ce14d3d15 | 645 | } |
Wolfgang Betz |
130:770ce14d3d15 | 646 | |
Wolfgang Betz |
132:51056160fa4a | 647 | //PRINTF("Disconnected from localhost!!\n\r") ; |
Wolfgang Betz |
130:770ce14d3d15 | 648 | m_connectionHandle = BLE_CONN_HANDLE_INVALID; |
Wolfgang Betz |
130:770ce14d3d15 | 649 | } |
Wolfgang Betz |
130:770ce14d3d15 | 650 | |
Wolfgang Betz |
130:770ce14d3d15 | 651 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 652 | } |
Wolfgang Betz |
130:770ce14d3d15 | 653 | |
Wolfgang Betz |
130:770ce14d3d15 | 654 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 655 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 656 | @brief Disconnects if we are connected to a central device |
Wolfgang Betz |
130:770ce14d3d15 | 657 | |
Wolfgang Betz |
130:770ce14d3d15 | 658 | @param[in] reason |
Wolfgang Betz |
130:770ce14d3d15 | 659 | Disconnection Reason |
Wolfgang Betz |
130:770ce14d3d15 | 660 | |
Wolfgang Betz |
130:770ce14d3d15 | 661 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 662 | |
Wolfgang Betz |
130:770ce14d3d15 | 663 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 664 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 665 | |
Wolfgang Betz |
130:770ce14d3d15 | 666 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 667 | |
Wolfgang Betz |
130:770ce14d3d15 | 668 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 669 | |
Wolfgang Betz |
130:770ce14d3d15 | 670 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 671 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 672 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 673 | ble_error_t BlueNRGGap::disconnect(Handle_t connectionHandle, Gap::DisconnectionReason_t reason) |
Wolfgang Betz |
130:770ce14d3d15 | 674 | { |
Andrea Palmieri |
142:adf1567d3900 | 675 | /* avoid compiler warnings about unused variables */ |
Andrea Palmieri |
142:adf1567d3900 | 676 | (void)reason; |
Andrea Palmieri |
142:adf1567d3900 | 677 | |
Wolfgang Betz |
130:770ce14d3d15 | 678 | tBleStatus ret; |
Wolfgang Betz |
130:770ce14d3d15 | 679 | //For Reason codes check BlueTooth HCI Spec |
Wolfgang Betz |
130:770ce14d3d15 | 680 | |
Wolfgang Betz |
130:770ce14d3d15 | 681 | if(connectionHandle != BLE_CONN_HANDLE_INVALID) { |
Wolfgang Betz |
130:770ce14d3d15 | 682 | ret = aci_gap_terminate(connectionHandle, 0x16);//0x16 Connection Terminated by Local Host. |
Wolfgang Betz |
130:770ce14d3d15 | 683 | |
Andrea Palmieri |
187:2e517d3ddd71 | 684 | if (BLE_STATUS_SUCCESS != ret){ |
Andrea Palmieri |
187:2e517d3ddd71 | 685 | PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ; |
Andrea Palmieri |
187:2e517d3ddd71 | 686 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 687 | case ERR_COMMAND_DISALLOWED: |
Andrea Palmieri |
187:2e517d3ddd71 | 688 | return BLE_ERROR_OPERATION_NOT_PERMITTED; |
Andrea Palmieri |
187:2e517d3ddd71 | 689 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 690 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 691 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 692 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 693 | } |
Wolfgang Betz |
130:770ce14d3d15 | 694 | } |
Wolfgang Betz |
130:770ce14d3d15 | 695 | |
Wolfgang Betz |
132:51056160fa4a | 696 | //PRINTF("Disconnected from localhost!!\n\r") ; |
Wolfgang Betz |
130:770ce14d3d15 | 697 | m_connectionHandle = BLE_CONN_HANDLE_INVALID; |
Wolfgang Betz |
130:770ce14d3d15 | 698 | } |
Wolfgang Betz |
130:770ce14d3d15 | 699 | |
Wolfgang Betz |
130:770ce14d3d15 | 700 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 701 | } |
Wolfgang Betz |
130:770ce14d3d15 | 702 | |
Wolfgang Betz |
130:770ce14d3d15 | 703 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 704 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 705 | @brief Sets the 16-bit connection handle |
Wolfgang Betz |
130:770ce14d3d15 | 706 | |
Wolfgang Betz |
130:770ce14d3d15 | 707 | @param[in] con_handle |
Wolfgang Betz |
130:770ce14d3d15 | 708 | Connection Handle which is set in the Gap Instance |
Wolfgang Betz |
130:770ce14d3d15 | 709 | |
Wolfgang Betz |
130:770ce14d3d15 | 710 | @returns void |
Wolfgang Betz |
130:770ce14d3d15 | 711 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 712 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 713 | void BlueNRGGap::setConnectionHandle(uint16_t con_handle) |
Wolfgang Betz |
130:770ce14d3d15 | 714 | { |
Wolfgang Betz |
130:770ce14d3d15 | 715 | m_connectionHandle = con_handle; |
Wolfgang Betz |
130:770ce14d3d15 | 716 | } |
Wolfgang Betz |
130:770ce14d3d15 | 717 | |
Wolfgang Betz |
130:770ce14d3d15 | 718 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 719 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 720 | @brief Gets the 16-bit connection handle |
Wolfgang Betz |
130:770ce14d3d15 | 721 | |
Wolfgang Betz |
130:770ce14d3d15 | 722 | @param[in] void |
Wolfgang Betz |
130:770ce14d3d15 | 723 | |
Wolfgang Betz |
130:770ce14d3d15 | 724 | @returns uint16_t |
Wolfgang Betz |
130:770ce14d3d15 | 725 | Connection Handle of the Gap Instance |
Wolfgang Betz |
130:770ce14d3d15 | 726 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 727 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 728 | uint16_t BlueNRGGap::getConnectionHandle(void) |
Wolfgang Betz |
130:770ce14d3d15 | 729 | { |
Wolfgang Betz |
130:770ce14d3d15 | 730 | return m_connectionHandle; |
Wolfgang Betz |
130:770ce14d3d15 | 731 | } |
Wolfgang Betz |
130:770ce14d3d15 | 732 | |
Wolfgang Betz |
130:770ce14d3d15 | 733 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 734 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 735 | @brief Sets the BLE device address. SetAddress will reset the BLE |
Wolfgang Betz |
130:770ce14d3d15 | 736 | device and re-initialize BTLE. Will not start advertising. |
Wolfgang Betz |
130:770ce14d3d15 | 737 | |
Wolfgang Betz |
130:770ce14d3d15 | 738 | @param[in] type |
Wolfgang Betz |
130:770ce14d3d15 | 739 | Type of Address |
Wolfgang Betz |
130:770ce14d3d15 | 740 | |
Wolfgang Betz |
130:770ce14d3d15 | 741 | @param[in] address[6] |
Wolfgang Betz |
130:770ce14d3d15 | 742 | Value of the Address to be set |
Wolfgang Betz |
130:770ce14d3d15 | 743 | |
Wolfgang Betz |
130:770ce14d3d15 | 744 | @returns ble_error_t |
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 |
132:51056160fa4a | 753 | ble_error_t BlueNRGGap::setAddress(AddressType_t type, const Address_t address) |
Wolfgang Betz |
130:770ce14d3d15 | 754 | { |
Andrea Palmieri |
228:25368f053411 | 755 | tBleStatus ret; |
Andrea Palmieri |
228:25368f053411 | 756 | |
Andrea Palmieri |
210:08c4c85ca679 | 757 | if (type > BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE) { |
Wolfgang Betz |
130:770ce14d3d15 | 758 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Wolfgang Betz |
130:770ce14d3d15 | 759 | } |
Wolfgang Betz |
130:770ce14d3d15 | 760 | |
Wolfgang Betz |
132:51056160fa4a | 761 | addr_type = type; |
Andrea Palmieri |
228:25368f053411 | 762 | |
Andrea Palmieri |
228:25368f053411 | 763 | // If Address Type is other than PUBLIC, the given Address is ignored |
Andrea Palmieri |
228:25368f053411 | 764 | if(addr_type == BLEProtocol::AddressType::PUBLIC){ |
Andrea Palmieri |
228:25368f053411 | 765 | ret = aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, |
Andrea Palmieri |
228:25368f053411 | 766 | CONFIG_DATA_PUBADDR_LEN, |
Andrea Palmieri |
228:25368f053411 | 767 | address); |
Andrea Palmieri |
229:9981f62cdb1a | 768 | if(ret != BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
229:9981f62cdb1a | 769 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
229:9981f62cdb1a | 770 | } |
Wolfgang Betz |
130:770ce14d3d15 | 771 | } |
Wolfgang Betz |
130:770ce14d3d15 | 772 | |
Wolfgang Betz |
130:770ce14d3d15 | 773 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 774 | } |
Andrea Palmieri |
229:9981f62cdb1a | 775 | |
Wolfgang Betz |
130:770ce14d3d15 | 776 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 777 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 778 | @brief Returns boolean if the address of the device has been set |
Wolfgang Betz |
130:770ce14d3d15 | 779 | or not |
Wolfgang Betz |
130:770ce14d3d15 | 780 | |
Wolfgang Betz |
130:770ce14d3d15 | 781 | @returns bool |
Wolfgang Betz |
130:770ce14d3d15 | 782 | |
Wolfgang Betz |
130:770ce14d3d15 | 783 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 784 | |
Wolfgang Betz |
130:770ce14d3d15 | 785 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 786 | |
Wolfgang Betz |
130:770ce14d3d15 | 787 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 788 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 789 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 790 | bool BlueNRGGap::getIsSetAddress() |
Wolfgang Betz |
130:770ce14d3d15 | 791 | { |
Wolfgang Betz |
130:770ce14d3d15 | 792 | return isSetAddress; |
Wolfgang Betz |
130:770ce14d3d15 | 793 | } |
Wolfgang Betz |
130:770ce14d3d15 | 794 | |
Wolfgang Betz |
130:770ce14d3d15 | 795 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 796 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 797 | @brief Returns the address of the device if set |
Wolfgang Betz |
130:770ce14d3d15 | 798 | |
Wolfgang Betz |
130:770ce14d3d15 | 799 | @returns Pointer to the address if Address is set else NULL |
Wolfgang Betz |
130:770ce14d3d15 | 800 | |
Wolfgang Betz |
130:770ce14d3d15 | 801 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 802 | |
Wolfgang Betz |
130:770ce14d3d15 | 803 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 804 | |
Wolfgang Betz |
130:770ce14d3d15 | 805 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 806 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 807 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 808 | ble_error_t BlueNRGGap::getAddress(AddressType_t *typeP, Address_t address) |
Wolfgang Betz |
130:770ce14d3d15 | 809 | { |
Andrea Palmieri |
229:9981f62cdb1a | 810 | uint8_t bdaddr[BDADDR_SIZE]; |
Andrea Palmieri |
229:9981f62cdb1a | 811 | uint8_t data_len_out; |
Andrea Palmieri |
229:9981f62cdb1a | 812 | |
Andrea Palmieri |
228:25368f053411 | 813 | if(typeP != NULL) { |
Andrea Palmieri |
228:25368f053411 | 814 | *typeP = addr_type; |
Andrea Palmieri |
228:25368f053411 | 815 | } |
Andrea Palmieri |
228:25368f053411 | 816 | |
Andrea Palmieri |
229:9981f62cdb1a | 817 | tBleStatus ret = aci_hal_read_config_data(CONFIG_DATA_RANDOM_ADDRESS_IDB05A1, BDADDR_SIZE, &data_len_out, bdaddr); |
Andrea Palmieri |
229:9981f62cdb1a | 818 | if(ret != BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
229:9981f62cdb1a | 819 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
229:9981f62cdb1a | 820 | } |
Andrea Palmieri |
229:9981f62cdb1a | 821 | |
Andrea Palmieri |
228:25368f053411 | 822 | if(address != NULL) { |
Andrea Palmieri |
228:25368f053411 | 823 | memcpy(address, bdaddr, BDADDR_SIZE); |
Wolfgang Betz |
130:770ce14d3d15 | 824 | } |
Wolfgang Betz |
130:770ce14d3d15 | 825 | |
Wolfgang Betz |
130:770ce14d3d15 | 826 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 827 | } |
Wolfgang Betz |
130:770ce14d3d15 | 828 | |
Wolfgang Betz |
130:770ce14d3d15 | 829 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 830 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 831 | @brief obtains preferred connection params |
Wolfgang Betz |
130:770ce14d3d15 | 832 | |
Wolfgang Betz |
130:770ce14d3d15 | 833 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 834 | |
Wolfgang Betz |
130:770ce14d3d15 | 835 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 836 | |
Wolfgang Betz |
130:770ce14d3d15 | 837 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 838 | |
Wolfgang Betz |
130:770ce14d3d15 | 839 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 840 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 841 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 842 | ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params) |
Wolfgang Betz |
130:770ce14d3d15 | 843 | { |
Andrea Palmieri |
142:adf1567d3900 | 844 | /* avoid compiler warnings about unused variables */ |
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 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 853 | @brief sets preferred connection params |
Wolfgang Betz |
130:770ce14d3d15 | 854 | |
Wolfgang Betz |
130:770ce14d3d15 | 855 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 856 | |
Wolfgang Betz |
130:770ce14d3d15 | 857 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 858 | |
Wolfgang Betz |
130:770ce14d3d15 | 859 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 860 | |
Wolfgang Betz |
130:770ce14d3d15 | 861 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 862 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 863 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 864 | ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params) |
Wolfgang Betz |
130:770ce14d3d15 | 865 | { |
Andrea Palmieri |
142:adf1567d3900 | 866 | /* avoid compiler warnings about unused variables */ |
Andrea Palmieri |
142:adf1567d3900 | 867 | (void)params; |
Andrea Palmieri |
142:adf1567d3900 | 868 | |
Wolfgang Betz |
130:770ce14d3d15 | 869 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 870 | } |
Wolfgang Betz |
130:770ce14d3d15 | 871 | |
Wolfgang Betz |
130:770ce14d3d15 | 872 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 873 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 874 | @brief updates preferred connection params |
Wolfgang Betz |
130:770ce14d3d15 | 875 | |
Wolfgang Betz |
130:770ce14d3d15 | 876 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 877 | |
Wolfgang Betz |
130:770ce14d3d15 | 878 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 879 | |
Wolfgang Betz |
130:770ce14d3d15 | 880 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 881 | |
Wolfgang Betz |
130:770ce14d3d15 | 882 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 883 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 884 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 885 | ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) |
Wolfgang Betz |
130:770ce14d3d15 | 886 | { |
Andrea Palmieri |
142:adf1567d3900 | 887 | /* avoid compiler warnings about unused variables */ |
Andrea Palmieri |
142:adf1567d3900 | 888 | (void) handle; |
Andrea Palmieri |
142:adf1567d3900 | 889 | (void)params; |
Andrea Palmieri |
142:adf1567d3900 | 890 | |
Wolfgang Betz |
130:770ce14d3d15 | 891 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 892 | } |
Wolfgang Betz |
130:770ce14d3d15 | 893 | |
Wolfgang Betz |
130:770ce14d3d15 | 894 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 895 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 896 | @brief Sets the Device Name Characteristic |
Wolfgang Betz |
130:770ce14d3d15 | 897 | |
Wolfgang Betz |
130:770ce14d3d15 | 898 | @param[in] deviceName |
Wolfgang Betz |
130:770ce14d3d15 | 899 | pointer to device name to be set |
Wolfgang Betz |
130:770ce14d3d15 | 900 | |
Wolfgang Betz |
130:770ce14d3d15 | 901 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 902 | |
Wolfgang Betz |
130:770ce14d3d15 | 903 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 904 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 905 | |
Wolfgang Betz |
130:770ce14d3d15 | 906 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 907 | |
Wolfgang Betz |
130:770ce14d3d15 | 908 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 909 | |
Wolfgang Betz |
130:770ce14d3d15 | 910 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 911 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 912 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 913 | ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName) |
Wolfgang Betz |
130:770ce14d3d15 | 914 | { |
Andrea Palmieri |
187:2e517d3ddd71 | 915 | tBleStatus ret; |
Wolfgang Betz |
130:770ce14d3d15 | 916 | uint8_t nameLen = 0; |
Wolfgang Betz |
130:770ce14d3d15 | 917 | |
Andrea Palmieri |
228:25368f053411 | 918 | nameLen = strlen((const char*)deviceName); |
Andrea Palmieri |
228:25368f053411 | 919 | PRINTF("DeviceName Size=%d\n\r", nameLen); |
Andrea Palmieri |
228:25368f053411 | 920 | |
Andrea Palmieri |
222:37a7e289ee3d | 921 | ret = aci_gatt_update_char_value(g_gap_service_handle, |
Andrea Palmieri |
222:37a7e289ee3d | 922 | g_device_name_char_handle, |
Andrea Palmieri |
222:37a7e289ee3d | 923 | 0, |
Andrea Palmieri |
222:37a7e289ee3d | 924 | nameLen, |
Andrea Palmieri |
228:25368f053411 | 925 | deviceName); |
Andrea Palmieri |
187:2e517d3ddd71 | 926 | |
Andrea Palmieri |
187:2e517d3ddd71 | 927 | if (BLE_STATUS_SUCCESS != ret){ |
Andrea Palmieri |
187:2e517d3ddd71 | 928 | PRINTF("device set name failed (ret=0x%x)!!\n\r", ret) ; |
Andrea Palmieri |
187:2e517d3ddd71 | 929 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 930 | case BLE_STATUS_INVALID_HANDLE: |
Andrea Palmieri |
187:2e517d3ddd71 | 931 | case BLE_STATUS_INVALID_PARAMETER: |
Andrea Palmieri |
187:2e517d3ddd71 | 932 | return BLE_ERROR_INVALID_PARAM; |
Andrea Palmieri |
187:2e517d3ddd71 | 933 | case BLE_STATUS_INSUFFICIENT_RESOURCES: |
Andrea Palmieri |
187:2e517d3ddd71 | 934 | return BLE_ERROR_NO_MEM; |
Andrea Palmieri |
187:2e517d3ddd71 | 935 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 936 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 937 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 938 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 939 | } |
Wolfgang Betz |
130:770ce14d3d15 | 940 | } |
Wolfgang Betz |
130:770ce14d3d15 | 941 | |
Wolfgang Betz |
130:770ce14d3d15 | 942 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 943 | } |
Wolfgang Betz |
130:770ce14d3d15 | 944 | |
Wolfgang Betz |
130:770ce14d3d15 | 945 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 946 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 947 | @brief Gets the Device Name Characteristic |
Wolfgang Betz |
130:770ce14d3d15 | 948 | |
Wolfgang Betz |
130:770ce14d3d15 | 949 | @param[in] deviceName |
Wolfgang Betz |
130:770ce14d3d15 | 950 | pointer to device name |
Wolfgang Betz |
130:770ce14d3d15 | 951 | |
Wolfgang Betz |
130:770ce14d3d15 | 952 | @param[in] lengthP |
Wolfgang Betz |
130:770ce14d3d15 | 953 | pointer to device name length |
Wolfgang Betz |
130:770ce14d3d15 | 954 | |
Wolfgang Betz |
130:770ce14d3d15 | 955 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 956 | |
Wolfgang Betz |
130:770ce14d3d15 | 957 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 958 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 959 | |
Wolfgang Betz |
130:770ce14d3d15 | 960 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 961 | |
Wolfgang Betz |
130:770ce14d3d15 | 962 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 963 | |
Wolfgang Betz |
130:770ce14d3d15 | 964 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 965 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 966 | /**************************************************************************/ |
Andrea Palmieri |
228:25368f053411 | 967 | ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP) |
Andrea Palmieri |
228:25368f053411 | 968 | { |
Andrea Palmieri |
228:25368f053411 | 969 | tBleStatus ret; |
Andrea Palmieri |
228:25368f053411 | 970 | |
Andrea Palmieri |
229:9981f62cdb1a | 971 | ret = aci_gatt_read_handle_value(g_device_name_char_handle+BlueNRGGattServer::CHAR_VALUE_HANDLE, |
Andrea Palmieri |
228:25368f053411 | 972 | *lengthP, |
Andrea Palmieri |
228:25368f053411 | 973 | (uint16_t *)lengthP, |
Andrea Palmieri |
228:25368f053411 | 974 | deviceName); |
Andrea Palmieri |
228:25368f053411 | 975 | PRINTF("getDeviceName ret=0x%02x (lengthP=%d)\n\r", ret, *lengthP); |
Andrea Palmieri |
228:25368f053411 | 976 | if (ret == BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
228:25368f053411 | 977 | return BLE_ERROR_NONE; |
Andrea Palmieri |
228:25368f053411 | 978 | } else { |
Andrea Palmieri |
228:25368f053411 | 979 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Andrea Palmieri |
228:25368f053411 | 980 | } |
Wolfgang Betz |
130:770ce14d3d15 | 981 | } |
Wolfgang Betz |
130:770ce14d3d15 | 982 | |
Wolfgang Betz |
130:770ce14d3d15 | 983 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 984 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 985 | @brief Sets the Device Appearance Characteristic |
Wolfgang Betz |
130:770ce14d3d15 | 986 | |
Wolfgang Betz |
130:770ce14d3d15 | 987 | @param[in] appearance |
Wolfgang Betz |
130:770ce14d3d15 | 988 | device appearance |
Wolfgang Betz |
130:770ce14d3d15 | 989 | |
Wolfgang Betz |
130:770ce14d3d15 | 990 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 991 | |
Wolfgang Betz |
130:770ce14d3d15 | 992 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 993 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 994 | |
Wolfgang Betz |
130:770ce14d3d15 | 995 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 996 | |
Wolfgang Betz |
130:770ce14d3d15 | 997 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 998 | |
Wolfgang Betz |
130:770ce14d3d15 | 999 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 1000 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 1001 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1002 | ble_error_t BlueNRGGap::setAppearance(GapAdvertisingData::Appearance appearance) |
Wolfgang Betz |
130:770ce14d3d15 | 1003 | { |
Andrea Palmieri |
187:2e517d3ddd71 | 1004 | tBleStatus ret; |
Andrea Palmieri |
228:25368f053411 | 1005 | uint8_t deviceAppearance[2]; |
Andrea Palmieri |
187:2e517d3ddd71 | 1006 | |
Wolfgang Betz |
130:770ce14d3d15 | 1007 | STORE_LE_16(deviceAppearance, appearance); |
Wolfgang Betz |
132:51056160fa4a | 1008 | PRINTF("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]); |
Wolfgang Betz |
130:770ce14d3d15 | 1009 | |
Andrea Palmieri |
228:25368f053411 | 1010 | ret = aci_gatt_update_char_value(g_gap_service_handle, |
Andrea Palmieri |
228:25368f053411 | 1011 | g_appearance_char_handle, |
Andrea Palmieri |
228:25368f053411 | 1012 | 0, 2, (uint8_t *)deviceAppearance); |
Andrea Palmieri |
187:2e517d3ddd71 | 1013 | if (BLE_STATUS_SUCCESS == ret){ |
Andrea Palmieri |
187:2e517d3ddd71 | 1014 | return BLE_ERROR_NONE; |
Andrea Palmieri |
187:2e517d3ddd71 | 1015 | } |
Andrea Palmieri |
187:2e517d3ddd71 | 1016 | |
Andrea Palmieri |
217:23870c55b07e | 1017 | PRINTF("setAppearance failed (ret=0x%x)!!\n\r", ret); |
Andrea Palmieri |
187:2e517d3ddd71 | 1018 | switch (ret) { |
Andrea Palmieri |
187:2e517d3ddd71 | 1019 | case BLE_STATUS_INVALID_HANDLE: |
Andrea Palmieri |
187:2e517d3ddd71 | 1020 | case BLE_STATUS_INVALID_PARAMETER: |
Andrea Palmieri |
187:2e517d3ddd71 | 1021 | return BLE_ERROR_INVALID_PARAM; |
Andrea Palmieri |
187:2e517d3ddd71 | 1022 | case BLE_STATUS_INSUFFICIENT_RESOURCES: |
Andrea Palmieri |
187:2e517d3ddd71 | 1023 | return BLE_ERROR_NO_MEM; |
Andrea Palmieri |
187:2e517d3ddd71 | 1024 | case BLE_STATUS_TIMEOUT: |
Andrea Palmieri |
187:2e517d3ddd71 | 1025 | return BLE_STACK_BUSY; |
Andrea Palmieri |
187:2e517d3ddd71 | 1026 | default: |
Andrea Palmieri |
187:2e517d3ddd71 | 1027 | return BLE_ERROR_UNSPECIFIED; |
Andrea Palmieri |
187:2e517d3ddd71 | 1028 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1029 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1030 | |
Wolfgang Betz |
130:770ce14d3d15 | 1031 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1032 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 1033 | @brief Gets the Device Appearance Characteristic |
Wolfgang Betz |
130:770ce14d3d15 | 1034 | |
Wolfgang Betz |
130:770ce14d3d15 | 1035 | @param[in] appearance |
Wolfgang Betz |
130:770ce14d3d15 | 1036 | pointer to device appearance value |
Wolfgang Betz |
130:770ce14d3d15 | 1037 | |
Wolfgang Betz |
130:770ce14d3d15 | 1038 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 1039 | |
Wolfgang Betz |
130:770ce14d3d15 | 1040 | @retval BLE_ERROR_NONE |
Wolfgang Betz |
130:770ce14d3d15 | 1041 | Everything executed properly |
Wolfgang Betz |
130:770ce14d3d15 | 1042 | |
Wolfgang Betz |
130:770ce14d3d15 | 1043 | @section EXAMPLE |
Wolfgang Betz |
130:770ce14d3d15 | 1044 | |
Wolfgang Betz |
130:770ce14d3d15 | 1045 | @code |
Wolfgang Betz |
130:770ce14d3d15 | 1046 | |
Wolfgang Betz |
130:770ce14d3d15 | 1047 | @endcode |
Wolfgang Betz |
130:770ce14d3d15 | 1048 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 1049 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1050 | ble_error_t BlueNRGGap::getAppearance(GapAdvertisingData::Appearance *appearanceP) |
Wolfgang Betz |
130:770ce14d3d15 | 1051 | { |
Andrea Palmieri |
228:25368f053411 | 1052 | tBleStatus ret; |
Andrea Palmieri |
228:25368f053411 | 1053 | uint16_t lengthP = 2; |
Andrea Palmieri |
228:25368f053411 | 1054 | |
Andrea Palmieri |
229:9981f62cdb1a | 1055 | ret = aci_gatt_read_handle_value(g_appearance_char_handle+BlueNRGGattServer::CHAR_VALUE_HANDLE, |
Andrea Palmieri |
228:25368f053411 | 1056 | lengthP, |
Andrea Palmieri |
228:25368f053411 | 1057 | &lengthP, |
Andrea Palmieri |
228:25368f053411 | 1058 | (uint8_t*)appearanceP); |
Andrea Palmieri |
228:25368f053411 | 1059 | PRINTF("getAppearance ret=0x%02x (lengthP=%d)\n\r", ret, lengthP); |
Andrea Palmieri |
228:25368f053411 | 1060 | if (ret == BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
228:25368f053411 | 1061 | return BLE_ERROR_NONE; |
Andrea Palmieri |
228:25368f053411 | 1062 | } else { |
Andrea Palmieri |
228:25368f053411 | 1063 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Andrea Palmieri |
228:25368f053411 | 1064 | } |
Andrea Palmieri |
228:25368f053411 | 1065 | |
Wolfgang Betz |
130:770ce14d3d15 | 1066 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1067 | |
Andrea Palmieri |
160:174387d53809 | 1068 | GapScanningParams* BlueNRGGap::getScanningParams(void) |
Andrea Palmieri |
160:174387d53809 | 1069 | { |
Andrea Palmieri |
160:174387d53809 | 1070 | return &_scanningParams; |
Andrea Palmieri |
160:174387d53809 | 1071 | } |
Andrea Palmieri |
160:174387d53809 | 1072 | |
Wolfgang Betz |
165:3576598c0889 | 1073 | static void makeConnection(void) |
Wolfgang Betz |
162:667f97a4db7f | 1074 | { |
Wolfgang Betz |
165:3576598c0889 | 1075 | BlueNRGGap::getInstance().createConnection(); |
Wolfgang Betz |
162:667f97a4db7f | 1076 | } |
Wolfgang Betz |
162:667f97a4db7f | 1077 | |
Wolfgang Betz |
132:51056160fa4a | 1078 | void BlueNRGGap::Discovery_CB(Reason_t reason, |
Wolfgang Betz |
132:51056160fa4a | 1079 | uint8_t adv_type, |
Andrea Palmieri |
229:9981f62cdb1a | 1080 | uint8_t addr_type, |
Wolfgang Betz |
132:51056160fa4a | 1081 | uint8_t *addr, |
Wolfgang Betz |
132:51056160fa4a | 1082 | uint8_t *data_length, |
Wolfgang Betz |
132:51056160fa4a | 1083 | uint8_t *data, |
Wolfgang Betz |
132:51056160fa4a | 1084 | uint8_t *RSSI) |
Wolfgang Betz |
132:51056160fa4a | 1085 | { |
Wolfgang Betz |
132:51056160fa4a | 1086 | switch (reason) { |
Wolfgang Betz |
132:51056160fa4a | 1087 | case DEVICE_FOUND: |
Wolfgang Betz |
132:51056160fa4a | 1088 | { |
Wolfgang Betz |
132:51056160fa4a | 1089 | GapAdvertisingParams::AdvertisingType_t type; |
Wolfgang Betz |
132:51056160fa4a | 1090 | bool isScanResponse = false; |
Andrea Palmieri |
229:9981f62cdb1a | 1091 | |
Andrea Palmieri |
229:9981f62cdb1a | 1092 | /* |
Andrea Palmieri |
229:9981f62cdb1a | 1093 | * Whitelisting (scan policy): |
Andrea Palmieri |
229:9981f62cdb1a | 1094 | * SCAN_POLICY_FILTER_ALL_ADV (ADV packets only from devs in the White List) && |
Andrea Palmieri |
229:9981f62cdb1a | 1095 | * Private Random Address |
Andrea Palmieri |
229:9981f62cdb1a | 1096 | * => scan_results = FALSE |
Andrea Palmieri |
229:9981f62cdb1a | 1097 | * FIXME: the Security Manager should be implemented |
Andrea Palmieri |
229:9981f62cdb1a | 1098 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1099 | ScanningPolicyMode_t mode = getScanningPolicyMode(); |
Andrea Palmieri |
229:9981f62cdb1a | 1100 | PRINTF("mode=%u addr_type=%u\n\r", mode, addr_type); |
Andrea Palmieri |
229:9981f62cdb1a | 1101 | if(mode == Gap::SCAN_POLICY_FILTER_ALL_ADV || |
Andrea Palmieri |
229:9981f62cdb1a | 1102 | (addr_type == RESOLVABLE_PRIVATE_ADDR || |
Andrea Palmieri |
229:9981f62cdb1a | 1103 | addr_type == NON_RESOLVABLE_PRIVATE_ADDR)) { |
Andrea Palmieri |
229:9981f62cdb1a | 1104 | return; |
Andrea Palmieri |
229:9981f62cdb1a | 1105 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1106 | |
Wolfgang Betz |
132:51056160fa4a | 1107 | switch(adv_type) { |
Wolfgang Betz |
132:51056160fa4a | 1108 | case ADV_IND: |
Wolfgang Betz |
132:51056160fa4a | 1109 | type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED; |
Wolfgang Betz |
132:51056160fa4a | 1110 | break; |
Wolfgang Betz |
132:51056160fa4a | 1111 | case ADV_DIRECT_IND: |
Wolfgang Betz |
132:51056160fa4a | 1112 | type = GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED; |
Wolfgang Betz |
132:51056160fa4a | 1113 | break; |
Wolfgang Betz |
132:51056160fa4a | 1114 | case ADV_SCAN_IND: |
Wolfgang Betz |
132:51056160fa4a | 1115 | case SCAN_RSP: |
Wolfgang Betz |
132:51056160fa4a | 1116 | type = GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED; |
Wolfgang Betz |
132:51056160fa4a | 1117 | isScanResponse = true; |
Wolfgang Betz |
132:51056160fa4a | 1118 | break; |
Wolfgang Betz |
132:51056160fa4a | 1119 | case ADV_NONCONN_IND: |
Wolfgang Betz |
132:51056160fa4a | 1120 | type = GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED; |
Andrea Palmieri |
142:adf1567d3900 | 1121 | break; |
Andrea Palmieri |
142:adf1567d3900 | 1122 | default: |
Andrea Palmieri |
142:adf1567d3900 | 1123 | type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED; |
Wolfgang Betz |
132:51056160fa4a | 1124 | } |
Wolfgang Betz |
132:51056160fa4a | 1125 | |
Andrea Palmieri |
217:23870c55b07e | 1126 | PRINTF("data_length=%d adv peerAddr[%02x %02x %02x %02x %02x %02x] \r\n", |
Andrea Palmieri |
217:23870c55b07e | 1127 | *data_length, addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]); |
Wolfgang Betz |
132:51056160fa4a | 1128 | processAdvertisementReport(addr, *RSSI, isScanResponse, type, *data_length, data); |
Andrea Palmieri |
160:174387d53809 | 1129 | PRINTF("!!!After processAdvertisementReport\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 1130 | } |
Wolfgang Betz |
132:51056160fa4a | 1131 | break; |
Wolfgang Betz |
132:51056160fa4a | 1132 | |
Wolfgang Betz |
132:51056160fa4a | 1133 | case DISCOVERY_COMPLETE: |
Wolfgang Betz |
132:51056160fa4a | 1134 | // The discovery is complete. If this is due to a stop scanning (i.e., the device |
Wolfgang Betz |
132:51056160fa4a | 1135 | // we are interested in has been found) and a connection has been requested |
Andrea Palmieri |
229:9981f62cdb1a | 1136 | // then we start the device connection. |
Andrea Palmieri |
145:024a552e4715 | 1137 | PRINTF("DISCOVERY_COMPLETE\n\r"); |
Wolfgang Betz |
132:51056160fa4a | 1138 | _scanning = false; |
Wolfgang Betz |
132:51056160fa4a | 1139 | |
Wolfgang Betz |
165:3576598c0889 | 1140 | // Since the DISCOVERY_COMPLETE event can be received during the scanning interval, |
Andrea Palmieri |
229:9981f62cdb1a | 1141 | // we need to delay the starting of connection |
Wolfgang Betz |
165:3576598c0889 | 1142 | uint16_t delay = 2*(_scanningParams.getInterval()); |
Wolfgang Betz |
165:3576598c0889 | 1143 | |
Andrea Palmieri |
217:23870c55b07e | 1144 | #ifdef AST_FOR_MBED_OS |
Wolfgang Betz |
162:667f97a4db7f | 1145 | if(_connecting) { |
Wolfgang Betz |
165:3576598c0889 | 1146 | minar::Scheduler::postCallback(makeConnection).delay(minar::milliseconds(delay)); |
Wolfgang Betz |
132:51056160fa4a | 1147 | } |
Andrea Palmieri |
217:23870c55b07e | 1148 | #else |
Andrea Palmieri |
217:23870c55b07e | 1149 | Clock_Wait(delay); |
Andrea Palmieri |
217:23870c55b07e | 1150 | if(_connecting) { |
Andrea Palmieri |
217:23870c55b07e | 1151 | makeConnection(); |
Andrea Palmieri |
217:23870c55b07e | 1152 | } |
Andrea Palmieri |
217:23870c55b07e | 1153 | #endif /* AST_FOR_MBED_OS */ |
Wolfgang Betz |
132:51056160fa4a | 1154 | |
Wolfgang Betz |
132:51056160fa4a | 1155 | break; |
Wolfgang Betz |
132:51056160fa4a | 1156 | } |
Wolfgang Betz |
132:51056160fa4a | 1157 | } |
Wolfgang Betz |
132:51056160fa4a | 1158 | |
Wolfgang Betz |
132:51056160fa4a | 1159 | ble_error_t BlueNRGGap::startRadioScan(const GapScanningParams &scanningParams) |
Wolfgang Betz |
132:51056160fa4a | 1160 | { |
Wolfgang Betz |
132:51056160fa4a | 1161 | |
Wolfgang Betz |
165:3576598c0889 | 1162 | tBleStatus ret = BLE_STATUS_SUCCESS; |
Andrea Palmieri |
222:37a7e289ee3d | 1163 | |
Andrea Palmieri |
222:37a7e289ee3d | 1164 | // Stop ADV before scanning |
Andrea Palmieri |
223:36df860f7ffc | 1165 | /* |
Andrea Palmieri |
222:37a7e289ee3d | 1166 | if (state.advertising == 1) { |
Andrea Palmieri |
222:37a7e289ee3d | 1167 | stopAdvertising(); |
Andrea Palmieri |
222:37a7e289ee3d | 1168 | } |
Andrea Palmieri |
223:36df860f7ffc | 1169 | */ |
Andrea Palmieri |
222:37a7e289ee3d | 1170 | |
Andrea Palmieri |
229:9981f62cdb1a | 1171 | /* |
Andrea Palmieri |
229:9981f62cdb1a | 1172 | * Whitelisting (scan policy): |
Andrea Palmieri |
229:9981f62cdb1a | 1173 | * SCAN_POLICY_FILTER_ALL_ADV (ADV packets only from devs in the White List) && |
Andrea Palmieri |
229:9981f62cdb1a | 1174 | * White List is empty |
Andrea Palmieri |
229:9981f62cdb1a | 1175 | * => scan operation = FAILURE |
Andrea Palmieri |
229:9981f62cdb1a | 1176 | * FIXME: the Security Manager should be implemented |
Andrea Palmieri |
229:9981f62cdb1a | 1177 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1178 | ScanningPolicyMode_t mode = getScanningPolicyMode(); |
Andrea Palmieri |
229:9981f62cdb1a | 1179 | uint8_t whiteListSize = whitelistAddresses.size; |
Andrea Palmieri |
229:9981f62cdb1a | 1180 | if(whiteListSize == 0 && mode == Gap::SCAN_POLICY_FILTER_ALL_ADV) { |
Andrea Palmieri |
229:9981f62cdb1a | 1181 | return BLE_ERROR_OPERATION_NOT_PERMITTED; |
Andrea Palmieri |
229:9981f62cdb1a | 1182 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1183 | |
Andrea Palmieri |
217:23870c55b07e | 1184 | ret = btleStartRadioScan(scanningParams.getActiveScanning(), |
Andrea Palmieri |
217:23870c55b07e | 1185 | scanningParams.getInterval(), |
Andrea Palmieri |
217:23870c55b07e | 1186 | scanningParams.getWindow(), |
Andrea Palmieri |
217:23870c55b07e | 1187 | addr_type); |
Andrea Palmieri |
217:23870c55b07e | 1188 | |
Andrea Palmieri |
229:9981f62cdb1a | 1189 | PRINTF("Scanning...\n\r"); |
Andrea Palmieri |
229:9981f62cdb1a | 1190 | PRINTF("scanningParams.getInterval()=%u[msec]\r\n",(scanningParams.getInterval()*625)/1000); |
Andrea Palmieri |
229:9981f62cdb1a | 1191 | PRINTF("scanningParams.getWindow()=%u[msec]\r\n",(scanningParams.getWindow()*625)/1000); |
Andrea Palmieri |
229:9981f62cdb1a | 1192 | //PRINTF("_advParams.getInterval()=%u\r\n",_advParams.getInterval()); |
Andrea Palmieri |
229:9981f62cdb1a | 1193 | //PRINTF("CONN_P1=%u\r\n",(unsigned)CONN_P1); |
Andrea Palmieri |
229:9981f62cdb1a | 1194 | //PRINTF("CONN_P2=%u\r\n",(unsigned)CONN_P2); |
Andrea Palmieri |
217:23870c55b07e | 1195 | if (BLE_STATUS_SUCCESS == ret){ |
Andrea Palmieri |
217:23870c55b07e | 1196 | PRINTF("Observation Procedure Started\n"); |
Andrea Palmieri |
217:23870c55b07e | 1197 | _scanning = true; |
Andrea Palmieri |
217:23870c55b07e | 1198 | return BLE_ERROR_NONE; |
Andrea Palmieri |
145:024a552e4715 | 1199 | } |
Andrea Palmieri |
217:23870c55b07e | 1200 | |
Andrea Palmieri |
217:23870c55b07e | 1201 | // Observer role is not supported by X-NUCLEO-IDB04A1, return BLE_ERROR_NOT_IMPLEMENTED |
Andrea Palmieri |
217:23870c55b07e | 1202 | switch (ret) { |
Andrea Palmieri |
217:23870c55b07e | 1203 | case BLE_STATUS_INVALID_CID: |
Andrea Palmieri |
229:9981f62cdb1a | 1204 | PRINTF("Observation Procedure not implemented!!!\n\r"); |
Andrea Palmieri |
217:23870c55b07e | 1205 | return BLE_ERROR_NOT_IMPLEMENTED; |
Andrea Palmieri |
217:23870c55b07e | 1206 | default: |
Andrea Palmieri |
229:9981f62cdb1a | 1207 | PRINTF("Observation Procedure failed (0x%02X)\n\r", ret); |
Andrea Palmieri |
217:23870c55b07e | 1208 | return BLE_ERROR_UNSPECIFIED; |
Wolfgang Betz |
132:51056160fa4a | 1209 | } |
Andrea Palmieri |
217:23870c55b07e | 1210 | |
Wolfgang Betz |
130:770ce14d3d15 | 1211 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1212 | |
Wolfgang Betz |
130:770ce14d3d15 | 1213 | ble_error_t BlueNRGGap::stopScan() { |
Wolfgang Betz |
165:3576598c0889 | 1214 | tBleStatus ret = BLE_STATUS_SUCCESS; |
Andrea Palmieri |
229:9981f62cdb1a | 1215 | |
Andrea Palmieri |
229:9981f62cdb1a | 1216 | PRINTF("stopScan\n\r"); |
Andrea Palmieri |
217:23870c55b07e | 1217 | ret = aci_gap_terminate_gap_procedure(GAP_OBSERVATION_PROC); |
Wolfgang Betz |
132:51056160fa4a | 1218 | |
Wolfgang Betz |
132:51056160fa4a | 1219 | if (ret != BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
229:9981f62cdb1a | 1220 | PRINTF("GAP Terminate Gap Procedure failed\n"); |
Wolfgang Betz |
132:51056160fa4a | 1221 | return BLE_ERROR_UNSPECIFIED; |
Wolfgang Betz |
132:51056160fa4a | 1222 | } else { |
Wolfgang Betz |
132:51056160fa4a | 1223 | PRINTF("Discovery Procedure Terminated\n"); |
Wolfgang Betz |
130:770ce14d3d15 | 1224 | return BLE_ERROR_NONE; |
Wolfgang Betz |
132:51056160fa4a | 1225 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1226 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1227 | |
Wolfgang Betz |
130:770ce14d3d15 | 1228 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1229 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 1230 | @brief set Tx power level |
Wolfgang Betz |
130:770ce14d3d15 | 1231 | @param[in] txPower Transmission Power level |
Wolfgang Betz |
130:770ce14d3d15 | 1232 | @returns ble_error_t |
Wolfgang Betz |
130:770ce14d3d15 | 1233 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 1234 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1235 | ble_error_t BlueNRGGap::setTxPower(int8_t txPower) |
Wolfgang Betz |
130:770ce14d3d15 | 1236 | { |
Wolfgang Betz |
130:770ce14d3d15 | 1237 | tBleStatus ret; |
Wolfgang Betz |
130:770ce14d3d15 | 1238 | |
Wolfgang Betz |
130:770ce14d3d15 | 1239 | int8_t enHighPower = 0; |
Andrea Palmieri |
201:a9bc2e8b01d7 | 1240 | int8_t paLevel = 0; |
Andrea Palmieri |
201:a9bc2e8b01d7 | 1241 | |
Andrea Palmieri |
228:25368f053411 | 1242 | ret = getHighPowerAndPALevelValue(txPower, enHighPower, paLevel); |
Andrea Palmieri |
228:25368f053411 | 1243 | if(ret!=BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
228:25368f053411 | 1244 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Andrea Palmieri |
228:25368f053411 | 1245 | } |
Andrea Palmieri |
201:a9bc2e8b01d7 | 1246 | |
Wolfgang Betz |
132:51056160fa4a | 1247 | PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel); |
Wolfgang Betz |
130:770ce14d3d15 | 1248 | ret = aci_hal_set_tx_power_level(enHighPower, paLevel); |
Wolfgang Betz |
130:770ce14d3d15 | 1249 | if(ret!=BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
228:25368f053411 | 1250 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Wolfgang Betz |
130:770ce14d3d15 | 1251 | } |
Andrea Palmieri |
201:a9bc2e8b01d7 | 1252 | |
Wolfgang Betz |
130:770ce14d3d15 | 1253 | return BLE_ERROR_NONE; |
Wolfgang Betz |
130:770ce14d3d15 | 1254 | } |
Wolfgang Betz |
130:770ce14d3d15 | 1255 | |
Wolfgang Betz |
130:770ce14d3d15 | 1256 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1257 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 1258 | @brief get permitted Tx power values |
Wolfgang Betz |
130:770ce14d3d15 | 1259 | @param[in] values pointer to pointer to permitted power values |
Wolfgang Betz |
130:770ce14d3d15 | 1260 | @param[in] num number of values |
Wolfgang Betz |
130:770ce14d3d15 | 1261 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 1262 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 1263 | void BlueNRGGap::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) { |
Wolfgang Betz |
130:770ce14d3d15 | 1264 | static const int8_t permittedTxValues[] = { |
Andrea Palmieri |
229:9981f62cdb1a | 1265 | -18, -15, -14, -12, -11, -9, -8, -6, -5, -2, 0, 2, 4, 5, 8 |
Wolfgang Betz |
130:770ce14d3d15 | 1266 | }; |
Wolfgang Betz |
130:770ce14d3d15 | 1267 | |
Wolfgang Betz |
130:770ce14d3d15 | 1268 | *valueArrayPP = permittedTxValues; |
Wolfgang Betz |
130:770ce14d3d15 | 1269 | *countP = sizeof(permittedTxValues) / sizeof(int8_t); |
Wolfgang Betz |
130:770ce14d3d15 | 1270 | } |
Wolfgang Betz |
132:51056160fa4a | 1271 | |
Andrea Palmieri |
229:9981f62cdb1a | 1272 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1273 | /*! |
Andrea Palmieri |
232:aead10288880 | 1274 | @brief Set advertising parameters according to the current state |
Andrea Palmieri |
232:aead10288880 | 1275 | Parameters value is set taking into account guidelines of the BlueNRG |
Andrea Palmieri |
232:aead10288880 | 1276 | time slots allocation |
Andrea Palmieri |
232:aead10288880 | 1277 | */ |
Andrea Palmieri |
232:aead10288880 | 1278 | /**************************************************************************/ |
Andrea Palmieri |
232:aead10288880 | 1279 | void BlueNRGGap::setAdvParameters(void) |
Andrea Palmieri |
232:aead10288880 | 1280 | { |
Andrea Palmieri |
232:aead10288880 | 1281 | uint32_t advIntMS; |
Andrea Palmieri |
232:aead10288880 | 1282 | |
Andrea Palmieri |
232:aead10288880 | 1283 | if(state.connected == 1) { |
Andrea Palmieri |
232:aead10288880 | 1284 | advIntMS = (conn_min_interval*1.25)-GUARD_INT; |
Andrea Palmieri |
232:aead10288880 | 1285 | advInterval = _advParams.MSEC_TO_ADVERTISEMENT_DURATION_UNITS(advIntMS); |
Andrea Palmieri |
232:aead10288880 | 1286 | } else { |
Andrea Palmieri |
232:aead10288880 | 1287 | advInterval = _advParams.getIntervalInADVUnits(); |
Andrea Palmieri |
232:aead10288880 | 1288 | } |
Andrea Palmieri |
232:aead10288880 | 1289 | } |
Andrea Palmieri |
232:aead10288880 | 1290 | |
Andrea Palmieri |
232:aead10288880 | 1291 | /**************************************************************************/ |
Andrea Palmieri |
232:aead10288880 | 1292 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 1293 | @brief Set connection parameters according to the current state (ADV and/or SCAN) |
Andrea Palmieri |
229:9981f62cdb1a | 1294 | Parameters value is set taking into account guidelines of the BlueNRG |
Andrea Palmieri |
229:9981f62cdb1a | 1295 | time slots allocation |
Andrea Palmieri |
229:9981f62cdb1a | 1296 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1297 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1298 | void BlueNRGGap::setConnectionParameters(void) |
Andrea Palmieri |
229:9981f62cdb1a | 1299 | { |
Andrea Palmieri |
229:9981f62cdb1a | 1300 | if (state.advertising == 1) { |
Andrea Palmieri |
229:9981f62cdb1a | 1301 | |
Andrea Palmieri |
232:aead10288880 | 1302 | if (_scanningParams.getInterval() < advInterval) { |
Andrea Palmieri |
232:aead10288880 | 1303 | PRINTF("state.adv=1 scanInterval<advInterval\r\n"); |
Andrea Palmieri |
232:aead10288880 | 1304 | scanInterval = advInterval; |
Andrea Palmieri |
232:aead10288880 | 1305 | scanWindow = advInterval; |
Andrea Palmieri |
229:9981f62cdb1a | 1306 | } else { |
Andrea Palmieri |
232:aead10288880 | 1307 | PRINTF("state.adv=1 scanInterval>=advInterval\r\n"); |
Andrea Palmieri |
229:9981f62cdb1a | 1308 | scanInterval = _scanningParams.getInterval(); |
Andrea Palmieri |
229:9981f62cdb1a | 1309 | scanWindow = _scanningParams.getWindow(); |
Andrea Palmieri |
229:9981f62cdb1a | 1310 | } |
Andrea Palmieri |
234:3f6bba52b307 | 1311 | |
Andrea Palmieri |
234:3f6bba52b307 | 1312 | if(advInterval>(MAX_INT_CONN-(GUARD_INT/1.25))) { //(4000-GUARD_INT)ms |
Andrea Palmieri |
234:3f6bba52b307 | 1313 | conn_min_interval = MAX_INT_CONN; |
Andrea Palmieri |
234:3f6bba52b307 | 1314 | conn_max_interval = MAX_INT_CONN; |
Andrea Palmieri |
234:3f6bba52b307 | 1315 | } else { |
Andrea Palmieri |
234:3f6bba52b307 | 1316 | conn_min_interval = (_advParams.ADVERTISEMENT_DURATION_UNITS_TO_MS(advInterval)+GUARD_INT)/1.25; |
Andrea Palmieri |
234:3f6bba52b307 | 1317 | conn_max_interval = (_advParams.ADVERTISEMENT_DURATION_UNITS_TO_MS(advInterval)+GUARD_INT)/1.25; |
Andrea Palmieri |
234:3f6bba52b307 | 1318 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1319 | |
Andrea Palmieri |
229:9981f62cdb1a | 1320 | } else { |
Andrea Palmieri |
229:9981f62cdb1a | 1321 | |
Andrea Palmieri |
232:aead10288880 | 1322 | PRINTF("state.adv = 0\r\n"); |
Andrea Palmieri |
232:aead10288880 | 1323 | |
Andrea Palmieri |
229:9981f62cdb1a | 1324 | scanInterval = _scanningParams.getInterval(); |
Andrea Palmieri |
229:9981f62cdb1a | 1325 | scanWindow = _scanningParams.getWindow(); |
Andrea Palmieri |
234:3f6bba52b307 | 1326 | if(SCAN_DURATION_UNITS_TO_MSEC(scanInterval)>(MAX_INT_CONN*1.25) || |
Andrea Palmieri |
234:3f6bba52b307 | 1327 | SCAN_DURATION_UNITS_TO_MSEC(scanInterval)<(MIN_INT_CONN*1.25)) { //(4000)ms || (7.5)ms |
Andrea Palmieri |
234:3f6bba52b307 | 1328 | conn_min_interval = DEF_INT_CONN; |
Andrea Palmieri |
234:3f6bba52b307 | 1329 | conn_max_interval = DEF_INT_CONN; |
Andrea Palmieri |
234:3f6bba52b307 | 1330 | } else { |
Andrea Palmieri |
234:3f6bba52b307 | 1331 | conn_min_interval = SCAN_DURATION_UNITS_TO_MSEC(scanInterval)/1.25; |
Andrea Palmieri |
234:3f6bba52b307 | 1332 | conn_max_interval = SCAN_DURATION_UNITS_TO_MSEC(scanInterval)/1.25; |
Andrea Palmieri |
234:3f6bba52b307 | 1333 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1334 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1335 | PRINTF("scanInterval=%u[msec]\r\n",SCAN_DURATION_UNITS_TO_MSEC(scanInterval)); |
Andrea Palmieri |
229:9981f62cdb1a | 1336 | PRINTF("scanWindow()=%u[msec]\r\n",SCAN_DURATION_UNITS_TO_MSEC(scanWindow)); |
Andrea Palmieri |
234:3f6bba52b307 | 1337 | PRINTF("conn_min_interval=%u[msec]\r\n",(unsigned)(conn_min_interval*1.25)); |
Andrea Palmieri |
234:3f6bba52b307 | 1338 | PRINTF("conn_max_interval=%u[msec]\r\n",(unsigned)(conn_max_interval*1.25)); |
Andrea Palmieri |
229:9981f62cdb1a | 1339 | |
Andrea Palmieri |
229:9981f62cdb1a | 1340 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1341 | |
Andrea Palmieri |
181:749071129d2e | 1342 | ble_error_t BlueNRGGap::createConnection () |
Wolfgang Betz |
132:51056160fa4a | 1343 | { |
Wolfgang Betz |
132:51056160fa4a | 1344 | tBleStatus ret; |
Andrea Palmieri |
229:9981f62cdb1a | 1345 | |
Andrea Palmieri |
229:9981f62cdb1a | 1346 | /* |
Andrea Palmieri |
229:9981f62cdb1a | 1347 | Before creating connection, set parameters according |
Andrea Palmieri |
229:9981f62cdb1a | 1348 | to previous or current procedure (ADV and/or SCAN) |
Andrea Palmieri |
229:9981f62cdb1a | 1349 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1350 | setConnectionParameters(); |
Andrea Palmieri |
229:9981f62cdb1a | 1351 | |
Wolfgang Betz |
132:51056160fa4a | 1352 | /* |
Wolfgang Betz |
163:4c008b1089e9 | 1353 | Scan_Interval, Scan_Window, Peer_Address_Type, Peer_Address, Own_Address_Type, Conn_Interval_Min, |
Wolfgang Betz |
163:4c008b1089e9 | 1354 | Conn_Interval_Max, Conn_Latency, Supervision_Timeout, Conn_Len_Min, Conn_Len_Max |
Wolfgang Betz |
132:51056160fa4a | 1355 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1356 | ret = aci_gap_create_connection(scanInterval, |
Andrea Palmieri |
229:9981f62cdb1a | 1357 | scanWindow, |
Andrea Palmieri |
229:9981f62cdb1a | 1358 | _peerAddrType, |
Wolfgang Betz |
163:4c008b1089e9 | 1359 | (unsigned char*)_peerAddr, |
Andrea Palmieri |
229:9981f62cdb1a | 1360 | addr_type, |
Andrea Palmieri |
229:9981f62cdb1a | 1361 | conn_min_interval, conn_max_interval, 0, |
Andrea Palmieri |
220:e02936f0d4c7 | 1362 | SUPERV_TIMEOUT, CONN_L1 , CONN_L1); |
Wolfgang Betz |
165:3576598c0889 | 1363 | |
Wolfgang Betz |
165:3576598c0889 | 1364 | _connecting = false; |
Wolfgang Betz |
163:4c008b1089e9 | 1365 | |
Wolfgang Betz |
163:4c008b1089e9 | 1366 | if (ret != BLE_STATUS_SUCCESS) { |
Andrea Palmieri |
229:9981f62cdb1a | 1367 | PRINTF("Error while starting connection (ret=0x%02X).\n\r", ret); |
Wolfgang Betz |
132:51056160fa4a | 1368 | return BLE_ERROR_UNSPECIFIED; |
Wolfgang Betz |
132:51056160fa4a | 1369 | } else { |
Wolfgang Betz |
132:51056160fa4a | 1370 | PRINTF("Connection started.\n"); |
Wolfgang Betz |
132:51056160fa4a | 1371 | return BLE_ERROR_NONE; |
Wolfgang Betz |
132:51056160fa4a | 1372 | } |
Wolfgang Betz |
132:51056160fa4a | 1373 | } |
Wolfgang Betz |
132:51056160fa4a | 1374 | |
Wolfgang Betz |
132:51056160fa4a | 1375 | ble_error_t BlueNRGGap::connect (const Gap::Address_t peerAddr, |
Wolfgang Betz |
132:51056160fa4a | 1376 | Gap::AddressType_t peerAddrType, |
Wolfgang Betz |
132:51056160fa4a | 1377 | const ConnectionParams_t *connectionParams, |
Wolfgang Betz |
132:51056160fa4a | 1378 | const GapScanningParams *scanParams) |
Wolfgang Betz |
132:51056160fa4a | 1379 | { |
Andrea Palmieri |
142:adf1567d3900 | 1380 | /* avoid compiler warnings about unused variables */ |
Andrea Palmieri |
142:adf1567d3900 | 1381 | (void)connectionParams; |
Andrea Palmieri |
142:adf1567d3900 | 1382 | (void)scanParams; |
Andrea Palmieri |
142:adf1567d3900 | 1383 | |
Andrea Palmieri |
217:23870c55b07e | 1384 | // Save the peer address |
Wolfgang Betz |
132:51056160fa4a | 1385 | for(int i=0; i<BDADDR_SIZE; i++) { |
Wolfgang Betz |
132:51056160fa4a | 1386 | _peerAddr[i] = peerAddr[i]; |
Wolfgang Betz |
132:51056160fa4a | 1387 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1388 | _peerAddrType = peerAddrType; |
Wolfgang Betz |
132:51056160fa4a | 1389 | |
Andrea Palmieri |
181:749071129d2e | 1390 | _connecting = true; |
Wolfgang Betz |
132:51056160fa4a | 1391 | |
Wolfgang Betz |
132:51056160fa4a | 1392 | if(_scanning) { |
Wolfgang Betz |
132:51056160fa4a | 1393 | stopScan(); |
Wolfgang Betz |
132:51056160fa4a | 1394 | } else { |
Wolfgang Betz |
165:3576598c0889 | 1395 | PRINTF("Calling createConnection from connect()\n\r"); |
Wolfgang Betz |
165:3576598c0889 | 1396 | return createConnection(); |
Wolfgang Betz |
132:51056160fa4a | 1397 | } |
Wolfgang Betz |
132:51056160fa4a | 1398 | |
Wolfgang Betz |
132:51056160fa4a | 1399 | return BLE_ERROR_NONE; |
Wolfgang Betz |
132:51056160fa4a | 1400 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1401 | |
Andrea Palmieri |
229:9981f62cdb1a | 1402 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1403 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 1404 | @brief Set the advertising policy filter mode that will be used in |
Andrea Palmieri |
229:9981f62cdb1a | 1405 | the next call to startAdvertising(). |
Andrea Palmieri |
229:9981f62cdb1a | 1406 | |
Andrea Palmieri |
229:9981f62cdb1a | 1407 | @returns \ref ble_errror_t |
Andrea Palmieri |
229:9981f62cdb1a | 1408 | |
Andrea Palmieri |
229:9981f62cdb1a | 1409 | @retval BLE_ERROR_NONE |
Andrea Palmieri |
229:9981f62cdb1a | 1410 | Everything executed properly. |
Andrea Palmieri |
229:9981f62cdb1a | 1411 | |
Andrea Palmieri |
229:9981f62cdb1a | 1412 | BLE_ERROR_NOT_IMPLEMENTED |
Andrea Palmieri |
229:9981f62cdb1a | 1413 | This feature is currently note implemented. |
Andrea Palmieri |
229:9981f62cdb1a | 1414 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1415 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1416 | ble_error_t BlueNRGGap::setAdvertisingPolicyMode(Gap::AdvertisingPolicyMode_t mode) |
Andrea Palmieri |
229:9981f62cdb1a | 1417 | { |
Andrea Palmieri |
229:9981f62cdb1a | 1418 | advertisingPolicyMode = mode; |
Andrea Palmieri |
229:9981f62cdb1a | 1419 | |
Andrea Palmieri |
229:9981f62cdb1a | 1420 | return BLE_ERROR_NONE; |
Andrea Palmieri |
229:9981f62cdb1a | 1421 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1422 | |
Andrea Palmieri |
229:9981f62cdb1a | 1423 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1424 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 1425 | @brief Set the scanning policy filter mode that will be used in |
Andrea Palmieri |
229:9981f62cdb1a | 1426 | the next call to startAdvertising(). |
Andrea Palmieri |
229:9981f62cdb1a | 1427 | |
Andrea Palmieri |
229:9981f62cdb1a | 1428 | @returns \ref ble_errror_t |
Andrea Palmieri |
229:9981f62cdb1a | 1429 | |
Andrea Palmieri |
229:9981f62cdb1a | 1430 | @retval BLE_ERROR_NONE |
Andrea Palmieri |
229:9981f62cdb1a | 1431 | Everything executed properly. |
Andrea Palmieri |
229:9981f62cdb1a | 1432 | |
Andrea Palmieri |
229:9981f62cdb1a | 1433 | BLE_ERROR_NOT_IMPLEMENTED |
Andrea Palmieri |
229:9981f62cdb1a | 1434 | This feature is currently note implemented. |
Andrea Palmieri |
229:9981f62cdb1a | 1435 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1436 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1437 | ble_error_t BlueNRGGap::setScanningPolicyMode(Gap::ScanningPolicyMode_t mode) |
Andrea Palmieri |
229:9981f62cdb1a | 1438 | { |
Andrea Palmieri |
229:9981f62cdb1a | 1439 | scanningPolicyMode = mode; |
Andrea Palmieri |
229:9981f62cdb1a | 1440 | |
Andrea Palmieri |
229:9981f62cdb1a | 1441 | return BLE_ERROR_NONE; |
Andrea Palmieri |
229:9981f62cdb1a | 1442 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1443 | |
Andrea Palmieri |
229:9981f62cdb1a | 1444 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1445 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 1446 | @brief Get the current advertising policy filter mode. |
Andrea Palmieri |
229:9981f62cdb1a | 1447 | |
Andrea Palmieri |
229:9981f62cdb1a | 1448 | @returns The advertising policy filter mode. |
Andrea Palmieri |
229:9981f62cdb1a | 1449 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1450 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1451 | Gap::AdvertisingPolicyMode_t BlueNRGGap::getAdvertisingPolicyMode(void) const |
Andrea Palmieri |
229:9981f62cdb1a | 1452 | { |
Andrea Palmieri |
229:9981f62cdb1a | 1453 | return advertisingPolicyMode; |
Andrea Palmieri |
229:9981f62cdb1a | 1454 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1455 | |
Andrea Palmieri |
229:9981f62cdb1a | 1456 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1457 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 1458 | @brief Get the current scanning policy filter mode. |
Andrea Palmieri |
229:9981f62cdb1a | 1459 | |
Andrea Palmieri |
229:9981f62cdb1a | 1460 | @returns The scanning policy filter mode. |
Andrea Palmieri |
229:9981f62cdb1a | 1461 | |
Andrea Palmieri |
229:9981f62cdb1a | 1462 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1463 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1464 | Gap::ScanningPolicyMode_t BlueNRGGap::getScanningPolicyMode(void) const |
Andrea Palmieri |
229:9981f62cdb1a | 1465 | { |
Andrea Palmieri |
229:9981f62cdb1a | 1466 | return scanningPolicyMode; |
Andrea Palmieri |
229:9981f62cdb1a | 1467 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1468 | |
Andrea Palmieri |
229:9981f62cdb1a | 1469 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1470 | /*! |
Andrea Palmieri |
229:9981f62cdb1a | 1471 | @brief Clear BlueNRGGap's state. |
Andrea Palmieri |
229:9981f62cdb1a | 1472 | |
Andrea Palmieri |
229:9981f62cdb1a | 1473 | @returns ble_error_t |
Andrea Palmieri |
229:9981f62cdb1a | 1474 | |
Andrea Palmieri |
229:9981f62cdb1a | 1475 | @retval BLE_ERROR_NONE |
Andrea Palmieri |
229:9981f62cdb1a | 1476 | Everything executed properly |
Andrea Palmieri |
229:9981f62cdb1a | 1477 | */ |
Andrea Palmieri |
229:9981f62cdb1a | 1478 | /**************************************************************************/ |
Andrea Palmieri |
229:9981f62cdb1a | 1479 | ble_error_t BlueNRGGap::reset(void) |
Andrea Palmieri |
229:9981f62cdb1a | 1480 | { |
Andrea Palmieri |
229:9981f62cdb1a | 1481 | /* Clear all state that is from the parent, including private members */ |
Andrea Palmieri |
229:9981f62cdb1a | 1482 | if (Gap::reset() != BLE_ERROR_NONE) { |
Andrea Palmieri |
229:9981f62cdb1a | 1483 | return BLE_ERROR_INVALID_STATE; |
Andrea Palmieri |
229:9981f62cdb1a | 1484 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1485 | |
Andrea Palmieri |
229:9981f62cdb1a | 1486 | /* Clear derived class members */ |
Andrea Palmieri |
229:9981f62cdb1a | 1487 | m_connectionHandle = BLE_CONN_HANDLE_INVALID; |
Andrea Palmieri |
229:9981f62cdb1a | 1488 | |
Andrea Palmieri |
229:9981f62cdb1a | 1489 | memset(deviceAppearance, 0, sizeof(deviceAppearance)); |
Andrea Palmieri |
229:9981f62cdb1a | 1490 | memset(local_name, 0, LOCAL_NAME_MAX_SIZE); |
Andrea Palmieri |
229:9981f62cdb1a | 1491 | memset(local_name, 0, UUID_BUFFER_SIZE); |
Andrea Palmieri |
229:9981f62cdb1a | 1492 | memset(AdvData, 0, ADV_DATA_MAX_SIZE); |
Andrea Palmieri |
229:9981f62cdb1a | 1493 | |
Andrea Palmieri |
229:9981f62cdb1a | 1494 | /* Set the whitelist policy filter modes to IGNORE_WHITELIST */ |
Andrea Palmieri |
229:9981f62cdb1a | 1495 | advertisingPolicyMode = Gap::ADV_POLICY_IGNORE_WHITELIST; |
Andrea Palmieri |
229:9981f62cdb1a | 1496 | scanningPolicyMode = Gap::SCAN_POLICY_IGNORE_WHITELIST; |
Andrea Palmieri |
229:9981f62cdb1a | 1497 | |
Andrea Palmieri |
229:9981f62cdb1a | 1498 | return BLE_ERROR_NONE; |
Andrea Palmieri |
229:9981f62cdb1a | 1499 | } |
Andrea Palmieri |
229:9981f62cdb1a | 1500 |