High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:53:01 2015 +0100
Revision:
669:7179b4a5aa7d
Parent:
667:875aecb84719
Child:
670:5e4aecd9af5b
Synchronized with git rev 9bcd7433
Author: Rohit Grover
Rename BLEDevice as BLE. Retain an alias to BLEDevice for the sake of compatibility with old code.

Who changed what in which revision?

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