1 /*
2  * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef __BTC_GATTS_H__
8 #define __BTC_GATTS_H__
9 
10 #include "btc/btc_task.h"
11 #include "esp_bt_defs.h"
12 #include "esp_gatt_defs.h"
13 #include "esp_gatts_api.h"
14 #include "osi/future.h"
15 
16 typedef enum {
17     BTC_GATTS_ACT_APP_REGISTER = 0,
18     BTC_GATTS_ACT_APP_UNREGISTER,
19     BTC_GATTS_ACT_CREATE_SERVICE,
20     BTC_GATTS_ACT_CREATE_ATTR_TAB,
21     BTC_GATTS_ACT_DELETE_SERVICE,
22     BTC_GATTS_ACT_START_SERVICE,
23     BTC_GATTS_ACT_STOP_SERVICE,
24     BTC_GATTS_ACT_ADD_INCLUDE_SERVICE,
25     BTC_GATTS_ACT_ADD_CHAR,
26     BTC_GATTS_ACT_ADD_CHAR_DESCR,
27     BTC_GATTS_ACT_SEND_INDICATE,
28     BTC_GATTS_ACT_SEND_RESPONSE,
29     BTC_GATTS_ACT_SET_ATTR_VALUE,
30     BTC_GATTS_ACT_OPEN,
31     BTC_GATTS_ACT_CLOSE,
32     BTC_GATTS_ACT_SEND_SERVICE_CHANGE,
33     BTC_GATTS_ACT_SHOW_LOCAL_DATABASE,
34 } btc_gatts_act_t;
35 
36 /* btc_ble_gatts_args_t */
37 typedef union {
38     //BTC_GATTS_ACT_APP_REGISTER = 0,
39     struct app_reg_args {
40         uint16_t app_id;
41     } app_reg;
42 
43     //BTC_GATTS_ACT_APP_UNREGISTER,
44     struct app_unreg_args {
45         esp_gatt_if_t gatts_if;
46     } app_unreg;
47 
48     //BTC_GATTS_ACT_CREATE_SERVICE,
49     struct create_srvc_args {
50         esp_gatt_if_t gatts_if;
51         esp_gatt_srvc_id_t service_id;
52         uint16_t num_handle;
53     } create_srvc;
54 
55     //BTC_GATTS_ACT_CREATE_ATTR_TAB
56     struct create_attr_tab_args{
57         esp_gatt_if_t gatts_if;
58         uint8_t srvc_inst_id;
59         uint16_t max_nb_attr;
60         esp_gatts_attr_db_t *gatts_attr_db;
61     }create_attr_tab;
62 
63     //BTC_GATTS_ACT_DELETE_SERVICE,
64     struct delete_srvc_args {
65         uint16_t service_handle;
66     } delete_srvc;
67 
68     //BTC_GATTS_ACT_START_SERVICE,
69     struct start_srvc_args {
70         uint16_t service_handle;
71     } start_srvc;
72 
73     //BTC_GATTS_ACT_STOP_SERVICE,
74     struct stop_srvc_args {
75         uint16_t service_handle;
76     } stop_srvc;
77 
78     //BTC_GATTS_ACT_ADD_INCLUDE_SERVICE,
79     struct add_incl_srvc_args {
80         uint16_t service_handle;
81         uint16_t included_service_handle;
82     } add_incl_srvc;
83 
84     //BTC_GATTS_ACT_ADD_CHAR,
85     struct add_char_args {
86         uint16_t service_handle;
87         esp_bt_uuid_t char_uuid;
88         esp_gatt_perm_t perm;
89         esp_gatt_char_prop_t property;
90         esp_attr_control_t attr_control;
91         esp_attr_value_t char_val;
92     } add_char;
93 
94     //BTC_GATTS_ACT_ADD_CHAR_DESCR,
95     struct add_descr_args {
96         uint16_t  service_handle;
97         esp_bt_uuid_t descr_uuid;
98         esp_gatt_perm_t perm;
99         esp_attr_control_t attr_control;
100         esp_attr_value_t descr_val;
101     } add_descr;
102 
103     //BTC_GATTS_ACT_SEND_INDICATE,
104     struct send_indicate_args {
105         uint16_t conn_id;
106         uint16_t attr_handle;
107         bool need_confirm;
108         uint16_t value_len;
109         uint8_t *value;
110     } send_ind;
111 
112     //BTC_GATTS_ACT_SEND_RESPONSE,
113     struct send_rsp_args {
114         uint16_t conn_id;
115         uint32_t trans_id;
116         esp_gatt_status_t status;
117         esp_gatt_rsp_t *rsp;
118     } send_rsp;
119 
120     //BTC_GATTS_SET_ATTR_VALUE
121     struct set_attr_val_args {
122         uint16_t handle;
123         uint16_t length;
124         uint8_t *value;
125     } set_attr_val;
126 
127     //BTC_GATTS_ACT_OPEN,
128     struct open_args {
129         esp_gatt_if_t gatts_if;
130         esp_bd_addr_t remote_bda;
131         bool is_direct;
132     } open;
133 
134     //BTC_GATTS_ACT_CLOSE,
135     struct close_args {
136         uint16_t conn_id;
137     } close;
138 
139     //BTC_GATTS_ACT_SEND_SERVICE_CHANGE,
140     struct send_service_change_args {
141         esp_gatt_if_t gatts_if;
142         esp_bd_addr_t remote_bda;
143     } send_service_change;
144 
145 } btc_ble_gatts_args_t;
146 
147 typedef struct {
148     future_t *complete_future;
149     uint16_t svc_start_hdl;
150     esp_bt_uuid_t svc_uuid;
151     bool        is_tab_creat_svc;
152     bool      is_use_svc;
153     uint16_t   num_handle;
154     uint16_t   handle_idx;
155     uint16_t handles[ESP_GATT_ATTR_HANDLE_MAX];
156 } esp_btc_creat_tab_t;
157 
158 #if GATT_DYNAMIC_MEMORY == TRUE
159 extern esp_btc_creat_tab_t *btc_creat_tab_env_ptr;
160 #define btc_creat_tab_env (*btc_creat_tab_env_ptr)
161 #endif
162 
163 void btc_gatts_call_handler(btc_msg_t *msg);
164 void btc_gatts_cb_handler(btc_msg_t *msg);
165 void btc_gatts_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
166 void btc_gatts_arg_deep_free(btc_msg_t *msg);
167 esp_gatt_status_t btc_gatts_get_attr_value(uint16_t attr_handle, uint16_t *length, uint8_t **value);
168 esp_gatt_status_t btc_gatts_show_local_database(void);
169 
170 
171 #endif /* __BTC_GATTS_H__ */
172