High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Wed Apr 06 19:13:46 2016 +0100
Revision:
1131:692ddf04fc42
Parent:
1054:f59e5d9a992a
Child:
1132:6362b7c2fdff
Synchronized with git rev 13bf70b6
Author: Rohit Grover
Release 2.1.5
=============

A minor release to separate the concept of minlen and len in
GattCharacteristic. Also contains some improvements to documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 1131:692ddf04fc42 1 /* mbed Microcontroller Library
vcoubard 1131:692ddf04fc42 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 1131:692ddf04fc42 3 *
vcoubard 1131:692ddf04fc42 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 1131:692ddf04fc42 5 * you may not use this file except in compliance with the License.
vcoubard 1131:692ddf04fc42 6 * You may obtain a copy of the License at
vcoubard 1131:692ddf04fc42 7 *
vcoubard 1131:692ddf04fc42 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 1131:692ddf04fc42 9 *
vcoubard 1131:692ddf04fc42 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 1131:692ddf04fc42 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 1131:692ddf04fc42 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 1131:692ddf04fc42 13 * See the License for the specific language governing permissions and
vcoubard 1131:692ddf04fc42 14 * limitations under the License.
vcoubard 1131:692ddf04fc42 15 */
vcoubard 1131:692ddf04fc42 16
vcoubard 1131:692ddf04fc42 17 #ifndef __GATT_CHARACTERISTIC_H__
vcoubard 1131:692ddf04fc42 18 #define __GATT_CHARACTERISTIC_H__
vcoubard 1131:692ddf04fc42 19
vcoubard 1131:692ddf04fc42 20 #include "Gap.h"
vcoubard 1131:692ddf04fc42 21 #include "SecurityManager.h"
vcoubard 1131:692ddf04fc42 22 #include "GattAttribute.h"
vcoubard 1131:692ddf04fc42 23 #include "GattCallbackParamTypes.h"
vcoubard 1131:692ddf04fc42 24 #include "FunctionPointerWithContext.h"
vcoubard 1131:692ddf04fc42 25
vcoubard 1131:692ddf04fc42 26 class GattCharacteristic {
vcoubard 1131:692ddf04fc42 27 public:
vcoubard 1131:692ddf04fc42 28 enum {
vcoubard 1131:692ddf04fc42 29 UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
vcoubard 1131:692ddf04fc42 30 UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
vcoubard 1131:692ddf04fc42 31 UUID_REMOVABLE_CHAR = 0x2A3A,
vcoubard 1131:692ddf04fc42 32 UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
vcoubard 1131:692ddf04fc42 33 UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
vcoubard 1131:692ddf04fc42 34 UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
vcoubard 1131:692ddf04fc42 35 UUID_ALERT_LEVEL_CHAR = 0x2A06,
vcoubard 1131:692ddf04fc42 36 UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
vcoubard 1131:692ddf04fc42 37 UUID_ALERT_STATUS_CHAR = 0x2A3F,
vcoubard 1131:692ddf04fc42 38 UUID_BATTERY_LEVEL_CHAR = 0x2A19,
vcoubard 1131:692ddf04fc42 39 UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
vcoubard 1131:692ddf04fc42 40 UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
vcoubard 1131:692ddf04fc42 41 UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
vcoubard 1131:692ddf04fc42 42 UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
vcoubard 1131:692ddf04fc42 43 UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
vcoubard 1131:692ddf04fc42 44 UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
vcoubard 1131:692ddf04fc42 45 UUID_CURRENT_TIME_CHAR = 0x2A2B,
vcoubard 1131:692ddf04fc42 46 UUID_DATE_TIME_CHAR = 0x2A08,
vcoubard 1131:692ddf04fc42 47 UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
vcoubard 1131:692ddf04fc42 48 UUID_DAY_OF_WEEK_CHAR = 0x2A09,
vcoubard 1131:692ddf04fc42 49 UUID_DST_OFFSET_CHAR = 0x2A0D,
vcoubard 1131:692ddf04fc42 50 UUID_EXACT_TIME_256_CHAR = 0x2A0C,
vcoubard 1131:692ddf04fc42 51 UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
vcoubard 1131:692ddf04fc42 52 UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
vcoubard 1131:692ddf04fc42 53 UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
vcoubard 1131:692ddf04fc42 54 UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
vcoubard 1131:692ddf04fc42 55 UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
vcoubard 1131:692ddf04fc42 56 UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
vcoubard 1131:692ddf04fc42 57 UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
vcoubard 1131:692ddf04fc42 58 UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
vcoubard 1131:692ddf04fc42 59 UUID_HID_INFORMATION_CHAR = 0x2A4A,
vcoubard 1131:692ddf04fc42 60 UUID_HUMIDITY_CHAR = 0x2A6F,
vcoubard 1131:692ddf04fc42 61 UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
vcoubard 1131:692ddf04fc42 62 UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
vcoubard 1131:692ddf04fc42 63 UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
vcoubard 1131:692ddf04fc42 64 UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
vcoubard 1131:692ddf04fc42 65 UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
vcoubard 1131:692ddf04fc42 66 UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
vcoubard 1131:692ddf04fc42 67 UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
vcoubard 1131:692ddf04fc42 68 UUID_UNREAD_ALERT_CHAR = 0x2A45,
vcoubard 1131:692ddf04fc42 69 UUID_NEW_ALERT_CHAR = 0x2A46,
vcoubard 1131:692ddf04fc42 70 UUID_PNP_ID_CHAR = 0x2A50,
vcoubard 1131:692ddf04fc42 71 UUID_PRESSURE_CHAR = 0x2A6D,
vcoubard 1131:692ddf04fc42 72 UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
vcoubard 1131:692ddf04fc42 73 UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
vcoubard 1131:692ddf04fc42 74 UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
vcoubard 1131:692ddf04fc42 75 UUID_REPORT_CHAR = 0x2A4D,
vcoubard 1131:692ddf04fc42 76 UUID_REPORT_MAP_CHAR = 0x2A4B,
vcoubard 1131:692ddf04fc42 77 UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
vcoubard 1131:692ddf04fc42 78 UUID_RINGER_SETTING_CHAR = 0x2A41,
vcoubard 1131:692ddf04fc42 79 UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
vcoubard 1131:692ddf04fc42 80 UUID_SCAN_REFRESH_CHAR = 0x2A31,
vcoubard 1131:692ddf04fc42 81 UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
vcoubard 1131:692ddf04fc42 82 UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
vcoubard 1131:692ddf04fc42 83 UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
vcoubard 1131:692ddf04fc42 84 UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
vcoubard 1131:692ddf04fc42 85 UUID_SYSTEM_ID_CHAR = 0x2A23,
vcoubard 1131:692ddf04fc42 86 UUID_TEMPERATURE_CHAR = 0x2A6E,
vcoubard 1131:692ddf04fc42 87 UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
vcoubard 1131:692ddf04fc42 88 UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
vcoubard 1131:692ddf04fc42 89 UUID_TIME_ACCURACY_CHAR = 0x2A12,
vcoubard 1131:692ddf04fc42 90 UUID_TIME_SOURCE_CHAR = 0x2A13,
vcoubard 1131:692ddf04fc42 91 UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
vcoubard 1131:692ddf04fc42 92 UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
vcoubard 1131:692ddf04fc42 93 UUID_TIME_WITH_DST_CHAR = 0x2A11,
vcoubard 1131:692ddf04fc42 94 UUID_TIME_ZONE_CHAR = 0x2A0E,
vcoubard 1131:692ddf04fc42 95 UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
vcoubard 1131:692ddf04fc42 96 UUID_CSC_FEATURE_CHAR = 0x2A5C,
vcoubard 1131:692ddf04fc42 97 UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
vcoubard 1131:692ddf04fc42 98 UUID_RSC_FEATURE_CHAR = 0x2A54,
vcoubard 1131:692ddf04fc42 99 UUID_RSC_MEASUREMENT_CHAR = 0x2A53
vcoubard 1131:692ddf04fc42 100 };
vcoubard 1131:692ddf04fc42 101
vcoubard 1131:692ddf04fc42 102 /**************************************************************************/
vcoubard 1131:692ddf04fc42 103 /*!
vcoubard 1131:692ddf04fc42 104 \brief Standard GATT characteristic presentation format unit types.
vcoubard 1131:692ddf04fc42 105 These unit types are used to describe what the raw numeric
vcoubard 1131:692ddf04fc42 106 data in a characteristic actually represents.
vcoubard 1131:692ddf04fc42 107
vcoubard 1131:692ddf04fc42 108 \note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
vcoubard 1131:692ddf04fc42 109 */
vcoubard 1131:692ddf04fc42 110 /**************************************************************************/
vcoubard 1131:692ddf04fc42 111 enum {
vcoubard 1131:692ddf04fc42 112 BLE_GATT_UNIT_NONE = 0x2700, /**< No specified unit type. */
vcoubard 1131:692ddf04fc42 113 BLE_GATT_UNIT_LENGTH_METRE = 0x2701, /**< Length, metre. */
vcoubard 1131:692ddf04fc42 114 BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702, /**< Mass, kilogram. */
vcoubard 1131:692ddf04fc42 115 BLE_GATT_UNIT_TIME_SECOND = 0x2703, /**< Time, second. */
vcoubard 1131:692ddf04fc42 116 BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704, /**< Electric current, ampere. */
vcoubard 1131:692ddf04fc42 117 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705, /**< Thermodynamic temperature, kelvin. */
vcoubard 1131:692ddf04fc42 118 BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706, /**< Amount of substance, mole. */
vcoubard 1131:692ddf04fc42 119 BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707, /**< Luminous intensity, candela. */
vcoubard 1131:692ddf04fc42 120 BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710, /**< Area, square metres. */
vcoubard 1131:692ddf04fc42 121 BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711, /**< Volume, cubic metres. */
vcoubard 1131:692ddf04fc42 122 BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712, /**< Velocity, metres per second. */
vcoubard 1131:692ddf04fc42 123 BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713, /**< Acceleration, metres per second squared. */
vcoubard 1131:692ddf04fc42 124 BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714, /**< Wave number reciprocal, metre. */
vcoubard 1131:692ddf04fc42 125 BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715, /**< Density, kilogram per cubic metre. */
vcoubard 1131:692ddf04fc42 126 BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716, /**< */
vcoubard 1131:692ddf04fc42 127 BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717, /**< */
vcoubard 1131:692ddf04fc42 128 BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718, /**< */
vcoubard 1131:692ddf04fc42 129 BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719, /**< Magnetic field strength, ampere per metre. */
vcoubard 1131:692ddf04fc42 130 BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A, /**< */
vcoubard 1131:692ddf04fc42 131 BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B, /**< */
vcoubard 1131:692ddf04fc42 132 BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C, /**< */
vcoubard 1131:692ddf04fc42 133 BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D, /**< */
vcoubard 1131:692ddf04fc42 134 BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E, /**< */
vcoubard 1131:692ddf04fc42 135 BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720, /**< */
vcoubard 1131:692ddf04fc42 136 BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721, /**< */
vcoubard 1131:692ddf04fc42 137 BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722, /**< Frequency, hertz. */
vcoubard 1131:692ddf04fc42 138 BLE_GATT_UNIT_FORCE_NEWTON = 0x2723, /**< Force, newton. */
vcoubard 1131:692ddf04fc42 139 BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724, /**< Pressure, pascal. */
vcoubard 1131:692ddf04fc42 140 BLE_GATT_UNIT_ENERGY_JOULE = 0x2725, /**< Energy, joule. */
vcoubard 1131:692ddf04fc42 141 BLE_GATT_UNIT_POWER_WATT = 0x2726, /**< Power, watt. */
vcoubard 1131:692ddf04fc42 142 BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727, /**< Electrical charge, coulomb. */
vcoubard 1131:692ddf04fc42 143 BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728, /**< Electrical potential difference, voltage. */
vcoubard 1131:692ddf04fc42 144 BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729, /**< */
vcoubard 1131:692ddf04fc42 145 BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A, /**< */
vcoubard 1131:692ddf04fc42 146 BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B, /**< */
vcoubard 1131:692ddf04fc42 147 BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C, /**< */
vcoubard 1131:692ddf04fc42 148 BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D, /**< */
vcoubard 1131:692ddf04fc42 149 BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E, /**< */
vcoubard 1131:692ddf04fc42 150 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F, /**< */
vcoubard 1131:692ddf04fc42 151 BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730, /**< */
vcoubard 1131:692ddf04fc42 152 BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731, /**< */
vcoubard 1131:692ddf04fc42 153 BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732, /**< */
vcoubard 1131:692ddf04fc42 154 BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733, /**< */
vcoubard 1131:692ddf04fc42 155 BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734, /**< */
vcoubard 1131:692ddf04fc42 156 BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735, /**< */
vcoubard 1131:692ddf04fc42 157 BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740, /**< */
vcoubard 1131:692ddf04fc42 158 BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741, /**< */
vcoubard 1131:692ddf04fc42 159 BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742, /**< */
vcoubard 1131:692ddf04fc42 160 BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743, /**< */
vcoubard 1131:692ddf04fc42 161 BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744, /**< */
vcoubard 1131:692ddf04fc42 162 BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745, /**< */
vcoubard 1131:692ddf04fc42 163 BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746, /**< */
vcoubard 1131:692ddf04fc42 164 BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747, /**< */
vcoubard 1131:692ddf04fc42 165 BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748, /**< */
vcoubard 1131:692ddf04fc42 166 BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749, /**< */
vcoubard 1131:692ddf04fc42 167 BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A, /**< */
vcoubard 1131:692ddf04fc42 168 BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B, /**< */
vcoubard 1131:692ddf04fc42 169 BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C, /**< */
vcoubard 1131:692ddf04fc42 170 BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D, /**< */
vcoubard 1131:692ddf04fc42 171 BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E, /**< */
vcoubard 1131:692ddf04fc42 172 BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F, /**< */
vcoubard 1131:692ddf04fc42 173 BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750, /**< */
vcoubard 1131:692ddf04fc42 174 BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751, /**< */
vcoubard 1131:692ddf04fc42 175 BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752, /**< */
vcoubard 1131:692ddf04fc42 176 BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753, /**< */
vcoubard 1131:692ddf04fc42 177 BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754, /**< */
vcoubard 1131:692ddf04fc42 178 BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755, /**< */
vcoubard 1131:692ddf04fc42 179 BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756, /**< */
vcoubard 1131:692ddf04fc42 180 BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757, /**< */
vcoubard 1131:692ddf04fc42 181 BLE_GATT_UNIT_TIME_MINUTE = 0x2760, /**< Time, minute. */
vcoubard 1131:692ddf04fc42 182 BLE_GATT_UNIT_TIME_HOUR = 0x2761, /**< Time, hour. */
vcoubard 1131:692ddf04fc42 183 BLE_GATT_UNIT_TIME_DAY = 0x2762, /**< Time, day. */
vcoubard 1131:692ddf04fc42 184 BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763, /**< */
vcoubard 1131:692ddf04fc42 185 BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764, /**< */
vcoubard 1131:692ddf04fc42 186 BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765, /**< */
vcoubard 1131:692ddf04fc42 187 BLE_GATT_UNIT_AREA_HECTARE = 0x2766, /**< */
vcoubard 1131:692ddf04fc42 188 BLE_GATT_UNIT_VOLUME_LITRE = 0x2767, /**< */
vcoubard 1131:692ddf04fc42 189 BLE_GATT_UNIT_MASS_TONNE = 0x2768, /**< */
vcoubard 1131:692ddf04fc42 190 BLE_GATT_UNIT_PRESSURE_BAR = 0x2780, /**< Pressure, bar. */
vcoubard 1131:692ddf04fc42 191 BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781, /**< Pressure, millimetre of mercury. */
vcoubard 1131:692ddf04fc42 192 BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782, /**< */
vcoubard 1131:692ddf04fc42 193 BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783, /**< */
vcoubard 1131:692ddf04fc42 194 BLE_GATT_UNIT_AREA_BARN = 0x2784, /**< */
vcoubard 1131:692ddf04fc42 195 BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785, /**< */
vcoubard 1131:692ddf04fc42 196 BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786, /**< */
vcoubard 1131:692ddf04fc42 197 BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787, /**< */
vcoubard 1131:692ddf04fc42 198 BLE_GATT_UNIT_LENGTH_YARD = 0x27A0, /**< Length, yard. */
vcoubard 1131:692ddf04fc42 199 BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1, /**< Length, parsec. */
vcoubard 1131:692ddf04fc42 200 BLE_GATT_UNIT_LENGTH_INCH = 0x27A2, /**< Length, inch. */
vcoubard 1131:692ddf04fc42 201 BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3, /**< Length, foot. */
vcoubard 1131:692ddf04fc42 202 BLE_GATT_UNIT_LENGTH_MILE = 0x27A4, /**< Length, mile. */
vcoubard 1131:692ddf04fc42 203 BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5, /**< */
vcoubard 1131:692ddf04fc42 204 BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6, /**< Velocity, kilometre per hour. */
vcoubard 1131:692ddf04fc42 205 BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7, /**< Velocity, mile per hour. */
vcoubard 1131:692ddf04fc42 206 BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8, /**< Angular Velocity, revolution per minute. */
vcoubard 1131:692ddf04fc42 207 BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9, /**< Energy, gram calorie. */
vcoubard 1131:692ddf04fc42 208 BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA, /**< Energy, kilogram calorie. */
vcoubard 1131:692ddf04fc42 209 BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB, /**< Energy, killowatt hour. */
vcoubard 1131:692ddf04fc42 210 BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC, /**< */
vcoubard 1131:692ddf04fc42 211 BLE_GATT_UNIT_PERCENTAGE = 0x27AD, /**< Percentage. */
vcoubard 1131:692ddf04fc42 212 BLE_GATT_UNIT_PER_MILLE = 0x27AE, /**< */
vcoubard 1131:692ddf04fc42 213 BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF, /**< */
vcoubard 1131:692ddf04fc42 214 BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0, /**< */
vcoubard 1131:692ddf04fc42 215 BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1, /**< */
vcoubard 1131:692ddf04fc42 216 BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2, /**< */
vcoubard 1131:692ddf04fc42 217 BLE_GATT_UNIT_TIME_YEAR = 0x27B3, /**< Time, year. */
vcoubard 1131:692ddf04fc42 218 BLE_GATT_UNIT_TIME_MONTH = 0x27B4, /**< Time, month. */
vcoubard 1131:692ddf04fc42 219 BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5, /**< */
vcoubard 1131:692ddf04fc42 220 BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6 /**< */
vcoubard 1131:692ddf04fc42 221 };
vcoubard 1131:692ddf04fc42 222
vcoubard 1131:692ddf04fc42 223 /**************************************************************************/
vcoubard 1131:692ddf04fc42 224 /*!
vcoubard 1131:692ddf04fc42 225 \brief Standard GATT number types.
vcoubard 1131:692ddf04fc42 226
vcoubard 1131:692ddf04fc42 227 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
vcoubard 1131:692ddf04fc42 228 \note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
vcoubard 1131:692ddf04fc42 229 */
vcoubard 1131:692ddf04fc42 230 /**************************************************************************/
vcoubard 1131:692ddf04fc42 231 enum {
vcoubard 1131:692ddf04fc42 232 BLE_GATT_FORMAT_RFU = 0x00, /**< Reserved for future use. */
vcoubard 1131:692ddf04fc42 233 BLE_GATT_FORMAT_BOOLEAN = 0x01, /**< Boolean. */
vcoubard 1131:692ddf04fc42 234 BLE_GATT_FORMAT_2BIT = 0x02, /**< Unsigned 2-bit integer. */
vcoubard 1131:692ddf04fc42 235 BLE_GATT_FORMAT_NIBBLE = 0x03, /**< Unsigned 4-bit integer. */
vcoubard 1131:692ddf04fc42 236 BLE_GATT_FORMAT_UINT8 = 0x04, /**< Unsigned 8-bit integer. */
vcoubard 1131:692ddf04fc42 237 BLE_GATT_FORMAT_UINT12 = 0x05, /**< Unsigned 12-bit integer. */
vcoubard 1131:692ddf04fc42 238 BLE_GATT_FORMAT_UINT16 = 0x06, /**< Unsigned 16-bit integer. */
vcoubard 1131:692ddf04fc42 239 BLE_GATT_FORMAT_UINT24 = 0x07, /**< Unsigned 24-bit integer. */
vcoubard 1131:692ddf04fc42 240 BLE_GATT_FORMAT_UINT32 = 0x08, /**< Unsigned 32-bit integer. */
vcoubard 1131:692ddf04fc42 241 BLE_GATT_FORMAT_UINT48 = 0x09, /**< Unsigned 48-bit integer. */
vcoubard 1131:692ddf04fc42 242 BLE_GATT_FORMAT_UINT64 = 0x0A, /**< Unsigned 64-bit integer. */
vcoubard 1131:692ddf04fc42 243 BLE_GATT_FORMAT_UINT128 = 0x0B, /**< Unsigned 128-bit integer. */
vcoubard 1131:692ddf04fc42 244 BLE_GATT_FORMAT_SINT8 = 0x0C, /**< Signed 2-bit integer. */
vcoubard 1131:692ddf04fc42 245 BLE_GATT_FORMAT_SINT12 = 0x0D, /**< Signed 12-bit integer. */
vcoubard 1131:692ddf04fc42 246 BLE_GATT_FORMAT_SINT16 = 0x0E, /**< Signed 16-bit integer. */
vcoubard 1131:692ddf04fc42 247 BLE_GATT_FORMAT_SINT24 = 0x0F, /**< Signed 24-bit integer. */
vcoubard 1131:692ddf04fc42 248 BLE_GATT_FORMAT_SINT32 = 0x10, /**< Signed 32-bit integer. */
vcoubard 1131:692ddf04fc42 249 BLE_GATT_FORMAT_SINT48 = 0x11, /**< Signed 48-bit integer. */
vcoubard 1131:692ddf04fc42 250 BLE_GATT_FORMAT_SINT64 = 0x12, /**< Signed 64-bit integer. */
vcoubard 1131:692ddf04fc42 251 BLE_GATT_FORMAT_SINT128 = 0x13, /**< Signed 128-bit integer. */
vcoubard 1131:692ddf04fc42 252 BLE_GATT_FORMAT_FLOAT32 = 0x14, /**< IEEE-754 32-bit floating point. */
vcoubard 1131:692ddf04fc42 253 BLE_GATT_FORMAT_FLOAT64 = 0x15, /**< IEEE-754 64-bit floating point. */
vcoubard 1131:692ddf04fc42 254 BLE_GATT_FORMAT_SFLOAT = 0x16, /**< IEEE-11073 16-bit SFLOAT. */
vcoubard 1131:692ddf04fc42 255 BLE_GATT_FORMAT_FLOAT = 0x17, /**< IEEE-11073 32-bit FLOAT. */
vcoubard 1131:692ddf04fc42 256 BLE_GATT_FORMAT_DUINT16 = 0x18, /**< IEEE-20601 format. */
vcoubard 1131:692ddf04fc42 257 BLE_GATT_FORMAT_UTF8S = 0x19, /**< UTF-8 string. */
vcoubard 1131:692ddf04fc42 258 BLE_GATT_FORMAT_UTF16S = 0x1A, /**< UTF-16 string. */
vcoubard 1131:692ddf04fc42 259 BLE_GATT_FORMAT_STRUCT = 0x1B /**< Opaque Structure. */
vcoubard 1131:692ddf04fc42 260 };
vcoubard 1131:692ddf04fc42 261
vcoubard 1131:692ddf04fc42 262 /**************************************************************************/
vcoubard 1131:692ddf04fc42 263 /*!
vcoubard 1131:692ddf04fc42 264 \brief Standard GATT characteristic properties.
vcoubard 1131:692ddf04fc42 265
vcoubard 1131:692ddf04fc42 266 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
vcoubard 1131:692ddf04fc42 267 and Section 3.3.3.1 for Extended Properties
vcoubard 1131:692ddf04fc42 268 */
vcoubard 1131:692ddf04fc42 269 /**************************************************************************/
vcoubard 1131:692ddf04fc42 270 enum Properties_t {
vcoubard 1131:692ddf04fc42 271 BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
vcoubard 1131:692ddf04fc42 272 BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01, /**< Permits broadcasts of the characteristic value using the Server Characteristic Configuration descriptor. */
vcoubard 1131:692ddf04fc42 273 BLE_GATT_CHAR_PROPERTIES_READ = 0x02, /**< Permits reads of the characteristic value. */
vcoubard 1131:692ddf04fc42 274 BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04, /**< Permits writes of the characteristic value without response. */
vcoubard 1131:692ddf04fc42 275 BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08, /**< Permits writes of the characteristic value with response. */
vcoubard 1131:692ddf04fc42 276 BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10, /**< Permits notifications of a characteristic value without acknowledgment. */
vcoubard 1131:692ddf04fc42 277 BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20, /**< Permits indications of a characteristic value with acknowledgment. */
vcoubard 1131:692ddf04fc42 278 BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Permits signed writes to the characteristic value. */
vcoubard 1131:692ddf04fc42 279 BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80 /**< Additional characteristic properties are defined in the Characteristic Extended Properties descriptor */
vcoubard 1131:692ddf04fc42 280 };
vcoubard 1131:692ddf04fc42 281
vcoubard 1131:692ddf04fc42 282 /**************************************************************************/
vcoubard 1131:692ddf04fc42 283 /*!
vcoubard 1131:692ddf04fc42 284 \brief GATT presentation format wrapper
vcoubard 1131:692ddf04fc42 285
vcoubard 1131:692ddf04fc42 286 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
vcoubard 1131:692ddf04fc42 287 \note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
vcoubard 1131:692ddf04fc42 288 */
vcoubard 1131:692ddf04fc42 289 /**************************************************************************/
vcoubard 1131:692ddf04fc42 290 struct PresentationFormat_t {
vcoubard 1131:692ddf04fc42 291 uint8_t gatt_format; /**< Format of the value; see @ref ble_gatt_format_t. */
vcoubard 1131:692ddf04fc42 292 int8_t exponent; /**< Exponent for integer data types. Example: if Exponent = -3 and the char value is 3892, the actual value is 3.892 */
vcoubard 1131:692ddf04fc42 293 uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers; see @ref ble_gatt_unit_t. */
vcoubard 1131:692ddf04fc42 294 uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1'; see @ref BLE_GATT_CPF_NAMESPACES. */
vcoubard 1131:692ddf04fc42 295 uint16_t gatt_nsdesc; /**< Namespace description from Bluetooth Assigned Numbers, normally '0'; see @ref BLE_GATT_CPF_NAMESPACES. */
vcoubard 1131:692ddf04fc42 296 };
vcoubard 1131:692ddf04fc42 297
vcoubard 1131:692ddf04fc42 298 /**
vcoubard 1131:692ddf04fc42 299 * @brief Creates a new GattCharacteristic using the specified 16-bit
vcoubard 1131:692ddf04fc42 300 * UUID, value length, and properties.
vcoubard 1131:692ddf04fc42 301 *
vcoubard 1131:692ddf04fc42 302 * @note The UUID value must be unique in the service and is normally >1.
vcoubard 1131:692ddf04fc42 303 *
vcoubard 1131:692ddf04fc42 304 * @param[in] uuid
vcoubard 1131:692ddf04fc42 305 * The UUID to use for this characteristic.
vcoubard 1131:692ddf04fc42 306 * @param[in] valuePtr
vcoubard 1131:692ddf04fc42 307 * The memory holding the initial value. The value is copied
vcoubard 1131:692ddf04fc42 308 * into the stack when the enclosing service is added, and
vcoubard 1131:692ddf04fc42 309 * is thereafter maintained internally by the stack.
vcoubard 1131:692ddf04fc42 310 * @param[in] len
vcoubard 1131:692ddf04fc42 311 * The length in bytes of this characteristic's value.
vcoubard 1131:692ddf04fc42 312 * @param[in] maxLen
vcoubard 1131:692ddf04fc42 313 * The max length in bytes of this characteristic's value.
vcoubard 1131:692ddf04fc42 314 * @param[in] props
vcoubard 1131:692ddf04fc42 315 * The 8-bit field containing the characteristic's properties.
vcoubard 1131:692ddf04fc42 316 * @param[in] descriptors
vcoubard 1131:692ddf04fc42 317 * A pointer to an array of descriptors to be included within
vcoubard 1131:692ddf04fc42 318 * this characteristic. The memory for the descriptor array is
vcoubard 1131:692ddf04fc42 319 * owned by the caller, and should remain valid at least until
vcoubard 1131:692ddf04fc42 320 * the enclosing service is added to the GATT table.
vcoubard 1131:692ddf04fc42 321 * @param[in] numDescriptors
vcoubard 1131:692ddf04fc42 322 * The number of descriptors in the previous array.
vcoubard 1131:692ddf04fc42 323 *
vcoubard 1131:692ddf04fc42 324 * @NOTE: If valuePtr == NULL, length == 0, and properties == READ
vcoubard 1131:692ddf04fc42 325 * for the value attribute of a characteristic, then that particular
vcoubard 1131:692ddf04fc42 326 * characteristic may be considered optional and dropped while
vcoubard 1131:692ddf04fc42 327 * instantiating the service with the underlying BLE stack.
vcoubard 1131:692ddf04fc42 328 */
vcoubard 1131:692ddf04fc42 329 GattCharacteristic(const UUID &uuid,
vcoubard 1131:692ddf04fc42 330 uint8_t *valuePtr = NULL,
vcoubard 1131:692ddf04fc42 331 uint16_t len = 0,
vcoubard 1131:692ddf04fc42 332 uint16_t maxLen = 0,
vcoubard 1131:692ddf04fc42 333 uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 334 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 335 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 336 _valueAttribute(uuid, valuePtr, len, maxLen),
vcoubard 1131:692ddf04fc42 337 _properties(props),
vcoubard 1131:692ddf04fc42 338 _requiredSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK),
vcoubard 1131:692ddf04fc42 339 _descriptors(descriptors),
vcoubard 1131:692ddf04fc42 340 _descriptorCount(numDescriptors),
vcoubard 1131:692ddf04fc42 341 enabledReadAuthorization(false),
vcoubard 1131:692ddf04fc42 342 enabledWriteAuthorization(false),
vcoubard 1131:692ddf04fc42 343 readAuthorizationCallback(),
vcoubard 1131:692ddf04fc42 344 writeAuthorizationCallback() {
vcoubard 1131:692ddf04fc42 345 /* empty */
vcoubard 1131:692ddf04fc42 346 }
vcoubard 1131:692ddf04fc42 347
vcoubard 1131:692ddf04fc42 348 public:
vcoubard 1131:692ddf04fc42 349 /**
vcoubard 1131:692ddf04fc42 350 * Set up the minimum security (mode and level) requirements for access to the characteristic's value attribute.
vcoubard 1131:692ddf04fc42 351 *
vcoubard 1131:692ddf04fc42 352 * @param securityMode Can be one of encryption or signing, with or without protection for man in the middle attacks (MITM).
vcoubard 1131:692ddf04fc42 353 */
vcoubard 1131:692ddf04fc42 354 void requireSecurity(SecurityManager::SecurityMode_t securityMode) {
vcoubard 1131:692ddf04fc42 355 _requiredSecurity = securityMode;
vcoubard 1131:692ddf04fc42 356 }
vcoubard 1131:692ddf04fc42 357
vcoubard 1131:692ddf04fc42 358 public:
vcoubard 1131:692ddf04fc42 359 /**
vcoubard 1131:692ddf04fc42 360 * Authorization.
vcoubard 1131:692ddf04fc42 361 */
vcoubard 1131:692ddf04fc42 362 void setWriteAuthorizationCallback(void (*callback)(GattWriteAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 363 writeAuthorizationCallback.attach(callback);
vcoubard 1131:692ddf04fc42 364 enabledWriteAuthorization = true;
vcoubard 1131:692ddf04fc42 365 }
vcoubard 1131:692ddf04fc42 366 template <typename T>
vcoubard 1131:692ddf04fc42 367 void setWriteAuthorizationCallback(T *object, void (T::*member)(GattWriteAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 368 writeAuthorizationCallback.attach(object, member);
vcoubard 1131:692ddf04fc42 369 enabledWriteAuthorization = true;
vcoubard 1131:692ddf04fc42 370 }
vcoubard 1131:692ddf04fc42 371 void setReadAuthorizationCallback(void (*callback)(GattReadAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 372 readAuthorizationCallback.attach(callback);
vcoubard 1131:692ddf04fc42 373 enabledReadAuthorization = true;
vcoubard 1131:692ddf04fc42 374 }
vcoubard 1131:692ddf04fc42 375 template <typename T>
vcoubard 1131:692ddf04fc42 376 void setReadAuthorizationCallback(T *object, void (T::*member)(GattReadAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 377 readAuthorizationCallback.attach(object, member);
vcoubard 1131:692ddf04fc42 378 enabledReadAuthorization = true;
vcoubard 1131:692ddf04fc42 379 }
vcoubard 1131:692ddf04fc42 380
vcoubard 1131:692ddf04fc42 381 /**
vcoubard 1131:692ddf04fc42 382 * Helper function meant to be called from the guts of the BLE stack to
vcoubard 1131:692ddf04fc42 383 * determine the authorization reply for a write request.
vcoubard 1131:692ddf04fc42 384 * @param params To capture the context of the write-auth request. Also contains an out-parameter for reply.
vcoubard 1131:692ddf04fc42 385 * @return true if the write is authorized to proceed.
vcoubard 1131:692ddf04fc42 386 */
vcoubard 1131:692ddf04fc42 387 GattAuthCallbackReply_t authorizeWrite(GattWriteAuthCallbackParams *params) {
vcoubard 1131:692ddf04fc42 388 if (!isWriteAuthorizationEnabled()) {
vcoubard 1131:692ddf04fc42 389 return AUTH_CALLBACK_REPLY_SUCCESS;
vcoubard 1131:692ddf04fc42 390 }
vcoubard 1131:692ddf04fc42 391
vcoubard 1131:692ddf04fc42 392 params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
vcoubard 1131:692ddf04fc42 393 writeAuthorizationCallback.call(params);
vcoubard 1131:692ddf04fc42 394 return params->authorizationReply;
vcoubard 1131:692ddf04fc42 395 }
vcoubard 1131:692ddf04fc42 396
vcoubard 1131:692ddf04fc42 397 /**
vcoubard 1131:692ddf04fc42 398 * Helper function meant to be called from the guts of the BLE stack to
vcoubard 1131:692ddf04fc42 399 * determine the authorization reply for a read request.
vcoubard 1131:692ddf04fc42 400 * @param params To capture the context of the read-auth request.
vcoubard 1131:692ddf04fc42 401 *
vcoubard 1131:692ddf04fc42 402 * @NOTE: To authorize or deny the read the params->authorizationReply field
vcoubard 1131:692ddf04fc42 403 * should be set to true (authorize) or false (deny).
vcoubard 1131:692ddf04fc42 404 *
vcoubard 1131:692ddf04fc42 405 * If the read is approved and params->data is unchanged (NULL),
vcoubard 1131:692ddf04fc42 406 * the current characteristic value will be used.
vcoubard 1131:692ddf04fc42 407 *
vcoubard 1131:692ddf04fc42 408 * If the read is approved, a new value can be provided by setting
vcoubard 1131:692ddf04fc42 409 * the params->data pointer and params->len fields.
vcoubard 1131:692ddf04fc42 410 *
vcoubard 1131:692ddf04fc42 411 * @return true if the read is authorized to proceed.
vcoubard 1131:692ddf04fc42 412 */
vcoubard 1131:692ddf04fc42 413 GattAuthCallbackReply_t authorizeRead(GattReadAuthCallbackParams *params) {
vcoubard 1131:692ddf04fc42 414 if (!isReadAuthorizationEnabled()) {
vcoubard 1131:692ddf04fc42 415 return AUTH_CALLBACK_REPLY_SUCCESS;
vcoubard 1131:692ddf04fc42 416 }
vcoubard 1131:692ddf04fc42 417
vcoubard 1131:692ddf04fc42 418 params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
vcoubard 1131:692ddf04fc42 419 readAuthorizationCallback.call(params);
vcoubard 1131:692ddf04fc42 420 return params->authorizationReply;
vcoubard 1131:692ddf04fc42 421 }
vcoubard 1131:692ddf04fc42 422
vcoubard 1131:692ddf04fc42 423 /* accessors */
vcoubard 1131:692ddf04fc42 424 public:
vcoubard 1131:692ddf04fc42 425 GattAttribute& getValueAttribute() {return _valueAttribute; }
vcoubard 1131:692ddf04fc42 426 const GattAttribute& getValueAttribute() const {return _valueAttribute; }
vcoubard 1131:692ddf04fc42 427 GattAttribute::Handle_t getValueHandle(void) const {return getValueAttribute().getHandle();}
vcoubard 1131:692ddf04fc42 428 uint8_t getProperties(void) const {return _properties; }
vcoubard 1131:692ddf04fc42 429 SecurityManager::SecurityMode_t getRequiredSecurity() const {return _requiredSecurity; }
vcoubard 1131:692ddf04fc42 430 uint8_t getDescriptorCount(void) const {return _descriptorCount; }
vcoubard 1131:692ddf04fc42 431 bool isReadAuthorizationEnabled() const {return enabledReadAuthorization; }
vcoubard 1131:692ddf04fc42 432 bool isWriteAuthorizationEnabled() const {return enabledWriteAuthorization; }
vcoubard 1131:692ddf04fc42 433
vcoubard 1131:692ddf04fc42 434 GattAttribute *getDescriptor(uint8_t index) {
vcoubard 1131:692ddf04fc42 435 if (index >= _descriptorCount) {
vcoubard 1131:692ddf04fc42 436 return NULL;
vcoubard 1131:692ddf04fc42 437 }
vcoubard 1131:692ddf04fc42 438
vcoubard 1131:692ddf04fc42 439 return _descriptors[index];
vcoubard 1131:692ddf04fc42 440 }
vcoubard 1131:692ddf04fc42 441
vcoubard 1131:692ddf04fc42 442 private:
vcoubard 1131:692ddf04fc42 443 GattAttribute _valueAttribute;
vcoubard 1131:692ddf04fc42 444 uint8_t _properties;
vcoubard 1131:692ddf04fc42 445 SecurityManager::SecurityMode_t _requiredSecurity;
vcoubard 1131:692ddf04fc42 446 GattAttribute **_descriptors;
vcoubard 1131:692ddf04fc42 447 uint8_t _descriptorCount;
vcoubard 1131:692ddf04fc42 448
vcoubard 1131:692ddf04fc42 449 bool enabledReadAuthorization;
vcoubard 1131:692ddf04fc42 450 bool enabledWriteAuthorization;
vcoubard 1131:692ddf04fc42 451 FunctionPointerWithContext<GattReadAuthCallbackParams *> readAuthorizationCallback;
vcoubard 1131:692ddf04fc42 452 FunctionPointerWithContext<GattWriteAuthCallbackParams *> writeAuthorizationCallback;
vcoubard 1131:692ddf04fc42 453
vcoubard 1131:692ddf04fc42 454 private:
vcoubard 1131:692ddf04fc42 455 /* Disallow copy and assignment. */
vcoubard 1131:692ddf04fc42 456 GattCharacteristic(const GattCharacteristic &);
vcoubard 1131:692ddf04fc42 457 GattCharacteristic& operator=(const GattCharacteristic &);
vcoubard 1131:692ddf04fc42 458 };
vcoubard 1131:692ddf04fc42 459
vcoubard 1131:692ddf04fc42 460 template <typename T>
vcoubard 1131:692ddf04fc42 461 class ReadOnlyGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 462 public:
vcoubard 1131:692ddf04fc42 463 ReadOnlyGattCharacteristic<T>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 464 T *valuePtr,
vcoubard 1131:692ddf04fc42 465 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 466 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 467 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 468 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
vcoubard 1131:692ddf04fc42 469 BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 470 /* empty */
vcoubard 1131:692ddf04fc42 471 }
vcoubard 1131:692ddf04fc42 472 };
vcoubard 1131:692ddf04fc42 473
vcoubard 1131:692ddf04fc42 474 template <typename T>
vcoubard 1131:692ddf04fc42 475 class WriteOnlyGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 476 public:
vcoubard 1131:692ddf04fc42 477 WriteOnlyGattCharacteristic<T>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 478 T *valuePtr,
vcoubard 1131:692ddf04fc42 479 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 480 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 481 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 482 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
vcoubard 1131:692ddf04fc42 483 BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 484 /* empty */
vcoubard 1131:692ddf04fc42 485 }
vcoubard 1131:692ddf04fc42 486 };
vcoubard 1131:692ddf04fc42 487
vcoubard 1131:692ddf04fc42 488 template <typename T>
vcoubard 1131:692ddf04fc42 489 class ReadWriteGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 490 public:
vcoubard 1131:692ddf04fc42 491 ReadWriteGattCharacteristic<T>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 492 T *valuePtr,
vcoubard 1131:692ddf04fc42 493 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 494 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 495 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 496 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
vcoubard 1131:692ddf04fc42 497 BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 498 /* empty */
vcoubard 1131:692ddf04fc42 499 }
vcoubard 1131:692ddf04fc42 500 };
vcoubard 1131:692ddf04fc42 501
vcoubard 1131:692ddf04fc42 502 template <typename T, unsigned NUM_ELEMENTS>
vcoubard 1131:692ddf04fc42 503 class WriteOnlyArrayGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 504 public:
vcoubard 1131:692ddf04fc42 505 WriteOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 506 T valuePtr[NUM_ELEMENTS],
vcoubard 1131:692ddf04fc42 507 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 508 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 509 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 510 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
vcoubard 1131:692ddf04fc42 511 BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 512 /* empty */
vcoubard 1131:692ddf04fc42 513 }
vcoubard 1131:692ddf04fc42 514 };
vcoubard 1131:692ddf04fc42 515
vcoubard 1131:692ddf04fc42 516 template <typename T, unsigned NUM_ELEMENTS>
vcoubard 1131:692ddf04fc42 517 class ReadOnlyArrayGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 518 public:
vcoubard 1131:692ddf04fc42 519 ReadOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 520 T valuePtr[NUM_ELEMENTS],
vcoubard 1131:692ddf04fc42 521 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 522 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 523 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 524 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
vcoubard 1131:692ddf04fc42 525 BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 526 /* empty */
vcoubard 1131:692ddf04fc42 527 }
vcoubard 1131:692ddf04fc42 528 };
vcoubard 1131:692ddf04fc42 529
vcoubard 1131:692ddf04fc42 530 template <typename T, unsigned NUM_ELEMENTS>
vcoubard 1131:692ddf04fc42 531 class ReadWriteArrayGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 532 public:
vcoubard 1131:692ddf04fc42 533 ReadWriteArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 534 T valuePtr[NUM_ELEMENTS],
vcoubard 1131:692ddf04fc42 535 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 536 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 537 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 538 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
vcoubard 1131:692ddf04fc42 539 BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 540 /* empty */
vcoubard 1131:692ddf04fc42 541 }
vcoubard 1131:692ddf04fc42 542 };
vcoubard 1131:692ddf04fc42 543
rgrover1 710:b2e1a2660ec2 544 #endif // ifndef __GATT_CHARACTERISTIC_H__