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:
Wed Sep 09 10:35:54 2015 +0000
Revision:
110:1232b39de5cc
Parent:
109:9e152b2453bc
Code enhancement
;
; - use WFE in waitForEvent()
;

Who changed what in which revision?

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