mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /* mbed Microcontroller Library
be_bryan 0:b74591d5ab33 2 * Copyright (c) 2006-2013 ARM Limited
be_bryan 0:b74591d5ab33 3 *
be_bryan 0:b74591d5ab33 4 * Licensed under the Apache License, Version 2.0 (the "License");
be_bryan 0:b74591d5ab33 5 * you may not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 6 * You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 7 *
be_bryan 0:b74591d5ab33 8 * http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 9 *
be_bryan 0:b74591d5ab33 10 * Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 11 * distributed under the License is distributed on an "AS IS" BASIS,
be_bryan 0:b74591d5ab33 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 13 * See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 14 * limitations under the License.
be_bryan 0:b74591d5ab33 15 */
be_bryan 0:b74591d5ab33 16
be_bryan 0:b74591d5ab33 17 #ifndef MBED_GAP_ADVERTISING_DATA_H__
be_bryan 0:b74591d5ab33 18 #define MBED_GAP_ADVERTISING_DATA_H__
be_bryan 0:b74591d5ab33 19
be_bryan 0:b74591d5ab33 20 #include <stdint.h>
be_bryan 0:b74591d5ab33 21 #include <string.h>
be_bryan 0:b74591d5ab33 22
be_bryan 0:b74591d5ab33 23 #include "blecommon.h"
be_bryan 0:b74591d5ab33 24
be_bryan 0:b74591d5ab33 25 /**
be_bryan 0:b74591d5ab33 26 * @addtogroup ble
be_bryan 0:b74591d5ab33 27 * @{
be_bryan 0:b74591d5ab33 28 * @addtogroup gap
be_bryan 0:b74591d5ab33 29 * @{
be_bryan 0:b74591d5ab33 30 */
be_bryan 0:b74591d5ab33 31
be_bryan 0:b74591d5ab33 32 #define GAP_ADVERTISING_DATA_MAX_PAYLOAD (31)
be_bryan 0:b74591d5ab33 33
be_bryan 0:b74591d5ab33 34 /**
be_bryan 0:b74591d5ab33 35 * GAP advertising data builder.
be_bryan 0:b74591d5ab33 36 *
be_bryan 0:b74591d5ab33 37 * Advertising data are used by broadcaster or peripheral to advertise state
be_bryan 0:b74591d5ab33 38 * about the device. This class offers the function to add and update states present
be_bryan 0:b74591d5ab33 39 * in an advertisement payload.
be_bryan 0:b74591d5ab33 40 *
be_bryan 0:b74591d5ab33 41 * After construction, the advertising payload contained in the instance of
be_bryan 0:b74591d5ab33 42 * GapAdvertisingData is empty. Adding new states and named fields can be
be_bryan 0:b74591d5ab33 43 * achieved by invoking the function addData(), and updating existing state
be_bryan 0:b74591d5ab33 44 * involves calling the function updateData().
be_bryan 0:b74591d5ab33 45 *
be_bryan 0:b74591d5ab33 46 * Fields present in the payload can be retrieved by a call to the function
be_bryan 0:b74591d5ab33 47 * findField.
be_bryan 0:b74591d5ab33 48 *
be_bryan 0:b74591d5ab33 49 * This class includes shorthand for the most common fields:
be_bryan 0:b74591d5ab33 50 * - FLAGS: addFlags().
be_bryan 0:b74591d5ab33 51 * - APPEARANCE: addAppearance().
be_bryan 0:b74591d5ab33 52 * - TX_POWER_LEVEL: addTxPower().
be_bryan 0:b74591d5ab33 53 *
be_bryan 0:b74591d5ab33 54 * @code
be_bryan 0:b74591d5ab33 55 *
be_bryan 0:b74591d5ab33 56 * Gap &gap;
be_bryan 0:b74591d5ab33 57 *
be_bryan 0:b74591d5ab33 58 * static const uint8_t device_name[] = "HRM";
be_bryan 0:b74591d5ab33 59 *
be_bryan 0:b74591d5ab33 60 * // construct an empty advertising payload
be_bryan 0:b74591d5ab33 61 * GapAdvertisingData advertising_data;
be_bryan 0:b74591d5ab33 62 *
be_bryan 0:b74591d5ab33 63 * // set the flags of the advertising device
be_bryan 0:b74591d5ab33 64 * advertising_data.addFlags(
be_bryan 0:b74591d5ab33 65 * GapAdvertisingData::LE_GENERAL_DISCOVERABLE |
be_bryan 0:b74591d5ab33 66 * GapAdvertisingData::BREDR_NOT_SUPPORTED
be_bryan 0:b74591d5ab33 67 * );
be_bryan 0:b74591d5ab33 68 *
be_bryan 0:b74591d5ab33 69 * // set the advertised name of the device
be_bryan 0:b74591d5ab33 70 * advertising_data.addData(
be_bryan 0:b74591d5ab33 71 * GapAdvertisingData::COMPLETE_LOCAL_NAME,
be_bryan 0:b74591d5ab33 72 * device_name,
be_bryan 0:b74591d5ab33 73 * sizeof(device_name)
be_bryan 0:b74591d5ab33 74 * );
be_bryan 0:b74591d5ab33 75 *
be_bryan 0:b74591d5ab33 76 * // update the advertising data of the gap payload
be_bryan 0:b74591d5ab33 77 * gap.setAdvertisingPayload(advertising_data);
be_bryan 0:b74591d5ab33 78 *
be_bryan 0:b74591d5ab33 79 * @endcode
be_bryan 0:b74591d5ab33 80 *
be_bryan 0:b74591d5ab33 81 * @note See Bluetooth Specification 4.0 (Vol. 3), Part C, Sections 11 and 18
be_bryan 0:b74591d5ab33 82 * for further information on advertising and scan response data.
be_bryan 0:b74591d5ab33 83 *
be_bryan 0:b74591d5ab33 84 * @par Advertising and Scan Response Payloads
be_bryan 0:b74591d5ab33 85 * Advertising data and scan response data are organized around a set of
be_bryan 0:b74591d5ab33 86 * data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
be_bryan 0:b74591d5ab33 87 * Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
be_bryan 0:b74591d5ab33 88 *
be_bryan 0:b74591d5ab33 89 * @par
be_bryan 0:b74591d5ab33 90 * Each AD type has its own standardized assigned number, as
be_bryan 0:b74591d5ab33 91 * the Bluetooth SIG defines:
be_bryan 0:b74591d5ab33 92 * https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile.
be_bryan 0:b74591d5ab33 93 *
be_bryan 0:b74591d5ab33 94 * @par
be_bryan 0:b74591d5ab33 95 * For convenience, all appropriate AD types are encapsulated in
be_bryan 0:b74591d5ab33 96 * GapAdvertisingData::DataType.
be_bryan 0:b74591d5ab33 97 *
be_bryan 0:b74591d5ab33 98 * @par
be_bryan 0:b74591d5ab33 99 * Before the AD Types and their payload (if any) can be inserted into
be_bryan 0:b74591d5ab33 100 * the advertising or scan response frames, they need to be formatted as
be_bryan 0:b74591d5ab33 101 * follows:
be_bryan 0:b74591d5ab33 102 *
be_bryan 0:b74591d5ab33 103 * @li @c Record length (1 byte).
be_bryan 0:b74591d5ab33 104 * @li @c AD Type (1 byte).
be_bryan 0:b74591d5ab33 105 * @li @c AD payload (optional; only present if record length > 1).
be_bryan 0:b74591d5ab33 106 *
be_bryan 0:b74591d5ab33 107 * @par
be_bryan 0:b74591d5ab33 108 * This class takes care of properly formatting the payload, performs
be_bryan 0:b74591d5ab33 109 * some basic checks on the payload length and tries to avoid common
be_bryan 0:b74591d5ab33 110 * errors such as adding an exclusive AD field twice in the advertising
be_bryan 0:b74591d5ab33 111 * or scan response payload.
be_bryan 0:b74591d5ab33 112 */
be_bryan 0:b74591d5ab33 113 class GapAdvertisingData
be_bryan 0:b74591d5ab33 114 {
be_bryan 0:b74591d5ab33 115 public:
be_bryan 0:b74591d5ab33 116 /*!
be_bryan 0:b74591d5ab33 117 * List of standard Advertising Data types.
be_bryan 0:b74591d5ab33 118 *
be_bryan 0:b74591d5ab33 119 * These AD types are used to describe the capabilities of the peripheral
be_bryan 0:b74591d5ab33 120 * and are inserted inside the advertising or scan response payloads.
be_bryan 0:b74591d5ab33 121 *
be_bryan 0:b74591d5ab33 122 * @par Source
be_bryan 0:b74591d5ab33 123 *
be_bryan 0:b74591d5ab33 124 * @li @c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18.
be_bryan 0:b74591d5ab33 125 * @li @c https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile.
be_bryan 0:b74591d5ab33 126 */
be_bryan 0:b74591d5ab33 127 enum DataType_t {
be_bryan 0:b74591d5ab33 128 /**
be_bryan 0:b74591d5ab33 129 * Flags, refer to GapAdvertisingData::Flags_t.
be_bryan 0:b74591d5ab33 130 */
be_bryan 0:b74591d5ab33 131 FLAGS = 0x01,
be_bryan 0:b74591d5ab33 132
be_bryan 0:b74591d5ab33 133 /**
be_bryan 0:b74591d5ab33 134 * Incomplete list of 16-bit Service IDs.
be_bryan 0:b74591d5ab33 135 */
be_bryan 0:b74591d5ab33 136 INCOMPLETE_LIST_16BIT_SERVICE_IDS = 0x02,
be_bryan 0:b74591d5ab33 137
be_bryan 0:b74591d5ab33 138 /**
be_bryan 0:b74591d5ab33 139 * Complete list of 16-bit Service IDs.
be_bryan 0:b74591d5ab33 140 */
be_bryan 0:b74591d5ab33 141 COMPLETE_LIST_16BIT_SERVICE_IDS = 0x03,
be_bryan 0:b74591d5ab33 142
be_bryan 0:b74591d5ab33 143 /**
be_bryan 0:b74591d5ab33 144 * Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0).
be_bryan 0:b74591d5ab33 145 */
be_bryan 0:b74591d5ab33 146 INCOMPLETE_LIST_32BIT_SERVICE_IDS = 0x04,
be_bryan 0:b74591d5ab33 147
be_bryan 0:b74591d5ab33 148 /**
be_bryan 0:b74591d5ab33 149 * Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0).
be_bryan 0:b74591d5ab33 150 */
be_bryan 0:b74591d5ab33 151 COMPLETE_LIST_32BIT_SERVICE_IDS = 0x05,
be_bryan 0:b74591d5ab33 152
be_bryan 0:b74591d5ab33 153 /**
be_bryan 0:b74591d5ab33 154 * Incomplete list of 128-bit Service IDs.
be_bryan 0:b74591d5ab33 155 */
be_bryan 0:b74591d5ab33 156 INCOMPLETE_LIST_128BIT_SERVICE_IDS = 0x06,
be_bryan 0:b74591d5ab33 157
be_bryan 0:b74591d5ab33 158 /**
be_bryan 0:b74591d5ab33 159 * Complete list of 128-bit Service IDs.
be_bryan 0:b74591d5ab33 160 */
be_bryan 0:b74591d5ab33 161 COMPLETE_LIST_128BIT_SERVICE_IDS = 0x07,
be_bryan 0:b74591d5ab33 162
be_bryan 0:b74591d5ab33 163 /**
be_bryan 0:b74591d5ab33 164 * Shortened Local Name.
be_bryan 0:b74591d5ab33 165 */
be_bryan 0:b74591d5ab33 166 SHORTENED_LOCAL_NAME = 0x08,
be_bryan 0:b74591d5ab33 167
be_bryan 0:b74591d5ab33 168 /**
be_bryan 0:b74591d5ab33 169 * Complete Local Name.
be_bryan 0:b74591d5ab33 170 */
be_bryan 0:b74591d5ab33 171 COMPLETE_LOCAL_NAME = 0x09,
be_bryan 0:b74591d5ab33 172
be_bryan 0:b74591d5ab33 173 /**
be_bryan 0:b74591d5ab33 174 * TX Power Level (in dBm).
be_bryan 0:b74591d5ab33 175 */
be_bryan 0:b74591d5ab33 176 TX_POWER_LEVEL = 0x0A,
be_bryan 0:b74591d5ab33 177
be_bryan 0:b74591d5ab33 178 /**
be_bryan 0:b74591d5ab33 179 * Device ID.
be_bryan 0:b74591d5ab33 180 */
be_bryan 0:b74591d5ab33 181 DEVICE_ID = 0x10,
be_bryan 0:b74591d5ab33 182
be_bryan 0:b74591d5ab33 183 /**
be_bryan 0:b74591d5ab33 184 * Slave Connection Interval Range.
be_bryan 0:b74591d5ab33 185 */
be_bryan 0:b74591d5ab33 186 SLAVE_CONNECTION_INTERVAL_RANGE = 0x12,
be_bryan 0:b74591d5ab33 187
be_bryan 0:b74591d5ab33 188 /**
be_bryan 0:b74591d5ab33 189 * List of 128-bit service UUIDs the device is looking for.
be_bryan 0:b74591d5ab33 190 */
be_bryan 0:b74591d5ab33 191 LIST_128BIT_SOLICITATION_IDS = 0x15,
be_bryan 0:b74591d5ab33 192
be_bryan 0:b74591d5ab33 193 /**
be_bryan 0:b74591d5ab33 194 * Service Data.
be_bryan 0:b74591d5ab33 195 */
be_bryan 0:b74591d5ab33 196 SERVICE_DATA = 0x16,
be_bryan 0:b74591d5ab33 197
be_bryan 0:b74591d5ab33 198 /**
be_bryan 0:b74591d5ab33 199 * Appearance, refer to GapAdvertisingData::Appearance_t.
be_bryan 0:b74591d5ab33 200 */
be_bryan 0:b74591d5ab33 201 APPEARANCE = 0x19,
be_bryan 0:b74591d5ab33 202
be_bryan 0:b74591d5ab33 203 /**
be_bryan 0:b74591d5ab33 204 * Advertising Interval.
be_bryan 0:b74591d5ab33 205 */
be_bryan 0:b74591d5ab33 206 ADVERTISING_INTERVAL = 0x1A,
be_bryan 0:b74591d5ab33 207
be_bryan 0:b74591d5ab33 208 /**
be_bryan 0:b74591d5ab33 209 * Manufacturer Specific Data.
be_bryan 0:b74591d5ab33 210 */
be_bryan 0:b74591d5ab33 211 MANUFACTURER_SPECIFIC_DATA = 0xFF
be_bryan 0:b74591d5ab33 212
be_bryan 0:b74591d5ab33 213 };
be_bryan 0:b74591d5ab33 214
be_bryan 0:b74591d5ab33 215 /**
be_bryan 0:b74591d5ab33 216 * Alias for GapAdvertisingData::DataType_t.
be_bryan 0:b74591d5ab33 217 *
be_bryan 0:b74591d5ab33 218 * @deprecated Future releases will drop this type alias.
be_bryan 0:b74591d5ab33 219 */
be_bryan 0:b74591d5ab33 220 typedef enum DataType_t DataType;
be_bryan 0:b74591d5ab33 221
be_bryan 0:b74591d5ab33 222 /**
be_bryan 0:b74591d5ab33 223 * Enumeration of allowed flags for DataType_t::FLAGS.
be_bryan 0:b74591d5ab33 224 *
be_bryan 0:b74591d5ab33 225 * @note DataType_t::FLAGS may contain several flags that the bitwise
be_bryan 0:b74591d5ab33 226 * and operator (ex.LE_GENERAL_DISCOVERABLE & BREDR_NOT_SUPPORTED) assembled.
be_bryan 0:b74591d5ab33 227 *
be_bryan 0:b74591d5ab33 228 * @par Source
be_bryan 0:b74591d5ab33 229 *
be_bryan 0:b74591d5ab33 230 * @li @c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1.
be_bryan 0:b74591d5ab33 231 */
be_bryan 0:b74591d5ab33 232 enum Flags_t {
be_bryan 0:b74591d5ab33 233 /**
be_bryan 0:b74591d5ab33 234 * Peripheral device is discoverable for a limited period of time.
be_bryan 0:b74591d5ab33 235 */
be_bryan 0:b74591d5ab33 236 LE_LIMITED_DISCOVERABLE = 0x01,
be_bryan 0:b74591d5ab33 237
be_bryan 0:b74591d5ab33 238 /**
be_bryan 0:b74591d5ab33 239 * Peripheral device is discoverable at any moment.
be_bryan 0:b74591d5ab33 240 */
be_bryan 0:b74591d5ab33 241 LE_GENERAL_DISCOVERABLE = 0x02,
be_bryan 0:b74591d5ab33 242
be_bryan 0:b74591d5ab33 243 /**
be_bryan 0:b74591d5ab33 244 * Peripheral device is LE only and does not support Bluetooth Enhanced
be_bryan 0:b74591d5ab33 245 * DataRate.
be_bryan 0:b74591d5ab33 246 */
be_bryan 0:b74591d5ab33 247 BREDR_NOT_SUPPORTED = 0x04,
be_bryan 0:b74591d5ab33 248
be_bryan 0:b74591d5ab33 249 /**
be_bryan 0:b74591d5ab33 250 * Not relevant - dual mode only.
be_bryan 0:b74591d5ab33 251 */
be_bryan 0:b74591d5ab33 252 SIMULTANEOUS_LE_BREDR_C = 0x08,
be_bryan 0:b74591d5ab33 253
be_bryan 0:b74591d5ab33 254 /**
be_bryan 0:b74591d5ab33 255 * Not relevant - dual mode only.
be_bryan 0:b74591d5ab33 256 */
be_bryan 0:b74591d5ab33 257 SIMULTANEOUS_LE_BREDR_H = 0x10
be_bryan 0:b74591d5ab33 258
be_bryan 0:b74591d5ab33 259 };
be_bryan 0:b74591d5ab33 260
be_bryan 0:b74591d5ab33 261 /**
be_bryan 0:b74591d5ab33 262 * Alias for GapAdvertisingData::Flags_t.
be_bryan 0:b74591d5ab33 263 *
be_bryan 0:b74591d5ab33 264 * @deprecated Future releases will drop this type alias.
be_bryan 0:b74591d5ab33 265 */
be_bryan 0:b74591d5ab33 266 typedef enum Flags_t Flags;
be_bryan 0:b74591d5ab33 267
be_bryan 0:b74591d5ab33 268 /**
be_bryan 0:b74591d5ab33 269 * Enumeration of values for the DataType_t::APPEARANCE.
be_bryan 0:b74591d5ab33 270 *
be_bryan 0:b74591d5ab33 271 * These values describe the physical shape or appearance of the device.
be_bryan 0:b74591d5ab33 272 *
be_bryan 0:b74591d5ab33 273 * @par Source
be_bryan 0:b74591d5ab33 274 *
be_bryan 0:b74591d5ab33 275 * @li @c Bluetooth Core Specification Supplement, Part A, Section 1.12.
be_bryan 0:b74591d5ab33 276 * @li @c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2.
be_bryan 0:b74591d5ab33 277 * @li @c https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml.
be_bryan 0:b74591d5ab33 278 */
be_bryan 0:b74591d5ab33 279 enum Appearance_t {
be_bryan 0:b74591d5ab33 280 /**
be_bryan 0:b74591d5ab33 281 * Unknown or unspecified appearance type.
be_bryan 0:b74591d5ab33 282 */
be_bryan 0:b74591d5ab33 283 UNKNOWN = 0,
be_bryan 0:b74591d5ab33 284
be_bryan 0:b74591d5ab33 285 /**
be_bryan 0:b74591d5ab33 286 * Generic Phone.
be_bryan 0:b74591d5ab33 287 */
be_bryan 0:b74591d5ab33 288 GENERIC_PHONE = 64,
be_bryan 0:b74591d5ab33 289
be_bryan 0:b74591d5ab33 290 /**
be_bryan 0:b74591d5ab33 291 * Generic Computer.
be_bryan 0:b74591d5ab33 292 */
be_bryan 0:b74591d5ab33 293 GENERIC_COMPUTER = 128,
be_bryan 0:b74591d5ab33 294
be_bryan 0:b74591d5ab33 295 /**
be_bryan 0:b74591d5ab33 296 * Generic Watch.
be_bryan 0:b74591d5ab33 297 */
be_bryan 0:b74591d5ab33 298 GENERIC_WATCH = 192,
be_bryan 0:b74591d5ab33 299
be_bryan 0:b74591d5ab33 300 /**
be_bryan 0:b74591d5ab33 301 * Sports Watch.
be_bryan 0:b74591d5ab33 302 */
be_bryan 0:b74591d5ab33 303 WATCH_SPORTS_WATCH = 193,
be_bryan 0:b74591d5ab33 304
be_bryan 0:b74591d5ab33 305 /**
be_bryan 0:b74591d5ab33 306 * Generic Clock.
be_bryan 0:b74591d5ab33 307 */
be_bryan 0:b74591d5ab33 308 GENERIC_CLOCK = 256,
be_bryan 0:b74591d5ab33 309
be_bryan 0:b74591d5ab33 310 /**
be_bryan 0:b74591d5ab33 311 * Generic Display.
be_bryan 0:b74591d5ab33 312 */
be_bryan 0:b74591d5ab33 313 GENERIC_DISPLAY = 320,
be_bryan 0:b74591d5ab33 314
be_bryan 0:b74591d5ab33 315 /**
be_bryan 0:b74591d5ab33 316 * Generic Remote Control.
be_bryan 0:b74591d5ab33 317 */
be_bryan 0:b74591d5ab33 318 GENERIC_REMOTE_CONTROL = 384,
be_bryan 0:b74591d5ab33 319
be_bryan 0:b74591d5ab33 320 /**
be_bryan 0:b74591d5ab33 321 * Generic Eye Glasses.
be_bryan 0:b74591d5ab33 322 */
be_bryan 0:b74591d5ab33 323 GENERIC_EYE_GLASSES = 448,
be_bryan 0:b74591d5ab33 324
be_bryan 0:b74591d5ab33 325 /**
be_bryan 0:b74591d5ab33 326 * Generic Tag.
be_bryan 0:b74591d5ab33 327 */
be_bryan 0:b74591d5ab33 328 GENERIC_TAG = 512,
be_bryan 0:b74591d5ab33 329
be_bryan 0:b74591d5ab33 330 /**
be_bryan 0:b74591d5ab33 331 * Generic Keyring.
be_bryan 0:b74591d5ab33 332 */
be_bryan 0:b74591d5ab33 333 GENERIC_KEYRING = 576,
be_bryan 0:b74591d5ab33 334
be_bryan 0:b74591d5ab33 335 /**
be_bryan 0:b74591d5ab33 336 * Generic Media Player.
be_bryan 0:b74591d5ab33 337 */
be_bryan 0:b74591d5ab33 338 GENERIC_MEDIA_PLAYER = 640,
be_bryan 0:b74591d5ab33 339
be_bryan 0:b74591d5ab33 340 /**
be_bryan 0:b74591d5ab33 341 * Generic Bar Code Scanner.
be_bryan 0:b74591d5ab33 342 */
be_bryan 0:b74591d5ab33 343 GENERIC_BARCODE_SCANNER = 704,
be_bryan 0:b74591d5ab33 344
be_bryan 0:b74591d5ab33 345 /**
be_bryan 0:b74591d5ab33 346 * Generic Thermometer.
be_bryan 0:b74591d5ab33 347 */
be_bryan 0:b74591d5ab33 348 GENERIC_THERMOMETER = 768,
be_bryan 0:b74591d5ab33 349
be_bryan 0:b74591d5ab33 350 /**
be_bryan 0:b74591d5ab33 351 * Ear Thermometer.
be_bryan 0:b74591d5ab33 352 */
be_bryan 0:b74591d5ab33 353 THERMOMETER_EAR = 769,
be_bryan 0:b74591d5ab33 354
be_bryan 0:b74591d5ab33 355 /**
be_bryan 0:b74591d5ab33 356 * Generic Heart Rate Sensor.
be_bryan 0:b74591d5ab33 357 */
be_bryan 0:b74591d5ab33 358 GENERIC_HEART_RATE_SENSOR = 832,
be_bryan 0:b74591d5ab33 359
be_bryan 0:b74591d5ab33 360 /**
be_bryan 0:b74591d5ab33 361 * Belt Heart Rate Sensor.
be_bryan 0:b74591d5ab33 362 */
be_bryan 0:b74591d5ab33 363 HEART_RATE_SENSOR_HEART_RATE_BELT = 833,
be_bryan 0:b74591d5ab33 364
be_bryan 0:b74591d5ab33 365 /**
be_bryan 0:b74591d5ab33 366 * Generic Blood Pressure.
be_bryan 0:b74591d5ab33 367 */
be_bryan 0:b74591d5ab33 368 GENERIC_BLOOD_PRESSURE = 896,
be_bryan 0:b74591d5ab33 369
be_bryan 0:b74591d5ab33 370 /**
be_bryan 0:b74591d5ab33 371 * Arm Blood Pressure.
be_bryan 0:b74591d5ab33 372 */
be_bryan 0:b74591d5ab33 373 BLOOD_PRESSURE_ARM = 897,
be_bryan 0:b74591d5ab33 374
be_bryan 0:b74591d5ab33 375 /**
be_bryan 0:b74591d5ab33 376 * Wrist Blood Pressure.
be_bryan 0:b74591d5ab33 377 */
be_bryan 0:b74591d5ab33 378 BLOOD_PRESSURE_WRIST = 898,
be_bryan 0:b74591d5ab33 379
be_bryan 0:b74591d5ab33 380 /**
be_bryan 0:b74591d5ab33 381 * Human Interface Device (HID).
be_bryan 0:b74591d5ab33 382 */
be_bryan 0:b74591d5ab33 383 HUMAN_INTERFACE_DEVICE_HID = 960,
be_bryan 0:b74591d5ab33 384
be_bryan 0:b74591d5ab33 385 /**
be_bryan 0:b74591d5ab33 386 * Keyboard.
be_bryan 0:b74591d5ab33 387 */
be_bryan 0:b74591d5ab33 388 KEYBOARD = 961,
be_bryan 0:b74591d5ab33 389
be_bryan 0:b74591d5ab33 390 /**
be_bryan 0:b74591d5ab33 391 * Mouse.
be_bryan 0:b74591d5ab33 392 */
be_bryan 0:b74591d5ab33 393 MOUSE = 962,
be_bryan 0:b74591d5ab33 394
be_bryan 0:b74591d5ab33 395 /**
be_bryan 0:b74591d5ab33 396 * Joystick.
be_bryan 0:b74591d5ab33 397 */
be_bryan 0:b74591d5ab33 398 JOYSTICK = 963,
be_bryan 0:b74591d5ab33 399
be_bryan 0:b74591d5ab33 400 /**
be_bryan 0:b74591d5ab33 401 * Gamepad.
be_bryan 0:b74591d5ab33 402 */
be_bryan 0:b74591d5ab33 403 GAMEPAD = 964,
be_bryan 0:b74591d5ab33 404
be_bryan 0:b74591d5ab33 405 /**
be_bryan 0:b74591d5ab33 406 * Digitizer Tablet.
be_bryan 0:b74591d5ab33 407 */
be_bryan 0:b74591d5ab33 408 DIGITIZER_TABLET = 965,
be_bryan 0:b74591d5ab33 409
be_bryan 0:b74591d5ab33 410 /**
be_bryan 0:b74591d5ab33 411 * Card Reader.
be_bryan 0:b74591d5ab33 412 */
be_bryan 0:b74591d5ab33 413 CARD_READER = 966,
be_bryan 0:b74591d5ab33 414
be_bryan 0:b74591d5ab33 415 /**
be_bryan 0:b74591d5ab33 416 * Digital Pen.
be_bryan 0:b74591d5ab33 417 */
be_bryan 0:b74591d5ab33 418 DIGITAL_PEN = 967,
be_bryan 0:b74591d5ab33 419
be_bryan 0:b74591d5ab33 420 /**
be_bryan 0:b74591d5ab33 421 * Bar Code Scanner.
be_bryan 0:b74591d5ab33 422 */
be_bryan 0:b74591d5ab33 423 BARCODE_SCANNER = 968,
be_bryan 0:b74591d5ab33 424
be_bryan 0:b74591d5ab33 425 /**
be_bryan 0:b74591d5ab33 426 * Generic Glucose Meter.
be_bryan 0:b74591d5ab33 427 */
be_bryan 0:b74591d5ab33 428 GENERIC_GLUCOSE_METER = 1024,
be_bryan 0:b74591d5ab33 429
be_bryan 0:b74591d5ab33 430 /**
be_bryan 0:b74591d5ab33 431 * Generic Running/Walking Sensor.
be_bryan 0:b74591d5ab33 432 */
be_bryan 0:b74591d5ab33 433 GENERIC_RUNNING_WALKING_SENSOR = 1088,
be_bryan 0:b74591d5ab33 434
be_bryan 0:b74591d5ab33 435 /**
be_bryan 0:b74591d5ab33 436 * In Shoe Running/Walking Sensor.
be_bryan 0:b74591d5ab33 437 */
be_bryan 0:b74591d5ab33 438 RUNNING_WALKING_SENSOR_IN_SHOE = 1089,
be_bryan 0:b74591d5ab33 439
be_bryan 0:b74591d5ab33 440 /**
be_bryan 0:b74591d5ab33 441 * On Shoe Running/Walking Sensor.
be_bryan 0:b74591d5ab33 442 */
be_bryan 0:b74591d5ab33 443 RUNNING_WALKING_SENSOR_ON_SHOE = 1090,
be_bryan 0:b74591d5ab33 444
be_bryan 0:b74591d5ab33 445 /**
be_bryan 0:b74591d5ab33 446 * On Hip Running/Walking Sensor.
be_bryan 0:b74591d5ab33 447 */
be_bryan 0:b74591d5ab33 448 RUNNING_WALKING_SENSOR_ON_HIP = 1091,
be_bryan 0:b74591d5ab33 449
be_bryan 0:b74591d5ab33 450 /**
be_bryan 0:b74591d5ab33 451 * Generic Cycling.
be_bryan 0:b74591d5ab33 452 */
be_bryan 0:b74591d5ab33 453 GENERIC_CYCLING = 1152,
be_bryan 0:b74591d5ab33 454
be_bryan 0:b74591d5ab33 455 /**
be_bryan 0:b74591d5ab33 456 * Cycling Computer.
be_bryan 0:b74591d5ab33 457 */
be_bryan 0:b74591d5ab33 458 CYCLING_CYCLING_COMPUTER = 1153,
be_bryan 0:b74591d5ab33 459
be_bryan 0:b74591d5ab33 460 /**
be_bryan 0:b74591d5ab33 461 * Cycling Speed Sensor.
be_bryan 0:b74591d5ab33 462 */
be_bryan 0:b74591d5ab33 463 CYCLING_SPEED_SENSOR = 1154,
be_bryan 0:b74591d5ab33 464
be_bryan 0:b74591d5ab33 465 /**
be_bryan 0:b74591d5ab33 466 * Cycling Cadence Sensor.
be_bryan 0:b74591d5ab33 467 */
be_bryan 0:b74591d5ab33 468 CYCLING_CADENCE_SENSOR = 1155,
be_bryan 0:b74591d5ab33 469
be_bryan 0:b74591d5ab33 470 /**
be_bryan 0:b74591d5ab33 471 * Cycling Power Sensor.
be_bryan 0:b74591d5ab33 472 */
be_bryan 0:b74591d5ab33 473 CYCLING_POWER_SENSOR = 1156,
be_bryan 0:b74591d5ab33 474
be_bryan 0:b74591d5ab33 475 /**
be_bryan 0:b74591d5ab33 476 * Cycling Speed and Cadence Sensor.
be_bryan 0:b74591d5ab33 477 */
be_bryan 0:b74591d5ab33 478 CYCLING_SPEED_AND_CADENCE_SENSOR = 1157,
be_bryan 0:b74591d5ab33 479
be_bryan 0:b74591d5ab33 480 /**
be_bryan 0:b74591d5ab33 481 * Generic Pulse Oximeter.
be_bryan 0:b74591d5ab33 482 */
be_bryan 0:b74591d5ab33 483 PULSE_OXIMETER_GENERIC = 3136,
be_bryan 0:b74591d5ab33 484
be_bryan 0:b74591d5ab33 485 /**
be_bryan 0:b74591d5ab33 486 * Fingertip Pulse Oximeter.
be_bryan 0:b74591d5ab33 487 */
be_bryan 0:b74591d5ab33 488 PULSE_OXIMETER_FINGERTIP = 3137,
be_bryan 0:b74591d5ab33 489
be_bryan 0:b74591d5ab33 490 /**
be_bryan 0:b74591d5ab33 491 * Wrist Worn Pulse Oximeter.
be_bryan 0:b74591d5ab33 492 */
be_bryan 0:b74591d5ab33 493 PULSE_OXIMETER_WRIST_WORN = 3138,
be_bryan 0:b74591d5ab33 494
be_bryan 0:b74591d5ab33 495 /**
be_bryan 0:b74591d5ab33 496 * Generic Weight Scale.
be_bryan 0:b74591d5ab33 497 */
be_bryan 0:b74591d5ab33 498 GENERIC_WEIGHT_SCALE = 3200,
be_bryan 0:b74591d5ab33 499
be_bryan 0:b74591d5ab33 500 /**
be_bryan 0:b74591d5ab33 501 * Generic Outdoor.
be_bryan 0:b74591d5ab33 502 */
be_bryan 0:b74591d5ab33 503 OUTDOOR_GENERIC = 5184,
be_bryan 0:b74591d5ab33 504
be_bryan 0:b74591d5ab33 505 /**
be_bryan 0:b74591d5ab33 506 * Outdoor Location Display Device.
be_bryan 0:b74591d5ab33 507 */
be_bryan 0:b74591d5ab33 508 OUTDOOR_LOCATION_DISPLAY_DEVICE = 5185,
be_bryan 0:b74591d5ab33 509
be_bryan 0:b74591d5ab33 510 /**
be_bryan 0:b74591d5ab33 511 * Outdoor Location and Navigation Display Device.
be_bryan 0:b74591d5ab33 512 */
be_bryan 0:b74591d5ab33 513 OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE = 5186,
be_bryan 0:b74591d5ab33 514
be_bryan 0:b74591d5ab33 515 /**
be_bryan 0:b74591d5ab33 516 * Outdoor Location Pod.
be_bryan 0:b74591d5ab33 517 */
be_bryan 0:b74591d5ab33 518 OUTDOOR_LOCATION_POD = 5187,
be_bryan 0:b74591d5ab33 519
be_bryan 0:b74591d5ab33 520 /**
be_bryan 0:b74591d5ab33 521 * Outdoor Location and Navigation Pod.
be_bryan 0:b74591d5ab33 522 */
be_bryan 0:b74591d5ab33 523 OUTDOOR_LOCATION_AND_NAVIGATION_POD = 5188
be_bryan 0:b74591d5ab33 524
be_bryan 0:b74591d5ab33 525 };
be_bryan 0:b74591d5ab33 526
be_bryan 0:b74591d5ab33 527 /**
be_bryan 0:b74591d5ab33 528 * Alias for GapAdvertisingData::Appearance_t.
be_bryan 0:b74591d5ab33 529 *
be_bryan 0:b74591d5ab33 530 * @deprecated Future releases will drop this type alias.
be_bryan 0:b74591d5ab33 531 */
be_bryan 0:b74591d5ab33 532 typedef enum Appearance_t Appearance;
be_bryan 0:b74591d5ab33 533
be_bryan 0:b74591d5ab33 534 /**
be_bryan 0:b74591d5ab33 535 * Construct a GapAdvertising instance with an empty payload.
be_bryan 0:b74591d5ab33 536 */
be_bryan 0:b74591d5ab33 537 GapAdvertisingData(void) :
be_bryan 0:b74591d5ab33 538 _payload(),
be_bryan 0:b74591d5ab33 539 _payloadLen(0),
be_bryan 0:b74591d5ab33 540 _appearance(GENERIC_TAG) {
be_bryan 0:b74591d5ab33 541 }
be_bryan 0:b74591d5ab33 542
be_bryan 0:b74591d5ab33 543 /**
be_bryan 0:b74591d5ab33 544 * Adds a new field into the payload.
be_bryan 0:b74591d5ab33 545 *
be_bryan 0:b74591d5ab33 546 * If the supplied advertising data type is already present in the
be_bryan 0:b74591d5ab33 547 * advertising payload, then the value is updated.
be_bryan 0:b74591d5ab33 548 *
be_bryan 0:b74591d5ab33 549 * @param[in] advDataType The type of the field to add.
be_bryan 0:b74591d5ab33 550 * @param[in] payload Pointer to the value of the field to add.
be_bryan 0:b74591d5ab33 551 * @param[in] len Size in bytes of the value to add.
be_bryan 0:b74591d5ab33 552 *
be_bryan 0:b74591d5ab33 553 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 554 * @return BLE_ERROR_BUFFER_OVERFLOW if the new value causes the advertising
be_bryan 0:b74591d5ab33 555 * buffer to overflow.
be_bryan 0:b74591d5ab33 556 *
be_bryan 0:b74591d5ab33 557 * @note When the specified data type is INCOMPLETE_LIST_16BIT_SERVICE_IDS,
be_bryan 0:b74591d5ab33 558 * COMPLETE_LIST_16BIT_SERVICE_IDS, INCOMPLETE_LIST_32BIT_SERVICE_IDS,
be_bryan 0:b74591d5ab33 559 * COMPLETE_LIST_32BIT_SERVICE_IDS, INCOMPLETE_LIST_128BIT_SERVICE_IDS,
be_bryan 0:b74591d5ab33 560 * COMPLETE_LIST_128BIT_SERVICE_IDS or LIST_128BIT_SOLICITATION_IDS, the
be_bryan 0:b74591d5ab33 561 * supplied value is appended to the values present in the payload.
be_bryan 0:b74591d5ab33 562 */
be_bryan 0:b74591d5ab33 563 ble_error_t addData(DataType_t advDataType, const uint8_t *payload, uint8_t len)
be_bryan 0:b74591d5ab33 564 {
be_bryan 0:b74591d5ab33 565 /* Find field */
be_bryan 0:b74591d5ab33 566 uint8_t* field = findField(advDataType);
be_bryan 0:b74591d5ab33 567
be_bryan 0:b74591d5ab33 568 if (field) {
be_bryan 0:b74591d5ab33 569 /* Field type already exists, either add to field or replace */
be_bryan 0:b74591d5ab33 570 return addField(advDataType, payload, len, field);
be_bryan 0:b74591d5ab33 571 } else {
be_bryan 0:b74591d5ab33 572 /* Field doesn't exist, insert new */
be_bryan 0:b74591d5ab33 573 return appendField(advDataType, payload, len);
be_bryan 0:b74591d5ab33 574 }
be_bryan 0:b74591d5ab33 575 }
be_bryan 0:b74591d5ab33 576
be_bryan 0:b74591d5ab33 577 /**
be_bryan 0:b74591d5ab33 578 * Update a specific field in the advertising payload.
be_bryan 0:b74591d5ab33 579 *
be_bryan 0:b74591d5ab33 580 * @param[in] advDataType The type of the field to update.
be_bryan 0:b74591d5ab33 581 * @param[in] payload Pointer to the updated value of the field.
be_bryan 0:b74591d5ab33 582 * @param[in] len Size of the new value in bytes.
be_bryan 0:b74591d5ab33 583 *
be_bryan 0:b74591d5ab33 584 * @return BLE_ERROR_NONE returned on success.
be_bryan 0:b74591d5ab33 585 * @return BLE_ERROR_UNSPECIFIED if the specified field is not found,
be_bryan 0:b74591d5ab33 586 * @return BLE_ERROR_BUFFER_OVERFLOW if the new value causes the
be_bryan 0:b74591d5ab33 587 * advertising buffer to overflow.
be_bryan 0:b74591d5ab33 588 */
be_bryan 0:b74591d5ab33 589 ble_error_t updateData(DataType_t advDataType, const uint8_t *payload, uint8_t len)
be_bryan 0:b74591d5ab33 590 {
be_bryan 0:b74591d5ab33 591 /* Find field */
be_bryan 0:b74591d5ab33 592 uint8_t* field = findField(advDataType);
be_bryan 0:b74591d5ab33 593
be_bryan 0:b74591d5ab33 594 if (field) {
be_bryan 0:b74591d5ab33 595 /* Field type already exists, replace field contents */
be_bryan 0:b74591d5ab33 596 return updateField(advDataType, payload, len, field);
be_bryan 0:b74591d5ab33 597 } else {
be_bryan 0:b74591d5ab33 598 /* field doesn't exist, return an error */
be_bryan 0:b74591d5ab33 599 return BLE_ERROR_UNSPECIFIED;
be_bryan 0:b74591d5ab33 600 }
be_bryan 0:b74591d5ab33 601 }
be_bryan 0:b74591d5ab33 602
be_bryan 0:b74591d5ab33 603 /**
be_bryan 0:b74591d5ab33 604 * Add device appearance in the advertising payload.
be_bryan 0:b74591d5ab33 605 *
be_bryan 0:b74591d5ab33 606 * @param[in] appearance The appearance to advertise.
be_bryan 0:b74591d5ab33 607 *
be_bryan 0:b74591d5ab33 608 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 609 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
be_bryan 0:b74591d5ab33 610 * advertising buffer to overflow.
be_bryan 0:b74591d5ab33 611 *
be_bryan 0:b74591d5ab33 612 * @note This call is equivalent to calling addData() with
be_bryan 0:b74591d5ab33 613 * GapAdvertisingData::APPEARANCE as the field type.
be_bryan 0:b74591d5ab33 614 */
be_bryan 0:b74591d5ab33 615 ble_error_t addAppearance(Appearance appearance = GENERIC_TAG)
be_bryan 0:b74591d5ab33 616 {
be_bryan 0:b74591d5ab33 617 _appearance = appearance;
be_bryan 0:b74591d5ab33 618 return addData(GapAdvertisingData::APPEARANCE, (uint8_t *)&appearance, 2);
be_bryan 0:b74591d5ab33 619 }
be_bryan 0:b74591d5ab33 620
be_bryan 0:b74591d5ab33 621 /**
be_bryan 0:b74591d5ab33 622 * Add BLE flags in the advertising payload.
be_bryan 0:b74591d5ab33 623 *
be_bryan 0:b74591d5ab33 624 * @param[in] flags Bitfield describing the capability of the device. See
be_bryan 0:b74591d5ab33 625 * allowed flags in Flags_t.
be_bryan 0:b74591d5ab33 626 *
be_bryan 0:b74591d5ab33 627 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 628 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
be_bryan 0:b74591d5ab33 629 * advertising buffer to overflow.
be_bryan 0:b74591d5ab33 630 *
be_bryan 0:b74591d5ab33 631 * @note This call is equivalent to calling addData() with
be_bryan 0:b74591d5ab33 632 * GapAdvertisingData::FLAGS as the field type.
be_bryan 0:b74591d5ab33 633 */
be_bryan 0:b74591d5ab33 634 ble_error_t addFlags(uint8_t flags = LE_GENERAL_DISCOVERABLE)
be_bryan 0:b74591d5ab33 635 {
be_bryan 0:b74591d5ab33 636 return addData(GapAdvertisingData::FLAGS, &flags, 1);
be_bryan 0:b74591d5ab33 637 }
be_bryan 0:b74591d5ab33 638
be_bryan 0:b74591d5ab33 639 /**
be_bryan 0:b74591d5ab33 640 * Add the advertising TX in the advertising payload.
be_bryan 0:b74591d5ab33 641 *
be_bryan 0:b74591d5ab33 642 * @param[in] txPower Transmission power level in dB.
be_bryan 0:b74591d5ab33 643 *
be_bryan 0:b74591d5ab33 644 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 645 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
be_bryan 0:b74591d5ab33 646 * advertising buffer to overflow.
be_bryan 0:b74591d5ab33 647 *
be_bryan 0:b74591d5ab33 648 * @note This call is equivalent to calling addData() with
be_bryan 0:b74591d5ab33 649 * GapAdvertisingData::TX_POWER_LEVEL as the field type.
be_bryan 0:b74591d5ab33 650 */
be_bryan 0:b74591d5ab33 651 ble_error_t addTxPower(int8_t txPower)
be_bryan 0:b74591d5ab33 652 {
be_bryan 0:b74591d5ab33 653 /* To Do: Basic error checking to make sure txPower is in range. */
be_bryan 0:b74591d5ab33 654 return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t *)&txPower, 1);
be_bryan 0:b74591d5ab33 655 }
be_bryan 0:b74591d5ab33 656
be_bryan 0:b74591d5ab33 657 /**
be_bryan 0:b74591d5ab33 658 * Clears the advertising data payload.
be_bryan 0:b74591d5ab33 659 *
be_bryan 0:b74591d5ab33 660 * @post getPayloadLen() returns 0.
be_bryan 0:b74591d5ab33 661 */
be_bryan 0:b74591d5ab33 662 void clear(void)
be_bryan 0:b74591d5ab33 663 {
be_bryan 0:b74591d5ab33 664 memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
be_bryan 0:b74591d5ab33 665 _payloadLen = 0;
be_bryan 0:b74591d5ab33 666 }
be_bryan 0:b74591d5ab33 667
be_bryan 0:b74591d5ab33 668 /**
be_bryan 0:b74591d5ab33 669 * Get the pointer to the advertising payload bytes.
be_bryan 0:b74591d5ab33 670 *
be_bryan 0:b74591d5ab33 671 * @return A pointer to the payload.
be_bryan 0:b74591d5ab33 672 */
be_bryan 0:b74591d5ab33 673 const uint8_t *getPayload(void) const
be_bryan 0:b74591d5ab33 674 {
be_bryan 0:b74591d5ab33 675 return _payload;
be_bryan 0:b74591d5ab33 676 }
be_bryan 0:b74591d5ab33 677
be_bryan 0:b74591d5ab33 678 /**
be_bryan 0:b74591d5ab33 679 * Get the payload length.
be_bryan 0:b74591d5ab33 680 *
be_bryan 0:b74591d5ab33 681 * @return The payload length in bytes.
be_bryan 0:b74591d5ab33 682 */
be_bryan 0:b74591d5ab33 683 uint8_t getPayloadLen(void) const
be_bryan 0:b74591d5ab33 684 {
be_bryan 0:b74591d5ab33 685 return _payloadLen;
be_bryan 0:b74591d5ab33 686 }
be_bryan 0:b74591d5ab33 687
be_bryan 0:b74591d5ab33 688 /**
be_bryan 0:b74591d5ab33 689 * Get the appearance set.
be_bryan 0:b74591d5ab33 690 *
be_bryan 0:b74591d5ab33 691 * If no value has been set, this function returns GENERIC_TAG.
be_bryan 0:b74591d5ab33 692 *
be_bryan 0:b74591d5ab33 693 * @return The appearance value set for this device.
be_bryan 0:b74591d5ab33 694 */
be_bryan 0:b74591d5ab33 695 uint16_t getAppearance(void) const
be_bryan 0:b74591d5ab33 696 {
be_bryan 0:b74591d5ab33 697 return (uint16_t)_appearance;
be_bryan 0:b74591d5ab33 698 }
be_bryan 0:b74591d5ab33 699
be_bryan 0:b74591d5ab33 700 /**
be_bryan 0:b74591d5ab33 701 * Search advertisement data for a specific field.
be_bryan 0:b74591d5ab33 702 *
be_bryan 0:b74591d5ab33 703 * @param[in] type The type of the field to find.
be_bryan 0:b74591d5ab33 704 *
be_bryan 0:b74591d5ab33 705 * @return A pointer to the first element in the field if found. The first
be_bryan 0:b74591d5ab33 706 * element being the length of the field followed by the value of the field.
be_bryan 0:b74591d5ab33 707 * @return NULL if the field is not present in the payload.
be_bryan 0:b74591d5ab33 708 */
be_bryan 0:b74591d5ab33 709 const uint8_t* findField(DataType_t type) const
be_bryan 0:b74591d5ab33 710 {
be_bryan 0:b74591d5ab33 711 /* Scan through advertisement data */
be_bryan 0:b74591d5ab33 712 for (uint8_t idx = 0; idx < _payloadLen; ) {
be_bryan 0:b74591d5ab33 713 uint8_t fieldType = _payload[idx + 1];
be_bryan 0:b74591d5ab33 714
be_bryan 0:b74591d5ab33 715 if (fieldType == type) {
be_bryan 0:b74591d5ab33 716 return &_payload[idx];
be_bryan 0:b74591d5ab33 717 }
be_bryan 0:b74591d5ab33 718
be_bryan 0:b74591d5ab33 719 /* Advance to next field */
be_bryan 0:b74591d5ab33 720 idx += _payload[idx] + 1;
be_bryan 0:b74591d5ab33 721 }
be_bryan 0:b74591d5ab33 722
be_bryan 0:b74591d5ab33 723 /* Field not found */
be_bryan 0:b74591d5ab33 724 return NULL;
be_bryan 0:b74591d5ab33 725 }
be_bryan 0:b74591d5ab33 726
be_bryan 0:b74591d5ab33 727 private:
be_bryan 0:b74591d5ab33 728 /**
be_bryan 0:b74591d5ab33 729 * Append advertising data based on the specified type.
be_bryan 0:b74591d5ab33 730 *
be_bryan 0:b74591d5ab33 731 * @param[in] advDataType Type of the new data.
be_bryan 0:b74591d5ab33 732 * @param[in] payload Pointer to the data to be appended to the advertising
be_bryan 0:b74591d5ab33 733 * payload.
be_bryan 0:b74591d5ab33 734 * @param[in] len Length of the data pointed to by @p payload.
be_bryan 0:b74591d5ab33 735 *
be_bryan 0:b74591d5ab33 736 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 737 * @return BLE_ERROR_BUFFER_OVERFLOW if the specified data would cause the
be_bryan 0:b74591d5ab33 738 * advertising buffer to overflow.
be_bryan 0:b74591d5ab33 739 */
be_bryan 0:b74591d5ab33 740 ble_error_t appendField(DataType advDataType, const uint8_t *payload, uint8_t len)
be_bryan 0:b74591d5ab33 741 {
be_bryan 0:b74591d5ab33 742 /* Make sure we don't exceed the 31-byte payload limit */
be_bryan 0:b74591d5ab33 743 if (_payloadLen + len + 2 > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
be_bryan 0:b74591d5ab33 744 return BLE_ERROR_BUFFER_OVERFLOW;
be_bryan 0:b74591d5ab33 745 }
be_bryan 0:b74591d5ab33 746
be_bryan 0:b74591d5ab33 747 /* Field length. */
be_bryan 0:b74591d5ab33 748 memset(&_payload[_payloadLen], len + 1, 1);
be_bryan 0:b74591d5ab33 749 _payloadLen++;
be_bryan 0:b74591d5ab33 750
be_bryan 0:b74591d5ab33 751 /* Field ID. */
be_bryan 0:b74591d5ab33 752 memset(&_payload[_payloadLen], (uint8_t)advDataType, 1);
be_bryan 0:b74591d5ab33 753 _payloadLen++;
be_bryan 0:b74591d5ab33 754
be_bryan 0:b74591d5ab33 755 /* Payload. */
be_bryan 0:b74591d5ab33 756 memcpy(&_payload[_payloadLen], payload, len);
be_bryan 0:b74591d5ab33 757 _payloadLen += len;
be_bryan 0:b74591d5ab33 758
be_bryan 0:b74591d5ab33 759 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 760 }
be_bryan 0:b74591d5ab33 761
be_bryan 0:b74591d5ab33 762 /**
be_bryan 0:b74591d5ab33 763 * Search advertisement data for a specific field.
be_bryan 0:b74591d5ab33 764 *
be_bryan 0:b74591d5ab33 765 * @param[in] type The type of the field to find.
be_bryan 0:b74591d5ab33 766 *
be_bryan 0:b74591d5ab33 767 * @return A pointer to the first element in the field if found. The first
be_bryan 0:b74591d5ab33 768 * element being the length of the field followed by the value of the field.
be_bryan 0:b74591d5ab33 769 * @return NULL if the field is not present in the payload.
be_bryan 0:b74591d5ab33 770 */
be_bryan 0:b74591d5ab33 771 uint8_t* findField(DataType_t type)
be_bryan 0:b74591d5ab33 772 {
be_bryan 0:b74591d5ab33 773 return const_cast<uint8_t*>(
be_bryan 0:b74591d5ab33 774 static_cast<const GapAdvertisingData*>(this)->findField(type)
be_bryan 0:b74591d5ab33 775 );
be_bryan 0:b74591d5ab33 776 }
be_bryan 0:b74591d5ab33 777
be_bryan 0:b74591d5ab33 778 /**
be_bryan 0:b74591d5ab33 779 * Update in place the value of a field in the advertising payload.
be_bryan 0:b74591d5ab33 780 *
be_bryan 0:b74591d5ab33 781 * @param[in] advDataType Type of the new data.
be_bryan 0:b74591d5ab33 782 * @param[in] payload Pointer to the data to be added to the advertising
be_bryan 0:b74591d5ab33 783 * payload.
be_bryan 0:b74591d5ab33 784 * @param[in] len Length of the data pointed to by @p payload.
be_bryan 0:b74591d5ab33 785 * @param[in] field Pointer to the field of type @p advDataType in the
be_bryan 0:b74591d5ab33 786 * advertising buffer.
be_bryan 0:b74591d5ab33 787 *
be_bryan 0:b74591d5ab33 788 * @note When the specified AD type is INCOMPLETE_LIST_16BIT_SERVICE_IDS,
be_bryan 0:b74591d5ab33 789 * COMPLETE_LIST_16BIT_SERVICE_IDS, INCOMPLETE_LIST_32BIT_SERVICE_IDS,
be_bryan 0:b74591d5ab33 790 * COMPLETE_LIST_32BIT_SERVICE_IDS, INCOMPLETE_LIST_128BIT_SERVICE_IDS,
be_bryan 0:b74591d5ab33 791 * COMPLETE_LIST_128BIT_SERVICE_IDS or LIST_128BIT_SOLICITATION_IDS, the
be_bryan 0:b74591d5ab33 792 * supplied value is appended to the values previously added to the
be_bryan 0:b74591d5ab33 793 * payload.
be_bryan 0:b74591d5ab33 794 *
be_bryan 0:b74591d5ab33 795 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 796 */
be_bryan 0:b74591d5ab33 797 ble_error_t addField(
be_bryan 0:b74591d5ab33 798 DataType_t advDataType,
be_bryan 0:b74591d5ab33 799 const uint8_t *payload,
be_bryan 0:b74591d5ab33 800 uint8_t len,
be_bryan 0:b74591d5ab33 801 uint8_t* field
be_bryan 0:b74591d5ab33 802 ) {
be_bryan 0:b74591d5ab33 803 ble_error_t result = BLE_ERROR_BUFFER_OVERFLOW;
be_bryan 0:b74591d5ab33 804
be_bryan 0:b74591d5ab33 805 switch(advDataType) {
be_bryan 0:b74591d5ab33 806 /* These fields have the new data appended if there is sufficient space. */
be_bryan 0:b74591d5ab33 807 case INCOMPLETE_LIST_16BIT_SERVICE_IDS:
be_bryan 0:b74591d5ab33 808 case COMPLETE_LIST_16BIT_SERVICE_IDS:
be_bryan 0:b74591d5ab33 809 case INCOMPLETE_LIST_32BIT_SERVICE_IDS:
be_bryan 0:b74591d5ab33 810 case COMPLETE_LIST_32BIT_SERVICE_IDS:
be_bryan 0:b74591d5ab33 811 case INCOMPLETE_LIST_128BIT_SERVICE_IDS:
be_bryan 0:b74591d5ab33 812 case COMPLETE_LIST_128BIT_SERVICE_IDS:
be_bryan 0:b74591d5ab33 813 case LIST_128BIT_SOLICITATION_IDS: {
be_bryan 0:b74591d5ab33 814 /* Check if data fits */
be_bryan 0:b74591d5ab33 815 if ((_payloadLen + len) <= GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
be_bryan 0:b74591d5ab33 816 /*
be_bryan 0:b74591d5ab33 817 * Make room for new field by moving the remainder of the
be_bryan 0:b74591d5ab33 818 * advertisement payload "to the right" starting after the
be_bryan 0:b74591d5ab33 819 * TYPE field.
be_bryan 0:b74591d5ab33 820 */
be_bryan 0:b74591d5ab33 821 uint8_t* end = &_payload[_payloadLen];
be_bryan 0:b74591d5ab33 822
be_bryan 0:b74591d5ab33 823 while (&field[1] < end) {
be_bryan 0:b74591d5ab33 824 end[len] = *end;
be_bryan 0:b74591d5ab33 825 end--;
be_bryan 0:b74591d5ab33 826 }
be_bryan 0:b74591d5ab33 827
be_bryan 0:b74591d5ab33 828 /* Insert new data */
be_bryan 0:b74591d5ab33 829 for (uint8_t idx = 0; idx < len; idx++) {
be_bryan 0:b74591d5ab33 830 field[2 + idx] = payload[idx];
be_bryan 0:b74591d5ab33 831 }
be_bryan 0:b74591d5ab33 832
be_bryan 0:b74591d5ab33 833 /* Increment lengths */
be_bryan 0:b74591d5ab33 834 field[0] += len;
be_bryan 0:b74591d5ab33 835 _payloadLen += len;
be_bryan 0:b74591d5ab33 836
be_bryan 0:b74591d5ab33 837 result = BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 838 }
be_bryan 0:b74591d5ab33 839
be_bryan 0:b74591d5ab33 840 break;
be_bryan 0:b74591d5ab33 841 }
be_bryan 0:b74591d5ab33 842 /* These fields are overwritten with the new value */
be_bryan 0:b74591d5ab33 843 default: {
be_bryan 0:b74591d5ab33 844 result = updateField(advDataType, payload, len, field);
be_bryan 0:b74591d5ab33 845
be_bryan 0:b74591d5ab33 846 break;
be_bryan 0:b74591d5ab33 847 }
be_bryan 0:b74591d5ab33 848 }
be_bryan 0:b74591d5ab33 849
be_bryan 0:b74591d5ab33 850 return result;
be_bryan 0:b74591d5ab33 851 }
be_bryan 0:b74591d5ab33 852
be_bryan 0:b74591d5ab33 853 /**
be_bryan 0:b74591d5ab33 854 * Update in place the value of a field in the advertising payload.
be_bryan 0:b74591d5ab33 855 *
be_bryan 0:b74591d5ab33 856 * @param[in] advDataType Type of the new data.
be_bryan 0:b74591d5ab33 857 * @param[in] payload Pointer to the data to be added to the advertising
be_bryan 0:b74591d5ab33 858 * payload.
be_bryan 0:b74591d5ab33 859 * @param[in] len Length of the data pointed to by @p payload.
be_bryan 0:b74591d5ab33 860 * @param[in] field Pointer to the field of type @p advDataType in the
be_bryan 0:b74591d5ab33 861 * advertising buffer.
be_bryan 0:b74591d5ab33 862 *
be_bryan 0:b74591d5ab33 863 * @return BLE_ERROR_NONE on success.
be_bryan 0:b74591d5ab33 864 */
be_bryan 0:b74591d5ab33 865 ble_error_t updateField(
be_bryan 0:b74591d5ab33 866 DataType_t advDataType,
be_bryan 0:b74591d5ab33 867 const uint8_t *payload,
be_bryan 0:b74591d5ab33 868 uint8_t len,
be_bryan 0:b74591d5ab33 869 uint8_t* field
be_bryan 0:b74591d5ab33 870 ) {
be_bryan 0:b74591d5ab33 871 ble_error_t result = BLE_ERROR_BUFFER_OVERFLOW;
be_bryan 0:b74591d5ab33 872 uint8_t dataLength = field[0] - 1;
be_bryan 0:b74591d5ab33 873
be_bryan 0:b74591d5ab33 874 /* New data has same length, do in-order replacement */
be_bryan 0:b74591d5ab33 875 if (len == dataLength) {
be_bryan 0:b74591d5ab33 876 for (uint8_t idx = 0; idx < dataLength; idx++) {
be_bryan 0:b74591d5ab33 877 field[2 + idx] = payload[idx];
be_bryan 0:b74591d5ab33 878 }
be_bryan 0:b74591d5ab33 879
be_bryan 0:b74591d5ab33 880 result = BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 881 } else {
be_bryan 0:b74591d5ab33 882 /* Check if data fits */
be_bryan 0:b74591d5ab33 883 if ((_payloadLen - dataLength + len) <= GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
be_bryan 0:b74591d5ab33 884
be_bryan 0:b74591d5ab33 885 /* Remove old field */
be_bryan 0:b74591d5ab33 886 while ((field + dataLength + 2) < &_payload[_payloadLen]) {
be_bryan 0:b74591d5ab33 887 *field = field[dataLength + 2];
be_bryan 0:b74591d5ab33 888 field++;
be_bryan 0:b74591d5ab33 889 }
be_bryan 0:b74591d5ab33 890
be_bryan 0:b74591d5ab33 891 /* Reduce length */
be_bryan 0:b74591d5ab33 892 _payloadLen -= dataLength + 2;
be_bryan 0:b74591d5ab33 893
be_bryan 0:b74591d5ab33 894 /* Add new field */
be_bryan 0:b74591d5ab33 895 result = appendField(advDataType, payload, len);
be_bryan 0:b74591d5ab33 896 }
be_bryan 0:b74591d5ab33 897 }
be_bryan 0:b74591d5ab33 898
be_bryan 0:b74591d5ab33 899 return result;
be_bryan 0:b74591d5ab33 900 }
be_bryan 0:b74591d5ab33 901
be_bryan 0:b74591d5ab33 902 /**
be_bryan 0:b74591d5ab33 903 * Advertising data buffer.
be_bryan 0:b74591d5ab33 904 */
be_bryan 0:b74591d5ab33 905 uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
be_bryan 0:b74591d5ab33 906
be_bryan 0:b74591d5ab33 907 /**
be_bryan 0:b74591d5ab33 908 * Length of the data added to the advertising buffer.
be_bryan 0:b74591d5ab33 909 */
be_bryan 0:b74591d5ab33 910 uint8_t _payloadLen;
be_bryan 0:b74591d5ab33 911
be_bryan 0:b74591d5ab33 912 /**
be_bryan 0:b74591d5ab33 913 * Appearance value.
be_bryan 0:b74591d5ab33 914 */
be_bryan 0:b74591d5ab33 915 uint16_t _appearance;
be_bryan 0:b74591d5ab33 916 };
be_bryan 0:b74591d5ab33 917
be_bryan 0:b74591d5ab33 918 /**
be_bryan 0:b74591d5ab33 919 * @}
be_bryan 0:b74591d5ab33 920 * @}
be_bryan 0:b74591d5ab33 921 */
be_bryan 0:b74591d5ab33 922
be_bryan 0:b74591d5ab33 923
be_bryan 0:b74591d5ab33 924 #endif /* ifndef MBED_GAP_ADVERTISING_DATA_H__ */