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