BLE_API_Tiny_BLE

Dependents:   CSSE4011_BLE_IMU

Fork of BLE_API by Bluetooth Low Energy

Committer:
Rohit Grover
Date:
Mon Sep 22 10:59:09 2014 +0100
Revision:
118:620d28e7a1ba
Parent:
115:47e4cdd7b0c5
Child:
144:c025c8839682
Release 0.2.0
=============

Highlights:
Introducing standard services to simplify applications.
Add support for over-the-air firmware updates.

Features
~~~~~~~~

- This release introduces 'templates' for common services such as heart-rate,
battery-level, device-info, UART, device-firmware-update etc. These services
take the shape of class declarations within header files aggregated under a
new folder called 'services/'. These service-classes provide a high-level
API hopefully easing the burden of developing BLE applications. The
underlying APIs to work with characteristics and services are still
available to allow greater control if needed. We expect to grow the
supported services to include all SIG defined BLE profiles.

- WriteCallbackParams now includes the characteristic's value-attribute
handle; this changes the signature of onDataWritten().

- BLEDevice::onDataWritten() now allows chaining of callbacks--this means that
it is possible to chain together multiple onDataWritten callbacks
(potentially from different modules of an application) to receive updates to
characteristics. Many services, such as DFU and UART add their own
onDataWritten callbacks behind the scenes to trap interesting events. It is
also possible to chain callbacks to functions within objects.

- Added the following expectation for GattCharacteristic: If valuePtr ==
NULL, initialLength == 0, and properties == READ for the value attribute of
a characteristic, then that particular characteristic may be considered
optional and dropped while instantiating the service with the underlying BLE
stack.

- Introducing the typedef GattAttribute::Handle_t to capture Attribute handles.

Bugfixes
~~~~~~~~

None.

Compatibility
~~~~~~~~~~~~~

