Wang Xinglu / BLE_API

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Thu Jul 02 09:06:11 2015 +0100
Revision:
715:6d415ac147aa
Parent:
714:a6130aaa0fd9
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

Who changed what in which revision?

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