HW layer for the Nucleo board, it only work with old BLE_API

Dependents:   Hello_BLE F446RE-BLE

Fork of X_NUCLEO_IDB0XA1 by ST

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?

UserRevisionLine numberNew 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>&copy; 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 &params)
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 }