Denislam Valeev / Mbed OS Nucleo_rtos_basic
Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

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