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