fork BLE_API to add update adv payload API

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Thu Jul 02 09:06:11 2015 +0100
Revision:
714:a6130aaa0fd9
Synchronized with git rev 7e8977d8
Author: Rohit Grover
Release 0.3.8
=============

This is a minor set of enhancements before we yotta-ize BLE_API.

Enhancements
~~~~~~~~~~~~

* Minor rework for class UUID; added a default and copy constructor; and a != operator.

* Added copy constructor and accessors for GapAdvertisingParams.

* GapScanningParams:: remove unnecessary checks for SCAN_TIMEOUT_MAX.

* Add a comment header block to explain why BLEDevice::init() may not be safe
to call from global static context.

* Introduce GattAttribute::INVALID_HANDLE.

* Replace some deprecated uses of Gap::address_t with Gap::Address_t.

Bugfixes
~~~~~~~~

* None.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 714:a6130aaa0fd9 1 /* mbed Microcontroller Library
rgrover1 714:a6130aaa0fd9 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 714:a6130aaa0fd9 3 *
rgrover1 714:a6130aaa0fd9 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 714:a6130aaa0fd9 5 * you may not use this file except in compliance with the License.
rgrover1 714:a6130aaa0fd9 6 * You may obtain a copy of the License at
rgrover1 714:a6130aaa0fd9 7 *
rgrover1 714:a6130aaa0fd9 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 714:a6130aaa0fd9 9 *
rgrover1 714:a6130aaa0fd9 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 714:a6130aaa0fd9 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 714:a6130aaa0fd9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 714:a6130aaa0fd9 13 * See the License for the specific language governing permissions and
rgrover1 714:a6130aaa0fd9 14 * limitations under the License.
rgrover1 714:a6130aaa0fd9 15 */
rgrover1 714:a6130aaa0fd9 16
rgrover1 714:a6130aaa0fd9 17 #ifndef __GAP_ADVERTISING_DATA_H__
rgrover1 714:a6130aaa0fd9 18 #define __GAP_ADVERTISING_DATA_H__
rgrover1 714:a6130aaa0fd9 19
rgrover1 714:a6130aaa0fd9 20 #include <string.h>
rgrover1 714:a6130aaa0fd9 21
rgrover1 714:a6130aaa0fd9 22 #include "blecommon.h"
rgrover1 714:a6130aaa0fd9 23
rgrover1 714:a6130aaa0fd9 24 #define GAP_ADVERTISING_DATA_MAX_PAYLOAD (31)
rgrover1 714:a6130aaa0fd9 25
rgrover1 714:a6130aaa0fd9 26 /**************************************************************************/
rgrover1 714:a6130aaa0fd9 27 /*!
rgrover1 714:a6130aaa0fd9 28 \brief
rgrover1 714:a6130aaa0fd9 29 This class provides several helper functions to generate properly
rgrover1 714:a6130aaa0fd9 30 formatted GAP Advertising and Scan Response data payloads
rgrover1 714:a6130aaa0fd9 31
rgrover1 714:a6130aaa0fd9 32 \note
rgrover1 714:a6130aaa0fd9 33 See Bluetooth Specification 4.0 (Vol. 3), Part C, Section 11 and 18
rgrover1 714:a6130aaa0fd9 34 for further information on Advertising and Scan Response data.
rgrover1 714:a6130aaa0fd9 35
rgrover1 714:a6130aaa0fd9 36 \par Advertising and Scan Response Payloads
rgrover1 714:a6130aaa0fd9 37 Advertising data and Scan Response data are organized around a set of
rgrover1 714:a6130aaa0fd9 38 data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
rgrover1 714:a6130aaa0fd9 39 Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
rgrover1 714:a6130aaa0fd9 40
rgrover1 714:a6130aaa0fd9 41 \par
rgrover1 714:a6130aaa0fd9 42 Each AD type has it's own standardized 'assigned number', as defined
rgrover1 714:a6130aaa0fd9 43 by the Bluetooth SIG:
rgrover1 714:a6130aaa0fd9 44 https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
rgrover1 714:a6130aaa0fd9 45
rgrover1 714:a6130aaa0fd9 46 \par
rgrover1 714:a6130aaa0fd9 47 For convenience sake, all appropriate AD types have been encapsulated
rgrover1 714:a6130aaa0fd9 48 into GapAdvertisingData::DataType.
rgrover1 714:a6130aaa0fd9 49
rgrover1 714:a6130aaa0fd9 50 \par
rgrover1 714:a6130aaa0fd9 51 Before the AD Types and their payload (if any) can be inserted into
rgrover1 714:a6130aaa0fd9 52 the Advertising or Scan Response frames, they need to be formatted as
rgrover1 714:a6130aaa0fd9 53 follows:
rgrover1 714:a6130aaa0fd9 54
rgrover1 714:a6130aaa0fd9 55 \li \c Record length (1 byte)
rgrover1 714:a6130aaa0fd9 56 \li \c AD Type (1 byte)
rgrover1 714:a6130aaa0fd9 57 \li \c AD payload (optional, only present if record length > 1)
rgrover1 714:a6130aaa0fd9 58
rgrover1 714:a6130aaa0fd9 59 \par
rgrover1 714:a6130aaa0fd9 60 This class takes care of properly formatting the payload, performs
rgrover1 714:a6130aaa0fd9 61 some basic checks on the payload length, and tries to avoid common
rgrover1 714:a6130aaa0fd9 62 errors like adding an exclusive AD field twice in the Advertising
rgrover1 714:a6130aaa0fd9 63 or Scan Response payload.
rgrover1 714:a6130aaa0fd9 64
rgrover1 714:a6130aaa0fd9 65 \par EXAMPLE
rgrover1 714:a6130aaa0fd9 66
rgrover1 714:a6130aaa0fd9 67 \code
rgrover1 714:a6130aaa0fd9 68
rgrover1 714:a6130aaa0fd9 69 // ToDo
rgrover1 714:a6130aaa0fd9 70
rgrover1 714:a6130aaa0fd9 71 \endcode
rgrover1 714:a6130aaa0fd9 72 */
rgrover1 714:a6130aaa0fd9 73 /**************************************************************************/
rgrover1 714:a6130aaa0fd9 74 class GapAdvertisingData
rgrover1 714:a6130aaa0fd9 75 {
rgrover1 714:a6130aaa0fd9 76 public:
rgrover1 714:a6130aaa0fd9 77 /**********************************************************************/
rgrover1 714:a6130aaa0fd9 78 /*!
rgrover1 714:a6130aaa0fd9 79 \brief
rgrover1 714:a6130aaa0fd9 80 A list of Advertising Data types commonly used by peripherals.
rgrover1 714:a6130aaa0fd9 81 These AD types are used to describe the capabilities of the
rgrover1 714:a6130aaa0fd9 82 peripheral, and get inserted inside the advertising or scan
rgrover1 714:a6130aaa0fd9 83 response payloads.
rgrover1 714:a6130aaa0fd9 84
rgrover1 714:a6130aaa0fd9 85 \par Source
rgrover1 714:a6130aaa0fd9 86 \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
rgrover1 714:a6130aaa0fd9 87 \li \c https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
rgrover1 714:a6130aaa0fd9 88 */
rgrover1 714:a6130aaa0fd9 89 /**********************************************************************/
rgrover1 714:a6130aaa0fd9 90 enum DataType {
rgrover1 714:a6130aaa0fd9 91 FLAGS = 0x01, /**< \ref *Flags */
rgrover1 714:a6130aaa0fd9 92 INCOMPLETE_LIST_16BIT_SERVICE_IDS = 0x02, /**< Incomplete list of 16-bit Service IDs */
rgrover1 714:a6130aaa0fd9 93 COMPLETE_LIST_16BIT_SERVICE_IDS = 0x03, /**< Complete list of 16-bit Service IDs */
rgrover1 714:a6130aaa0fd9 94 INCOMPLETE_LIST_32BIT_SERVICE_IDS = 0x04, /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
rgrover1 714:a6130aaa0fd9 95 COMPLETE_LIST_32BIT_SERVICE_IDS = 0x05, /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
rgrover1 714:a6130aaa0fd9 96 INCOMPLETE_LIST_128BIT_SERVICE_IDS = 0x06, /**< Incomplete list of 128-bit Service IDs */
rgrover1 714:a6130aaa0fd9 97 COMPLETE_LIST_128BIT_SERVICE_IDS = 0x07, /**< Complete list of 128-bit Service IDs */
rgrover1 714:a6130aaa0fd9 98 SHORTENED_LOCAL_NAME = 0x08, /**< Shortened Local Name */
rgrover1 714:a6130aaa0fd9 99 COMPLETE_LOCAL_NAME = 0x09, /**< Complete Local Name */
rgrover1 714:a6130aaa0fd9 100 TX_POWER_LEVEL = 0x0A, /**< TX Power Level (in dBm) */
rgrover1 714:a6130aaa0fd9 101 DEVICE_ID = 0x10, /**< Device ID */
rgrover1 714:a6130aaa0fd9 102 SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range */
rgrover1 714:a6130aaa0fd9 103 SERVICE_DATA = 0x16, /**< Service Data */
rgrover1 714:a6130aaa0fd9 104 APPEARANCE = 0x19, /**< \ref Appearance */
rgrover1 714:a6130aaa0fd9 105 ADVERTISING_INTERVAL = 0x1A, /**< Advertising Interval */
rgrover1 714:a6130aaa0fd9 106 MANUFACTURER_SPECIFIC_DATA = 0xFF /**< Manufacturer Specific Data */
rgrover1 714:a6130aaa0fd9 107 };
rgrover1 714:a6130aaa0fd9 108
rgrover1 714:a6130aaa0fd9 109 /**********************************************************************/
rgrover1 714:a6130aaa0fd9 110 /*!
rgrover1 714:a6130aaa0fd9 111 \brief
rgrover1 714:a6130aaa0fd9 112 A list of values for the FLAGS AD Type
rgrover1 714:a6130aaa0fd9 113
rgrover1 714:a6130aaa0fd9 114 \note
rgrover1 714:a6130aaa0fd9 115 You can use more than one value in the FLAGS AD Type (ex.
rgrover1 714:a6130aaa0fd9 116 LE_GENERAL_DISCOVERABLE and BREDR_NOT_SUPPORTED).
rgrover1 714:a6130aaa0fd9 117
rgrover1 714:a6130aaa0fd9 118 \par Source
rgrover1 714:a6130aaa0fd9 119 \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1
rgrover1 714:a6130aaa0fd9 120 */
rgrover1 714:a6130aaa0fd9 121 /**********************************************************************/
rgrover1 714:a6130aaa0fd9 122 enum Flags {
rgrover1 714:a6130aaa0fd9 123 LE_LIMITED_DISCOVERABLE = 0x01, /**< *Peripheral device is discoverable for a limited period of time */
rgrover1 714:a6130aaa0fd9 124 LE_GENERAL_DISCOVERABLE = 0x02, /**< Peripheral device is discoverable at any moment */
rgrover1 714:a6130aaa0fd9 125 BREDR_NOT_SUPPORTED = 0x04, /**< Peripheral device is LE only */
rgrover1 714:a6130aaa0fd9 126 SIMULTANEOUS_LE_BREDR_C = 0x08, /**< Not relevant - central mode only */
rgrover1 714:a6130aaa0fd9 127 SIMULTANEOUS_LE_BREDR_H = 0x10 /**< Not relevant - central mode only */
rgrover1 714:a6130aaa0fd9 128 };
rgrover1 714:a6130aaa0fd9 129
rgrover1 714:a6130aaa0fd9 130 /**********************************************************************/
rgrover1 714:a6130aaa0fd9 131 /*!
rgrover1 714:a6130aaa0fd9 132 \brief
rgrover1 714:a6130aaa0fd9 133 A list of values for the APPEARANCE AD Type, which describes the
rgrover1 714:a6130aaa0fd9 134 physical shape or appearance of the device
rgrover1 714:a6130aaa0fd9 135
rgrover1 714:a6130aaa0fd9 136 \par Source
rgrover1 714:a6130aaa0fd9 137 \li \c Bluetooth Core Specification Supplement, Part A, Section 1.12
rgrover1 714:a6130aaa0fd9 138 \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2
rgrover1 714:a6130aaa0fd9 139 \li \c https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
rgrover1 714:a6130aaa0fd9 140 */
rgrover1 714:a6130aaa0fd9 141 /**********************************************************************/
rgrover1 714:a6130aaa0fd9 142 enum Appearance {
rgrover1 714:a6130aaa0fd9 143 UNKNOWN = 0, /**< Unknown of unspecified appearance type */
rgrover1 714:a6130aaa0fd9 144 GENERIC_PHONE = 64, /**< Generic Phone */
rgrover1 714:a6130aaa0fd9 145 GENERIC_COMPUTER = 128, /**< Generic Computer */
rgrover1 714:a6130aaa0fd9 146 GENERIC_WATCH = 192, /**< Generic Watch */
rgrover1 714:a6130aaa0fd9 147 WATCH_SPORTS_WATCH = 193, /**< Sports Watch */
rgrover1 714:a6130aaa0fd9 148 GENERIC_CLOCK = 256, /**< Generic Clock */
rgrover1 714:a6130aaa0fd9 149 GENERIC_DISPLAY = 320, /**< Generic Display */
rgrover1 714:a6130aaa0fd9 150 GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control */
rgrover1 714:a6130aaa0fd9 151 GENERIC_EYE_GLASSES = 448, /**< Generic Eye Glasses */
rgrover1 714:a6130aaa0fd9 152 GENERIC_TAG = 512, /**< Generic Tag */
rgrover1 714:a6130aaa0fd9 153 GENERIC_KEYRING = 576, /**< Generic Keyring */
rgrover1 714:a6130aaa0fd9 154 GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player */
rgrover1 714:a6130aaa0fd9 155 GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner */
rgrover1 714:a6130aaa0fd9 156 GENERIC_THERMOMETER = 768, /**< Generic Thermometer */
rgrover1 714:a6130aaa0fd9 157 THERMOMETER_EAR = 769, /**< Ear Thermometer */
rgrover1 714:a6130aaa0fd9 158 GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart Rate Sensor */
rgrover1 714:a6130aaa0fd9 159 HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Belt Heart Rate Sensor */
rgrover1 714:a6130aaa0fd9 160 GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure */
rgrover1 714:a6130aaa0fd9 161 BLOOD_PRESSURE_ARM = 897, /**< Arm Blood Pressure */
rgrover1 714:a6130aaa0fd9 162 BLOOD_PRESSURE_WRIST = 898, /**< Wrist Blood Pressure */
rgrover1 714:a6130aaa0fd9 163 HUMAN_INTERFACE_DEVICE_HID = 960, /**< Human Interface Device (HID) */
rgrover1 714:a6130aaa0fd9 164 KEYBOARD = 961, /**< Keyboard */
rgrover1 714:a6130aaa0fd9 165 MOUSE = 962, /**< Mouse */
rgrover1 714:a6130aaa0fd9 166 JOYSTICK = 963, /**< Joystick */
rgrover1 714:a6130aaa0fd9 167 GAMEPAD = 964, /**< Gamepad */
rgrover1 714:a6130aaa0fd9 168 DIGITIZER_TABLET = 965, /**< Digitizer Tablet */
rgrover1 714:a6130aaa0fd9 169 CARD_READER = 966, /**< Card Read */
rgrover1 714:a6130aaa0fd9 170 DIGITAL_PEN = 967, /**< Digital Pen */
rgrover1 714:a6130aaa0fd9 171 BARCODE_SCANNER = 968, /**< Barcode Scanner */
rgrover1 714:a6130aaa0fd9 172 GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter */
rgrover1 714:a6130aaa0fd9 173 GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running/Walking Sensor */
rgrover1 714:a6130aaa0fd9 174 RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< In Shoe Running/Walking Sensor */
rgrover1 714:a6130aaa0fd9 175 RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< On Shoe Running/Walking Sensor */
rgrover1 714:a6130aaa0fd9 176 RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< On Hip Running/Walking Sensor */
rgrover1 714:a6130aaa0fd9 177 GENERIC_CYCLING = 1152, /**< Generic Cycling */
rgrover1 714:a6130aaa0fd9 178 CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling Computer */
rgrover1 714:a6130aaa0fd9 179 CYCLING_SPEED_SENSOR = 1154, /**< Cycling Speed Senspr */
rgrover1 714:a6130aaa0fd9 180 CYCLING_CADENCE_SENSOR = 1155, /**< Cycling Cadence Sensor */
rgrover1 714:a6130aaa0fd9 181 CYCLING_POWER_SENSOR = 1156, /**< Cycling Power Sensor */
rgrover1 714:a6130aaa0fd9 182 CYCLING_SPEED_AND_CADENCE_SENSOR = 1157, /**< Cycling Speed and Cadence Sensor */
rgrover1 714:a6130aaa0fd9 183 PULSE_OXIMETER_GENERIC = 3136, /**< Generic Pulse Oximeter */
rgrover1 714:a6130aaa0fd9 184 PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip Pulse Oximeter */
rgrover1 714:a6130aaa0fd9 185 PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn Pulse Oximeter */
rgrover1 714:a6130aaa0fd9 186 OUTDOOR_GENERIC = 5184, /**< Generic Outdoor */
rgrover1 714:a6130aaa0fd9 187 OUTDOOR_LOCATION_DISPLAY_DEVICE = 5185, /**< Outdoor Location Display Device */
rgrover1 714:a6130aaa0fd9 188 OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE = 5186, /**< Outdoor Location and Navigation Display Device */
rgrover1 714:a6130aaa0fd9 189 OUTDOOR_LOCATION_POD = 5187, /**< Outdoor Location Pod */
rgrover1 714:a6130aaa0fd9 190 OUTDOOR_LOCATION_AND_NAVIGATION_POD = 5188 /**< Outdoor Location and Navigation Pod */
rgrover1 714:a6130aaa0fd9 191 };
rgrover1 714:a6130aaa0fd9 192
rgrover1 714:a6130aaa0fd9 193 GapAdvertisingData(void) : _payload(), _payloadLen(0), _appearance(GENERIC_TAG) {
rgrover1 714:a6130aaa0fd9 194 /* empty */
rgrover1 714:a6130aaa0fd9 195 }
rgrover1 714:a6130aaa0fd9 196
rgrover1 714:a6130aaa0fd9 197 /**
rgrover1 714:a6130aaa0fd9 198 * Adds advertising data based on the specified AD type (see DataType)
rgrover1 714:a6130aaa0fd9 199 *
rgrover1 714:a6130aaa0fd9 200 * @param advDataType The Advertising 'DataType' to add
rgrover1 714:a6130aaa0fd9 201 * @param payload Pointer to the payload contents
rgrover1 714:a6130aaa0fd9 202 * @param len Size of the payload in bytes
rgrover1 714:a6130aaa0fd9 203 *
rgrover1 714:a6130aaa0fd9 204 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
rgrover1 714:a6130aaa0fd9 205 * advertising buffer to overflow, else BLE_ERROR_NONE.
rgrover1 714:a6130aaa0fd9 206 */
rgrover1 714:a6130aaa0fd9 207 ble_error_t addData(DataType advDataType, const uint8_t *payload, uint8_t len)
rgrover1 714:a6130aaa0fd9 208 {
rgrover1 714:a6130aaa0fd9 209 /* ToDo: Check if an AD type already exists and if the existing */
rgrover1 714:a6130aaa0fd9 210 /* value is exclusive or not (flags, etc.) */
rgrover1 714:a6130aaa0fd9 211
rgrover1 714:a6130aaa0fd9 212 /* Make sure we don't exceed the 31 byte payload limit */
rgrover1 714:a6130aaa0fd9 213 if (_payloadLen + len + 2 > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
rgrover1 714:a6130aaa0fd9 214 return BLE_ERROR_BUFFER_OVERFLOW;
rgrover1 714:a6130aaa0fd9 215 }
rgrover1 714:a6130aaa0fd9 216
rgrover1 714:a6130aaa0fd9 217 /* Field length */
rgrover1 714:a6130aaa0fd9 218 memset(&_payload[_payloadLen], len + 1, 1);
rgrover1 714:a6130aaa0fd9 219 _payloadLen++;
rgrover1 714:a6130aaa0fd9 220
rgrover1 714:a6130aaa0fd9 221 /* Field ID */
rgrover1 714:a6130aaa0fd9 222 memset(&_payload[_payloadLen], (uint8_t)advDataType, 1);
rgrover1 714:a6130aaa0fd9 223 _payloadLen++;
rgrover1 714:a6130aaa0fd9 224
rgrover1 714:a6130aaa0fd9 225 /* Payload */
rgrover1 714:a6130aaa0fd9 226 memcpy(&_payload[_payloadLen], payload, len);
rgrover1 714:a6130aaa0fd9 227 _payloadLen += len;
rgrover1 714:a6130aaa0fd9 228
rgrover1 714:a6130aaa0fd9 229 return BLE_ERROR_NONE;
rgrover1 714:a6130aaa0fd9 230 }
rgrover1 714:a6130aaa0fd9 231
rgrover1 714:a6130aaa0fd9 232 /**
rgrover1 714:a6130aaa0fd9 233 * Helper function to add APPEARANCE data to the advertising payload
rgrover1 714:a6130aaa0fd9 234 *
rgrover1 714:a6130aaa0fd9 235 * @param appearance
rgrover1 714:a6130aaa0fd9 236 * The APPEARANCE value to add
rgrover1 714:a6130aaa0fd9 237 *
rgrover1 714:a6130aaa0fd9 238 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
rgrover1 714:a6130aaa0fd9 239 * advertising buffer to overflow, else BLE_ERROR_NONE.
rgrover1 714:a6130aaa0fd9 240 */
rgrover1 714:a6130aaa0fd9 241 ble_error_t addAppearance(Appearance appearance = GENERIC_TAG) {
rgrover1 714:a6130aaa0fd9 242 _appearance = appearance;
rgrover1 714:a6130aaa0fd9 243 return addData(GapAdvertisingData::APPEARANCE, (uint8_t *)&appearance, 2);
rgrover1 714:a6130aaa0fd9 244 }
rgrover1 714:a6130aaa0fd9 245
rgrover1 714:a6130aaa0fd9 246 /**
rgrover1 714:a6130aaa0fd9 247 * Helper function to add FLAGS data to the advertising payload.
rgrover1 714:a6130aaa0fd9 248 * @param flags
rgrover1 714:a6130aaa0fd9 249 * LE_LIMITED_DISCOVERABLE
rgrover1 714:a6130aaa0fd9 250 * The peripheral is discoverable for a limited period of time.
rgrover1 714:a6130aaa0fd9 251 * LE_GENERAL_DISCOVERABLE
rgrover1 714:a6130aaa0fd9 252 * The peripheral is permanently discoverable.
rgrover1 714:a6130aaa0fd9 253 * BREDR_NOT_SUPPORTED
rgrover1 714:a6130aaa0fd9 254 * This peripheral is a Bluetooth Low Energy only device (no EDR support).
rgrover1 714:a6130aaa0fd9 255 *
rgrover1 714:a6130aaa0fd9 256 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
rgrover1 714:a6130aaa0fd9 257 * advertising buffer to overflow, else BLE_ERROR_NONE.
rgrover1 714:a6130aaa0fd9 258 */
rgrover1 714:a6130aaa0fd9 259 ble_error_t addFlags(uint8_t flags = LE_GENERAL_DISCOVERABLE) {
rgrover1 714:a6130aaa0fd9 260 return addData(GapAdvertisingData::FLAGS, &flags, 1);
rgrover1 714:a6130aaa0fd9 261 }
rgrover1 714:a6130aaa0fd9 262
rgrover1 714:a6130aaa0fd9 263 /**
rgrover1 714:a6130aaa0fd9 264 * Helper function to add TX_POWER_LEVEL data to the advertising payload
rgrover1 714:a6130aaa0fd9 265 *
rgrover1 714:a6130aaa0fd9 266 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
rgrover1 714:a6130aaa0fd9 267 * advertising buffer to overflow, else BLE_ERROR_NONE.
rgrover1 714:a6130aaa0fd9 268 */
rgrover1 714:a6130aaa0fd9 269 ble_error_t addTxPower(int8_t txPower) {
rgrover1 714:a6130aaa0fd9 270 /* ToDo: Basic error checking to make sure txPower is in range */
rgrover1 714:a6130aaa0fd9 271 return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t *)&txPower, 1);
rgrover1 714:a6130aaa0fd9 272 }
rgrover1 714:a6130aaa0fd9 273
rgrover1 714:a6130aaa0fd9 274 /**
rgrover1 714:a6130aaa0fd9 275 * Clears the payload and resets the payload length counter
rgrover1 714:a6130aaa0fd9 276 */
rgrover1 714:a6130aaa0fd9 277 void clear(void) {
rgrover1 714:a6130aaa0fd9 278 memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
rgrover1 714:a6130aaa0fd9 279 _payloadLen = 0;
rgrover1 714:a6130aaa0fd9 280 }
rgrover1 714:a6130aaa0fd9 281
rgrover1 714:a6130aaa0fd9 282 /**
rgrover1 714:a6130aaa0fd9 283 * Returns a pointer to the the current payload
rgrover1 714:a6130aaa0fd9 284 */
rgrover1 714:a6130aaa0fd9 285 const uint8_t *getPayload(void) const {
rgrover1 714:a6130aaa0fd9 286 return (_payloadLen > 0) ? _payload : NULL;
rgrover1 714:a6130aaa0fd9 287 }
rgrover1 714:a6130aaa0fd9 288
rgrover1 714:a6130aaa0fd9 289 /**
rgrover1 714:a6130aaa0fd9 290 * Returns the current payload length (0..31 bytes)
rgrover1 714:a6130aaa0fd9 291 */
rgrover1 714:a6130aaa0fd9 292 uint8_t getPayloadLen(void) const {
rgrover1 714:a6130aaa0fd9 293 return _payloadLen;
rgrover1 714:a6130aaa0fd9 294 }
rgrover1 714:a6130aaa0fd9 295
rgrover1 714:a6130aaa0fd9 296 /**
rgrover1 714:a6130aaa0fd9 297 * Returns the 16-bit appearance value for this device
rgrover1 714:a6130aaa0fd9 298 */
rgrover1 714:a6130aaa0fd9 299 uint16_t getAppearance(void) const {
rgrover1 714:a6130aaa0fd9 300 return (uint16_t)_appearance;
rgrover1 714:a6130aaa0fd9 301 }
rgrover1 714:a6130aaa0fd9 302
rgrover1 714:a6130aaa0fd9 303 private:
rgrover1 714:a6130aaa0fd9 304 uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
rgrover1 714:a6130aaa0fd9 305 uint8_t _payloadLen;
rgrover1 714:a6130aaa0fd9 306 uint16_t _appearance;
rgrover1 714:a6130aaa0fd9 307 };
rgrover1 714:a6130aaa0fd9 308
rgrover1 714:a6130aaa0fd9 309 #endif // ifndef __GAP_ADVERTISING_DATA_H__