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