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 Oct 17 08:30:47 2014 +0000
Revision:
59:68e45913b2c4
Parent:
58:027c65a54097
Child:
60:b0b2d639c0f5
Further Code Cleanup. Replacing HAL_Delay() with mbed wait_us() in BlueNRG_Reset().

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 2:a2b623661316 1 /* mbed Microcontroller Library
hemddabral 58:027c65a54097 2 * Copyright (c) 2006-2013 ARM Limited
hemddabral 58:027c65a54097 3 *
hemddabral 58:027c65a54097 4 * Licensed under the Apache License, Version 2.0 (the "License");
hemddabral 58:027c65a54097 5 * you may not use this file except in compliance with the License.
hemddabral 58:027c65a54097 6 * You may obtain a copy of the License at
hemddabral 58:027c65a54097 7 *
hemddabral 58:027c65a54097 8 * http://www.apache.org/licenses/LICENSE-2.0
hemddabral 58:027c65a54097 9 *
hemddabral 58:027c65a54097 10 * Unless required by applicable law or agreed to in writing, software
hemddabral 58:027c65a54097 11 * distributed under the License is distributed on an "AS IS" BASIS,
hemddabral 58:027c65a54097 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
hemddabral 58:027c65a54097 13 * See the License for the specific language governing permissions and
hemddabral 58:027c65a54097 14 * limitations under the License.
hemddabral 58:027c65a54097 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()));
hemddabral 58:027c65a54097 87 DEBUG("adData[%d].AdType=0x%x\n\r", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()));
hemddabral 58:027c65a54097 88
hemddabral 18:6d5f4c638f6a 89 switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) {
hemddabral 58:027c65a54097 90 case GapAdvertisingData::FLAGS: /* ref *Flags */
mridup 43:b69d2680b716 91 //Check if Flags are OK. BlueNRG only supports LE Mode.
mridup 43:b69d2680b716 92 uint8_t *flags = loadPtr.getUnitAtIndex(index).getDataPtr();
mridup 43:b69d2680b716 93 if((*flags & GapAdvertisingData::BREDR_NOT_SUPPORTED) != GapAdvertisingData::BREDR_NOT_SUPPORTED) {
hemddabral 58:027c65a54097 94 DEBUG("BlueNRG does not support BR/EDR Mode");
hemddabral 58:027c65a54097 95 return BLE_ERROR_PARAM_OUT_OF_RANGE;
hemddabral 58:027c65a54097 96 }
mridup 43:b69d2680b716 97
hemddabral 10:814262eb0746 98 break;
hemddabral 58:027c65a54097 99 case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS: /**< Incomplete list of 16-bit Service IDs */
hemddabral 10:814262eb0746 100 break;
hemddabral 58:027c65a54097 101 case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS: /**< Complete list of 16-bit Service IDs */
hemddabral 58:027c65a54097 102 DEBUG("Advertising type: COMPLETE_LIST_16BIT_SERVICE_IDS\n\r");
hemddabral 58:027c65a54097 103 DEBUG("Advertising type: COMPLETE_LIST_16BIT_SERVICE_IDS\n");
hemddabral 58:027c65a54097 104 #if 0
hemddabral 58:027c65a54097 105 int err = aci_gap_update_adv_data(*loadPtr.getUnitAtIndex(index).getLenPtr(), loadPtr.getUnitAtIndex(index).getAdTypePtr());
hemddabral 58:027c65a54097 106 if(BLE_STATUS_SUCCESS!=err) {
hemddabral 58:027c65a54097 107 DEBUG("error occurred while adding adv data\n");
hemddabral 58:027c65a54097 108 return BLE_ERROR_PARAM_OUT_OF_RANGE; // no other suitable error code is available
hemddabral 58:027c65a54097 109 }
hemddabral 58:027c65a54097 110 #endif
hemddabral 58:027c65a54097 111 break;
hemddabral 58:027c65a54097 112 case GapAdvertisingData::INCOMPLETE_LIST_32BIT_SERVICE_IDS: /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
hemddabral 10:814262eb0746 113 break;
hemddabral 58:027c65a54097 114 case GapAdvertisingData::COMPLETE_LIST_32BIT_SERVICE_IDS: /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
hemddabral 10:814262eb0746 115 break;
hemddabral 58:027c65a54097 116 case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */
hemddabral 10:814262eb0746 117 break;
hemddabral 58:027c65a54097 118 case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS: /**< Complete list of 128-bit Service IDs */
hemddabral 10:814262eb0746 119 break;
hemddabral 58:027c65a54097 120 case GapAdvertisingData::SHORTENED_LOCAL_NAME: /**< Shortened Local Name */
hemddabral 10:814262eb0746 121 break;
hemddabral 58:027c65a54097 122 case GapAdvertisingData::COMPLETE_LOCAL_NAME: /**< Complete Local Name */
hemddabral 58:027c65a54097 123 DEBUG("Advertising type: COMPLETE_LOCAL_NAME\n\r");
hemddabral 58:027c65a54097 124 loadPtr.getUnitAtIndex(index).printDataAsString();
hemddabral 58:027c65a54097 125 local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
hemddabral 58:027c65a54097 126 local_name = (const char*)loadPtr.getUnitAtIndex(index).getAdTypePtr();
hemddabral 58:027c65a54097 127 //COMPLETE_LOCAL_NAME is only advertising device name. Gatt Device Name is not the same.(Must be set right after GAP/GATT init?)
hemddabral 58:027c65a54097 128
hemddabral 58:027c65a54097 129 DEBUG("device_name length=%d\n\r", local_name_length);
hemddabral 58:027c65a54097 130 break;
hemddabral 10:814262eb0746 131
hemddabral 58:027c65a54097 132 case GapAdvertisingData::TX_POWER_LEVEL: /**< TX Power Level (in dBm) */
hemddabral 58:027c65a54097 133 DEBUG("Advertising type: TX_POWER_LEVEL\n\r");
hemddabral 58:027c65a54097 134 int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr();
hemddabral 58:027c65a54097 135 int8_t enHighPower = 0;
hemddabral 58:027c65a54097 136 int8_t paLevel = 0;
hemddabral 58:027c65a54097 137 int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel);
hemddabral 58:027c65a54097 138 DEBUG("dbm=%d, dbmActuallySet=%d\n\r", dbm, dbmActuallySet);
hemddabral 58:027c65a54097 139 DEBUG("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel);
hemddabral 58:027c65a54097 140 aci_hal_set_tx_power_level(enHighPower, paLevel);
hemddabral 10:814262eb0746 141 break;
hemddabral 58:027c65a54097 142 case GapAdvertisingData::DEVICE_ID: /**< Device ID */
hemddabral 58:027c65a54097 143 break;
hemddabral 58:027c65a54097 144 case GapAdvertisingData::SLAVE_CONNECTION_INTERVAL_RANGE: /**< Slave :Connection Interval Range */
hemddabral 10:814262eb0746 145 break;
hemddabral 58:027c65a54097 146 case GapAdvertisingData::SERVICE_DATA: /**< Service Data */
hemddabral 10:814262eb0746 147 break;
hemddabral 58:027c65a54097 148 case GapAdvertisingData::APPEARANCE:
hemddabral 58:027c65a54097 149 /*
hemddabral 14:baa7a1464517 150 Tested with GapAdvertisingData::GENERIC_PHONE.
hemddabral 14:baa7a1464517 151 for other appearances BLE Scanner android app is not behaving properly
hemddabral 14:baa7a1464517 152 */
hemddabral 58:027c65a54097 153 DEBUG("Advertising type: APPEARANCE\n\r");
hemddabral 58:027c65a54097 154 const char *deviceAppearance = NULL;
hemddabral 58:027c65a54097 155 deviceAppearance = (const char*)loadPtr.getUnitAtIndex(index).getDataPtr(); // to be set later when startAdvertising() is called
hemddabral 58:027c65a54097 156
hemddabral 58:027c65a54097 157 uint8_t Appearance[2];
hemddabral 58:027c65a54097 158 uint16_t devP = (uint16_t)*deviceAppearance;
hemddabral 58:027c65a54097 159 STORE_LE_16(Appearance, (uint16_t)devP);
hemddabral 58:027c65a54097 160
hemddabral 58:027c65a54097 161 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 */
hemddabral 58:027c65a54097 162
hemddabral 58:027c65a54097 163 aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (tHalUint8 *)deviceAppearance);//not using array Appearance[2]
hemddabral 10:814262eb0746 164 break;
hemddabral 58:027c65a54097 165 case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */
hemddabral 58:027c65a54097 166 advtInterval = (uint16_t)(*loadPtr.getUnitAtIndex(index).getDataPtr());
hemddabral 58:027c65a54097 167 DEBUG("advtInterval=%d\n\r", advtInterval);
hemddabral 10:814262eb0746 168 break;
hemddabral 58:027c65a54097 169 case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */
hemddabral 58:027c65a54097 170 break;
hemddabral 58:027c65a54097 171
hemddabral 19:0f87aaf1362d 172 }
hemddabral 58:027c65a54097 173 }
mridup 44:b4a986b33c7d 174 //Set the SCAN_RSP Payload
mridup 44:b4a986b33c7d 175 scan_response_payload = scanResponse.getPayload();
mridup 44:b4a986b33c7d 176 scan_rsp_length = scanResponse.getPayloadLen();
mridup 3:9c4c13795643 177 }
hemddabral 58:027c65a54097 178 return BLE_ERROR_NONE;
mridup 2:a2b623661316 179 }
mridup 2:a2b623661316 180
mridup 2:a2b623661316 181 /**************************************************************************/
mridup 2:a2b623661316 182 /*!
mridup 2:a2b623661316 183 @brief Starts the BLE HW, initialising any services that were
mridup 2:a2b623661316 184 added before this function was called.
mridup 2:a2b623661316 185
mridup 2:a2b623661316 186 @note All services must be added before calling this function!
mridup 2:a2b623661316 187
mridup 2:a2b623661316 188 @returns ble_error_t
mridup 2:a2b623661316 189
mridup 2:a2b623661316 190 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 191 Everything executed properly
mridup 2:a2b623661316 192
mridup 2:a2b623661316 193 @section EXAMPLE
mridup 2:a2b623661316 194
mridup 2:a2b623661316 195 @code
mridup 2:a2b623661316 196
mridup 2:a2b623661316 197 @endcode
mridup 2:a2b623661316 198 */
mridup 2:a2b623661316 199 /**************************************************************************/
mridup 2:a2b623661316 200 ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams &params)
mridup 2:a2b623661316 201 {
mridup 2:a2b623661316 202 /* Make sure we support the advertising type */
mridup 2:a2b623661316 203 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
mridup 2:a2b623661316 204 /* ToDo: This requires a propery security implementation, etc. */
mridup 2:a2b623661316 205 return BLE_ERROR_NOT_IMPLEMENTED;
mridup 2:a2b623661316 206 }
mridup 2:a2b623661316 207
mridup 2:a2b623661316 208 /* Check interval range */
mridup 2:a2b623661316 209 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) {
mridup 2:a2b623661316 210 /* Min delay is slightly longer for unconnectable devices */
mridup 2:a2b623661316 211 if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
hemddabral 58:027c65a54097 212 (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX)) {
mridup 2:a2b623661316 213 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 214 }
mridup 2:a2b623661316 215 } else {
mridup 2:a2b623661316 216 if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN) ||
hemddabral 58:027c65a54097 217 (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX)) {
mridup 2:a2b623661316 218 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 219 }
mridup 2:a2b623661316 220 }
mridup 2:a2b623661316 221
mridup 2:a2b623661316 222 /* Check timeout is zero for Connectable Directed */
mridup 2:a2b623661316 223 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) {
mridup 2:a2b623661316 224 /* Timeout must be 0 with this type, although we'll never get here */
mridup 2:a2b623661316 225 /* since this isn't implemented yet anyway */
mridup 2:a2b623661316 226 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 227 }
mridup 2:a2b623661316 228
mridup 2:a2b623661316 229 /* Check timeout for other advertising types */
mridup 2:a2b623661316 230 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
hemddabral 58:027c65a54097 231 (params.getTimeout() > GAP_ADV_PARAMS_TIMEOUT_MAX)) {
mridup 2:a2b623661316 232 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 233 }
mridup 2:a2b623661316 234
hemddabral 58:027c65a54097 235 tBleStatus ret;
hemddabral 58:027c65a54097 236 const LongUUIDBytes_t HRM_SERVICE_UUID_128 = {0x18, 0x0D};
hemddabral 58:027c65a54097 237 /* set scan response data */
hemddabral 58:027c65a54097 238 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[]);*/
hemddabral 58:027c65a54097 239
hemddabral 58:027c65a54097 240 /*aci_gap_set_discoverable(Advertising_Event_Type, Adv_min_intvl, Adv_Max_Intvl, Addr_Type, Adv_Filter_Policy,
mridup 2:a2b623661316 241 Local_Name_Length, local_name, service_uuid_length, service_uuid_list, Slave_conn_intvl_min, Slave_conn_intvl_max);*/
hemddabral 58:027c65a54097 242 /*LINK_LAYER.H DESCRIBES THE ADVERTISING TYPES*/
hemddabral 18:6d5f4c638f6a 243
hemddabral 58:027c65a54097 244 char* name = NULL;
hemddabral 58:027c65a54097 245 uint8_t nameLen = 0;
hemddabral 58:027c65a54097 246 if(local_name!=NULL) {
hemddabral 58:027c65a54097 247 name = (char*)local_name;
hemddabral 58:027c65a54097 248 DEBUG("name=%s\n\r", name);
hemddabral 58:027c65a54097 249 nameLen = local_name_length;
hemddabral 58:027c65a54097 250 } else {
hemddabral 58:027c65a54097 251 char str[] = "ST_BLE_DEV";
hemddabral 58:027c65a54097 252 name = new char[strlen(str)+1];
hemddabral 58:027c65a54097 253 name[0] = AD_TYPE_COMPLETE_LOCAL_NAME;
hemddabral 58:027c65a54097 254 strcpy(name+1, str);
hemddabral 58:027c65a54097 255 nameLen = strlen(name);
hemddabral 58:027c65a54097 256 DEBUG("nameLen=%d\n\r", nameLen);
hemddabral 58:027c65a54097 257 DEBUG("name=%s\n\r", name);
hemddabral 58:027c65a54097 258 }
hemddabral 58:027c65a54097 259
hemddabral 58:027c65a54097 260
hemddabral 58:027c65a54097 261 advtInterval = params.getInterval(); // set advtInterval in case it is not already set by user application
hemddabral 58:027c65a54097 262 ret = aci_gap_set_discoverable(params.getAdvertisingType(), // Advertising_Event_Type
hemddabral 58:027c65a54097 263 0, // Adv_Interval_Min
hemddabral 58:027c65a54097 264 advtInterval, // Adv_Interval_Max
hemddabral 58:027c65a54097 265 PUBLIC_ADDR, // Address_Type
hemddabral 58:027c65a54097 266 NO_WHITE_LIST_USE, // Adv_Filter_Policy
hemddabral 58:027c65a54097 267 nameLen, //local_name_length, // Local_Name_Length
hemddabral 58:027c65a54097 268 (const char*)name, //local_name, // Local_Name
hemddabral 58:027c65a54097 269 servUuidlength, //Service_Uuid_Length
hemddabral 58:027c65a54097 270 servUuidData, //Service_Uuid_List
hemddabral 58:027c65a54097 271 0, // Slave_Conn_Interval_Min
hemddabral 58:027c65a54097 272 0); // Slave_Conn_Interval_Max
hemddabral 58:027c65a54097 273
hemddabral 58:027c65a54097 274 state.advertising = 1;
hemddabral 58:027c65a54097 275
mridup 2:a2b623661316 276 return BLE_ERROR_NONE;
mridup 2:a2b623661316 277 }
mridup 2:a2b623661316 278
mridup 2:a2b623661316 279 /**************************************************************************/
mridup 2:a2b623661316 280 /*!
mridup 2:a2b623661316 281 @brief Stops the BLE HW and disconnects from any devices
mridup 2:a2b623661316 282
mridup 2:a2b623661316 283 @returns ble_error_t
mridup 2:a2b623661316 284
mridup 2:a2b623661316 285 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 286 Everything executed properly
mridup 2:a2b623661316 287
mridup 2:a2b623661316 288 @section EXAMPLE
mridup 2:a2b623661316 289
mridup 2:a2b623661316 290 @code
mridup 2:a2b623661316 291
mridup 2:a2b623661316 292 @endcode
mridup 2:a2b623661316 293 */
mridup 2:a2b623661316 294 /**************************************************************************/
mridup 2:a2b623661316 295 ble_error_t BlueNRGGap::stopAdvertising(void)
mridup 2:a2b623661316 296 {
mridup 34:fdbbe839170a 297 tBleStatus ret;
mridup 2:a2b623661316 298
mridup 36:f3d80a236beb 299 if(state.advertising == 1) {
hemddabral 58:027c65a54097 300 //Set non-discoverable to stop advertising
hemddabral 58:027c65a54097 301 ret = aci_gap_set_non_discoverable();
hemddabral 58:027c65a54097 302
hemddabral 58:027c65a54097 303 if (ret != BLE_STATUS_SUCCESS){
hemddabral 58:027c65a54097 304 DEBUG("Error in stopping advertisement!!\n\r") ;
hemddabral 58:027c65a54097 305 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
hemddabral 58:027c65a54097 306 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
hemddabral 58:027c65a54097 307 }
hemddabral 58:027c65a54097 308 DEBUG("Advertisement stopped!!\n\r") ;
hemddabral 58:027c65a54097 309 //Set GapState_t::advertising state
hemddabral 58:027c65a54097 310 state.advertising = 0;
mridup 36:f3d80a236beb 311 }
mridup 34:fdbbe839170a 312
mridup 2:a2b623661316 313 return BLE_ERROR_NONE;
mridup 2:a2b623661316 314 }
mridup 2:a2b623661316 315
mridup 2:a2b623661316 316 /**************************************************************************/
mridup 2:a2b623661316 317 /*!
mridup 2:a2b623661316 318 @brief Disconnects if we are connected to a central device
mridup 2:a2b623661316 319
mridup 2:a2b623661316 320 @returns ble_error_t
mridup 2:a2b623661316 321
mridup 2:a2b623661316 322 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 323 Everything executed properly
mridup 2:a2b623661316 324
mridup 2:a2b623661316 325 @section EXAMPLE
mridup 2:a2b623661316 326
mridup 2:a2b623661316 327 @code
mridup 2:a2b623661316 328
mridup 2:a2b623661316 329 @endcode
mridup 2:a2b623661316 330 */
mridup 2:a2b623661316 331 /**************************************************************************/
hemddabral 55:0e4db6804c8d 332 ble_error_t BlueNRGGap::disconnect(Gap::DisconnectionReason_t reason)
mridup 2:a2b623661316 333 {
mridup 34:fdbbe839170a 334 tBleStatus ret;
mridup 34:fdbbe839170a 335 //For Reason codes check BlueTooth HCI Spec
mridup 34:fdbbe839170a 336
mridup 36:f3d80a236beb 337 if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) {
mridup 34:fdbbe839170a 338 ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host.
mridup 34:fdbbe839170a 339
hemddabral 58:027c65a54097 340 if (ret != BLE_STATUS_SUCCESS){
hemddabral 58:027c65a54097 341 DEBUG("Error in GAP termination!!\n\r") ;
hemddabral 58:027c65a54097 342 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
hemddabral 58:027c65a54097 343 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
hemddabral 58:027c65a54097 344 }
hemddabral 58:027c65a54097 345
hemddabral 58:027c65a54097 346 //DEBUG("Disconnected from localhost!!\n\r") ;
hemddabral 58:027c65a54097 347 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
mridup 36:f3d80a236beb 348 }
mridup 2:a2b623661316 349
mridup 2:a2b623661316 350 return BLE_ERROR_NONE;
mridup 2:a2b623661316 351 }
mridup 2:a2b623661316 352
mridup 2:a2b623661316 353 /**************************************************************************/
mridup 2:a2b623661316 354 /*!
mridup 2:a2b623661316 355 @brief Sets the 16-bit connection handle
mridup 2:a2b623661316 356 */
mridup 2:a2b623661316 357 /**************************************************************************/
mridup 2:a2b623661316 358 void BlueNRGGap::setConnectionHandle(uint16_t con_handle)
mridup 2:a2b623661316 359 {
mridup 2:a2b623661316 360 m_connectionHandle = con_handle;
mridup 2:a2b623661316 361 }
mridup 2:a2b623661316 362
mridup 2:a2b623661316 363 /**************************************************************************/
mridup 2:a2b623661316 364 /*!
mridup 2:a2b623661316 365 @brief Gets the 16-bit connection handle
mridup 2:a2b623661316 366 */
mridup 2:a2b623661316 367 /**************************************************************************/
mridup 2:a2b623661316 368 uint16_t BlueNRGGap::getConnectionHandle(void)
mridup 2:a2b623661316 369 {
mridup 2:a2b623661316 370 return m_connectionHandle;
mridup 2:a2b623661316 371 }
mridup 2:a2b623661316 372
mridup 2:a2b623661316 373 /**************************************************************************/
mridup 2:a2b623661316 374 /*!
mridup 41:95b8d531628c 375 @brief Sets the BLE device address. SetAddress will reset the BLE
mridup 41:95b8d531628c 376 device and re-initialize BTLE. Will not start advertising.
mridup 2:a2b623661316 377
mridup 2:a2b623661316 378 @returns ble_error_t
mridup 2:a2b623661316 379
mridup 2:a2b623661316 380 @section EXAMPLE
mridup 2:a2b623661316 381
mridup 2:a2b623661316 382 @code
mridup 2:a2b623661316 383
mridup 2:a2b623661316 384 @endcode
mridup 2:a2b623661316 385 */
mridup 2:a2b623661316 386 /**************************************************************************/
mridup 2:a2b623661316 387 ble_error_t BlueNRGGap::setAddress(addr_type_t type, const uint8_t address[6])
mridup 2:a2b623661316 388 {
mridup 4:fa5b5693c1b5 389 tBleStatus ret;
mridup 4:fa5b5693c1b5 390
mridup 2:a2b623661316 391 if (type > ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE) {
mridup 2:a2b623661316 392 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 2:a2b623661316 393 }
hemddabral 58:027c65a54097 394
mridup 41:95b8d531628c 395 //copy address to bdAddr[6]
mridup 41:95b8d531628c 396 for(int i=0; i<BDADDR_SIZE; i++) {
mridup 41:95b8d531628c 397 bdaddr[i] = address[i];
mridup 41:95b8d531628c 398 //DEBUG("i[%d]:0x%x\n\r",i,bdaddr[i]);
hemddabral 58:027c65a54097 399 }
hemddabral 58:027c65a54097 400
mridup 41:95b8d531628c 401 if(!isSetAddress) isSetAddress = true;
mridup 41:95b8d531628c 402
mridup 41:95b8d531628c 403 //Re-Init the BTLE Device with SetAddress as true
mridup 45:1fff7d7d5ce7 404 //if(BlueNRGDevice::getIsInitialized())//Re-init only initialization is already done
hemddabral 58:027c65a54097 405 btle_init(isSetAddress);
mridup 4:fa5b5693c1b5 406
mridup 4:fa5b5693c1b5 407 //if (ret==BLE_STATUS_SUCCESS)
mridup 2:a2b623661316 408 return BLE_ERROR_NONE;
mridup 2:a2b623661316 409 }
hemddabral 32:d1f250acad29 410
mridup 42:1a0220f508ca 411 /**************************************************************************/
mridup 42:1a0220f508ca 412 /*!
mridup 42:1a0220f508ca 413 @brief Returns boolean if the address of the device has been set
mridup 42:1a0220f508ca 414 or not
mridup 42:1a0220f508ca 415
mridup 42:1a0220f508ca 416 @returns bool
mridup 42:1a0220f508ca 417
mridup 42:1a0220f508ca 418 @section EXAMPLE
mridup 42:1a0220f508ca 419
mridup 42:1a0220f508ca 420 @code
mridup 42:1a0220f508ca 421
mridup 42:1a0220f508ca 422 @endcode
mridup 42:1a0220f508ca 423 */
mridup 42:1a0220f508ca 424 /**************************************************************************/
mridup 41:95b8d531628c 425 bool BlueNRGGap::getIsSetAddress()
mridup 41:95b8d531628c 426 {
mridup 41:95b8d531628c 427 return isSetAddress;
mridup 41:95b8d531628c 428 }
mridup 41:95b8d531628c 429
mridup 42:1a0220f508ca 430 /**************************************************************************/
mridup 42:1a0220f508ca 431 /*!
mridup 42:1a0220f508ca 432 @brief Returns the address of the device if set
mridup 42:1a0220f508ca 433
mridup 42:1a0220f508ca 434 @returns ble_error_t
mridup 42:1a0220f508ca 435
mridup 42:1a0220f508ca 436 @section EXAMPLE
mridup 42:1a0220f508ca 437
mridup 42:1a0220f508ca 438 @code
mridup 42:1a0220f508ca 439
mridup 42:1a0220f508ca 440 @endcode
mridup 42:1a0220f508ca 441 */
mridup 42:1a0220f508ca 442 /**************************************************************************/
mridup 41:95b8d531628c 443 tHalUint8* BlueNRGGap::getAddress()
mridup 41:95b8d531628c 444 {
mridup 42:1a0220f508ca 445 if(isSetAddress)
mridup 42:1a0220f508ca 446 return bdaddr;
mridup 42:1a0220f508ca 447 else return NULL;
mridup 41:95b8d531628c 448 }
mridup 41:95b8d531628c 449
hemddabral 32:d1f250acad29 450 /**************************************************************************/
hemddabral 32:d1f250acad29 451 /*!
hemddabral 32:d1f250acad29 452 @brief obtains preferred connection params
hemddabral 32:d1f250acad29 453
hemddabral 32:d1f250acad29 454 @returns ble_error_t
hemddabral 32:d1f250acad29 455
hemddabral 32:d1f250acad29 456 @section EXAMPLE
hemddabral 32:d1f250acad29 457
hemddabral 32:d1f250acad29 458 @code
hemddabral 32:d1f250acad29 459
hemddabral 32:d1f250acad29 460 @endcode
hemddabral 32:d1f250acad29 461 */
hemddabral 32:d1f250acad29 462 /**************************************************************************/
hemddabral 32:d1f250acad29 463 ble_error_t BlueNRGGap::getPreferredConnectionParams(ConnectionParams_t *params)
hemddabral 32:d1f250acad29 464 {
hemddabral 32:d1f250acad29 465 return BLE_ERROR_NONE;
hemddabral 32:d1f250acad29 466 }
hemddabral 32:d1f250acad29 467
hemddabral 32:d1f250acad29 468
hemddabral 32:d1f250acad29 469 /**************************************************************************/
hemddabral 32:d1f250acad29 470 /*!
hemddabral 32:d1f250acad29 471 @brief sets preferred connection params
hemddabral 32:d1f250acad29 472
hemddabral 32:d1f250acad29 473 @returns ble_error_t
hemddabral 32:d1f250acad29 474
hemddabral 32:d1f250acad29 475 @section EXAMPLE
hemddabral 32:d1f250acad29 476
hemddabral 32:d1f250acad29 477 @code
hemddabral 32:d1f250acad29 478
hemddabral 32:d1f250acad29 479 @endcode
hemddabral 32:d1f250acad29 480 */
hemddabral 32:d1f250acad29 481 /**************************************************************************/
hemddabral 32:d1f250acad29 482 ble_error_t BlueNRGGap::setPreferredConnectionParams(const ConnectionParams_t *params)
hemddabral 32:d1f250acad29 483 {
hemddabral 32:d1f250acad29 484 return BLE_ERROR_NONE;
hemddabral 32:d1f250acad29 485 }
hemddabral 32:d1f250acad29 486
hemddabral 32:d1f250acad29 487 /**************************************************************************/
hemddabral 32:d1f250acad29 488 /*!
hemddabral 32:d1f250acad29 489 @brief updates preferred connection params
hemddabral 32:d1f250acad29 490
hemddabral 32:d1f250acad29 491 @returns ble_error_t
hemddabral 32:d1f250acad29 492
hemddabral 32:d1f250acad29 493 @section EXAMPLE
hemddabral 32:d1f250acad29 494
hemddabral 32:d1f250acad29 495 @code
hemddabral 32:d1f250acad29 496
hemddabral 32:d1f250acad29 497 @endcode
hemddabral 32:d1f250acad29 498 */
hemddabral 32:d1f250acad29 499 /**************************************************************************/
hemddabral 32:d1f250acad29 500 ble_error_t BlueNRGGap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *params)
hemddabral 32:d1f250acad29 501 {
hemddabral 32:d1f250acad29 502 return BLE_ERROR_NONE;
hemddabral 32:d1f250acad29 503 }
hemddabral 32:d1f250acad29 504
hemddabral 55:0e4db6804c8d 505 /**************************************************************************/
hemddabral 55:0e4db6804c8d 506 /*!
hemddabral 55:0e4db6804c8d 507 @brief sets device name characteristic
hemddabral 55:0e4db6804c8d 508
hemddabral 55:0e4db6804c8d 509 @param[in] deviceName
hemddabral 55:0e4db6804c8d 510 pointer to device name to be set
hemddabral 55:0e4db6804c8d 511
hemddabral 55:0e4db6804c8d 512 @returns ble_error_t
hemddabral 55:0e4db6804c8d 513
hemddabral 55:0e4db6804c8d 514 @retval BLE_ERROR_NONE
hemddabral 55:0e4db6804c8d 515 Everything executed properly
hemddabral 55:0e4db6804c8d 516
hemddabral 55:0e4db6804c8d 517 @section EXAMPLE
hemddabral 55:0e4db6804c8d 518
hemddabral 55:0e4db6804c8d 519 @code
hemddabral 55:0e4db6804c8d 520
hemddabral 55:0e4db6804c8d 521 @endcode
hemddabral 55:0e4db6804c8d 522 */
hemddabral 55:0e4db6804c8d 523 /**************************************************************************/
hemddabral 55:0e4db6804c8d 524 ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName)
hemddabral 55:0e4db6804c8d 525 {
hemddabral 55:0e4db6804c8d 526 int ret;
hemddabral 55:0e4db6804c8d 527 uint8_t nameLen = 0;
hemddabral 55:0e4db6804c8d 528
hemddabral 55:0e4db6804c8d 529 DeviceName = (uint8_t *)deviceName;
hemddabral 55:0e4db6804c8d 530 //DEBUG("SetDeviceName=%s\n\r", DeviceName);
hemddabral 55:0e4db6804c8d 531
hemddabral 55:0e4db6804c8d 532 nameLen = strlen((const char*)DeviceName);
hemddabral 55:0e4db6804c8d 533 //DEBUG("DeviceName Size=%d\n\r", nameLen);
hemddabral 55:0e4db6804c8d 534
hemddabral 55:0e4db6804c8d 535 ret = aci_gatt_update_char_value(g_gap_service_handle,
hemddabral 58:027c65a54097 536 g_device_name_char_handle,
hemddabral 58:027c65a54097 537 0,
hemddabral 58:027c65a54097 538 nameLen,
hemddabral 58:027c65a54097 539 (tHalUint8 *)DeviceName);
hemddabral 58:027c65a54097 540
hemddabral 55:0e4db6804c8d 541 if(ret){
hemddabral 55:0e4db6804c8d 542 DEBUG("device set name failed\n\r");
hemddabral 55:0e4db6804c8d 543 return BLE_ERROR_PARAM_OUT_OF_RANGE;//TODO:Wrong error code
hemddabral 55:0e4db6804c8d 544 }
hemddabral 58:027c65a54097 545
hemddabral 55:0e4db6804c8d 546 return BLE_ERROR_NONE;
hemddabral 55:0e4db6804c8d 547 }
hemddabral 55:0e4db6804c8d 548
hemddabral 55:0e4db6804c8d 549 /**************************************************************************/
hemddabral 55:0e4db6804c8d 550 /*!
hemddabral 55:0e4db6804c8d 551 @brief gets device name characteristic
hemddabral 55:0e4db6804c8d 552
hemddabral 55:0e4db6804c8d 553 @param[in] deviceName
hemddabral 55:0e4db6804c8d 554 pointer to device name
hemddabral 55:0e4db6804c8d 555
hemddabral 55:0e4db6804c8d 556
hemddabral 55:0e4db6804c8d 557 @param[in] lengthP
hemddabral 55:0e4db6804c8d 558 pointer to device name length
hemddabral 55:0e4db6804c8d 559
hemddabral 55:0e4db6804c8d 560 @returns ble_error_t
hemddabral 55:0e4db6804c8d 561
hemddabral 55:0e4db6804c8d 562 @retval BLE_ERROR_NONE
hemddabral 55:0e4db6804c8d 563 Everything executed properly
hemddabral 55:0e4db6804c8d 564
hemddabral 55:0e4db6804c8d 565 @section EXAMPLE
hemddabral 55:0e4db6804c8d 566
hemddabral 55:0e4db6804c8d 567 @code
hemddabral 55:0e4db6804c8d 568
hemddabral 55:0e4db6804c8d 569 @endcode
hemddabral 55:0e4db6804c8d 570 */
hemddabral 55:0e4db6804c8d 571 /**************************************************************************/
hemddabral 55:0e4db6804c8d 572 ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
hemddabral 55:0e4db6804c8d 573 {
hemddabral 55:0e4db6804c8d 574 int ret;
hemddabral 55:0e4db6804c8d 575
hemddabral 55:0e4db6804c8d 576 if(DeviceName==NULL)
hemddabral 58:027c65a54097 577 return BLE_ERROR_PARAM_OUT_OF_RANGE;
hemddabral 55:0e4db6804c8d 578
hemddabral 55:0e4db6804c8d 579 strcpy((char*)deviceName, (const char*)DeviceName);
hemddabral 55:0e4db6804c8d 580 //DEBUG("GetDeviceName=%s\n\r", deviceName);
hemddabral 55:0e4db6804c8d 581
hemddabral 55:0e4db6804c8d 582 *lengthP = strlen((const char*)DeviceName);
hemddabral 55:0e4db6804c8d 583 //DEBUG("DeviceName Size=%d\n\r", *lengthP);
hemddabral 55:0e4db6804c8d 584
hemddabral 55:0e4db6804c8d 585 return BLE_ERROR_NONE;
hemddabral 55:0e4db6804c8d 586 }
hemddabral 55:0e4db6804c8d 587
hemddabral 55:0e4db6804c8d 588 /**************************************************************************/
hemddabral 55:0e4db6804c8d 589 /*!
hemddabral 55:0e4db6804c8d 590 @brief sets device appearance characteristic
hemddabral 55:0e4db6804c8d 591
hemddabral 55:0e4db6804c8d 592 @param[in] appearance
hemddabral 55:0e4db6804c8d 593 device appearance
hemddabral 55:0e4db6804c8d 594
hemddabral 55:0e4db6804c8d 595 @returns ble_error_t
hemddabral 55:0e4db6804c8d 596
hemddabral 55:0e4db6804c8d 597 @retval BLE_ERROR_NONE
hemddabral 55:0e4db6804c8d 598 Everything executed properly
hemddabral 55:0e4db6804c8d 599
hemddabral 55:0e4db6804c8d 600 @section EXAMPLE
hemddabral 55:0e4db6804c8d 601
hemddabral 55:0e4db6804c8d 602 @code
hemddabral 55:0e4db6804c8d 603
hemddabral 55:0e4db6804c8d 604 @endcode
hemddabral 55:0e4db6804c8d 605 */
hemddabral 55:0e4db6804c8d 606 /**************************************************************************/
hemddabral 55:0e4db6804c8d 607 ble_error_t BlueNRGGap::setAppearance(uint16_t appearance)
hemddabral 55:0e4db6804c8d 608 {
hemddabral 55:0e4db6804c8d 609 /*
hemddabral 55:0e4db6804c8d 610 Tested with GapAdvertisingData::GENERIC_PHONE.
hemddabral 55:0e4db6804c8d 611 for other appearances BLE Scanner android app is not behaving properly
hemddabral 55:0e4db6804c8d 612 */
hemddabral 55:0e4db6804c8d 613 //char deviceAppearance[2];
hemddabral 55:0e4db6804c8d 614 STORE_LE_16(deviceAppearance, appearance);
hemddabral 55:0e4db6804c8d 615 DEBUG("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]);
hemddabral 55:0e4db6804c8d 616
hemddabral 55:0e4db6804c8d 617 aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (tHalUint8 *)deviceAppearance);
hemddabral 55:0e4db6804c8d 618
hemddabral 55:0e4db6804c8d 619 return BLE_ERROR_NONE;
hemddabral 55:0e4db6804c8d 620 }
hemddabral 55:0e4db6804c8d 621
hemddabral 55:0e4db6804c8d 622 /**************************************************************************/
hemddabral 55:0e4db6804c8d 623 /*!
hemddabral 55:0e4db6804c8d 624 @brief gets device appearance
hemddabral 55:0e4db6804c8d 625
hemddabral 55:0e4db6804c8d 626 @param[in] appearance
hemddabral 55:0e4db6804c8d 627 pointer to device appearance value
hemddabral 55:0e4db6804c8d 628
hemddabral 55:0e4db6804c8d 629 @returns ble_error_t
hemddabral 55:0e4db6804c8d 630
hemddabral 55:0e4db6804c8d 631 @retval BLE_ERROR_NONE
hemddabral 55:0e4db6804c8d 632 Everything executed properly
hemddabral 55:0e4db6804c8d 633
hemddabral 55:0e4db6804c8d 634 @section EXAMPLE
hemddabral 55:0e4db6804c8d 635
hemddabral 55:0e4db6804c8d 636 @code
hemddabral 55:0e4db6804c8d 637
hemddabral 55:0e4db6804c8d 638 @endcode
hemddabral 55:0e4db6804c8d 639 */
hemddabral 55:0e4db6804c8d 640 /**************************************************************************/
hemddabral 55:0e4db6804c8d 641 ble_error_t BlueNRGGap::getAppearance(uint16_t *appearanceP)
hemddabral 55:0e4db6804c8d 642 {
hemddabral 55:0e4db6804c8d 643 uint16_t devP;
hemddabral 55:0e4db6804c8d 644 if(!appearanceP) return BLE_ERROR_PARAM_OUT_OF_RANGE;
hemddabral 55:0e4db6804c8d 645 devP = ((uint16_t)(0x0000|deviceAppearance[0])) | (((uint16_t)(0x0000|deviceAppearance[1]))<<8);
hemddabral 55:0e4db6804c8d 646 strcpy((char*)appearanceP, (const char*)&devP);
hemddabral 55:0e4db6804c8d 647
hemddabral 55:0e4db6804c8d 648 return BLE_ERROR_NONE;
hemddabral 55:0e4db6804c8d 649 }