Skip to content

Commit 91d4b48

Browse files
BLE: add traces to gatt client (#14165)
* add traces to gatt client * add files to cmakelists Co-Authored-By: Vincent Coubard <[email protected]> * fixed tracing variable name Co-Authored-By: Vincent Coubard <[email protected]> * add pal tracing * add more traces for successfull actions * put write and read as tr_debug in pal Co-authored-by: Vincent Coubard <[email protected]>
1 parent 7b08388 commit 91d4b48

File tree

5 files changed

+322
-7
lines changed

5 files changed

+322
-7
lines changed

connectivity/FEATURE_BLE/source/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ add_subdirectory(gatt)
77
add_subdirectory(generic)
88
add_subdirectory(pal)
99

10+
target_include_directories(mbed-ble
11+
INTERFACE
12+
.
13+
)
14+
1015
target_sources(mbed-ble
1116
INTERFACE
1217
BLE.cpp
1318
Gap.cpp
1419
GattClient.cpp
1520
GattServer.cpp
1621
SecurityManager.cpp
22+
common/ble_trace_helpers.cpp
1723
)
1824

1925
target_link_libraries(mbed-ble

connectivity/FEATURE_BLE/source/common/ble_trace_helpers.cpp

Lines changed: 184 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,192 @@
1616
*/
1717

1818
#include "ble_trace_helpers.h"
19+
#include "pal/AttServerMessage.h"
20+
#include "ble-host/include/att_api.h"
1921
#define TRACE_GROUP "BLE "
2022

2123
namespace ble {
2224
#if MBED_CONF_MBED_TRACE_ENABLE
25+
26+
const char* ble_error_to_string(ble_error_t error_code)
27+
{
28+
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
29+
const char* ret = "INVALID ENUM VALUE";
30+
switch(error_code)
31+
{
32+
case BLE_ERROR_NONE: ret = "BLE_ERROR_NONE"; break;
33+
case BLE_ERROR_BUFFER_OVERFLOW: ret = "BLE_ERROR_BUFFER_OVERFLOW"; break;
34+
case BLE_ERROR_NOT_IMPLEMENTED: ret = "BLE_ERROR_NOT_IMPLEMENTED"; break;
35+
case BLE_ERROR_PARAM_OUT_OF_RANGE: ret = "BLE_ERROR_PARAM_OUT_OF_RANGE"; break;
36+
case BLE_ERROR_INVALID_PARAM: ret = "BLE_ERROR_INVALID_PARAM"; break;
37+
case BLE_STACK_BUSY: ret = "BLE_STACK_BUSY"; break;
38+
case BLE_ERROR_INVALID_STATE: ret = "BLE_ERROR_INVALID_STATE"; break;
39+
case BLE_ERROR_NO_MEM: ret = "BLE_ERROR_NO_MEM"; break;
40+
case BLE_ERROR_OPERATION_NOT_PERMITTED: ret = "BLE_ERROR_OPERATION_NOT_PERMITTED"; break;
41+
case BLE_ERROR_INITIALIZATION_INCOMPLETE: ret = "BLE_ERROR_INITIALIZATION_INCOMPLETE"; break;
42+
case BLE_ERROR_ALREADY_INITIALIZED: ret = "BLE_ERROR_ALREADY_INITIALIZED"; break;
43+
case BLE_ERROR_UNSPECIFIED: ret = "BLE_ERROR_UNSPECIFIED"; break;
44+
case BLE_ERROR_INTERNAL_STACK_FAILURE: ret = "BLE_ERROR_INTERNAL_STACK_FAILURE"; break;
45+
case BLE_ERROR_NOT_FOUND: ret = "BLE_ERROR_NOT_FOUND"; break;
46+
}
47+
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
48+
static char ret[3] = "00";
49+
sprintf(ret, "0x%02x", (int)error_code);
50+
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
51+
return ret;
52+
}
53+
54+
const char* attribute_error_code_to_string(uint8_t error_code)
55+
{
56+
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
57+
const char* ret = "INVALID ENUM VALUE";
58+
switch(error_code)
59+
{
60+
case AttErrorResponse::INVALID_HANDLE: ret = "INVALID_HANDLE"; break;
61+
case AttErrorResponse::READ_NOT_PERMITTED: ret = "READ_NOT_PERMITTED"; break;
62+
case AttErrorResponse::WRITE_NOT_PERMITTED: ret = "WRITE_NOT_PERMITTED"; break;
63+
case AttErrorResponse::INVALID_PDU: ret = "INVALID_PDU"; break;
64+
case AttErrorResponse::INSUFFICIENT_AUTHENTICATION: ret = "INSUFFICIENT_AUTHENTICATION"; break;
65+
case AttErrorResponse::REQUEST_NOT_SUPPORTED: ret = "REQUEST_NOT_SUPPORTED"; break;
66+
case AttErrorResponse::INVALID_OFFSET: ret = "INVALID_OFFSET"; break;
67+
case AttErrorResponse::INSUFFICIENT_AUTHORIZATION: ret = "INSUFFICIENT_AUTHORIZATION"; break;
68+
case AttErrorResponse::PREPARE_QUEUE_FULL: ret = "PREPARE_QUEUE_FULL"; break;
69+
case AttErrorResponse::ATTRIBUTE_NOT_FOUND: ret = "ATTRIBUTE_NOT_FOUND"; break;
70+
case AttErrorResponse::ATTRIBUTE_NOT_LONG: ret = "ATTRIBUTE_NOT_LONG"; break;
71+
case AttErrorResponse::INSUFFICIENT_ENCRYPTION_KEY_SIZE: ret = "INSUFFICIENT_ENCRYPTION_KEY_SIZE"; break;
72+
case AttErrorResponse::INVALID_ATTRIBUTE_VALUE_LENGTH: ret = "INVALID_ATTRIBUTE_VALUE_LENGTH"; break;
73+
case AttErrorResponse::UNLIKELY_ERROR: ret = "UNLIKELY_ERROR"; break;
74+
case AttErrorResponse::INSUFFICIENT_ENCRYPTION: ret = "INSUFFICIENT_ENCRYPTION"; break;
75+
case AttErrorResponse::UNSUPPORTED_GROUP_TYPE: ret = "UNSUPPORTED_GROUP_TYPE"; break;
76+
case AttErrorResponse::INSUFFICIENT_RESOURCES: ret = "INSUFFICIENT_RESOURCES"; break;
77+
case AttErrorResponse::WRITE_REQUEST_REJECTED: ret = "WRITE_REQUEST_REJECTED"; break;
78+
case AttErrorResponse::CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED:
79+
ret = "CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED"; break;
80+
case AttErrorResponse::PROCEDURE_ALREADY_IN_PROGRESS: ret = "PROCEDURE_ALREADY_IN_PROGRESS"; break;
81+
case AttErrorResponse::OUT_OF_RANGE: ret = "OUT_OF_RANGE"; break;
82+
}
83+
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
84+
static char ret[3] = "00";
85+
sprintf(ret, "0x%02x", (int)error_code);
86+
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
87+
return ret;
88+
}
89+
90+
const char* att_client_callback_event_to_string(uint8_t code)
91+
{
92+
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
93+
const char* ret = "INVALID EVENT";
94+
switch(code)
95+
{
96+
case ATTC_FIND_INFO_RSP: ret = "ATTC_FIND_INFO_RSP"; break;
97+
case ATTC_FIND_BY_TYPE_VALUE_RSP: ret = "ATTC_FIND_BY_TYPE_VALUE_RSP"; break;
98+
case ATTC_READ_BY_TYPE_RSP: ret = "ATTC_READ_BY_TYPE_RSP"; break;
99+
case ATTC_READ_RSP: ret = "ATTC_READ_RSP"; break;
100+
case ATTC_READ_LONG_RSP: ret = "ATTC_READ_LONG_RSP"; break;
101+
case ATTC_READ_MULTIPLE_RSP: ret = "ATTC_READ_MULTIPLE_RSP"; break;
102+
case ATTC_READ_BY_GROUP_TYPE_RSP: ret = "ATTC_READ_BY_GROUP_TYPE_RSP"; break;
103+
case ATTC_WRITE_RSP: ret = "ATTC_WRITE_RSP"; break;
104+
case ATTC_WRITE_CMD_RSP: ret = "ATTC_WRITE_CMD_RSP"; break;
105+
case ATTC_PREPARE_WRITE_RSP: ret = "ATTC_PREPARE_WRITE_RSP"; break;
106+
case ATTC_EXECUTE_WRITE_RSP: ret = "ATTC_EXECUTE_WRITE_RSP"; break;
107+
case ATTC_HANDLE_VALUE_NTF: ret = "ATTC_HANDLE_VALUE_NTF"; break;
108+
case ATTC_HANDLE_VALUE_IND: ret = "ATTC_HANDLE_VALUE_IND"; break;
109+
case ATTC_READ_MULT_VAR_RSP: ret = "ATTC_READ_MULT_VAR_RSP"; break;
110+
case ATTC_MULT_VALUE_NTF: ret = "ATTC_MULT_VALUE_NTF"; break;
111+
case ATTS_HANDLE_VALUE_CNF: ret = "ATTS_HANDLE_VALUE_CNF"; break;
112+
case ATTS_MULT_VALUE_CNF: ret = "ATTS_MULT_VALUE_CNF"; break;
113+
case ATTS_CCC_STATE_IND: ret = "ATTS_CCC_STATE_IND"; break;
114+
case ATTS_DB_HASH_CALC_CMPL_IND: ret = "ATTS_DB_HASH_CALC_CMPL_IND"; break;
115+
case ATT_MTU_UPDATE_IND: ret = "ATT_MTU_UPDATE_IND"; break;
116+
case ATT_EATT_CONN_CMPL_IND: ret = "ATT_EATT_CONN_CMPL_IND"; break;
117+
case ATT_EATT_RECONFIG_CMPL_IND: ret = "ATT_EATT_RECONFIG_CMPL_IND"; break;
118+
}
119+
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
120+
static char ret[3] = "00";
121+
sprintf(ret, "0x%02x", (int)code);
122+
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
123+
return ret;
124+
}
125+
126+
const char* att_error_code_to_string(uint8_t error_code)
127+
{
128+
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
129+
const char* ret = "INVALID EVENT";
130+
switch(error_code)
131+
{
132+
case ATT_SUCCESS: ret = "ATT_SUCCESS"; break;
133+
case ATT_ERR_HANDLE: ret = "ATT_ERR_HANDLE"; break;
134+
case ATT_ERR_READ: ret = "ATT_ERR_READ"; break;
135+
case ATT_ERR_WRITE: ret = "ATT_ERR_WRITE"; break;
136+
case ATT_ERR_INVALID_PDU: ret = "ATT_ERR_INVALID_PDU"; break;
137+
case ATT_ERR_AUTH: ret = "ATT_ERR_AUTH"; break;
138+
case ATT_ERR_NOT_SUP: ret = "ATT_ERR_NOT_SUP"; break;
139+
case ATT_ERR_OFFSET: ret = "ATT_ERR_OFFSET"; break;
140+
case ATT_ERR_AUTHOR: ret = "ATT_ERR_AUTHOR"; break;
141+
case ATT_ERR_QUEUE_FULL: ret = "ATT_ERR_QUEUE_FULL"; break;
142+
case ATT_ERR_NOT_FOUND: ret = "ATT_ERR_NOT_FOUND"; break;
143+
case ATT_ERR_NOT_LONG: ret = "ATT_ERR_NOT_LONG"; break;
144+
case ATT_ERR_KEY_SIZE: ret = "ATT_ERR_KEY_SIZE"; break;
145+
case ATT_ERR_LENGTH: ret = "ATT_ERR_LENGTH"; break;
146+
case ATT_ERR_UNLIKELY: ret = "ATT_ERR_UNLIKELY"; break;
147+
case ATT_ERR_ENC: ret = "ATT_ERR_ENC"; break;
148+
case ATT_ERR_GROUP_TYPE: ret = "ATT_ERR_GROUP_TYPE"; break;
149+
case ATT_ERR_RESOURCES: ret = "ATT_ERR_RESOURCES"; break;
150+
case ATT_ERR_DATABASE_OUT_OF_SYNC: ret = "ATT_ERR_DATABASE_OUT_OF_SYNC"; break;
151+
case ATT_ERR_VALUE_NOT_ALLOWED: ret = "ATT_ERR_VALUE_NOT_ALLOWED"; break;
152+
case ATT_ERR_WRITE_REJ: ret = "ATT_ERR_WRITE_REJ"; break;
153+
case ATT_ERR_CCCD: ret = "ATT_ERR_CCCD"; break;
154+
case ATT_ERR_IN_PROGRESS: ret = "ATT_ERR_IN_PROGRESS"; break;
155+
case ATT_ERR_RANGE: ret = "ATT_ERR_RANGE"; break;
156+
}
157+
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
158+
static char ret[3] = "00";
159+
sprintf(ret, "0x%02x", (int)error_code);
160+
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
161+
return ret;
162+
}
163+
164+
const char* attribute_opcode_to_string(uint8_t error_code)
165+
{
166+
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
167+
const char* ret = "INVALID OPCODE";
168+
switch(error_code)
169+
{
170+
case AttributeOpcode::ERROR_RESPONSE: ret = "ERROR_RESPONSE"; break;
171+
case AttributeOpcode::EXCHANGE_MTU_REQUEST: ret = "EXCHANGE_MTU_REQUEST"; break;
172+
case AttributeOpcode::EXCHANGE_MTU_RESPONSE: ret = "EXCHANGE_MTU_RESPONSE"; break;
173+
case AttributeOpcode::FIND_INFORMATION_REQUEST: ret = "FIND_INFORMATION_REQUEST"; break;
174+
case AttributeOpcode::FIND_INFORMATION_RESPONSE: ret = "FIND_INFORMATION_RESPONSE"; break;
175+
case AttributeOpcode::FIND_BY_TYPE_VALUE_REQUEST: ret = "FIND_BY_TYPE_VALUE_REQUEST"; break;
176+
case AttributeOpcode::FIND_BY_VALUE_TYPE_RESPONSE: ret = "FIND_BY_VALUE_TYPE_RESPONSE"; break;
177+
case AttributeOpcode::READ_BY_TYPE_REQUEST: ret = "READ_BY_TYPE_REQUEST"; break;
178+
case AttributeOpcode::READ_BY_TYPE_RESPONSE: ret = "READ_BY_TYPE_RESPONSE"; break;
179+
case AttributeOpcode::READ_REQUEST: ret = "READ_REQUEST"; break;
180+
case AttributeOpcode::READ_RESPONSE: ret = "READ_RESPONSE"; break;
181+
case AttributeOpcode::READ_BLOB_REQUEST: ret = "READ_BLOB_REQUEST"; break;
182+
case AttributeOpcode::READ_BLOB_RESPONSE: ret = "READ_BLOB_RESPONSE"; break;
183+
case AttributeOpcode::READ_MULTIPLE_REQUEST: ret = "READ_MULTIPLE_REQUEST"; break;
184+
case AttributeOpcode::READ_MULTIPLE_RESPONSE: ret = "READ_MULTIPLE_RESPONSE"; break;
185+
case AttributeOpcode::READ_BY_GROUP_TYPE_REQUEST: ret = "READ_BY_GROUP_TYPE_REQUEST"; break;
186+
case AttributeOpcode::READ_BY_GROUP_TYPE_RESPONSE: ret = "READ_BY_GROUP_TYPE_RESPONSE"; break;
187+
case AttributeOpcode::WRITE_REQUEST: ret = "WRITE_REQUEST"; break;
188+
case AttributeOpcode::WRITE_RESPONSE: ret = "WRITE_RESPONSE"; break;
189+
case AttributeOpcode::WRITE_COMMAND: ret = "WRITE_COMMAND"; break;
190+
case AttributeOpcode::SIGNED_WRITE_COMMAND: ret = "SIGNED_WRITE_COMMAND"; break;
191+
case AttributeOpcode::PREPARE_WRITE_REQUEST: ret = "PREPARE_WRITE_REQUEST"; break;
192+
case AttributeOpcode::PREPARE_WRITE_RESPONSE: ret = "PREPARE_WRITE_RESPONSE"; break;
193+
case AttributeOpcode::EXECUTE_WRITE_REQUEST: ret = "EXECUTE_WRITE_REQUEST"; break;
194+
case AttributeOpcode::EXECUTE_WRITE_RESPONSE: ret = "EXECUTE_WRITE_RESPONSE"; break;
195+
case AttributeOpcode::HANDLE_VALUE_NOTIFICATION: ret = "HANDLE_VALUE_NOTIFICATION"; break;
196+
case AttributeOpcode::HANDLE_VALUE_INDICATION: ret = "HANDLE_VALUE_INDICATION"; break;
197+
}
198+
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
199+
static char ret[3] = "00";
200+
sprintf(ret, "0x%02x", (int)error_code);
201+
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
202+
return ret;
203+
}
204+
23205
const char* dm_callback_event_to_string(uint8_t event) {
24206
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
25207
const char* ret = "INVALID";
@@ -121,7 +303,7 @@ const char* dm_callback_event_to_string(uint8_t event) {
121303
}
122304
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
123305
static char ret[3] = "00";
124-
sprintf(ret, "%02x", (int)event);
306+
sprintf(ret, "0x%02x", (int)event);
125307
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
126308
return ret;
127309
}
@@ -328,7 +510,7 @@ const char* hci_opcode_to_string(uint16_t opcode)
328510
}
329511
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
330512
static char ret[3] = "00";
331-
sprintf(ret, "%02x", (int)opcode);
513+
sprintf(ret, "0x%02x", (int)opcode);
332514
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
333515
return ret;
334516
}

connectivity/FEATURE_BLE/source/common/ble_trace_helpers.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,20 @@
2222
#include "mbed-trace/mbed_trace.h"
2323
#include "pal/GapTypes.h"
2424
#include "ble-host/include/dm_api.h"
25+
#include "common/UUID.h"
2526

2627
namespace ble {
2728

2829
#if MBED_CONF_MBED_TRACE_ENABLE
29-
const char* dm_callback_event_to_string(uint8_t event);
3030
void trace_le_supported_features(uint64_t feat);
31+
32+
const char* dm_callback_event_to_string(uint8_t event);
3133
const char* hci_opcode_to_string(uint16_t opcode);
34+
const char* attribute_error_code_to_string(uint8_t error);
35+
const char* attribute_opcode_to_string(uint8_t error);
36+
const char* ble_error_to_string(ble_error_t error);
37+
const char* att_client_callback_event_to_string(uint8_t code);
38+
const char* att_error_code_to_string(uint8_t code);
3239
#endif //MBED_CONF_MBED_TRACE_ENABLE
3340

3441
template<typename T>
@@ -37,6 +44,11 @@ static inline const char* tr_as_array(T item)
3744
return (mbed_trace_array)((const uint8_t*)&item, sizeof(item));
3845
}
3946

47+
static inline const char* to_string(UUID uuid)
48+
{
49+
return (mbed_trace_array)(uuid.getBaseUUID(), uuid.getLen());
50+
}
51+
4052
static inline constexpr const char* to_string(bool v)
4153
{
4254
if (v) {

0 commit comments

Comments
 (0)