1 // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2 //
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 __ESP_GATT_DEFS_H__
16 #define __ESP_GATT_DEFS_H__
17 
18 #include "esp_bt_defs.h"
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 /// GATT INVALID UUID
25 #define ESP_GATT_ILLEGAL_UUID               0
26 /// GATT INVALID HANDLE
27 #define ESP_GATT_ILLEGAL_HANDLE             0
28 /// GATT attribute max handle
29 #define ESP_GATT_ATTR_HANDLE_MAX            100
30 #define ESP_GATT_MAX_READ_MULTI_HANDLES     10           /* Max attributes to read in one request */
31 
32 
33 /**@{
34  * All "ESP_GATT_UUID_xxx" is attribute types
35  */
36 #define ESP_GATT_UUID_IMMEDIATE_ALERT_SVC           0x1802          /*  Immediate alert Service*/
37 #define ESP_GATT_UUID_LINK_LOSS_SVC                 0x1803          /*  Link Loss Service*/
38 #define ESP_GATT_UUID_TX_POWER_SVC                  0x1804          /*  TX Power Service*/
39 #define ESP_GATT_UUID_CURRENT_TIME_SVC              0x1805          /*  Current Time Service Service*/
40 #define ESP_GATT_UUID_REF_TIME_UPDATE_SVC           0x1806          /*  Reference Time Update Service*/
41 #define ESP_GATT_UUID_NEXT_DST_CHANGE_SVC           0x1807          /*  Next DST Change Service*/
42 #define ESP_GATT_UUID_GLUCOSE_SVC                   0x1808          /*  Glucose Service*/
43 #define ESP_GATT_UUID_HEALTH_THERMOM_SVC            0x1809          /*  Health Thermometer Service*/
44 #define ESP_GATT_UUID_DEVICE_INFO_SVC               0x180A          /*  Device Information Service*/
45 #define ESP_GATT_UUID_HEART_RATE_SVC                0x180D          /*  Heart Rate Service*/
46 #define ESP_GATT_UUID_PHONE_ALERT_STATUS_SVC        0x180E          /* Phone Alert Status Service*/
47 #define ESP_GATT_UUID_BATTERY_SERVICE_SVC           0x180F          /* Battery Service*/
48 #define ESP_GATT_UUID_BLOOD_PRESSURE_SVC            0x1810          /* Blood Pressure Service*/
49 #define ESP_GATT_UUID_ALERT_NTF_SVC                 0x1811          /* Alert Notification Service*/
50 #define ESP_GATT_UUID_HID_SVC                       0x1812          /* HID Service*/
51 #define ESP_GATT_UUID_SCAN_PARAMETERS_SVC           0x1813          /* Scan Parameters Service*/
52 #define ESP_GATT_UUID_RUNNING_SPEED_CADENCE_SVC     0x1814          /* Running Speed and Cadence Service*/
53 #define ESP_GATT_UUID_Automation_IO_SVC             0x1815          /* Automation IO Service*/
54 #define ESP_GATT_UUID_CYCLING_SPEED_CADENCE_SVC     0x1816          /* Cycling Speed and Cadence Service*/
55 #define ESP_GATT_UUID_CYCLING_POWER_SVC             0x1818          /* Cycling Power Service*/
56 #define ESP_GATT_UUID_LOCATION_AND_NAVIGATION_SVC   0x1819          /* Location and Navigation Service*/
57 #define ESP_GATT_UUID_ENVIRONMENTAL_SENSING_SVC     0x181A          /* Environmental Sensing Service*/
58 #define ESP_GATT_UUID_BODY_COMPOSITION              0x181B          /* Body Composition Service*/
59 #define ESP_GATT_UUID_USER_DATA_SVC                 0x181C          /* User Data Service*/
60 #define ESP_GATT_UUID_WEIGHT_SCALE_SVC              0x181D          /* Weight Scale Service*/
61 #define ESP_GATT_UUID_BOND_MANAGEMENT_SVC           0x181E          /* Bond Management Service*/
62 #define ESP_GATT_UUID_CONT_GLUCOSE_MONITOR_SVC      0x181F          /* Continuous Glucose Monitoring Service*/
63 
64 #define ESP_GATT_UUID_PRI_SERVICE                   0x2800
65 #define ESP_GATT_UUID_SEC_SERVICE                   0x2801
66 #define ESP_GATT_UUID_INCLUDE_SERVICE               0x2802
67 #define ESP_GATT_UUID_CHAR_DECLARE                  0x2803          /*  Characteristic Declaration*/
68 
69 #define ESP_GATT_UUID_CHAR_EXT_PROP                 0x2900          /*  Characteristic Extended Properties */
70 #define ESP_GATT_UUID_CHAR_DESCRIPTION              0x2901          /*  Characteristic User Description*/
71 #define ESP_GATT_UUID_CHAR_CLIENT_CONFIG            0x2902          /*  Client Characteristic Configuration */
72 #define ESP_GATT_UUID_CHAR_SRVR_CONFIG              0x2903          /*  Server Characteristic Configuration */
73 #define ESP_GATT_UUID_CHAR_PRESENT_FORMAT           0x2904          /*  Characteristic Presentation Format*/
74 #define ESP_GATT_UUID_CHAR_AGG_FORMAT               0x2905          /*  Characteristic Aggregate Format*/
75 #define ESP_GATT_UUID_CHAR_VALID_RANGE              0x2906          /*  Characteristic Valid Range */
76 #define ESP_GATT_UUID_EXT_RPT_REF_DESCR             0x2907          /*  External Report Reference */
77 #define ESP_GATT_UUID_RPT_REF_DESCR                 0x2908          /*  Report Reference */
78 #define ESP_GATT_UUID_NUM_DIGITALS_DESCR            0x2909          /*  Number of Digitals */
79 #define ESP_GATT_UUID_VALUE_TRIGGER_DESCR           0x290A          /*  Value Trigger Setting */
80 #define ESP_GATT_UUID_ENV_SENSING_CONFIG_DESCR      0x290B          /*  Environmental Sensing Configuration */
81 #define ESP_GATT_UUID_ENV_SENSING_MEASUREMENT_DESCR 0x290C          /*  Environmental Sensing Measurement */
82 #define ESP_GATT_UUID_ENV_SENSING_TRIGGER_DESCR     0x290D          /*  Environmental Sensing Trigger Setting */
83 #define ESP_GATT_UUID_TIME_TRIGGER_DESCR            0x290E          /*  Time Trigger Setting */
84 
85 /* GAP Profile Attributes */
86 #define ESP_GATT_UUID_GAP_DEVICE_NAME               0x2A00
87 #define ESP_GATT_UUID_GAP_ICON                      0x2A01
88 #define ESP_GATT_UUID_GAP_PREF_CONN_PARAM           0x2A04
89 #define ESP_GATT_UUID_GAP_CENTRAL_ADDR_RESOL        0x2AA6
90 
91 /* Attribute Profile Attribute UUID */
92 #define ESP_GATT_UUID_GATT_SRV_CHGD                 0x2A05
93 
94 /* Link ESP_Loss Service */
95 #define ESP_GATT_UUID_ALERT_LEVEL                   0x2A06          /* Alert Level */
96 #define ESP_GATT_UUID_TX_POWER_LEVEL                0x2A07          /* TX power level */
97 
98 /* Current Time Service */
99 #define ESP_GATT_UUID_CURRENT_TIME                  0x2A2B          /* Current Time */
100 #define ESP_GATT_UUID_LOCAL_TIME_INFO               0x2A0F          /* Local time info */
101 #define ESP_GATT_UUID_REF_TIME_INFO                 0x2A14          /* reference time information */
102 
103 /* Network availability Profile */
104 #define ESP_GATT_UUID_NW_STATUS                     0x2A18          /* network availability status */
105 #define ESP_GATT_UUID_NW_TRIGGER                    0x2A1A          /* Network availability trigger */
106 
107 /* Phone alert */
108 #define ESP_GATT_UUID_ALERT_STATUS                  0x2A3F          /* alert status */
109 #define ESP_GATT_UUID_RINGER_CP                     0x2A40          /* ringer control point */
110 #define ESP_GATT_UUID_RINGER_SETTING                0x2A41          /* ringer setting */
111 
112 /* Glucose Service */
113 #define ESP_GATT_UUID_GM_MEASUREMENT                0x2A18
114 #define ESP_GATT_UUID_GM_CONTEXT                    0x2A34
115 #define ESP_GATT_UUID_GM_CONTROL_POINT              0x2A52
116 #define ESP_GATT_UUID_GM_FEATURE                    0x2A51
117 
118 /* device information characteristic */
119 #define ESP_GATT_UUID_SYSTEM_ID                     0x2A23
120 #define ESP_GATT_UUID_MODEL_NUMBER_STR              0x2A24
121 #define ESP_GATT_UUID_SERIAL_NUMBER_STR             0x2A25
122 #define ESP_GATT_UUID_FW_VERSION_STR                0x2A26
123 #define ESP_GATT_UUID_HW_VERSION_STR                0x2A27
124 #define ESP_GATT_UUID_SW_VERSION_STR                0x2A28
125 #define ESP_GATT_UUID_MANU_NAME                     0x2A29
126 #define ESP_GATT_UUID_IEEE_DATA                     0x2A2A
127 #define ESP_GATT_UUID_PNP_ID                        0x2A50
128 
129 /* HID characteristics */
130 #define ESP_GATT_UUID_HID_INFORMATION               0x2A4A
131 #define ESP_GATT_UUID_HID_REPORT_MAP                0x2A4B
132 #define ESP_GATT_UUID_HID_CONTROL_POINT             0x2A4C
133 #define ESP_GATT_UUID_HID_REPORT                    0x2A4D
134 #define ESP_GATT_UUID_HID_PROTO_MODE                0x2A4E
135 #define ESP_GATT_UUID_HID_BT_KB_INPUT               0x2A22
136 #define ESP_GATT_UUID_HID_BT_KB_OUTPUT              0x2A32
137 #define ESP_GATT_UUID_HID_BT_MOUSE_INPUT            0x2A33
138 
139  /// Heart Rate Measurement
140 #define    ESP_GATT_HEART_RATE_MEAS                 0x2A37
141 /// Body Sensor Location
142 #define    ESP_GATT_BODY_SENSOR_LOCATION            0x2A38
143 /// Heart Rate Control Point
144 #define    ESP_GATT_HEART_RATE_CNTL_POINT           0x2A39
145 
146 /* Battery Service characteristics */
147 #define ESP_GATT_UUID_BATTERY_LEVEL                 0x2A19
148 
149 /* Sensor Service */
150 #define ESP_GATT_UUID_SC_CONTROL_POINT              0x2A55
151 #define ESP_GATT_UUID_SENSOR_LOCATION               0x2A5D
152 
153 /* Runners speed and cadence service */
154 #define ESP_GATT_UUID_RSC_MEASUREMENT               0x2A53
155 #define ESP_GATT_UUID_RSC_FEATURE                   0x2A54
156 
157 /* Cycling speed and cadence service */
158 #define ESP_GATT_UUID_CSC_MEASUREMENT               0x2A5B
159 #define ESP_GATT_UUID_CSC_FEATURE                   0x2A5C
160 
161 /* Scan ESP_Parameter characteristics */
162 #define ESP_GATT_UUID_SCAN_INT_WINDOW               0x2A4F
163 #define ESP_GATT_UUID_SCAN_REFRESH                  0x2A31
164 /**
165  * @}
166  */
167 
168 /* relate to BTA_GATT_PREP_WRITE_xxx in bta/bta_gatt_api.h */
169 /// Attribute write data type from the client
170 typedef enum {
171     ESP_GATT_PREP_WRITE_CANCEL    = 0x00,       /*!< Prepare write cancel */  /* relate to BTA_GATT_PREP_WRITE_CANCEL in bta/bta_gatt_api.h */
172     ESP_GATT_PREP_WRITE_EXEC      = 0x01,       /*!< Prepare write execute */ /* relate to BTA_GATT_PREP_WRITE_EXEC in bta/bta_gatt_api.h */
173 } esp_gatt_prep_write_type;
174 
175 /* relate to BTA_GATT_xxx in bta/bta_gatt_api.h */
176 /**
177  * @brief GATT success code and error codes
178  */
179 typedef enum {
180     ESP_GATT_OK                     =   0x0,                    /* relate to BTA_GATT_OK in bta/bta_gatt_api.h */
181     ESP_GATT_INVALID_HANDLE         =   0x01,   /* 0x0001 */    /* relate to BTA_GATT_INVALID_HANDLE in bta/bta_gatt_api.h */
182     ESP_GATT_READ_NOT_PERMIT        =   0x02,   /* 0x0002 */    /* relate to BTA_GATT_READ_NOT_PERMIT in bta/bta_gatt_api.h */
183     ESP_GATT_WRITE_NOT_PERMIT       =   0x03,   /* 0x0003 */    /* relate to BTA_GATT_WRITE_NOT_PERMIT in bta/bta_gatt_api.h */
184     ESP_GATT_INVALID_PDU            =   0x04,   /* 0x0004 */    /* relate to BTA_GATT_INVALID_PDU in bta/bta_gatt_api.h */
185     ESP_GATT_INSUF_AUTHENTICATION   =   0x05,   /* 0x0005 */    /* relate to BTA_GATT_INSUF_AUTHENTICATION in bta/bta_gatt_api.h */
186     ESP_GATT_REQ_NOT_SUPPORTED      =   0x06,   /* 0x0006 */    /* relate to BTA_GATT_REQ_NOT_SUPPORTED in bta/bta_gatt_api.h */
187     ESP_GATT_INVALID_OFFSET         =   0x07,   /* 0x0007 */    /* relate to BTA_GATT_INVALID_OFFSET in bta/bta_gatt_api.h */
188     ESP_GATT_INSUF_AUTHORIZATION    =   0x08,   /* 0x0008 */    /* relate to BTA_GATT_INSUF_AUTHORIZATION in bta/bta_gatt_api.h */
189     ESP_GATT_PREPARE_Q_FULL         =   0x09,   /* 0x0009 */    /* relate to BTA_GATT_PREPARE_Q_FULL in bta/bta_gatt_api.h */
190     ESP_GATT_NOT_FOUND              =   0x0a,   /* 0x000a */    /* relate to BTA_GATT_NOT_FOUND in bta/bta_gatt_api.h */
191     ESP_GATT_NOT_LONG               =   0x0b,   /* 0x000b */    /* relate to BTA_GATT_NOT_LONG in bta/bta_gatt_api.h */
192     ESP_GATT_INSUF_KEY_SIZE         =   0x0c,   /* 0x000c */    /* relate to BTA_GATT_INSUF_KEY_SIZE in bta/bta_gatt_api.h */
193     ESP_GATT_INVALID_ATTR_LEN       =   0x0d,   /* 0x000d */    /* relate to BTA_GATT_INVALID_ATTR_LEN in bta/bta_gatt_api.h */
194     ESP_GATT_ERR_UNLIKELY           =   0x0e,   /* 0x000e */    /* relate to BTA_GATT_ERR_UNLIKELY in bta/bta_gatt_api.h */
195     ESP_GATT_INSUF_ENCRYPTION       =   0x0f,   /* 0x000f */    /* relate to BTA_GATT_INSUF_ENCRYPTION in bta/bta_gatt_api.h */
196     ESP_GATT_UNSUPPORT_GRP_TYPE     =   0x10,   /* 0x0010 */    /* relate to BTA_GATT_UNSUPPORT_GRP_TYPE in bta/bta_gatt_api.h */
197     ESP_GATT_INSUF_RESOURCE         =   0x11,   /* 0x0011 */    /* relate to BTA_GATT_INSUF_RESOURCE in bta/bta_gatt_api.h */
198 
199     ESP_GATT_NO_RESOURCES           =   0x80,   /* 0x80 */    /* relate to BTA_GATT_NO_RESOURCES in bta/bta_gatt_api.h */
200     ESP_GATT_INTERNAL_ERROR         =   0x81,   /* 0x81 */    /* relate to BTA_GATT_INTERNAL_ERROR in bta/bta_gatt_api.h */
201     ESP_GATT_WRONG_STATE            =   0x82,   /* 0x82 */    /* relate to BTA_GATT_WRONG_STATE in bta/bta_gatt_api.h */
202     ESP_GATT_DB_FULL                =   0x83,   /* 0x83 */    /* relate to BTA_GATT_DB_FULL in bta/bta_gatt_api.h */
203     ESP_GATT_BUSY                   =   0x84,   /* 0x84 */    /* relate to BTA_GATT_BUSY in bta/bta_gatt_api.h */
204     ESP_GATT_ERROR                  =   0x85,   /* 0x85 */    /* relate to BTA_GATT_ERROR in bta/bta_gatt_api.h */
205     ESP_GATT_CMD_STARTED            =   0x86,   /* 0x86 */    /* relate to BTA_GATT_CMD_STARTED in bta/bta_gatt_api.h */
206     ESP_GATT_ILLEGAL_PARAMETER      =   0x87,   /* 0x87 */    /* relate to BTA_GATT_ILLEGAL_PARAMETER in bta/bta_gatt_api.h */
207     ESP_GATT_PENDING                =   0x88,   /* 0x88 */    /* relate to BTA_GATT_PENDING in bta/bta_gatt_api.h */
208     ESP_GATT_AUTH_FAIL              =   0x89,   /* 0x89 */    /* relate to BTA_GATT_AUTH_FAIL in bta/bta_gatt_api.h */
209     ESP_GATT_MORE                   =   0x8a,   /* 0x8a */    /* relate to BTA_GATT_MORE in bta/bta_gatt_api.h */
210     ESP_GATT_INVALID_CFG            =   0x8b,   /* 0x8b */    /* relate to BTA_GATT_INVALID_CFG in bta/bta_gatt_api.h */
211     ESP_GATT_SERVICE_STARTED        =   0x8c,   /* 0x8c */    /* relate to BTA_GATT_SERVICE_STARTED in bta/bta_gatt_api.h */
212     ESP_GATT_ENCRYPED_MITM          =   ESP_GATT_OK,    /* relate to BTA_GATT_ENCRYPED_MITM in bta/bta_gatt_api.h */
213     ESP_GATT_ENCRYPED_NO_MITM       =   0x8d,   /* 0x8d */    /* relate to BTA_GATT_ENCRYPED_NO_MITM in bta/bta_gatt_api.h */
214     ESP_GATT_NOT_ENCRYPTED          =   0x8e,   /* 0x8e */    /* relate to BTA_GATT_NOT_ENCRYPTED in bta/bta_gatt_api.h */
215     ESP_GATT_CONGESTED              =   0x8f,   /* 0x8f */    /* relate to BTA_GATT_CONGESTED in bta/bta_gatt_api.h */
216     ESP_GATT_DUP_REG                =   0x90,   /* 0x90 */    /* relate to BTA_GATT_DUP_REG in bta/bta_gatt_api.h */
217     ESP_GATT_ALREADY_OPEN           =   0x91,   /* 0x91 */    /* relate to BTA_GATT_ALREADY_OPEN in bta/bta_gatt_api.h */
218     ESP_GATT_CANCEL                 =   0x92,   /* 0x92 */    /* relate to BTA_GATT_CANCEL in bta/bta_gatt_api.h */
219     /* 0xE0 ~ 0xFC reserved for future use */
220     ESP_GATT_STACK_RSP              =   0xe0,   /* 0xe0 */    /* relate to BTA_GATT_STACK_RSP in bta/bta_gatt_api.h */
221     ESP_GATT_APP_RSP                =   0xe1,   /* 0xe1 */    /* relate to BTA_GATT_APP_RSP in bta/bta_gatt_api.h */
222     //Error caused by customer application or stack bug
223     ESP_GATT_UNKNOWN_ERROR          =   0xef,   /* 0xef */    /* relate to BTA_GATT_UNKNOWN_ERROR in bta/bta_gatt_api.h */
224     ESP_GATT_CCC_CFG_ERR            =   0xfd,   /* 0xFD Client Characteristic Configuration Descriptor Improperly Configured */    /* relate to BTA_GATT_CCC_CFG_ERR in bta/bta_gatt_api.h */
225     ESP_GATT_PRC_IN_PROGRESS        =   0xfe,   /* 0xFE Procedure Already in progress */  /* relate to BTA_GATT_PRC_IN_PROGRESS in bta/bta_gatt_api.h */
226     ESP_GATT_OUT_OF_RANGE           =   0xff,   /* 0xFFAttribute value out of range */    /* relate to BTA_GATT_OUT_OF_RANGE in bta/bta_gatt_api.h */
227 } esp_gatt_status_t;
228 
229 /* relate to BTA_GATT_CONN_xxx in bta/bta_gatt_api.h */
230 /**
231  * @brief Gatt Connection reason enum
232  */
233 typedef enum {
234     ESP_GATT_CONN_UNKNOWN = 0,                      /*!< Gatt connection unknown */               /* relate to BTA_GATT_CONN_UNKNOWN in bta/bta_gatt_api.h */
235     ESP_GATT_CONN_L2C_FAILURE = 1,                  /*!< General L2cap failure  */                /* relate to BTA_GATT_CONN_L2C_FAILURE in bta/bta_gatt_api.h */
236     ESP_GATT_CONN_TIMEOUT = 0x08,                   /*!< Connection timeout  */                   /* relate to BTA_GATT_CONN_TIMEOUT in bta/bta_gatt_api.h */
237     ESP_GATT_CONN_TERMINATE_PEER_USER = 0x13,       /*!< Connection terminate by peer user  */    /* relate to BTA_GATT_CONN_TERMINATE_PEER_USER in bta/bta_gatt_api.h */
238     ESP_GATT_CONN_TERMINATE_LOCAL_HOST = 0x16,      /*!< Connection terminated by local host */    /* relate to BTA_GATT_CONN_TERMINATE_LOCAL_HOST in bta/bta_gatt_api.h */
239     ESP_GATT_CONN_FAIL_ESTABLISH = 0x3e,            /*!< Connection fail to establish  */         /* relate to BTA_GATT_CONN_FAIL_ESTABLISH in bta/bta_gatt_api.h */
240     ESP_GATT_CONN_LMP_TIMEOUT = 0x22,               /*!< Connection fail for LMP response tout */ /* relate to BTA_GATT_CONN_LMP_TIMEOUT in bta/bta_gatt_api.h */
241     ESP_GATT_CONN_CONN_CANCEL = 0x0100,             /*!< L2CAP connection cancelled  */           /* relate to BTA_GATT_CONN_CONN_CANCEL in bta/bta_gatt_api.h */
242     ESP_GATT_CONN_NONE = 0x0101                     /*!< No connection to cancel  */              /* relate to BTA_GATT_CONN_NONE in bta/bta_gatt_api.h */
243 } esp_gatt_conn_reason_t;
244 
245 /**
246  * @brief Gatt id, include uuid and instance id
247  */
248 typedef struct {
249     esp_bt_uuid_t   uuid;                   /*!< UUID */
250     uint8_t         inst_id;                /*!< Instance id */
251 } __attribute__((packed)) esp_gatt_id_t;
252 
253 /**
254  * @brief Gatt service id, include id
255  *        (uuid and instance id) and primary flag
256  */
257 typedef struct {
258     esp_gatt_id_t   id;                     /*!< Gatt id, include uuid and instance */
259     bool            is_primary;             /*!< This service is primary or not */
260 } __attribute__((packed)) esp_gatt_srvc_id_t;
261 
262 /* relate to BTA_GATT_AUTH_REQ_xxx in bta/bta_gatt_api.h */
263 /**
264  * @brief Gatt authentication request type
265  */
266 typedef enum {
267     ESP_GATT_AUTH_REQ_NONE                  = 0,                                       /* relate to BTA_GATT_AUTH_REQ_NONE in bta/bta_gatt_api.h */
268     ESP_GATT_AUTH_REQ_NO_MITM               = 1,   /* unauthenticated encryption */    /* relate to BTA_GATT_AUTH_REQ_NO_MITM in bta/bta_gatt_api.h */
269     ESP_GATT_AUTH_REQ_MITM                  = 2,   /* authenticated encryption */      /* relate to BTA_GATT_AUTH_REQ_MITM in bta/bta_gatt_api.h */
270     ESP_GATT_AUTH_REQ_SIGNED_NO_MITM        = 3,                                       /* relate to BTA_GATT_AUTH_REQ_SIGNED_NO_MITM in bta/bta_gatt_api.h */
271     ESP_GATT_AUTH_REQ_SIGNED_MITM           = 4,                                       /* relate to BTA_GATT_AUTH_REQ_SIGNED_MITM in bta/bta_gatt_api.h */
272 } esp_gatt_auth_req_t;
273 
274 /* relate to BTA_GATT_PERM_xxx in bta/bta_gatt_api.h */
275 /**
276  * @brief Attribute permissions
277  */
278 #define    ESP_GATT_PERM_READ                  (1 << 0)   /* bit 0 -  0x0001 */    /* relate to BTA_GATT_PERM_READ in bta/bta_gatt_api.h */
279 #define    ESP_GATT_PERM_READ_ENCRYPTED        (1 << 1)   /* bit 1 -  0x0002 */    /* relate to BTA_GATT_PERM_READ_ENCRYPTED in bta/bta_gatt_api.h */
280 #define    ESP_GATT_PERM_READ_ENC_MITM         (1 << 2)   /* bit 2 -  0x0004 */    /* relate to BTA_GATT_PERM_READ_ENC_MITM in bta/bta_gatt_api.h */
281 #define    ESP_GATT_PERM_WRITE                 (1 << 4)   /* bit 4 -  0x0010 */    /* relate to BTA_GATT_PERM_WRITE in bta/bta_gatt_api.h */
282 #define    ESP_GATT_PERM_WRITE_ENCRYPTED       (1 << 5)   /* bit 5 -  0x0020 */    /* relate to BTA_GATT_PERM_WRITE_ENCRYPTED in bta/bta_gatt_api.h */
283 #define    ESP_GATT_PERM_WRITE_ENC_MITM        (1 << 6)   /* bit 6 -  0x0040 */    /* relate to BTA_GATT_PERM_WRITE_ENC_MITM in bta/bta_gatt_api.h */
284 #define    ESP_GATT_PERM_WRITE_SIGNED          (1 << 7)   /* bit 7 -  0x0080 */    /* relate to BTA_GATT_PERM_WRITE_SIGNED in bta/bta_gatt_api.h */
285 #define    ESP_GATT_PERM_WRITE_SIGNED_MITM     (1 << 8)   /* bit 8 -  0x0100 */    /* relate to BTA_GATT_PERM_WRITE_SIGNED_MITM in bta/bta_gatt_api.h */
286 #define    ESP_GATT_PERM_READ_AUTHORIZATION    (1 << 9)   /* bit 9 -  0x0200 */
287 #define    ESP_GATT_PERM_WRITE_AUTHORIZATION   (1 << 10)  /* bit 10 - 0x0400 */
288 typedef uint16_t esp_gatt_perm_t;
289 
290 /* relate to BTA_GATT_CHAR_PROP_BIT_xxx in bta/bta_gatt_api.h */
291 /* definition of characteristic properties */
292 #define    ESP_GATT_CHAR_PROP_BIT_BROADCAST    (1 << 0)       /* 0x01 */    /* relate to BTA_GATT_CHAR_PROP_BIT_BROADCAST in bta/bta_gatt_api.h */
293 #define    ESP_GATT_CHAR_PROP_BIT_READ         (1 << 1)       /* 0x02 */    /* relate to BTA_GATT_CHAR_PROP_BIT_READ in bta/bta_gatt_api.h */
294 #define    ESP_GATT_CHAR_PROP_BIT_WRITE_NR     (1 << 2)       /* 0x04 */    /* relate to BTA_GATT_CHAR_PROP_BIT_WRITE_NR in bta/bta_gatt_api.h */
295 #define    ESP_GATT_CHAR_PROP_BIT_WRITE        (1 << 3)       /* 0x08 */    /* relate to BTA_GATT_CHAR_PROP_BIT_WRITE in bta/bta_gatt_api.h */
296 #define    ESP_GATT_CHAR_PROP_BIT_NOTIFY       (1 << 4)       /* 0x10 */    /* relate to BTA_GATT_CHAR_PROP_BIT_NOTIFY in bta/bta_gatt_api.h */
297 #define    ESP_GATT_CHAR_PROP_BIT_INDICATE     (1 << 5)       /* 0x20 */    /* relate to BTA_GATT_CHAR_PROP_BIT_INDICATE in bta/bta_gatt_api.h */
298 #define    ESP_GATT_CHAR_PROP_BIT_AUTH         (1 << 6)       /* 0x40 */    /* relate to BTA_GATT_CHAR_PROP_BIT_AUTH in bta/bta_gatt_api.h */
299 #define    ESP_GATT_CHAR_PROP_BIT_EXT_PROP     (1 << 7)       /* 0x80 */    /* relate to BTA_GATT_CHAR_PROP_BIT_EXT_PROP in bta/bta_gatt_api.h */
300 typedef uint8_t esp_gatt_char_prop_t;
301 
302 /// GATT maximum attribute length
303 #define ESP_GATT_MAX_ATTR_LEN   600 //as same as GATT_MAX_ATTR_LEN
304 
305 typedef enum {
306     ESP_GATT_SERVICE_FROM_REMOTE_DEVICE         = 0,                                       /* relate to BTA_GATTC_SERVICE_INFO_FROM_REMOTE_DEVICE in bta_gattc_int.h */
307     ESP_GATT_SERVICE_FROM_NVS_FLASH             = 1,                                       /* relate to BTA_GATTC_SERVICE_INFO_FROM_NVS_FLASH in bta_gattc_int.h */
308     ESP_GATT_SERVICE_FROM_UNKNOWN               = 2,                                       /* relate to BTA_GATTC_SERVICE_INFO_FROM_UNKNOWN in bta_gattc_int.h */
309 } esp_service_source_t;
310 
311 /**
312  * @brief Attribute description (used to create database)
313  */
314  typedef struct
315  {
316      uint16_t uuid_length;              /*!< UUID length */
317      uint8_t  *uuid_p;                  /*!< UUID value */
318      uint16_t perm;                     /*!< Attribute permission */
319      uint16_t max_length;               /*!< Maximum length of the element*/
320      uint16_t length;                   /*!< Current length of the element*/
321      uint8_t  *value;                   /*!< Element value array*/
322  } esp_attr_desc_t;
323 
324 
325 /**
326  * @brief attribute auto response flag
327  */
328 typedef struct
329 {
330 #define ESP_GATT_RSP_BY_APP             0
331 #define ESP_GATT_AUTO_RSP               1
332     /**
333      * @brief if auto_rsp set to ESP_GATT_RSP_BY_APP, means the response of Write/Read operation will by replied by application.
334               if auto_rsp set to ESP_GATT_AUTO_RSP, means the response of Write/Read operation will be replied by GATT stack automatically.
335      */
336     uint8_t auto_rsp;
337 } esp_attr_control_t;
338 
339 
340 /**
341  * @brief attribute type added to the gatt server database
342  */
343 typedef struct
344 {
345     esp_attr_control_t      attr_control;                   /*!< The attribute control type */
346     esp_attr_desc_t         att_desc;                       /*!< The attribute type */
347 } esp_gatts_attr_db_t;
348 
349 
350 /**
351   * @brief set the attribute value type
352   */
353 typedef struct
354 {
355     uint16_t attr_max_len;                                  /*!<  attribute max value length */
356     uint16_t attr_len;                                      /*!<  attribute current value length */
357     uint8_t  *attr_value;                                   /*!<  the pointer to attribute value */
358 } esp_attr_value_t;
359 
360 
361 /**
362   * @brief Gatt  include service entry element
363   */
364 typedef struct
365 {
366     uint16_t start_hdl;                                     /*!< Gatt  start handle value of included service */
367     uint16_t end_hdl;                                       /*!< Gatt  end handle value of included service */
368     uint16_t uuid;                                          /*!< Gatt  attribute value UUID of included service */
369 } esp_gatts_incl_svc_desc_t;                                /*!< Gatt include service entry element */
370 
371 /**
372   * @brief Gatt  include 128 bit service entry element
373   */
374 typedef struct
375 {
376     uint16_t start_hdl;                                     /*!< Gatt  start handle value of included 128 bit service */
377     uint16_t end_hdl;                                       /*!< Gatt  end handle value of included 128 bit service */
378 } esp_gatts_incl128_svc_desc_t;                             /*!< Gatt  include 128 bit service entry element */
379 
380 /// Gatt attribute value
381 typedef struct {
382     uint8_t           value[ESP_GATT_MAX_ATTR_LEN];         /*!< Gatt attribute value */
383     uint16_t          handle;                               /*!< Gatt attribute handle */
384     uint16_t          offset;                               /*!< Gatt attribute value offset */
385     uint16_t          len;                                  /*!< Gatt attribute value length */
386     uint8_t           auth_req;                             /*!< Gatt authentication request */
387 } esp_gatt_value_t;
388 
389 /// GATT remote read request response type
390 typedef union {
391     esp_gatt_value_t attr_value;                            /*!< Gatt attribute structure */
392     uint16_t            handle;                             /*!< Gatt attribute handle */
393 } esp_gatt_rsp_t;
394 
395 /**
396   * @brief Gatt write type
397   */
398 typedef enum {
399     ESP_GATT_WRITE_TYPE_NO_RSP  =   1,                      /*!< Gatt write attribute need no response */
400     ESP_GATT_WRITE_TYPE_RSP,                                /*!< Gatt write attribute need remote response */
401 } esp_gatt_write_type_t;
402 
403 /**
404   * @brief Connection parameters information
405   */
406 typedef struct {
407     uint16_t             interval;                         /*!< connection interval */
408     uint16_t             latency;                          /*!< Slave latency for the connection in number of connection events. Range: 0x0000 to 0x01F3 */
409     uint16_t             timeout;                          /*!< Supervision timeout for the LE Link. Range: 0x000A to 0x0C80.
410                                                                 Mandatory Range: 0x000A to 0x0C80 Time = N * 10 msec
411                                                                 Time Range: 100 msec to 32 seconds */
412 } esp_gatt_conn_params_t;
413 
414 #define ESP_GATT_IF_NONE    0xff                            /*!< If callback report gattc_if/gatts_if as this macro, means this event is not correspond to any app */
415 
416 typedef uint8_t    esp_gatt_if_t;                           /*!< Gatt interface type, different application on GATT client use different gatt_if */
417 
418 /**
419   * @brief the type of attribute element
420   */
421 typedef enum {
422     ESP_GATT_DB_PRIMARY_SERVICE,                            /*!< Gattc primary service attribute type in the cache */
423     ESP_GATT_DB_SECONDARY_SERVICE,                          /*!< Gattc secondary service attribute type in the cache */
424     ESP_GATT_DB_CHARACTERISTIC,                             /*!< Gattc characteristic attribute type in the cache */
425     ESP_GATT_DB_DESCRIPTOR,                                 /*!< Gattc characteristic descriptor attribute type in the cache */
426     ESP_GATT_DB_INCLUDED_SERVICE,                           /*!< Gattc include service attribute type in the cache */
427     ESP_GATT_DB_ALL,                                        /*!< Gattc all the attribute (primary service & secondary service & include service & char & descriptor) type in the cache */
428 } esp_gatt_db_attr_type_t;                                  /*!< Gattc attribute type element */
429 
430 /**
431   * @brief read multiple attribute
432   */
433 typedef struct {
434     uint8_t  num_attr;                                      /*!< The number of the attribute */
435     uint16_t handles[ESP_GATT_MAX_READ_MULTI_HANDLES];      /*!< The handles list */
436 } esp_gattc_multi_t;                                        /*!< The gattc multiple read element */
437 
438 /**
439   * @brief data base attribute element
440   */
441 typedef struct {
442     esp_gatt_db_attr_type_t     type;                       /*!< The attribute type */
443     uint16_t                    attribute_handle;           /*!< The attribute handle, it's valid for all of the type */
444     uint16_t                    start_handle;               /*!< The service start handle, it's valid only when the type = ESP_GATT_DB_PRIMARY_SERVICE or ESP_GATT_DB_SECONDARY_SERVICE */
445     uint16_t                    end_handle;                 /*!< The service end handle, it's valid only when the type = ESP_GATT_DB_PRIMARY_SERVICE or ESP_GATT_DB_SECONDARY_SERVICE */
446     esp_gatt_char_prop_t        properties;                 /*!< The characteristic properties, it's valid only when the type = ESP_GATT_DB_CHARACTERISTIC */
447     esp_bt_uuid_t               uuid;                       /*!< The attribute uuid, it's valid for all of the type */
448 } esp_gattc_db_elem_t;                                      /*!< The gattc service data base element in the cache */
449 
450 /**
451   * @brief service element
452   */
453 typedef struct {
454     bool                        is_primary;                 /*!< The service flag, true if the service is primary service, else is secondary service */
455     uint16_t                    start_handle;               /*!< The start handle of the service */
456     uint16_t                    end_handle;                 /*!< The end handle of the service */
457     esp_bt_uuid_t               uuid;                       /*!< The uuid of the service */
458 } esp_gattc_service_elem_t;                                 /*!< The gattc service element */
459 
460 /**
461   * @brief characteristic element
462   */
463 typedef struct {
464     uint16_t                    char_handle;                /*!< The characteristic handle */
465     esp_gatt_char_prop_t        properties;                 /*!< The characteristic properties */
466     esp_bt_uuid_t               uuid;                       /*!< The characteristic uuid */
467 } esp_gattc_char_elem_t;                                    /*!< The gattc characteristic element */
468 
469 /**
470   * @brief descriptor element
471   */
472 typedef struct {
473     uint16_t                   handle;                      /*!< The characteristic descriptor handle */
474     esp_bt_uuid_t              uuid;                        /*!< The characteristic descriptor uuid */
475 } esp_gattc_descr_elem_t;                                   /*!< The gattc descriptor type element */
476 
477 /**
478   * @brief include service element
479   */
480 typedef struct {
481     uint16_t                   handle;                      /*!< The include service current attribute handle */
482     uint16_t                   incl_srvc_s_handle;          /*!< The start handle of the service which has been included */
483     uint16_t                   incl_srvc_e_handle;          /*!< The end handle of the service which has been included */
484     esp_bt_uuid_t              uuid;                        /*!< The include service uuid */
485 } esp_gattc_incl_svc_elem_t;                                /*!< The gattc include service element */
486 
487 
488 #ifdef __cplusplus
489 }
490 #endif
491 
492 #endif /* __ESP_GATT_DEFS_H__ */
493