Knight KE / Mbed OS Game_Master
Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WFKnight 0:9b3d4731edbb 1 /* mbed Microcontroller Library
WFKnight 0:9b3d4731edbb 2 * Copyright (c) 2006-2013 ARM Limited
WFKnight 0:9b3d4731edbb 3 *
WFKnight 0:9b3d4731edbb 4 * Licensed under the Apache License, Version 2.0 (the "License");
WFKnight 0:9b3d4731edbb 5 * you may not use this file except in compliance with the License.
WFKnight 0:9b3d4731edbb 6 * You may obtain a copy of the License at
WFKnight 0:9b3d4731edbb 7 *
WFKnight 0:9b3d4731edbb 8 * http://www.apache.org/licenses/LICENSE-2.0
WFKnight 0:9b3d4731edbb 9 *
WFKnight 0:9b3d4731edbb 10 * Unless required by applicable law or agreed to in writing, software
WFKnight 0:9b3d4731edbb 11 * distributed under the License is distributed on an "AS IS" BASIS,
WFKnight 0:9b3d4731edbb 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
WFKnight 0:9b3d4731edbb 13 * See the License for the specific language governing permissions and
WFKnight 0:9b3d4731edbb 14 * limitations under the License.
WFKnight 0:9b3d4731edbb 15 */
WFKnight 0:9b3d4731edbb 16
WFKnight 0:9b3d4731edbb 17 #ifndef __GATT_CHARACTERISTIC_H__
WFKnight 0:9b3d4731edbb 18 #define __GATT_CHARACTERISTIC_H__
WFKnight 0:9b3d4731edbb 19
WFKnight 0:9b3d4731edbb 20 #include "Gap.h"
WFKnight 0:9b3d4731edbb 21 #include "SecurityManager.h"
WFKnight 0:9b3d4731edbb 22 #include "GattAttribute.h"
WFKnight 0:9b3d4731edbb 23 #include "GattCallbackParamTypes.h"
WFKnight 0:9b3d4731edbb 24 #include "FunctionPointerWithContext.h"
WFKnight 0:9b3d4731edbb 25
WFKnight 0:9b3d4731edbb 26 /**
WFKnight 0:9b3d4731edbb 27 * @addtogroup ble
WFKnight 0:9b3d4731edbb 28 * @{
WFKnight 0:9b3d4731edbb 29 * @addtogroup gatt
WFKnight 0:9b3d4731edbb 30 * @{
WFKnight 0:9b3d4731edbb 31 * @addtogroup server
WFKnight 0:9b3d4731edbb 32 * @{
WFKnight 0:9b3d4731edbb 33 */
WFKnight 0:9b3d4731edbb 34
WFKnight 0:9b3d4731edbb 35 /**
WFKnight 0:9b3d4731edbb 36 * Representation of a GattServer characteristic.
WFKnight 0:9b3d4731edbb 37 *
WFKnight 0:9b3d4731edbb 38 * A characteristic is a typed value enclosed in a GATT service (GattService).
WFKnight 0:9b3d4731edbb 39 *
WFKnight 0:9b3d4731edbb 40 * @par Type
WFKnight 0:9b3d4731edbb 41 *
WFKnight 0:9b3d4731edbb 42 * The type of the value defines the purpose of the characteristic, and a
WFKnight 0:9b3d4731edbb 43 * UUID represents it. Standard characteristic types may be consulted at
WFKnight 0:9b3d4731edbb 44 * https://www.bluetooth.com/specifications/gatt/characteristics
WFKnight 0:9b3d4731edbb 45 *
WFKnight 0:9b3d4731edbb 46 * @par Supported operations
WFKnight 0:9b3d4731edbb 47 * A set of properties define what client operations the characteristic
WFKnight 0:9b3d4731edbb 48 * supports. See GattServer::Properties_t
WFKnight 0:9b3d4731edbb 49 *
WFKnight 0:9b3d4731edbb 50 * @par Descriptors
WFKnight 0:9b3d4731edbb 51 *
WFKnight 0:9b3d4731edbb 52 * Additional information, such as the unit of the characteristic value, a
WFKnight 0:9b3d4731edbb 53 * description string or a client control point, can be added to the
WFKnight 0:9b3d4731edbb 54 * characteristic.
WFKnight 0:9b3d4731edbb 55 *
WFKnight 0:9b3d4731edbb 56 * See BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part G] - 3.3.1.1
WFKnight 0:9b3d4731edbb 57 *
WFKnight 0:9b3d4731edbb 58 * One of the most important types of descriptor is the Client Characteristic
WFKnight 0:9b3d4731edbb 59 * Configuration Descriptor (CCCD) that must be present if the characteristic
WFKnight 0:9b3d4731edbb 60 * properties allow a client to subscribe to updates of the characteristic
WFKnight 0:9b3d4731edbb 61 * value.
WFKnight 0:9b3d4731edbb 62 *
WFKnight 0:9b3d4731edbb 63 * @par Characteristic breakdown
WFKnight 0:9b3d4731edbb 64 *
WFKnight 0:9b3d4731edbb 65 * A characteristic is composed of several GATT attributes (GattAttribute):
WFKnight 0:9b3d4731edbb 66 * - Characteristic declaration: It contains the properties of the
WFKnight 0:9b3d4731edbb 67 * characteristic, its type and the handle of its value.
WFKnight 0:9b3d4731edbb 68 * - Characteristic value: The value of the characteristic.
WFKnight 0:9b3d4731edbb 69 * - Descriptors: A single GATT attribute stores each descriptor.
WFKnight 0:9b3d4731edbb 70 *
WFKnight 0:9b3d4731edbb 71 * When the GattService containing the characteristic is registered in the
WFKnight 0:9b3d4731edbb 72 * GattServer, a unique attribute handle is assigned to the various attributes
WFKnight 0:9b3d4731edbb 73 * of the characteristic. Clients use this handle to interact with the
WFKnight 0:9b3d4731edbb 74 * characteristic. This handle is used locally in GattServer APIs.
WFKnight 0:9b3d4731edbb 75 *
WFKnight 0:9b3d4731edbb 76 * @par Security requirements
WFKnight 0:9b3d4731edbb 77 *
WFKnight 0:9b3d4731edbb 78 * Verification of security requirements happens whenever a client request to
WFKnight 0:9b3d4731edbb 79 * read the characteristic; write it or even register to its updates. Different
WFKnight 0:9b3d4731edbb 80 * requirements may be defined for these three type of operation. As an example:
WFKnight 0:9b3d4731edbb 81 * it is possible to define a characteristic that do not require security to be
WFKnight 0:9b3d4731edbb 82 * read and require an authenticated link to be written.
WFKnight 0:9b3d4731edbb 83 *
WFKnight 0:9b3d4731edbb 84 * By default all security requirements are set to att_security_requirement_t::NONE
WFKnight 0:9b3d4731edbb 85 * except if the characteristic supports signed write; in such case the security
WFKnight 0:9b3d4731edbb 86 * requirement for write operations is set to att_security_requirement_t::UNAUTHENTICATED.
WFKnight 0:9b3d4731edbb 87 *
WFKnight 0:9b3d4731edbb 88 * @note If a peer uses an operation that is not set in the characteristic
WFKnight 0:9b3d4731edbb 89 * properties then the request request is discarded regardless of the security
WFKnight 0:9b3d4731edbb 90 * requirements and current security level. The only exception being signed
WFKnight 0:9b3d4731edbb 91 * write: signed write are converted into regular write without response if
WFKnight 0:9b3d4731edbb 92 * the link is encrypted.
WFKnight 0:9b3d4731edbb 93 */
WFKnight 0:9b3d4731edbb 94 class GattCharacteristic {
WFKnight 0:9b3d4731edbb 95 public:
WFKnight 0:9b3d4731edbb 96
WFKnight 0:9b3d4731edbb 97 /*
WFKnight 0:9b3d4731edbb 98 * Enumeration of characteristic UUID defined by the Bluetooth body.
WFKnight 0:9b3d4731edbb 99 */
WFKnight 0:9b3d4731edbb 100 enum {
WFKnight 0:9b3d4731edbb 101 /**
WFKnight 0:9b3d4731edbb 102 * Not used in actual BLE service.
WFKnight 0:9b3d4731edbb 103 */
WFKnight 0:9b3d4731edbb 104 UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
WFKnight 0:9b3d4731edbb 105
WFKnight 0:9b3d4731edbb 106 /**
WFKnight 0:9b3d4731edbb 107 * Not used in actual BLE service.
WFKnight 0:9b3d4731edbb 108 */
WFKnight 0:9b3d4731edbb 109 UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
WFKnight 0:9b3d4731edbb 110
WFKnight 0:9b3d4731edbb 111 /**
WFKnight 0:9b3d4731edbb 112 * Not used in actual BLE service.
WFKnight 0:9b3d4731edbb 113 */
WFKnight 0:9b3d4731edbb 114 UUID_REMOVABLE_CHAR = 0x2A3A,
WFKnight 0:9b3d4731edbb 115
WFKnight 0:9b3d4731edbb 116 /**
WFKnight 0:9b3d4731edbb 117 * Not used in actual BLE service.
WFKnight 0:9b3d4731edbb 118 */
WFKnight 0:9b3d4731edbb 119 UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
WFKnight 0:9b3d4731edbb 120
WFKnight 0:9b3d4731edbb 121 /**
WFKnight 0:9b3d4731edbb 122 * Not used as a characteristic UUID.
WFKnight 0:9b3d4731edbb 123 */
WFKnight 0:9b3d4731edbb 124 UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
WFKnight 0:9b3d4731edbb 125
WFKnight 0:9b3d4731edbb 126 /**
WFKnight 0:9b3d4731edbb 127 * Not used as a characteristic UUID.
WFKnight 0:9b3d4731edbb 128 */
WFKnight 0:9b3d4731edbb 129 UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
WFKnight 0:9b3d4731edbb 130
WFKnight 0:9b3d4731edbb 131 /**
WFKnight 0:9b3d4731edbb 132 * Control point of the Immediate Alert service that allows the client to
WFKnight 0:9b3d4731edbb 133 * command the server to alert to a given level.
WFKnight 0:9b3d4731edbb 134 */
WFKnight 0:9b3d4731edbb 135 UUID_ALERT_LEVEL_CHAR = 0x2A06,
WFKnight 0:9b3d4731edbb 136
WFKnight 0:9b3d4731edbb 137 /**
WFKnight 0:9b3d4731edbb 138 * Control point of the Alert Notification service that allows the client
WFKnight 0:9b3d4731edbb 139 * finely tune the notification configuration.
WFKnight 0:9b3d4731edbb 140 */
WFKnight 0:9b3d4731edbb 141 UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
WFKnight 0:9b3d4731edbb 142
WFKnight 0:9b3d4731edbb 143 /**
WFKnight 0:9b3d4731edbb 144 * Part of the Alert Notification service, which exposes the count of
WFKnight 0:9b3d4731edbb 145 * unread alert events existing in the server.
WFKnight 0:9b3d4731edbb 146 */
WFKnight 0:9b3d4731edbb 147 UUID_ALERT_STATUS_CHAR = 0x2A3F,
WFKnight 0:9b3d4731edbb 148
WFKnight 0:9b3d4731edbb 149 /**
WFKnight 0:9b3d4731edbb 150 * Characteristic of the Battery service, which exposes the current
WFKnight 0:9b3d4731edbb 151 * battery level as a percentage.
WFKnight 0:9b3d4731edbb 152 */
WFKnight 0:9b3d4731edbb 153 UUID_BATTERY_LEVEL_CHAR = 0x2A19,
WFKnight 0:9b3d4731edbb 154
WFKnight 0:9b3d4731edbb 155 /**
WFKnight 0:9b3d4731edbb 156 * Describe the features supported by the blood pressure sensor exposed
WFKnight 0:9b3d4731edbb 157 * by the Blood Pressure service.
WFKnight 0:9b3d4731edbb 158 */
WFKnight 0:9b3d4731edbb 159 UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
WFKnight 0:9b3d4731edbb 160
WFKnight 0:9b3d4731edbb 161 /**
WFKnight 0:9b3d4731edbb 162 * Characteristic of the Blood Pressure service that exposes the
WFKnight 0:9b3d4731edbb 163 * measurement of the blood sensor.
WFKnight 0:9b3d4731edbb 164 */
WFKnight 0:9b3d4731edbb 165 UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
WFKnight 0:9b3d4731edbb 166
WFKnight 0:9b3d4731edbb 167 /**
WFKnight 0:9b3d4731edbb 168 * Characteristic of the Heart Rate service that indicate the intended
WFKnight 0:9b3d4731edbb 169 * location of the heart rate monitor.
WFKnight 0:9b3d4731edbb 170 */
WFKnight 0:9b3d4731edbb 171 UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
WFKnight 0:9b3d4731edbb 172
WFKnight 0:9b3d4731edbb 173 /**
WFKnight 0:9b3d4731edbb 174 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 175 */
WFKnight 0:9b3d4731edbb 176 UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
WFKnight 0:9b3d4731edbb 177
WFKnight 0:9b3d4731edbb 178 /**
WFKnight 0:9b3d4731edbb 179 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 180 */
WFKnight 0:9b3d4731edbb 181 UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
WFKnight 0:9b3d4731edbb 182
WFKnight 0:9b3d4731edbb 183 /**
WFKnight 0:9b3d4731edbb 184 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 185 */
WFKnight 0:9b3d4731edbb 186 UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
WFKnight 0:9b3d4731edbb 187
WFKnight 0:9b3d4731edbb 188 /**
WFKnight 0:9b3d4731edbb 189 * Characteristic of the Current Time service that contains the current
WFKnight 0:9b3d4731edbb 190 * time.
WFKnight 0:9b3d4731edbb 191 */
WFKnight 0:9b3d4731edbb 192 UUID_CURRENT_TIME_CHAR = 0x2A2B,
WFKnight 0:9b3d4731edbb 193
WFKnight 0:9b3d4731edbb 194 /**
WFKnight 0:9b3d4731edbb 195 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 196 */
WFKnight 0:9b3d4731edbb 197 UUID_DATE_TIME_CHAR = 0x2A08,
WFKnight 0:9b3d4731edbb 198
WFKnight 0:9b3d4731edbb 199 /**
WFKnight 0:9b3d4731edbb 200 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 201 */
WFKnight 0:9b3d4731edbb 202 UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
WFKnight 0:9b3d4731edbb 203
WFKnight 0:9b3d4731edbb 204 /**
WFKnight 0:9b3d4731edbb 205 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 206 */
WFKnight 0:9b3d4731edbb 207 UUID_DAY_OF_WEEK_CHAR = 0x2A09,
WFKnight 0:9b3d4731edbb 208
WFKnight 0:9b3d4731edbb 209 /**
WFKnight 0:9b3d4731edbb 210 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 211 */
WFKnight 0:9b3d4731edbb 212 UUID_DST_OFFSET_CHAR = 0x2A0D,
WFKnight 0:9b3d4731edbb 213
WFKnight 0:9b3d4731edbb 214 /**
WFKnight 0:9b3d4731edbb 215 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 216 */
WFKnight 0:9b3d4731edbb 217 UUID_EXACT_TIME_256_CHAR = 0x2A0C,
WFKnight 0:9b3d4731edbb 218
WFKnight 0:9b3d4731edbb 219 /**
WFKnight 0:9b3d4731edbb 220 * Characteristic of the Device Information Service that contains a
WFKnight 0:9b3d4731edbb 221 * UTF8 string representing the firmware revision for the firmware within
WFKnight 0:9b3d4731edbb 222 * the device.
WFKnight 0:9b3d4731edbb 223 */
WFKnight 0:9b3d4731edbb 224 UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
WFKnight 0:9b3d4731edbb 225
WFKnight 0:9b3d4731edbb 226 /**
WFKnight 0:9b3d4731edbb 227 * Characteristic of the Glucose service that exposes features supported
WFKnight 0:9b3d4731edbb 228 * by the server.
WFKnight 0:9b3d4731edbb 229 */
WFKnight 0:9b3d4731edbb 230 UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
WFKnight 0:9b3d4731edbb 231
WFKnight 0:9b3d4731edbb 232 /**
WFKnight 0:9b3d4731edbb 233 * Characteristic of the Glucose service that exposes glucose
WFKnight 0:9b3d4731edbb 234 * measurements.
WFKnight 0:9b3d4731edbb 235 */
WFKnight 0:9b3d4731edbb 236 UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
WFKnight 0:9b3d4731edbb 237
WFKnight 0:9b3d4731edbb 238 /**
WFKnight 0:9b3d4731edbb 239 * Characteristic of the Glucose service that sends additional
WFKnight 0:9b3d4731edbb 240 * information related to the glucose measurements.
WFKnight 0:9b3d4731edbb 241 */
WFKnight 0:9b3d4731edbb 242 UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
WFKnight 0:9b3d4731edbb 243
WFKnight 0:9b3d4731edbb 244 /**
WFKnight 0:9b3d4731edbb 245 * Characteristic of the Device Information Service that contains a
WFKnight 0:9b3d4731edbb 246 * UTF8 string representing the hardware revision of the device.
WFKnight 0:9b3d4731edbb 247 */
WFKnight 0:9b3d4731edbb 248 UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
WFKnight 0:9b3d4731edbb 249
WFKnight 0:9b3d4731edbb 250 /**
WFKnight 0:9b3d4731edbb 251 * Characteristic of the Heart Rate service used by the client to control
WFKnight 0:9b3d4731edbb 252 * the service behavior.
WFKnight 0:9b3d4731edbb 253 */
WFKnight 0:9b3d4731edbb 254 UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
WFKnight 0:9b3d4731edbb 255
WFKnight 0:9b3d4731edbb 256 /**
WFKnight 0:9b3d4731edbb 257 * Characteristic of the Heart Rate that sends heart rate measurements to
WFKnight 0:9b3d4731edbb 258 * registered clients.
WFKnight 0:9b3d4731edbb 259 */
WFKnight 0:9b3d4731edbb 260 UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
WFKnight 0:9b3d4731edbb 261
WFKnight 0:9b3d4731edbb 262 /**
WFKnight 0:9b3d4731edbb 263 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 264 */
WFKnight 0:9b3d4731edbb 265 UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
WFKnight 0:9b3d4731edbb 266
WFKnight 0:9b3d4731edbb 267 /**
WFKnight 0:9b3d4731edbb 268 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 269 */
WFKnight 0:9b3d4731edbb 270 UUID_HID_INFORMATION_CHAR = 0x2A4A,
WFKnight 0:9b3d4731edbb 271
WFKnight 0:9b3d4731edbb 272 /**
WFKnight 0:9b3d4731edbb 273 * Characteristic of the Environmental Sensing service, which exposes
WFKnight 0:9b3d4731edbb 274 * humidity measurements.
WFKnight 0:9b3d4731edbb 275 */
WFKnight 0:9b3d4731edbb 276 UUID_HUMIDITY_CHAR = 0x2A6F,
WFKnight 0:9b3d4731edbb 277
WFKnight 0:9b3d4731edbb 278 /**
WFKnight 0:9b3d4731edbb 279 * Characteristic of the Device Information Service, which exposes
WFKnight 0:9b3d4731edbb 280 * various regulatory or certification compliance items to which the
WFKnight 0:9b3d4731edbb 281 * device claims adherence.
WFKnight 0:9b3d4731edbb 282 */
WFKnight 0:9b3d4731edbb 283 UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
WFKnight 0:9b3d4731edbb 284
WFKnight 0:9b3d4731edbb 285 /**
WFKnight 0:9b3d4731edbb 286 * Characteristic of the Blood Pressure service, which exposes intermediate
WFKnight 0:9b3d4731edbb 287 * cuff pressure measurements.
WFKnight 0:9b3d4731edbb 288 */
WFKnight 0:9b3d4731edbb 289 UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
WFKnight 0:9b3d4731edbb 290
WFKnight 0:9b3d4731edbb 291 /**
WFKnight 0:9b3d4731edbb 292 * Characteristic of the Health Thermometer service that sends intermediate
WFKnight 0:9b3d4731edbb 293 * temperature values while the measurement is in progress.
WFKnight 0:9b3d4731edbb 294 */
WFKnight 0:9b3d4731edbb 295 UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
WFKnight 0:9b3d4731edbb 296
WFKnight 0:9b3d4731edbb 297 /**
WFKnight 0:9b3d4731edbb 298 * Characteristic of the current Time service that exposes information
WFKnight 0:9b3d4731edbb 299 * about the local time.
WFKnight 0:9b3d4731edbb 300 */
WFKnight 0:9b3d4731edbb 301 UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
WFKnight 0:9b3d4731edbb 302
WFKnight 0:9b3d4731edbb 303 /**
WFKnight 0:9b3d4731edbb 304 * Characteristic of the Device Information Service that contains a
WFKnight 0:9b3d4731edbb 305 * UTF8 string representing the manufacturer name of the device.
WFKnight 0:9b3d4731edbb 306 */
WFKnight 0:9b3d4731edbb 307 UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
WFKnight 0:9b3d4731edbb 308
WFKnight 0:9b3d4731edbb 309 /**
WFKnight 0:9b3d4731edbb 310 * Characteristic of the Health Thermometer service that exposes the
WFKnight 0:9b3d4731edbb 311 * interval time between two measurements.
WFKnight 0:9b3d4731edbb 312 */
WFKnight 0:9b3d4731edbb 313 UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
WFKnight 0:9b3d4731edbb 314
WFKnight 0:9b3d4731edbb 315 /**
WFKnight 0:9b3d4731edbb 316 * Characteristic of the Device Information Service that contains a
WFKnight 0:9b3d4731edbb 317 * UTF8 string representing the model number of the device assigned by
WFKnight 0:9b3d4731edbb 318 * the vendor.
WFKnight 0:9b3d4731edbb 319 */
WFKnight 0:9b3d4731edbb 320 UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
WFKnight 0:9b3d4731edbb 321
WFKnight 0:9b3d4731edbb 322 /**
WFKnight 0:9b3d4731edbb 323 * Characteristic of the Alert Notification Service that shows how many
WFKnight 0:9b3d4731edbb 324 * numbers of unread alerts exist in the specific category in the device.
WFKnight 0:9b3d4731edbb 325 */
WFKnight 0:9b3d4731edbb 326 UUID_UNREAD_ALERT_CHAR = 0x2A45,
WFKnight 0:9b3d4731edbb 327
WFKnight 0:9b3d4731edbb 328 /**
WFKnight 0:9b3d4731edbb 329 * Characteristic of the Alert Notification Service that defines the
WFKnight 0:9b3d4731edbb 330 * category of the alert and how many new alerts of that category have
WFKnight 0:9b3d4731edbb 331 * occurred in the server.
WFKnight 0:9b3d4731edbb 332 */
WFKnight 0:9b3d4731edbb 333 UUID_NEW_ALERT_CHAR = 0x2A46,
WFKnight 0:9b3d4731edbb 334
WFKnight 0:9b3d4731edbb 335 /**
WFKnight 0:9b3d4731edbb 336 * Characteristic of the Device Information Service; it is a set of
WFKnight 0:9b3d4731edbb 337 * values used to create a device ID that is unique for this device.
WFKnight 0:9b3d4731edbb 338 */
WFKnight 0:9b3d4731edbb 339 UUID_PNP_ID_CHAR = 0x2A50,
WFKnight 0:9b3d4731edbb 340
WFKnight 0:9b3d4731edbb 341 /**
WFKnight 0:9b3d4731edbb 342 * Characteristic of the Environmental Sensing Service that exposes the
WFKnight 0:9b3d4731edbb 343 * pressure measured.
WFKnight 0:9b3d4731edbb 344 */
WFKnight 0:9b3d4731edbb 345 UUID_PRESSURE_CHAR = 0x2A6D,
WFKnight 0:9b3d4731edbb 346
WFKnight 0:9b3d4731edbb 347 /**
WFKnight 0:9b3d4731edbb 348 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 349 */
WFKnight 0:9b3d4731edbb 350 UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
WFKnight 0:9b3d4731edbb 351
WFKnight 0:9b3d4731edbb 352 /**
WFKnight 0:9b3d4731edbb 353 * Pulse Oxymeter, Glucose and Continuous Glucose Monitoring services
WFKnight 0:9b3d4731edbb 354 * use this control point to provide basic management of the patient
WFKnight 0:9b3d4731edbb 355 * record database.
WFKnight 0:9b3d4731edbb 356 */
WFKnight 0:9b3d4731edbb 357 UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
WFKnight 0:9b3d4731edbb 358
WFKnight 0:9b3d4731edbb 359 /**
WFKnight 0:9b3d4731edbb 360 * Characteristic of the Current Time service that exposes information
WFKnight 0:9b3d4731edbb 361 * related to the current time served (accuracy, source, hours since
WFKnight 0:9b3d4731edbb 362 * update and so on).
WFKnight 0:9b3d4731edbb 363 */
WFKnight 0:9b3d4731edbb 364 UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
WFKnight 0:9b3d4731edbb 365
WFKnight 0:9b3d4731edbb 366 /**
WFKnight 0:9b3d4731edbb 367 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 368 */
WFKnight 0:9b3d4731edbb 369 UUID_REPORT_CHAR = 0x2A4D,
WFKnight 0:9b3d4731edbb 370
WFKnight 0:9b3d4731edbb 371 /**
WFKnight 0:9b3d4731edbb 372 * Part of the Human Interface Device service.
WFKnight 0:9b3d4731edbb 373 */
WFKnight 0:9b3d4731edbb 374 UUID_REPORT_MAP_CHAR = 0x2A4B,
WFKnight 0:9b3d4731edbb 375
WFKnight 0:9b3d4731edbb 376 /**
WFKnight 0:9b3d4731edbb 377 * Characteristic of the Phone Alert Status service that allows a client
WFKnight 0:9b3d4731edbb 378 * to configure operating mode.
WFKnight 0:9b3d4731edbb 379 */
WFKnight 0:9b3d4731edbb 380 UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
WFKnight 0:9b3d4731edbb 381
WFKnight 0:9b3d4731edbb 382 /**
WFKnight 0:9b3d4731edbb 383 * Characteristic of the Phone Alert Status service that returns the
WFKnight 0:9b3d4731edbb 384 * ringer setting when read.
WFKnight 0:9b3d4731edbb 385 */
WFKnight 0:9b3d4731edbb 386 UUID_RINGER_SETTING_CHAR = 0x2A41,
WFKnight 0:9b3d4731edbb 387
WFKnight 0:9b3d4731edbb 388 /**
WFKnight 0:9b3d4731edbb 389 * Characteristic of the Scan Parameter service that stores the client's
WFKnight 0:9b3d4731edbb 390 * scan parameters (scan interval and scan window).
WFKnight 0:9b3d4731edbb 391 */
WFKnight 0:9b3d4731edbb 392 UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
WFKnight 0:9b3d4731edbb 393
WFKnight 0:9b3d4731edbb 394 /**
WFKnight 0:9b3d4731edbb 395 * Characteristic of the Scan Parameter service that sends a notification
WFKnight 0:9b3d4731edbb 396 * to a client when the server requires its latest scan parameters.
WFKnight 0:9b3d4731edbb 397 */
WFKnight 0:9b3d4731edbb 398 UUID_SCAN_REFRESH_CHAR = 0x2A31,
WFKnight 0:9b3d4731edbb 399
WFKnight 0:9b3d4731edbb 400 /**
WFKnight 0:9b3d4731edbb 401 * Characteristic of the Device Information Service that contains a
WFKnight 0:9b3d4731edbb 402 * UTF8 string representing the serial number of the device.
WFKnight 0:9b3d4731edbb 403 */
WFKnight 0:9b3d4731edbb 404 UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
WFKnight 0:9b3d4731edbb 405
WFKnight 0:9b3d4731edbb 406 /**
WFKnight 0:9b3d4731edbb 407 * Characteristic of the Device Information Service that contains an
WFKnight 0:9b3d4731edbb 408 * UTF8 string representing the software revision of the device.
WFKnight 0:9b3d4731edbb 409 */
WFKnight 0:9b3d4731edbb 410 UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
WFKnight 0:9b3d4731edbb 411
WFKnight 0:9b3d4731edbb 412 /**
WFKnight 0:9b3d4731edbb 413 * Characteristic of the Alert Notification Service that notifies the
WFKnight 0:9b3d4731edbb 414 * count of new alerts for a given category to a subscribed client.
WFKnight 0:9b3d4731edbb 415 */
WFKnight 0:9b3d4731edbb 416 UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
WFKnight 0:9b3d4731edbb 417
WFKnight 0:9b3d4731edbb 418 /**
WFKnight 0:9b3d4731edbb 419 * Characteristic of the Alert Notification service, which exposes
WFKnight 0:9b3d4731edbb 420 * categories of unread alert supported by the server.
WFKnight 0:9b3d4731edbb 421 */
WFKnight 0:9b3d4731edbb 422 UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
WFKnight 0:9b3d4731edbb 423
WFKnight 0:9b3d4731edbb 424 /**
WFKnight 0:9b3d4731edbb 425 * Characteristic of the Device Information Service that exposes a
WFKnight 0:9b3d4731edbb 426 * structure containing an Organizationally Unique Identifier (OUI)
WFKnight 0:9b3d4731edbb 427 * followed by a manufacturer-defined identifier. The value of the
WFKnight 0:9b3d4731edbb 428 * structure is unique for each individual instance of the product.
WFKnight 0:9b3d4731edbb 429 */
WFKnight 0:9b3d4731edbb 430 UUID_SYSTEM_ID_CHAR = 0x2A23,
WFKnight 0:9b3d4731edbb 431
WFKnight 0:9b3d4731edbb 432 /**
WFKnight 0:9b3d4731edbb 433 * Characteristic of the Environmental Sensing service that exposes the
WFKnight 0:9b3d4731edbb 434 * temperature measurement with a resolution of 0.01 degree Celsius.
WFKnight 0:9b3d4731edbb 435 */
WFKnight 0:9b3d4731edbb 436 UUID_TEMPERATURE_CHAR = 0x2A6E,
WFKnight 0:9b3d4731edbb 437
WFKnight 0:9b3d4731edbb 438 /**
WFKnight 0:9b3d4731edbb 439 * Characteristic of the Health Thermometer service that sends temperature
WFKnight 0:9b3d4731edbb 440 * measurement to clients.
WFKnight 0:9b3d4731edbb 441 */
WFKnight 0:9b3d4731edbb 442 UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
WFKnight 0:9b3d4731edbb 443
WFKnight 0:9b3d4731edbb 444 /**
WFKnight 0:9b3d4731edbb 445 * Characteristic of the Health Thermometer service that describes
WFKnight 0:9b3d4731edbb 446 * where the measurement takes place.
WFKnight 0:9b3d4731edbb 447 */
WFKnight 0:9b3d4731edbb 448 UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
WFKnight 0:9b3d4731edbb 449
WFKnight 0:9b3d4731edbb 450 /**
WFKnight 0:9b3d4731edbb 451 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 452 */
WFKnight 0:9b3d4731edbb 453 UUID_TIME_ACCURACY_CHAR = 0x2A12,
WFKnight 0:9b3d4731edbb 454
WFKnight 0:9b3d4731edbb 455 /**
WFKnight 0:9b3d4731edbb 456 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 457 */
WFKnight 0:9b3d4731edbb 458 UUID_TIME_SOURCE_CHAR = 0x2A13,
WFKnight 0:9b3d4731edbb 459
WFKnight 0:9b3d4731edbb 460 /**
WFKnight 0:9b3d4731edbb 461 * Characteristic of the Reference Time service that allows clients to
WFKnight 0:9b3d4731edbb 462 * control time update.
WFKnight 0:9b3d4731edbb 463 */
WFKnight 0:9b3d4731edbb 464 UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
WFKnight 0:9b3d4731edbb 465
WFKnight 0:9b3d4731edbb 466 /**
WFKnight 0:9b3d4731edbb 467 * Characteristic of the Reference Time service that informs clients of
WFKnight 0:9b3d4731edbb 468 * the status of the time update operation.
WFKnight 0:9b3d4731edbb 469 */
WFKnight 0:9b3d4731edbb 470 UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
WFKnight 0:9b3d4731edbb 471
WFKnight 0:9b3d4731edbb 472 /**
WFKnight 0:9b3d4731edbb 473 * Characteristic of the Next DST Change service that returns to clients
WFKnight 0:9b3d4731edbb 474 * the time with DST.
WFKnight 0:9b3d4731edbb 475 */
WFKnight 0:9b3d4731edbb 476 UUID_TIME_WITH_DST_CHAR = 0x2A11,
WFKnight 0:9b3d4731edbb 477
WFKnight 0:9b3d4731edbb 478 /**
WFKnight 0:9b3d4731edbb 479 * Not used in a service as a characteristic.
WFKnight 0:9b3d4731edbb 480 */
WFKnight 0:9b3d4731edbb 481 UUID_TIME_ZONE_CHAR = 0x2A0E,
WFKnight 0:9b3d4731edbb 482
WFKnight 0:9b3d4731edbb 483 /**
WFKnight 0:9b3d4731edbb 484 * Characteristic of the TX Power service that exposes the current
WFKnight 0:9b3d4731edbb 485 * transmission power in dBm.
WFKnight 0:9b3d4731edbb 486 */
WFKnight 0:9b3d4731edbb 487 UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
WFKnight 0:9b3d4731edbb 488
WFKnight 0:9b3d4731edbb 489 /**
WFKnight 0:9b3d4731edbb 490 * Characteristic of the Cycling Speed and Cadence (CSC) service that
WFKnight 0:9b3d4731edbb 491 * exposes features supported by the server.
WFKnight 0:9b3d4731edbb 492 */
WFKnight 0:9b3d4731edbb 493 UUID_CSC_FEATURE_CHAR = 0x2A5C,
WFKnight 0:9b3d4731edbb 494
WFKnight 0:9b3d4731edbb 495 /**
WFKnight 0:9b3d4731edbb 496 * Characteristic of the Cycling Speed and Cadence (CSC) service that
WFKnight 0:9b3d4731edbb 497 * exposes measurements made by the server.
WFKnight 0:9b3d4731edbb 498 */
WFKnight 0:9b3d4731edbb 499 UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
WFKnight 0:9b3d4731edbb 500
WFKnight 0:9b3d4731edbb 501 /**
WFKnight 0:9b3d4731edbb 502 * Characteristic of the Running Speed and Cadence (RSC) service that
WFKnight 0:9b3d4731edbb 503 * exposes features supported by the server.
WFKnight 0:9b3d4731edbb 504 */
WFKnight 0:9b3d4731edbb 505 UUID_RSC_FEATURE_CHAR = 0x2A54,
WFKnight 0:9b3d4731edbb 506
WFKnight 0:9b3d4731edbb 507 /**
WFKnight 0:9b3d4731edbb 508 * Characteristic of the Running Speed and Cadence (RSC) service that
WFKnight 0:9b3d4731edbb 509 * exposes measurements made by the server.
WFKnight 0:9b3d4731edbb 510 */
WFKnight 0:9b3d4731edbb 511 UUID_RSC_MEASUREMENT_CHAR = 0x2A53
WFKnight 0:9b3d4731edbb 512 };
WFKnight 0:9b3d4731edbb 513
WFKnight 0:9b3d4731edbb 514 /**
WFKnight 0:9b3d4731edbb 515 * Unit type of a characteristic value.
WFKnight 0:9b3d4731edbb 516 *
WFKnight 0:9b3d4731edbb 517 * These unit types are used to describe what the raw numeric data in a
WFKnight 0:9b3d4731edbb 518 * characteristic actually represents. A server can expose that information
WFKnight 0:9b3d4731edbb 519 * to its clients by adding a Characteristic Presentation Format descriptor
WFKnight 0:9b3d4731edbb 520 * to relevant characteristics.
WFKnight 0:9b3d4731edbb 521 *
WFKnight 0:9b3d4731edbb 522 * @note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
WFKnight 0:9b3d4731edbb 523 */
WFKnight 0:9b3d4731edbb 524 enum {
WFKnight 0:9b3d4731edbb 525
WFKnight 0:9b3d4731edbb 526 /**
WFKnight 0:9b3d4731edbb 527 * No specified unit type.
WFKnight 0:9b3d4731edbb 528 */
WFKnight 0:9b3d4731edbb 529 BLE_GATT_UNIT_NONE = 0x2700,
WFKnight 0:9b3d4731edbb 530
WFKnight 0:9b3d4731edbb 531 /**
WFKnight 0:9b3d4731edbb 532 * Length, meter.
WFKnight 0:9b3d4731edbb 533 */
WFKnight 0:9b3d4731edbb 534 BLE_GATT_UNIT_LENGTH_METRE = 0x2701,
WFKnight 0:9b3d4731edbb 535
WFKnight 0:9b3d4731edbb 536 /**
WFKnight 0:9b3d4731edbb 537 * Mass, kilogram.
WFKnight 0:9b3d4731edbb 538 */
WFKnight 0:9b3d4731edbb 539 BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702,
WFKnight 0:9b3d4731edbb 540
WFKnight 0:9b3d4731edbb 541 /**
WFKnight 0:9b3d4731edbb 542 * Time, second.
WFKnight 0:9b3d4731edbb 543 */
WFKnight 0:9b3d4731edbb 544 BLE_GATT_UNIT_TIME_SECOND = 0x2703,
WFKnight 0:9b3d4731edbb 545
WFKnight 0:9b3d4731edbb 546 /**
WFKnight 0:9b3d4731edbb 547 * Electric current, ampere.
WFKnight 0:9b3d4731edbb 548 */
WFKnight 0:9b3d4731edbb 549 BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704,
WFKnight 0:9b3d4731edbb 550
WFKnight 0:9b3d4731edbb 551 /**
WFKnight 0:9b3d4731edbb 552 * Thermodynamic temperature, kelvin.
WFKnight 0:9b3d4731edbb 553 */
WFKnight 0:9b3d4731edbb 554 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705,
WFKnight 0:9b3d4731edbb 555
WFKnight 0:9b3d4731edbb 556 /** Amount of substance, mole.
WFKnight 0:9b3d4731edbb 557 *
WFKnight 0:9b3d4731edbb 558 */
WFKnight 0:9b3d4731edbb 559 BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706,
WFKnight 0:9b3d4731edbb 560
WFKnight 0:9b3d4731edbb 561 /**
WFKnight 0:9b3d4731edbb 562 * Luminous intensity, candela.
WFKnight 0:9b3d4731edbb 563 */
WFKnight 0:9b3d4731edbb 564 BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707,
WFKnight 0:9b3d4731edbb 565
WFKnight 0:9b3d4731edbb 566 /**
WFKnight 0:9b3d4731edbb 567 * Area, square meters.
WFKnight 0:9b3d4731edbb 568 */
WFKnight 0:9b3d4731edbb 569 BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710,
WFKnight 0:9b3d4731edbb 570
WFKnight 0:9b3d4731edbb 571 /**
WFKnight 0:9b3d4731edbb 572 * Volume, cubic meters.
WFKnight 0:9b3d4731edbb 573 */
WFKnight 0:9b3d4731edbb 574 BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711,
WFKnight 0:9b3d4731edbb 575
WFKnight 0:9b3d4731edbb 576 /**
WFKnight 0:9b3d4731edbb 577 * Velocity, meters per second.
WFKnight 0:9b3d4731edbb 578 */
WFKnight 0:9b3d4731edbb 579 BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712,
WFKnight 0:9b3d4731edbb 580
WFKnight 0:9b3d4731edbb 581 /**
WFKnight 0:9b3d4731edbb 582 * Acceleration, meters per second squared.
WFKnight 0:9b3d4731edbb 583 */
WFKnight 0:9b3d4731edbb 584 BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713,
WFKnight 0:9b3d4731edbb 585
WFKnight 0:9b3d4731edbb 586 /**
WFKnight 0:9b3d4731edbb 587 * Wave number reciprocal, meter.
WFKnight 0:9b3d4731edbb 588 */
WFKnight 0:9b3d4731edbb 589 BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714,
WFKnight 0:9b3d4731edbb 590
WFKnight 0:9b3d4731edbb 591 /**
WFKnight 0:9b3d4731edbb 592 * Density, kilogram per cubic meter.
WFKnight 0:9b3d4731edbb 593 */
WFKnight 0:9b3d4731edbb 594 BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715,
WFKnight 0:9b3d4731edbb 595
WFKnight 0:9b3d4731edbb 596 /**
WFKnight 0:9b3d4731edbb 597 * Surface density (kilogram per square meter).
WFKnight 0:9b3d4731edbb 598 */
WFKnight 0:9b3d4731edbb 599 BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716,
WFKnight 0:9b3d4731edbb 600
WFKnight 0:9b3d4731edbb 601 /**
WFKnight 0:9b3d4731edbb 602 * Specific volume (cubic meter per kilogram).
WFKnight 0:9b3d4731edbb 603 */
WFKnight 0:9b3d4731edbb 604 BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717,
WFKnight 0:9b3d4731edbb 605
WFKnight 0:9b3d4731edbb 606 /**
WFKnight 0:9b3d4731edbb 607 * Current density (ampere per square meter).
WFKnight 0:9b3d4731edbb 608 */
WFKnight 0:9b3d4731edbb 609 BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718,
WFKnight 0:9b3d4731edbb 610
WFKnight 0:9b3d4731edbb 611 /**
WFKnight 0:9b3d4731edbb 612 * Magnetic field strength, ampere per meter.
WFKnight 0:9b3d4731edbb 613 */
WFKnight 0:9b3d4731edbb 614 BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719,
WFKnight 0:9b3d4731edbb 615
WFKnight 0:9b3d4731edbb 616 /**
WFKnight 0:9b3d4731edbb 617 * Amount concentration (mole per cubic meter).
WFKnight 0:9b3d4731edbb 618 */
WFKnight 0:9b3d4731edbb 619 BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A,
WFKnight 0:9b3d4731edbb 620
WFKnight 0:9b3d4731edbb 621 /**
WFKnight 0:9b3d4731edbb 622 * Mass concentration (kilogram per cubic meter).
WFKnight 0:9b3d4731edbb 623 */
WFKnight 0:9b3d4731edbb 624 BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B,
WFKnight 0:9b3d4731edbb 625
WFKnight 0:9b3d4731edbb 626 /**
WFKnight 0:9b3d4731edbb 627 * Luminance (candela per square meter).
WFKnight 0:9b3d4731edbb 628 */
WFKnight 0:9b3d4731edbb 629 BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C,
WFKnight 0:9b3d4731edbb 630
WFKnight 0:9b3d4731edbb 631 /**
WFKnight 0:9b3d4731edbb 632 * Refractive index.
WFKnight 0:9b3d4731edbb 633 */
WFKnight 0:9b3d4731edbb 634 BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D,
WFKnight 0:9b3d4731edbb 635
WFKnight 0:9b3d4731edbb 636 /**
WFKnight 0:9b3d4731edbb 637 * Relative permeability.
WFKnight 0:9b3d4731edbb 638 */
WFKnight 0:9b3d4731edbb 639 BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E,
WFKnight 0:9b3d4731edbb 640
WFKnight 0:9b3d4731edbb 641 /**
WFKnight 0:9b3d4731edbb 642 * Plane angle (radian).
WFKnight 0:9b3d4731edbb 643 */
WFKnight 0:9b3d4731edbb 644 BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720,
WFKnight 0:9b3d4731edbb 645
WFKnight 0:9b3d4731edbb 646 /**
WFKnight 0:9b3d4731edbb 647 * Solid angle (steradian).
WFKnight 0:9b3d4731edbb 648 */
WFKnight 0:9b3d4731edbb 649 BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721,
WFKnight 0:9b3d4731edbb 650
WFKnight 0:9b3d4731edbb 651 /**
WFKnight 0:9b3d4731edbb 652 * Frequency, hertz.
WFKnight 0:9b3d4731edbb 653 */
WFKnight 0:9b3d4731edbb 654 BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722,
WFKnight 0:9b3d4731edbb 655
WFKnight 0:9b3d4731edbb 656 /**
WFKnight 0:9b3d4731edbb 657 * Force, newton.
WFKnight 0:9b3d4731edbb 658 */
WFKnight 0:9b3d4731edbb 659 BLE_GATT_UNIT_FORCE_NEWTON = 0x2723,
WFKnight 0:9b3d4731edbb 660
WFKnight 0:9b3d4731edbb 661 /**
WFKnight 0:9b3d4731edbb 662 * Pressure, pascal.
WFKnight 0:9b3d4731edbb 663 */
WFKnight 0:9b3d4731edbb 664 BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724,
WFKnight 0:9b3d4731edbb 665
WFKnight 0:9b3d4731edbb 666 /**
WFKnight 0:9b3d4731edbb 667 * Energy, joule.
WFKnight 0:9b3d4731edbb 668 */
WFKnight 0:9b3d4731edbb 669 BLE_GATT_UNIT_ENERGY_JOULE = 0x2725,
WFKnight 0:9b3d4731edbb 670
WFKnight 0:9b3d4731edbb 671 /**
WFKnight 0:9b3d4731edbb 672 * Power, watt.
WFKnight 0:9b3d4731edbb 673 */
WFKnight 0:9b3d4731edbb 674 BLE_GATT_UNIT_POWER_WATT = 0x2726,
WFKnight 0:9b3d4731edbb 675
WFKnight 0:9b3d4731edbb 676 /**
WFKnight 0:9b3d4731edbb 677 * Electrical charge, coulomb.
WFKnight 0:9b3d4731edbb 678 */
WFKnight 0:9b3d4731edbb 679 BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727,
WFKnight 0:9b3d4731edbb 680
WFKnight 0:9b3d4731edbb 681 /**
WFKnight 0:9b3d4731edbb 682 * Electrical potential difference, voltage.
WFKnight 0:9b3d4731edbb 683 */
WFKnight 0:9b3d4731edbb 684 BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728,
WFKnight 0:9b3d4731edbb 685
WFKnight 0:9b3d4731edbb 686 /**
WFKnight 0:9b3d4731edbb 687 * Capacitance, farad.
WFKnight 0:9b3d4731edbb 688 */
WFKnight 0:9b3d4731edbb 689 BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729,
WFKnight 0:9b3d4731edbb 690
WFKnight 0:9b3d4731edbb 691 /**
WFKnight 0:9b3d4731edbb 692 * Electric resistance, ohm.
WFKnight 0:9b3d4731edbb 693 */
WFKnight 0:9b3d4731edbb 694 BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A,
WFKnight 0:9b3d4731edbb 695
WFKnight 0:9b3d4731edbb 696 /**
WFKnight 0:9b3d4731edbb 697 * Electric conductance, siemens.
WFKnight 0:9b3d4731edbb 698 */
WFKnight 0:9b3d4731edbb 699 BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B,
WFKnight 0:9b3d4731edbb 700
WFKnight 0:9b3d4731edbb 701 /**
WFKnight 0:9b3d4731edbb 702 * Magnetic flux, weber.
WFKnight 0:9b3d4731edbb 703 */
WFKnight 0:9b3d4731edbb 704 BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C,
WFKnight 0:9b3d4731edbb 705
WFKnight 0:9b3d4731edbb 706 /**
WFKnight 0:9b3d4731edbb 707 * Magnetic flux density, tesla.
WFKnight 0:9b3d4731edbb 708 */
WFKnight 0:9b3d4731edbb 709 BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D,
WFKnight 0:9b3d4731edbb 710
WFKnight 0:9b3d4731edbb 711 /**
WFKnight 0:9b3d4731edbb 712 * Inductance, henry.
WFKnight 0:9b3d4731edbb 713 */
WFKnight 0:9b3d4731edbb 714 BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E,
WFKnight 0:9b3d4731edbb 715
WFKnight 0:9b3d4731edbb 716 /**
WFKnight 0:9b3d4731edbb 717 * Celsius temperature, degree Celsius.
WFKnight 0:9b3d4731edbb 718 */
WFKnight 0:9b3d4731edbb 719 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F,
WFKnight 0:9b3d4731edbb 720
WFKnight 0:9b3d4731edbb 721 /**
WFKnight 0:9b3d4731edbb 722 * Luminous flux, lumen.
WFKnight 0:9b3d4731edbb 723 */
WFKnight 0:9b3d4731edbb 724 BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730,
WFKnight 0:9b3d4731edbb 725
WFKnight 0:9b3d4731edbb 726 /**
WFKnight 0:9b3d4731edbb 727 * Illuminance, lux.
WFKnight 0:9b3d4731edbb 728 */
WFKnight 0:9b3d4731edbb 729 BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731,
WFKnight 0:9b3d4731edbb 730
WFKnight 0:9b3d4731edbb 731 /**
WFKnight 0:9b3d4731edbb 732 * Activity referred to a radionuclide, becquerel.
WFKnight 0:9b3d4731edbb 733 */
WFKnight 0:9b3d4731edbb 734 BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732,
WFKnight 0:9b3d4731edbb 735
WFKnight 0:9b3d4731edbb 736 /**
WFKnight 0:9b3d4731edbb 737 * Absorbed dose, gray.
WFKnight 0:9b3d4731edbb 738 */
WFKnight 0:9b3d4731edbb 739 BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733,
WFKnight 0:9b3d4731edbb 740
WFKnight 0:9b3d4731edbb 741 /**
WFKnight 0:9b3d4731edbb 742 * Dose equivalent, sievert.
WFKnight 0:9b3d4731edbb 743 */
WFKnight 0:9b3d4731edbb 744 BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734,
WFKnight 0:9b3d4731edbb 745
WFKnight 0:9b3d4731edbb 746 /**
WFKnight 0:9b3d4731edbb 747 * Catalytic activity, katal.
WFKnight 0:9b3d4731edbb 748 */
WFKnight 0:9b3d4731edbb 749 BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735,
WFKnight 0:9b3d4731edbb 750
WFKnight 0:9b3d4731edbb 751 /**
WFKnight 0:9b3d4731edbb 752 * Dynamic viscosity, pascal second.
WFKnight 0:9b3d4731edbb 753 */
WFKnight 0:9b3d4731edbb 754 BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740,
WFKnight 0:9b3d4731edbb 755
WFKnight 0:9b3d4731edbb 756 /**
WFKnight 0:9b3d4731edbb 757 * Moment of force, newton meter.
WFKnight 0:9b3d4731edbb 758 */
WFKnight 0:9b3d4731edbb 759 BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741,
WFKnight 0:9b3d4731edbb 760
WFKnight 0:9b3d4731edbb 761 /**
WFKnight 0:9b3d4731edbb 762 * Surface tension, newton per meter.
WFKnight 0:9b3d4731edbb 763 */
WFKnight 0:9b3d4731edbb 764 BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742,
WFKnight 0:9b3d4731edbb 765
WFKnight 0:9b3d4731edbb 766 /**
WFKnight 0:9b3d4731edbb 767 * Angular velocity, radian per second.
WFKnight 0:9b3d4731edbb 768 */
WFKnight 0:9b3d4731edbb 769 BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743,
WFKnight 0:9b3d4731edbb 770
WFKnight 0:9b3d4731edbb 771 /**
WFKnight 0:9b3d4731edbb 772 * Angular acceleration, radian per second squared.
WFKnight 0:9b3d4731edbb 773 */
WFKnight 0:9b3d4731edbb 774 BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744,
WFKnight 0:9b3d4731edbb 775
WFKnight 0:9b3d4731edbb 776 /**
WFKnight 0:9b3d4731edbb 777 * Heat flux density, watt per square meter.
WFKnight 0:9b3d4731edbb 778 */
WFKnight 0:9b3d4731edbb 779 BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745,
WFKnight 0:9b3d4731edbb 780
WFKnight 0:9b3d4731edbb 781 /**
WFKnight 0:9b3d4731edbb 782 * Heat capacity, joule per kelvin.
WFKnight 0:9b3d4731edbb 783 */
WFKnight 0:9b3d4731edbb 784 BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746,
WFKnight 0:9b3d4731edbb 785
WFKnight 0:9b3d4731edbb 786 /**
WFKnight 0:9b3d4731edbb 787 * Specific heat capacity, joule per kilogram kelvin.
WFKnight 0:9b3d4731edbb 788 */
WFKnight 0:9b3d4731edbb 789 BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747,
WFKnight 0:9b3d4731edbb 790
WFKnight 0:9b3d4731edbb 791 /**
WFKnight 0:9b3d4731edbb 792 * Specific energy, joule per kilogram.
WFKnight 0:9b3d4731edbb 793 */
WFKnight 0:9b3d4731edbb 794 BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748,
WFKnight 0:9b3d4731edbb 795
WFKnight 0:9b3d4731edbb 796 /**
WFKnight 0:9b3d4731edbb 797 * Thermal conductivity, watt per meter kelvin.
WFKnight 0:9b3d4731edbb 798 */
WFKnight 0:9b3d4731edbb 799 BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749,
WFKnight 0:9b3d4731edbb 800
WFKnight 0:9b3d4731edbb 801 /**
WFKnight 0:9b3d4731edbb 802 * Energy density, joule per cubic meter.
WFKnight 0:9b3d4731edbb 803 */
WFKnight 0:9b3d4731edbb 804 BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A,
WFKnight 0:9b3d4731edbb 805
WFKnight 0:9b3d4731edbb 806 /**
WFKnight 0:9b3d4731edbb 807 * Electric field strength, volt per meter.
WFKnight 0:9b3d4731edbb 808 */
WFKnight 0:9b3d4731edbb 809 BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B,
WFKnight 0:9b3d4731edbb 810
WFKnight 0:9b3d4731edbb 811 /**
WFKnight 0:9b3d4731edbb 812 * Electric charge density, coulomb per cubic meter.
WFKnight 0:9b3d4731edbb 813 */
WFKnight 0:9b3d4731edbb 814 BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C,
WFKnight 0:9b3d4731edbb 815
WFKnight 0:9b3d4731edbb 816 /**
WFKnight 0:9b3d4731edbb 817 * Surface charge density, coulomb per square meter.
WFKnight 0:9b3d4731edbb 818 */
WFKnight 0:9b3d4731edbb 819 BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D,
WFKnight 0:9b3d4731edbb 820
WFKnight 0:9b3d4731edbb 821 /**
WFKnight 0:9b3d4731edbb 822 * Electric flux density, coulomb per square meter.
WFKnight 0:9b3d4731edbb 823 */
WFKnight 0:9b3d4731edbb 824 BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E,
WFKnight 0:9b3d4731edbb 825
WFKnight 0:9b3d4731edbb 826 /**
WFKnight 0:9b3d4731edbb 827 * Permittivity, farad per meter.
WFKnight 0:9b3d4731edbb 828 */
WFKnight 0:9b3d4731edbb 829 BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F,
WFKnight 0:9b3d4731edbb 830
WFKnight 0:9b3d4731edbb 831 /**
WFKnight 0:9b3d4731edbb 832 * Permeability, henry per meter.
WFKnight 0:9b3d4731edbb 833 */
WFKnight 0:9b3d4731edbb 834 BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750,
WFKnight 0:9b3d4731edbb 835
WFKnight 0:9b3d4731edbb 836 /**
WFKnight 0:9b3d4731edbb 837 * Molar energy, joule per mole.
WFKnight 0:9b3d4731edbb 838 */
WFKnight 0:9b3d4731edbb 839 BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751,
WFKnight 0:9b3d4731edbb 840
WFKnight 0:9b3d4731edbb 841 /**
WFKnight 0:9b3d4731edbb 842 * Molar entropy, joule per mole kelvin.
WFKnight 0:9b3d4731edbb 843 */
WFKnight 0:9b3d4731edbb 844 BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752,
WFKnight 0:9b3d4731edbb 845
WFKnight 0:9b3d4731edbb 846 /**
WFKnight 0:9b3d4731edbb 847 * Exposure, coulomb per kilogram.
WFKnight 0:9b3d4731edbb 848 */
WFKnight 0:9b3d4731edbb 849 BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753,
WFKnight 0:9b3d4731edbb 850
WFKnight 0:9b3d4731edbb 851 /**
WFKnight 0:9b3d4731edbb 852 * Absorbed dose rate, gray per second.
WFKnight 0:9b3d4731edbb 853 */
WFKnight 0:9b3d4731edbb 854 BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754,
WFKnight 0:9b3d4731edbb 855
WFKnight 0:9b3d4731edbb 856 /**
WFKnight 0:9b3d4731edbb 857 * Radiant intensity, watt per steradian.
WFKnight 0:9b3d4731edbb 858 */
WFKnight 0:9b3d4731edbb 859 BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755,
WFKnight 0:9b3d4731edbb 860
WFKnight 0:9b3d4731edbb 861 /**
WFKnight 0:9b3d4731edbb 862 * Radiance, watt per square meter steradian.
WFKnight 0:9b3d4731edbb 863 */
WFKnight 0:9b3d4731edbb 864 BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756,
WFKnight 0:9b3d4731edbb 865
WFKnight 0:9b3d4731edbb 866 /**
WFKnight 0:9b3d4731edbb 867 * Catalytic activity concentration, katal per cubic meter.
WFKnight 0:9b3d4731edbb 868 */
WFKnight 0:9b3d4731edbb 869 BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757,
WFKnight 0:9b3d4731edbb 870
WFKnight 0:9b3d4731edbb 871 /**
WFKnight 0:9b3d4731edbb 872 * Time, minute.
WFKnight 0:9b3d4731edbb 873 */
WFKnight 0:9b3d4731edbb 874 BLE_GATT_UNIT_TIME_MINUTE = 0x2760,
WFKnight 0:9b3d4731edbb 875
WFKnight 0:9b3d4731edbb 876 /**
WFKnight 0:9b3d4731edbb 877 * Time, hour.
WFKnight 0:9b3d4731edbb 878 */
WFKnight 0:9b3d4731edbb 879 BLE_GATT_UNIT_TIME_HOUR = 0x2761,
WFKnight 0:9b3d4731edbb 880
WFKnight 0:9b3d4731edbb 881 /**
WFKnight 0:9b3d4731edbb 882 * Time, day.
WFKnight 0:9b3d4731edbb 883 */
WFKnight 0:9b3d4731edbb 884 BLE_GATT_UNIT_TIME_DAY = 0x2762,
WFKnight 0:9b3d4731edbb 885
WFKnight 0:9b3d4731edbb 886 /**
WFKnight 0:9b3d4731edbb 887 * Plane angle, degree.
WFKnight 0:9b3d4731edbb 888 */
WFKnight 0:9b3d4731edbb 889 BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763,
WFKnight 0:9b3d4731edbb 890
WFKnight 0:9b3d4731edbb 891 /**
WFKnight 0:9b3d4731edbb 892 * Plane angle, minute.
WFKnight 0:9b3d4731edbb 893 */
WFKnight 0:9b3d4731edbb 894 BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764,
WFKnight 0:9b3d4731edbb 895
WFKnight 0:9b3d4731edbb 896 /**
WFKnight 0:9b3d4731edbb 897 * Plane angle, seconds.
WFKnight 0:9b3d4731edbb 898 */
WFKnight 0:9b3d4731edbb 899 BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765,
WFKnight 0:9b3d4731edbb 900
WFKnight 0:9b3d4731edbb 901 /**
WFKnight 0:9b3d4731edbb 902 * Area, hectare.
WFKnight 0:9b3d4731edbb 903 */
WFKnight 0:9b3d4731edbb 904 BLE_GATT_UNIT_AREA_HECTARE = 0x2766,
WFKnight 0:9b3d4731edbb 905
WFKnight 0:9b3d4731edbb 906 /**
WFKnight 0:9b3d4731edbb 907 * Volume, liter.
WFKnight 0:9b3d4731edbb 908 */
WFKnight 0:9b3d4731edbb 909 BLE_GATT_UNIT_VOLUME_LITRE = 0x2767,
WFKnight 0:9b3d4731edbb 910
WFKnight 0:9b3d4731edbb 911 /**
WFKnight 0:9b3d4731edbb 912 * Mass, ton.
WFKnight 0:9b3d4731edbb 913 */
WFKnight 0:9b3d4731edbb 914 BLE_GATT_UNIT_MASS_TONNE = 0x2768,
WFKnight 0:9b3d4731edbb 915
WFKnight 0:9b3d4731edbb 916 /**
WFKnight 0:9b3d4731edbb 917 * Pressure, bar.
WFKnight 0:9b3d4731edbb 918 */
WFKnight 0:9b3d4731edbb 919 BLE_GATT_UNIT_PRESSURE_BAR = 0x2780,
WFKnight 0:9b3d4731edbb 920
WFKnight 0:9b3d4731edbb 921 /**
WFKnight 0:9b3d4731edbb 922 * Pressure, millimeter of mercury.
WFKnight 0:9b3d4731edbb 923 */
WFKnight 0:9b3d4731edbb 924 BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781,
WFKnight 0:9b3d4731edbb 925
WFKnight 0:9b3d4731edbb 926 /**
WFKnight 0:9b3d4731edbb 927 * Length, ngstrm.
WFKnight 0:9b3d4731edbb 928 */
WFKnight 0:9b3d4731edbb 929 BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782,
WFKnight 0:9b3d4731edbb 930
WFKnight 0:9b3d4731edbb 931 /**
WFKnight 0:9b3d4731edbb 932 * Length, nautical mile.
WFKnight 0:9b3d4731edbb 933 */
WFKnight 0:9b3d4731edbb 934 BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783,
WFKnight 0:9b3d4731edbb 935
WFKnight 0:9b3d4731edbb 936 /**
WFKnight 0:9b3d4731edbb 937 * Area, barn.
WFKnight 0:9b3d4731edbb 938 */
WFKnight 0:9b3d4731edbb 939 BLE_GATT_UNIT_AREA_BARN = 0x2784,
WFKnight 0:9b3d4731edbb 940
WFKnight 0:9b3d4731edbb 941 /**
WFKnight 0:9b3d4731edbb 942 * Velocity, knot.
WFKnight 0:9b3d4731edbb 943 */
WFKnight 0:9b3d4731edbb 944 BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785,
WFKnight 0:9b3d4731edbb 945
WFKnight 0:9b3d4731edbb 946 /**
WFKnight 0:9b3d4731edbb 947 * Logarithmic radio quantity, neper.
WFKnight 0:9b3d4731edbb 948 */
WFKnight 0:9b3d4731edbb 949 BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786,
WFKnight 0:9b3d4731edbb 950
WFKnight 0:9b3d4731edbb 951 /**
WFKnight 0:9b3d4731edbb 952 * Logarithmic radio quantity, bel.
WFKnight 0:9b3d4731edbb 953 */
WFKnight 0:9b3d4731edbb 954 BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787,
WFKnight 0:9b3d4731edbb 955
WFKnight 0:9b3d4731edbb 956 /**
WFKnight 0:9b3d4731edbb 957 * Length, yard.
WFKnight 0:9b3d4731edbb 958 */
WFKnight 0:9b3d4731edbb 959 BLE_GATT_UNIT_LENGTH_YARD = 0x27A0,
WFKnight 0:9b3d4731edbb 960
WFKnight 0:9b3d4731edbb 961 /**
WFKnight 0:9b3d4731edbb 962 * Length, parsec.
WFKnight 0:9b3d4731edbb 963 */
WFKnight 0:9b3d4731edbb 964 BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1,
WFKnight 0:9b3d4731edbb 965
WFKnight 0:9b3d4731edbb 966 /**
WFKnight 0:9b3d4731edbb 967 * Length, inch.
WFKnight 0:9b3d4731edbb 968 */
WFKnight 0:9b3d4731edbb 969 BLE_GATT_UNIT_LENGTH_INCH = 0x27A2,
WFKnight 0:9b3d4731edbb 970
WFKnight 0:9b3d4731edbb 971 /**
WFKnight 0:9b3d4731edbb 972 * Length, foot.
WFKnight 0:9b3d4731edbb 973 */
WFKnight 0:9b3d4731edbb 974 BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3,
WFKnight 0:9b3d4731edbb 975
WFKnight 0:9b3d4731edbb 976 /**
WFKnight 0:9b3d4731edbb 977 * Length, mile.
WFKnight 0:9b3d4731edbb 978 */
WFKnight 0:9b3d4731edbb 979 BLE_GATT_UNIT_LENGTH_MILE = 0x27A4,
WFKnight 0:9b3d4731edbb 980
WFKnight 0:9b3d4731edbb 981 /**
WFKnight 0:9b3d4731edbb 982 * Pressure, pound-force per square inch.
WFKnight 0:9b3d4731edbb 983 */
WFKnight 0:9b3d4731edbb 984 BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5,
WFKnight 0:9b3d4731edbb 985
WFKnight 0:9b3d4731edbb 986 /**
WFKnight 0:9b3d4731edbb 987 * Velocity, kilometer per hour.
WFKnight 0:9b3d4731edbb 988 */
WFKnight 0:9b3d4731edbb 989 BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6,
WFKnight 0:9b3d4731edbb 990
WFKnight 0:9b3d4731edbb 991 /** Velocity, mile per hour.
WFKnight 0:9b3d4731edbb 992 *
WFKnight 0:9b3d4731edbb 993 */
WFKnight 0:9b3d4731edbb 994 BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7,
WFKnight 0:9b3d4731edbb 995
WFKnight 0:9b3d4731edbb 996 /**
WFKnight 0:9b3d4731edbb 997 * Angular Velocity, revolution per minute.
WFKnight 0:9b3d4731edbb 998 */
WFKnight 0:9b3d4731edbb 999 BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8,
WFKnight 0:9b3d4731edbb 1000
WFKnight 0:9b3d4731edbb 1001 /**
WFKnight 0:9b3d4731edbb 1002 * Energy, gram calorie.
WFKnight 0:9b3d4731edbb 1003 */
WFKnight 0:9b3d4731edbb 1004 BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9,
WFKnight 0:9b3d4731edbb 1005
WFKnight 0:9b3d4731edbb 1006 /**
WFKnight 0:9b3d4731edbb 1007 * Energy, kilogram calorie.
WFKnight 0:9b3d4731edbb 1008 */
WFKnight 0:9b3d4731edbb 1009 BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA,
WFKnight 0:9b3d4731edbb 1010
WFKnight 0:9b3d4731edbb 1011 /**
WFKnight 0:9b3d4731edbb 1012 * Energy, killowatt hour.
WFKnight 0:9b3d4731edbb 1013 */
WFKnight 0:9b3d4731edbb 1014 BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB,
WFKnight 0:9b3d4731edbb 1015
WFKnight 0:9b3d4731edbb 1016 /**
WFKnight 0:9b3d4731edbb 1017 * Thermodynamic temperature, degree Fahrenheit.
WFKnight 0:9b3d4731edbb 1018 */
WFKnight 0:9b3d4731edbb 1019 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC,
WFKnight 0:9b3d4731edbb 1020
WFKnight 0:9b3d4731edbb 1021 /**
WFKnight 0:9b3d4731edbb 1022 * Percentage.
WFKnight 0:9b3d4731edbb 1023 */
WFKnight 0:9b3d4731edbb 1024 BLE_GATT_UNIT_PERCENTAGE = 0x27AD,
WFKnight 0:9b3d4731edbb 1025
WFKnight 0:9b3d4731edbb 1026 /**
WFKnight 0:9b3d4731edbb 1027 * Per mille.
WFKnight 0:9b3d4731edbb 1028 */
WFKnight 0:9b3d4731edbb 1029 BLE_GATT_UNIT_PER_MILLE = 0x27AE,
WFKnight 0:9b3d4731edbb 1030
WFKnight 0:9b3d4731edbb 1031 /**
WFKnight 0:9b3d4731edbb 1032 * Period, beats per minute.
WFKnight 0:9b3d4731edbb 1033 */
WFKnight 0:9b3d4731edbb 1034 BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF,
WFKnight 0:9b3d4731edbb 1035
WFKnight 0:9b3d4731edbb 1036 /**
WFKnight 0:9b3d4731edbb 1037 * Electric charge, ampere hours.
WFKnight 0:9b3d4731edbb 1038 */
WFKnight 0:9b3d4731edbb 1039 BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0,
WFKnight 0:9b3d4731edbb 1040
WFKnight 0:9b3d4731edbb 1041 /**
WFKnight 0:9b3d4731edbb 1042 * Mass density, milligram per deciliter.
WFKnight 0:9b3d4731edbb 1043 */
WFKnight 0:9b3d4731edbb 1044 BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1,
WFKnight 0:9b3d4731edbb 1045
WFKnight 0:9b3d4731edbb 1046 /**
WFKnight 0:9b3d4731edbb 1047 * Mass density, millimole per liter.
WFKnight 0:9b3d4731edbb 1048 */
WFKnight 0:9b3d4731edbb 1049 BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2,
WFKnight 0:9b3d4731edbb 1050
WFKnight 0:9b3d4731edbb 1051 /**
WFKnight 0:9b3d4731edbb 1052 * Time, year.
WFKnight 0:9b3d4731edbb 1053 */
WFKnight 0:9b3d4731edbb 1054 BLE_GATT_UNIT_TIME_YEAR = 0x27B3,
WFKnight 0:9b3d4731edbb 1055
WFKnight 0:9b3d4731edbb 1056 /**
WFKnight 0:9b3d4731edbb 1057 * Time, month.
WFKnight 0:9b3d4731edbb 1058 */
WFKnight 0:9b3d4731edbb 1059 BLE_GATT_UNIT_TIME_MONTH = 0x27B4,
WFKnight 0:9b3d4731edbb 1060
WFKnight 0:9b3d4731edbb 1061 /**
WFKnight 0:9b3d4731edbb 1062 * Concentration, count per cubic meter.
WFKnight 0:9b3d4731edbb 1063 */
WFKnight 0:9b3d4731edbb 1064 BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5,
WFKnight 0:9b3d4731edbb 1065
WFKnight 0:9b3d4731edbb 1066 /**
WFKnight 0:9b3d4731edbb 1067 * Irradiance, watt per square meter.
WFKnight 0:9b3d4731edbb 1068 */
WFKnight 0:9b3d4731edbb 1069 BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6
WFKnight 0:9b3d4731edbb 1070 };
WFKnight 0:9b3d4731edbb 1071
WFKnight 0:9b3d4731edbb 1072 /**
WFKnight 0:9b3d4731edbb 1073 * Presentation format of a characteristic.
WFKnight 0:9b3d4731edbb 1074 *
WFKnight 0:9b3d4731edbb 1075 * It determines how the value of a characteristic is formatted. A server
WFKnight 0:9b3d4731edbb 1076 * can expose that information to its clients by adding a Characteristic
WFKnight 0:9b3d4731edbb 1077 * Presentation Format descriptor to relevant characteristics.
WFKnight 0:9b3d4731edbb 1078 *
WFKnight 0:9b3d4731edbb 1079 * @note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2.
WFKnight 0:9b3d4731edbb 1080 */
WFKnight 0:9b3d4731edbb 1081 enum {
WFKnight 0:9b3d4731edbb 1082 /**
WFKnight 0:9b3d4731edbb 1083 * Reserved for future use.
WFKnight 0:9b3d4731edbb 1084 */
WFKnight 0:9b3d4731edbb 1085 BLE_GATT_FORMAT_RFU = 0x00,
WFKnight 0:9b3d4731edbb 1086
WFKnight 0:9b3d4731edbb 1087 /**
WFKnight 0:9b3d4731edbb 1088 * Boolean.
WFKnight 0:9b3d4731edbb 1089 */
WFKnight 0:9b3d4731edbb 1090 BLE_GATT_FORMAT_BOOLEAN = 0x01,
WFKnight 0:9b3d4731edbb 1091
WFKnight 0:9b3d4731edbb 1092 /**
WFKnight 0:9b3d4731edbb 1093 * Unsigned 2-bit integer.
WFKnight 0:9b3d4731edbb 1094 */
WFKnight 0:9b3d4731edbb 1095 BLE_GATT_FORMAT_2BIT = 0x02,
WFKnight 0:9b3d4731edbb 1096
WFKnight 0:9b3d4731edbb 1097 /**
WFKnight 0:9b3d4731edbb 1098 * Unsigned 4-bit integer.
WFKnight 0:9b3d4731edbb 1099 */
WFKnight 0:9b3d4731edbb 1100 BLE_GATT_FORMAT_NIBBLE = 0x03,
WFKnight 0:9b3d4731edbb 1101
WFKnight 0:9b3d4731edbb 1102 /**
WFKnight 0:9b3d4731edbb 1103 * Unsigned 8-bit integer.
WFKnight 0:9b3d4731edbb 1104 */
WFKnight 0:9b3d4731edbb 1105 BLE_GATT_FORMAT_UINT8 = 0x04,
WFKnight 0:9b3d4731edbb 1106
WFKnight 0:9b3d4731edbb 1107 /**
WFKnight 0:9b3d4731edbb 1108 * Unsigned 12-bit integer.
WFKnight 0:9b3d4731edbb 1109 */
WFKnight 0:9b3d4731edbb 1110 BLE_GATT_FORMAT_UINT12 = 0x05,
WFKnight 0:9b3d4731edbb 1111
WFKnight 0:9b3d4731edbb 1112 /**
WFKnight 0:9b3d4731edbb 1113 * Unsigned 16-bit integer.
WFKnight 0:9b3d4731edbb 1114 */
WFKnight 0:9b3d4731edbb 1115 BLE_GATT_FORMAT_UINT16 = 0x06,
WFKnight 0:9b3d4731edbb 1116
WFKnight 0:9b3d4731edbb 1117 /**
WFKnight 0:9b3d4731edbb 1118 * Unsigned 24-bit integer.
WFKnight 0:9b3d4731edbb 1119 */
WFKnight 0:9b3d4731edbb 1120 BLE_GATT_FORMAT_UINT24 = 0x07,
WFKnight 0:9b3d4731edbb 1121
WFKnight 0:9b3d4731edbb 1122 /**
WFKnight 0:9b3d4731edbb 1123 * Unsigned 32-bit integer.
WFKnight 0:9b3d4731edbb 1124 */
WFKnight 0:9b3d4731edbb 1125 BLE_GATT_FORMAT_UINT32 = 0x08,
WFKnight 0:9b3d4731edbb 1126
WFKnight 0:9b3d4731edbb 1127 /**
WFKnight 0:9b3d4731edbb 1128 * Unsigned 48-bit integer.
WFKnight 0:9b3d4731edbb 1129 */
WFKnight 0:9b3d4731edbb 1130 BLE_GATT_FORMAT_UINT48 = 0x09,
WFKnight 0:9b3d4731edbb 1131
WFKnight 0:9b3d4731edbb 1132 /**
WFKnight 0:9b3d4731edbb 1133 * Unsigned 64-bit integer.
WFKnight 0:9b3d4731edbb 1134 */
WFKnight 0:9b3d4731edbb 1135 BLE_GATT_FORMAT_UINT64 = 0x0A,
WFKnight 0:9b3d4731edbb 1136
WFKnight 0:9b3d4731edbb 1137 /**
WFKnight 0:9b3d4731edbb 1138 * Unsigned 128-bit integer.
WFKnight 0:9b3d4731edbb 1139 */
WFKnight 0:9b3d4731edbb 1140 BLE_GATT_FORMAT_UINT128 = 0x0B,
WFKnight 0:9b3d4731edbb 1141
WFKnight 0:9b3d4731edbb 1142 /**
WFKnight 0:9b3d4731edbb 1143 * Signed 8-bit integer.
WFKnight 0:9b3d4731edbb 1144 */
WFKnight 0:9b3d4731edbb 1145 BLE_GATT_FORMAT_SINT8 = 0x0C,
WFKnight 0:9b3d4731edbb 1146
WFKnight 0:9b3d4731edbb 1147 /**
WFKnight 0:9b3d4731edbb 1148 * Signed 12-bit integer.
WFKnight 0:9b3d4731edbb 1149 */
WFKnight 0:9b3d4731edbb 1150 BLE_GATT_FORMAT_SINT12 = 0x0D,
WFKnight 0:9b3d4731edbb 1151
WFKnight 0:9b3d4731edbb 1152 /**
WFKnight 0:9b3d4731edbb 1153 * Signed 16-bit integer.
WFKnight 0:9b3d4731edbb 1154 */
WFKnight 0:9b3d4731edbb 1155 BLE_GATT_FORMAT_SINT16 = 0x0E,
WFKnight 0:9b3d4731edbb 1156
WFKnight 0:9b3d4731edbb 1157 /**
WFKnight 0:9b3d4731edbb 1158 * Signed 24-bit integer.
WFKnight 0:9b3d4731edbb 1159 */
WFKnight 0:9b3d4731edbb 1160 BLE_GATT_FORMAT_SINT24 = 0x0F,
WFKnight 0:9b3d4731edbb 1161
WFKnight 0:9b3d4731edbb 1162 /**
WFKnight 0:9b3d4731edbb 1163 * Signed 32-bit integer.
WFKnight 0:9b3d4731edbb 1164 */
WFKnight 0:9b3d4731edbb 1165 BLE_GATT_FORMAT_SINT32 = 0x10,
WFKnight 0:9b3d4731edbb 1166
WFKnight 0:9b3d4731edbb 1167 /**
WFKnight 0:9b3d4731edbb 1168 * Signed 48-bit integer.
WFKnight 0:9b3d4731edbb 1169 */
WFKnight 0:9b3d4731edbb 1170 BLE_GATT_FORMAT_SINT48 = 0x11,
WFKnight 0:9b3d4731edbb 1171
WFKnight 0:9b3d4731edbb 1172 /**
WFKnight 0:9b3d4731edbb 1173 * Signed 64-bit integer.
WFKnight 0:9b3d4731edbb 1174 */
WFKnight 0:9b3d4731edbb 1175 BLE_GATT_FORMAT_SINT64 = 0x12,
WFKnight 0:9b3d4731edbb 1176
WFKnight 0:9b3d4731edbb 1177 /**
WFKnight 0:9b3d4731edbb 1178 * Signed 128-bit integer.
WFKnight 0:9b3d4731edbb 1179 */
WFKnight 0:9b3d4731edbb 1180 BLE_GATT_FORMAT_SINT128 = 0x13,
WFKnight 0:9b3d4731edbb 1181
WFKnight 0:9b3d4731edbb 1182 /**
WFKnight 0:9b3d4731edbb 1183 * IEEE-754 32-bit floating point.
WFKnight 0:9b3d4731edbb 1184 */
WFKnight 0:9b3d4731edbb 1185 BLE_GATT_FORMAT_FLOAT32 = 0x14,
WFKnight 0:9b3d4731edbb 1186
WFKnight 0:9b3d4731edbb 1187 /**
WFKnight 0:9b3d4731edbb 1188 * IEEE-754 64-bit floating point.
WFKnight 0:9b3d4731edbb 1189 */
WFKnight 0:9b3d4731edbb 1190 BLE_GATT_FORMAT_FLOAT64 = 0x15,
WFKnight 0:9b3d4731edbb 1191
WFKnight 0:9b3d4731edbb 1192 /**
WFKnight 0:9b3d4731edbb 1193 * IEEE-11073 16-bit SFLOAT.
WFKnight 0:9b3d4731edbb 1194 */
WFKnight 0:9b3d4731edbb 1195 BLE_GATT_FORMAT_SFLOAT = 0x16,
WFKnight 0:9b3d4731edbb 1196
WFKnight 0:9b3d4731edbb 1197 /**
WFKnight 0:9b3d4731edbb 1198 * IEEE-11073 32-bit FLOAT.
WFKnight 0:9b3d4731edbb 1199 */
WFKnight 0:9b3d4731edbb 1200 BLE_GATT_FORMAT_FLOAT = 0x17,
WFKnight 0:9b3d4731edbb 1201
WFKnight 0:9b3d4731edbb 1202 /**
WFKnight 0:9b3d4731edbb 1203 * IEEE-20601 format.
WFKnight 0:9b3d4731edbb 1204 */
WFKnight 0:9b3d4731edbb 1205 BLE_GATT_FORMAT_DUINT16 = 0x18,
WFKnight 0:9b3d4731edbb 1206
WFKnight 0:9b3d4731edbb 1207 /**
WFKnight 0:9b3d4731edbb 1208 * UTF8 string.
WFKnight 0:9b3d4731edbb 1209 */
WFKnight 0:9b3d4731edbb 1210 BLE_GATT_FORMAT_UTF8S = 0x19,
WFKnight 0:9b3d4731edbb 1211
WFKnight 0:9b3d4731edbb 1212 /**
WFKnight 0:9b3d4731edbb 1213 * UTF16 string.
WFKnight 0:9b3d4731edbb 1214 */
WFKnight 0:9b3d4731edbb 1215 BLE_GATT_FORMAT_UTF16S = 0x1A,
WFKnight 0:9b3d4731edbb 1216
WFKnight 0:9b3d4731edbb 1217 /**
WFKnight 0:9b3d4731edbb 1218 * Opaque Structure.
WFKnight 0:9b3d4731edbb 1219 */
WFKnight 0:9b3d4731edbb 1220 BLE_GATT_FORMAT_STRUCT = 0x1B
WFKnight 0:9b3d4731edbb 1221 };
WFKnight 0:9b3d4731edbb 1222
WFKnight 0:9b3d4731edbb 1223 /*!
WFKnight 0:9b3d4731edbb 1224 * Characteristic properties.
WFKnight 0:9b3d4731edbb 1225 *
WFKnight 0:9b3d4731edbb 1226 * It is a bitfield that determines how a characteristic value can be used.
WFKnight 0:9b3d4731edbb 1227 *
WFKnight 0:9b3d4731edbb 1228 * @note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
WFKnight 0:9b3d4731edbb 1229 * and Section 3.3.3.1 for Extended Properties.
WFKnight 0:9b3d4731edbb 1230 */
WFKnight 0:9b3d4731edbb 1231 enum Properties_t {
WFKnight 0:9b3d4731edbb 1232 /**
WFKnight 0:9b3d4731edbb 1233 * No property defined.
WFKnight 0:9b3d4731edbb 1234 */
WFKnight 0:9b3d4731edbb 1235 BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
WFKnight 0:9b3d4731edbb 1236
WFKnight 0:9b3d4731edbb 1237 /**
WFKnight 0:9b3d4731edbb 1238 * Permits broadcasts of the characteristic value using the Server
WFKnight 0:9b3d4731edbb 1239 * Characteristic Configuration descriptor.
WFKnight 0:9b3d4731edbb 1240 */
WFKnight 0:9b3d4731edbb 1241 BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01,
WFKnight 0:9b3d4731edbb 1242
WFKnight 0:9b3d4731edbb 1243 /**
WFKnight 0:9b3d4731edbb 1244 * Permits reads of the characteristic value.
WFKnight 0:9b3d4731edbb 1245 */
WFKnight 0:9b3d4731edbb 1246 BLE_GATT_CHAR_PROPERTIES_READ = 0x02,
WFKnight 0:9b3d4731edbb 1247
WFKnight 0:9b3d4731edbb 1248 /**
WFKnight 0:9b3d4731edbb 1249 * Permits writes of the characteristic value without response.
WFKnight 0:9b3d4731edbb 1250 */
WFKnight 0:9b3d4731edbb 1251 BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04,
WFKnight 0:9b3d4731edbb 1252
WFKnight 0:9b3d4731edbb 1253 /**
WFKnight 0:9b3d4731edbb 1254 * Permits writes of the characteristic value with response.
WFKnight 0:9b3d4731edbb 1255 */
WFKnight 0:9b3d4731edbb 1256 BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08,
WFKnight 0:9b3d4731edbb 1257
WFKnight 0:9b3d4731edbb 1258 /**
WFKnight 0:9b3d4731edbb 1259 * Permits notifications of a characteristic value without acknowledgment.
WFKnight 0:9b3d4731edbb 1260 */
WFKnight 0:9b3d4731edbb 1261 BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10,
WFKnight 0:9b3d4731edbb 1262
WFKnight 0:9b3d4731edbb 1263 /**
WFKnight 0:9b3d4731edbb 1264 * Permits indications of a characteristic value with acknowledgment.
WFKnight 0:9b3d4731edbb 1265 */
WFKnight 0:9b3d4731edbb 1266 BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20,
WFKnight 0:9b3d4731edbb 1267
WFKnight 0:9b3d4731edbb 1268 /**
WFKnight 0:9b3d4731edbb 1269 * Permits signed writes to the characteristic value.
WFKnight 0:9b3d4731edbb 1270 */
WFKnight 0:9b3d4731edbb 1271 BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40,
WFKnight 0:9b3d4731edbb 1272
WFKnight 0:9b3d4731edbb 1273 /**
WFKnight 0:9b3d4731edbb 1274 * The Characteristic Extended Properties descriptor
WFKnight 0:9b3d4731edbb 1275 * defines additional characteristic properties.
WFKnight 0:9b3d4731edbb 1276 */
WFKnight 0:9b3d4731edbb 1277 BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80
WFKnight 0:9b3d4731edbb 1278 };
WFKnight 0:9b3d4731edbb 1279
WFKnight 0:9b3d4731edbb 1280 /**
WFKnight 0:9b3d4731edbb 1281 * Indicates if the properties has at least one of the writable flags.
WFKnight 0:9b3d4731edbb 1282 *
WFKnight 0:9b3d4731edbb 1283 * @param[in] properties The properties to inspect.
WFKnight 0:9b3d4731edbb 1284 *
WFKnight 0:9b3d4731edbb 1285 * @return True if the properties set at least one of the writable flags and
WFKnight 0:9b3d4731edbb 1286 * false otherwise.
WFKnight 0:9b3d4731edbb 1287 */
WFKnight 0:9b3d4731edbb 1288 static bool isWritable(uint8_t properties)
WFKnight 0:9b3d4731edbb 1289 {
WFKnight 0:9b3d4731edbb 1290 const uint8_t writable =
WFKnight 0:9b3d4731edbb 1291 BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE |
WFKnight 0:9b3d4731edbb 1292 BLE_GATT_CHAR_PROPERTIES_WRITE |
WFKnight 0:9b3d4731edbb 1293 BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES;
WFKnight 0:9b3d4731edbb 1294
WFKnight 0:9b3d4731edbb 1295 return properties & writable;
WFKnight 0:9b3d4731edbb 1296 }
WFKnight 0:9b3d4731edbb 1297
WFKnight 0:9b3d4731edbb 1298 /**
WFKnight 0:9b3d4731edbb 1299 * Indicates if the properties is readable.
WFKnight 0:9b3d4731edbb 1300 *
WFKnight 0:9b3d4731edbb 1301 * @param[in] properties The properties to inspect.
WFKnight 0:9b3d4731edbb 1302 *
WFKnight 0:9b3d4731edbb 1303 * @return True if the properties has its readable flag set and false
WFKnight 0:9b3d4731edbb 1304 * otherwise.
WFKnight 0:9b3d4731edbb 1305 */
WFKnight 0:9b3d4731edbb 1306 static bool isReadable(uint8_t properties)
WFKnight 0:9b3d4731edbb 1307 {
WFKnight 0:9b3d4731edbb 1308 const uint8_t readable = BLE_GATT_CHAR_PROPERTIES_READ;
WFKnight 0:9b3d4731edbb 1309 return properties & readable;
WFKnight 0:9b3d4731edbb 1310 }
WFKnight 0:9b3d4731edbb 1311
WFKnight 0:9b3d4731edbb 1312 /**
WFKnight 0:9b3d4731edbb 1313 * Value of a Characteristic Presentation Format descriptor.
WFKnight 0:9b3d4731edbb 1314 *
WFKnight 0:9b3d4731edbb 1315 * Characteristic Presentation Format descriptor expresses the format of a
WFKnight 0:9b3d4731edbb 1316 * characteristic value.
WFKnight 0:9b3d4731edbb 1317 *
WFKnight 0:9b3d4731edbb 1318 * @note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.
WFKnight 0:9b3d4731edbb 1319 */
WFKnight 0:9b3d4731edbb 1320 struct PresentationFormat_t {
WFKnight 0:9b3d4731edbb 1321 /**
WFKnight 0:9b3d4731edbb 1322 * Format of the value.
WFKnight 0:9b3d4731edbb 1323 */
WFKnight 0:9b3d4731edbb 1324 uint8_t gatt_format;
WFKnight 0:9b3d4731edbb 1325
WFKnight 0:9b3d4731edbb 1326 /**
WFKnight 0:9b3d4731edbb 1327 * Exponent for integer data types.
WFKnight 0:9b3d4731edbb 1328 *
WFKnight 0:9b3d4731edbb 1329 * Example: if Exponent = -3 and the char value is 3892, the actual
WFKnight 0:9b3d4731edbb 1330 * value is 3.892
WFKnight 0:9b3d4731edbb 1331 */
WFKnight 0:9b3d4731edbb 1332 int8_t exponent;
WFKnight 0:9b3d4731edbb 1333
WFKnight 0:9b3d4731edbb 1334 /**
WFKnight 0:9b3d4731edbb 1335 * Unit of the characteristic value.
WFKnight 0:9b3d4731edbb 1336 *
WFKnight 0:9b3d4731edbb 1337 * It is a UUID from Bluetooth Assigned Numbers.
WFKnight 0:9b3d4731edbb 1338 */
WFKnight 0:9b3d4731edbb 1339 uint16_t gatt_unit;
WFKnight 0:9b3d4731edbb 1340
WFKnight 0:9b3d4731edbb 1341 /**
WFKnight 0:9b3d4731edbb 1342 * Namespace of the description field.
WFKnight 0:9b3d4731edbb 1343 *
WFKnight 0:9b3d4731edbb 1344 * This field identifies the organization that is responsible for
WFKnight 0:9b3d4731edbb 1345 * defining the enumerations for the description field.
WFKnight 0:9b3d4731edbb 1346 *
WFKnight 0:9b3d4731edbb 1347 * The namespace of the Bluetooth Body is 0x01.
WFKnight 0:9b3d4731edbb 1348 */
WFKnight 0:9b3d4731edbb 1349 uint8_t gatt_namespace;
WFKnight 0:9b3d4731edbb 1350
WFKnight 0:9b3d4731edbb 1351 /**
WFKnight 0:9b3d4731edbb 1352 * Description.
WFKnight 0:9b3d4731edbb 1353 *
WFKnight 0:9b3d4731edbb 1354 * @note The value 0x0000 means unknown in the Bluetooth namespace.
WFKnight 0:9b3d4731edbb 1355 */
WFKnight 0:9b3d4731edbb 1356 uint16_t gatt_nsdesc;
WFKnight 0:9b3d4731edbb 1357
WFKnight 0:9b3d4731edbb 1358 };
WFKnight 0:9b3d4731edbb 1359
WFKnight 0:9b3d4731edbb 1360 /**
WFKnight 0:9b3d4731edbb 1361 * Security level applied to GATT operations.
WFKnight 0:9b3d4731edbb 1362 */
WFKnight 0:9b3d4731edbb 1363 typedef ble::att_security_requirement_t SecurityRequirement_t;
WFKnight 0:9b3d4731edbb 1364
WFKnight 0:9b3d4731edbb 1365 /**
WFKnight 0:9b3d4731edbb 1366 * @brief Constructs a new GattCharacteristic.
WFKnight 0:9b3d4731edbb 1367 *
WFKnight 0:9b3d4731edbb 1368 * @param[in] uuid The UUID of this characteristic.
WFKnight 0:9b3d4731edbb 1369 * @param[in] valuePtr Memory buffer holding the initial value. The value is
WFKnight 0:9b3d4731edbb 1370 * copied into the Bluetooth subsytem when the enclosing service is added.
WFKnight 0:9b3d4731edbb 1371 * Thereafter, the stack maintains it internally.
WFKnight 0:9b3d4731edbb 1372 * @param[in] len The length in bytes of this characteristic's value.
WFKnight 0:9b3d4731edbb 1373 * @param[in] maxLen The capacity in bytes of the characteristic value
WFKnight 0:9b3d4731edbb 1374 * buffer.
WFKnight 0:9b3d4731edbb 1375 * @param[in] props An 8-bit field that contains the characteristic's
WFKnight 0:9b3d4731edbb 1376 * properties.
WFKnight 0:9b3d4731edbb 1377 * @param[in] descriptors A pointer to an array of descriptors to be included
WFKnight 0:9b3d4731edbb 1378 * within this characteristic. The caller owns the memory for the descriptor
WFKnight 0:9b3d4731edbb 1379 * array, which must remain valid at least until the enclosing service is
WFKnight 0:9b3d4731edbb 1380 * added to the GATT table.
WFKnight 0:9b3d4731edbb 1381 * @param[in] numDescriptors The number of descriptors presents in @p
WFKnight 0:9b3d4731edbb 1382 * descriptors array.
WFKnight 0:9b3d4731edbb 1383 * @param[in] hasVariableLen Flag that indicates if the attribute's value
WFKnight 0:9b3d4731edbb 1384 * length can change throughout time.
WFKnight 0:9b3d4731edbb 1385 *
WFKnight 0:9b3d4731edbb 1386 * @note If valuePtr is NULL, length is equal to 0 and the characteristic
WFKnight 0:9b3d4731edbb 1387 * is readable, then that particular characteristic may be considered
WFKnight 0:9b3d4731edbb 1388 * optional and dropped while instantiating the service with the underlying
WFKnight 0:9b3d4731edbb 1389 * BLE stack.
WFKnight 0:9b3d4731edbb 1390 *
WFKnight 0:9b3d4731edbb 1391 * @note A Client Characteristic Configuration Descriptor (CCCD) should not
WFKnight 0:9b3d4731edbb 1392 * be allocated if either the notify or indicate flag in the @p props bit
WFKnight 0:9b3d4731edbb 1393 * field; the underlying BLE stack handles it.
WFKnight 0:9b3d4731edbb 1394 *
WFKnight 0:9b3d4731edbb 1395 * @attention GattCharacteristic registered in a GattServer must remain
WFKnight 0:9b3d4731edbb 1396 * valid for the lifetime of the GattServer.
WFKnight 0:9b3d4731edbb 1397 */
WFKnight 0:9b3d4731edbb 1398 GattCharacteristic(
WFKnight 0:9b3d4731edbb 1399 const UUID &uuid,
WFKnight 0:9b3d4731edbb 1400 uint8_t *valuePtr = NULL,
WFKnight 0:9b3d4731edbb 1401 uint16_t len = 0,
WFKnight 0:9b3d4731edbb 1402 uint16_t maxLen = 0,
WFKnight 0:9b3d4731edbb 1403 uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 1404 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 1405 unsigned numDescriptors = 0,
WFKnight 0:9b3d4731edbb 1406 bool hasVariableLen = true
WFKnight 0:9b3d4731edbb 1407 ) : _valueAttribute(uuid, valuePtr, len, maxLen, hasVariableLen),
WFKnight 0:9b3d4731edbb 1408 _properties(props),
WFKnight 0:9b3d4731edbb 1409 _descriptors(descriptors),
WFKnight 0:9b3d4731edbb 1410 _descriptorCount(numDescriptors),
WFKnight 0:9b3d4731edbb 1411 readAuthorizationCallback(),
WFKnight 0:9b3d4731edbb 1412 writeAuthorizationCallback(),
WFKnight 0:9b3d4731edbb 1413 _update_security(SecurityRequirement_t::NONE) {
WFKnight 0:9b3d4731edbb 1414 _valueAttribute.allowWrite(isWritable(_properties));
WFKnight 0:9b3d4731edbb 1415 _valueAttribute.allowRead(isReadable(_properties));
WFKnight 0:9b3d4731edbb 1416
WFKnight 0:9b3d4731edbb 1417 // signed writes requires at least an unauthenticated CSRK or an
WFKnight 0:9b3d4731edbb 1418 // unauthenticated ltk if the link is encrypted.
WFKnight 0:9b3d4731edbb 1419 if (_properties & BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES) {
WFKnight 0:9b3d4731edbb 1420 _valueAttribute.setWriteSecurityRequirement(
WFKnight 0:9b3d4731edbb 1421 SecurityRequirement_t::UNAUTHENTICATED
WFKnight 0:9b3d4731edbb 1422 );
WFKnight 0:9b3d4731edbb 1423 }
WFKnight 0:9b3d4731edbb 1424 }
WFKnight 0:9b3d4731edbb 1425
WFKnight 0:9b3d4731edbb 1426 public:
WFKnight 0:9b3d4731edbb 1427 /**
WFKnight 0:9b3d4731edbb 1428 * Set up the minimum security (mode and level) requirements for access to
WFKnight 0:9b3d4731edbb 1429 * the characteristic's value attribute.
WFKnight 0:9b3d4731edbb 1430 *
WFKnight 0:9b3d4731edbb 1431 * @param[in] securityMode Can be one of encryption or signing, with or
WFKnight 0:9b3d4731edbb 1432 * without protection for man in the middle attacks (MITM).
WFKnight 0:9b3d4731edbb 1433 *
WFKnight 0:9b3d4731edbb 1434 * @deprecated Fine grained security check has been added to with mbed OS
WFKnight 0:9b3d4731edbb 1435 * 5.9. It is possible to set independently security requirements for read,
WFKnight 0:9b3d4731edbb 1436 * write and update operations. In the meantime SecurityManager::SecurityMode_t
WFKnight 0:9b3d4731edbb 1437 * is not used anymore to represent security requirements as it maps
WFKnight 0:9b3d4731edbb 1438 * incorrectly the Bluetooth standard.
WFKnight 0:9b3d4731edbb 1439 */
WFKnight 0:9b3d4731edbb 1440 MBED_DEPRECATED_SINCE(
WFKnight 0:9b3d4731edbb 1441 "mbed-os-5.9",
WFKnight 0:9b3d4731edbb 1442 "Use setWriteSecurityRequirements, setReadSecurityRequirements and "
WFKnight 0:9b3d4731edbb 1443 "setUpdateSecurityRequirements"
WFKnight 0:9b3d4731edbb 1444 )
WFKnight 0:9b3d4731edbb 1445 void requireSecurity(SecurityManager::SecurityMode_t securityMode)
WFKnight 0:9b3d4731edbb 1446 {
WFKnight 0:9b3d4731edbb 1447 SecurityRequirement_t sec_requirements = SecurityModeToAttSecurity(securityMode);
WFKnight 0:9b3d4731edbb 1448
WFKnight 0:9b3d4731edbb 1449 _valueAttribute.setReadSecurityRequirement(sec_requirements);
WFKnight 0:9b3d4731edbb 1450 _valueAttribute.setWriteSecurityRequirement(sec_requirements);
WFKnight 0:9b3d4731edbb 1451 _update_security = sec_requirements.value();
WFKnight 0:9b3d4731edbb 1452 }
WFKnight 0:9b3d4731edbb 1453
WFKnight 0:9b3d4731edbb 1454 /**
WFKnight 0:9b3d4731edbb 1455 * Set all security requirements of the characteristic.
WFKnight 0:9b3d4731edbb 1456 *
WFKnight 0:9b3d4731edbb 1457 * @param read_security The security requirement of the read operations.
WFKnight 0:9b3d4731edbb 1458 * @param write_security The security requirement of write operations.
WFKnight 0:9b3d4731edbb 1459 * @param update_security The security requirement of update operations.
WFKnight 0:9b3d4731edbb 1460 */
WFKnight 0:9b3d4731edbb 1461 void setSecurityRequirements(
WFKnight 0:9b3d4731edbb 1462 SecurityRequirement_t read_security,
WFKnight 0:9b3d4731edbb 1463 SecurityRequirement_t write_security,
WFKnight 0:9b3d4731edbb 1464 SecurityRequirement_t update_security
WFKnight 0:9b3d4731edbb 1465 ) {
WFKnight 0:9b3d4731edbb 1466 setReadSecurityRequirement(read_security);
WFKnight 0:9b3d4731edbb 1467 setWriteSecurityRequirement(write_security);
WFKnight 0:9b3d4731edbb 1468 setUpdateSecurityRequirement(update_security);
WFKnight 0:9b3d4731edbb 1469 }
WFKnight 0:9b3d4731edbb 1470
WFKnight 0:9b3d4731edbb 1471 /**
WFKnight 0:9b3d4731edbb 1472 * Set the security of the read operation.
WFKnight 0:9b3d4731edbb 1473 *
WFKnight 0:9b3d4731edbb 1474 * @param[in] security The security requirement of the read operation.
WFKnight 0:9b3d4731edbb 1475 */
WFKnight 0:9b3d4731edbb 1476 void setReadSecurityRequirement(SecurityRequirement_t security)
WFKnight 0:9b3d4731edbb 1477 {
WFKnight 0:9b3d4731edbb 1478 _valueAttribute.setReadSecurityRequirement(security);
WFKnight 0:9b3d4731edbb 1479 }
WFKnight 0:9b3d4731edbb 1480
WFKnight 0:9b3d4731edbb 1481 /**
WFKnight 0:9b3d4731edbb 1482 * Get the security requirement of the read operation.
WFKnight 0:9b3d4731edbb 1483 *
WFKnight 0:9b3d4731edbb 1484 * @return The security requirement of the read operation.
WFKnight 0:9b3d4731edbb 1485 */
WFKnight 0:9b3d4731edbb 1486 SecurityRequirement_t getReadSecurityRequirement() const
WFKnight 0:9b3d4731edbb 1487 {
WFKnight 0:9b3d4731edbb 1488 return _valueAttribute.getReadSecurityRequirement();
WFKnight 0:9b3d4731edbb 1489 }
WFKnight 0:9b3d4731edbb 1490
WFKnight 0:9b3d4731edbb 1491 /**
WFKnight 0:9b3d4731edbb 1492 * Set the security requirement of the write operations.
WFKnight 0:9b3d4731edbb 1493 *
WFKnight 0:9b3d4731edbb 1494 * @note If the signed write flag is set in the characteristic properties
WFKnight 0:9b3d4731edbb 1495 * then the security requirement applied to write operation must be either
WFKnight 0:9b3d4731edbb 1496 * AUTHENTICATED or UNAUTHENTICATED. Security requirements NONE and
WFKnight 0:9b3d4731edbb 1497 * SC_AUTHENTICATED are not applicable to signing operation.
WFKnight 0:9b3d4731edbb 1498 *
WFKnight 0:9b3d4731edbb 1499 * @param[in] security The security requirement of write operations.
WFKnight 0:9b3d4731edbb 1500 */
WFKnight 0:9b3d4731edbb 1501 void setWriteSecurityRequirement(SecurityRequirement_t security)
WFKnight 0:9b3d4731edbb 1502 {
WFKnight 0:9b3d4731edbb 1503 MBED_ASSERT(
WFKnight 0:9b3d4731edbb 1504 ((_properties & BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES) &&
WFKnight 0:9b3d4731edbb 1505 ((security == SecurityRequirement_t::NONE) ||
WFKnight 0:9b3d4731edbb 1506 (security == SecurityRequirement_t::SC_AUTHENTICATED))) == false
WFKnight 0:9b3d4731edbb 1507 );
WFKnight 0:9b3d4731edbb 1508 _valueAttribute.setWriteSecurityRequirement(security);
WFKnight 0:9b3d4731edbb 1509 }
WFKnight 0:9b3d4731edbb 1510
WFKnight 0:9b3d4731edbb 1511 /**
WFKnight 0:9b3d4731edbb 1512 * Get the security requirement of write operations.
WFKnight 0:9b3d4731edbb 1513 *
WFKnight 0:9b3d4731edbb 1514 * @return The security requirement of write operations.
WFKnight 0:9b3d4731edbb 1515 */
WFKnight 0:9b3d4731edbb 1516 SecurityRequirement_t getWriteSecurityRequirement() const
WFKnight 0:9b3d4731edbb 1517 {
WFKnight 0:9b3d4731edbb 1518 return _valueAttribute.getWriteSecurityRequirement();
WFKnight 0:9b3d4731edbb 1519 }
WFKnight 0:9b3d4731edbb 1520
WFKnight 0:9b3d4731edbb 1521 /**
WFKnight 0:9b3d4731edbb 1522 * Set the security requirement of update operations.
WFKnight 0:9b3d4731edbb 1523 *
WFKnight 0:9b3d4731edbb 1524 * @note This security requirement is also applied to the write operation of
WFKnight 0:9b3d4731edbb 1525 * the Client Characteristic Configuration Descriptor.
WFKnight 0:9b3d4731edbb 1526 *
WFKnight 0:9b3d4731edbb 1527 * @param[in] security The security requirement that must be met to send
WFKnight 0:9b3d4731edbb 1528 * updates and accept write of the CCCD.
WFKnight 0:9b3d4731edbb 1529 */
WFKnight 0:9b3d4731edbb 1530 void setUpdateSecurityRequirement(SecurityRequirement_t security)
WFKnight 0:9b3d4731edbb 1531 {
WFKnight 0:9b3d4731edbb 1532 _update_security = security.value();
WFKnight 0:9b3d4731edbb 1533 }
WFKnight 0:9b3d4731edbb 1534
WFKnight 0:9b3d4731edbb 1535 /**
WFKnight 0:9b3d4731edbb 1536 * Get the security requirement of update operations.
WFKnight 0:9b3d4731edbb 1537 *
WFKnight 0:9b3d4731edbb 1538 * @note This security requirement is also applied to the write operation of
WFKnight 0:9b3d4731edbb 1539 * the Client Characteristic Configuration Descriptor.
WFKnight 0:9b3d4731edbb 1540 *
WFKnight 0:9b3d4731edbb 1541 * @return The security requirement that must be met to send updates and
WFKnight 0:9b3d4731edbb 1542 * accept write of the CCCD.
WFKnight 0:9b3d4731edbb 1543 */
WFKnight 0:9b3d4731edbb 1544 SecurityRequirement_t getUpdateSecurityRequirement() const
WFKnight 0:9b3d4731edbb 1545 {
WFKnight 0:9b3d4731edbb 1546 return static_cast<SecurityRequirement_t::type>(_update_security);
WFKnight 0:9b3d4731edbb 1547 }
WFKnight 0:9b3d4731edbb 1548
WFKnight 0:9b3d4731edbb 1549 public:
WFKnight 0:9b3d4731edbb 1550 /**
WFKnight 0:9b3d4731edbb 1551 * Register a callback handling client's write requests or commands.
WFKnight 0:9b3d4731edbb 1552 *
WFKnight 0:9b3d4731edbb 1553 * The callback registered is invoked when the client attempts to write the
WFKnight 0:9b3d4731edbb 1554 * characteristic value; the event handler can accept or reject the write
WFKnight 0:9b3d4731edbb 1555 * request with the appropriate error code.
WFKnight 0:9b3d4731edbb 1556 *
WFKnight 0:9b3d4731edbb 1557 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 1558 */
WFKnight 0:9b3d4731edbb 1559 void setWriteAuthorizationCallback(
WFKnight 0:9b3d4731edbb 1560 void (*callback)(GattWriteAuthCallbackParams *)
WFKnight 0:9b3d4731edbb 1561 ) {
WFKnight 0:9b3d4731edbb 1562 writeAuthorizationCallback.attach(callback);
WFKnight 0:9b3d4731edbb 1563 }
WFKnight 0:9b3d4731edbb 1564
WFKnight 0:9b3d4731edbb 1565 /**
WFKnight 0:9b3d4731edbb 1566 * Register a callback handling client's write requests or commands.
WFKnight 0:9b3d4731edbb 1567 *
WFKnight 0:9b3d4731edbb 1568 * The callback registered is invoked when the client attempts to write the
WFKnight 0:9b3d4731edbb 1569 * characteristic value; the event handler can accept or reject the write
WFKnight 0:9b3d4731edbb 1570 * request with the appropriate error code.
WFKnight 0:9b3d4731edbb 1571 *
WFKnight 0:9b3d4731edbb 1572 * @param[in] object Pointer to the object of a class defining the event
WFKnight 0:9b3d4731edbb 1573 * handler (@p member). It must remain valid for the lifetime of the
WFKnight 0:9b3d4731edbb 1574 * GattCharacteristic.
WFKnight 0:9b3d4731edbb 1575 * @param[in] member The member function that handles the write event.
WFKnight 0:9b3d4731edbb 1576 */
WFKnight 0:9b3d4731edbb 1577 template <typename T>
WFKnight 0:9b3d4731edbb 1578 void setWriteAuthorizationCallback(
WFKnight 0:9b3d4731edbb 1579 T *object,
WFKnight 0:9b3d4731edbb 1580 void (T::*member)(GattWriteAuthCallbackParams *)
WFKnight 0:9b3d4731edbb 1581 ) {
WFKnight 0:9b3d4731edbb 1582 writeAuthorizationCallback.attach(object, member);
WFKnight 0:9b3d4731edbb 1583 }
WFKnight 0:9b3d4731edbb 1584
WFKnight 0:9b3d4731edbb 1585 /**
WFKnight 0:9b3d4731edbb 1586 * Register the read requests event handler.
WFKnight 0:9b3d4731edbb 1587 *
WFKnight 0:9b3d4731edbb 1588 * The callback registered is invoked when the client attempts to read the
WFKnight 0:9b3d4731edbb 1589 * characteristic value; the event handler can accept or reject the read
WFKnight 0:9b3d4731edbb 1590 * request with the appropriate error code. It can also set specific outgoing
WFKnight 0:9b3d4731edbb 1591 * data.
WFKnight 0:9b3d4731edbb 1592 *
WFKnight 0:9b3d4731edbb 1593 * @param[in] callback Event handler being registered.
WFKnight 0:9b3d4731edbb 1594 */
WFKnight 0:9b3d4731edbb 1595 void setReadAuthorizationCallback(
WFKnight 0:9b3d4731edbb 1596 void (*callback)(GattReadAuthCallbackParams *)
WFKnight 0:9b3d4731edbb 1597 ) {
WFKnight 0:9b3d4731edbb 1598 readAuthorizationCallback.attach(callback);
WFKnight 0:9b3d4731edbb 1599 }
WFKnight 0:9b3d4731edbb 1600
WFKnight 0:9b3d4731edbb 1601 /**
WFKnight 0:9b3d4731edbb 1602 * Register the read requests event handler.
WFKnight 0:9b3d4731edbb 1603 *
WFKnight 0:9b3d4731edbb 1604 * The callback registered is invoked when the client attempts to read the
WFKnight 0:9b3d4731edbb 1605 * characteristic value; the event handler can accept or reject the read
WFKnight 0:9b3d4731edbb 1606 * request with the appropriate error code. It can also set specific outgoing
WFKnight 0:9b3d4731edbb 1607 * data.
WFKnight 0:9b3d4731edbb 1608 *
WFKnight 0:9b3d4731edbb 1609 * @param[in] object Pointer to the object of a class defining the event
WFKnight 0:9b3d4731edbb 1610 * handler (@p member). It must remain valid for the lifetime of the
WFKnight 0:9b3d4731edbb 1611 * GattCharacteristic.
WFKnight 0:9b3d4731edbb 1612 * @param[in] member The member function that handles the read event.
WFKnight 0:9b3d4731edbb 1613 */
WFKnight 0:9b3d4731edbb 1614 template <typename T>
WFKnight 0:9b3d4731edbb 1615 void setReadAuthorizationCallback(
WFKnight 0:9b3d4731edbb 1616 T *object,
WFKnight 0:9b3d4731edbb 1617 void (T::*member)(GattReadAuthCallbackParams *)
WFKnight 0:9b3d4731edbb 1618 ) {
WFKnight 0:9b3d4731edbb 1619 readAuthorizationCallback.attach(object, member);
WFKnight 0:9b3d4731edbb 1620 }
WFKnight 0:9b3d4731edbb 1621
WFKnight 0:9b3d4731edbb 1622 /**
WFKnight 0:9b3d4731edbb 1623 * Invoke the write authorization callback.
WFKnight 0:9b3d4731edbb 1624 *
WFKnight 0:9b3d4731edbb 1625 * This function is a helper that calls the registered write handler to
WFKnight 0:9b3d4731edbb 1626 * determine the authorization reply for a write request.
WFKnight 0:9b3d4731edbb 1627 *
WFKnight 0:9b3d4731edbb 1628 * @attention This function is not meant to be called by user code.
WFKnight 0:9b3d4731edbb 1629 *
WFKnight 0:9b3d4731edbb 1630 * @param[in] params Context of the write-auth request; it contains an
WFKnight 0:9b3d4731edbb 1631 * out-parameter used as a reply.
WFKnight 0:9b3d4731edbb 1632 *
WFKnight 0:9b3d4731edbb 1633 * @return A GattAuthCallbackReply_t value indicating whether authorization
WFKnight 0:9b3d4731edbb 1634 * is granted.
WFKnight 0:9b3d4731edbb 1635 */
WFKnight 0:9b3d4731edbb 1636 GattAuthCallbackReply_t authorizeWrite(GattWriteAuthCallbackParams *params)
WFKnight 0:9b3d4731edbb 1637 {
WFKnight 0:9b3d4731edbb 1638 if (!isWriteAuthorizationEnabled()) {
WFKnight 0:9b3d4731edbb 1639 return AUTH_CALLBACK_REPLY_SUCCESS;
WFKnight 0:9b3d4731edbb 1640 }
WFKnight 0:9b3d4731edbb 1641
WFKnight 0:9b3d4731edbb 1642 /* Initialized to no-error by default. */
WFKnight 0:9b3d4731edbb 1643 params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
WFKnight 0:9b3d4731edbb 1644 writeAuthorizationCallback.call(params);
WFKnight 0:9b3d4731edbb 1645 return params->authorizationReply;
WFKnight 0:9b3d4731edbb 1646 }
WFKnight 0:9b3d4731edbb 1647
WFKnight 0:9b3d4731edbb 1648 /**
WFKnight 0:9b3d4731edbb 1649 * Invoke the read authorization callback.
WFKnight 0:9b3d4731edbb 1650 *
WFKnight 0:9b3d4731edbb 1651 * This function is a helper that calls the registered read handler to
WFKnight 0:9b3d4731edbb 1652 * determine the authorization reply for a read request.
WFKnight 0:9b3d4731edbb 1653 *
WFKnight 0:9b3d4731edbb 1654 * @attention This function is not meant to be called by user code.
WFKnight 0:9b3d4731edbb 1655 *
WFKnight 0:9b3d4731edbb 1656 * @param[in] params Context of the read-auth request; it contains an
WFKnight 0:9b3d4731edbb 1657 * out-parameter used as a reply and the handler can fill it with outgoing
WFKnight 0:9b3d4731edbb 1658 * data.
WFKnight 0:9b3d4731edbb 1659 *
WFKnight 0:9b3d4731edbb 1660 * @return A GattAuthCallbackReply_t value indicating whether authorization
WFKnight 0:9b3d4731edbb 1661 * is granted.
WFKnight 0:9b3d4731edbb 1662 *
WFKnight 0:9b3d4731edbb 1663 * @note If the read request is approved and params->data remains NULL, then
WFKnight 0:9b3d4731edbb 1664 * the current characteristic value is used in the read response payload.
WFKnight 0:9b3d4731edbb 1665 *
WFKnight 0:9b3d4731edbb 1666 * @note If the read is approved, the event handler can specify an outgoing
WFKnight 0:9b3d4731edbb 1667 * value directly with the help of the fields
WFKnight 0:9b3d4731edbb 1668 * GattReadAuthCallbackParams::data and GattReadAuthCallbackParams::len.
WFKnight 0:9b3d4731edbb 1669 */
WFKnight 0:9b3d4731edbb 1670 GattAuthCallbackReply_t authorizeRead(GattReadAuthCallbackParams *params)
WFKnight 0:9b3d4731edbb 1671 {
WFKnight 0:9b3d4731edbb 1672 if (!isReadAuthorizationEnabled()) {
WFKnight 0:9b3d4731edbb 1673 return AUTH_CALLBACK_REPLY_SUCCESS;
WFKnight 0:9b3d4731edbb 1674 }
WFKnight 0:9b3d4731edbb 1675
WFKnight 0:9b3d4731edbb 1676 /* Initialized to no-error by default. */
WFKnight 0:9b3d4731edbb 1677 params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
WFKnight 0:9b3d4731edbb 1678 readAuthorizationCallback.call(params);
WFKnight 0:9b3d4731edbb 1679 return params->authorizationReply;
WFKnight 0:9b3d4731edbb 1680 }
WFKnight 0:9b3d4731edbb 1681
WFKnight 0:9b3d4731edbb 1682 public:
WFKnight 0:9b3d4731edbb 1683 /**
WFKnight 0:9b3d4731edbb 1684 * Get the characteristic's value attribute.
WFKnight 0:9b3d4731edbb 1685 *
WFKnight 0:9b3d4731edbb 1686 * @return A reference to the characteristic's value attribute.
WFKnight 0:9b3d4731edbb 1687 */
WFKnight 0:9b3d4731edbb 1688 GattAttribute& getValueAttribute()
WFKnight 0:9b3d4731edbb 1689 {
WFKnight 0:9b3d4731edbb 1690 return _valueAttribute;
WFKnight 0:9b3d4731edbb 1691 }
WFKnight 0:9b3d4731edbb 1692
WFKnight 0:9b3d4731edbb 1693 /**
WFKnight 0:9b3d4731edbb 1694 * Get the characteristic's value attribute.
WFKnight 0:9b3d4731edbb 1695 *
WFKnight 0:9b3d4731edbb 1696 * @return A const reference to the characteristic's value attribute.
WFKnight 0:9b3d4731edbb 1697 */
WFKnight 0:9b3d4731edbb 1698 const GattAttribute& getValueAttribute() const
WFKnight 0:9b3d4731edbb 1699 {
WFKnight 0:9b3d4731edbb 1700 return _valueAttribute;
WFKnight 0:9b3d4731edbb 1701 }
WFKnight 0:9b3d4731edbb 1702
WFKnight 0:9b3d4731edbb 1703 /**
WFKnight 0:9b3d4731edbb 1704 * Get the characteristic's value attribute handle in the ATT table.
WFKnight 0:9b3d4731edbb 1705 *
WFKnight 0:9b3d4731edbb 1706 * @return The value attribute handle.
WFKnight 0:9b3d4731edbb 1707 *
WFKnight 0:9b3d4731edbb 1708 * @note The underlying BLE stack assigns the attribute handle when the
WFKnight 0:9b3d4731edbb 1709 * enclosing service is added.
WFKnight 0:9b3d4731edbb 1710 */
WFKnight 0:9b3d4731edbb 1711 GattAttribute::Handle_t getValueHandle(void) const
WFKnight 0:9b3d4731edbb 1712 {
WFKnight 0:9b3d4731edbb 1713 return getValueAttribute().getHandle();
WFKnight 0:9b3d4731edbb 1714 }
WFKnight 0:9b3d4731edbb 1715
WFKnight 0:9b3d4731edbb 1716 /**
WFKnight 0:9b3d4731edbb 1717 * Get the characteristic's properties.
WFKnight 0:9b3d4731edbb 1718 *
WFKnight 0:9b3d4731edbb 1719 * @note Refer to GattCharacteristic::Properties_t.
WFKnight 0:9b3d4731edbb 1720 *
WFKnight 0:9b3d4731edbb 1721 * @return The characteristic's properties.
WFKnight 0:9b3d4731edbb 1722 */
WFKnight 0:9b3d4731edbb 1723 uint8_t getProperties(void) const
WFKnight 0:9b3d4731edbb 1724 {
WFKnight 0:9b3d4731edbb 1725 return _properties;
WFKnight 0:9b3d4731edbb 1726 }
WFKnight 0:9b3d4731edbb 1727
WFKnight 0:9b3d4731edbb 1728 /**
WFKnight 0:9b3d4731edbb 1729 * Get the characteristic's required security.
WFKnight 0:9b3d4731edbb 1730 *
WFKnight 0:9b3d4731edbb 1731 * @return The characteristic's required security.
WFKnight 0:9b3d4731edbb 1732 *
WFKnight 0:9b3d4731edbb 1733 * @deprecated Fine grained security check has been added to with mbed OS
WFKnight 0:9b3d4731edbb 1734 * 5.9. It is possible to set independently security requirements for read,
WFKnight 0:9b3d4731edbb 1735 * write and update operations. In the meantime SecurityManager::SecurityMode_t
WFKnight 0:9b3d4731edbb 1736 * is not used anymore to represent security requirements as it maps
WFKnight 0:9b3d4731edbb 1737 * incorrectly the Bluetooth standard.
WFKnight 0:9b3d4731edbb 1738 */
WFKnight 0:9b3d4731edbb 1739 MBED_DEPRECATED_SINCE(
WFKnight 0:9b3d4731edbb 1740 "mbed-os-5.9",
WFKnight 0:9b3d4731edbb 1741 "Use getWriteSecurityRequirements, getReadSecurityRequirements and "
WFKnight 0:9b3d4731edbb 1742 "getUpdateSecurityRequirements"
WFKnight 0:9b3d4731edbb 1743 )
WFKnight 0:9b3d4731edbb 1744 SecurityManager::SecurityMode_t getRequiredSecurity() const
WFKnight 0:9b3d4731edbb 1745 {
WFKnight 0:9b3d4731edbb 1746 SecurityRequirement_t max_sec = std::max(
WFKnight 0:9b3d4731edbb 1747 std::max(
WFKnight 0:9b3d4731edbb 1748 getReadSecurityRequirement(),
WFKnight 0:9b3d4731edbb 1749 getWriteSecurityRequirement()
WFKnight 0:9b3d4731edbb 1750 ),
WFKnight 0:9b3d4731edbb 1751 getUpdateSecurityRequirement()
WFKnight 0:9b3d4731edbb 1752 );
WFKnight 0:9b3d4731edbb 1753
WFKnight 0:9b3d4731edbb 1754 bool needs_signing =
WFKnight 0:9b3d4731edbb 1755 _properties & BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES;
WFKnight 0:9b3d4731edbb 1756
WFKnight 0:9b3d4731edbb 1757 switch(max_sec.value()) {
WFKnight 0:9b3d4731edbb 1758 case SecurityRequirement_t::NONE:
WFKnight 0:9b3d4731edbb 1759 MBED_ASSERT(needs_signing == false);
WFKnight 0:9b3d4731edbb 1760 return SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK;
WFKnight 0:9b3d4731edbb 1761
WFKnight 0:9b3d4731edbb 1762 case SecurityRequirement_t::UNAUTHENTICATED:
WFKnight 0:9b3d4731edbb 1763 return (needs_signing) ?
WFKnight 0:9b3d4731edbb 1764 SecurityManager::SECURITY_MODE_SIGNED_NO_MITM :
WFKnight 0:9b3d4731edbb 1765 SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM;
WFKnight 0:9b3d4731edbb 1766
WFKnight 0:9b3d4731edbb 1767 case SecurityRequirement_t::AUTHENTICATED:
WFKnight 0:9b3d4731edbb 1768 return (needs_signing) ?
WFKnight 0:9b3d4731edbb 1769 SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM :
WFKnight 0:9b3d4731edbb 1770 SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM;
WFKnight 0:9b3d4731edbb 1771
WFKnight 0:9b3d4731edbb 1772 case SecurityRequirement_t::SC_AUTHENTICATED:
WFKnight 0:9b3d4731edbb 1773 MBED_ASSERT(needs_signing == false);
WFKnight 0:9b3d4731edbb 1774 // fallback to encryption with MITM
WFKnight 0:9b3d4731edbb 1775 return SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM;
WFKnight 0:9b3d4731edbb 1776 default:
WFKnight 0:9b3d4731edbb 1777 MBED_ASSERT(false);
WFKnight 0:9b3d4731edbb 1778 return SecurityManager::SECURITY_MODE_NO_ACCESS;
WFKnight 0:9b3d4731edbb 1779 }
WFKnight 0:9b3d4731edbb 1780 }
WFKnight 0:9b3d4731edbb 1781
WFKnight 0:9b3d4731edbb 1782 /**
WFKnight 0:9b3d4731edbb 1783 * Get the total number of descriptors within this characteristic.
WFKnight 0:9b3d4731edbb 1784 *
WFKnight 0:9b3d4731edbb 1785 * @return The total number of descriptors.
WFKnight 0:9b3d4731edbb 1786 */
WFKnight 0:9b3d4731edbb 1787 uint8_t getDescriptorCount(void) const
WFKnight 0:9b3d4731edbb 1788 {
WFKnight 0:9b3d4731edbb 1789 return _descriptorCount;
WFKnight 0:9b3d4731edbb 1790 }
WFKnight 0:9b3d4731edbb 1791
WFKnight 0:9b3d4731edbb 1792 /**
WFKnight 0:9b3d4731edbb 1793 * Check whether read authorization is enabled.
WFKnight 0:9b3d4731edbb 1794 *
WFKnight 0:9b3d4731edbb 1795 * Read authorization is enabled when a read authorization event handler is
WFKnight 0:9b3d4731edbb 1796 * set up.
WFKnight 0:9b3d4731edbb 1797 *
WFKnight 0:9b3d4731edbb 1798 * @return true if read authorization is enabled and false otherwise.
WFKnight 0:9b3d4731edbb 1799 */
WFKnight 0:9b3d4731edbb 1800 bool isReadAuthorizationEnabled() const
WFKnight 0:9b3d4731edbb 1801 {
WFKnight 0:9b3d4731edbb 1802 return readAuthorizationCallback;
WFKnight 0:9b3d4731edbb 1803 }
WFKnight 0:9b3d4731edbb 1804
WFKnight 0:9b3d4731edbb 1805 /**
WFKnight 0:9b3d4731edbb 1806 * Check whether write authorization is enabled.
WFKnight 0:9b3d4731edbb 1807 *
WFKnight 0:9b3d4731edbb 1808 * Write authorization is enabled when a write authorization event handler is
WFKnight 0:9b3d4731edbb 1809 * set up.
WFKnight 0:9b3d4731edbb 1810 *
WFKnight 0:9b3d4731edbb 1811 * @return true if write authorization is enabled, false otherwise.
WFKnight 0:9b3d4731edbb 1812 */
WFKnight 0:9b3d4731edbb 1813 bool isWriteAuthorizationEnabled() const
WFKnight 0:9b3d4731edbb 1814 {
WFKnight 0:9b3d4731edbb 1815 return writeAuthorizationCallback;
WFKnight 0:9b3d4731edbb 1816 }
WFKnight 0:9b3d4731edbb 1817
WFKnight 0:9b3d4731edbb 1818 /**
WFKnight 0:9b3d4731edbb 1819 * Get this characteristic's descriptor at a specific index.
WFKnight 0:9b3d4731edbb 1820 *
WFKnight 0:9b3d4731edbb 1821 * @param[in] index The index of the descriptor to get.
WFKnight 0:9b3d4731edbb 1822 *
WFKnight 0:9b3d4731edbb 1823 * @return A pointer the requested descriptor if @p index is within the
WFKnight 0:9b3d4731edbb 1824 * range of the descriptor array or NULL otherwise.
WFKnight 0:9b3d4731edbb 1825 */
WFKnight 0:9b3d4731edbb 1826 GattAttribute *getDescriptor(uint8_t index)
WFKnight 0:9b3d4731edbb 1827 {
WFKnight 0:9b3d4731edbb 1828 if (index >= _descriptorCount) {
WFKnight 0:9b3d4731edbb 1829 return NULL;
WFKnight 0:9b3d4731edbb 1830 }
WFKnight 0:9b3d4731edbb 1831
WFKnight 0:9b3d4731edbb 1832 return _descriptors[index];
WFKnight 0:9b3d4731edbb 1833 }
WFKnight 0:9b3d4731edbb 1834
WFKnight 0:9b3d4731edbb 1835 private:
WFKnight 0:9b3d4731edbb 1836
WFKnight 0:9b3d4731edbb 1837 /**
WFKnight 0:9b3d4731edbb 1838 * Loosely convert a SecurityManager::SecurityMode_t into a
WFKnight 0:9b3d4731edbb 1839 * SecurityRequirement_t.
WFKnight 0:9b3d4731edbb 1840 *
WFKnight 0:9b3d4731edbb 1841 * @param[in] mode The security mode to convert
WFKnight 0:9b3d4731edbb 1842 *
WFKnight 0:9b3d4731edbb 1843 * @return The security requirement equivalent to the security mode in input.
WFKnight 0:9b3d4731edbb 1844 */
WFKnight 0:9b3d4731edbb 1845 SecurityRequirement_t SecurityModeToAttSecurity(
WFKnight 0:9b3d4731edbb 1846 SecurityManager::SecurityMode_t mode
WFKnight 0:9b3d4731edbb 1847 ) {
WFKnight 0:9b3d4731edbb 1848 switch(mode) {
WFKnight 0:9b3d4731edbb 1849 case SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK:
WFKnight 0:9b3d4731edbb 1850 case SecurityManager::SECURITY_MODE_NO_ACCESS:
WFKnight 0:9b3d4731edbb 1851 // assuming access is managed by property and orthogonal to
WFKnight 0:9b3d4731edbb 1852 // security mode ...
WFKnight 0:9b3d4731edbb 1853 return SecurityRequirement_t::NONE;
WFKnight 0:9b3d4731edbb 1854
WFKnight 0:9b3d4731edbb 1855 case SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM:
WFKnight 0:9b3d4731edbb 1856 case SecurityManager::SECURITY_MODE_SIGNED_NO_MITM:
WFKnight 0:9b3d4731edbb 1857 return SecurityRequirement_t::UNAUTHENTICATED;
WFKnight 0:9b3d4731edbb 1858
WFKnight 0:9b3d4731edbb 1859 case SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM:
WFKnight 0:9b3d4731edbb 1860 case SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM:
WFKnight 0:9b3d4731edbb 1861 return SecurityRequirement_t::AUTHENTICATED;
WFKnight 0:9b3d4731edbb 1862
WFKnight 0:9b3d4731edbb 1863 default:
WFKnight 0:9b3d4731edbb 1864 // should not happens; makes the compiler happy.
WFKnight 0:9b3d4731edbb 1865 return SecurityRequirement_t::NONE;
WFKnight 0:9b3d4731edbb 1866 }
WFKnight 0:9b3d4731edbb 1867 }
WFKnight 0:9b3d4731edbb 1868
WFKnight 0:9b3d4731edbb 1869 /**
WFKnight 0:9b3d4731edbb 1870 * Attribute that contains the actual value of this characteristic.
WFKnight 0:9b3d4731edbb 1871 */
WFKnight 0:9b3d4731edbb 1872 GattAttribute _valueAttribute;
WFKnight 0:9b3d4731edbb 1873
WFKnight 0:9b3d4731edbb 1874 /**
WFKnight 0:9b3d4731edbb 1875 * The characteristic's properties. Refer to
WFKnight 0:9b3d4731edbb 1876 * GattCharacteristic::Properties_t.
WFKnight 0:9b3d4731edbb 1877 */
WFKnight 0:9b3d4731edbb 1878 uint8_t _properties;
WFKnight 0:9b3d4731edbb 1879
WFKnight 0:9b3d4731edbb 1880 /**
WFKnight 0:9b3d4731edbb 1881 * The characteristic's descriptor attributes.
WFKnight 0:9b3d4731edbb 1882 */
WFKnight 0:9b3d4731edbb 1883 GattAttribute **_descriptors;
WFKnight 0:9b3d4731edbb 1884
WFKnight 0:9b3d4731edbb 1885 /**
WFKnight 0:9b3d4731edbb 1886 * The number of descriptors in this characteristic.
WFKnight 0:9b3d4731edbb 1887 */
WFKnight 0:9b3d4731edbb 1888 uint8_t _descriptorCount;
WFKnight 0:9b3d4731edbb 1889
WFKnight 0:9b3d4731edbb 1890 /**
WFKnight 0:9b3d4731edbb 1891 * The registered callback handler for read authorization reply.
WFKnight 0:9b3d4731edbb 1892 */
WFKnight 0:9b3d4731edbb 1893 FunctionPointerWithContext<GattReadAuthCallbackParams *>
WFKnight 0:9b3d4731edbb 1894 readAuthorizationCallback;
WFKnight 0:9b3d4731edbb 1895
WFKnight 0:9b3d4731edbb 1896 /**
WFKnight 0:9b3d4731edbb 1897 * The registered callback handler for write authorization reply.
WFKnight 0:9b3d4731edbb 1898 */
WFKnight 0:9b3d4731edbb 1899 FunctionPointerWithContext<GattWriteAuthCallbackParams *>
WFKnight 0:9b3d4731edbb 1900 writeAuthorizationCallback;
WFKnight 0:9b3d4731edbb 1901
WFKnight 0:9b3d4731edbb 1902 /**
WFKnight 0:9b3d4731edbb 1903 * Security requirements of update operations.
WFKnight 0:9b3d4731edbb 1904 *
WFKnight 0:9b3d4731edbb 1905 * The peer must meet the security requirement to enable, disable and
WFKnight 0:9b3d4731edbb 1906 * receive updates
WFKnight 0:9b3d4731edbb 1907 */
WFKnight 0:9b3d4731edbb 1908 uint8_t _update_security: SecurityRequirement_t::size;
WFKnight 0:9b3d4731edbb 1909
WFKnight 0:9b3d4731edbb 1910 private:
WFKnight 0:9b3d4731edbb 1911 /* Disallow copy and assignment. */
WFKnight 0:9b3d4731edbb 1912 GattCharacteristic(const GattCharacteristic &);
WFKnight 0:9b3d4731edbb 1913 GattCharacteristic& operator=(const GattCharacteristic &);
WFKnight 0:9b3d4731edbb 1914 };
WFKnight 0:9b3d4731edbb 1915
WFKnight 0:9b3d4731edbb 1916 /**
WFKnight 0:9b3d4731edbb 1917 * Helper class that represents a read only GattCharacteristic.
WFKnight 0:9b3d4731edbb 1918 */
WFKnight 0:9b3d4731edbb 1919 template <typename T>
WFKnight 0:9b3d4731edbb 1920 class ReadOnlyGattCharacteristic : public GattCharacteristic {
WFKnight 0:9b3d4731edbb 1921 public:
WFKnight 0:9b3d4731edbb 1922 /**
WFKnight 0:9b3d4731edbb 1923 * Construct a ReadOnlyGattCharacteristic.
WFKnight 0:9b3d4731edbb 1924 *
WFKnight 0:9b3d4731edbb 1925 * @param[in] uuid The characteristic's UUID.
WFKnight 0:9b3d4731edbb 1926 * @param[in] valuePtr Pointer to the characteristic's initial value. The
WFKnight 0:9b3d4731edbb 1927 * pointer is reinterpreted as a pointer to an uint8_t buffer.
WFKnight 0:9b3d4731edbb 1928 * @param[in] additionalProperties Additional characteristic properties. By
WFKnight 0:9b3d4731edbb 1929 * default, the properties are set to
WFKnight 0:9b3d4731edbb 1930 * Properties_t::BLE_GATT_CHAR_PROPERTIES_READ.
WFKnight 0:9b3d4731edbb 1931 * @param[in] descriptors An array of pointers to descriptors to be added
WFKnight 0:9b3d4731edbb 1932 * to the new characteristic.
WFKnight 0:9b3d4731edbb 1933 * @param[in] numDescriptors The total number of descriptors in @p
WFKnight 0:9b3d4731edbb 1934 * descriptors.
WFKnight 0:9b3d4731edbb 1935 *
WFKnight 0:9b3d4731edbb 1936 * @note Instances of ReadOnlyGattCharacteristic have a fixed length
WFKnight 0:9b3d4731edbb 1937 * attribute value that equals sizeof(T). For a variable length alternative,
WFKnight 0:9b3d4731edbb 1938 * use GattCharacteristic directly.
WFKnight 0:9b3d4731edbb 1939 */
WFKnight 0:9b3d4731edbb 1940 ReadOnlyGattCharacteristic<T>(
WFKnight 0:9b3d4731edbb 1941 const UUID &uuid,
WFKnight 0:9b3d4731edbb 1942 T *valuePtr,
WFKnight 0:9b3d4731edbb 1943 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 1944 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 1945 unsigned numDescriptors = 0
WFKnight 0:9b3d4731edbb 1946 ) : GattCharacteristic(
WFKnight 0:9b3d4731edbb 1947 uuid,
WFKnight 0:9b3d4731edbb 1948 reinterpret_cast<uint8_t *>(valuePtr),
WFKnight 0:9b3d4731edbb 1949 sizeof(T),
WFKnight 0:9b3d4731edbb 1950 sizeof(T),
WFKnight 0:9b3d4731edbb 1951 BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties,
WFKnight 0:9b3d4731edbb 1952 descriptors,
WFKnight 0:9b3d4731edbb 1953 numDescriptors,
WFKnight 0:9b3d4731edbb 1954 false
WFKnight 0:9b3d4731edbb 1955 ) {
WFKnight 0:9b3d4731edbb 1956 }
WFKnight 0:9b3d4731edbb 1957 };
WFKnight 0:9b3d4731edbb 1958
WFKnight 0:9b3d4731edbb 1959 /**
WFKnight 0:9b3d4731edbb 1960 * Helper class that represents a write only GattCharacteristic.
WFKnight 0:9b3d4731edbb 1961 */
WFKnight 0:9b3d4731edbb 1962 template <typename T>
WFKnight 0:9b3d4731edbb 1963 class WriteOnlyGattCharacteristic : public GattCharacteristic {
WFKnight 0:9b3d4731edbb 1964 public:
WFKnight 0:9b3d4731edbb 1965 /**
WFKnight 0:9b3d4731edbb 1966 * Construct a WriteOnlyGattCharacteristic.
WFKnight 0:9b3d4731edbb 1967 *
WFKnight 0:9b3d4731edbb 1968 * @param[in] uuid The characteristic's UUID.
WFKnight 0:9b3d4731edbb 1969 * @param[in] valuePtr Pointer to the characteristic's initial value. The
WFKnight 0:9b3d4731edbb 1970 * pointer is reinterpreted as a pointer to an uint8_t buffer.
WFKnight 0:9b3d4731edbb 1971 * @param[in] additionalProperties Additional characteristic properties. By
WFKnight 0:9b3d4731edbb 1972 * default, the properties are set to
WFKnight 0:9b3d4731edbb 1973 * Properties_t::BLE_GATT_CHAR_PROPERTIES_WRITE.
WFKnight 0:9b3d4731edbb 1974 * @param[in] descriptors An array of pointers to descriptors to be added to
WFKnight 0:9b3d4731edbb 1975 * the new characteristic.
WFKnight 0:9b3d4731edbb 1976 * @param[in] numDescriptors The total number of descriptors in @p
WFKnight 0:9b3d4731edbb 1977 * descriptors.
WFKnight 0:9b3d4731edbb 1978 *
WFKnight 0:9b3d4731edbb 1979 * @note Instances of WriteOnlyGattCharacteristic have variable length
WFKnight 0:9b3d4731edbb 1980 * attribute value with maximum size equal to sizeof(T). For a fixed length
WFKnight 0:9b3d4731edbb 1981 * alternative, use GattCharacteristic directly.
WFKnight 0:9b3d4731edbb 1982 */
WFKnight 0:9b3d4731edbb 1983 WriteOnlyGattCharacteristic<T>(
WFKnight 0:9b3d4731edbb 1984 const UUID &uuid,
WFKnight 0:9b3d4731edbb 1985 T *valuePtr,
WFKnight 0:9b3d4731edbb 1986 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 1987 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 1988 unsigned numDescriptors = 0
WFKnight 0:9b3d4731edbb 1989 ) : GattCharacteristic(
WFKnight 0:9b3d4731edbb 1990 uuid,
WFKnight 0:9b3d4731edbb 1991 reinterpret_cast<uint8_t *>(valuePtr),
WFKnight 0:9b3d4731edbb 1992 sizeof(T),
WFKnight 0:9b3d4731edbb 1993 sizeof(T),
WFKnight 0:9b3d4731edbb 1994 BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties,
WFKnight 0:9b3d4731edbb 1995 descriptors,
WFKnight 0:9b3d4731edbb 1996 numDescriptors
WFKnight 0:9b3d4731edbb 1997 ) {
WFKnight 0:9b3d4731edbb 1998 }
WFKnight 0:9b3d4731edbb 1999 };
WFKnight 0:9b3d4731edbb 2000
WFKnight 0:9b3d4731edbb 2001 /**
WFKnight 0:9b3d4731edbb 2002 * Helper class that represents a readable and writable GattCharacteristic.
WFKnight 0:9b3d4731edbb 2003 */
WFKnight 0:9b3d4731edbb 2004 template <typename T>
WFKnight 0:9b3d4731edbb 2005 class ReadWriteGattCharacteristic : public GattCharacteristic {
WFKnight 0:9b3d4731edbb 2006 public:
WFKnight 0:9b3d4731edbb 2007 /**
WFKnight 0:9b3d4731edbb 2008 * Construct a ReadWriteGattCharacteristic.
WFKnight 0:9b3d4731edbb 2009 *
WFKnight 0:9b3d4731edbb 2010 * @param[in] uuid The characteristic's UUID.
WFKnight 0:9b3d4731edbb 2011 * @param[in] valuePtr Pointer to the characteristic's initial value. The
WFKnight 0:9b3d4731edbb 2012 * pointer is reinterpreted as a pointer to an uint8_t buffer.
WFKnight 0:9b3d4731edbb 2013 * @param[in] additionalProperties Additional characteristic properties. By
WFKnight 0:9b3d4731edbb 2014 * default, the properties are set to
WFKnight 0:9b3d4731edbb 2015 * Properties_t::BLE_GATT_CHAR_PROPERTIES_WRITE and
WFKnight 0:9b3d4731edbb 2016 * Properties_t::BLE_GATT_CHAR_PROPERTIES_READ.
WFKnight 0:9b3d4731edbb 2017 * @param[in] descriptors An array of pointers to descriptors to be added to
WFKnight 0:9b3d4731edbb 2018 * the new characteristic.
WFKnight 0:9b3d4731edbb 2019 * @param[in] numDescriptors The total number of descriptors in @p descriptors.
WFKnight 0:9b3d4731edbb 2020 *
WFKnight 0:9b3d4731edbb 2021 * @note Instances of ReadWriteGattCharacteristic have variable length
WFKnight 0:9b3d4731edbb 2022 * attribute value with maximum size equal to sizeof(T). For a fixed length
WFKnight 0:9b3d4731edbb 2023 * alternative, use GattCharacteristic directly.
WFKnight 0:9b3d4731edbb 2024 */
WFKnight 0:9b3d4731edbb 2025 ReadWriteGattCharacteristic<T>(
WFKnight 0:9b3d4731edbb 2026 const UUID &uuid,
WFKnight 0:9b3d4731edbb 2027 T *valuePtr,
WFKnight 0:9b3d4731edbb 2028 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 2029 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 2030 unsigned numDescriptors = 0
WFKnight 0:9b3d4731edbb 2031 ) : GattCharacteristic(
WFKnight 0:9b3d4731edbb 2032 uuid,
WFKnight 0:9b3d4731edbb 2033 reinterpret_cast<uint8_t *>(valuePtr),
WFKnight 0:9b3d4731edbb 2034 sizeof(T),
WFKnight 0:9b3d4731edbb 2035 sizeof(T),
WFKnight 0:9b3d4731edbb 2036 BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties,
WFKnight 0:9b3d4731edbb 2037 descriptors,
WFKnight 0:9b3d4731edbb 2038 numDescriptors
WFKnight 0:9b3d4731edbb 2039 ) {
WFKnight 0:9b3d4731edbb 2040 }
WFKnight 0:9b3d4731edbb 2041 };
WFKnight 0:9b3d4731edbb 2042
WFKnight 0:9b3d4731edbb 2043 /**
WFKnight 0:9b3d4731edbb 2044 * Helper class that represents a write-only GattCharacteristic with an array
WFKnight 0:9b3d4731edbb 2045 * value.
WFKnight 0:9b3d4731edbb 2046 */
WFKnight 0:9b3d4731edbb 2047 template <typename T, unsigned NUM_ELEMENTS>
WFKnight 0:9b3d4731edbb 2048 class WriteOnlyArrayGattCharacteristic : public GattCharacteristic {
WFKnight 0:9b3d4731edbb 2049 public:
WFKnight 0:9b3d4731edbb 2050 /**
WFKnight 0:9b3d4731edbb 2051 * Construct a WriteOnlyGattCharacteristic.
WFKnight 0:9b3d4731edbb 2052 *
WFKnight 0:9b3d4731edbb 2053 * @param[in] uuid The characteristic's UUID.
WFKnight 0:9b3d4731edbb 2054 * @param[in] valuePtr Pointer to an array of length NUM_ELEMENTS containing
WFKnight 0:9b3d4731edbb 2055 * the characteristic's initial value. The pointer is reinterpreted as a
WFKnight 0:9b3d4731edbb 2056 * pointer to an uint8_t buffer.
WFKnight 0:9b3d4731edbb 2057 * @param[in] additionalProperties Additional characteristic properties. By
WFKnight 0:9b3d4731edbb 2058 * default, the properties are set to
WFKnight 0:9b3d4731edbb 2059 * Properties_t::BLE_GATT_CHAR_PROPERTIES_WRITE.
WFKnight 0:9b3d4731edbb 2060 * @param[in] descriptors An array of pointers to descriptors to be added to
WFKnight 0:9b3d4731edbb 2061 * the new characteristic.
WFKnight 0:9b3d4731edbb 2062 * @param[in] numDescriptors The total number of descriptors in @p descriptors.
WFKnight 0:9b3d4731edbb 2063 *
WFKnight 0:9b3d4731edbb 2064 * @note Instances of WriteOnlyGattCharacteristic have variable length
WFKnight 0:9b3d4731edbb 2065 * attribute value with maximum size equal to sizeof(T) * NUM_ELEMENTS.
WFKnight 0:9b3d4731edbb 2066 * For a fixed length alternative, use GattCharacteristic directly.
WFKnight 0:9b3d4731edbb 2067 */
WFKnight 0:9b3d4731edbb 2068 WriteOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(
WFKnight 0:9b3d4731edbb 2069 const UUID &uuid,
WFKnight 0:9b3d4731edbb 2070 T valuePtr[NUM_ELEMENTS],
WFKnight 0:9b3d4731edbb 2071 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 2072 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 2073 unsigned numDescriptors = 0
WFKnight 0:9b3d4731edbb 2074 ) : GattCharacteristic(
WFKnight 0:9b3d4731edbb 2075 uuid,
WFKnight 0:9b3d4731edbb 2076 reinterpret_cast<uint8_t *>(valuePtr),
WFKnight 0:9b3d4731edbb 2077 sizeof(T) * NUM_ELEMENTS,
WFKnight 0:9b3d4731edbb 2078 sizeof(T) * NUM_ELEMENTS,
WFKnight 0:9b3d4731edbb 2079 BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties,
WFKnight 0:9b3d4731edbb 2080 descriptors,
WFKnight 0:9b3d4731edbb 2081 numDescriptors
WFKnight 0:9b3d4731edbb 2082 ) {
WFKnight 0:9b3d4731edbb 2083 }
WFKnight 0:9b3d4731edbb 2084 };
WFKnight 0:9b3d4731edbb 2085
WFKnight 0:9b3d4731edbb 2086 /**
WFKnight 0:9b3d4731edbb 2087 * Helper class that represents a read-only GattCharacteristic with an array
WFKnight 0:9b3d4731edbb 2088 * value.
WFKnight 0:9b3d4731edbb 2089 */
WFKnight 0:9b3d4731edbb 2090 template <typename T, unsigned NUM_ELEMENTS>
WFKnight 0:9b3d4731edbb 2091 class ReadOnlyArrayGattCharacteristic : public GattCharacteristic {
WFKnight 0:9b3d4731edbb 2092 public:
WFKnight 0:9b3d4731edbb 2093 /**
WFKnight 0:9b3d4731edbb 2094 * Construct a ReadOnlyGattCharacteristic.
WFKnight 0:9b3d4731edbb 2095 *
WFKnight 0:9b3d4731edbb 2096 * @param[in] uuid The characteristic's UUID.
WFKnight 0:9b3d4731edbb 2097 * @param[in] valuePtr Pointer to an array of length NUM_ELEMENTS containing
WFKnight 0:9b3d4731edbb 2098 * the characteristic's initial value. The pointer is reinterpreted as a
WFKnight 0:9b3d4731edbb 2099 * pointer to an uint8_t buffer.
WFKnight 0:9b3d4731edbb 2100 * @param[in] additionalProperties Additional characteristic properties. By
WFKnight 0:9b3d4731edbb 2101 * default, the properties are set to
WFKnight 0:9b3d4731edbb 2102 * Properties_t::BLE_GATT_CHAR_PROPERTIES_READ.
WFKnight 0:9b3d4731edbb 2103 * @param[in] descriptors An array of pointers to descriptors to be added to
WFKnight 0:9b3d4731edbb 2104 * the new characteristic.
WFKnight 0:9b3d4731edbb 2105 * @param[in] numDescriptors The total number of descriptors in @p
WFKnight 0:9b3d4731edbb 2106 * descriptors.
WFKnight 0:9b3d4731edbb 2107 *
WFKnight 0:9b3d4731edbb 2108 * @note Instances of ReadOnlyGattCharacteristic have fixed length
WFKnight 0:9b3d4731edbb 2109 * attribute value that equals sizeof(T) * NUM_ELEMENTS. For a variable
WFKnight 0:9b3d4731edbb 2110 * length alternative, use GattCharacteristic directly.
WFKnight 0:9b3d4731edbb 2111 */
WFKnight 0:9b3d4731edbb 2112 ReadOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(
WFKnight 0:9b3d4731edbb 2113 const UUID &uuid,
WFKnight 0:9b3d4731edbb 2114 T valuePtr[NUM_ELEMENTS],
WFKnight 0:9b3d4731edbb 2115 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 2116 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 2117 unsigned numDescriptors = 0
WFKnight 0:9b3d4731edbb 2118 ) : GattCharacteristic(
WFKnight 0:9b3d4731edbb 2119 uuid,
WFKnight 0:9b3d4731edbb 2120 reinterpret_cast<uint8_t *>(valuePtr),
WFKnight 0:9b3d4731edbb 2121 sizeof(T) * NUM_ELEMENTS,
WFKnight 0:9b3d4731edbb 2122 sizeof(T) * NUM_ELEMENTS,
WFKnight 0:9b3d4731edbb 2123 BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties,
WFKnight 0:9b3d4731edbb 2124 descriptors,
WFKnight 0:9b3d4731edbb 2125 numDescriptors,
WFKnight 0:9b3d4731edbb 2126 false
WFKnight 0:9b3d4731edbb 2127 ) {
WFKnight 0:9b3d4731edbb 2128 }
WFKnight 0:9b3d4731edbb 2129 };
WFKnight 0:9b3d4731edbb 2130
WFKnight 0:9b3d4731edbb 2131 /**
WFKnight 0:9b3d4731edbb 2132 * Helper class that represents a readable and writable GattCharacteristic with
WFKnight 0:9b3d4731edbb 2133 * an array value.
WFKnight 0:9b3d4731edbb 2134 */
WFKnight 0:9b3d4731edbb 2135 template <typename T, unsigned NUM_ELEMENTS>
WFKnight 0:9b3d4731edbb 2136 class ReadWriteArrayGattCharacteristic : public GattCharacteristic {
WFKnight 0:9b3d4731edbb 2137 public:
WFKnight 0:9b3d4731edbb 2138 /**
WFKnight 0:9b3d4731edbb 2139 * Construct a ReadWriteGattCharacteristic.
WFKnight 0:9b3d4731edbb 2140 *
WFKnight 0:9b3d4731edbb 2141 * @param[in] uuid The characteristic's UUID.
WFKnight 0:9b3d4731edbb 2142 * @param[in] valuePtr Pointer to an array of length NUM_ELEMENTS containing
WFKnight 0:9b3d4731edbb 2143 * the characteristic's initial value. The pointer is reinterpreted as a
WFKnight 0:9b3d4731edbb 2144 * pointer to an uint8_t buffer.
WFKnight 0:9b3d4731edbb 2145 * @param[in] additionalProperties Additional characteristic properties. By
WFKnight 0:9b3d4731edbb 2146 * default, the properties are set to
WFKnight 0:9b3d4731edbb 2147 * Properties_t::BLE_GATT_CHAR_PROPERTIES_WRITE |
WFKnight 0:9b3d4731edbb 2148 * Properties_t::BLE_GATT_CHAR_PROPERTIES_READ.
WFKnight 0:9b3d4731edbb 2149 * @param[in] descriptors An array of pointers to descriptors to be added to
WFKnight 0:9b3d4731edbb 2150 * the new characteristic.
WFKnight 0:9b3d4731edbb 2151 * @param[in] numDescriptors The total number of descriptors in @p descriptors.
WFKnight 0:9b3d4731edbb 2152 *
WFKnight 0:9b3d4731edbb 2153 * @note Instances of ReadWriteGattCharacteristic have variable length
WFKnight 0:9b3d4731edbb 2154 * attribute value with maximum size equal to sizeof(T) * NUM_ELEMENTS.
WFKnight 0:9b3d4731edbb 2155 * For a fixed length alternative, use GattCharacteristic directly.
WFKnight 0:9b3d4731edbb 2156 */
WFKnight 0:9b3d4731edbb 2157 ReadWriteArrayGattCharacteristic<T, NUM_ELEMENTS>(
WFKnight 0:9b3d4731edbb 2158 const UUID &uuid,
WFKnight 0:9b3d4731edbb 2159 T valuePtr[NUM_ELEMENTS],
WFKnight 0:9b3d4731edbb 2160 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
WFKnight 0:9b3d4731edbb 2161 GattAttribute *descriptors[] = NULL,
WFKnight 0:9b3d4731edbb 2162 unsigned numDescriptors = 0
WFKnight 0:9b3d4731edbb 2163 ) : GattCharacteristic(
WFKnight 0:9b3d4731edbb 2164 uuid,
WFKnight 0:9b3d4731edbb 2165 reinterpret_cast<uint8_t *>(valuePtr),
WFKnight 0:9b3d4731edbb 2166 sizeof(T) * NUM_ELEMENTS,
WFKnight 0:9b3d4731edbb 2167 sizeof(T) * NUM_ELEMENTS,
WFKnight 0:9b3d4731edbb 2168 BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties,
WFKnight 0:9b3d4731edbb 2169 descriptors,
WFKnight 0:9b3d4731edbb 2170 numDescriptors
WFKnight 0:9b3d4731edbb 2171 ) {
WFKnight 0:9b3d4731edbb 2172 }
WFKnight 0:9b3d4731edbb 2173 };
WFKnight 0:9b3d4731edbb 2174
WFKnight 0:9b3d4731edbb 2175 /**
WFKnight 0:9b3d4731edbb 2176 * @}
WFKnight 0:9b3d4731edbb 2177 * @}
WFKnight 0:9b3d4731edbb 2178 * @}
WFKnight 0:9b3d4731edbb 2179 */
WFKnight 0:9b3d4731edbb 2180
WFKnight 0:9b3d4731edbb 2181 #endif /* ifndef __GATT_CHARACTERISTIC_H__ */