Joshua Slater / BLE_API_Changed

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Thu Jul 02 09:06:11 2015 +0100
Revision:
715:6d415ac147aa
Parent:
714:a6130aaa0fd9
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

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__