Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

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