prova

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Wed Apr 06 19:15:30 2016 +0100
Revision:
1179:4ab722f8dca0
Parent:
1163:7a1cfb9ae86e
Child:
1183:1589830dbdb7
Synchronized with git rev ca632aaf
Author: Andres Amaya Garcia
Update Gap state after advertising times out

The BLE API was not updating the Gap internal state when the advertising stops
because of a user timeout. This commit fixes the issue by updating the internal
state structure in Gap just before the registered callbacks are notified of the
advertising timeout.

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 1179:4ab722f8dca0 102 /**************************************************************************/
vcoubard 1179:4ab722f8dca0 103 /*!
vcoubard 1179:4ab722f8dca0 104 \brief Standard GATT characteristic presentation format unit types.
vcoubard 1179:4ab722f8dca0 105 These unit types are used to describe what the raw numeric
vcoubard 1179:4ab722f8dca0 106 data in a characteristic actually represents.
vcoubard 1179:4ab722f8dca0 107
vcoubard 1179:4ab722f8dca0 108 \note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
vcoubard 1179:4ab722f8dca0 109 */
vcoubard 1179:4ab722f8dca0 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 1179:4ab722f8dca0 223 /**************************************************************************/
vcoubard 1179:4ab722f8dca0 224 /*!
vcoubard 1179:4ab722f8dca0 225 \brief Standard GATT number types.
vcoubard 1179:4ab722f8dca0 226
vcoubard 1179:4ab722f8dca0 227 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
vcoubard 1179:4ab722f8dca0 228 \note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
vcoubard 1179:4ab722f8dca0 229 */
vcoubard 1179:4ab722f8dca0 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 1179:4ab722f8dca0 262 /**************************************************************************/
vcoubard 1131:692ddf04fc42 263 /*!
vcoubard 1179:4ab722f8dca0 264 \brief Standard GATT characteristic properties.
vcoubard 1179:4ab722f8dca0 265
vcoubard 1179:4ab722f8dca0 266 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
vcoubard 1179:4ab722f8dca0 267 and Section 3.3.3.1 for Extended Properties
vcoubard 1179:4ab722f8dca0 268 */
vcoubard 1179:4ab722f8dca0 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 1179:4ab722f8dca0 282 /**************************************************************************/
vcoubard 1179:4ab722f8dca0 283 /*!
vcoubard 1179:4ab722f8dca0 284 \brief GATT presentation format wrapper
vcoubard 1179:4ab722f8dca0 285
vcoubard 1179:4ab722f8dca0 286 \note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
vcoubard 1179:4ab722f8dca0 287 \note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
vcoubard 1179:4ab722f8dca0 288 */
vcoubard 1179:4ab722f8dca0 289 /**************************************************************************/
vcoubard 1131:692ddf04fc42 290 struct PresentationFormat_t {
vcoubard 1179:4ab722f8dca0 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 1179:4ab722f8dca0 293 uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers; see @ref ble_gatt_unit_t. */
vcoubard 1179:4ab722f8dca0 294 uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1'; see @ref BLE_GATT_CPF_NAMESPACES. */
vcoubard 1179:4ab722f8dca0 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 1179:4ab722f8dca0 299 * @brief Creates a new GattCharacteristic using the specified 16-bit
vcoubard 1179:4ab722f8dca0 300 * UUID, value length, and properties.
vcoubard 1179:4ab722f8dca0 301 *
vcoubard 1179:4ab722f8dca0 302 * @note The UUID value must be unique in the service and is normally >1.
vcoubard 1131:692ddf04fc42 303 *
vcoubard 1179:4ab722f8dca0 304 * @param[in] uuid
vcoubard 1179:4ab722f8dca0 305 * The UUID to use for this characteristic.
vcoubard 1179:4ab722f8dca0 306 * @param[in] valuePtr
vcoubard 1179:4ab722f8dca0 307 * The memory holding the initial value. The value is copied
vcoubard 1179:4ab722f8dca0 308 * into the stack when the enclosing service is added, and
vcoubard 1179:4ab722f8dca0 309 * is thereafter maintained internally by the stack.
vcoubard 1179:4ab722f8dca0 310 * @param[in] len
vcoubard 1179:4ab722f8dca0 311 * The length in bytes of this characteristic's value.
vcoubard 1179:4ab722f8dca0 312 * @param[in] maxLen
vcoubard 1179:4ab722f8dca0 313 * The max length in bytes of this characteristic's value.
vcoubard 1179:4ab722f8dca0 314 * @param[in] hasVariableLen
vcoubard 1179:4ab722f8dca0 315 * Whether the attribute's value length changes over time.
vcoubard 1179:4ab722f8dca0 316 * @param[in] props
vcoubard 1179:4ab722f8dca0 317 * The 8-bit field containing the characteristic's properties.
vcoubard 1179:4ab722f8dca0 318 * @param[in] descriptors
vcoubard 1179:4ab722f8dca0 319 * A pointer to an array of descriptors to be included within
vcoubard 1179:4ab722f8dca0 320 * this characteristic. The memory for the descriptor array is
vcoubard 1179:4ab722f8dca0 321 * owned by the caller, and should remain valid at least until
vcoubard 1179:4ab722f8dca0 322 * the enclosing service is added to the GATT table.
vcoubard 1179:4ab722f8dca0 323 * @param[in] numDescriptors
vcoubard 1179:4ab722f8dca0 324 * The number of descriptors in the previous array.
vcoubard 1131:692ddf04fc42 325 *
vcoubard 1179:4ab722f8dca0 326 * @NOTE: If valuePtr == NULL, length == 0, and properties == READ
vcoubard 1131:692ddf04fc42 327 * for the value attribute of a characteristic, then that particular
vcoubard 1131:692ddf04fc42 328 * characteristic may be considered optional and dropped while
vcoubard 1131:692ddf04fc42 329 * instantiating the service with the underlying BLE stack.
vcoubard 1131:692ddf04fc42 330 */
vcoubard 1131:692ddf04fc42 331 GattCharacteristic(const UUID &uuid,
vcoubard 1131:692ddf04fc42 332 uint8_t *valuePtr = NULL,
vcoubard 1131:692ddf04fc42 333 uint16_t len = 0,
vcoubard 1131:692ddf04fc42 334 uint16_t maxLen = 0,
vcoubard 1131:692ddf04fc42 335 uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 336 GattAttribute *descriptors[] = NULL,
vcoubard 1132:6362b7c2fdff 337 unsigned numDescriptors = 0,
vcoubard 1132:6362b7c2fdff 338 bool hasVariableLen = true) :
vcoubard 1132:6362b7c2fdff 339 _valueAttribute(uuid, valuePtr, len, maxLen, hasVariableLen),
vcoubard 1131:692ddf04fc42 340 _properties(props),
vcoubard 1131:692ddf04fc42 341 _requiredSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK),
vcoubard 1131:692ddf04fc42 342 _descriptors(descriptors),
vcoubard 1131:692ddf04fc42 343 _descriptorCount(numDescriptors),
vcoubard 1131:692ddf04fc42 344 enabledReadAuthorization(false),
vcoubard 1131:692ddf04fc42 345 enabledWriteAuthorization(false),
vcoubard 1131:692ddf04fc42 346 readAuthorizationCallback(),
vcoubard 1131:692ddf04fc42 347 writeAuthorizationCallback() {
vcoubard 1131:692ddf04fc42 348 /* empty */
vcoubard 1131:692ddf04fc42 349 }
vcoubard 1131:692ddf04fc42 350
vcoubard 1131:692ddf04fc42 351 public:
vcoubard 1131:692ddf04fc42 352 /**
vcoubard 1179:4ab722f8dca0 353 * Set up the minimum security (mode and level) requirements for access to the characteristic's value attribute.
vcoubard 1131:692ddf04fc42 354 *
vcoubard 1179:4ab722f8dca0 355 * @param securityMode Can be one of encryption or signing, with or without protection for man in the middle attacks (MITM).
vcoubard 1131:692ddf04fc42 356 */
vcoubard 1131:692ddf04fc42 357 void requireSecurity(SecurityManager::SecurityMode_t securityMode) {
vcoubard 1131:692ddf04fc42 358 _requiredSecurity = securityMode;
vcoubard 1131:692ddf04fc42 359 }
vcoubard 1131:692ddf04fc42 360
vcoubard 1131:692ddf04fc42 361 public:
vcoubard 1131:692ddf04fc42 362 /**
vcoubard 1179:4ab722f8dca0 363 * Authorization.
vcoubard 1131:692ddf04fc42 364 */
vcoubard 1131:692ddf04fc42 365 void setWriteAuthorizationCallback(void (*callback)(GattWriteAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 366 writeAuthorizationCallback.attach(callback);
vcoubard 1131:692ddf04fc42 367 enabledWriteAuthorization = true;
vcoubard 1131:692ddf04fc42 368 }
vcoubard 1131:692ddf04fc42 369 template <typename T>
vcoubard 1131:692ddf04fc42 370 void setWriteAuthorizationCallback(T *object, void (T::*member)(GattWriteAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 371 writeAuthorizationCallback.attach(object, member);
vcoubard 1131:692ddf04fc42 372 enabledWriteAuthorization = true;
vcoubard 1131:692ddf04fc42 373 }
vcoubard 1131:692ddf04fc42 374 void setReadAuthorizationCallback(void (*callback)(GattReadAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 375 readAuthorizationCallback.attach(callback);
vcoubard 1131:692ddf04fc42 376 enabledReadAuthorization = true;
vcoubard 1131:692ddf04fc42 377 }
vcoubard 1131:692ddf04fc42 378 template <typename T>
vcoubard 1131:692ddf04fc42 379 void setReadAuthorizationCallback(T *object, void (T::*member)(GattReadAuthCallbackParams *)) {
vcoubard 1131:692ddf04fc42 380 readAuthorizationCallback.attach(object, member);
vcoubard 1131:692ddf04fc42 381 enabledReadAuthorization = true;
vcoubard 1131:692ddf04fc42 382 }
vcoubard 1131:692ddf04fc42 383
vcoubard 1131:692ddf04fc42 384 /**
vcoubard 1179:4ab722f8dca0 385 * Helper function meant to be called from the guts of the BLE stack to
vcoubard 1179:4ab722f8dca0 386 * determine the authorization reply for a write request.
vcoubard 1179:4ab722f8dca0 387 * @param params To capture the context of the write-auth request. Also contains an out-parameter for reply.
vcoubard 1179:4ab722f8dca0 388 * @return true if the write is authorized to proceed.
vcoubard 1131:692ddf04fc42 389 */
vcoubard 1131:692ddf04fc42 390 GattAuthCallbackReply_t authorizeWrite(GattWriteAuthCallbackParams *params) {
vcoubard 1131:692ddf04fc42 391 if (!isWriteAuthorizationEnabled()) {
vcoubard 1131:692ddf04fc42 392 return AUTH_CALLBACK_REPLY_SUCCESS;
vcoubard 1131:692ddf04fc42 393 }
vcoubard 1131:692ddf04fc42 394
vcoubard 1131:692ddf04fc42 395 params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
vcoubard 1131:692ddf04fc42 396 writeAuthorizationCallback.call(params);
vcoubard 1131:692ddf04fc42 397 return params->authorizationReply;
vcoubard 1131:692ddf04fc42 398 }
vcoubard 1131:692ddf04fc42 399
vcoubard 1131:692ddf04fc42 400 /**
vcoubard 1179:4ab722f8dca0 401 * Helper function meant to be called from the guts of the BLE stack to
vcoubard 1179:4ab722f8dca0 402 * determine the authorization reply for a read request.
vcoubard 1179:4ab722f8dca0 403 * @param params To capture the context of the read-auth request.
vcoubard 1131:692ddf04fc42 404 *
vcoubard 1179:4ab722f8dca0 405 * @NOTE: To authorize or deny the read the params->authorizationReply field
vcoubard 1131:692ddf04fc42 406 * should be set to true (authorize) or false (deny).
vcoubard 1131:692ddf04fc42 407 *
vcoubard 1179:4ab722f8dca0 408 * If the read is approved and params->data is unchanged (NULL),
vcoubard 1131:692ddf04fc42 409 * the current characteristic value will be used.
vcoubard 1131:692ddf04fc42 410 *
vcoubard 1179:4ab722f8dca0 411 * If the read is approved, a new value can be provided by setting
vcoubard 1131:692ddf04fc42 412 * the params->data pointer and params->len fields.
vcoubard 1179:4ab722f8dca0 413 *
vcoubard 1179:4ab722f8dca0 414 * @return true if the read is authorized to proceed.
vcoubard 1131:692ddf04fc42 415 */
vcoubard 1131:692ddf04fc42 416 GattAuthCallbackReply_t authorizeRead(GattReadAuthCallbackParams *params) {
vcoubard 1131:692ddf04fc42 417 if (!isReadAuthorizationEnabled()) {
vcoubard 1131:692ddf04fc42 418 return AUTH_CALLBACK_REPLY_SUCCESS;
vcoubard 1131:692ddf04fc42 419 }
vcoubard 1131:692ddf04fc42 420
vcoubard 1131:692ddf04fc42 421 params->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; /* Initialized to no-error by default. */
vcoubard 1131:692ddf04fc42 422 readAuthorizationCallback.call(params);
vcoubard 1131:692ddf04fc42 423 return params->authorizationReply;
vcoubard 1131:692ddf04fc42 424 }
vcoubard 1131:692ddf04fc42 425
vcoubard 1179:4ab722f8dca0 426 /* accessors */
vcoubard 1131:692ddf04fc42 427 public:
vcoubard 1179:4ab722f8dca0 428 GattAttribute& getValueAttribute() {return _valueAttribute; }
vcoubard 1179:4ab722f8dca0 429 const GattAttribute& getValueAttribute() const {return _valueAttribute; }
vcoubard 1179:4ab722f8dca0 430 GattAttribute::Handle_t getValueHandle(void) const {return getValueAttribute().getHandle();}
vcoubard 1179:4ab722f8dca0 431 uint8_t getProperties(void) const {return _properties; }
vcoubard 1179:4ab722f8dca0 432 SecurityManager::SecurityMode_t getRequiredSecurity() const {return _requiredSecurity; }
vcoubard 1179:4ab722f8dca0 433 uint8_t getDescriptorCount(void) const {return _descriptorCount; }
vcoubard 1179:4ab722f8dca0 434 bool isReadAuthorizationEnabled() const {return enabledReadAuthorization; }
vcoubard 1179:4ab722f8dca0 435 bool isWriteAuthorizationEnabled() const {return enabledWriteAuthorization; }
vcoubard 1131:692ddf04fc42 436
vcoubard 1131:692ddf04fc42 437 GattAttribute *getDescriptor(uint8_t index) {
vcoubard 1131:692ddf04fc42 438 if (index >= _descriptorCount) {
vcoubard 1131:692ddf04fc42 439 return NULL;
vcoubard 1131:692ddf04fc42 440 }
vcoubard 1131:692ddf04fc42 441
vcoubard 1131:692ddf04fc42 442 return _descriptors[index];
vcoubard 1131:692ddf04fc42 443 }
vcoubard 1131:692ddf04fc42 444
vcoubard 1131:692ddf04fc42 445 private:
vcoubard 1131:692ddf04fc42 446 GattAttribute _valueAttribute;
vcoubard 1131:692ddf04fc42 447 uint8_t _properties;
vcoubard 1131:692ddf04fc42 448 SecurityManager::SecurityMode_t _requiredSecurity;
vcoubard 1131:692ddf04fc42 449 GattAttribute **_descriptors;
vcoubard 1131:692ddf04fc42 450 uint8_t _descriptorCount;
vcoubard 1131:692ddf04fc42 451
vcoubard 1131:692ddf04fc42 452 bool enabledReadAuthorization;
vcoubard 1131:692ddf04fc42 453 bool enabledWriteAuthorization;
vcoubard 1131:692ddf04fc42 454 FunctionPointerWithContext<GattReadAuthCallbackParams *> readAuthorizationCallback;
vcoubard 1131:692ddf04fc42 455 FunctionPointerWithContext<GattWriteAuthCallbackParams *> writeAuthorizationCallback;
vcoubard 1131:692ddf04fc42 456
vcoubard 1131:692ddf04fc42 457 private:
vcoubard 1131:692ddf04fc42 458 /* Disallow copy and assignment. */
vcoubard 1131:692ddf04fc42 459 GattCharacteristic(const GattCharacteristic &);
vcoubard 1131:692ddf04fc42 460 GattCharacteristic& operator=(const GattCharacteristic &);
vcoubard 1131:692ddf04fc42 461 };
vcoubard 1131:692ddf04fc42 462
vcoubard 1131:692ddf04fc42 463 template <typename T>
vcoubard 1131:692ddf04fc42 464 class ReadOnlyGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 465 public:
vcoubard 1131:692ddf04fc42 466 ReadOnlyGattCharacteristic<T>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 467 T *valuePtr,
vcoubard 1131:692ddf04fc42 468 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 469 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 470 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 471 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
vcoubard 1132:6362b7c2fdff 472 BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors, false) {
vcoubard 1131:692ddf04fc42 473 /* empty */
vcoubard 1131:692ddf04fc42 474 }
vcoubard 1131:692ddf04fc42 475 };
vcoubard 1131:692ddf04fc42 476
vcoubard 1131:692ddf04fc42 477 template <typename T>
vcoubard 1131:692ddf04fc42 478 class WriteOnlyGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 479 public:
vcoubard 1131:692ddf04fc42 480 WriteOnlyGattCharacteristic<T>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 481 T *valuePtr,
vcoubard 1131:692ddf04fc42 482 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 483 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 484 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 485 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
vcoubard 1131:692ddf04fc42 486 BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 487 /* empty */
vcoubard 1131:692ddf04fc42 488 }
vcoubard 1131:692ddf04fc42 489 };
vcoubard 1131:692ddf04fc42 490
vcoubard 1131:692ddf04fc42 491 template <typename T>
vcoubard 1131:692ddf04fc42 492 class ReadWriteGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 493 public:
vcoubard 1131:692ddf04fc42 494 ReadWriteGattCharacteristic<T>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 495 T *valuePtr,
vcoubard 1131:692ddf04fc42 496 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 497 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 498 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 499 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T), sizeof(T),
vcoubard 1131:692ddf04fc42 500 BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 501 /* empty */
vcoubard 1131:692ddf04fc42 502 }
vcoubard 1131:692ddf04fc42 503 };
vcoubard 1131:692ddf04fc42 504
vcoubard 1131:692ddf04fc42 505 template <typename T, unsigned NUM_ELEMENTS>
vcoubard 1131:692ddf04fc42 506 class WriteOnlyArrayGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 507 public:
vcoubard 1131:692ddf04fc42 508 WriteOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 509 T valuePtr[NUM_ELEMENTS],
vcoubard 1131:692ddf04fc42 510 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 511 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 512 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 513 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
vcoubard 1131:692ddf04fc42 514 BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 515 /* empty */
vcoubard 1131:692ddf04fc42 516 }
vcoubard 1131:692ddf04fc42 517 };
vcoubard 1131:692ddf04fc42 518
vcoubard 1131:692ddf04fc42 519 template <typename T, unsigned NUM_ELEMENTS>
vcoubard 1131:692ddf04fc42 520 class ReadOnlyArrayGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 521 public:
vcoubard 1131:692ddf04fc42 522 ReadOnlyArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 523 T valuePtr[NUM_ELEMENTS],
vcoubard 1131:692ddf04fc42 524 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 525 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 526 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 527 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
vcoubard 1132:6362b7c2fdff 528 BLE_GATT_CHAR_PROPERTIES_READ | additionalProperties, descriptors, numDescriptors, false) {
vcoubard 1131:692ddf04fc42 529 /* empty */
vcoubard 1131:692ddf04fc42 530 }
vcoubard 1131:692ddf04fc42 531 };
vcoubard 1131:692ddf04fc42 532
vcoubard 1131:692ddf04fc42 533 template <typename T, unsigned NUM_ELEMENTS>
vcoubard 1131:692ddf04fc42 534 class ReadWriteArrayGattCharacteristic : public GattCharacteristic {
vcoubard 1131:692ddf04fc42 535 public:
vcoubard 1131:692ddf04fc42 536 ReadWriteArrayGattCharacteristic<T, NUM_ELEMENTS>(const UUID &uuid,
vcoubard 1131:692ddf04fc42 537 T valuePtr[NUM_ELEMENTS],
vcoubard 1131:692ddf04fc42 538 uint8_t additionalProperties = BLE_GATT_CHAR_PROPERTIES_NONE,
vcoubard 1131:692ddf04fc42 539 GattAttribute *descriptors[] = NULL,
vcoubard 1131:692ddf04fc42 540 unsigned numDescriptors = 0) :
vcoubard 1131:692ddf04fc42 541 GattCharacteristic(uuid, reinterpret_cast<uint8_t *>(valuePtr), sizeof(T) * NUM_ELEMENTS, sizeof(T) * NUM_ELEMENTS,
vcoubard 1131:692ddf04fc42 542 BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE | additionalProperties, descriptors, numDescriptors) {
vcoubard 1131:692ddf04fc42 543 /* empty */
vcoubard 1131:692ddf04fc42 544 }
vcoubard 1131:692ddf04fc42 545 };
vcoubard 1131:692ddf04fc42 546
vcoubard 1179:4ab722f8dca0 547 #endif // ifndef __GATT_CHARACTERISTIC_H__