• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Chipsea Technologies (Shenzhen) Corp., Ltd. All rights reserved.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef _HAL_ATT_H
16 #define _HAL_ATT_H
17 
18 #include <stdint.h>
19 
20 /// Macro used to convert CPU integer define to LSB first 16-bits UUID
21 #define ATT_UUID_16(uuid)                          (uuid)
22 
23 /// Invalid attribute handle
24 #define ATT_INVALID_HDL                            (0x0000)
25 /// Invalid attribute idx (used for profiles)
26 #define ATT_INVALID_IDX                            (0xff)
27 
28 #define ATT_1ST_REQ_START_HDL                      0x0001
29 #define ATT_1ST_REQ_END_HDL                        0xFFFF
30 
31 /// Maximum possible attribute handle
32 #define ATT_MAX_ATTR_HDL                           ATT_1ST_REQ_END_HDL
33 
34 /// Offset of value in signed PDU
35 #define ATT_SIGNED_PDU_VAL_OFFSET               0x03
36 
37 /// Attribute Features
38 #define ATT_SERVER_CONFIG                       0x0001
39 #define ATT_SERVICE_DISC                        0x0002
40 #define ATT_RELATIONSHIP_DISC                   0x0004
41 #define ATT_CHAR_DISC                           0x0008
42 #define ATT_CHAR_DESC_DISC                      0x0010
43 #define ATT_RD_CHAR_VALUE                       0x0020
44 #define ATT_WR_CHAR_VALUE                       0x0040
45 #define ATT_NOTIF_CHAR_VALUE                    0x0080
46 #define ATT_IND_CHAR_VALUE                      0x0100
47 #define ATT_RD_CHAR_DESC                        0x0200
48 #define ATT_WR_CHAR_DESC                        0x0400
49 
50 /// Length, number, offset defines
51 #define ATT_SVC_VALUE_MAX_LEN                   0x0030
52 #define ATT_CHAR_NAME_MAX_LEN                   0x0030
53 #define ATT_UUID_16_LEN                         0x0002
54 #define ATT_UUID_32_LEN                         0x0004
55 #define ATT_UUID_128_LEN                        0x0010
56 
57 /// offset - l2cap header and ATT code
58 #define ATT_PDU_DATA_OFFSET                     0x05
59 
60 /// Characteristic Properties Bit
61 #define ATT_CHAR_PROP_BCAST                     0x01
62 #define ATT_CHAR_PROP_RD                        0x02
63 #define ATT_CHAR_PROP_WR_NO_RESP                0x04
64 #define ATT_CHAR_PROP_WR                        0x08
65 #define ATT_CHAR_PROP_NTF                       0x10
66 #define ATT_CHAR_PROP_IND                       0x20
67 #define ATT_CHAR_PROP_AUTH                      0x40
68 #define ATT_CHAR_PROP_EXT_PROP                  0x80
69 /// Invalid Attribute Handle
70 #define ATT_INVALID_SEARCH_HANDLE               0x0000
71 #define ATT_INVALID_HANDLE                      0x0000
72 /// Read Information Request
73 #define ATT_UUID_FILTER_0                       0x00
74 #define ATT_UUID_FILTER_2                       0x02
75 #define ATT_UUID_FILTER_16                      0x10
76 /// Read Information Response
77 #define ATT_FORMAT_LEN                          0x0001
78 #define ATT_FORMAT_16BIT_UUID                   0x01
79 #define ATT_FORMAT_128BIT_UUID                  0x02
80 /// For No fix length PDU
81 #define ATT_HANDLE_LEN                          0x0002
82 #define ATT_EACHLEN_LEN                         0x0001
83 #define ATT_PROP_LEN                            0x0001
84 #define ATT_CODE_LEN                            0x0001
85 #define ATT_CODE_AND_DATA_LEN                   0x0002
86 #define ATT_CODE_AND_HANDLE_LEN                 0x0003
87 #define ATT_CODE_AND_HANDLE_LEN_AND_OFFSET      0x0005
88 #define ATT_SIGNATURE_LEN                       0x0C
89 
90 /// extended characteristics
91 #define ATT_EXT_RELIABLE_WRITE                  0x0001
92 #define ATT_EXT_WRITABLE_AUX                    0x0002
93 #define ATT_EXT_RFU                             0xFFFC
94 
95 /// PDU size for error response
96 #define ATT_ERROR_RESP_LEN                      0x05
97 
98 /// Offset of value in signed PDU
99 #define ATT_SIGNED_PDU_VAL_OFFSET               0x03
100 
101 /// Attribute operation code - Method (bit 5 - 0)
102 #define ATT_OPCODE_METHOD_MASK                  0x3F
103 #define ATT_OPCODE_METHOD_LSB                   0
104 /// Attribute operation code - Command Flag (bit 6)
105 #define ATT_OPCODE_CMD_FLAG_BIT                 0x40
106 #define ATT_OPCODE_CMD_FLAG_POS                 6
107 /// Attribute operation code - Authentication Signature Flag (bit 7)
108 #define ATT_OPCODE_AUTH_SIGNATURE_FLAG_BIT      0x80
109 #define ATT_OPCODE_AUTH_SIGNATURE_FLAG_POS      7
110 
111 #define ATT_BT_UUID_128 {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, \
112                           0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
113 
114 
115 
116 /* Attribute Specification Defines */
117 
118 /// Common 16-bit Universal Unique Identifier
119 enum {
120     ATT_INVALID_UUID                            = ATT_UUID_16(0x0000),
121     /*----------------- SERVICES ---------------------*/
122     /// Generic Access Profile
123     ATT_SVC_GENERIC_ACCESS                      = ATT_UUID_16(0x1800),
124     /// Attribute Profile
125     ATT_SVC_GENERIC_ATTRIBUTE                   = ATT_UUID_16(0x1801),
126     /// Immediate alert Service
127     ATT_SVC_IMMEDIATE_ALERT                     = ATT_UUID_16(0x1802),
128     /// Link Loss Service
129     ATT_SVC_LINK_LOSS                           = ATT_UUID_16(0x1803),
130     /// Tx Power Service
131     ATT_SVC_TX_POWER                            = ATT_UUID_16(0x1804),
132     /// Current Time Service Service
133     ATT_SVC_CURRENT_TIME                        = ATT_UUID_16(0x1805),
134     /// Reference Time Update Service
135     ATT_SVC_REF_TIME_UPDATE                     = ATT_UUID_16(0x1806),
136     /// Next DST Change Service
137     ATT_SVC_NEXT_DST_CHANGE                     = ATT_UUID_16(0x1807),
138     /// Glucose Service
139     ATT_SVC_GLUCOSE                             = ATT_UUID_16(0x1808),
140     /// Health Thermometer Service
141     ATT_SVC_HEALTH_THERMOM                      = ATT_UUID_16(0x1809),
142     /// Device Information Service
143     ATT_SVC_DEVICE_INFO                         = ATT_UUID_16(0x180A),
144     /// Heart Rate Service
145     ATT_SVC_HEART_RATE                          = ATT_UUID_16(0x180D),
146     /// Phone Alert Status Service
147     ATT_SVC_PHONE_ALERT_STATUS                  = ATT_UUID_16(0x180E),
148     /// Battery Service
149     ATT_SVC_BATTERY_SERVICE                     = ATT_UUID_16(0x180F),
150     /// Blood Pressure Service
151     ATT_SVC_BLOOD_PRESSURE                      = ATT_UUID_16(0x1810),
152     /// Alert Notification Service
153     ATT_SVC_ALERT_NTF                           = ATT_UUID_16(0x1811),
154     /// HID Service
155     ATT_SVC_HID                                 = ATT_UUID_16(0x1812),
156     /// Scan Parameters Service
157     ATT_SVC_SCAN_PARAMETERS                     = ATT_UUID_16(0x1813),
158     /// Running Speed and Cadence Service
159     ATT_SVC_RUNNING_SPEED_CADENCE               = ATT_UUID_16(0x1814),
160     /// Cycling Speed and Cadence Service
161     ATT_SVC_CYCLING_SPEED_CADENCE               = ATT_UUID_16(0x1816),
162     /// Cycling Power Service
163     ATT_SVC_CYCLING_POWER                       = ATT_UUID_16(0x1818),
164     /// Location and Navigation Service
165     ATT_SVC_LOCATION_AND_NAVIGATION             = ATT_UUID_16(0x1819),
166     /// Environmental Sensing Service
167     ATT_SVC_ENVIRONMENTAL_SENSING               = ATT_UUID_16(0x181A),
168     /// Body Composition Service
169     ATT_SVC_BODY_COMPOSITION                    = ATT_UUID_16(0x181B),
170     /// User Data Service
171     ATT_SVC_USER_DATA                           = ATT_UUID_16(0x181C),
172     /// Weight Scale Service
173     ATT_SVC_WEIGHT_SCALE                        = ATT_UUID_16(0x181D),
174     /// Bond Management Service
175     ATT_SVC_BOND_MANAGEMENT                     = ATT_UUID_16(0x181E),
176     /// Continuous Glucose Monitoring Service
177     ATT_SVC_CONTINUOUS_GLUCOSE_MONITORING       = ATT_UUID_16(0x181F),
178     /// Internet Protocol Support Service
179     ATT_SVC_IP_SUPPORT                          = ATT_UUID_16(0x1820),
180     /// Indoor Positioning Service
181     ATT_SVC_INDOOR_POSITIONING                  = ATT_UUID_16(0x1821),
182     /// Pulse Oximeter Service
183     ATT_SVC_PULSE_OXIMETER                      = ATT_UUID_16(0x1822),
184     /// HTTP Proxy Service
185     ATT_SVC_HTTP_PROXY                          = ATT_UUID_16(0x1823),
186     /// Transport Discovery Service
187     ATT_SVC_TRANSPORT_DISCOVERY                 = ATT_UUID_16(0x1824),
188     /// Object Transfer Service
189     ATT_SVC_OBJECT_TRANSFER                     = ATT_UUID_16(0x1825),
190     /// Mesh Provisioning Service
191     ATT_SVC_MESH_PROVISIONING                   = ATT_UUID_16(0x1827),
192     /// Mesh Proxy Service
193     ATT_SVC_MESH_PROXY                          = ATT_UUID_16(0x1828),
194 
195     /*------------------- UNITS ---------------------*/
196     /// No defined unit
197     ATT_UNIT_UNITLESS                           = ATT_UUID_16(0x2700),
198     /// Length Unit - Metre
199     ATT_UNIT_METRE                              = ATT_UUID_16(0x2701),
200     ///Mass unit - Kilogram
201     ATT_UNIT_KG                                 = ATT_UUID_16(0x2702),
202     ///Time unit - second
203     ATT_UNIT_SECOND                             = ATT_UUID_16(0x2703),
204     ///Electric current unit - Ampere
205     ATT_UNIT_AMPERE                             = ATT_UUID_16(0x2704),
206     ///Thermodynamic Temperature unit - Kelvin
207     ATT_UNIT_KELVIN                             = ATT_UUID_16(0x2705),
208     /// Amount of substance unit - mole
209     ATT_UNIT_MOLE                               = ATT_UUID_16(0x2706),
210     ///Luminous intensity unit - candela
211     ATT_UNIT_CANDELA                            = ATT_UUID_16(0x2707),
212     ///Area unit - square metres
213     ATT_UNIT_SQ_METRE                           = ATT_UUID_16(0x2710),
214     ///Colume unit - cubic metres
215     ATT_UNIT_CUBIC_METRE                        = ATT_UUID_16(0x2710),
216     ///Velocity unit - metres per second
217     ATT_UNIT_METRE_PER_SECOND                   = ATT_UUID_16(0x2711),
218     ///Acceleration unit - metres per second squared
219     ATT_UNIT_METRES_PER_SEC_SQ                  = ATT_UUID_16(0x2712),
220     ///Wavenumber unit - reciprocal metre
221     ATT_UNIT_RECIPROCAL_METRE                   = ATT_UUID_16(0x2713),
222     ///Density unit - kilogram per cubic metre
223     ATT_UNIT_DENS_KG_PER_CUBIC_METRE            = ATT_UUID_16(0x2714),
224     ///Surface density unit - kilogram per square metre
225     ATT_UNIT_KG_PER_SQ_METRE                    = ATT_UUID_16(0x2715),
226     ///Specific volume unit - cubic metre per kilogram
227     ATT_UNIT_CUBIC_METRE_PER_KG                 = ATT_UUID_16(0x2716),
228     ///Current density unit - ampere per square metre
229     ATT_UNIT_AMPERE_PER_SQ_METRE                = ATT_UUID_16(0x2717),
230     ///Magnetic field strength unit - Ampere per metre
231     ATT_UNIT_AMPERE_PER_METRE                   = ATT_UUID_16(0x2718),
232     ///Amount concentration unit - mole per cubic metre
233     ATT_UNIT_MOLE_PER_CUBIC_METRE               = ATT_UUID_16(0x2719),
234     ///Mass Concentration unit - kilogram per cubic metre
235     ATT_UNIT_MASS_KG_PER_CUBIC_METRE            = ATT_UUID_16(0x271A),
236     ///Luminance unit - candela per square metre
237     ATT_UNIT_CANDELA_PER_SQ_METRE               = ATT_UUID_16(0x271B),
238     ///Refractive index unit
239     ATT_UNIT_REFRACTIVE_INDEX                   = ATT_UUID_16(0x271C),
240     ///Relative permeability unit
241     ATT_UNIT_RELATIVE_PERMEABILITY              = ATT_UUID_16(0x271D),
242     ///Plane angle unit - radian
243     ATT_UNIT_RADIAN                             = ATT_UUID_16(0x2720),
244     ///Solid angle unit - steradian
245     ATT_UNIT_STERADIAN                          = ATT_UUID_16(0x2721),
246     ///Frequency unit - Hertz
247     ATT_UNIT_HERTZ                              = ATT_UUID_16(0x2722),
248     ///Force unit - Newton
249     ATT_UNIT_NEWTON                             = ATT_UUID_16(0x2723),
250     ///Pressure unit - Pascal
251     ATT_UNIT_PASCAL                             = ATT_UUID_16(0x2724),
252     ///Energy unit - Joule
253     ATT_UNIT_JOULE                              = ATT_UUID_16(0x2725),
254     ///Power unit - Watt
255     ATT_UNIT_WATT                               = ATT_UUID_16(0x2726),
256     ///electric Charge unit - Coulomb
257     ATT_UNIT_COULOMB                            = ATT_UUID_16(0x2727),
258     ///Electric potential difference - Volt
259     ATT_UNIT_VOLT                               = ATT_UUID_16(0x2728),
260     ///Capacitance unit - Farad
261     ATT_UNIT_FARAD                              = ATT_UUID_16(0x2729),
262     ///electric resistance unit - Ohm
263     ATT_UNIT_OHM                                = ATT_UUID_16(0x272A),
264     ///Electric conductance - Siemens
265     ATT_UNIT_SIEMENS                            = ATT_UUID_16(0x272B),
266     ///Magnetic flux unit - Weber
267     ATT_UNIT_WEBER                              = ATT_UUID_16(0x272C),
268     ///Magnetic flux density unit - Tesla
269     ATT_UNIT_TESLA                              = ATT_UUID_16(0x272D),
270     ///Inductance unit - Henry
271     ATT_UNIT_HENRY                              = ATT_UUID_16(0x272E),
272     ///Temperature unit - degree Celsius
273     ATT_UNIT_CELSIUS                            = ATT_UUID_16(0x272F),
274     ///Luminous flux unit - lumen
275     ATT_UNIT_LUMEN                              = ATT_UUID_16(0x2730),
276     ///Illuminance unit - lux
277     ATT_UNIT_LUX                                = ATT_UUID_16(0x2731),
278     ///Activity referred to a radionuclide unit - becquerel
279     ATT_UNIT_BECQUEREL                          = ATT_UUID_16(0x2732),
280     ///Absorbed dose unit - Gray
281     ATT_UNIT_GRAY                               = ATT_UUID_16(0x2733),
282     ///Dose equivalent unit - Sievert
283     ATT_UNIT_SIEVERT                            = ATT_UUID_16(0x2734),
284     ///Catalytic activity unit - Katal
285     ATT_UNIT_KATAL                              = ATT_UUID_16(0x2735),
286     ///Synamic viscosity unit - Pascal second
287     ATT_UNIT_PASCAL_SECOND                      = ATT_UUID_16(0x2740),
288     ///Moment of force unit - Newton metre
289     ATT_UNIT_NEWTON_METRE                       = ATT_UUID_16(0x2741),
290     ///surface tension unit - Newton per metre
291     ATT_UNIT_NEWTON_PER_METRE                   = ATT_UUID_16(0x2742),
292     ///Angular velocity unit - radian per second
293     ATT_UNIT_RADIAN_PER_SECOND                  = ATT_UUID_16(0x2743),
294     ///Angular acceleration unit - radian per second squared
295     ATT_UNIT_RADIAN_PER_SECOND_SQ               = ATT_UUID_16(0x2744),
296     ///Heat flux density unit - Watt per square metre
297     ATT_UNIT_WATT_PER_SQ_METRE                  = ATT_UUID_16(0x2745),
298     ///HEat capacity unit - Joule per Kelvin
299     ATT_UNIT_JOULE_PER_KELVIN                   = ATT_UUID_16(0x2746),
300     ///Specific heat capacity unit - Joule per kilogram kelvin
301     ATT_UNIT_JOULE_PER_KG_KELVIN                = ATT_UUID_16(0x2747),
302     ///Specific Energy unit - Joule per kilogram
303     ATT_UNIT_JOULE_PER_KG                       = ATT_UUID_16(0x2748),
304     ///Thermal conductivity - Watt per metre Kelvin
305     ATT_UNIT_WATT_PER_METRE_KELVIN              = ATT_UUID_16(0x2749),
306     ///Energy Density unit - joule per cubic metre
307     ATT_UNIT_JOULE_PER_CUBIC_METRE              = ATT_UUID_16(0x274A),
308     ///Electric field strength unit - volt per metre
309     ATT_UNIT_VOLT_PER_METRE                     = ATT_UUID_16(0x274B),
310     ///Electric charge density unit - coulomb per cubic metre
311     ATT_UNIT_COULOMB_PER_CUBIC_METRE            = ATT_UUID_16(0x274C),
312     ///Surface charge density unit - coulomb per square metre
313     ATT_UNIT_SURF_COULOMB_PER_SQ_METRE          = ATT_UUID_16(0x274D),
314     ///Electric flux density unit - coulomb per square metre
315     ATT_UNIT_FLUX_COULOMB_PER_SQ_METRE          = ATT_UUID_16(0x274E),
316     ///Permittivity unit - farad per metre
317     ATT_UNIT_FARAD_PER_METRE                    = ATT_UUID_16(0x274F),
318     ///Permeability unit - henry per metre
319     ATT_UNIT_HENRY_PER_METRE                    = ATT_UUID_16(0x2750),
320     ///Molar energy unit - joule per mole
321     ATT_UNIT_JOULE_PER_MOLE                     = ATT_UUID_16(0x2751),
322     ///Molar entropy unit - joule per mole kelvin
323     ATT_UNIT_JOULE_PER_MOLE_KELVIN              = ATT_UUID_16(0x2752),
324     ///Exposure unit - coulomb per kilogram
325     ATT_UNIT_COULOMB_PER_KG                     = ATT_UUID_16(0x2753),
326     ///Absorbed dose rate unit - gray per second
327     ATT_UNIT_GRAY_PER_SECOND                    = ATT_UUID_16(0x2754),
328     ///Radiant intensity unit - watt per steradian
329     ATT_UNIT_WATT_PER_STERADIAN                 = ATT_UUID_16(0x2755),
330     ///Radiance unit - watt per square meter steradian
331     ATT_UNIT_WATT_PER_SQ_METRE_STERADIAN        = ATT_UUID_16(0x2756),
332     ///Catalytic activity concentration unit - katal per cubic metre
333     ATT_UNIT_KATAL_PER_CUBIC_METRE              = ATT_UUID_16(0x2757),
334     ///Time unit - minute
335     ATT_UNIT_MINUTE                             = ATT_UUID_16(0x2760),
336     ///Time unit - hour
337     ATT_UNIT_HOUR                               = ATT_UUID_16(0x2761),
338     ///Time unit - day
339     ATT_UNIT_DAY                                = ATT_UUID_16(0x2762),
340     ///Plane angle unit - degree
341     ATT_UNIT_ANGLE_DEGREE                       = ATT_UUID_16(0x2763),
342     ///Plane angle unit - minute
343     ATT_UNIT_ANGLE_MINUTE                       = ATT_UUID_16(0x2764),
344     ///Plane angle unit - second
345     ATT_UNIT_ANGLE_SECOND                       = ATT_UUID_16(0x2765),
346     ///Area unit - hectare
347     ATT_UNIT_HECTARE                            = ATT_UUID_16(0x2766),
348     ///Volume unit - litre
349     ATT_UNIT_LITRE                              = ATT_UUID_16(0x2767),
350     ///Mass unit - tonne
351     ATT_UNIT_TONNE                              = ATT_UUID_16(0x2768),
352     ///Pressure unit - bar
353     ATT_UNIT_BAR                                = ATT_UUID_16(0x2780),
354     ///Pressure unit - millimetre of mercury
355     ATT_UNIT_MM_MERCURY                         = ATT_UUID_16(0x2781),
356     ///Length unit - angstrom
357     ATT_UNIT_ANGSTROM                           = ATT_UUID_16(0x2782),
358     ///Length unit - nautical mile
359     ATT_UNIT_NAUTICAL_MILE                      = ATT_UUID_16(0x2783),
360     ///Area unit - barn
361     ATT_UNIT_BARN                               = ATT_UUID_16(0x2784),
362     ///Velocity unit - knot
363     ATT_UNIT_KNOT                               = ATT_UUID_16(0x2785),
364     ///Logarithmic radio quantity unit - neper
365     ATT_UNIT_NEPER                              = ATT_UUID_16(0x2786),
366     ///Logarithmic radio quantity unit - bel
367     ATT_UNIT_BEL                                = ATT_UUID_16(0x2787),
368     ///Length unit - yard
369     ATT_UNIT_YARD                               = ATT_UUID_16(0x27A0),
370     ///Length unit - parsec
371     ATT_UNIT_PARSEC                             = ATT_UUID_16(0x27A1),
372     ///length unit - inch
373     ATT_UNIT_INCH                               = ATT_UUID_16(0x27A2),
374     ///length unit - foot
375     ATT_UNIT_FOOT                               = ATT_UUID_16(0x27A3),
376     ///length unit - mile
377     ATT_UNIT_MILE                               = ATT_UUID_16(0x27A4),
378     ///pressure unit - pound-force per square inch
379     ATT_UNIT_POUND_FORCE_PER_SQ_INCH            = ATT_UUID_16(0x27A5),
380     ///velocity unit - kilometre per hour
381     ATT_UNIT_KM_PER_HOUR                        = ATT_UUID_16(0x27A6),
382     ///velocity unit - mile per hour
383     ATT_UNIT_MILE_PER_HOUR                      = ATT_UUID_16(0x27A7),
384     ///angular velocity unit - revolution per minute
385     ATT_UNIT_REVOLUTION_PER_MINUTE              = ATT_UUID_16(0x27A8),
386     ///energy unit - gram calorie
387     ATT_UNIT_GRAM_CALORIE                       = ATT_UUID_16(0x27A9),
388     ///energy unit - kilogram calorie
389     ATT_UNIT_KG_CALORIE                         = ATT_UUID_16(0x27AA),
390     /// energy unit - kilowatt hour
391     ATT_UNIT_KILOWATT_HOUR                      = ATT_UUID_16(0x27AB),
392     ///thermodynamic temperature unit - degree Fahrenheit
393     ATT_UNIT_FAHRENHEIT                         = ATT_UUID_16(0x27AC),
394     ///percentage
395     ATT_UNIT_PERCENTAGE                         = ATT_UUID_16(0x27AD),
396     ///per mille
397     ATT_UNIT_PER_MILLE                          = ATT_UUID_16(0x27AE),
398     ///period unit - beats per minute)
399     ATT_UNIT_BEATS_PER_MINUTE                   = ATT_UUID_16(0x27AF),
400     ///electric charge unit - ampere hours
401     ATT_UNIT_AMPERE_HOURS                       = ATT_UUID_16(0x27B0),
402     ///mass density unit - milligram per decilitre
403     ATT_UNIT_MILLIGRAM_PER_DECILITRE            = ATT_UUID_16(0x27B1),
404     ///mass density unit - millimole per litre
405     ATT_UNIT_MILLIMOLE_PER_LITRE                = ATT_UUID_16(0x27B2),
406     ///time unit - year
407     ATT_UNIT_YEAR                               = ATT_UUID_16(0x27B3),
408     ////time unit - month
409     ATT_UNIT_MONTH                              = ATT_UUID_16(0x27B4),
410 
411 
412     /*---------------- DECLARATIONS -----------------*/
413     /// Primary service Declaration
414     ATT_DECL_PRIMARY_SERVICE                     = ATT_UUID_16(0x2800),
415     /// Secondary service Declaration
416     ATT_DECL_SECONDARY_SERVICE                   = ATT_UUID_16(0x2801),
417     /// Include Declaration
418     ATT_DECL_INCLUDE                             = ATT_UUID_16(0x2802),
419     /// Characteristic Declaration
420     ATT_DECL_CHARACTERISTIC                      = ATT_UUID_16(0x2803),
421 
422 
423     /*----------------- DESCRIPTORS -----------------*/
424     /// Characteristic extended properties
425     ATT_DESC_CHAR_EXT_PROPERTIES                 = ATT_UUID_16(0x2900),
426     /// Characteristic user description
427     ATT_DESC_CHAR_USER_DESCRIPTION               = ATT_UUID_16(0x2901),
428     /// Client characteristic configuration
429     ATT_DESC_CLIENT_CHAR_CFG                     = ATT_UUID_16(0x2902),
430     /// Server characteristic configuration
431     ATT_DESC_SERVER_CHAR_CFG                     = ATT_UUID_16(0x2903),
432     /// Characteristic Presentation Format
433     ATT_DESC_CHAR_PRES_FORMAT                    = ATT_UUID_16(0x2904),
434     /// Characteristic Aggregate Format
435     ATT_DESC_CHAR_AGGREGATE_FORMAT               = ATT_UUID_16(0x2905),
436     /// Valid Range
437     ATT_DESC_VALID_RANGE                         = ATT_UUID_16(0x2906),
438     /// External Report Reference
439     ATT_DESC_EXT_REPORT_REF                      = ATT_UUID_16(0x2907),
440     /// Report Reference
441     ATT_DESC_REPORT_REF                          = ATT_UUID_16(0x2908),
442     /// Environmental Sensing Configuration
443     ATT_DESC_ES_CONFIGURATION                    = ATT_UUID_16(0x290B),
444     /// Environmental Sensing Measurement
445     ATT_DESC_ES_MEASUREMENT                      = ATT_UUID_16(0x290C),
446     /// Environmental Sensing Trigger Setting
447     ATT_DESC_ES_TRIGGER_SETTING                  = ATT_UUID_16(0x290D),
448 
449 
450     /*--------------- CHARACTERISTICS ---------------*/
451     /// Device name
452     ATT_CHAR_DEVICE_NAME                        = ATT_UUID_16(0x2A00),
453     /// Appearance
454     ATT_CHAR_APPEARANCE                         = ATT_UUID_16(0x2A01),
455     /// Privacy flag
456     ATT_CHAR_PRIVACY_FLAG                       = ATT_UUID_16(0x2A02),
457     /// Reconnection address
458     ATT_CHAR_RECONNECTION_ADDR                  = ATT_UUID_16(0x2A03),
459     /// Peripheral preferred connection parameters
460     ATT_CHAR_PERIPH_PREF_CON_PARAM              = ATT_UUID_16(0x2A04),
461     /// Service handles changed
462     ATT_CHAR_SERVICE_CHANGED                    = ATT_UUID_16(0x2A05),
463     /// Alert Level characteristic
464     ATT_CHAR_ALERT_LEVEL                        = ATT_UUID_16(0x2A06),
465     /// Tx Power Level
466     ATT_CHAR_TX_POWER_LEVEL                     = ATT_UUID_16(0x2A07),
467     /// Date Time
468     ATT_CHAR_DATE_TIME                          = ATT_UUID_16(0x2A08),
469     /// Day of Week
470     ATT_CHAR_DAY_WEEK                           = ATT_UUID_16(0x2A09),
471     /// Day Date Time
472     ATT_CHAR_DAY_DATE_TIME                      = ATT_UUID_16(0x2A0A),
473     /// Exact time 256
474     ATT_CHAR_EXACT_TIME_256                     = ATT_UUID_16(0x2A0C),
475     /// DST Offset
476     ATT_CHAR_DST_OFFSET                         = ATT_UUID_16(0x2A0D),
477     /// Time zone
478     ATT_CHAR_TIME_ZONE                          = ATT_UUID_16(0x2A0E),
479     /// Local time Information
480     ATT_CHAR_LOCAL_TIME_INFO                    = ATT_UUID_16(0x2A0F),
481     /// Time with DST
482     ATT_CHAR_TIME_WITH_DST                      = ATT_UUID_16(0x2A11),
483     /// Time Accuracy
484     ATT_CHAR_TIME_ACCURACY                      = ATT_UUID_16(0x2A12),
485     ///Time Source
486     ATT_CHAR_TIME_SOURCE                        = ATT_UUID_16(0x2A13),
487     /// Reference Time Information
488     ATT_CHAR_REFERENCE_TIME_INFO                = ATT_UUID_16(0x2A14),
489     /// Time Update Control Point
490     ATT_CHAR_TIME_UPDATE_CNTL_POINT             = ATT_UUID_16(0x2A16),
491     /// Time Update State
492     ATT_CHAR_TIME_UPDATE_STATE                  = ATT_UUID_16(0x2A17),
493     /// Glucose Measurement
494     ATT_CHAR_GLUCOSE_MEAS                       = ATT_UUID_16(0x2A18),
495     /// Battery Level
496     ATT_CHAR_BATTERY_LEVEL                      = ATT_UUID_16(0x2A19),
497     /// Temperature Measurement
498     ATT_CHAR_TEMPERATURE_MEAS                   = ATT_UUID_16(0x2A1C),
499     /// Temperature Type
500     ATT_CHAR_TEMPERATURE_TYPE                   = ATT_UUID_16(0x2A1D),
501     /// Intermediate Temperature
502     ATT_CHAR_INTERMED_TEMPERATURE               = ATT_UUID_16(0x2A1E),
503     /// Measurement Interval
504     ATT_CHAR_MEAS_INTERVAL                      = ATT_UUID_16(0x2A21),
505     /// Boot Keyboard Input Report
506     ATT_CHAR_BOOT_KB_IN_REPORT                  = ATT_UUID_16(0x2A22),
507     /// System ID
508     ATT_CHAR_SYS_ID                             = ATT_UUID_16(0x2A23),
509     /// Model Number String
510     ATT_CHAR_MODEL_NB                           = ATT_UUID_16(0x2A24),
511     /// Serial Number String
512     ATT_CHAR_SERIAL_NB                          = ATT_UUID_16(0x2A25),
513     /// Firmware Revision String
514     ATT_CHAR_FW_REV                             = ATT_UUID_16(0x2A26),
515     /// Hardware revision String
516     ATT_CHAR_HW_REV                             = ATT_UUID_16(0x2A27),
517     /// Software Revision String
518     ATT_CHAR_SW_REV                             = ATT_UUID_16(0x2A28),
519     /// Manufacturer Name String
520     ATT_CHAR_MANUF_NAME                         = ATT_UUID_16(0x2A29),
521     /// IEEE Regulatory Certification Data List
522     ATT_CHAR_IEEE_CERTIF                        = ATT_UUID_16(0x2A2A),
523     /// CT Time
524     ATT_CHAR_CT_TIME                            = ATT_UUID_16(0x2A2B),
525     /// Magnetic Declination
526     ATT_CHAR_MAGN_DECLINE                       = ATT_UUID_16(0x2A2C),
527     /// Scan Refresh
528     ATT_CHAR_SCAN_REFRESH                       = ATT_UUID_16(0x2A31),
529     /// Boot Keyboard Output Report
530     ATT_CHAR_BOOT_KB_OUT_REPORT                 = ATT_UUID_16(0x2A32),
531     /// Boot Mouse Input Report
532     ATT_CHAR_BOOT_MOUSE_IN_REPORT               = ATT_UUID_16(0x2A33),
533     /// Glucose Measurement Context
534     ATT_CHAR_GLUCOSE_MEAS_CTX                   = ATT_UUID_16(0x2A34),
535     /// Blood Pressure Measurement
536     ATT_CHAR_BLOOD_PRESSURE_MEAS                = ATT_UUID_16(0x2A35),
537     /// Intermediate Cuff Pressure
538     ATT_CHAR_INTERMEDIATE_CUFF_PRESSURE         = ATT_UUID_16(0x2A36),
539     /// Heart Rate Measurement
540     ATT_CHAR_HEART_RATE_MEAS                    = ATT_UUID_16(0x2A37),
541     /// Body Sensor Location
542     ATT_CHAR_BODY_SENSOR_LOCATION               = ATT_UUID_16(0x2A38),
543     /// Heart Rate Control Point
544     ATT_CHAR_HEART_RATE_CNTL_POINT              = ATT_UUID_16(0x2A39),
545     /// Alert Status
546     ATT_CHAR_ALERT_STATUS                       = ATT_UUID_16(0x2A3F),
547     /// Ringer Control Point
548     ATT_CHAR_RINGER_CNTL_POINT                  = ATT_UUID_16(0x2A40),
549     /// Ringer Setting
550     ATT_CHAR_RINGER_SETTING                     = ATT_UUID_16(0x2A41),
551     /// Alert Category ID Bit Mask
552     ATT_CHAR_ALERT_CAT_ID_BIT_MASK              = ATT_UUID_16(0x2A42),
553     /// Alert Category ID
554     ATT_CHAR_ALERT_CAT_ID                       = ATT_UUID_16(0x2A43),
555     /// Alert Notification Control Point
556     ATT_CHAR_ALERT_NTF_CTNL_PT                  = ATT_UUID_16(0x2A44),
557     /// Unread Alert Status
558     ATT_CHAR_UNREAD_ALERT_STATUS                = ATT_UUID_16(0x2A45),
559     /// New Alert
560     ATT_CHAR_NEW_ALERT                          = ATT_UUID_16(0x2A46),
561     /// Supported New Alert Category
562     ATT_CHAR_SUP_NEW_ALERT_CAT                  = ATT_UUID_16(0x2A47),
563     /// Supported Unread Alert Category
564     ATT_CHAR_SUP_UNREAD_ALERT_CAT               = ATT_UUID_16(0x2A48),
565     /// Blood Pressure Feature
566     ATT_CHAR_BLOOD_PRESSURE_FEATURE             = ATT_UUID_16(0x2A49),
567     /// HID Information
568     ATT_CHAR_HID_INFO                           = ATT_UUID_16(0x2A4A),
569     /// Report Map
570     ATT_CHAR_REPORT_MAP                         = ATT_UUID_16(0x2A4B),
571     /// HID Control Point
572     ATT_CHAR_HID_CTNL_PT                        = ATT_UUID_16(0x2A4C),
573     /// Report
574     ATT_CHAR_REPORT                             = ATT_UUID_16(0x2A4D),
575     /// Protocol Mode
576     ATT_CHAR_PROTOCOL_MODE                      = ATT_UUID_16(0x2A4E),
577     /// Scan Interval Window
578     ATT_CHAR_SCAN_INTV_WD                       = ATT_UUID_16(0x2A4F),
579     /// PnP ID
580     ATT_CHAR_PNP_ID                             = ATT_UUID_16(0x2A50),
581     /// Glucose Feature
582     ATT_CHAR_GLUCOSE_FEATURE                    = ATT_UUID_16(0x2A51),
583     /// Record access control point
584     ATT_CHAR_REC_ACCESS_CTRL_PT                 = ATT_UUID_16(0x2A52),
585     /// RSC Measurement
586     ATT_CHAR_RSC_MEAS                           = ATT_UUID_16(0x2A53),
587     /// RSC Feature
588     ATT_CHAR_RSC_FEAT                           = ATT_UUID_16(0x2A54),
589     /// SC Control Point
590     ATT_CHAR_SC_CNTL_PT                         = ATT_UUID_16(0x2A55),
591     /// CSC Measurement
592     ATT_CHAR_CSC_MEAS                           = ATT_UUID_16(0x2A5B),
593     /// CSC Feature
594     ATT_CHAR_CSC_FEAT                           = ATT_UUID_16(0x2A5C),
595     /// Sensor Location
596     ATT_CHAR_SENSOR_LOC                         = ATT_UUID_16(0x2A5D),
597     /// PLX Spot-Check Measurement
598     ATT_CHAR_PLX_SPOT_CHECK_MEASUREMENT_LOC     = ATT_UUID_16(0x2A5E),
599     /// PLX Continuous Measurement
600     ATT_CHAR_PLX_CONTINUOUS_MEASUREMENT_LOC     = ATT_UUID_16(0x2A5F),
601     /// PLX Features
602     ATT_CHAR_PLX_FEATURES_LOC                   = ATT_UUID_16(0x2A60),
603     /// CP Measurement
604     ATT_CHAR_CP_MEAS                            = ATT_UUID_16(0x2A63),
605     /// CP Vector
606     ATT_CHAR_CP_VECTOR                          = ATT_UUID_16(0x2A64),
607     /// CP Feature
608     ATT_CHAR_CP_FEAT                            = ATT_UUID_16(0x2A65),
609     /// CP Control Point
610     ATT_CHAR_CP_CNTL_PT                         = ATT_UUID_16(0x2A66),
611     /// Location and Speed
612     ATT_CHAR_LOC_SPEED                          = ATT_UUID_16(0x2A67),
613     /// Navigation
614     ATT_CHAR_NAVIGATION                         = ATT_UUID_16(0x2A68),
615     /// Position Quality
616     ATT_CHAR_POS_QUALITY                        = ATT_UUID_16(0x2A69),
617     /// LN Feature
618     ATT_CHAR_LN_FEAT                            = ATT_UUID_16(0x2A6A),
619     /// LN Control Point
620     ATT_CHAR_LN_CNTL_PT                         = ATT_UUID_16(0x2A6B),
621     /// Elevation
622     ATT_CHAR_ELEVATION                          = ATT_UUID_16(0x2A6C),
623     /// Pressure
624     ATT_CHAR_PRESSURE                           = ATT_UUID_16(0x2A6D),
625     /// Temperature
626     ATT_CHAR_TEMPERATURE                        = ATT_UUID_16(0x2A6E),
627     /// Humidity
628     ATT_CHAR_HUMIDITY                           = ATT_UUID_16(0x2A6F),
629     /// True Wind Speed
630     ATT_CHAR_TRUE_WIND_SPEED                    = ATT_UUID_16(0x2A70),
631     /// True Wind Direction
632     ATT_CHAR_TRUE_WIND_DIR                      = ATT_UUID_16(0x2A71),
633     /// Apparent Wind Speed
634     ATT_CHAR_APRNT_WIND_SPEED                   = ATT_UUID_16(0x2A72),
635     /// Apparent Wind Direction
636     ATT_CHAR_APRNT_WIND_DIRECTION               = ATT_UUID_16(0x2A73),
637     /// Gust Factor
638     ATT_CHAR_GUST_FACTOR                        = ATT_UUID_16(0x2A74),
639     /// Pollen Concentration
640     ATT_CHAR_POLLEN_CONC                        = ATT_UUID_16(0x2A75),
641     /// UV Index
642     ATT_CHAR_UV_INDEX                           = ATT_UUID_16(0x2A76),
643     /// Irradiance
644     ATT_CHAR_IRRADIANCE                         = ATT_UUID_16(0x2A77),
645     /// Rainfall
646     ATT_CHAR_RAINFALL                           = ATT_UUID_16(0x2A78),
647     /// Wind Chill
648     ATT_CHAR_WIND_CHILL                         = ATT_UUID_16(0x2A79),
649     /// Heat Index
650     ATT_CHAR_HEAT_INDEX                         = ATT_UUID_16(0x2A7A),
651     /// Dew Point
652     ATT_CHAR_DEW_POINT                          = ATT_UUID_16(0x2A7B),
653     /// Descriptor Value Changed
654     ATT_CHAR_DESCRIPTOR_VALUE_CHANGED           = ATT_UUID_16(0x2A7D),
655     /// Aerobic Heart Rate Lower Limit
656     ATT_CHAR_AEROBIC_HEART_RATE_LOWER_LIMIT     = ATT_UUID_16(0x2A7E),
657     /// Aerobic Threshhold
658     ATT_CHAR_AEROBIC_THRESHHOLD                 = ATT_UUID_16(0x2A7F),
659     /// Age
660     ATT_CHAR_AGE                                = ATT_UUID_16(0x2A80),
661     /// Anaerobic Heart Rate Lower Limit
662     ATT_CHAR_ANAEROBIC_HEART_RATE_LOWER_LIMIT   = ATT_UUID_16(0x2A81),
663     /// Anaerobic Heart Rate Upper Limit
664     ATT_CHAR_ANAEROBIC_HEART_RATE_UPPER_LIMIT   = ATT_UUID_16(0x2A82),
665     /// Anaerobic Threshhold
666     ATT_CHAR_ANAEROBIC_THRESHHOLD               = ATT_UUID_16(0x2A83),
667     /// Aerobic Heart Rate Upper Limit
668     ATT_CHAR_AEROBIC_HEART_RATE_UPPER_LIMIT     = ATT_UUID_16(0x2A84),
669     /// Date Of Birth
670     ATT_CHAR_DATE_OF_BIRTH                      = ATT_UUID_16(0x2A85),
671     /// Date Of Threshold Assessment
672     ATT_CHAR_DATE_OF_THRESHOLD_ASSESSMENT       = ATT_UUID_16(0x2A86),
673     /// Email Address
674     ATT_CHAR_EMAIL_ADDRESS                      = ATT_UUID_16(0x2A87),
675     /// Fat Burn Heart Rate Lower Limit
676     ATT_CHAR_FAT_BURN_HEART_RATE_LOWER_LIMIT    = ATT_UUID_16(0x2A88),
677     /// Fat Burn Heart Rate Upper Limit
678     ATT_CHAR_FAT_BURN_HEART_RATE_UPPER_LIMIT    = ATT_UUID_16(0x2A89),
679     /// First Name
680     ATT_CHAR_FIRST_NAME                         = ATT_UUID_16(0x2A8A),
681     /// Five Zone Heart Rate Limits
682     ATT_CHAR_FIVE_ZONE_HEART_RATE_LIMITS        = ATT_UUID_16(0x2A8B),
683     /// Gender
684     ATT_CHAR_GENDER                             = ATT_UUID_16(0x2A8C),
685     /// Max Heart Rate
686     ATT_CHAR_MAX_HEART_RATE                     = ATT_UUID_16(0x2A8D),
687     /// Height
688     ATT_CHAR_HEIGHT                             = ATT_UUID_16(0x2A8E),
689     /// Hip Circumference
690     ATT_CHAR_HIP_CIRCUMFERENCE                  = ATT_UUID_16(0x2A8F),
691     /// Last Name
692     ATT_CHAR_LAST_NAME                          = ATT_UUID_16(0x2A90),
693     /// Maximum Recommended Heart Rate
694     ATT_CHAR_MAXIMUM_RECOMMENDED_HEART_RATE     = ATT_UUID_16(0x2A91),
695     /// Resting Heart Rate
696     ATT_CHAR_RESTING_HEART_RATE                 = ATT_UUID_16(0x2A92),
697     /// Sport Type For Aerobic And Anaerobic Thresholds
698     ATT_CHAR_SPORT_TYPE_FOR_AEROBIC_AND_ANAEROBIC_THRESHOLDS = ATT_UUID_16(0x2A93),
699     /// Three Zone Heart Rate Limits
700     ATT_CHAR_THREE_ZONE_HEART_RATE_LIMITS       = ATT_UUID_16(0x2A94),
701     /// Two Zone Heart Rate Limit
702     ATT_CHAR_TWO_ZONE_HEART_RATE_LIMIT          = ATT_UUID_16(0x2A95),
703     /// Vo2 Max
704     ATT_CHAR_VO2_MAX                            = ATT_UUID_16(0x2A96),
705     /// Waist Circumference
706     ATT_CHAR_WAIST_CIRCUMFERENCE                = ATT_UUID_16(0x2A97),
707     /// Weight
708     ATT_CHAR_WEIGHT                             = ATT_UUID_16(0x2A98),
709     /// Database Change Increment
710     ATT_CHAR_DATABASE_CHANGE_INCREMENT          = ATT_UUID_16(0x2A99),
711     /// User Index
712     ATT_CHAR_USER_INDEX                         = ATT_UUID_16(0x2A9A),
713     /// Body Composition Feature
714     ATT_CHAR_BODY_COMPOSITION_FEATURE           = ATT_UUID_16(0x2A9B),
715     /// Body Composition Measurement
716     ATT_CHAR_BODY_COMPOSITION_MEASUREMENT       = ATT_UUID_16(0x2A9C),
717     /// Weight Measurement
718     ATT_CHAR_WEIGHT_MEASUREMENT                 = ATT_UUID_16(0x2A9D),
719     /// Weight Scale Feature
720     ATT_CHAR_WEIGHT_SCALE_FEATURE               = ATT_UUID_16(0x2A9E),
721     /// User Control Point
722     ATT_CHAR_USER_CONTROL_POINT                 = ATT_UUID_16(0x2A9F),
723     /// Flux Density - 2D
724     ATT_CHAR_MAGN_FLUX_2D                       = ATT_UUID_16(0x2AA0),
725     /// Magnetic Flux Density - 3D
726     ATT_CHAR_MAGN_FLUX_3D                       = ATT_UUID_16(0x2AA1),
727     /// Language string
728     ATT_CHAR_LANGUAGE                           = ATT_UUID_16(0x2AA2),
729     /// Barometric Pressure Trend
730     ATT_CHAR_BAR_PRES_TREND                     = ATT_UUID_16(0x2AA3),
731     /// Central Address Resolution Support
732     ATT_CHAR_CTL_ADDR_RESOL_SUPP                = ATT_UUID_16(0x2AA6),
733     /// CGM Measurement
734     ATT_CHAR_CGM_MEASUREMENT                    = ATT_UUID_16(0x2AA7),
735     /// CGM Features
736     ATT_CHAR_CGM_FEATURES                       = ATT_UUID_16(0x2AA8),
737     /// CGM Status
738     ATT_CHAR_CGM_STATUS                         = ATT_UUID_16(0x2AA9),
739     /// CGM Session Start
740     ATT_CHAR_CGM_SESSION_START                  = ATT_UUID_16(0x2AAA),
741     /// CGM Session Run
742     ATT_CHAR_CGM_SESSION_RUN                    = ATT_UUID_16(0x2AAB),
743     /// CGM Specific Ops Control Point
744     ATT_CHAR_CGM_SPECIFIC_OPS_CTRL_PT           = ATT_UUID_16(0x2AAC),
745     /// Resolvable Private Address only
746     ATT_CHAR_RSLV_PRIV_ADDR_ONLY                = ATT_UUID_16(0x2AC9),
747     /// Mesh Provisioning Data In
748     ATT_CHAR_MESH_PROV_DATA_IN                  = ATT_UUID_16(0x2ADB),
749     /// Mesh Provisioning Data Out
750     ATT_CHAR_MESH_PROV_DATA_OUT                 = ATT_UUID_16(0x2ADC),
751     /// Mesh Proxy Data In
752     ATT_CHAR_MESH_PROXY_DATA_IN                 = ATT_UUID_16(0x2ADD),
753     /// Mesh Proxy Data Out
754     ATT_CHAR_MESH_PROXY_DATA_OUT                = ATT_UUID_16(0x2ADE),
755 };
756 
757 /// Format for Characteristic Presentation
758 enum {
759     /// unsigned 1-bit: true or false
760     ATT_FORMAT_BOOL     = 0x01,
761     /// unsigned 2-bit integer
762     ATT_FORMAT_2BIT,
763     /// unsigned 4-bit integer
764     ATT_FORMAT_NIBBLE,
765     /// unsigned 8-bit integer
766     ATT_FORMAT_UINT8,
767     /// unsigned 12-bit integer
768     ATT_FORMAT_UINT12,
769     /// unsigned 16-bit integer
770     ATT_FORMAT_UINT16,
771     /// unsigned 24-bit integer
772     ATT_FORMAT_UINT24,
773     /// unsigned 32-bit integer
774     ATT_FORMAT_UINT32,
775     /// unsigned 48-bit integer
776     ATT_FORMAT_UINT48,
777     /// unsigned 64-bit integer
778     ATT_FORMAT_UINT64,
779     /// unsigned 128-bit integer
780     ATT_FORMAT_UINT128,
781     /// signed 8-bit integer
782     ATT_FORMAT_SINT8,
783     /// signed 12-bit integer
784     ATT_FORMAT_SINT12,
785     /// signed 16-bit integer
786     ATT_FORMAT_SINT16,
787     /// signed 24-bit integer
788     ATT_FORMAT_SINT24,
789     /// signed 32-bit integer
790     ATT_FORMAT_SINT32,
791     /// signed 48-bit integer
792     ATT_FORMAT_SINT48,
793     /// signed 64-bit integer
794     ATT_FORMAT_SINT64,
795     /// signed 128-bit integer
796     ATT_FORMAT_SINT128,
797     /// IEEE-754 32-bit floating point
798     ATT_FORMAT_FLOAT32,
799     /// IEEE-754 64-bit floating point
800     ATT_FORMAT_FLOAT64,
801     /// IEEE-11073 16-bit SFLOAT
802     ATT_FORMAT_SFLOAT,
803     /// IEEE-11073 32-bit FLOAT
804     ATT_FORMAT_FLOAT,
805     /// IEEE-20601 format
806     ATT_FORMAT_DUINT16,
807     /// UTF-8 string
808     ATT_FORMAT_UTF8S,
809     /// UTF-16 string
810     ATT_FORMAT_UTF16S,
811     /// Opaque structure
812     ATT_FORMAT_STRUCT,
813     /// Last format
814     ATT_FORMAT_LAST
815 };
816 
817 
818 /// Client Characteristic Configuration Codes
819 enum att_ccc_val
820 {
821     /// Stop notification/indication
822     ATT_CCC_STOP_NTFIND = 0x0000,
823     /// Start notification
824     ATT_CCC_START_NTF,
825     /// Start indication
826     ATT_CCC_START_IND
827 };
828 
829 /*
830  * Type Definition
831  ****************************************************************************************
832  */
833 
834 /// Attribute length type
835 typedef uint16_t att_size_t;
836 
837 
838 /// UUID - 128-bit type
839 struct att_uuid_128
840 {
841     /// 128-bit UUID
842     uint8_t uuid[ATT_UUID_128_LEN];
843 };
844 
845 /// UUID - 32-bit type
846 struct att_uuid_32
847 {
848     /// 32-bit UUID
849     uint8_t uuid[ATT_UUID_32_LEN];
850 };
851 
852 
853 
854 /// Characteristic Value Descriptor
855 struct att_char_desc
856 {
857     /// properties
858     uint8_t prop;
859     /// attribute handle
860     uint8_t attr_hdl[ATT_HANDLE_LEN];
861     /// attribute type
862     uint8_t attr_type[ATT_UUID_16_LEN];
863 };
864 
865 /// Characteristic Value Descriptor
866 struct att_char128_desc
867 {
868     /// properties
869     uint8_t prop;
870     /// attribute handle
871     uint8_t attr_hdl[ATT_HANDLE_LEN];
872     /// attribute type
873     uint8_t attr_type[ATT_UUID_128_LEN];
874 };
875 
876 /// Service Value Descriptor - 16-bit
877 typedef uint16_t att_svc_desc_t;
878 
879 /// include service entry element
880 struct att_incl_desc
881 {
882     /// start handle value of included service
883     uint16_t start_hdl;
884     /// end handle value of included service
885     uint16_t end_hdl;
886     /// attribute value UUID
887     uint16_t uuid;
888 };
889 
890 /// include service entry element
891 struct att_incl128_desc
892 {
893     /// start handle value of included service
894     uint16_t start_hdl;
895     /// end handle value of included service
896     uint16_t end_hdl;
897 };
898 
899 
900 // -------------------------- PDU HANDLER Definition  --------------------------
901 
902 /// used to know if PDU handler has been found
903 #define ATT_PDU_HANDLER_NOT_FOUND       (0xff)
904 
905 /// Format of a pdu handler function
906 typedef int (*att_func_t)(uint8_t conidx, void *pdu);
907 
908 /// Element of a pdu handler table.
909 struct att_pdu_handler
910 {
911     /// PDU identifier of the message
912     uint8_t pdu_id;
913     /// Pointer to the handler function for the pdu above.
914     att_func_t handler;
915 };
916 
917 
918 // --------------------------- Database permissions -----------------------------
919 
920 /// Macro used to retrieve access permission rights
921 #define PERM_GET(perm, access)\
922         (((perm) & (PERM_MASK_ ## access)) >> (PERM_POS_ ## access))
923 
924 /// Macro used to set a permission value
925 #define PERM_SET(perm, access, value)\
926     perm = ((perm & ~(PERM_MASK_ ## access)) | ((value << (PERM_POS_ ## access)) & (PERM_MASK_ ## access)))
927 
928 /// Macro used to retrieve permission value from access and rights on attribute.
929 #define PERM(access, right) \
930     (((PERM_RIGHT_ ## right) << (PERM_POS_ ## access)) & (PERM_MASK_ ## access))
931 
932 /// Macro used know if permission is set or not.
933 #define PERM_IS_SET(perm, access, right) \
934     (((perm) & (((PERM_RIGHT_ ## right) << (PERM_POS_ ## access))) \
935                 & (PERM_MASK_ ## access)) == PERM(access, right))
936 
937 /// Macro used to create permission value
938 #define PERM_VAL(access, perm) \
939     ((((perm) << (PERM_POS_ ## access))) & (PERM_MASK_ ## access))
940 
941 
942 
943 /// Retrieve attribute security level from attribute right and service right
944 #define ATT_GET_SEC_LVL(att_right, svc_right) \
945     co_max(((att_right) & PERM_RIGHT_AUTH), ((svc_right) & PERM_RIGHT_AUTH));
946 
947 /// Retrieve UUID LEN from UUID Length Permission
948 #define ATT_UUID_LEN(uuid_len_perm) ((uuid_len_perm == 0) ? ATT_UUID_16_LEN : \
949         ((uuid_len_perm == 1) ? ATT_UUID_32_LEN  :                        \
950         ((uuid_len_perm == 2) ? ATT_UUID_128_LEN : 0)))
951 
952 /// Initialization of attribute element
953 #define ATT_ELEMT_INIT                                   {{NULL}, false}
954 
955 /**
956  *   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1    0
957  * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
958  * |EXT | WS | I  | N  | WR | WC | RD | B  |    NP   |    IP   |   WP    |    RP   |
959  * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
960  *
961  * Bit [0-1]  : Read Permission         (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
962  * Bit [2-3]  : Write Permission        (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
963  * Bit [4-5]  : Indication Permission   (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
964  * Bit [6-7]  : Notification Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
965  *
966  * Bit [8]    : Extended properties present (only relevant for a characteristic value)
967  * Bit [9]    : Broadcast permission        (only relevant for a characteristic value)
968  * Bit [10]   : Write Command accepted
969  * Bit [11]   : Write Signed accepted
970  * Bit [12]   : Write Request accepted
971  * Bit [13]   : Encryption key Size must be 16 bytes
972  */
973 enum attm_perm_mask
974 {
975     /// retrieve all permission info
976     PERM_MASK_ALL            = 0x0000,
977     /// Read Permission Mask
978     PERM_MASK_RP             = 0x0003,
979     PERM_POS_RP              = 0,
980     /// Write Permission Mask
981     PERM_MASK_WP             = 0x000C,
982     PERM_POS_WP              = 2,
983     /// Indication Access Mask
984     PERM_MASK_IP            = 0x0030,
985     PERM_POS_IP             = 4,
986     /// Notification Access Mask
987     PERM_MASK_NP            = 0x00C0,
988     PERM_POS_NP             = 6,
989     /// Broadcast descriptor present
990     PERM_MASK_BROADCAST     = 0x0100,
991     PERM_POS_BROADCAST      = 8,
992     /// Read Access Mask
993     PERM_MASK_RD            = 0x0200,
994     PERM_POS_RD             = 9,
995     /// Write Command Enabled attribute Mask
996     PERM_MASK_WRITE_COMMAND = 0x0400,
997     PERM_POS_WRITE_COMMAND  = 10,
998     /// Write Request Enabled attribute Mask
999     PERM_MASK_WRITE_REQ     = 0x0800,
1000     PERM_POS_WRITE_REQ      = 11,
1001     /// Notification Access Mask
1002     PERM_MASK_NTF           = 0x1000,
1003     PERM_POS_NTF            = 12,
1004     /// Indication Access Mask
1005     PERM_MASK_IND           = 0x2000,
1006     PERM_POS_IND            = 13,
1007     /// Write Signed Enabled attribute Mask
1008     PERM_MASK_WRITE_SIGNED  = 0x4000,
1009     PERM_POS_WRITE_SIGNED   = 14,
1010     /// Extended properties descriptor present
1011     PERM_MASK_EXT           = 0x8000,
1012     PERM_POS_EXT            = 15,
1013 
1014     /// Properties
1015     PERM_MASK_PROP          = 0xFF00,
1016     PERM_POS_PROP           = 8,
1017 };
1018 
1019 /**
1020  * Value permission bit field
1021  *
1022  *   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1    0
1023  * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
1024  * | RI |UUID_LEN |EKS |    MAX_LEN (RI = 1) / Value Offset  (RI = 0)              |
1025  * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
1026  *
1027  * Bit [0-11] : Maximum Attribute Length or Value Offset pointer
1028  * Bit [12]   : Encryption key Size must be 16 bytes
1029  * Bit [14-13]: UUID Length             (0 = 16 bits, 1 = 32 bits, 2 = 128 bits, 3 = RFU)
1030  * Bit [15]   : Trigger Read Indication (0 = Value present in Database, 1 = Value not present in Database)
1031  */
1032 enum attm_value_perm_mask
1033 {
1034     /// Maximum Attribute Length
1035     PERM_MASK_MAX_LEN     = 0x0FFF,
1036     PERM_POS_MAX_LEN      = 0,
1037     /// Attribute value Offset
1038     PERM_MASK_VAL_OFFSET  = 0x0FFF,
1039     PERM_POS_VAL_OFFSET   = 0,
1040     /// Check Encryption key size Mask
1041     PERM_MASK_EKS         = 0x1000,
1042     PERM_POS_EKS          = 12,
1043     /// UUID Length
1044     PERM_MASK_UUID_LEN    = 0x6000,
1045     PERM_POS_UUID_LEN     = 13,
1046     /// Read trigger Indication
1047     PERM_MASK_RI          = 0x8000,
1048     PERM_POS_RI           = 15,
1049 };
1050 
1051 
1052 /**
1053  * Service permissions
1054  *
1055  *    7    6    5    4    3    2    1    0
1056  * +----+----+----+----+----+----+----+----+
1057  * |SEC |UUID_LEN |DIS |  AUTH   |EKS | MI |
1058  * +----+----+----+----+----+----+----+----+
1059  *
1060  * Bit [0]  : Task that manage service is multi-instantiated (Connection index is conveyed)
1061  * Bit [1]  : Encryption key Size must be 16 bytes
1062  * Bit [2-3]: Service Permission      (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = Secure Connect)
1063  * Bit [4]  : Disable the service
1064  * Bit [5-6]: UUID Length             (0 = 16 bits, 1 = 32 bits, 2 = 128 bits, 3 = RFU)
1065  * Bit [7]  : Secondary Service       (0 = Primary Service, 1 = Secondary Service)
1066  */
1067 enum attm_svc_perm_mask
1068 {
1069     /// Task that manage service is multi-instantiated
1070     PERM_MASK_SVC_MI        = 0x01,
1071     PERM_POS_SVC_MI         = 0,
1072     /// Check Encryption key size for service Access
1073     PERM_MASK_SVC_EKS       = 0x02,
1074     PERM_POS_SVC_EKS        = 1,
1075     /// Service Permission authentication
1076     PERM_MASK_SVC_AUTH      = 0x0C,
1077     PERM_POS_SVC_AUTH       = 2,
1078     /// Disable the service
1079     PERM_MASK_SVC_DIS       = 0x10,
1080     PERM_POS_SVC_DIS        = 4,
1081     /// Service UUID Length
1082     PERM_MASK_SVC_UUID_LEN  = 0x60,
1083     PERM_POS_SVC_UUID_LEN   = 5,
1084     /// Service type Secondary
1085     PERM_MASK_SVC_SECONDARY = 0x80,
1086     PERM_POS_SVC_SECONDARY  = 7,
1087 };
1088 
1089 /// Attribute & Service access mode
1090 enum
1091 {
1092     /// Disable access
1093     PERM_RIGHT_DISABLE   = 0,
1094     /// Enable access
1095     PERM_RIGHT_ENABLE   = 1,
1096 };
1097 
1098 /// Attribute & Service access rights
1099 enum
1100 {
1101     /// No Authentication
1102     PERM_RIGHT_NO_AUTH  = 0,
1103     /// Access Requires Unauthenticated link
1104     PERM_RIGHT_UNAUTH   = 1,
1105     /// Access Requires Authenticated link
1106     PERM_RIGHT_AUTH     = 2,
1107     /// Access Requires Secure Connection link
1108     PERM_RIGHT_SEC_CON  = 3,
1109 };
1110 
1111 /// Attribute & Service UUID Length
1112 enum
1113 {
1114     /// 16  bits UUID
1115     PERM_UUID_16         = 0,
1116     PERM_RIGHT_UUID_16         = 0,
1117     /// 32  bits UUID
1118     PERM_UUID_32         = 1,
1119     PERM_RIGHT_UUID_32         = 1,
1120     /// 128 bits UUID
1121     PERM_UUID_128        = 2,
1122     PERM_RIGHT_UUID_128        = 2,
1123     /// Invalid
1124     PERM_UUID_RFU        = 3,
1125 };
1126 
1127 /// execute flags
1128 enum
1129 {
1130     /// Cancel All the Reliable Writes
1131     ATT_CANCEL_ALL_PREPARED_WRITES = 0x00,
1132     /// Write All the Reliable Writes
1133     ATT_EXECUTE_ALL_PREPARED_WRITES
1134 };
1135 
1136 #endif // _HAL_ATT_H
1137