1 /******************************************************************************
2  *
3  *  Copyright 2003-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  This file contains the GATT client main functions and state machine.
22  *
23  ******************************************************************************/
24 #define LOG_TAG "bta_gattc_main"
25 
26 #include <base/strings/stringprintf.h>
27 #include <bluetooth/log.h>
28 
29 #include "bta/gatt/bta_gattc_int.h"
30 #include "internal_include/bt_target.h"
31 #include "os/log.h"
32 #include "stack/include/bt_hdr.h"
33 
34 using base::StringPrintf;
35 using namespace bluetooth;
36 
37 /*****************************************************************************
38  * Constants and types
39  ****************************************************************************/
40 
41 /* state machine action enumeration list */
42 enum {
43   BTA_GATTC_OPEN,
44   BTA_GATTC_OPEN_FAIL,
45   BTA_GATTC_OPEN_ERROR,
46   BTA_GATTC_CANCEL_OPEN,
47   BTA_GATTC_CANCEL_OPEN_OK,
48   BTA_GATTC_CANCEL_OPEN_ERROR,
49   BTA_GATTC_CONN,
50   BTA_GATTC_START_DISCOVER,
51   BTA_GATTC_DISC_CMPL,
52   BTA_GATTC_Q_CMD,
53   BTA_GATTC_CLOSE,
54   BTA_GATTC_CLOSE_FAIL,
55   BTA_GATTC_READ,
56   BTA_GATTC_WRITE,
57   BTA_GATTC_OP_CMPL,
58   BTA_GATTC_SEARCH,
59   BTA_GATTC_FAIL,
60   BTA_GATTC_CONFIRM,
61   BTA_GATTC_EXEC,
62   BTA_GATTC_READ_MULTI,
63   BTA_GATTC_OP_CMPL_DURING_DISCOVERY,
64   BTA_GATTC_DISC_CLOSE,
65   BTA_GATTC_RESTART_DISCOVER,
66   BTA_GATTC_CFG_MTU,
67 
68   BTA_GATTC_IGNORE
69 };
70 /* type for action functions */
71 typedef void (*tBTA_GATTC_ACTION)(tBTA_GATTC_CLCB* p_clcb,
72                                   const tBTA_GATTC_DATA* p_data);
73 
74 /* action function list */
75 const tBTA_GATTC_ACTION bta_gattc_action[] = {
76     bta_gattc_open,                     /* BTA_GATTC_OPEN */
77     bta_gattc_open_fail,                /* BTA_GATTC_OPEN_FAIL */
78     bta_gattc_open_error,               /* BTA_GATTC_OPEN_ERROR */
79     bta_gattc_cancel_open,              /* BTA_GATTC_CANCEL_OPEN */
80     bta_gattc_cancel_open_ok,           /* BTA_GATTC_CANCEL_OPEN_OK */
81     bta_gattc_cancel_open_error,        /* BTA_GATTC_CANCEL_OPEN_ERROR */
82     bta_gattc_conn,                     /* BTA_GATTC_CONN */
83     bta_gattc_start_discover,           /* BTA_GATTC_START_DISCOVER */
84     bta_gattc_disc_cmpl,                /* BTA_GATTC_DISC_CMPL */
85     bta_gattc_q_cmd,                    /* BTA_GATTC_Q_CMD */
86     bta_gattc_close,                    /* BTA_GATTC_CLOSE */
87     bta_gattc_close_fail,               /* BTA_GATTC_CLOSE_FAIL */
88     bta_gattc_read,                     /* BTA_GATTC_READ */
89     bta_gattc_write,                    /* BTA_GATTC_WRITE */
90     bta_gattc_op_cmpl,                  /* BTA_GATTC_OP_CMPL */
91     bta_gattc_search,                   /* BTA_GATTC_SEARCH */
92     bta_gattc_fail,                     /* BTA_GATTC_FAIL */
93     bta_gattc_confirm,                  /* BTA_GATTC_CONFIRM */
94     bta_gattc_execute,                  /* BTA_GATTC_EXEC */
95     bta_gattc_read_multi,               /* BTA_GATTC_READ_MULTI */
96     bta_gattc_op_cmpl_during_discovery, /* BTA_GATTC_OP_CMPL_DURING_DISCOVERY */
97     bta_gattc_disc_close,               /* BTA_GATTC_DISC_CLOSE */
98     bta_gattc_restart_discover,         /* BTA_GATTC_RESTART_DISCOVER */
99     bta_gattc_cfg_mtu                   /* BTA_GATTC_CFG_MTU */
100 };
101 
102 /* state table information */
103 #define BTA_GATTC_ACTIONS 1    /* number of actions */
104 #define BTA_GATTC_NEXT_STATE 1 /* position of next state */
105 #define BTA_GATTC_NUM_COLS 2   /* number of columns in state tables */
106 
107 /* state table for idle state */
108 static const uint8_t bta_gattc_st_idle[][BTA_GATTC_NUM_COLS] = {
109     /* Event                            Action 1                  Next state */
110     /* BTA_GATTC_API_OPEN_EVT           */ {BTA_GATTC_OPEN,
111                                             BTA_GATTC_W4_CONN_ST},
112     /* BTA_GATTC_INT_OPEN_FAIL_EVT      */ {BTA_GATTC_IGNORE,
113                                             BTA_GATTC_IDLE_ST},
114     /* BTA_GATTC_API_CANCEL_OPEN_EVT    */ {BTA_GATTC_IGNORE,
115                                             BTA_GATTC_IDLE_ST},
116     /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_IGNORE,
117                                             BTA_GATTC_IDLE_ST},
118 
119     /* BTA_GATTC_API_READ_EVT           */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST},
120     /* BTA_GATTC_API_WRITE_EVT          */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST},
121     /* BTA_GATTC_API_EXEC_EVT           */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST},
122     /* BTA_GATTC_API_CFG_MTU_EVT        */ {BTA_GATTC_IGNORE,
123                                             BTA_GATTC_IDLE_ST},
124 
125     /* BTA_GATTC_API_CLOSE_EVT          */ {BTA_GATTC_CLOSE_FAIL,
126                                             BTA_GATTC_IDLE_ST},
127 
128     /* BTA_GATTC_API_SEARCH_EVT         */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST},
129     /* BTA_GATTC_API_CONFIRM_EVT        */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST},
130     /* BTA_GATTC_API_READ_MULTI_EVT     */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST},
131 
132     /* BTA_GATTC_INT_CONN_EVT           */ {BTA_GATTC_CONN, BTA_GATTC_CONN_ST},
133     /* BTA_GATTC_INT_DISCOVER_EVT       */ {BTA_GATTC_IGNORE,
134                                             BTA_GATTC_IDLE_ST},
135     /* BTA_GATTC_DISCOVER_CMPL_EVT      */ {BTA_GATTC_IGNORE,
136                                             BTA_GATTC_IDLE_ST},
137     /* BTA_GATTC_OP_CMPL_EVT            */ {BTA_GATTC_IGNORE,
138                                             BTA_GATTC_IDLE_ST},
139     /* BTA_GATTC_INT_DISCONN_EVT       */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST},
140 
141 };
142 
143 /* state table for wait for open state */
144 static const uint8_t bta_gattc_st_w4_conn[][BTA_GATTC_NUM_COLS] = {
145     /* Event                            Action 1 Next state */
146     /* BTA_GATTC_API_OPEN_EVT           */ {BTA_GATTC_OPEN,
147                                             BTA_GATTC_W4_CONN_ST},
148     /* BTA_GATTC_INT_OPEN_FAIL_EVT      */ {BTA_GATTC_OPEN_FAIL,
149                                             BTA_GATTC_IDLE_ST},
150     /* BTA_GATTC_API_CANCEL_OPEN_EVT    */ {BTA_GATTC_CANCEL_OPEN,
151                                             BTA_GATTC_W4_CONN_ST},
152     /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_CANCEL_OPEN_OK,
153                                             BTA_GATTC_IDLE_ST},
154 
155     /* BTA_GATTC_API_READ_EVT           */ {BTA_GATTC_FAIL,
156                                             BTA_GATTC_W4_CONN_ST},
157     /* BTA_GATTC_API_WRITE_EVT          */ {BTA_GATTC_FAIL,
158                                             BTA_GATTC_W4_CONN_ST},
159     /* BTA_GATTC_API_EXEC_EVT           */ {BTA_GATTC_FAIL,
160                                             BTA_GATTC_W4_CONN_ST},
161     /* BTA_GATTC_API_CFG_MTU_EVT        */ {BTA_GATTC_IGNORE,
162                                             BTA_GATTC_W4_CONN_ST},
163 
164     /* BTA_GATTC_API_CLOSE_EVT          */ {BTA_GATTC_CANCEL_OPEN,
165                                             BTA_GATTC_W4_CONN_ST},
166 
167     /* BTA_GATTC_API_SEARCH_EVT         */ {BTA_GATTC_FAIL,
168                                             BTA_GATTC_W4_CONN_ST},
169     /* BTA_GATTC_API_CONFIRM_EVT        */ {BTA_GATTC_FAIL,
170                                             BTA_GATTC_W4_CONN_ST},
171     /* BTA_GATTC_API_READ_MULTI_EVT     */ {BTA_GATTC_FAIL,
172                                             BTA_GATTC_W4_CONN_ST},
173 
174     /* BTA_GATTC_INT_CONN_EVT           */ {BTA_GATTC_CONN, BTA_GATTC_CONN_ST},
175     /* BTA_GATTC_INT_DISCOVER_EVT       */ {BTA_GATTC_IGNORE,
176                                             BTA_GATTC_W4_CONN_ST},
177     /* BTA_GATTC_DISCOVER_CMPL_EVT       */ {BTA_GATTC_IGNORE,
178                                              BTA_GATTC_W4_CONN_ST},
179     /* BTA_GATTC_OP_CMPL_EVT            */ {BTA_GATTC_IGNORE,
180                                             BTA_GATTC_W4_CONN_ST},
181     /* BTA_GATTC_INT_DISCONN_EVT      */ {BTA_GATTC_OPEN_FAIL,
182                                           BTA_GATTC_IDLE_ST},
183 
184 };
185 
186 /* state table for open state */
187 static const uint8_t bta_gattc_st_connected[][BTA_GATTC_NUM_COLS] = {
188     /* Event                            Action 1 Next state */
189     /* BTA_GATTC_API_OPEN_EVT           */ {BTA_GATTC_OPEN, BTA_GATTC_CONN_ST},
190     /* BTA_GATTC_INT_OPEN_FAIL_EVT      */ {BTA_GATTC_IGNORE,
191                                             BTA_GATTC_CONN_ST},
192     /* BTA_GATTC_API_CANCEL_OPEN_EVT    */ {BTA_GATTC_CANCEL_OPEN_ERROR,
193                                             BTA_GATTC_CONN_ST},
194     /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_IGNORE,
195                                             BTA_GATTC_CONN_ST},
196 
197     /* BTA_GATTC_API_READ_EVT           */ {BTA_GATTC_READ, BTA_GATTC_CONN_ST},
198     /* BTA_GATTC_API_WRITE_EVT          */ {BTA_GATTC_WRITE, BTA_GATTC_CONN_ST},
199     /* BTA_GATTC_API_EXEC_EVT           */ {BTA_GATTC_EXEC, BTA_GATTC_CONN_ST},
200     /* BTA_GATTC_API_CFG_MTU_EVT        */ {BTA_GATTC_CFG_MTU,
201                                             BTA_GATTC_CONN_ST},
202 
203     /* BTA_GATTC_API_CLOSE_EVT          */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST},
204 
205     /* BTA_GATTC_API_SEARCH_EVT         */ {BTA_GATTC_SEARCH,
206                                             BTA_GATTC_CONN_ST},
207     /* BTA_GATTC_API_CONFIRM_EVT        */ {BTA_GATTC_CONFIRM,
208                                             BTA_GATTC_CONN_ST},
209     /* BTA_GATTC_API_READ_MULTI_EVT     */ {BTA_GATTC_READ_MULTI,
210                                             BTA_GATTC_CONN_ST},
211 
212     /* BTA_GATTC_INT_CONN_EVT           */ {BTA_GATTC_IGNORE,
213                                             BTA_GATTC_CONN_ST},
214     /* BTA_GATTC_INT_DISCOVER_EVT       */ {BTA_GATTC_START_DISCOVER,
215                                             BTA_GATTC_DISCOVER_ST},
216     /* BTA_GATTC_DISCOVER_CMPL_EVT       */ {BTA_GATTC_IGNORE,
217                                              BTA_GATTC_CONN_ST},
218     /* BTA_GATTC_OP_CMPL_EVT            */ {BTA_GATTC_OP_CMPL,
219                                             BTA_GATTC_CONN_ST},
220 
221     /* BTA_GATTC_INT_DISCONN_EVT        */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST},
222 
223 };
224 
225 /* state table for discover state */
226 static const uint8_t bta_gattc_st_discover[][BTA_GATTC_NUM_COLS] = {
227     /* Event                            Action 1 Next state */
228     /* BTA_GATTC_API_OPEN_EVT           */ {BTA_GATTC_OPEN,
229                                             BTA_GATTC_DISCOVER_ST},
230     /* BTA_GATTC_INT_OPEN_FAIL_EVT      */ {BTA_GATTC_IGNORE,
231                                             BTA_GATTC_DISCOVER_ST},
232     /* BTA_GATTC_API_CANCEL_OPEN_EVT    */ {BTA_GATTC_CANCEL_OPEN_ERROR,
233                                             BTA_GATTC_DISCOVER_ST},
234     /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_FAIL,
235                                             BTA_GATTC_DISCOVER_ST},
236 
237     /* BTA_GATTC_API_READ_EVT           */ {BTA_GATTC_Q_CMD,
238                                             BTA_GATTC_DISCOVER_ST},
239     /* BTA_GATTC_API_WRITE_EVT          */ {BTA_GATTC_Q_CMD,
240                                             BTA_GATTC_DISCOVER_ST},
241     /* BTA_GATTC_API_EXEC_EVT           */ {BTA_GATTC_Q_CMD,
242                                             BTA_GATTC_DISCOVER_ST},
243     /* BTA_GATTC_API_CFG_MTU_EVT        */ {BTA_GATTC_Q_CMD,
244                                             BTA_GATTC_DISCOVER_ST},
245 
246     /* BTA_GATTC_API_CLOSE_EVT          */ {BTA_GATTC_DISC_CLOSE,
247                                             BTA_GATTC_DISCOVER_ST},
248 
249     /* BTA_GATTC_API_SEARCH_EVT         */ {BTA_GATTC_Q_CMD,
250                                             BTA_GATTC_DISCOVER_ST},
251     /* BTA_GATTC_API_CONFIRM_EVT        */ {BTA_GATTC_CONFIRM,
252                                             BTA_GATTC_DISCOVER_ST},
253     /* BTA_GATTC_API_READ_MULTI_EVT     */ {BTA_GATTC_Q_CMD,
254                                             BTA_GATTC_DISCOVER_ST},
255 
256     /* BTA_GATTC_INT_CONN_EVT           */ {BTA_GATTC_CONN,
257                                             BTA_GATTC_DISCOVER_ST},
258     /* BTA_GATTC_INT_DISCOVER_EVT       */ {BTA_GATTC_RESTART_DISCOVER,
259                                             BTA_GATTC_DISCOVER_ST},
260     /* BTA_GATTC_DISCOVER_CMPL_EVT      */ {BTA_GATTC_DISC_CMPL,
261                                             BTA_GATTC_CONN_ST},
262     /* BTA_GATTC_OP_CMPL_EVT            */ {BTA_GATTC_OP_CMPL_DURING_DISCOVERY,
263                                             BTA_GATTC_DISCOVER_ST},
264     /* BTA_GATTC_INT_DISCONN_EVT        */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST},
265 
266 };
267 
268 /* type for state table */
269 typedef const uint8_t (*tBTA_GATTC_ST_TBL)[BTA_GATTC_NUM_COLS];
270 
271 /* state table */
272 const tBTA_GATTC_ST_TBL bta_gattc_st_tbl[] = {
273     bta_gattc_st_idle,      /* BTA_GATTC_IDLE_ST */
274     bta_gattc_st_w4_conn,   /* BTA_GATTC_W4_CONN_ST */
275     bta_gattc_st_connected, /* BTA_GATTC_CONN_ST */
276     bta_gattc_st_discover   /* BTA_GATTC_DISCOVER_ST */
277 };
278 
279 /*****************************************************************************
280  * Global data
281  ****************************************************************************/
282 
283 /* GATTC control block */
284 tBTA_GATTC_CB bta_gattc_cb;
285 
286 #if (BTA_GATT_DEBUG == TRUE)
287 static const char* gattc_evt_code(tBTA_GATTC_INT_EVT evt_code);
288 static const char* gattc_state_code(tBTA_GATTC_STATE state_code);
289 #endif
290 
291 /*******************************************************************************
292  *
293  * Function         bta_gattc_sm_execute
294  *
295  * Description      State machine event handling function for GATTC
296  *
297  *
298  * Returns          bool  : true if queued client request buffer can be
299  *                          immediately released, else false
300  *
301  ******************************************************************************/
bta_gattc_sm_execute(tBTA_GATTC_CLCB * p_clcb,uint16_t event,const tBTA_GATTC_DATA * p_data)302 bool bta_gattc_sm_execute(tBTA_GATTC_CLCB* p_clcb, uint16_t event,
303                           const tBTA_GATTC_DATA* p_data) {
304   tBTA_GATTC_ST_TBL state_table;
305   uint8_t action;
306   int i;
307   bool rt = true;
308   tBTA_GATTC_STATE in_state = p_clcb->state;
309   uint16_t in_event = event;
310 #if (BTA_GATT_DEBUG == TRUE)
311   log::verbose("State 0x{:02x} [{}], Event 0x{:x}[{}]", in_state,
312                gattc_state_code(in_state), in_event, gattc_evt_code(in_event));
313 #else
314   log::verbose("State 0x{:02x}, Event 0x{:x}", in_state, in_event);
315 #endif
316 
317   /* look up the state table for the current state */
318   state_table = bta_gattc_st_tbl[p_clcb->state];
319 
320   event &= 0x00FF;
321 
322   /* set next state */
323   p_clcb->state = (tBTA_GATTC_STATE)(state_table[event][BTA_GATTC_NEXT_STATE]);
324 
325   /* execute action functions */
326   for (i = 0; i < BTA_GATTC_ACTIONS; i++) {
327     action = state_table[event][i];
328     if (action != BTA_GATTC_IGNORE) {
329       (*bta_gattc_action[action])(p_clcb, p_data);
330       if (bta_gattc_is_data_queued(p_clcb, p_data)) {
331         /* buffer is queued, don't free in the bta dispatcher.
332          * we free it ourselves when a completion event is received.
333          */
334         rt = false;
335       }
336     } else {
337       break;
338     }
339   }
340 
341 #if (BTA_GATT_DEBUG == TRUE)
342   if (in_state != p_clcb->state) {
343     log::verbose("GATTC State Change: [{}] -> [{}] after Event [{}]",
344                  gattc_state_code(in_state), gattc_state_code(p_clcb->state),
345                  gattc_evt_code(in_event));
346   }
347 #else
348   log::verbose("GATTC State Change: 0x{:02x} -> 0x{:02x} after Event 0x{:x}",
349                in_state, p_clcb->state, in_event);
350 #endif
351   return rt;
352 }
353 
354 /*******************************************************************************
355  *
356  * Function         bta_gattc_hdl_event
357  *
358  * Description      GATT client main event handling function.
359  *
360  *
361  * Returns          bool
362  *
363  ******************************************************************************/
bta_gattc_hdl_event(const BT_HDR_RIGID * p_msg)364 bool bta_gattc_hdl_event(const BT_HDR_RIGID* p_msg) {
365   tBTA_GATTC_CLCB* p_clcb = NULL;
366   bool rt = true;
367 #if (BTA_GATT_DEBUG == TRUE)
368   log::verbose("Event:{}", gattc_evt_code(p_msg->event));
369 #endif
370   switch (p_msg->event) {
371 
372     case BTA_GATTC_API_OPEN_EVT:
373       bta_gattc_process_api_open((tBTA_GATTC_DATA*)p_msg);
374       break;
375 
376     case BTA_GATTC_API_CANCEL_OPEN_EVT:
377       bta_gattc_process_api_open_cancel((tBTA_GATTC_DATA*)p_msg);
378       break;
379 
380     default:
381       if (p_msg->event == BTA_GATTC_INT_CONN_EVT)
382         p_clcb = bta_gattc_find_int_conn_clcb((tBTA_GATTC_DATA*)p_msg);
383       else if (p_msg->event == BTA_GATTC_INT_DISCONN_EVT)
384         p_clcb = bta_gattc_find_int_disconn_clcb((tBTA_GATTC_DATA*)p_msg);
385       else
386         p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->layer_specific);
387 
388       if (p_clcb != nullptr) {
389         rt = bta_gattc_sm_execute(p_clcb, p_msg->event,
390                                   (const tBTA_GATTC_DATA*)p_msg);
391       } else {
392         log::error("Ignore unknown conn ID: {}", p_msg->layer_specific);
393       }
394 
395       break;
396   }
397 
398   return rt;
399 }
400 
401 /*****************************************************************************
402  *  Debug Functions
403  ****************************************************************************/
404 #if (BTA_GATT_DEBUG == TRUE)
405 
406 /*******************************************************************************
407  *
408  * Function         gattc_evt_code
409  *
410  * Description
411  *
412  * Returns          void
413  *
414  ******************************************************************************/
gattc_evt_code(tBTA_GATTC_INT_EVT evt_code)415 static const char* gattc_evt_code(tBTA_GATTC_INT_EVT evt_code) {
416   switch (evt_code) {
417     case BTA_GATTC_API_OPEN_EVT:
418       return "BTA_GATTC_API_OPEN_EVT";
419     case BTA_GATTC_INT_OPEN_FAIL_EVT:
420       return "BTA_GATTC_INT_OPEN_FAIL_EVT";
421     case BTA_GATTC_API_CANCEL_OPEN_EVT:
422       return "BTA_GATTC_API_CANCEL_OPEN_EVT";
423     case BTA_GATTC_INT_CANCEL_OPEN_OK_EVT:
424       return "BTA_GATTC_INT_CANCEL_OPEN_OK_EVT";
425     case BTA_GATTC_API_READ_EVT:
426       return "BTA_GATTC_API_READ_EVT";
427     case BTA_GATTC_API_WRITE_EVT:
428       return "BTA_GATTC_API_WRITE_EVT";
429     case BTA_GATTC_API_EXEC_EVT:
430       return "BTA_GATTC_API_EXEC_EVT";
431     case BTA_GATTC_API_CLOSE_EVT:
432       return "BTA_GATTC_API_CLOSE_EVT";
433     case BTA_GATTC_API_SEARCH_EVT:
434       return "BTA_GATTC_API_SEARCH_EVT";
435     case BTA_GATTC_API_CONFIRM_EVT:
436       return "BTA_GATTC_API_CONFIRM_EVT";
437     case BTA_GATTC_API_READ_MULTI_EVT:
438       return "BTA_GATTC_API_READ_MULTI_EVT";
439     case BTA_GATTC_INT_CONN_EVT:
440       return "BTA_GATTC_INT_CONN_EVT";
441     case BTA_GATTC_INT_DISCOVER_EVT:
442       return "BTA_GATTC_INT_DISCOVER_EVT";
443     case BTA_GATTC_DISCOVER_CMPL_EVT:
444       return "BTA_GATTC_DISCOVER_CMPL_EVT";
445     case BTA_GATTC_OP_CMPL_EVT:
446       return "BTA_GATTC_OP_CMPL_EVT";
447     case BTA_GATTC_INT_DISCONN_EVT:
448       return "BTA_GATTC_INT_DISCONN_EVT";
449     case BTA_GATTC_API_CFG_MTU_EVT:
450       return "BTA_GATTC_API_CFG_MTU_EVT";
451     default:
452       return "unknown GATTC event code";
453   }
454 }
455 
456 /*******************************************************************************
457  *
458  * Function         gattc_state_code
459  *
460  * Description
461  *
462  * Returns          void
463  *
464  ******************************************************************************/
gattc_state_code(tBTA_GATTC_STATE state_code)465 static const char* gattc_state_code(tBTA_GATTC_STATE state_code) {
466   switch (state_code) {
467     case BTA_GATTC_IDLE_ST:
468       return "GATTC_IDLE_ST";
469     case BTA_GATTC_W4_CONN_ST:
470       return "GATTC_W4_CONN_ST";
471     case BTA_GATTC_CONN_ST:
472       return "GATTC_CONN_ST";
473     case BTA_GATTC_DISCOVER_ST:
474       return "GATTC_DISCOVER_ST";
475     default:
476       return "unknown GATTC state code";
477   }
478 }
479 
480 #endif /* Debug Functions */
481