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:
mridup
Date:
Fri Sep 05 08:42:35 2014 +0000
Revision:
46:01f97cfcc109
Parent:
45:1fff7d7d5ce7
Child:
52:94638d2461c1
BLEDevice setAppearance()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 2:a2b623661316 1 /* mbed Microcontroller Library
mridup 2:a2b623661316 2 * Copyright (c) 2006-2013 ARM Limited
mridup 2:a2b623661316 3 *
mridup 2:a2b623661316 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 2:a2b623661316 5 * you may not use this file except in compliance with the License.
mridup 2:a2b623661316 6 * You may obtain a copy of the License at
mridup 2:a2b623661316 7 *
mridup 2:a2b623661316 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 2:a2b623661316 9 *
mridup 2:a2b623661316 10 * Unless required by applicable law or agreed to in writing, software
mridup 2:a2b623661316 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 2:a2b623661316 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 2:a2b623661316 13 * See the License for the specific language governing permissions and
mridup 2:a2b623661316 14 * limitations under the License.
mridup 2:a2b623661316 15 */
mridup 2:a2b623661316 16
mridup 2:a2b623661316 17 #include "BlueNRGDevice.h"
mridup 2:a2b623661316 18 #include "mbed.h"
hemddabral 10:814262eb0746 19 #include "Payload.h"
hemddabral 12:a5d7db4a1e49 20 #include "Utils.h"
mridup 2:a2b623661316 21
mridup 3:9c4c13795643 22 //Local Variables
hemddabral 10:814262eb0746 23 const char *local_name = NULL;
hemddabral 10:814262eb0746 24 uint8_t local_name_length = 0;
mridup 44:b4a986b33c7d 25 const uint8_t *scan_response_payload = NULL;
mridup 44:b4a986b33c7d 26 uint8_t scan_rsp_length = 0;
hemddabral 14:baa7a1464517 27 uint8_t servUuidlength = 0;
hemddabral 14:baa7a1464517 28 uint8_t* servUuidData = NULL;
hemddabral 14:baa7a1464517 29
hemddabral 16:8aeb0c44869b 30 uint32_t advtInterval = 0;
mridup 2:a2b623661316 31
mridup 2:a2b623661316 32 /**************************************************************************/
mridup 2:a2b623661316 33 /*!
hemddabral 25:f3ea48a2008b 34 @brief Sets the advertising parameters and payload for the device.
hemddabral 25:f3ea48a2008b 35 Note: Some data types give error when their adv data is updated using aci_gap_update_adv_data() API
mridup 2:a2b623661316 36
mridup 2:a2b623661316 37 @param[in] params
mridup 2:a2b623661316 38 Basic advertising details, including the advertising
mridup 2:a2b623661316 39 delay, timeout and how the device should be advertised
mridup 2:a2b623661316 40 @params[in] advData
mridup 2:a2b623661316 41 The primary advertising data payload
mridup 2:a2b623661316 42 @params[in] scanResponse
mridup 2:a2b623661316 43 The optional Scan Response payload if the advertising
mridup 2:a2b623661316 44 type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED
mridup 2:a2b623661316 45 in \ref GapAdveritinngParams
mridup 2:a2b623661316 46
mridup 2:a2b623661316 47 @returns \ref ble_error_t
mridup 2:a2b623661316 48
mridup 2:a2b623661316 49 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 50 Everything executed properly
mridup 2:a2b623661316 51
mridup 2:a2b623661316 52 @retval BLE_ERROR_BUFFER_OVERFLOW
mridup 2:a2b623661316 53 The proposed action would cause a buffer overflow. All
mridup 2:a2b623661316 54 advertising payloads must be <= 31 bytes, for example.
mridup 2:a2b623661316 55
mridup 2:a2b623661316 56 @retval BLE_ERROR_NOT_IMPLEMENTED
mridup 2:a2b623661316 57 A feature was requested that is not yet supported in the
mridup 2:a2b623661316 58 nRF51 firmware or hardware.
mridup 2:a2b623661316 59
mridup 2:a2b623661316 60 @retval BLE_ERROR_PARAM_OUT_OF_RANGE
mridup 2:a2b623661316 61 One of the proposed values is outside the valid range.
mridup 2:a2b623661316 62
mridup 2:a2b623661316 63 @section EXAMPLE
mridup 2:a2b623661316 64
mridup 2:a2b623661316 65 @code
mridup 2:a2b623661316 66
mridup 2:a2b623661316 67 @endcode
mridup 2:a2b623661316 68 */
mridup 2:a2b623661316 69 /**************************************************************************/
mridup 2:a2b623661316 70 ble_error_t BlueNRGGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse)
hemddabral 19:0f87aaf1362d 71 {
mridup 20:718d56821672 72 DEBUG("BlueNRGGap::setAdvertisingData\n\r");
mridup 2:a2b623661316 73 /* Make sure we don't exceed the advertising payload length */
mridup 2:a2b623661316 74 if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
mridup 2:a2b623661316 75 return BLE_ERROR_BUFFER_OVERFLOW;
mridup 2:a2b623661316 76 }
mridup 2:a2b623661316 77
mridup 2:a2b623661316 78 /* Make sure we have a payload! */
hemddabral 10:814262eb0746 79 if (advData.getPayloadLen() <= 0) {
mridup 2:a2b623661316 80 return BLE_ERROR_PARAM_OUT_OF_RANGE;
hemddabral 18:6d5f4c638f6a 81 } else {
hemddabral 18:6d5f4c638f6a 82 PayloadPtr loadPtr(advData.getPayload(), advData.getPayloadLen());
hemddabral 24:1c7266497633 83 for(uint8_t index=0; index<loadPtr.getPayloadUnitCount(); index++) {
hemddabral 18:6d5f4c638f6a 84 PayloadUnit unit = loadPtr.getUnitAtIndex(index);
hemddabral 25:f3ea48a2008b 85
mridup 20:718d56821672 86 DEBUG("adData[%d].length=%d\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getLenPtr()));
mridup 20:718d56821672 87 DEBUG("adData[%d].AdType=0x%x\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()));
hemddabral 25:f3ea48a2008b 88
mridup 26:047d45ea379e 89 #if 0
hemddabral 25:f3ea48a2008b 90
hemddabral 25:f3ea48a2008b 91 int err = aci_gap_update_adv_data(*loadPtr.getUnitAtIndex(index).getLenPtr(), loadPtr.getUnitAtIndex(index).getAdTypePtr());
hemddabral 18:6d5f4c638f6a 92 if(BLE_STATUS_SUCCESS!=err) {
mridup 20:718d56821672 93 DEBUG("error occurred while adding adv data\n\r");
hemddabral 18:6d5f4c638f6a 94 return BLE_ERROR_PARAM_OUT_OF_RANGE; // no other suitable error code is available
hemddabral 24:1c7266497633 95 DEBUG("error occurred while adding adv data for Adv type 0x%x, errCode = 0x%x\n", *loadPtr.getUnitAtIndex(index).getAdTypePtr(), err);
hemddabral 24:1c7266497633 96 //return BLE_ERROR_PARAM_OUT_OF_RANGE; // no other suitable error code is available
hemddabral 25:f3ea48a2008b 97 }
hemddabral 24:1c7266497633 98 #endif
hemddabral 12:a5d7db4a1e49 99 //UnitPayload unitLoad = load.getPayLoadAtIndex(index);
hemddabral 18:6d5f4c638f6a 100 switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) {
hemddabral 18:6d5f4c638f6a 101 case GapAdvertisingData::FLAGS: /* ref *Flags */
mridup 43:b69d2680b716 102 //Check if Flags are OK. BlueNRG only supports LE Mode.
mridup 43:b69d2680b716 103 uint8_t *flags = loadPtr.getUnitAtIndex(index).getDataPtr();
mridup 43:b69d2680b716 104 if((*flags & GapAdvertisingData::BREDR_NOT_SUPPORTED) != GapAdvertisingData::BREDR_NOT_SUPPORTED) {
mridup 43:b69d2680b716 105 DEBUG("BlueNRG does not support BR/EDR Mode");
mridup 43:b69d2680b716 106 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 43:b69d2680b716 107 }
mridup 43:b69d2680b716 108
hemddabral 10:814262eb0746 109 break;
hemddabral 10:814262eb0746 110 case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS: /**< Incomplete list of 16-bit Service IDs */
hemddabral 10:814262eb0746 111 break;
hemddabral 10:814262eb0746 112 case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS: /**< Complete list of 16-bit Service IDs */
mridup 20:718d56821672 113 DEBUG("Advertising type: COMPLETE_LIST_16BIT_SERVICE_IDS\n\r");
hemddabral 16:8aeb0c44869b 114 DEBUG("Advertising type: COMPLETE_LIST_16BIT_SERVICE_IDS\n");
hemddabral 24:1c7266497633 115 #if 0
hemddabral 24:1c7266497633 116 int err = aci_gap_update_adv_data(*loadPtr.getUnitAtIndex(index).getLenPtr(), loadPtr.getUnitAtIndex(index).getAdTypePtr());
hemddabral 24:1c7266497633 117 if(BLE_STATUS_SUCCESS!=err) {
hemddabral 24:1c7266497633 118 DEBUG("error occurred while adding adv data\n");
hemddabral 24:1c7266497633 119 return BLE_ERROR_PARAM_OUT_OF_RANGE; // no other suitable error code is available
hemddabral 24:1c7266497633 120 }
hemddabral 24:1c7266497633 121 #endif
hemddabral 14:baa7a1464517 122 break;
hemddabral 10:814262eb0746 123 case GapAdvertisingData::INCOMPLETE_LIST_32BIT_SERVICE_IDS: /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
hemddabral 10:814262eb0746 124 break;
hemddabral 10:814262eb0746 125 case GapAdvertisingData::COMPLETE_LIST_32BIT_SERVICE_IDS: /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
hemddabral 10:814262eb0746 126 break;
hemddabral 10:814262eb0746 127 case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */
hemddabral 10:814262eb0746 128 break;
hemddabral 10:814262eb0746 129 case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS: /**< Complete list of 128-bit Service IDs */
hemddabral 10:814262eb0746 130 break;
hemddabral 10:814262eb0746 131 case GapAdvertisingData::SHORTENED_LOCAL_NAME: /**< Shortened Local Name */
hemddabral 10:814262eb0746 132 break;
hemddabral 10:814262eb0746 133 case GapAdvertisingData::COMPLETE_LOCAL_NAME: /**< Complete Local Name */
mridup 20:718d56821672 134 DEBUG("Advertising type: COMPLETE_LOCAL_NAME\n\r");
hemddabral 18:6d5f4c638f6a 135 loadPtr.getUnitAtIndex(index).printDataAsString();
hemddabral 18:6d5f4c638f6a 136 local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
hemddabral 18:6d5f4c638f6a 137 local_name = (const char*)loadPtr.getUnitAtIndex(index).getAdTypePtr();
hemddabral 24:1c7266497633 138 //for(int i=0; i<local_name_length; i++) DEBUG("\n%c", local_name[i]);
mridup 45:1fff7d7d5ce7 139 /*aci_gatt_update_char_value(g_gap_service_handle,
hemddabral 18:6d5f4c638f6a 140 g_device_name_char_handle,
hemddabral 18:6d5f4c638f6a 141 0,
hemddabral 18:6d5f4c638f6a 142 local_name_length,
mridup 45:1fff7d7d5ce7 143 (tHalUint8 *)local_name);*/
mridup 45:1fff7d7d5ce7 144 //COMPLETE_LOCAL_NAME is only advertising device name. Gatt Device Name is not the same.(Must be set right after GAP/GATT init?)
hemddabral 18:6d5f4c638f6a 145
hemddabral 18:6d5f4c638f6a 146
mridup 20:718d56821672 147 DEBUG("device_name length=%d\n\r", local_name_length);
hemddabral 10:814262eb0746 148 break;
hemddabral 10:814262eb0746 149
hemddabral 10:814262eb0746 150 case GapAdvertisingData::TX_POWER_LEVEL: /**< TX Power Level (in dBm) */
mridup 20:718d56821672 151 DEBUG("Advertising type: TX_POWER_LEVEL\n\r");
hemddabral 18:6d5f4c638f6a 152 int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr();
hemddabral 12:a5d7db4a1e49 153 int8_t enHighPower = 0;
hemddabral 12:a5d7db4a1e49 154 int8_t paLevel = 0;
hemddabral 12:a5d7db4a1e49 155 int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel);
mridup 20:718d56821672 156 DEBUG("dbm=%d, dbmActuallySet=%d\n\r", dbm, dbmActuallySet);
mridup 20:718d56821672 157 DEBUG("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
hemddabral 12:a5d7db4a1e49 158 aci_hal_set_tx_power_level(enHighPower, paLevel);
hemddabral 12:a5d7db4a1e49 159 break;
hemddabral 10:814262eb0746 160 case GapAdvertisingData::DEVICE_ID: /**< Device ID */
hemddabral 10:814262eb0746 161 break;
hemddabral 10:814262eb0746 162 case GapAdvertisingData::SLAVE_CONNECTION_INTERVAL_RANGE: /**< Slave :Connection Interval Range */
hemddabral 10:814262eb0746 163 break;
hemddabral 10:814262eb0746 164 case GapAdvertisingData::SERVICE_DATA: /**< Service Data */
hemddabral 10:814262eb0746 165 break;
hemddabral 14:baa7a1464517 166 case GapAdvertisingData::APPEARANCE:
hemddabral 14:baa7a1464517 167 /*
hemddabral 14:baa7a1464517 168 Tested with GapAdvertisingData::GENERIC_PHONE.
hemddabral 14:baa7a1464517 169 for other appearances BLE Scanner android app is not behaving properly
hemddabral 14:baa7a1464517 170 */
mridup 20:718d56821672 171 DEBUG("Advertising type: APPEARANCE\n\r");
hemddabral 18:6d5f4c638f6a 172 const char *deviceAppearance = NULL;
hemddabral 18:6d5f4c638f6a 173 deviceAppearance = (const char*)loadPtr.getUnitAtIndex(index).getDataPtr(); // to be set later when startAdvertising() is called
mridup 46:01f97cfcc109 174
mridup 46:01f97cfcc109 175 uint8_t Appearance[2];
mridup 46:01f97cfcc109 176 uint16_t devP = (uint16_t)*deviceAppearance;
mridup 46:01f97cfcc109 177 STORE_LE_16(Appearance, (uint16_t)devP);
mridup 46:01f97cfcc109 178
mridup 46:01f97cfcc109 179 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 */
mridup 46:01f97cfcc109 180
mridup 46:01f97cfcc109 181 aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (tHalUint8 *)deviceAppearance);//not using array Appearance[2]
hemddabral 14:baa7a1464517 182 break;
hemddabral 10:814262eb0746 183 case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */
hemddabral 18:6d5f4c638f6a 184 advtInterval = (uint16_t)(*loadPtr.getUnitAtIndex(index).getDataPtr());
mridup 20:718d56821672 185 DEBUG("advtInterval=%d\n\r", advtInterval);
hemddabral 10:814262eb0746 186 break;
hemddabral 10:814262eb0746 187 case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */
hemddabral 10:814262eb0746 188 break;
hemddabral 10:814262eb0746 189
hemddabral 19:0f87aaf1362d 190 }
mridup 2:a2b623661316 191 }
mridup 44:b4a986b33c7d 192 //Set the SCAN_RSP Payload
mridup 44:b4a986b33c7d 193 scan_response_payload = scanResponse.getPayload();
mridup 44:b4a986b33c7d 194 scan_rsp_length = scanResponse.getPayloadLen();
mridup 3:9c4c13795643 195 }
hemddabral 19:0f87aaf1362d 196 return BLE_ERROR_NONE;
mridup 2:a2b623661316 197 }
mridup 2:a2b623661316 198
mridup 2:a2b623661316 199 /**************************************************************************/
mridup 2:a2b623661316 200 /*!
mridup 2:a2b623661316 201 @brief Starts the BLE HW, initialising any services that were
mridup 2:a2b623661316 202 added before this function was called.
mridup 2:a2b623661316 203
mridup 2:a2b623661316 204 @note All services must be added before calling this function!
mridup 2:a2b623661316 205
mridup 2:a2b623661316 206 @returns ble_error_t
mridup 2:a2b623661316 207
mridup 2:a2b623661316 208 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 209 Everything executed properly
mridup 2:a2b623661316 210
mridup 2:a2b623661316 211 @section EXAMPLE
mridup 2:a2b623661316 212
mridup 2:a2b623661316 213 @code
mridup 2:a2b623661316 214
mridup 2:a2b623661316 215 @endcode
mridup 2:a2b623661316 216 */
mridup 2:a2b623661316 217 /**************************************************************************/
mridup 2:a2b623661316 218 ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams &params)
mridup 2:a2b623661316 219 {
mridup 2:a2b623661316 220 /* Make sure we support the advertising type */
mridup 2:a2b623661316 221 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
mridup 2:a2b623661316 222 /* ToDo: This requires a propery security implementation, etc. */
mridup 2:a2b623661316 223 return BLE_ERROR_NOT_IMPLEMENTED;
mridup 2:a2b623661316 224 }
mridup 2:a2b623661316 225
mridup 2:a2b623661316 226 /* Check interval range */
mridup 2:a2b623661316 227 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) {
mridup 2:a2b623661316 228 /* Min delay is slightly longer for unconnectable devices */
mridup 2:a2b623661316 229 if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
mridup 2:a2b623661316 230 (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX)) {
mridup 2:a2b623661316 231 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 232 }
mridup 2:a2b623661316 233 } else {
mridup 2:a2b623661316 234 if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN) ||
mridup 2:a2b623661316 235 (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX)) {
mridup 2:a2b623661316 236 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 237 }
mridup 2:a2b623661316 238 }
mridup 2:a2b623661316 239
mridup 2:a2b623661316 240 /* Check timeout is zero for Connectable Directed */
mridup 2:a2b623661316 241 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) {
mridup 2:a2b623661316 242 /* Timeout must be 0 with this type, although we'll never get here */
mridup 2:a2b623661316 243 /* since this isn't implemented yet anyway */
mridup 2:a2b623661316 244 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 245 }
mridup 2:a2b623661316 246
mridup 2:a2b623661316 247 /* Check timeout for other advertising types */
mridup 2:a2b623661316 248 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
mridup 2:a2b623661316 249 (params.getTimeout() > GAP_ADV_PARAMS_TIMEOUT_MAX)) {
mridup 2:a2b623661316 250 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 251 }
mridup 2:a2b623661316 252
mridup 2:a2b623661316 253 tBleStatus ret;
mridup 2:a2b623661316 254
mridup 3:9c4c13795643 255 //const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME,'B','l','u','e','N','R','G'};
mridup 5:31dedfa19a12 256 //const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME,device_name[27],device_name[28],device_name[29],device_name[30], device_name[31],
mridup 5:31dedfa19a12 257 // device_name[32], device_name[33], device_name[34], device_name[35], device_name[36]};
mridup 2:a2b623661316 258
hemddabral 10:814262eb0746 259
mridup 5:31dedfa19a12 260
mridup 5:31dedfa19a12 261 //const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME,device_name[27],device_name[28]};
mridup 5:31dedfa19a12 262 const LongUUID_t HRM_SERVICE_UUID_128 = {0x18, 0x0D};
mridup 44:b4a986b33c7d 263 /* set scan response data */
mridup 44:b4a986b33c7d 264 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[]);*/
mridup 2:a2b623661316 265
mridup 2:a2b623661316 266 /*aci_gap_set_discoverable(Advertising_Event_Type, Adv_min_intvl, Adv_Max_Intvl, Addr_Type, Adv_Filter_Policy,
mridup 2:a2b623661316 267 Local_Name_Length, local_name, service_uuid_length, service_uuid_list, Slave_conn_intvl_min, Slave_conn_intvl_max);*/
mridup 2:a2b623661316 268 /*LINK_LAYER.H DESCRIBES THE ADVERTISING TYPES*/
hemddabral 18:6d5f4c638f6a 269
hemddabral 18:6d5f4c638f6a 270 char* name = NULL;
hemddabral 18:6d5f4c638f6a 271 uint8_t nameLen = 0;
hemddabral 18:6d5f4c638f6a 272 if(local_name!=NULL) {
hemddabral 18:6d5f4c638f6a 273 name = (char*)local_name;
mridup 45:1fff7d7d5ce7 274 DEBUG("name=%s\n\r", name);
hemddabral 18:6d5f4c638f6a 275 nameLen = local_name_length;
hemddabral 18:6d5f4c638f6a 276 } else {
hemddabral 18:6d5f4c638f6a 277 char str[] = "ST_BLE_DEV";
hemddabral 18:6d5f4c638f6a 278 name = new char[strlen(str)+1];
hemddabral 18:6d5f4c638f6a 279 name[0] = AD_TYPE_COMPLETE_LOCAL_NAME;
hemddabral 18:6d5f4c638f6a 280 strcpy(name+1, str);
hemddabral 18:6d5f4c638f6a 281 nameLen = strlen(name);
mridup 20:718d56821672 282 DEBUG("nameLen=%d\n\r", nameLen);
mridup 20:718d56821672 283 DEBUG("name=%s\n\r", name);
hemddabral 18:6d5f4c638f6a 284 }
hemddabral 18:6d5f4c638f6a 285
hemddabral 18:6d5f4c638f6a 286
hemddabral 16:8aeb0c44869b 287 advtInterval = params.getInterval(); // set advtInterval in case it is not already set by user application
hemddabral 11:87ddcfa4fa48 288 ret = aci_gap_set_discoverable(params.getAdvertisingType(), // Advertising_Event_Type
hemddabral 11:87ddcfa4fa48 289 0, // Adv_Interval_Min
hemddabral 16:8aeb0c44869b 290 advtInterval, // Adv_Interval_Max
mridup 41:95b8d531628c 291 PUBLIC_ADDR, // Address_Type <hdd> It seems there is some problem with RANDOM_ADDRESS. <problem_desc> When RANDOM_ADDRESS is selected device name is not being handled properly, i.e. wrong device name is seen by android app </problem_desc>
hemddabral 10:814262eb0746 292 NO_WHITE_LIST_USE, // Adv_Filter_Policy
hemddabral 18:6d5f4c638f6a 293 nameLen, //local_name_length, // Local_Name_Length
hemddabral 18:6d5f4c638f6a 294 (const char*)name, //local_name, // Local_Name
hemddabral 14:baa7a1464517 295 servUuidlength, //Service_Uuid_Length
hemddabral 14:baa7a1464517 296 servUuidData, //Service_Uuid_List
hemddabral 10:814262eb0746 297 0, // Slave_Conn_Interval_Min
hemddabral 10:814262eb0746 298 0); // Slave_Conn_Interval_Max
hemddabral 10:814262eb0746 299
mridup 4:fa5b5693c1b5 300 state.advertising = 1;
mridup 2:a2b623661316 301
mridup 2:a2b623661316 302 return BLE_ERROR_NONE;
mridup 2:a2b623661316 303 }
mridup 2:a2b623661316 304
mridup 2:a2b623661316 305 /**************************************************************************/
mridup 2:a2b623661316 306 /*!
mridup 2:a2b623661316 307 @brief Stops the BLE HW and disconnects from any devices
mridup 2:a2b623661316 308
mridup 2:a2b623661316 309 @returns ble_error_t
mridup 2:a2b623661316 310
mridup 2:a2b623661316 311 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 312 Everything executed properly
mridup 2:a2b623661316 313
mridup 2:a2b623661316 314 @section EXAMPLE
mridup 2:a2b623661316 315
mridup 2:a2b623661316 316 @code
mridup 2:a2b623661316 317
mridup 2:a2b623661316 318 @endcode
mridup 2:a2b623661316 319 */
mridup 2:a2b623661316 320 /**************************************************************************/
mridup 2:a2b623661316 321 ble_error_t BlueNRGGap::stopAdvertising(void)
mridup 2:a2b623661316 322 {
mridup 34:fdbbe839170a 323 tBleStatus ret;
mridup 2:a2b623661316 324
mridup 36:f3d80a236beb 325 if(state.advertising == 1) {
mridup 34:fdbbe839170a 326 //Set non-discoverable to stop advertising
mridup 34:fdbbe839170a 327 ret = aci_gap_set_non_discoverable();
mridup 34:fdbbe839170a 328
mridup 34:fdbbe839170a 329 if (ret != BLE_STATUS_SUCCESS){
mridup 34:fdbbe839170a 330 DEBUG("Error in stopping advertisement!!\n\r") ;
mridup 34:fdbbe839170a 331 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
mridup 34:fdbbe839170a 332 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 34:fdbbe839170a 333 }
mridup 34:fdbbe839170a 334 DEBUG("Advertisement stopped!!\n\r") ;
mridup 34:fdbbe839170a 335 //Set GapState_t::advertising state
mridup 34:fdbbe839170a 336 state.advertising = 0;
mridup 36:f3d80a236beb 337 }
mridup 34:fdbbe839170a 338
mridup 2:a2b623661316 339 return BLE_ERROR_NONE;
mridup 2:a2b623661316 340 }
mridup 2:a2b623661316 341
mridup 2:a2b623661316 342 /**************************************************************************/
mridup 2:a2b623661316 343 /*!
mridup 2:a2b623661316 344 @brief Disconnects if we are connected to a central device
mridup 2:a2b623661316 345
mridup 2:a2b623661316 346 @returns ble_error_t
mridup 2:a2b623661316 347
mridup 2:a2b623661316 348 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 349 Everything executed properly
mridup 2:a2b623661316 350
mridup 2:a2b623661316 351 @section EXAMPLE
mridup 2:a2b623661316 352
mridup 2:a2b623661316 353 @code
mridup 2:a2b623661316 354
mridup 2:a2b623661316 355 @endcode
mridup 2:a2b623661316 356 */
mridup 2:a2b623661316 357 /**************************************************************************/
mridup 2:a2b623661316 358 ble_error_t BlueNRGGap::disconnect(void)
mridup 2:a2b623661316 359 {
mridup 34:fdbbe839170a 360 tBleStatus ret;
mridup 34:fdbbe839170a 361 //For Reason codes check BlueTooth HCI Spec
mridup 34:fdbbe839170a 362
mridup 36:f3d80a236beb 363 if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) {
mridup 34:fdbbe839170a 364 ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host.
mridup 34:fdbbe839170a 365
mridup 34:fdbbe839170a 366 if (ret != BLE_STATUS_SUCCESS){
mridup 34:fdbbe839170a 367 DEBUG("Error in GAP termination!!\n\r") ;
mridup 34:fdbbe839170a 368 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
mridup 34:fdbbe839170a 369 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 34:fdbbe839170a 370 }
mridup 34:fdbbe839170a 371
mridup 34:fdbbe839170a 372 //DEBUG("Disconnected from localhost!!\n\r") ;
mridup 34:fdbbe839170a 373 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
mridup 36:f3d80a236beb 374 }
mridup 2:a2b623661316 375
mridup 2:a2b623661316 376 return BLE_ERROR_NONE;
mridup 2:a2b623661316 377 }
mridup 2:a2b623661316 378
mridup 2:a2b623661316 379 /**************************************************************************/
mridup 2:a2b623661316 380 /*!
mridup 2:a2b623661316 381 @brief Sets the 16-bit connection handle
mridup 2:a2b623661316 382 */
mridup 2:a2b623661316 383 /**************************************************************************/
mridup 2:a2b623661316 384 void BlueNRGGap::setConnectionHandle(uint16_t con_handle)
mridup 2:a2b623661316 385 {
mridup 2:a2b623661316 386 m_connectionHandle = con_handle;
mridup 2:a2b623661316 387 }
mridup 2:a2b623661316 388
mridup 2:a2b623661316 389 /**************************************************************************/
mridup 2:a2b623661316 390 /*!
mridup 2:a2b623661316 391 @brief Gets the 16-bit connection handle
mridup 2:a2b623661316 392 */
mridup 2:a2b623661316 393 /**************************************************************************/
mridup 2:a2b623661316 394 uint16_t BlueNRGGap::getConnectionHandle(void)
mridup 2:a2b623661316 395 {
mridup 2:a2b623661316 396 return m_connectionHandle;
mridup 2:a2b623661316 397 }
mridup 2:a2b623661316 398
mridup 2:a2b623661316 399 /**************************************************************************/
mridup 2:a2b623661316 400 /*!
mridup 41:95b8d531628c 401 @brief Sets the BLE device address. SetAddress will reset the BLE
mridup 41:95b8d531628c 402 device and re-initialize BTLE. Will not start advertising.
mridup 2:a2b623661316 403
mridup 2:a2b623661316 404 @returns ble_error_t
mridup 2:a2b623661316 405
mridup 2:a2b623661316 406 @section EXAMPLE
mridup 2:a2b623661316 407
mridup 2:a2b623661316 408 @code
mridup 2:a2b623661316 409
mridup 2:a2b623661316 410 @endcode
mridup 2:a2b623661316 411 */
mridup 2:a2b623661316 412 /**************************************************************************/
mridup 2:a2b623661316 413 ble_error_t BlueNRGGap::setAddress(addr_type_t type, const uint8_t address[6])
mridup 2:a2b623661316 414 {
mridup 4:fa5b5693c1b5 415 tBleStatus ret;
mridup 4:fa5b5693c1b5 416
mridup 2:a2b623661316 417 if (type > ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE) {
mridup 2:a2b623661316 418 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 419 }
mridup 4:fa5b5693c1b5 420
mridup 41:95b8d531628c 421 //copy address to bdAddr[6]
mridup 41:95b8d531628c 422 for(int i=0; i<BDADDR_SIZE; i++) {
mridup 41:95b8d531628c 423 bdaddr[i] = address[i];
mridup 41:95b8d531628c 424 //DEBUG("i[%d]:0x%x\n\r",i,bdaddr[i]);
mridup 41:95b8d531628c 425 }
mridup 41:95b8d531628c 426
mridup 41:95b8d531628c 427 if(!isSetAddress) isSetAddress = true;
mridup 41:95b8d531628c 428
mridup 41:95b8d531628c 429 //Re-Init the BTLE Device with SetAddress as true
mridup 45:1fff7d7d5ce7 430 //if(BlueNRGDevice::getIsInitialized())//Re-init only initialization is already done
mridup 45:1fff7d7d5ce7 431 btle_init(isSetAddress);
mridup 4:fa5b5693c1b5 432
mridup 4:fa5b5693c1b5 433 //if (ret==BLE_STATUS_SUCCESS)
mridup 2:a2b623661316 434 return BLE_ERROR_NONE;
mridup 2:a2b623661316 435 }
hemddabral 32:d1f250acad29 436
mridup 42:1a0220f508ca 437 /**************************************************************************/
mridup 42:1a0220f508ca 438 /*!
mridup 42:1a0220f508ca 439 @brief Returns boolean if the address of the device has been set
mridup 42:1a0220f508ca 440 or not
mridup 42:1a0220f508ca 441
mridup 42:1a0220f508ca 442 @returns bool
mridup 42:1a0220f508ca 443
mridup 42:1a0220f508ca 444 @section EXAMPLE
mridup 42:1a0220f508ca 445
mridup 42:1a0220f508ca 446 @code
mridup 42:1a0220f508ca 447
mridup 42:1a0220f508ca 448 @endcode
mridup 42:1a0220f508ca 449 */
mridup 42:1a0220f508ca 450 /**************************************************************************/
mridup 41:95b8d531628c 451 bool BlueNRGGap::getIsSetAddress()
mridup 41:95b8d531628c 452 {
mridup 41:95b8d531628c 453 return isSetAddress;
mridup 41:95b8d531628c 454 }
mridup 41:95b8d531628c 455
mridup 42:1a0220f508ca 456 /**************************************************************************/
mridup 42:1a0220f508ca 457 /*!
mridup 42:1a0220f508ca 458 @brief Returns the address of the device if set
mridup 42:1a0220f508ca 459
mridup 42:1a0220f508ca 460 @returns ble_error_t
mridup 42:1a0220f508ca 461
mridup 42:1a0220f508ca 462 @section EXAMPLE
mridup 42:1a0220f508ca 463
mridup 42:1a0220f508ca 464 @code
mridup 42:1a0220f508ca 465
mridup 42:1a0220f508ca 466 @endcode
mridup 42:1a0220f508ca 467 */
mridup 42:1a0220f508ca 468 /**************************************************************************/
mridup 41:95b8d531628c 469 tHalUint8* BlueNRGGap::getAddress()
mridup 41:95b8d531628c 470 {
mridup 42:1a0220f508ca 471 if(isSetAddress)
mridup 42:1a0220f508ca 472 return bdaddr;
mridup 42:1a0220f508ca 473 else return NULL;
mridup 41:95b8d531628c 474 }
mridup 41:95b8d531628c 475
hemddabral 32:d1f250acad29 476 /**************************************************************************/
hemddabral 32:d1f250acad29 477 /*!
hemddabral 32:d1f250acad29 478 @brief obtains preferred connection params
hemddabral 32:d1f250acad29 479
hemddabral 32:d1f250acad29 480 @returns ble_error_t
hemddabral 32:d1f250acad29 481
hemddabral 32:d1f250acad29 482 @section EXAMPLE
hemddabral 32:d1f250acad29 483
hemddabral 32:d1f250acad29 484 @code
hemddabral 32:d1f250acad29 485
hemddabral 32:d1f250acad29 486 @endcode
hemddabral 32:d1f250acad29 487 */
hemddabral 32:d1f250acad29 488 /**************************************************************************/
hemddabral 32:d1f250acad29 489 ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params)
hemddabral 32:d1f250acad29 490 {
hemddabral 32:d1f250acad29 491 return BLE_ERROR_NONE;
hemddabral 32:d1f250acad29 492 }
hemddabral 32:d1f250acad29 493
hemddabral 32:d1f250acad29 494
hemddabral 32:d1f250acad29 495 /**************************************************************************/
hemddabral 32:d1f250acad29 496 /*!
hemddabral 32:d1f250acad29 497 @brief sets preferred connection params
hemddabral 32:d1f250acad29 498
hemddabral 32:d1f250acad29 499 @returns ble_error_t
hemddabral 32:d1f250acad29 500
hemddabral 32:d1f250acad29 501 @section EXAMPLE
hemddabral 32:d1f250acad29 502
hemddabral 32:d1f250acad29 503 @code
hemddabral 32:d1f250acad29 504
hemddabral 32:d1f250acad29 505 @endcode
hemddabral 32:d1f250acad29 506 */
hemddabral 32:d1f250acad29 507 /**************************************************************************/
hemddabral 32:d1f250acad29 508 ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params)
hemddabral 32:d1f250acad29 509 {
hemddabral 32:d1f250acad29 510 return BLE_ERROR_NONE;
hemddabral 32:d1f250acad29 511 }
hemddabral 32:d1f250acad29 512
hemddabral 32:d1f250acad29 513 /**************************************************************************/
hemddabral 32:d1f250acad29 514 /*!
hemddabral 32:d1f250acad29 515 @brief updates preferred connection params
hemddabral 32:d1f250acad29 516
hemddabral 32:d1f250acad29 517 @returns ble_error_t
hemddabral 32:d1f250acad29 518
hemddabral 32:d1f250acad29 519 @section EXAMPLE
hemddabral 32:d1f250acad29 520
hemddabral 32:d1f250acad29 521 @code
hemddabral 32:d1f250acad29 522
hemddabral 32:d1f250acad29 523 @endcode
hemddabral 32:d1f250acad29 524 */
hemddabral 32:d1f250acad29 525 /**************************************************************************/
hemddabral 32:d1f250acad29 526 ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params)
hemddabral 32:d1f250acad29 527 {
hemddabral 32:d1f250acad29 528 return BLE_ERROR_NONE;
hemddabral 32:d1f250acad29 529 }
hemddabral 32:d1f250acad29 530