The signature of onDataWritten() has seen a change; so application programs
using this new version of the BLE API will need minor modifications. Please
refer to sample programs under BLE team page.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rohit Grover 106:a20be740075d 1 /* mbed Microcontroller Library
Rohit Grover 106:a20be740075d 2 * Copyright (c) 2006-2013 ARM Limited
Rohit Grover 106:a20be740075d 3 *
Rohit Grover 106:a20be740075d 4 * Licensed under the Apache License, Version 2.0 (the "License");
Rohit Grover 106:a20be740075d 5 * you may not use this file except in compliance with the License.
Rohit Grover 106:a20be740075d 6 * You may obtain a copy of the License at
Rohit Grover 106:a20be740075d 7 *
Rohit Grover 106:a20be740075d 8 * http://www.apache.org/licenses/LICENSE-2.0
Rohit Grover 106:a20be740075d 9 *
Rohit Grover 106:a20be740075d 10 * Unless required by applicable law or agreed to in writing, software
Rohit Grover 106:a20be740075d 11 * distributed under the License is distributed on an "AS IS" BASIS,
Rohit Grover 106:a20be740075d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Rohit Grover 106:a20be740075d 13 * See the License for the specific language governing permissions and
Rohit Grover 106:a20be740075d 14 * limitations under the License.
Rohit Grover 106:a20be740075d 15 */
Rohit Grover 106:a20be740075d 16
Rohit Grover 106:a20be740075d 17
Rohit Grover 106:a20be740075d 18 #ifndef __GATT_CHARACTERISTIC_H__
Rohit Grover 106:a20be740075d 19 #define __GATT_CHARACTERISTIC_H__
Rohit Grover 106:a20be740075d 20
Rohit Grover 106:a20be740075d 21 #include "blecommon.h"
Rohit Grover 106:a20be740075d 22 #include "UUID.h"
carlescufi 112:64c88ad45610 23 #include "GattAttribute.h"
Rohit Grover 106:a20be740075d 24
Rohit Grover 106:a20be740075d 25 /**************************************************************************/
Rohit Grover 106:a20be740075d 26 /*!
Rohit Grover 106:a20be740075d 27 \brief GATT characteristic
Rohit Grover 106:a20be740075d 28 */
Rohit Grover 106:a20be740075d 29 /**************************************************************************/
carlescufi 115:47e4cdd7b0c5 30 class GattCharacteristic
Rohit Grover 106:a20be740075d 31 {
Rohit Grover 106:a20be740075d 32 public:
Rohit Grover 106:a20be740075d 33 enum {
Rohit Grover 106:a20be740075d 34 UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
Rohit Grover 106:a20be740075d 35 UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
Rohit Grover 106:a20be740075d 36 UUID_REMOVABLE_CHAR = 0x2A3A,
Rohit Grover 106:a20be740075d 37 UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
Rohit Grover 106:a20be740075d 38 UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
Rohit Grover 106:a20be740075d 39 UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
Rohit Grover 106:a20be740075d 40 UUID_ALERT_LEVEL_CHAR = 0x2A06,
Rohit Grover 106:a20be740075d 41 UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
Rohit Grover 106:a20be740075d 42 UUID_ALERT_STATUS_CHAR = 0x2A3F,
Rohit Grover 106:a20be740075d 43 UUID_BATTERY_LEVEL_CHAR = 0x2A19,
Rohit Grover 106:a20be740075d 44 UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
Rohit Grover 106:a20be740075d 45 UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
Rohit Grover 106:a20be740075d 46 UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
Rohit Grover 106:a20be740075d 47 UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
Rohit Grover 106:a20be740075d 48 UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
Rohit Grover 106:a20be740075d 49 UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
Rohit Grover 106:a20be740075d 50 UUID_CURRENT_TIME_CHAR = 0x2A2B,
Rohit Grover 106:a20be740075d 51 UUID_DATE_TIME_CHAR = 0x2A08,
Rohit Grover 106:a20be740075d 52 UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
Rohit Grover 106:a20be740075d 53 UUID_DAY_OF_WEEK_CHAR = 0x2A09,
Rohit Grover 106:a20be740075d 54 UUID_DST_OFFSET_CHAR = 0x2A0D,
Rohit Grover 106:a20be740075d 55 UUID_EXACT_TIME_256_CHAR = 0x2A0C,
Rohit Grover 106:a20be740075d 56 UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
Rohit Grover 106:a20be740075d 57 UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
Rohit Grover 106:a20be740075d 58 UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
Rohit Grover 106:a20be740075d 59 UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
Rohit Grover 106:a20be740075d 60 UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
Rohit Grover 106:a20be740075d 61 UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
Rohit Grover 106:a20be740075d 62 UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
Rohit Grover 106:a20be740075d 63 UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
Rohit Grover 106:a20be740075d 64 UUID_HID_INFORMATION_CHAR = 0x2A4A,
Rohit Grover 106:a20be740075d 65 UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
Rohit Grover 106:a20be740075d 66 UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
Rohit Grover 106:a20be740075d 67 UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
Rohit Grover 106:a20be740075d 68 UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
Rohit Grover 106:a20be740075d 69 UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
Rohit Grover 106:a20be740075d 70 UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
Rohit Grover 106:a20be740075d 71 UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
Rohit Grover 106:a20be740075d 72 UUID_UNREAD_ALERT_CHAR = 0x2A45,
Rohit Grover 106:a20be740075d 73 UUID_NEW_ALERT_CHAR = 0x2A46,
Rohit Grover 106:a20be740075d 74 UUID_PNP_ID_CHAR = 0x2A50,
Rohit Grover 106:a20be740075d 75 UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
Rohit Grover 106:a20be740075d 76 UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
Rohit Grover 106:a20be740075d 77 UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
Rohit Grover 106:a20be740075d 78 UUID_REPORT_CHAR = 0x2A4D,
Rohit Grover 106:a20be740075d 79 UUID_REPORT_MAP_CHAR = 0x2A4B,
Rohit Grover 106:a20be740075d 80 UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
Rohit Grover 106:a20be740075d 81 UUID_RINGER_SETTING_CHAR = 0x2A41,
Rohit Grover 106:a20be740075d 82 UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
Rohit Grover 106:a20be740075d 83 UUID_SCAN_REFRESH_CHAR = 0x2A31,
Rohit Grover 106:a20be740075d 84 UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
Rohit Grover 106:a20be740075d 85 UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
Rohit Grover 106:a20be740075d 86 UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
Rohit Grover 106:a20be740075d 87 UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
Rohit Grover 106:a20be740075d 88 UUID_SYSTEM_ID_CHAR = 0x2A23,
Rohit Grover 106:a20be740075d 89 UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
Rohit Grover 106:a20be740075d 90 UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
Rohit Grover 106:a20be740075d 91 UUID_TIME_ACCURACY_CHAR = 0x2A12,
Rohit Grover 106:a20be740075d 92 UUID_TIME_SOURCE_CHAR = 0x2A13,
Rohit Grover 106:a20be740075d 93 UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
Rohit Grover 106:a20be740075d 94 UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
Rohit Grover 106:a20be740075d 95 UUID_TIME_WITH_DST_CHAR = 0x2A11,
Rohit Grover 106:a20be740075d 96 UUID_TIME_ZONE_CHAR = 0x2A0E,
Rohit Grover 106:a20be740075d 97 UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
Rohit Grover 106:a20be740075d 98 UUID_CSC_FEATURE_CHAR = 0x2A5C,
Rohit Grover 106:a20be740075d 99 UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
Rohit Grover 106:a20be740075d 100 UUID_RSC_FEATURE_CHAR = 0x2A54,
Rohit Grover 106:a20be740075d 101 UUID_RSC_MEASUREMENT_CHAR = 0x2A53,
Rohit Grover 106:a20be740075d 102 };
Rohit Grover 106:a20be740075d 103
Rohit Grover 106:a20be740075d 104 /**************************************************************************/
Rohit Grover 106:a20be740075d 105 /*!
Rohit Grover 106:a20be740075d 106 \brief Standard GATT characteristic presentation format unit types.
Rohit Grover 106:a20be740075d 107 These unit types are used to decribe what the raw numeric
Rohit Grover 106:a20be740075d 108 data in a characteristic actually represents.
Rohit Grover 106:a20be740075d 109
Rohit Grover 106:a20be740075d 110 \note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
Rohit Grover 106:a20be740075d 111 */
Rohit Grover 106:a20be740075d 112 /**************************************************************************/
Rohit Grover 106:a20be740075d 113 typedef enum ble_gatt_unit_e {
Rohit Grover 106:a20be740075d 114 BLE_GATT_UNIT_NONE = 0x2700, /**< No specified unit type */
Rohit Grover 106:a20be740075d 115 BLE_GATT_UNIT_LENGTH_METRE = 0x2701, /**< Length, Metre */
Rohit Grover 106:a20be740075d 116 BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702, /**< Mass, Kilogram */
Rohit Grover 106:a20be740075d 117 BLE_GATT_UNIT_TIME_SECOND = 0x2703, /**< Time, Second */
Rohit Grover 106:a20be740075d 118 BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704, /**< Electric Current, Ampere */
Rohit Grover 106:a20be740075d 119 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705, /**< Thermodynamic Temperature, Kelvin */
Rohit Grover 106:a20be740075d 120 BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706, /**< Amount of Substance, Mole */
Rohit Grover 106:a20be740075d 121 BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707, /**< Luminous Intensity, Candela */
Rohit Grover 106:a20be740075d 122 BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710, /**< Area, Square Metres */
Rohit Grover 106:a20be740075d 123 BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711, /**< Volume, Cubic Metres*/
Rohit Grover 106:a20be740075d 124 BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712, /**< Velocity, Metres per Second*/
Rohit Grover 106:a20be740075d 125 BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713, /**< Acceleration, Metres per Second Squared */
Rohit Grover 106:a20be740075d 126 BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714, /**< Wave Number Reciprocal, Metre */
Rohit Grover 106:a20be740075d 127 BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715, /**< Density, Kilogram per Cubic Metre */
Rohit Grover 106:a20be740075d 128 BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716, /**< */
Rohit Grover 106:a20be740075d 129 BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717, /**< */
Rohit Grover 106:a20be740075d 130 BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718, /**< */
Rohit Grover 106:a20be740075d 131 BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719, /**< Magnetic Field Strength, Ampere per Metre */
Rohit Grover 106:a20be740075d 132 BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A, /**< */
Rohit Grover 106:a20be740075d 133 BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B, /**< */
Rohit Grover 106:a20be740075d 134 BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C, /**< */
Rohit Grover 106:a20be740075d 135 BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D, /**< */
Rohit Grover 106:a20be740075d 136 BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E, /**< */
Rohit Grover 106:a20be740075d 137 BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720, /**< */
Rohit Grover 106:a20be740075d 138 BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721, /**< */
Rohit Grover 106:a20be740075d 139 BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722, /**< Frequency, Hertz */
Rohit Grover 106:a20be740075d 140 BLE_GATT_UNIT_FORCE_NEWTON = 0x2723, /**< Force, Newton */
Rohit Grover 106:a20be740075d 141 BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724, /**< Pressure, Pascal */
Rohit Grover 106:a20be740075d 142 BLE_GATT_UNIT_ENERGY_JOULE = 0x2725, /**< Energy, Joule */
Rohit Grover 106:a20be740075d 143 BLE_GATT_UNIT_POWER_WATT = 0x2726, /**< Power, Watt */
Rohit Grover 106:a20be740075d 144 BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727, /**< Electrical Charge, Coulomb */
Rohit Grover 106:a20be740075d 145 BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728, /**< Electrical Potential Difference, Voltage */
Rohit Grover 106:a20be740075d 146 BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729, /**< */
Rohit Grover 106:a20be740075d 147 BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A, /**< */
Rohit Grover 106:a20be740075d 148 BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B, /**< */
Rohit Grover 106:a20be740075d 149 BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C, /**< */
Rohit Grover 106:a20be740075d 150 BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D, /**< */
Rohit Grover 106:a20be740075d 151 BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E, /**< */
Rohit Grover 106:a20be740075d 152 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F, /**< */
Rohit Grover 106:a20be740075d 153 BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730, /**< */
Rohit Grover 106:a20be740075d 154 BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731, /**< */
Rohit Grover 106:a20be740075d 155 BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732, /**< */
Rohit Grover 106:a20be740075d 156 BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733, /**< */
Rohit Grover 106:a20be740075d 157 BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734, /**< */
Rohit Grover 106:a20be740075d 158 BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735, /**< */
Rohit Grover 106:a20be740075d 159 BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740, /**< */
Rohit Grover 106:a20be740075d 160 BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741, /**< */
Rohit Grover 106:a20be740075d 161 BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742, /**< */
Rohit Grover 106:a20be740075d 162 BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743, /**< */
Rohit Grover 106:a20be740075d 163 BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744, /**< */
Rohit Grover 106:a20be740075d 164 BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745, /**< */
Rohit Grover 106:a20be740075d 165 BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746, /**< */
Rohit Grover 106:a20be740075d 166 BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747, /**< */
Rohit Grover 106:a20be740075d 167 BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748, /**< */
Rohit Grover 106:a20be740075d 168 BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749, /**< */
Rohit Grover 106:a20be740075d 169 BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A, /**< */
Rohit Grover 106:a20be740075d 170 BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B, /**< */
Rohit Grover 106:a20be740075d 171 BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C, /**< */
Rohit Grover 106:a20be740075d 172 BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D, /**< */
Rohit Grover 106:a20be740075d 173 BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E, /**< */
Rohit Grover 106:a20be740075d 174 BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F, /**< */
Rohit Grover 106:a20be740075d 175 BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750, /**< */
Rohit Grover 106:a20be740075d 176 BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751, /**< */
Rohit Grover 106:a20be740075d 177 BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752, /**< */
Rohit Grover 106:a20be740075d 178 BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753, /**< */
Rohit Grover 106:a20be740075d 179 BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754, /**< */
Rohit Grover 106:a20be740075d 180 BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755, /**< */
Rohit Grover 106:a20be740075d 181 BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756, /**< */
Rohit Grover 106:a20be740075d 182 BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757, /**< */
Rohit Grover 106:a20be740075d 183 BLE_GATT_UNIT_TIME_MINUTE = 0x2760, /**< Time, Minute */
Rohit Grover 106:a20be740075d 184 BLE_GATT_UNIT_TIME_HOUR = 0x2761, /**< Time, Hour */
Rohit Grover 106:a20be740075d 185 BLE_GATT_UNIT_TIME_DAY = 0x2762, /**< Time, Day */
Rohit Grover 106:a20be740075d 186 BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763, /**< */
Rohit Grover 106:a20be740075d 187 BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764, /**< */
Rohit Grover 106:a20be740075d 188 BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765, /**< */
Rohit Grover 106:a20be740075d 189 BLE_GATT_UNIT_AREA_HECTARE = 0x2766, /**< */
Rohit Grover 106:a20be740075d 190 BLE_GATT_UNIT_VOLUME_LITRE = 0x2767, /**< */
Rohit Grover 106:a20be740075d 191 BLE_GATT_UNIT_MASS_TONNE = 0x2768, /**< */
Rohit Grover 106:a20be740075d 192 BLE_GATT_UNIT_PRESSURE_BAR = 0x2780, /**< Pressure, Bar */
Rohit Grover 106:a20be740075d 193 BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781, /**< Pressure, Millimetre of Mercury */
Rohit Grover 106:a20be740075d 194 BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782, /**< */
Rohit Grover 106:a20be740075d 195 BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783, /**< */
Rohit Grover 106:a20be740075d 196 BLE_GATT_UNIT_AREA_BARN = 0x2784, /**< */
Rohit Grover 106:a20be740075d 197 BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785, /**< */
Rohit Grover 106:a20be740075d 198 BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786, /**< */
Rohit Grover 106:a20be740075d 199 BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787, /**< */
Rohit Grover 106:a20be740075d 200 BLE_GATT_UNIT_LENGTH_YARD = 0x27A0, /**< Length, Yard */
Rohit Grover 106:a20be740075d 201 BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1, /**< Length, Parsec */
Rohit Grover 106:a20be740075d 202 BLE_GATT_UNIT_LENGTH_INCH = 0x27A2, /**< Length, Inch */
Rohit Grover 106:a20be740075d 203 BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3, /**< Length, Foot */
Rohit Grover 106:a20be740075d 204 BLE_GATT_UNIT_LENGTH_MILE = 0x27A4, /**< Length, Mile */
Rohit Grover 106:a20be740075d 205 BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5, /**< */
Rohit Grover 106:a20be740075d 206 BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6, /**< Velocity, Kilometre per Hour */
Rohit Grover 106:a20be740075d 207 BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7, /**< Velocity, Mile per Hour */
Rohit Grover 106:a20be740075d 208 BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8, /**< Angular Velocity, Revolution per Minute */
Rohit Grover 106:a20be740075d 209 BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9, /**< Energy, Gram Calorie */
Rohit Grover 106:a20be740075d 210 BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA, /**< Energy, Kilogram Calorie */
Rohit Grover 106:a20be740075d 211 BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB, /**< Energy, Killowatt Hour */
Rohit Grover 106:a20be740075d 212 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC, /**< */
Rohit Grover 106:a20be740075d 213 BLE_GATT_UNIT_PERCENTAGE = 0x27AD, /**< Percentage */
Rohit Grover 106:a20be740075d 214 BLE_GATT_UNIT_PER_MILLE = 0x27AE, /**< */
Rohit Grover 106:a20be740075d 215 BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF, /**< */
Rohit Grover 106:a20be740075d 216 BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0, /**< */
Rohit Grover 106:a20be740075d 217 BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1, /**< */
Rohit Grover 106:a20be740075d 218 BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2, /**< */
Rohit Grover 106:a20be740075d 219 BLE_GATT_UNIT_TIME_YEAR = 0x27B3, /**< Time, Year */
Rohit Grover 106:a20be740075d 220 BLE_GATT_UNIT_TIME_MONTH = 0x27B4, /**< Time, Month */
Rohit Grover 106:a20be740075d 221 BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5, /**< */
Rohit Grover 106:a20be740075d 222 BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6 /**< */
Rohit Grover 106:a20be740075d 223 } ble_gatt_unit_t;
Rohit Grover 106:a20be740075d 224
Rohit Grover 106:a20be740075d 225 /**************************************************************************/
Rohit Grover 106:a20be740075d 226 /*!
Rohit Grover 106:a20be740075d 227 \brief Standard GATT number types
Rohit Grover 106:a20be740075d 228
Rohit Grover 106:a20be740075d 229 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
Rohit Grover 106:a20be740075d 230 \note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
Rohit Grover 106:a20be740075d 231 */
Rohit Grover 106:a20be740075d 232 /**************************************************************************/
Rohit Grover 106:a20be740075d 233 typedef enum ble_gatt_format_e {
Rohit Grover 106:a20be740075d 234 BLE_GATT_FORMAT_RFU = 0x00, /**< Reserved For Future Use. */
Rohit Grover 106:a20be740075d 235 BLE_GATT_FORMAT_BOOLEAN = 0x01, /**< Boolean. */
Rohit Grover 106:a20be740075d 236 BLE_GATT_FORMAT_2BIT = 0x02, /**< Unsigned 2-bit integer. */
Rohit Grover 106:a20be740075d 237 BLE_GATT_FORMAT_NIBBLE = 0x03, /**< Unsigned 4-bit integer. */
Rohit Grover 106:a20be740075d 238 BLE_GATT_FORMAT_UINT8 = 0x04, /**< Unsigned 8-bit integer. */
Rohit Grover 106:a20be740075d 239 BLE_GATT_FORMAT_UINT12 = 0x05, /**< Unsigned 12-bit integer. */
Rohit Grover 106:a20be740075d 240 BLE_GATT_FORMAT_UINT16 = 0x06, /**< Unsigned 16-bit integer. */
Rohit Grover 106:a20be740075d 241 BLE_GATT_FORMAT_UINT24 = 0x07, /**< Unsigned 24-bit integer. */
Rohit Grover 106:a20be740075d 242 BLE_GATT_FORMAT_UINT32 = 0x08, /**< Unsigned 32-bit integer. */
Rohit Grover 106:a20be740075d 243 BLE_GATT_FORMAT_UINT48 = 0x09, /**< Unsigned 48-bit integer. */
Rohit Grover 106:a20be740075d 244 BLE_GATT_FORMAT_UINT64 = 0x0A, /**< Unsigned 64-bit integer. */
Rohit Grover 106:a20be740075d 245 BLE_GATT_FORMAT_UINT128 = 0x0B, /**< Unsigned 128-bit integer. */
Rohit Grover 106:a20be740075d 246 BLE_GATT_FORMAT_SINT8 = 0x0C, /**< Signed 2-bit integer. */
Rohit Grover 106:a20be740075d 247 BLE_GATT_FORMAT_SINT12 = 0x0D, /**< Signed 12-bit integer. */
Rohit Grover 106:a20be740075d 248 BLE_GATT_FORMAT_SINT16 = 0x0E, /**< Signed 16-bit integer. */
Rohit Grover 106:a20be740075d 249 BLE_GATT_FORMAT_SINT24 = 0x0F, /**< Signed 24-bit integer. */
Rohit Grover 106:a20be740075d 250 BLE_GATT_FORMAT_SINT32 = 0x10, /**< Signed 32-bit integer. */
Rohit Grover 106:a20be740075d 251 BLE_GATT_FORMAT_SINT48 = 0x11, /**< Signed 48-bit integer. */
Rohit Grover 106:a20be740075d 252 BLE_GATT_FORMAT_SINT64 = 0x12, /**< Signed 64-bit integer. */
Rohit Grover 106:a20be740075d 253 BLE_GATT_FORMAT_SINT128 = 0x13, /**< Signed 128-bit integer. */
Rohit Grover 106:a20be740075d 254 BLE_GATT_FORMAT_FLOAT32 = 0x14, /**< IEEE-754 32-bit floating point. */
Rohit Grover 106:a20be740075d 255 BLE_GATT_FORMAT_FLOAT64 = 0x15, /**< IEEE-754 64-bit floating point. */
Rohit Grover 106:a20be740075d 256 BLE_GATT_FORMAT_SFLOAT = 0x16, /**< IEEE-11073 16-bit SFLOAT. */
Rohit Grover 106:a20be740075d 257 BLE_GATT_FORMAT_FLOAT = 0x17, /**< IEEE-11073 32-bit FLOAT. */
Rohit Grover 106:a20be740075d 258 BLE_GATT_FORMAT_DUINT16 = 0x18, /**< IEEE-20601 format. */
Rohit Grover 106:a20be740075d 259 BLE_GATT_FORMAT_UTF8S = 0x19, /**< UTF-8 string. */
Rohit Grover 106:a20be740075d 260 BLE_GATT_FORMAT_UTF16S = 0x1A, /**< UTF-16 string. */
Rohit Grover 106:a20be740075d 261 BLE_GATT_FORMAT_STRUCT = 0x1B /**< Opaque Structure. */
Rohit Grover 106:a20be740075d 262 } ble_gatt_format_t;
Rohit Grover 106:a20be740075d 263
Rohit Grover 106:a20be740075d 264 /**************************************************************************/
Rohit Grover 106:a20be740075d 265 /*!
Rohit Grover 106:a20be740075d 266 \brief Standard GATT characteritic properties
Rohit Grover 106:a20be740075d 267
Rohit Grover 106:a20be740075d 268 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
Rohit Grover 106:a20be740075d 269 and Section 3.3.3.1 for Extended Properties
Rohit Grover 106:a20be740075d 270 */
Rohit Grover 106:a20be740075d 271 /**************************************************************************/
Rohit Grover 106:a20be740075d 272 typedef enum ble_gatt_char_properties_e {
Rohit Grover 106:a20be740075d 273 BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
Rohit Grover 106:a20be740075d 274 BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01, /**< Permits broadcasts of the Characteristic Value using Server Characteristic Configuration Descriptor. */
Rohit Grover 106:a20be740075d 275 BLE_GATT_CHAR_PROPERTIES_READ = 0x02, /**< Permits reads of the Characteristic Value. */
Rohit Grover 106:a20be740075d 276 BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04, /**< Permits writes of the Characteristic Value without response. */
Rohit Grover 106:a20be740075d 277 BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08, /**< Permits writes of the Characteristic Value with response. */
Rohit Grover 106:a20be740075d 278 BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10, /**< Permits notifications of a Characteristic Value without acknowledgement. */
Rohit Grover 106:a20be740075d 279 BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20, /**< Permits indications of a Characteristic Value with acknowledgement. */
Rohit Grover 106:a20be740075d 280 BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Permits signed writes to the Characteristic Value. */
Rohit Grover 106:a20be740075d 281 BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80 /**< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor */
Rohit Grover 106:a20be740075d 282 } ble_gatt_char_properties_t;
Rohit Grover 106:a20be740075d 283
Rohit Grover 106:a20be740075d 284 /**************************************************************************/
Rohit Grover 106:a20be740075d 285 /*!
Rohit Grover 106:a20be740075d 286 \brief GATT presentation format wrapper
Rohit Grover 106:a20be740075d 287
Rohit Grover 106:a20be740075d 288 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
Rohit Grover 106:a20be740075d 289 \note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
Rohit Grover 106:a20be740075d 290 */
Rohit Grover 106:a20be740075d 291 /**************************************************************************/
Rohit Grover 106:a20be740075d 292 typedef struct PresentationFormat {
Rohit Grover 106:a20be740075d 293 uint8_t gatt_format; /**< Format of the value, see @ref ble_gatt_format_t. */
Rohit Grover 106:a20be740075d 294 int8_t exponent; /**< Exponent for integer data types. Ex. if Exponent = -3 and the char value is 3892, the actual value is 3.892 */
Rohit Grover 106:a20be740075d 295 uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers, see @ref ble_gatt_unit_t. */
Rohit Grover 106:a20be740075d 296 uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1', see @ref BLE_GATT_CPF_NAMESPACES. */
Rohit Grover 106:a20be740075d 297 uint16_t gatt_nsdesc; /**< Namespace description from Bluetooth Assigned Numbers, normally '0', see @ref BLE_GATT_CPF_NAMESPACES. */
Rohit Grover 106:a20be740075d 298 } presentation_format_t;
Rohit Grover 106:a20be740075d 299
carlescufi 113:7e3fd573d87b 300 /**
Rohit Grover 106:a20be740075d 301 * @brief Creates a new GattCharacteristic using the specified 16-bit
Rohit Grover 106:a20be740075d 302 * UUID, value length, and properties
Rohit Grover 106:a20be740075d 303 *
Rohit Grover 106:a20be740075d 304 * @note The UUID value must be unique in the service and is normally >1
Rohit Grover 106:a20be740075d 305 *
Rohit Grover 106:a20be740075d 306 * @param[in] uuid
Rohit Grover 106:a20be740075d 307 * The UUID to use for this characteristic
Rohit Grover 106:a20be740075d 308 * @param[in] valuePtr
Rohit Grover 118:620d28e7a1ba 309 * The memory holding the initial value. The value is copied
Rohit Grover 118:620d28e7a1ba 310 * into the stack when the enclosing service is added; and
Rohit Grover 118:620d28e7a1ba 311 * thereafter maintained internally by the stack.
Rohit Grover 106:a20be740075d 312 * @param[in] initialLen
Rohit Grover 106:a20be740075d 313 * The min length in bytes of this characteristic's value
Rohit Grover 106:a20be740075d 314 * @param[in] maxLen
Rohit Grover 106:a20be740075d 315 * The max length in bytes of this characteristic's value
Rohit Grover 106:a20be740075d 316 * @param[in] props
Rohit Grover 106:a20be740075d 317 * The 8-bit bit field containing the characteristic's properties
carlescufi 113:7e3fd573d87b 318 * @param[in] descriptors
carlescufi 113:7e3fd573d87b 319 * A pointer to an array of descriptors to be included within this characteristic
carlescufi 113:7e3fd573d87b 320 * @param[in] numDescriptors
carlescufi 113:7e3fd573d87b 321 * The number of descriptors
Rohit Grover 118:620d28e7a1ba 322 *
Rohit Grover 118:620d28e7a1ba 323 * @NOTE: If valuePtr == NULL, initialLength == 0, and properties == READ
Rohit Grover 118:620d28e7a1ba 324 * for the value attribute of a characteristic, then that particular
Rohit Grover 118:620d28e7a1ba 325 * characteristic may be considered optional and dropped while
Rohit Grover 118:620d28e7a1ba 326 * instantiating the service with the underlying BLE stack.
Rohit Grover 106:a20be740075d 327 */
Rohit Grover 106:a20be740075d 328 /**************************************************************************/
Rohit Grover 106:a20be740075d 329 GattCharacteristic(const UUID &uuid, uint8_t *valuePtr = NULL, uint16_t initialLen = 0, uint16_t maxLen = 0,
carlescufi 113:7e3fd573d87b 330 uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
carlescufi 113:7e3fd573d87b 331 GattAttribute *descriptors[] = NULL, unsigned numDescriptors = 0) :
carlescufi 115:47e4cdd7b0c5 332 _valueAttribute(uuid, valuePtr, initialLen, maxLen), _properties(props), _descriptors(descriptors), _descriptorCount(numDescriptors) {
Rohit Grover 106:a20be740075d 333 }
Rohit Grover 106:a20be740075d 334
Rohit Grover 106:a20be740075d 335 public:
carlescufi 115:47e4cdd7b0c5 336 GattAttribute& getValueAttribute() {
carlescufi 115:47e4cdd7b0c5 337 return _valueAttribute;
carlescufi 115:47e4cdd7b0c5 338 }
Rohit Grover 106:a20be740075d 339 uint8_t getProperties(void) const {
Rohit Grover 106:a20be740075d 340 return _properties;
Rohit Grover 106:a20be740075d 341 }
carlescufi 114:f1ede142a78f 342 uint8_t getDescriptorCount(void) const {
carlescufi 114:f1ede142a78f 343 return _descriptorCount;
carlescufi 114:f1ede142a78f 344 }
carlescufi 114:f1ede142a78f 345 GattAttribute *getDescriptor(uint8_t index) {
carlescufi 114:f1ede142a78f 346 if (index >= _descriptorCount) {
carlescufi 114:f1ede142a78f 347 return NULL;
carlescufi 114:f1ede142a78f 348 }
carlescufi 114:f1ede142a78f 349
carlescufi 114:f1ede142a78f 350 return _descriptors[index];
carlescufi 114:f1ede142a78f 351 }
carlescufi 112:64c88ad45610 352
Rohit Grover 106:a20be740075d 353 private:
carlescufi 115:47e4cdd7b0c5 354 GattAttribute _valueAttribute;
carlescufi 115:47e4cdd7b0c5 355 uint8_t _properties;
carlescufi 115:47e4cdd7b0c5 356 GattAttribute ** _descriptors;
carlescufi 115:47e4cdd7b0c5 357 uint8_t _descriptorCount;
Rohit Grover 106:a20be740075d 358 };
Rohit Grover 106:a20be740075d 359
Rohit Grover 106:a20be740075d 360 #endif // ifndef __GATT_CHARACTERISTIC_H__