Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

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