BLE_API_Tiny_BLE

Dependents:   CSSE4011_BLE_IMU

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Wed Jan 21 09:32:49 2015 +0000
Revision:
260:ea7f9f14cc15
Parent:
106:a20be740075d
Synchronized with git rev bec9560c
Author: Rohit Grover
fix all line endings to be Unix style

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 260:ea7f9f14cc15 1 /* mbed Microcontroller Library
rgrover1 260:ea7f9f14cc15 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 260:ea7f9f14cc15 3 *
rgrover1 260:ea7f9f14cc15 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 260:ea7f9f14cc15 5 * you may not use this file except in compliance with the License.
rgrover1 260:ea7f9f14cc15 6 * You may obtain a copy of the License at
rgrover1 260:ea7f9f14cc15 7 *
rgrover1 260:ea7f9f14cc15 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 260:ea7f9f14cc15 9 *
rgrover1 260:ea7f9f14cc15 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 260:ea7f9f14cc15 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 260:ea7f9f14cc15 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 260:ea7f9f14cc15 13 * See the License for the specific language governing permissions and
rgrover1 260:ea7f9f14cc15 14 * limitations under the License.
rgrover1 260:ea7f9f14cc15 15 */
rgrover1 260:ea7f9f14cc15 16
rgrover1 260:ea7f9f14cc15 17 #include <stdio.h>
rgrover1 260:ea7f9f14cc15 18 #include <string.h>
rgrover1 260:ea7f9f14cc15 19
rgrover1 260:ea7f9f14cc15 20 #include "GapAdvertisingData.h"
rgrover1 260:ea7f9f14cc15 21
rgrover1 260:ea7f9f14cc15 22 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 23 /*!
rgrover1 260:ea7f9f14cc15 24 \brief Creates a new GapAdvertisingData instance
rgrover1 260:ea7f9f14cc15 25
rgrover1 260:ea7f9f14cc15 26 \par EXAMPLE
rgrover1 260:ea7f9f14cc15 27
rgrover1 260:ea7f9f14cc15 28 \code
rgrover1 260:ea7f9f14cc15 29
rgrover1 260:ea7f9f14cc15 30 \endcode
rgrover1 260:ea7f9f14cc15 31 */
rgrover1 260:ea7f9f14cc15 32 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 33 GapAdvertisingData::GapAdvertisingData(void) : _payload(), _payloadLen(0), _appearance(GENERIC_TAG) {
rgrover1 260:ea7f9f14cc15 34 /* empty */
rgrover1 260:ea7f9f14cc15 35 }
rgrover1 260:ea7f9f14cc15 36
rgrover1 260:ea7f9f14cc15 37 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 38 /*!
rgrover1 260:ea7f9f14cc15 39 Destructor
rgrover1 260:ea7f9f14cc15 40 */
rgrover1 260:ea7f9f14cc15 41 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 42 GapAdvertisingData::~GapAdvertisingData(void)
rgrover1 260:ea7f9f14cc15 43 {
rgrover1 260:ea7f9f14cc15 44 }
rgrover1 260:ea7f9f14cc15 45
rgrover1 260:ea7f9f14cc15 46 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 47 /*!
rgrover1 260:ea7f9f14cc15 48 \brief Adds advertising data based on the specified AD type (see
rgrover1 260:ea7f9f14cc15 49 DataType)
rgrover1 260:ea7f9f14cc15 50
rgrover1 260:ea7f9f14cc15 51 \args[in] advDataType The Advertising 'DataType' to add
rgrover1 260:ea7f9f14cc15 52 \args[in] payload Pointer to the payload contents
rgrover1 260:ea7f9f14cc15 53 \args[in] len Size of the payload in bytes
rgrover1 260:ea7f9f14cc15 54
rgrover1 260:ea7f9f14cc15 55 \returns ble_error_t
rgrover1 260:ea7f9f14cc15 56
rgrover1 260:ea7f9f14cc15 57 \retval BLE_ERROR_NONE
rgrover1 260:ea7f9f14cc15 58 Everything executed properly
rgrover1 260:ea7f9f14cc15 59
rgrover1 260:ea7f9f14cc15 60 \retval BLE_ERROR_BUFFER_OVERFLOW
rgrover1 260:ea7f9f14cc15 61 The specified data would cause the advertising buffer
rgrover1 260:ea7f9f14cc15 62 to overflow
rgrover1 260:ea7f9f14cc15 63
rgrover1 260:ea7f9f14cc15 64 \par EXAMPLE
rgrover1 260:ea7f9f14cc15 65
rgrover1 260:ea7f9f14cc15 66 \code
rgrover1 260:ea7f9f14cc15 67
rgrover1 260:ea7f9f14cc15 68 \endcode
rgrover1 260:ea7f9f14cc15 69 */
rgrover1 260:ea7f9f14cc15 70 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 71 ble_error_t GapAdvertisingData::addData(DataType advDataType, const uint8_t *payload, uint8_t len)
rgrover1 260:ea7f9f14cc15 72 {
rgrover1 260:ea7f9f14cc15 73 /* ToDo: Check if an AD type already exists and if the existing */
rgrover1 260:ea7f9f14cc15 74 /* value is exclusive or not (flags, etc.) */
rgrover1 260:ea7f9f14cc15 75
rgrover1 260:ea7f9f14cc15 76 /* Make sure we don't exceed the 31 byte payload limit */
rgrover1 260:ea7f9f14cc15 77 if (_payloadLen + len + 2 > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
rgrover1 260:ea7f9f14cc15 78 return BLE_ERROR_BUFFER_OVERFLOW;
rgrover1 260:ea7f9f14cc15 79 }
rgrover1 260:ea7f9f14cc15 80
rgrover1 260:ea7f9f14cc15 81 /* Field length */
rgrover1 260:ea7f9f14cc15 82 memset(&_payload[_payloadLen], len + 1, 1);
rgrover1 260:ea7f9f14cc15 83 _payloadLen++;
rgrover1 260:ea7f9f14cc15 84
rgrover1 260:ea7f9f14cc15 85 /* Field ID */
rgrover1 260:ea7f9f14cc15 86 memset(&_payload[_payloadLen], (uint8_t)advDataType, 1);
rgrover1 260:ea7f9f14cc15 87 _payloadLen++;
rgrover1 260:ea7f9f14cc15 88
rgrover1 260:ea7f9f14cc15 89 /* Payload */
rgrover1 260:ea7f9f14cc15 90 memcpy(&_payload[_payloadLen], payload, len);
rgrover1 260:ea7f9f14cc15 91 _payloadLen += len;
rgrover1 260:ea7f9f14cc15 92
rgrover1 260:ea7f9f14cc15 93 return BLE_ERROR_NONE;
rgrover1 260:ea7f9f14cc15 94 }
rgrover1 260:ea7f9f14cc15 95
rgrover1 260:ea7f9f14cc15 96 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 97 /*!
rgrover1 260:ea7f9f14cc15 98 \brief Helper function to add APPEARANCE data to the advertising
rgrover1 260:ea7f9f14cc15 99 payload
rgrover1 260:ea7f9f14cc15 100
rgrover1 260:ea7f9f14cc15 101 \args[in] appearance The APPEARANCE value to add
rgrover1 260:ea7f9f14cc15 102
rgrover1 260:ea7f9f14cc15 103 \returns ble_error_t
rgrover1 260:ea7f9f14cc15 104
rgrover1 260:ea7f9f14cc15 105 \retval BLE_ERROR_NONE
rgrover1 260:ea7f9f14cc15 106 Everything executed properly
rgrover1 260:ea7f9f14cc15 107
rgrover1 260:ea7f9f14cc15 108 \retval BLE_ERROR_BUFFER_OVERFLOW
rgrover1 260:ea7f9f14cc15 109 The specified data would cause the advertising buffer
rgrover1 260:ea7f9f14cc15 110 to overflow
rgrover1 260:ea7f9f14cc15 111
rgrover1 260:ea7f9f14cc15 112 \par EXAMPLE
rgrover1 260:ea7f9f14cc15 113
rgrover1 260:ea7f9f14cc15 114 \code
rgrover1 260:ea7f9f14cc15 115
rgrover1 260:ea7f9f14cc15 116 \endcode
rgrover1 260:ea7f9f14cc15 117 */
rgrover1 260:ea7f9f14cc15 118 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 119 ble_error_t GapAdvertisingData::addAppearance(Appearance appearance)
rgrover1 260:ea7f9f14cc15 120 {
rgrover1 260:ea7f9f14cc15 121 _appearance = appearance;
rgrover1 260:ea7f9f14cc15 122 return addData(GapAdvertisingData::APPEARANCE, (uint8_t *)&appearance, 2);
rgrover1 260:ea7f9f14cc15 123 }
rgrover1 260:ea7f9f14cc15 124
rgrover1 260:ea7f9f14cc15 125 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 126 /*!
rgrover1 260:ea7f9f14cc15 127 \brief Helper function to add FLAGS data to the advertising
rgrover1 260:ea7f9f14cc15 128 payload
rgrover1 260:ea7f9f14cc15 129
rgrover1 260:ea7f9f14cc15 130 \args[in] flag The FLAGS value to add
rgrover1 260:ea7f9f14cc15 131
rgrover1 260:ea7f9f14cc15 132 \par LE_LIMITED_DISCOVERABLE
rgrover1 260:ea7f9f14cc15 133 The peripheral is discoverable for a limited period of
rgrover1 260:ea7f9f14cc15 134 time
rgrover1 260:ea7f9f14cc15 135
rgrover1 260:ea7f9f14cc15 136 \par LE_GENERAL_DISCOVERABLE
rgrover1 260:ea7f9f14cc15 137 The peripheral is permanently discoverable
rgrover1 260:ea7f9f14cc15 138
rgrover1 260:ea7f9f14cc15 139 \par BREDR_NOT_SUPPORTED
rgrover1 260:ea7f9f14cc15 140 This peripheral is a Bluetooth Low Energy only device
rgrover1 260:ea7f9f14cc15 141 (no EDR support)
rgrover1 260:ea7f9f14cc15 142
rgrover1 260:ea7f9f14cc15 143 \returns ble_error_t
rgrover1 260:ea7f9f14cc15 144
rgrover1 260:ea7f9f14cc15 145 \retval BLE_ERROR_NONE
rgrover1 260:ea7f9f14cc15 146 Everything executed properly
rgrover1 260:ea7f9f14cc15 147
rgrover1 260:ea7f9f14cc15 148 \retval BLE_ERROR_BUFFER_OVERFLOW
rgrover1 260:ea7f9f14cc15 149 The specified data would cause the advertising buffer
rgrover1 260:ea7f9f14cc15 150 to overflow
rgrover1 260:ea7f9f14cc15 151
rgrover1 260:ea7f9f14cc15 152 \par EXAMPLE
rgrover1 260:ea7f9f14cc15 153
rgrover1 260:ea7f9f14cc15 154 \code
rgrover1 260:ea7f9f14cc15 155
rgrover1 260:ea7f9f14cc15 156 \endcode
rgrover1 260:ea7f9f14cc15 157 */
rgrover1 260:ea7f9f14cc15 158 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 159 ble_error_t GapAdvertisingData::addFlags(uint8_t flags)
rgrover1 260:ea7f9f14cc15 160 {
rgrover1 260:ea7f9f14cc15 161 return addData(GapAdvertisingData::FLAGS, &flags, 1);
rgrover1 260:ea7f9f14cc15 162 }
rgrover1 260:ea7f9f14cc15 163
rgrover1 260:ea7f9f14cc15 164 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 165 /*!
rgrover1 260:ea7f9f14cc15 166 \brief Helper function to add TX_POWER_LEVEL data to the
rgrover1 260:ea7f9f14cc15 167 advertising payload
rgrover1 260:ea7f9f14cc15 168
rgrover1 260:ea7f9f14cc15 169 \args[in] flag The TX_POWER_LEVEL value to add
rgrover1 260:ea7f9f14cc15 170
rgrover1 260:ea7f9f14cc15 171 \returns ble_error_t
rgrover1 260:ea7f9f14cc15 172
rgrover1 260:ea7f9f14cc15 173 \retval BLE_ERROR_NONE
rgrover1 260:ea7f9f14cc15 174 Everything executed properly
rgrover1 260:ea7f9f14cc15 175
rgrover1 260:ea7f9f14cc15 176 \retval BLE_ERROR_BUFFER_OVERFLOW
rgrover1 260:ea7f9f14cc15 177 The specified data would cause the advertising buffer
rgrover1 260:ea7f9f14cc15 178 to overflow
rgrover1 260:ea7f9f14cc15 179
rgrover1 260:ea7f9f14cc15 180 \par EXAMPLE
rgrover1 260:ea7f9f14cc15 181
rgrover1 260:ea7f9f14cc15 182 \code
rgrover1 260:ea7f9f14cc15 183
rgrover1 260:ea7f9f14cc15 184 \endcode
rgrover1 260:ea7f9f14cc15 185 */
rgrover1 260:ea7f9f14cc15 186 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 187 ble_error_t GapAdvertisingData::addTxPower(int8_t txPower)
rgrover1 260:ea7f9f14cc15 188 {
rgrover1 260:ea7f9f14cc15 189 /* ToDo: Basic error checking to make sure txPower is in range */
rgrover1 260:ea7f9f14cc15 190 return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t *)&txPower, 1);
rgrover1 260:ea7f9f14cc15 191 }
rgrover1 260:ea7f9f14cc15 192
rgrover1 260:ea7f9f14cc15 193 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 194 /*!
rgrover1 260:ea7f9f14cc15 195 \brief Clears the payload and resets the payload length counter
rgrover1 260:ea7f9f14cc15 196 */
rgrover1 260:ea7f9f14cc15 197 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 198 void GapAdvertisingData::clear(void)
rgrover1 260:ea7f9f14cc15 199 {
rgrover1 260:ea7f9f14cc15 200 memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
rgrover1 260:ea7f9f14cc15 201 _payloadLen = 0;
rgrover1 260:ea7f9f14cc15 202 }
rgrover1 260:ea7f9f14cc15 203
rgrover1 260:ea7f9f14cc15 204 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 205 /*!
rgrover1 260:ea7f9f14cc15 206 \brief Returns a pointer to the the current payload
rgrover1 260:ea7f9f14cc15 207
rgrover1 260:ea7f9f14cc15 208 \returns A pointer to the payload
rgrover1 260:ea7f9f14cc15 209 */
rgrover1 260:ea7f9f14cc15 210 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 211 const uint8_t *GapAdvertisingData::getPayload(void) const
rgrover1 260:ea7f9f14cc15 212 {
rgrover1 260:ea7f9f14cc15 213 return (_payloadLen > 0) ? _payload : NULL;
rgrover1 260:ea7f9f14cc15 214 }
rgrover1 260:ea7f9f14cc15 215
rgrover1 260:ea7f9f14cc15 216 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 217 /*!
rgrover1 260:ea7f9f14cc15 218 \brief Returns the current payload length (0..31 bytes)
rgrover1 260:ea7f9f14cc15 219
rgrover1 260:ea7f9f14cc15 220 \returns The payload length in bytes
rgrover1 260:ea7f9f14cc15 221 */
rgrover1 260:ea7f9f14cc15 222 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 223 uint8_t GapAdvertisingData::getPayloadLen(void) const
rgrover1 260:ea7f9f14cc15 224 {
rgrover1 260:ea7f9f14cc15 225 return _payloadLen;
rgrover1 260:ea7f9f14cc15 226 }
rgrover1 260:ea7f9f14cc15 227
rgrover1 260:ea7f9f14cc15 228 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 229 /*!
rgrover1 260:ea7f9f14cc15 230 \brief Returns the 16-bit appearance value for this device
rgrover1 260:ea7f9f14cc15 231
rgrover1 260:ea7f9f14cc15 232 \returns The 16-bit appearance value
rgrover1 260:ea7f9f14cc15 233 */
rgrover1 260:ea7f9f14cc15 234 /**************************************************************************/
rgrover1 260:ea7f9f14cc15 235 uint16_t GapAdvertisingData::getAppearance(void) const
rgrover1 260:ea7f9f14cc15 236 {
rgrover1 260:ea7f9f14cc15 237 return (uint16_t)_appearance;
rgrover1 260:ea7f9f14cc15 238 }