HW layer for the Nucleo board, it only work with old BLE_API
Dependents: Hello_BLE F446RE-BLE
Fork of X_NUCLEO_IDB0XA1 by
BlueNRGGap.cpp@95:e1f7ce04e71b, 2015-07-24 (annotated)
- Committer:
- apalmieri
- Date:
- Fri Jul 24 17:16:54 2015 +0000
- Revision:
- 95:e1f7ce04e71b
- Parent:
- 94:2993df23d1ac
Restore previous version of HCI stack
;
; Also re-enable AD_TYPE_FLAGS within Advertising payload
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Silvio Lucio Oliva |
70:d20d30f59b1c | 1 | /* mbed Microcontroller Library |
Silvio Lucio Oliva |
70:d20d30f59b1c | 2 | * Copyright (c) 2006-2013 ARM Limited |
Silvio Lucio Oliva |
70:d20d30f59b1c | 3 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 5 | * you may not use this file except in compliance with the License. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 6 | * You may obtain a copy of the License at |
Silvio Lucio Oliva |
70:d20d30f59b1c | 7 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
Silvio Lucio Oliva |
70:d20d30f59b1c | 9 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 10 | * Unless required by applicable law or agreed to in writing, software |
Silvio Lucio Oliva |
70:d20d30f59b1c | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 13 | * See the License for the specific language governing permissions and |
Silvio Lucio Oliva |
70:d20d30f59b1c | 14 | * limitations under the License. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 15 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 16 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 17 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 18 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 19 | ****************************************************************************** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 20 | * @file BlueNRGGap.cpp |
Silvio Lucio Oliva |
70:d20d30f59b1c | 21 | * @author STMicroelectronics |
Silvio Lucio Oliva |
70:d20d30f59b1c | 22 | * @brief Implementation of BLE_API Gap Class |
Silvio Lucio Oliva |
70:d20d30f59b1c | 23 | ****************************************************************************** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 24 | * @copy |
Silvio Lucio Oliva |
70:d20d30f59b1c | 25 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 26 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS |
Silvio Lucio Oliva |
70:d20d30f59b1c | 27 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 28 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY |
Silvio Lucio Oliva |
70:d20d30f59b1c | 29 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING |
Silvio Lucio Oliva |
70:d20d30f59b1c | 30 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 31 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 32 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 33 | * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
Silvio Lucio Oliva |
70:d20d30f59b1c | 34 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 35 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 36 | // ANDREA: Changed some types (e.g., tHalUint8 --> uint8_t) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 37 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 38 | /** @defgroup BlueNRGGap |
Silvio Lucio Oliva |
70:d20d30f59b1c | 39 | * @brief BlueNRG BLE_API GAP Adaptation |
Silvio Lucio Oliva |
70:d20d30f59b1c | 40 | * @{ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 41 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 42 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 43 | #include "BlueNRGDevice.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 44 | #include "mbed.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 45 | #include "Payload.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 46 | #include "Utils.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 47 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 48 | //Local Variables |
apalmieri | 94:2993df23d1ac | 49 | //const char *local_name = NULL; |
apalmieri | 94:2993df23d1ac | 50 | //uint8_t local_name_length = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 51 | const uint8_t *scan_response_payload = NULL; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 52 | uint8_t scan_rsp_length = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 53 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 54 | uint32_t advtInterval = BLUENRG_GAP_ADV_INTERVAL_MAX; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 55 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 56 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 57 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 58 | @brief Sets the advertising parameters and payload for the device. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 59 | Note: Some data types give error when their adv data is updated using aci_gap_update_adv_data() API |
Silvio Lucio Oliva |
70:d20d30f59b1c | 60 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 61 | @params[in] advData |
Silvio Lucio Oliva |
70:d20d30f59b1c | 62 | The primary advertising data payload |
Silvio Lucio Oliva |
70:d20d30f59b1c | 63 | @params[in] scanResponse |
Silvio Lucio Oliva |
70:d20d30f59b1c | 64 | The optional Scan Response payload if the advertising |
Silvio Lucio Oliva |
70:d20d30f59b1c | 65 | type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED |
Silvio Lucio Oliva |
70:d20d30f59b1c | 66 | in \ref GapAdveritinngParams |
Silvio Lucio Oliva |
70:d20d30f59b1c | 67 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 68 | @returns \ref ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 69 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 70 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 71 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 72 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 73 | @retval BLE_ERROR_BUFFER_OVERFLOW |
Silvio Lucio Oliva |
70:d20d30f59b1c | 74 | The proposed action would cause a buffer overflow. All |
Silvio Lucio Oliva |
70:d20d30f59b1c | 75 | advertising payloads must be <= 31 bytes, for example. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 76 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 77 | @retval BLE_ERROR_NOT_IMPLEMENTED |
Silvio Lucio Oliva |
70:d20d30f59b1c | 78 | A feature was requested that is not yet supported in the |
Silvio Lucio Oliva |
70:d20d30f59b1c | 79 | nRF51 firmware or hardware. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 80 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 81 | @retval BLE_ERROR_PARAM_OUT_OF_RANGE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 82 | One of the proposed values is outside the valid range. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 83 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 84 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 85 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 86 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 87 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 88 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 89 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 90 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 91 | ble_error_t BlueNRGGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 92 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 93 | DEBUG("BlueNRGGap::setAdvertisingData\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 94 | /* Make sure we don't exceed the advertising payload length */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 95 | if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 96 | return BLE_ERROR_BUFFER_OVERFLOW; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 97 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 98 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 99 | /* Make sure we have a payload! */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 100 | if (advData.getPayloadLen() <= 0) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 101 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 102 | } else { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 103 | PayloadPtr loadPtr(advData.getPayload(), advData.getPayloadLen()); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 104 | for(uint8_t index=0; index<loadPtr.getPayloadUnitCount(); index++) { |
apalmieri | 94:2993df23d1ac | 105 | PayloadUnit unit = loadPtr.getUnitAtIndex(index); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 106 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 107 | DEBUG("adData[%d].length=%d\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getLenPtr())); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 108 | DEBUG("adData[%d].AdType=0x%x\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr())); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 109 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 110 | switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 111 | case GapAdvertisingData::FLAGS: /* ref *Flags */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 112 | { |
apalmieri | 94:2993df23d1ac | 113 | DEBUG("Advertising type: FLAGS\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 114 | //Check if Flags are OK. BlueNRG only supports LE Mode. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 115 | uint8_t *flags = loadPtr.getUnitAtIndex(index).getDataPtr(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 116 | if((*flags & GapAdvertisingData::BREDR_NOT_SUPPORTED) != GapAdvertisingData::BREDR_NOT_SUPPORTED) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 117 | DEBUG("BlueNRG does not support BR/EDR Mode"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 118 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 119 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 120 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 121 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 122 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 123 | case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS: /**< Incomplete list of 16-bit Service IDs */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 124 | case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS: /**< Complete list of 16-bit Service IDs */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 125 | { |
apalmieri | 94:2993df23d1ac | 126 | DEBUG("Advertising type: INCOMPLETE_LIST_16BIT_SERVICE_IDS/COMPLETE_LIST_16BIT_SERVICE_IDS\n\r"); |
apalmieri | 94:2993df23d1ac | 127 | |
apalmieri | 94:2993df23d1ac | 128 | uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; |
apalmieri | 94:2993df23d1ac | 129 | // The total lenght should include the Data Type Value |
apalmieri | 94:2993df23d1ac | 130 | if(buffSize>UUID_BUFFER_SIZE-1) { |
apalmieri | 94:2993df23d1ac | 131 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 132 | } |
apalmieri | 94:2993df23d1ac | 133 | |
apalmieri | 94:2993df23d1ac | 134 | servUuidlength = buffSize+1; // +1 to include the Data Type Value |
apalmieri | 94:2993df23d1ac | 135 | servUuidData[0] = (uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()); //Data Type Value |
apalmieri | 94:2993df23d1ac | 136 | |
apalmieri | 94:2993df23d1ac | 137 | DEBUG("servUuidlength=%d servUuidData[0]=%d buffSize=%d\n\r", servUuidlength, servUuidData[0], buffSize); |
apalmieri | 94:2993df23d1ac | 138 | // Save the Service UUID list just after the Data Type Value field |
apalmieri | 94:2993df23d1ac | 139 | memcpy(servUuidData+1, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); |
apalmieri | 94:2993df23d1ac | 140 | |
apalmieri | 94:2993df23d1ac | 141 | for(unsigned i=0; i<servUuidlength; i++) { |
apalmieri | 94:2993df23d1ac | 142 | DEBUG("servUuidData[%d] = 0x%x\n\r", i, servUuidData[i]); |
apalmieri | 94:2993df23d1ac | 143 | } |
apalmieri | 94:2993df23d1ac | 144 | |
apalmieri | 94:2993df23d1ac | 145 | for(unsigned i=0; i<buffSize; i++) { |
apalmieri | 94:2993df23d1ac | 146 | DEBUG("loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]); |
apalmieri | 94:2993df23d1ac | 147 | } |
apalmieri | 94:2993df23d1ac | 148 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 149 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 150 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 151 | case GapAdvertisingData::INCOMPLETE_LIST_32BIT_SERVICE_IDS: /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 152 | { |
apalmieri | 94:2993df23d1ac | 153 | DEBUG("Advertising type: INCOMPLETE_LIST_32BIT_SERVICE_IDS\n\r"); |
apalmieri | 94:2993df23d1ac | 154 | return BLE_ERROR_NOT_IMPLEMENTED; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 155 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 156 | case GapAdvertisingData::COMPLETE_LIST_32BIT_SERVICE_IDS: /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 157 | { |
apalmieri | 94:2993df23d1ac | 158 | DEBUG("Advertising type: COMPLETE_LIST_32BIT_SERVICE_IDS\n\r"); |
apalmieri | 94:2993df23d1ac | 159 | return BLE_ERROR_NOT_IMPLEMENTED; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 160 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 161 | case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 162 | { |
apalmieri | 94:2993df23d1ac | 163 | DEBUG("Advertising type: INCOMPLETE_LIST_128BIT_SERVICE_IDS\n\r"); |
apalmieri | 94:2993df23d1ac | 164 | return BLE_ERROR_NOT_IMPLEMENTED; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 165 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 166 | case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS: /**< Complete list of 128-bit Service IDs */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 167 | { |
apalmieri | 94:2993df23d1ac | 168 | DEBUG("Advertising type: COMPLETE_LIST_128BIT_SERVICE_IDS\n\r"); |
apalmieri | 94:2993df23d1ac | 169 | return BLE_ERROR_NOT_IMPLEMENTED; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 170 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 171 | case GapAdvertisingData::SHORTENED_LOCAL_NAME: /**< Shortened Local Name */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 172 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 173 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 174 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 175 | case GapAdvertisingData::COMPLETE_LOCAL_NAME: /**< Complete Local Name */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 176 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 177 | DEBUG("Advertising type: COMPLETE_LOCAL_NAME\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 178 | loadPtr.getUnitAtIndex(index).printDataAsString(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 179 | local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; |
apalmieri | 94:2993df23d1ac | 180 | local_name = (uint8_t*)loadPtr.getUnitAtIndex(index).getAdTypePtr(); |
apalmieri | 94:2993df23d1ac | 181 | DEBUG("Advertising type: COMPLETE_LOCAL_NAME local_name=%s\n\r", local_name); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 182 | //COMPLETE_LOCAL_NAME is only advertising device name. Gatt Device Name is not the same.(Must be set right after GAP/GATT init?) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 183 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 184 | DEBUG("device_name length=%d\n\r", local_name_length); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 185 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 186 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 187 | case GapAdvertisingData::TX_POWER_LEVEL: /**< TX Power Level (in dBm) */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 188 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 189 | DEBUG("Advertising type: TX_POWER_LEVEL\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 190 | int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 191 | int8_t enHighPower = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 192 | int8_t paLevel = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 193 | int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 194 | DEBUG("dbm=%d, dbmActuallySet=%d\n\r", dbm, dbmActuallySet); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 195 | DEBUG("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 196 | aci_hal_set_tx_power_level(enHighPower, paLevel); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 197 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 198 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 199 | case GapAdvertisingData::DEVICE_ID: /**< Device ID */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 200 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 201 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 202 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 203 | case GapAdvertisingData::SLAVE_CONNECTION_INTERVAL_RANGE: /**< Slave :Connection Interval Range */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 204 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 205 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 206 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 207 | case GapAdvertisingData::SERVICE_DATA: /**< Service Data */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 208 | { |
apalmieri | 94:2993df23d1ac | 209 | DEBUG("Advertising type: SERVICE_DATA\n\r"); |
apalmieri | 94:2993df23d1ac | 210 | uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; |
apalmieri | 94:2993df23d1ac | 211 | DEBUG("Advertising type: SERVICE_DATA (buffSize=%d)\n\r", buffSize); |
apalmieri | 94:2993df23d1ac | 212 | // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Service Data Type Value byte |
apalmieri | 94:2993df23d1ac | 213 | if(buffSize>ADV_DATA_MAX_SIZE-2) { |
apalmieri | 94:2993df23d1ac | 214 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
apalmieri | 94:2993df23d1ac | 215 | } |
apalmieri | 94:2993df23d1ac | 216 | for(unsigned i=0; i<buffSize+1; i++) { |
apalmieri | 94:2993df23d1ac | 217 | DEBUG("Advertising type: SERVICE_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]); |
apalmieri | 94:2993df23d1ac | 218 | } |
apalmieri | 94:2993df23d1ac | 219 | AdvLen = buffSize+2; // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Service Data Type Value byte |
apalmieri | 94:2993df23d1ac | 220 | AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data) |
apalmieri | 94:2993df23d1ac | 221 | AdvData[1] = AD_TYPE_SERVICE_DATA; |
apalmieri | 94:2993df23d1ac | 222 | memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 223 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 224 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 225 | case GapAdvertisingData::APPEARANCE: |
Silvio Lucio Oliva |
70:d20d30f59b1c | 226 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 227 | /* |
Silvio Lucio Oliva |
70:d20d30f59b1c | 228 | Tested with GapAdvertisingData::GENERIC_PHONE. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 229 | for other appearances BLE Scanner android app is not behaving properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 230 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 231 | DEBUG("Advertising type: APPEARANCE\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 232 | const char *deviceAppearance = NULL; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 233 | deviceAppearance = (const char*)loadPtr.getUnitAtIndex(index).getDataPtr(); // to be set later when startAdvertising() is called |
Silvio Lucio Oliva |
70:d20d30f59b1c | 234 | |
Andrea Palmieri |
77:332b416123b4 | 235 | uint8_t Appearance[2] = {0, 0}; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 236 | uint16_t devP = (uint16_t)*deviceAppearance; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 237 | STORE_LE_16(Appearance, (uint16_t)devP); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 238 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 239 | DEBUG("input: deviceAppearance= 0x%x 0x%x..., strlen(deviceAppearance)=%d\n\r", Appearance[1], Appearance[0], (uint8_t)*loadPtr.getUnitAtIndex(index).getLenPtr()-1); /**< \ref Appearance */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 240 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 241 | aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (uint8_t *)deviceAppearance);//not using array Appearance[2] |
Silvio Lucio Oliva |
70:d20d30f59b1c | 242 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 243 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 244 | case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 245 | { |
apalmieri | 94:2993df23d1ac | 246 | DEBUG("Advertising type: ADVERTISING_INTERVAL\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 247 | advtInterval = (uint16_t)(*loadPtr.getUnitAtIndex(index).getDataPtr()); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 248 | DEBUG("advtInterval=%d\n\r", advtInterval); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 249 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 250 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 251 | case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 252 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 253 | break; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 254 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 255 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 256 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 257 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 258 | //Set the SCAN_RSP Payload |
Silvio Lucio Oliva |
70:d20d30f59b1c | 259 | scan_response_payload = scanResponse.getPayload(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 260 | scan_rsp_length = scanResponse.getPayloadLen(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 261 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 262 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 263 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 264 | |
apalmieri | 94:2993df23d1ac | 265 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 266 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 267 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 268 | @brief Starts the BLE HW, initialising any services that were |
Silvio Lucio Oliva |
70:d20d30f59b1c | 269 | added before this function was called. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 270 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 271 | @param[in] params |
Silvio Lucio Oliva |
70:d20d30f59b1c | 272 | Basic advertising details, including the advertising |
Silvio Lucio Oliva |
70:d20d30f59b1c | 273 | delay, timeout and how the device should be advertised |
Silvio Lucio Oliva |
70:d20d30f59b1c | 274 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 275 | @note All services must be added before calling this function! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 276 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 277 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 278 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 279 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 280 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 281 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 282 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 283 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 284 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 285 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 286 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 287 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 288 | /**************************************************************************/ |
apalmieri | 94:2993df23d1ac | 289 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 290 | ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams ¶ms) |
apalmieri | 94:2993df23d1ac | 291 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 292 | /* Make sure we support the advertising type */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 293 | if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 294 | /* ToDo: This requires a propery security implementation, etc. */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 295 | return BLE_ERROR_NOT_IMPLEMENTED; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 296 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 297 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 298 | /* Check interval range */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 299 | if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 300 | /* Min delay is slightly longer for unconnectable devices */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 301 | if ((params.getInterval() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) || |
Silvio Lucio Oliva |
70:d20d30f59b1c | 302 | (params.getInterval() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 303 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 304 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 305 | } else { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 306 | if ((params.getInterval() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN) || |
Silvio Lucio Oliva |
70:d20d30f59b1c | 307 | (params.getInterval() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 308 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 309 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 310 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 311 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 312 | /* Check timeout is zero for Connectable Directed */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 313 | if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 314 | /* Timeout must be 0 with this type, although we'll never get here */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 315 | /* since this isn't implemented yet anyway */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 316 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 317 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 318 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 319 | /* Check timeout for other advertising types */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 320 | if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && |
Silvio Lucio Oliva |
70:d20d30f59b1c | 321 | (params.getTimeout() > GapAdvertisingParams::GAP_ADV_PARAMS_TIMEOUT_MAX)) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 322 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 323 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 324 | |
Andrea Palmieri |
77:332b416123b4 | 325 | //tBleStatus ret; |
Andrea Palmieri |
71:d229db0a153b | 326 | //const LongUUIDBytes_t HRM_SERVICE_UUID_128 = {0x18, 0x0D}; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 327 | /* set scan response data */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 328 | 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[]);*/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 329 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 330 | /*aci_gap_set_discoverable(Advertising_Event_Type, Adv_min_intvl, Adv_Max_Intvl, Addr_Type, Adv_Filter_Policy, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 331 | Local_Name_Length, local_name, service_uuid_length, service_uuid_list, Slave_conn_intvl_min, Slave_conn_intvl_max);*/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 332 | /*LINK_LAYER.H DESCRIBES THE ADVERTISING TYPES*/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 333 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 334 | char* name = NULL; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 335 | uint8_t nameLen = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 336 | if(local_name!=NULL) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 337 | name = (char*)local_name; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 338 | DEBUG("name=%s\n\r", name); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 339 | nameLen = local_name_length; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 340 | } else { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 341 | char str[] = "ST_BLE_DEV"; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 342 | name = new char[strlen(str)+1]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 343 | name[0] = AD_TYPE_COMPLETE_LOCAL_NAME; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 344 | strcpy(name+1, str); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 345 | nameLen = strlen(name); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 346 | DEBUG("nameLen=%d\n\r", nameLen); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 347 | DEBUG("name=%s\n\r", name); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 348 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 349 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 350 | advtInterval = params.getInterval(); // set advtInterval in case it is not already set by user application |
Silvio Lucio Oliva |
70:d20d30f59b1c | 351 | ret = aci_gap_set_discoverable(params.getAdvertisingType(), // Advertising_Event_Type |
Silvio Lucio Oliva |
70:d20d30f59b1c | 352 | BLUENRG_GAP_ADV_INTERVAL_MIN, // Adv_Interval_Min |
Silvio Lucio Oliva |
70:d20d30f59b1c | 353 | advtInterval, // Adv_Interval_Max |
Silvio Lucio Oliva |
70:d20d30f59b1c | 354 | PUBLIC_ADDR, // Address_Type |
Silvio Lucio Oliva |
70:d20d30f59b1c | 355 | NO_WHITE_LIST_USE, // Adv_Filter_Policy |
Silvio Lucio Oliva |
70:d20d30f59b1c | 356 | nameLen, //local_name_length, // Local_Name_Length |
Silvio Lucio Oliva |
70:d20d30f59b1c | 357 | (const char*)name, //local_name, // Local_Name |
Silvio Lucio Oliva |
70:d20d30f59b1c | 358 | servUuidlength, //Service_Uuid_Length |
Silvio Lucio Oliva |
70:d20d30f59b1c | 359 | servUuidData, //Service_Uuid_List |
Silvio Lucio Oliva |
70:d20d30f59b1c | 360 | 0, // Slave_Conn_Interval_Min |
Silvio Lucio Oliva |
70:d20d30f59b1c | 361 | 0); // Slave_Conn_Interval_Max |
apalmieri | 94:2993df23d1ac | 362 | |
apalmieri | 94:2993df23d1ac | 363 | ret = aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL); |
apalmieri | 94:2993df23d1ac | 364 | if (ret != BLE_STATUS_SUCCESS){ |
apalmieri | 94:2993df23d1ac | 365 | DEBUG("aci_gap_delete_ad_type failed return=%d\n", ret); |
apalmieri | 94:2993df23d1ac | 366 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
apalmieri | 94:2993df23d1ac | 367 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 368 | |
apalmieri | 94:2993df23d1ac | 369 | ret = aci_gap_update_adv_data(AdvLen, AdvData); |
apalmieri | 94:2993df23d1ac | 370 | if(BLE_STATUS_SUCCESS!=ret) { |
apalmieri | 94:2993df23d1ac | 371 | DEBUG("error occurred while adding adv data (ret=0x%x)\n", ret); |
apalmieri | 94:2993df23d1ac | 372 | return BLE_ERROR_PARAM_OUT_OF_RANGE; // no other suitable error code is available |
apalmieri | 94:2993df23d1ac | 373 | } |
apalmieri | 94:2993df23d1ac | 374 | |
apalmieri | 94:2993df23d1ac | 375 | state.advertising = 1; |
apalmieri | 94:2993df23d1ac | 376 | |
apalmieri | 94:2993df23d1ac | 377 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 378 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 379 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 380 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 381 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 382 | @brief Stops the BLE HW and disconnects from any devices |
Silvio Lucio Oliva |
70:d20d30f59b1c | 383 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 384 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 385 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 386 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 387 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 388 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 389 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 390 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 391 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 392 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 393 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 394 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 395 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 396 | ble_error_t BlueNRGGap::stopAdvertising(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 397 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 398 | tBleStatus ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 399 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 400 | if(state.advertising == 1) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 401 | //Set non-discoverable to stop advertising |
Silvio Lucio Oliva |
70:d20d30f59b1c | 402 | ret = aci_gap_set_non_discoverable(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 403 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 404 | if (ret != BLE_STATUS_SUCCESS){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 405 | DEBUG("Error in stopping advertisement!!\n\r") ; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 406 | return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value |
Silvio Lucio Oliva |
70:d20d30f59b1c | 407 | //FIXME: Define Error values equivalent to BlueNRG Error Codes. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 408 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 409 | DEBUG("Advertisement stopped!!\n\r") ; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 410 | //Set GapState_t::advertising state |
Silvio Lucio Oliva |
70:d20d30f59b1c | 411 | state.advertising = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 412 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 413 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 414 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 415 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 416 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 417 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 418 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 419 | @brief Disconnects if we are connected to a central device |
Silvio Lucio Oliva |
70:d20d30f59b1c | 420 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 421 | @param[in] reason |
Silvio Lucio Oliva |
70:d20d30f59b1c | 422 | Disconnection Reason |
Silvio Lucio Oliva |
70:d20d30f59b1c | 423 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 424 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 425 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 426 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 427 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 428 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 429 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 430 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 431 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 432 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 433 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 434 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 435 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 436 | ble_error_t BlueNRGGap::disconnect(Gap::DisconnectionReason_t reason) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 437 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 438 | tBleStatus ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 439 | //For Reason codes check BlueTooth HCI Spec |
Silvio Lucio Oliva |
70:d20d30f59b1c | 440 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 441 | if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 442 | ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 443 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 444 | if (ret != BLE_STATUS_SUCCESS){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 445 | DEBUG("Error in GAP termination!!\n\r") ; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 446 | return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value |
Silvio Lucio Oliva |
70:d20d30f59b1c | 447 | //FIXME: Define Error values equivalent to BlueNRG Error Codes. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 448 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 449 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 450 | //DEBUG("Disconnected from localhost!!\n\r") ; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 451 | m_connectionHandle = BLE_CONN_HANDLE_INVALID; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 452 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 453 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 454 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 455 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 456 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 457 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 458 | /*! |
Andrea Palmieri |
77:332b416123b4 | 459 | @brief Disconnects if we are connected to a central device |
Andrea Palmieri |
77:332b416123b4 | 460 | |
Andrea Palmieri |
77:332b416123b4 | 461 | @param[in] reason |
Andrea Palmieri |
77:332b416123b4 | 462 | Disconnection Reason |
Andrea Palmieri |
77:332b416123b4 | 463 | |
Andrea Palmieri |
77:332b416123b4 | 464 | @returns ble_error_t |
Andrea Palmieri |
77:332b416123b4 | 465 | |
Andrea Palmieri |
77:332b416123b4 | 466 | @retval BLE_ERROR_NONE |
Andrea Palmieri |
77:332b416123b4 | 467 | Everything executed properly |
Andrea Palmieri |
77:332b416123b4 | 468 | |
Andrea Palmieri |
77:332b416123b4 | 469 | @section EXAMPLE |
Andrea Palmieri |
77:332b416123b4 | 470 | |
Andrea Palmieri |
77:332b416123b4 | 471 | @code |
Andrea Palmieri |
77:332b416123b4 | 472 | |
Andrea Palmieri |
77:332b416123b4 | 473 | @endcode |
Andrea Palmieri |
77:332b416123b4 | 474 | */ |
Andrea Palmieri |
77:332b416123b4 | 475 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 476 | ble_error_t BlueNRGGap::disconnect(Handle_t connectionHandle, Gap::DisconnectionReason_t reason) |
Andrea Palmieri |
77:332b416123b4 | 477 | { |
Andrea Palmieri |
77:332b416123b4 | 478 | tBleStatus ret; |
Andrea Palmieri |
77:332b416123b4 | 479 | //For Reason codes check BlueTooth HCI Spec |
Andrea Palmieri |
77:332b416123b4 | 480 | |
Andrea Palmieri |
77:332b416123b4 | 481 | if(connectionHandle != BLE_CONN_HANDLE_INVALID) { |
Andrea Palmieri |
77:332b416123b4 | 482 | ret = aci_gap_terminate(connectionHandle, 0x16);//0x16 Connection Terminated by Local Host. |
Andrea Palmieri |
77:332b416123b4 | 483 | |
Andrea Palmieri |
77:332b416123b4 | 484 | if (ret != BLE_STATUS_SUCCESS){ |
Andrea Palmieri |
77:332b416123b4 | 485 | DEBUG("Error in GAP termination!!\n\r") ; |
Andrea Palmieri |
77:332b416123b4 | 486 | return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value |
Andrea Palmieri |
77:332b416123b4 | 487 | //FIXME: Define Error values equivalent to BlueNRG Error Codes. |
Andrea Palmieri |
77:332b416123b4 | 488 | } |
Andrea Palmieri |
77:332b416123b4 | 489 | |
Andrea Palmieri |
77:332b416123b4 | 490 | //DEBUG("Disconnected from localhost!!\n\r") ; |
Andrea Palmieri |
77:332b416123b4 | 491 | m_connectionHandle = BLE_CONN_HANDLE_INVALID; |
Andrea Palmieri |
77:332b416123b4 | 492 | } |
Andrea Palmieri |
77:332b416123b4 | 493 | |
Andrea Palmieri |
77:332b416123b4 | 494 | return BLE_ERROR_NONE; |
Andrea Palmieri |
77:332b416123b4 | 495 | } |
Andrea Palmieri |
77:332b416123b4 | 496 | |
Andrea Palmieri |
77:332b416123b4 | 497 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 498 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 499 | @brief Sets the 16-bit connection handle |
Silvio Lucio Oliva |
70:d20d30f59b1c | 500 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 501 | @param[in] con_handle |
Silvio Lucio Oliva |
70:d20d30f59b1c | 502 | Connection Handle which is set in the Gap Instance |
Silvio Lucio Oliva |
70:d20d30f59b1c | 503 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 504 | @returns void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 505 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 506 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 507 | void BlueNRGGap::setConnectionHandle(uint16_t con_handle) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 508 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 509 | m_connectionHandle = con_handle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 510 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 511 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 512 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 513 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 514 | @brief Gets the 16-bit connection handle |
Silvio Lucio Oliva |
70:d20d30f59b1c | 515 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 516 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 517 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 518 | @returns uint16_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 519 | Connection Handle of the Gap Instance |
Silvio Lucio Oliva |
70:d20d30f59b1c | 520 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 521 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 522 | uint16_t BlueNRGGap::getConnectionHandle(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 523 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 524 | return m_connectionHandle; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 525 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 526 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 527 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 528 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 529 | @brief Sets the BLE device address. SetAddress will reset the BLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 530 | device and re-initialize BTLE. Will not start advertising. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 531 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 532 | @param[in] type |
Silvio Lucio Oliva |
70:d20d30f59b1c | 533 | Type of Address |
Silvio Lucio Oliva |
70:d20d30f59b1c | 534 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 535 | @param[in] address[6] |
Silvio Lucio Oliva |
70:d20d30f59b1c | 536 | Value of the Address to be set |
Silvio Lucio Oliva |
70:d20d30f59b1c | 537 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 538 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 539 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 540 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 541 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 542 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 543 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 544 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 545 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 546 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 547 | ble_error_t BlueNRGGap::setAddress(addr_type_t type, const Address_t address) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 548 | { |
Andrea Palmieri |
77:332b416123b4 | 549 | //tBleStatus ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 550 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 551 | if (type > ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 552 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 553 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 554 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 555 | //copy address to bdAddr[6] |
Silvio Lucio Oliva |
70:d20d30f59b1c | 556 | for(int i=0; i<BDADDR_SIZE; i++) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 557 | bdaddr[i] = address[i]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 558 | //DEBUG("i[%d]:0x%x\n\r",i,bdaddr[i]); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 559 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 560 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 561 | if(!isSetAddress) isSetAddress = true; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 562 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 563 | //Re-Init the BTLE Device with SetAddress as true |
Silvio Lucio Oliva |
70:d20d30f59b1c | 564 | //if(BlueNRGDevice::getIsInitialized())//Re-init only initialization is already done |
Silvio Lucio Oliva |
70:d20d30f59b1c | 565 | // ANDREA |
Silvio Lucio Oliva |
70:d20d30f59b1c | 566 | //btle_init(isSetAddress, D11, D12, D3); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 567 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 568 | //if (ret==BLE_STATUS_SUCCESS) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 569 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 570 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 571 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 572 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 573 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 574 | @brief Returns boolean if the address of the device has been set |
Silvio Lucio Oliva |
70:d20d30f59b1c | 575 | or not |
Silvio Lucio Oliva |
70:d20d30f59b1c | 576 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 577 | @returns bool |
Silvio Lucio Oliva |
70:d20d30f59b1c | 578 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 579 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 580 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 581 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 582 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 583 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 584 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 585 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 586 | bool BlueNRGGap::getIsSetAddress() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 587 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 588 | return isSetAddress; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 589 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 590 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 591 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 592 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 593 | @brief Returns the address of the device if set |
Silvio Lucio Oliva |
70:d20d30f59b1c | 594 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 595 | @returns Pointer to the address if Address is set else NULL |
Silvio Lucio Oliva |
70:d20d30f59b1c | 596 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 597 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 598 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 599 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 600 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 601 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 602 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 603 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 604 | ble_error_t BlueNRGGap::getAddress(AddressType_t *typeP, Address_t address) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 605 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 606 | *typeP = Gap::ADDR_TYPE_PUBLIC; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 607 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 608 | if(isSetAddress) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 609 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 610 | for(int i=0; i<BDADDR_SIZE; i++) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 611 | address[i] = bdaddr[i]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 612 | //DEBUG("i[%d]:0x%x\n\r",i,bdaddr[i]); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 613 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 614 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 615 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 616 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 617 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 618 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 619 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 620 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 621 | @brief obtains preferred connection params |
Silvio Lucio Oliva |
70:d20d30f59b1c | 622 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 623 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 624 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 625 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 626 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 627 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 628 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 629 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 630 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 631 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 632 | ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 633 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 634 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 635 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 636 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 637 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 638 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 639 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 640 | @brief sets preferred connection params |
Silvio Lucio Oliva |
70:d20d30f59b1c | 641 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 642 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 643 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 644 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 645 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 646 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 647 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 648 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 649 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 650 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 651 | ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 652 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 653 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 654 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 655 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 656 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 657 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 658 | @brief updates preferred connection params |
Silvio Lucio Oliva |
70:d20d30f59b1c | 659 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 660 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 661 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 662 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 663 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 664 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 665 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 666 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 667 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 668 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 669 | ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 670 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 671 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 672 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 673 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 674 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 675 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 676 | @brief Sets the Device Name Characteristic |
Silvio Lucio Oliva |
70:d20d30f59b1c | 677 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 678 | @param[in] deviceName |
Silvio Lucio Oliva |
70:d20d30f59b1c | 679 | pointer to device name to be set |
Silvio Lucio Oliva |
70:d20d30f59b1c | 680 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 681 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 682 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 683 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 684 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 685 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 686 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 687 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 688 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 689 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 690 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 691 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 692 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 693 | ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 694 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 695 | int ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 696 | uint8_t nameLen = 0; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 697 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 698 | DeviceName = (uint8_t *)deviceName; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 699 | //DEBUG("SetDeviceName=%s\n\r", DeviceName); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 700 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 701 | nameLen = strlen((const char*)DeviceName); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 702 | //DEBUG("DeviceName Size=%d\n\r", nameLen); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 703 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 704 | ret = aci_gatt_update_char_value(g_gap_service_handle, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 705 | g_device_name_char_handle, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 706 | 0, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 707 | nameLen, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 708 | (uint8_t *)DeviceName); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 709 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 710 | if(ret){ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 711 | DEBUG("device set name failed\n\r"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 712 | return BLE_ERROR_PARAM_OUT_OF_RANGE;//TODO:Wrong error code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 713 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 714 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 715 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 716 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 717 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 718 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 719 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 720 | @brief Gets the Device Name Characteristic |
Silvio Lucio Oliva |
70:d20d30f59b1c | 721 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 722 | @param[in] deviceName |
Silvio Lucio Oliva |
70:d20d30f59b1c | 723 | pointer to device name |
Silvio Lucio Oliva |
70:d20d30f59b1c | 724 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 725 | @param[in] lengthP |
Silvio Lucio Oliva |
70:d20d30f59b1c | 726 | pointer to device name length |
Silvio Lucio Oliva |
70:d20d30f59b1c | 727 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 728 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 729 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 730 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 731 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 732 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 733 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 734 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 735 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 736 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 737 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 738 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 739 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 740 | ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 741 | { |
Andrea Palmieri |
77:332b416123b4 | 742 | //int ret; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 743 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 744 | if(DeviceName==NULL) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 745 | return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 746 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 747 | strcpy((char*)deviceName, (const char*)DeviceName); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 748 | //DEBUG("GetDeviceName=%s\n\r", deviceName); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 749 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 750 | *lengthP = strlen((const char*)DeviceName); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 751 | //DEBUG("DeviceName Size=%d\n\r", *lengthP); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 752 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 753 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 754 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 755 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 756 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 757 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 758 | @brief Sets the Device Appearance Characteristic |
Silvio Lucio Oliva |
70:d20d30f59b1c | 759 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 760 | @param[in] appearance |
Silvio Lucio Oliva |
70:d20d30f59b1c | 761 | device appearance |
Silvio Lucio Oliva |
70:d20d30f59b1c | 762 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 763 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 764 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 765 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 766 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 767 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 768 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 769 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 770 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 771 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 772 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 773 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 774 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 775 | ble_error_t BlueNRGGap::setAppearance(GapAdvertisingData::Appearance appearance) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 776 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 777 | /* |
Silvio Lucio Oliva |
70:d20d30f59b1c | 778 | Tested with GapAdvertisingData::GENERIC_PHONE. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 779 | for other appearances BLE Scanner android app is not behaving properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 780 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 781 | //char deviceAppearance[2]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 782 | STORE_LE_16(deviceAppearance, appearance); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 783 | DEBUG("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 784 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 785 | aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (uint8_t *)deviceAppearance); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 786 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 787 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 788 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 789 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 790 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 791 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 792 | @brief Gets the Device Appearance Characteristic |
Silvio Lucio Oliva |
70:d20d30f59b1c | 793 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 794 | @param[in] appearance |
Silvio Lucio Oliva |
70:d20d30f59b1c | 795 | pointer to device appearance value |
Silvio Lucio Oliva |
70:d20d30f59b1c | 796 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 797 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 798 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 799 | @retval BLE_ERROR_NONE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 800 | Everything executed properly |
Silvio Lucio Oliva |
70:d20d30f59b1c | 801 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 802 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 803 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 804 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 805 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 806 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 807 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 808 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 809 | ble_error_t BlueNRGGap::getAppearance(GapAdvertisingData::Appearance *appearanceP) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 810 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 811 | uint16_t devP; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 812 | if(!appearanceP) return BLE_ERROR_PARAM_OUT_OF_RANGE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 813 | devP = ((uint16_t)(0x0000|deviceAppearance[0])) | (((uint16_t)(0x0000|deviceAppearance[1]))<<8); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 814 | strcpy((char*)appearanceP, (const char*)&devP); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 815 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 816 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 817 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 818 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 819 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 820 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 821 | @brief Gets the value of maximum advertising interval in ms |
Silvio Lucio Oliva |
70:d20d30f59b1c | 822 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 823 | @returns uint16_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 824 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 825 | @retval value of maximum advertising interval in ms |
Silvio Lucio Oliva |
70:d20d30f59b1c | 826 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 827 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 828 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 829 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 830 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 831 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 832 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 833 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 834 | uint16_t BlueNRGGap::getMaxAdvertisingInterval(void) const { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 835 | return advtInterval; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 836 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 837 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 838 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 839 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 840 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 841 | @brief Gets the value of minimum advertising interval in ms |
Silvio Lucio Oliva |
70:d20d30f59b1c | 842 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 843 | @returns uint16_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 844 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 845 | @retval value of minimum advertising interval in ms |
Silvio Lucio Oliva |
70:d20d30f59b1c | 846 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 847 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 848 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 849 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 850 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 851 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 852 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 853 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 854 | uint16_t BlueNRGGap::getMinAdvertisingInterval(void) const { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 855 | return 0; // minimum Advertising interval is 0 |
Silvio Lucio Oliva |
70:d20d30f59b1c | 856 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 857 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 858 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 859 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 860 | @brief Gets the value of minimum non connectable advertising interval in ms |
Silvio Lucio Oliva |
70:d20d30f59b1c | 861 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 862 | @returns uint16_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 863 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 864 | @retval value of minimum non connectable advertising interval in ms |
Silvio Lucio Oliva |
70:d20d30f59b1c | 865 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 866 | @section EXAMPLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 867 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 868 | @code |
Silvio Lucio Oliva |
70:d20d30f59b1c | 869 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 870 | @endcode |
Silvio Lucio Oliva |
70:d20d30f59b1c | 871 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 872 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 873 | uint16_t BlueNRGGap::getMinNonConnectableAdvertisingInterval(void) const { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 874 | return BLE_GAP_ADV_NONCON_INTERVAL_MIN; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 875 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 876 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 877 | // ANDREA |
Silvio Lucio Oliva |
70:d20d30f59b1c | 878 | ble_error_t BlueNRGGap::startRadioScan(const GapScanningParams &scanningParams) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 879 | // Empty by now |
Silvio Lucio Oliva |
70:d20d30f59b1c | 880 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 881 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 882 | |
Andrea Palmieri |
77:332b416123b4 | 883 | ble_error_t BlueNRGGap::stopScan() { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 884 | // Empty by now |
Silvio Lucio Oliva |
70:d20d30f59b1c | 885 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 886 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 887 | |
Andrea Palmieri |
77:332b416123b4 | 888 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 889 | /*! |
Andrea Palmieri |
77:332b416123b4 | 890 | @brief set Tx power level |
Andrea Palmieri |
77:332b416123b4 | 891 | @param[in] txPower Transmission Power level |
Andrea Palmieri |
77:332b416123b4 | 892 | @returns ble_error_t |
Andrea Palmieri |
77:332b416123b4 | 893 | */ |
Andrea Palmieri |
77:332b416123b4 | 894 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 895 | ble_error_t BlueNRGGap::setTxPower(int8_t txPower) |
Andrea Palmieri |
77:332b416123b4 | 896 | { |
Andrea Palmieri |
77:332b416123b4 | 897 | int8_t enHighPower = 0; |
Andrea Palmieri |
77:332b416123b4 | 898 | int8_t paLevel = 0; |
Andrea Palmieri |
77:332b416123b4 | 899 | int8_t dbmActuallySet = getHighPowerAndPALevelValue(txPower, enHighPower, paLevel); |
Andrea Palmieri |
77:332b416123b4 | 900 | DEBUG("txPower=%d, dbmActuallySet=%d\n\r", txPower, dbmActuallySet); |
Andrea Palmieri |
77:332b416123b4 | 901 | DEBUG("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel); |
Andrea Palmieri |
77:332b416123b4 | 902 | aci_hal_set_tx_power_level(enHighPower, paLevel); |
Andrea Palmieri |
77:332b416123b4 | 903 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 904 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 905 | |
Andrea Palmieri |
77:332b416123b4 | 906 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 907 | /*! |
Andrea Palmieri |
77:332b416123b4 | 908 | @brief get permitted Tx power values |
Andrea Palmieri |
77:332b416123b4 | 909 | @param[in] values pointer to pointer to permitted power values |
Andrea Palmieri |
77:332b416123b4 | 910 | @param[in] num number of values |
Andrea Palmieri |
77:332b416123b4 | 911 | */ |
Andrea Palmieri |
77:332b416123b4 | 912 | /**************************************************************************/ |
Andrea Palmieri |
77:332b416123b4 | 913 | void BlueNRGGap::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) { |
Andrea Palmieri |
77:332b416123b4 | 914 | static const int8_t permittedTxValues[] = { |
Andrea Palmieri |
77:332b416123b4 | 915 | -18, -14, -11, -8, -4, -1, 1, 5, -15, -11, -8, -5, -2, 1, 4, 8 |
Andrea Palmieri |
77:332b416123b4 | 916 | }; |
Andrea Palmieri |
77:332b416123b4 | 917 | |
Andrea Palmieri |
77:332b416123b4 | 918 | *valueArrayPP = permittedTxValues; |
Andrea Palmieri |
77:332b416123b4 | 919 | *countP = sizeof(permittedTxValues) / sizeof(int8_t); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 920 | } |