mbed-os/connectivity/FEATURE_BLE/source/common/ble_trace_helpers.cpp

1269 lines
64 KiB
C++

/* mbed Microcontroller Library
* Copyright (c) 2021 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ble_trace_helpers.h"
#include "pal/AttServerMessage.h"
#include "att_api.h"
#define TRACE_GROUP "BLE "
namespace ble {
#if MBED_CONF_MBED_TRACE_ENABLE
const char *ble_error_to_string(ble_error_t error_code)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "INVALID ENUM VALUE";
switch(error_code)
{
case BLE_ERROR_NONE: ret = "BLE_ERROR_NONE"; break;
case BLE_ERROR_BUFFER_OVERFLOW: ret = "BLE_ERROR_BUFFER_OVERFLOW"; break;
case BLE_ERROR_NOT_IMPLEMENTED: ret = "BLE_ERROR_NOT_IMPLEMENTED"; break;
case BLE_ERROR_PARAM_OUT_OF_RANGE: ret = "BLE_ERROR_PARAM_OUT_OF_RANGE"; break;
case BLE_ERROR_INVALID_PARAM: ret = "BLE_ERROR_INVALID_PARAM"; break;
case BLE_STACK_BUSY: ret = "BLE_STACK_BUSY"; break;
case BLE_ERROR_INVALID_STATE: ret = "BLE_ERROR_INVALID_STATE"; break;
case BLE_ERROR_NO_MEM: ret = "BLE_ERROR_NO_MEM"; break;
case BLE_ERROR_OPERATION_NOT_PERMITTED: ret = "BLE_ERROR_OPERATION_NOT_PERMITTED"; break;
case BLE_ERROR_INITIALIZATION_INCOMPLETE: ret = "BLE_ERROR_INITIALIZATION_INCOMPLETE"; break;
case BLE_ERROR_ALREADY_INITIALIZED: ret = "BLE_ERROR_ALREADY_INITIALIZED"; break;
case BLE_ERROR_UNSPECIFIED: ret = "BLE_ERROR_UNSPECIFIED"; break;
case BLE_ERROR_INTERNAL_STACK_FAILURE: ret = "BLE_ERROR_INTERNAL_STACK_FAILURE"; break;
case BLE_ERROR_NOT_FOUND: ret = "BLE_ERROR_NOT_FOUND"; break;
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[3] = "00";
sprintf(ret, "%02x", (int)error_code);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
const char *attribute_error_code_to_string(uint8_t error_code)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "INVALID ENUM VALUE";
switch(error_code)
{
case AttErrorResponse::INVALID_HANDLE: ret = "INVALID_HANDLE"; break;
case AttErrorResponse::READ_NOT_PERMITTED: ret = "READ_NOT_PERMITTED"; break;
case AttErrorResponse::WRITE_NOT_PERMITTED: ret = "WRITE_NOT_PERMITTED"; break;
case AttErrorResponse::INVALID_PDU: ret = "INVALID_PDU"; break;
case AttErrorResponse::INSUFFICIENT_AUTHENTICATION: ret = "INSUFFICIENT_AUTHENTICATION"; break;
case AttErrorResponse::REQUEST_NOT_SUPPORTED: ret = "REQUEST_NOT_SUPPORTED"; break;
case AttErrorResponse::INVALID_OFFSET: ret = "INVALID_OFFSET"; break;
case AttErrorResponse::INSUFFICIENT_AUTHORIZATION: ret = "INSUFFICIENT_AUTHORIZATION"; break;
case AttErrorResponse::PREPARE_QUEUE_FULL: ret = "PREPARE_QUEUE_FULL"; break;
case AttErrorResponse::ATTRIBUTE_NOT_FOUND: ret = "ATTRIBUTE_NOT_FOUND"; break;
case AttErrorResponse::ATTRIBUTE_NOT_LONG: ret = "ATTRIBUTE_NOT_LONG"; break;
case AttErrorResponse::INSUFFICIENT_ENCRYPTION_KEY_SIZE: ret = "INSUFFICIENT_ENCRYPTION_KEY_SIZE"; break;
case AttErrorResponse::INVALID_ATTRIBUTE_VALUE_LENGTH: ret = "INVALID_ATTRIBUTE_VALUE_LENGTH"; break;
case AttErrorResponse::UNLIKELY_ERROR: ret = "UNLIKELY_ERROR"; break;
case AttErrorResponse::INSUFFICIENT_ENCRYPTION: ret = "INSUFFICIENT_ENCRYPTION"; break;
case AttErrorResponse::UNSUPPORTED_GROUP_TYPE: ret = "UNSUPPORTED_GROUP_TYPE"; break;
case AttErrorResponse::INSUFFICIENT_RESOURCES: ret = "INSUFFICIENT_RESOURCES"; break;
case AttErrorResponse::WRITE_REQUEST_REJECTED: ret = "WRITE_REQUEST_REJECTED"; break;
case AttErrorResponse::CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED:
ret = "CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED"; break;
case AttErrorResponse::PROCEDURE_ALREADY_IN_PROGRESS: ret = "PROCEDURE_ALREADY_IN_PROGRESS"; break;
case AttErrorResponse::OUT_OF_RANGE: ret = "OUT_OF_RANGE"; break;
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[3] = "00";
sprintf(ret, "%02x", (int)error_code);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
const char *att_client_callback_event_to_string(uint8_t code)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "INVALID EVENT";
switch(code)
{
case ATTC_FIND_INFO_RSP: ret = "ATTC_FIND_INFO_RSP"; break;
case ATTC_FIND_BY_TYPE_VALUE_RSP: ret = "ATTC_FIND_BY_TYPE_VALUE_RSP"; break;
case ATTC_READ_BY_TYPE_RSP: ret = "ATTC_READ_BY_TYPE_RSP"; break;
case ATTC_READ_RSP: ret = "ATTC_READ_RSP"; break;
case ATTC_READ_LONG_RSP: ret = "ATTC_READ_LONG_RSP"; break;
case ATTC_READ_MULTIPLE_RSP: ret = "ATTC_READ_MULTIPLE_RSP"; break;
case ATTC_READ_BY_GROUP_TYPE_RSP: ret = "ATTC_READ_BY_GROUP_TYPE_RSP"; break;
case ATTC_WRITE_RSP: ret = "ATTC_WRITE_RSP"; break;
case ATTC_WRITE_CMD_RSP: ret = "ATTC_WRITE_CMD_RSP"; break;
case ATTC_PREPARE_WRITE_RSP: ret = "ATTC_PREPARE_WRITE_RSP"; break;
case ATTC_EXECUTE_WRITE_RSP: ret = "ATTC_EXECUTE_WRITE_RSP"; break;
case ATTC_HANDLE_VALUE_NTF: ret = "ATTC_HANDLE_VALUE_NTF"; break;
case ATTC_HANDLE_VALUE_IND: ret = "ATTC_HANDLE_VALUE_IND"; break;
case ATTC_READ_MULT_VAR_RSP: ret = "ATTC_READ_MULT_VAR_RSP"; break;
case ATTC_MULT_VALUE_NTF: ret = "ATTC_MULT_VALUE_NTF"; break;
case ATTS_HANDLE_VALUE_CNF: ret = "ATTS_HANDLE_VALUE_CNF"; break;
case ATTS_MULT_VALUE_CNF: ret = "ATTS_MULT_VALUE_CNF"; break;
case ATTS_CCC_STATE_IND: ret = "ATTS_CCC_STATE_IND"; break;
case ATTS_DB_HASH_CALC_CMPL_IND: ret = "ATTS_DB_HASH_CALC_CMPL_IND"; break;
case ATT_MTU_UPDATE_IND: ret = "ATT_MTU_UPDATE_IND"; break;
case ATT_EATT_CONN_CMPL_IND: ret = "ATT_EATT_CONN_CMPL_IND"; break;
case ATT_EATT_RECONFIG_CMPL_IND: ret = "ATT_EATT_RECONFIG_CMPL_IND"; break;
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[3] = "00";
sprintf(ret, "%02x", (int)code);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
const char *att_error_code_to_string(uint8_t error_code)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "INVALID EVENT";
switch(error_code)
{
case ATT_SUCCESS: ret = "ATT_SUCCESS"; break;
case ATT_ERR_HANDLE: ret = "ATT_ERR_HANDLE"; break;
case ATT_ERR_READ: ret = "ATT_ERR_READ"; break;
case ATT_ERR_WRITE: ret = "ATT_ERR_WRITE"; break;
case ATT_ERR_INVALID_PDU: ret = "ATT_ERR_INVALID_PDU"; break;
case ATT_ERR_AUTH: ret = "ATT_ERR_AUTH"; break;
case ATT_ERR_NOT_SUP: ret = "ATT_ERR_NOT_SUP"; break;
case ATT_ERR_OFFSET: ret = "ATT_ERR_OFFSET"; break;
case ATT_ERR_AUTHOR: ret = "ATT_ERR_AUTHOR"; break;
case ATT_ERR_QUEUE_FULL: ret = "ATT_ERR_QUEUE_FULL"; break;
case ATT_ERR_NOT_FOUND: ret = "ATT_ERR_NOT_FOUND"; break;
case ATT_ERR_NOT_LONG: ret = "ATT_ERR_NOT_LONG"; break;
case ATT_ERR_KEY_SIZE: ret = "ATT_ERR_KEY_SIZE"; break;
case ATT_ERR_LENGTH: ret = "ATT_ERR_LENGTH"; break;
case ATT_ERR_UNLIKELY: ret = "ATT_ERR_UNLIKELY"; break;
case ATT_ERR_ENC: ret = "ATT_ERR_ENC"; break;
case ATT_ERR_GROUP_TYPE: ret = "ATT_ERR_GROUP_TYPE"; break;
case ATT_ERR_RESOURCES: ret = "ATT_ERR_RESOURCES"; break;
case ATT_ERR_DATABASE_OUT_OF_SYNC: ret = "ATT_ERR_DATABASE_OUT_OF_SYNC"; break;
case ATT_ERR_VALUE_NOT_ALLOWED: ret = "ATT_ERR_VALUE_NOT_ALLOWED"; break;
case ATT_ERR_WRITE_REJ: ret = "ATT_ERR_WRITE_REJ"; break;
case ATT_ERR_CCCD: ret = "ATT_ERR_CCCD"; break;
case ATT_ERR_IN_PROGRESS: ret = "ATT_ERR_IN_PROGRESS"; break;
case ATT_ERR_RANGE: ret = "ATT_ERR_RANGE"; break;
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[3] = "00";
sprintf(ret, "%02x", (int)error_code);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
const char *attribute_opcode_to_string(uint8_t error_code)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "INVALID OPCODE";
switch(error_code)
{
case AttributeOpcode::ERROR_RESPONSE: ret = "ERROR_RESPONSE"; break;
case AttributeOpcode::EXCHANGE_MTU_REQUEST: ret = "EXCHANGE_MTU_REQUEST"; break;
case AttributeOpcode::EXCHANGE_MTU_RESPONSE: ret = "EXCHANGE_MTU_RESPONSE"; break;
case AttributeOpcode::FIND_INFORMATION_REQUEST: ret = "FIND_INFORMATION_REQUEST"; break;
case AttributeOpcode::FIND_INFORMATION_RESPONSE: ret = "FIND_INFORMATION_RESPONSE"; break;
case AttributeOpcode::FIND_BY_TYPE_VALUE_REQUEST: ret = "FIND_BY_TYPE_VALUE_REQUEST"; break;
case AttributeOpcode::FIND_BY_VALUE_TYPE_RESPONSE: ret = "FIND_BY_VALUE_TYPE_RESPONSE"; break;
case AttributeOpcode::READ_BY_TYPE_REQUEST: ret = "READ_BY_TYPE_REQUEST"; break;
case AttributeOpcode::READ_BY_TYPE_RESPONSE: ret = "READ_BY_TYPE_RESPONSE"; break;
case AttributeOpcode::READ_REQUEST: ret = "READ_REQUEST"; break;
case AttributeOpcode::READ_RESPONSE: ret = "READ_RESPONSE"; break;
case AttributeOpcode::READ_BLOB_REQUEST: ret = "READ_BLOB_REQUEST"; break;
case AttributeOpcode::READ_BLOB_RESPONSE: ret = "READ_BLOB_RESPONSE"; break;
case AttributeOpcode::READ_MULTIPLE_REQUEST: ret = "READ_MULTIPLE_REQUEST"; break;
case AttributeOpcode::READ_MULTIPLE_RESPONSE: ret = "READ_MULTIPLE_RESPONSE"; break;
case AttributeOpcode::READ_BY_GROUP_TYPE_REQUEST: ret = "READ_BY_GROUP_TYPE_REQUEST"; break;
case AttributeOpcode::READ_BY_GROUP_TYPE_RESPONSE: ret = "READ_BY_GROUP_TYPE_RESPONSE"; break;
case AttributeOpcode::WRITE_REQUEST: ret = "WRITE_REQUEST"; break;
case AttributeOpcode::WRITE_RESPONSE: ret = "WRITE_RESPONSE"; break;
case AttributeOpcode::WRITE_COMMAND: ret = "WRITE_COMMAND"; break;
case AttributeOpcode::SIGNED_WRITE_COMMAND: ret = "SIGNED_WRITE_COMMAND"; break;
case AttributeOpcode::PREPARE_WRITE_REQUEST: ret = "PREPARE_WRITE_REQUEST"; break;
case AttributeOpcode::PREPARE_WRITE_RESPONSE: ret = "PREPARE_WRITE_RESPONSE"; break;
case AttributeOpcode::EXECUTE_WRITE_REQUEST: ret = "EXECUTE_WRITE_REQUEST"; break;
case AttributeOpcode::EXECUTE_WRITE_RESPONSE: ret = "EXECUTE_WRITE_RESPONSE"; break;
case AttributeOpcode::HANDLE_VALUE_NOTIFICATION: ret = "HANDLE_VALUE_NOTIFICATION"; break;
case AttributeOpcode::HANDLE_VALUE_INDICATION: ret = "HANDLE_VALUE_INDICATION"; break;
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[3] = "00";
sprintf(ret, "%02x", (int)error_code);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
const char *dm_callback_event_to_string(uint8_t event) {
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "INVALID";
switch(event)
{
case DM_RESET_CMPL_IND: ret = "DM_RESET_CMPL_IND"; break;
case DM_ADV_START_IND: ret = "DM_ADV_START_IND"; break;
case DM_ADV_STOP_IND: ret = "DM_ADV_STOP_IND"; break;
case DM_ADV_NEW_ADDR_IND: ret = "DM_ADV_NEW_ADDR_IND"; break;
case DM_SCAN_START_IND: ret = "DM_SCAN_START_IND"; break;
case DM_SCAN_STOP_IND: ret = "DM_SCAN_STOP_IND"; break;
case DM_SCAN_REPORT_IND: ret = "DM_SCAN_REPORT_IND"; break;
case DM_CONN_OPEN_IND: ret = "DM_CONN_OPEN_IND"; break;
case DM_CONN_CLOSE_IND: ret = "DM_CONN_CLOSE_IND"; break;
case DM_CONN_UPDATE_IND: ret = "DM_CONN_UPDATE_IND"; break;
case DM_SEC_PAIR_CMPL_IND: ret = "DM_SEC_PAIR_CMPL_IND"; break;
case DM_SEC_PAIR_FAIL_IND: ret = "DM_SEC_PAIR_FAIL_IND"; break;
case DM_SEC_ENCRYPT_IND: ret = "DM_SEC_ENCRYPT_IND"; break;
case DM_SEC_ENCRYPT_FAIL_IND: ret = "DM_SEC_ENCRYPT_FAIL_IND"; break;
case DM_SEC_AUTH_REQ_IND: ret = "DM_SEC_AUTH_REQ_IND"; break;
case DM_SEC_KEY_IND: ret = "DM_SEC_KEY_IND"; break;
case DM_SEC_LTK_REQ_IND: ret = "DM_SEC_LTK_REQ_IND"; break;
case DM_SEC_PAIR_IND: ret = "DM_SEC_PAIR_IND"; break;
case DM_SEC_SLAVE_REQ_IND: ret = "DM_SEC_SLAVE_REQ_IND"; break;
case DM_SEC_CALC_OOB_IND: ret = "DM_SEC_CALC_OOB_IND"; break;
case DM_SEC_ECC_KEY_IND: ret = "DM_SEC_ECC_KEY_IND"; break;
case DM_SEC_COMPARE_IND: ret = "DM_SEC_COMPARE_IND"; break;
case DM_SEC_KEYPRESS_IND: ret = "DM_SEC_KEYPRESS_IND"; break;
case DM_PRIV_RESOLVED_ADDR_IND: ret = "DM_PRIV_RESOLVED_ADDR_IND"; break;
case DM_PRIV_GENERATE_ADDR_IND: ret = "DM_PRIV_GENERATE_ADDR_IND"; break;
case DM_CONN_READ_RSSI_IND: ret = "DM_CONN_READ_RSSI_IND"; break;
case DM_PRIV_ADD_DEV_TO_RES_LIST_IND: ret = "DM_PRIV_ADD_DEV_TO_RES_LIST_IND"; break;
case DM_PRIV_REM_DEV_FROM_RES_LIST_IND: ret = "DM_PRIV_REM_DEV_FROM_RES_LIST_IND"; break;
case DM_PRIV_CLEAR_RES_LIST_IND: ret = "DM_PRIV_CLEAR_RES_LIST_IND"; break;
case DM_PRIV_READ_PEER_RES_ADDR_IND: ret = "DM_PRIV_READ_PEER_RES_ADDR_IND"; break;
case DM_PRIV_READ_LOCAL_RES_ADDR_IND: ret = "DM_PRIV_READ_LOCAL_RES_ADDR_IND"; break;
case DM_PRIV_SET_ADDR_RES_ENABLE_IND: ret = "DM_PRIV_SET_ADDR_RES_ENABLE_IND"; break;
case DM_REM_CONN_PARAM_REQ_IND: ret = "DM_REM_CONN_PARAM_REQ_IND"; break;
case DM_CONN_DATA_LEN_CHANGE_IND: ret = "DM_CONN_DATA_LEN_CHANGE_IND"; break;
case DM_CONN_WRITE_AUTH_TO_IND: ret = "DM_CONN_WRITE_AUTH_TO_IND"; break;
case DM_CONN_AUTH_TO_EXPIRED_IND: ret = "DM_CONN_AUTH_TO_EXPIRED_IND"; break;
case DM_PHY_READ_IND: ret = "DM_PHY_READ_IND"; break;
case DM_PHY_SET_DEF_IND: ret = "DM_PHY_SET_DEF_IND"; break;
case DM_PHY_UPDATE_IND: ret = "DM_PHY_UPDATE_IND"; break;
case DM_ADV_SET_START_IND: ret = "DM_ADV_SET_START_IND"; break;
case DM_ADV_SET_STOP_IND: ret = "DM_ADV_SET_STOP_IND"; break;
case DM_SCAN_REQ_RCVD_IND: ret = "DM_SCAN_REQ_RCVD_IND"; break;
case DM_EXT_SCAN_START_IND: ret = "DM_EXT_SCAN_START_IND"; break;
case DM_EXT_SCAN_STOP_IND: ret = "DM_EXT_SCAN_STOP_IND"; break;
case DM_EXT_SCAN_REPORT_IND: ret = "DM_EXT_SCAN_REPORT_IND"; break;
case DM_PER_ADV_SET_START_IND: ret = "DM_PER_ADV_SET_START_IND"; break;
case DM_PER_ADV_SET_STOP_IND: ret = "DM_PER_ADV_SET_STOP_IND"; break;
case DM_PER_ADV_SYNC_EST_IND: ret = "DM_PER_ADV_SYNC_EST_IND"; break;
case DM_PER_ADV_SYNC_EST_FAIL_IND: ret = "DM_PER_ADV_SYNC_EST_FAIL_IND"; break;
case DM_PER_ADV_SYNC_LOST_IND: ret = "DM_PER_ADV_SYNC_LOST_IND"; break;
case DM_PER_ADV_SYNC_TRSF_EST_IND: ret = "DM_PER_ADV_SYNC_TRSF_EST_IND"; break;
case DM_PER_ADV_SYNC_TRSF_EST_FAIL_IND: ret = "DM_PER_ADV_SYNC_TRSF_EST_FAIL_IND"; break;
case DM_PER_ADV_SYNC_TRSF_IND: ret = "DM_PER_ADV_SYNC_TRSF_IND"; break;
case DM_PER_ADV_SET_INFO_TRSF_IND: ret = "DM_PER_ADV_SET_INFO_TRSF_IND"; break;
case DM_PER_ADV_REPORT_IND: ret = "DM_PER_ADV_REPORT_IND"; break;
case DM_REMOTE_FEATURES_IND: ret = "DM_REMOTE_FEATURES_IND"; break;
case DM_READ_REMOTE_VER_INFO_IND: ret = "DM_READ_REMOTE_VER_INFO_IND"; break;
case DM_CONN_IQ_REPORT_IND: ret = "DM_CONN_IQ_REPORT_IND"; break;
case DM_CTE_REQ_FAIL_IND: ret = "DM_CTE_REQ_FAIL_IND"; break;
case DM_CONN_CTE_RX_SAMPLE_START_IND: ret = "DM_CONN_CTE_RX_SAMPLE_START_IND"; break;
case DM_CONN_CTE_RX_SAMPLE_STOP_IND: ret = "DM_CONN_CTE_RX_SAMPLE_STOP_IND"; break;
case DM_CONN_CTE_TX_CFG_IND: ret = "DM_CONN_CTE_TX_CFG_IND"; break;
case DM_CONN_CTE_REQ_START_IND: ret = "DM_CONN_CTE_REQ_START_IND"; break;
case DM_CONN_CTE_REQ_STOP_IND: ret = "DM_CONN_CTE_REQ_STOP_IND"; break;
case DM_CONN_CTE_RSP_START_IND: ret = "DM_CONN_CTE_RSP_START_IND"; break;
case DM_CONN_CTE_RSP_STOP_IND: ret = "DM_CONN_CTE_RSP_STOP_IND"; break;
case DM_READ_ANTENNA_INFO_IND: ret = "DM_READ_ANTENNA_INFO_IND"; break;
case DM_CIS_CIG_CONFIG_IND: ret = "DM_CIS_CIG_CONFIG_IND"; break;
case DM_CIS_CIG_REMOVE_IND: ret = "DM_CIS_CIG_REMOVE_IND"; break;
case DM_CIS_REQ_IND: ret = "DM_CIS_REQ_IND"; break;
case DM_CIS_OPEN_IND: ret = "DM_CIS_OPEN_IND"; break;
case DM_CIS_CLOSE_IND: ret = "DM_CIS_CLOSE_IND"; break;
case DM_REQ_PEER_SCA_IND: ret = "DM_REQ_PEER_SCA_IND"; break;
case DM_ISO_DATA_PATH_SETUP_IND: ret = "DM_ISO_DATA_PATH_SETUP_IND"; break;
case DM_ISO_DATA_PATH_REMOVE_IND: ret = "DM_ISO_DATA_PATH_REMOVE_IND"; break;
case DM_DATA_PATH_CONFIG_IND: ret = "DM_DATA_PATH_CONFIG_IND"; break;
case DM_READ_LOCAL_SUP_CODECS_IND: ret = "DM_READ_LOCAL_SUP_CODECS_IND"; break;
case DM_READ_LOCAL_SUP_CODEC_CAP_IND: ret = "DM_READ_LOCAL_SUP_CODEC_CAP_IND"; break;
case DM_READ_LOCAL_SUP_CTR_DLY_IND: ret = "DM_READ_LOCAL_SUP_CTR_DLY_IND"; break;
case DM_BIG_START_IND: ret = "DM_BIG_START_IND"; break;
case DM_BIG_STOP_IND: ret = "DM_BIG_STOP_IND"; break;
case DM_BIG_SYNC_EST_IND: ret = "DM_BIG_SYNC_EST_IND"; break;
case DM_BIG_SYNC_EST_FAIL_IND: ret = "DM_BIG_SYNC_EST_FAIL_IND"; break;
case DM_BIG_SYNC_LOST_IND: ret = "DM_BIG_SYNC_LOST_IND"; break;
case DM_BIG_SYNC_STOP_IND: ret = "DM_BIG_SYNC_STOP_IND"; break;
case DM_BIG_INFO_ADV_REPORT_IND: ret = "DM_BIG_INFO_ADV_REPORT_IND"; break;
case DM_L2C_CMD_REJ_IND: ret = "DM_L2C_CMD_REJ_IND"; break;
case DM_ERROR_IND: ret = "DM_ERROR_IND"; break;
case DM_HW_ERROR_IND: ret = "DM_HW_ERROR_IND"; break;
case DM_VENDOR_SPEC_IND: ret = "DM_VENDOR_SPEC_IND"; break;
#if MBED_CONF_CORDIO_ROUTE_UNHANDLED_COMMAND_COMPLETE_EVENTS
case DM_UNHANDLED_CMD_CMPL_EVT_IND: ret = "DM_UNHANDLED_CMD_CMPL_EVT_IND"; break;
#endif
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[3] = "00";
sprintf(ret, "%02x", (int)event);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
void trace_le_supported_features(uint64_t feat)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
if (feat & HCI_LE_SUP_FEAT_ENCRYPTION) tr_info("ENCRYPTION");
if (feat & HCI_LE_SUP_FEAT_CONN_PARAM_REQ_PROC) tr_info("CONN_PARAM_REQ_PROC");
if (feat & HCI_LE_SUP_FEAT_EXT_REJECT_IND) tr_info("EXT_REJECT_IND");
if (feat & HCI_LE_SUP_FEAT_SLV_INIT_FEAT_EXCH) tr_info("SLV_INIT_FEAT_EXCH");
if (feat & HCI_LE_SUP_FEAT_LE_PING) tr_info("LE_PING");
if (feat & HCI_LE_SUP_FEAT_DATA_LEN_EXT) tr_info("DATA_LEN_EXT");
if (feat & HCI_LE_SUP_FEAT_PRIVACY) tr_info("PRIVACY");
if (feat & HCI_LE_SUP_FEAT_EXT_SCAN_FILT_POLICY) tr_info("EXT_SCAN_FILT_POLICY");
if (feat & HCI_LE_SUP_FEAT_LE_2M_PHY) tr_info("LE_2M_PHY");
if (feat & HCI_LE_SUP_FEAT_STABLE_MOD_IDX_TRANSMITTER) tr_info("STABLE_MOD_IDX_TRANSMITTER");
if (feat & HCI_LE_SUP_FEAT_STABLE_MOD_IDX_RECEIVER) tr_info("STABLE_MOD_IDX_RECEIVER");
if (feat & HCI_LE_SUP_FEAT_LE_CODED_PHY) tr_info("LE_CODED_PHY");
if (feat & HCI_LE_SUP_FEAT_LE_EXT_ADV) tr_info("LE_EXT_ADV");
if (feat & HCI_LE_SUP_FEAT_LE_PER_ADV) tr_info("LE_PER_ADV");
if (feat & HCI_LE_SUP_FEAT_CH_SEL_2) tr_info("CH_SEL_2");
if (feat & HCI_LE_SUP_FEAT_LE_POWER_CLASS_1) tr_info("LE_POWER_CLASS_1");
if (feat & HCI_LE_SUP_FEAT_MIN_NUN_USED_CHAN) tr_info("MIN_NUN_USED_CHAN");
if (feat & HCI_LE_SUP_FEAT_CONN_CTE_REQ) tr_info("CONN_CTE_REQ");
if (feat & HCI_LE_SUP_FEAT_CONN_CTE_RSP) tr_info("CONN_CTE_RSP");
if (feat & HCI_LE_SUP_FEAT_CONNLESS_CTE_TRANS) tr_info("CONNLESS_CTE_TRANS");
if (feat & HCI_LE_SUP_FEAT_CONNLESS_CTE_RECV) tr_info("CONNLESS_CTE_RECV");
if (feat & HCI_LE_SUP_FEAT_ANTENNA_SWITCH_AOD) tr_info("ANTENNA_SWITCH_AOD");
if (feat & HCI_LE_SUP_FEAT_ANTENNA_SWITCH_AOA) tr_info("ANTENNA_SWITCH_AOA");
if (feat & HCI_LE_SUP_FEAT_RECV_CTE) tr_info("RECV_CTE");
if (feat & HCI_LE_SUP_FEAT_PAST_SENDER) tr_info("PAST_SENDER");
if (feat & HCI_LE_SUP_FEAT_PAST_RECIPIENT) tr_info("PAST_RECIPIENT");
if (feat & HCI_LE_SUP_FEAT_SCA_UPDATE) tr_info("SCA_UPDATE");
if (feat & HCI_LE_SUP_FEAT_REMOTE_PUB_KEY_VALIDATION) tr_info("REMOTE_PUB_KEY_VALIDATION");
if (feat & HCI_LE_SUP_FEAT_CIS_MASTER) tr_info("CIS_MASTER");
if (feat & HCI_LE_SUP_FEAT_CIS_SLAVE) tr_info("CIS_SLAVE");
if (feat & HCI_LE_SUP_FEAT_ISO_BROADCASTER) tr_info("ISO_BROADCASTER");
if (feat & HCI_LE_SUP_FEAT_ISO_SYNC_RECEIVER) tr_info("ISO_SYNC_RECEIVER");
if (feat & HCI_LE_SUP_FEAT_ISO_HOST_SUPPORT) tr_info("ISO_HOST_SUPPORT");
if (feat & HCI_LE_SUP_FEAT_POWER_CONTROL_REQUEST) tr_info("POWER_CONTROL_REQUEST");
if (feat & HCI_LE_SUP_FEAT_POWER_CHANGE_IND) tr_info("POWER_CHANGE_IND");
if (feat & HCI_LE_SUP_FEAT_PATH_LOSS_MONITOR) tr_info("PATH_LOSS_MONITOR");
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
tr_info("%s", tr_array((uint8_t*)&feat, 4));
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
}
const char *hci_opcode_to_string(uint16_t opcode)
{
#if MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
const char *ret = "UNKNOWN OPCODE";
switch (opcode) {
case HCI_OPCODE_NOP: ret = "HCI_OPCODE_NOP"; break;
case HCI_OPCODE_DISCONNECT: ret = "HCI_OPCODE_DISCONNECT"; break;
case HCI_OPCODE_READ_REMOTE_VER_INFO: ret = "HCI_OPCODE_READ_REMOTE_VER_INFO"; break;
case HCI_OPCODE_SET_EVENT_MASK: ret = "HCI_OPCODE_SET_EVENT_MASK"; break;
case HCI_OPCODE_RESET: ret = "HCI_OPCODE_RESET"; break;
case HCI_OPCODE_READ_TX_PWR_LVL: ret = "HCI_OPCODE_READ_TX_PWR_LVL"; break;
case HCI_OPCODE_SET_EVENT_MASK_PAGE2: ret = "HCI_OPCODE_SET_EVENT_MASK_PAGE2"; break;
case HCI_OPCODE_READ_AUTH_PAYLOAD_TO: ret = "HCI_OPCODE_READ_AUTH_PAYLOAD_TO"; break;
case HCI_OPCODE_WRITE_AUTH_PAYLOAD_TO: ret = "HCI_OPCODE_WRITE_AUTH_PAYLOAD_TO"; break;
case HCI_OPCODE_CONFIG_DATA_PATH: ret = "HCI_OPCODE_CONFIG_DATA_PATH"; break;
case HCI_OPCODE_READ_LOCAL_VER_INFO: ret = "HCI_OPCODE_READ_LOCAL_VER_INFO"; break;
case HCI_OPCODE_READ_LOCAL_SUP_CMDS: ret = "HCI_OPCODE_READ_LOCAL_SUP_CMDS"; break;
case HCI_OPCODE_READ_LOCAL_SUP_FEAT: ret = "HCI_OPCODE_READ_LOCAL_SUP_FEAT"; break;
case HCI_OPCODE_READ_BUF_SIZE: ret = "HCI_OPCODE_READ_BUF_SIZE"; break;
case HCI_OPCODE_READ_BD_ADDR: ret = "HCI_OPCODE_READ_BD_ADDR"; break;
case HCI_OPCODE_READ_LOCAL_SUP_CODECS: ret = "HCI_OPCODE_READ_LOCAL_SUP_CODECS"; break;
case HCI_OPCODE_READ_LOCAL_SUP_CODEC_CAP: ret = "HCI_OPCODE_READ_LOCAL_SUP_CODEC_CAP"; break;
case HCI_OPCODE_READ_LOCAL_SUP_CONTROLLER_DLY: ret = "HCI_OPCODE_READ_LOCAL_SUP_CONTROLLER_DLY"; break;
case HCI_OPCODE_READ_RSSI: ret = "HCI_OPCODE_READ_RSSI"; break;
case HCI_OPCODE_LE_SET_EVENT_MASK: ret = "HCI_OPCODE_LE_SET_EVENT_MASK"; break;
case HCI_OPCODE_LE_READ_BUF_SIZE: ret = "HCI_OPCODE_LE_READ_BUF_SIZE"; break;
case HCI_OPCODE_LE_READ_LOCAL_SUP_FEAT: ret = "HCI_OPCODE_LE_READ_LOCAL_SUP_FEAT"; break;
case HCI_OPCODE_LE_SET_RAND_ADDR: ret = "HCI_OPCODE_LE_SET_RAND_ADDR"; break;
case HCI_OPCODE_LE_SET_ADV_PARAM: ret = "HCI_OPCODE_LE_SET_ADV_PARAM"; break;
case HCI_OPCODE_LE_READ_ADV_TX_POWER: ret = "HCI_OPCODE_LE_READ_ADV_TX_POWER"; break;
case HCI_OPCODE_LE_SET_ADV_DATA: ret = "HCI_OPCODE_LE_SET_ADV_DATA"; break;
case HCI_OPCODE_LE_SET_SCAN_RESP_DATA: ret = "HCI_OPCODE_LE_SET_SCAN_RESP_DATA"; break;
case HCI_OPCODE_LE_SET_ADV_ENABLE: ret = "HCI_OPCODE_LE_SET_ADV_ENABLE"; break;
case HCI_OPCODE_LE_SET_SCAN_PARAM: ret = "HCI_OPCODE_LE_SET_SCAN_PARAM"; break;
case HCI_OPCODE_LE_SET_SCAN_ENABLE: ret = "HCI_OPCODE_LE_SET_SCAN_ENABLE"; break;
case HCI_OPCODE_LE_CREATE_CONN: ret = "HCI_OPCODE_LE_CREATE_CONN"; break;
case HCI_OPCODE_LE_CREATE_CONN_CANCEL: ret = "HCI_OPCODE_LE_CREATE_CONN_CANCEL"; break;
case HCI_OPCODE_LE_READ_WHITE_LIST_SIZE: ret = "HCI_OPCODE_LE_READ_WHITE_LIST_SIZE"; break;
case HCI_OPCODE_LE_CLEAR_WHITE_LIST: ret = "HCI_OPCODE_LE_CLEAR_WHITE_LIST"; break;
case HCI_OPCODE_LE_ADD_DEV_WHITE_LIST: ret = "HCI_OPCODE_LE_ADD_DEV_WHITE_LIST"; break;
case HCI_OPCODE_LE_REMOVE_DEV_WHITE_LIST: ret = "HCI_OPCODE_LE_REMOVE_DEV_WHITE_LIST"; break;
case HCI_OPCODE_LE_CONN_UPDATE: ret = "HCI_OPCODE_LE_CONN_UPDATE"; break;
case HCI_OPCODE_LE_SET_HOST_CHAN_CLASS: ret = "HCI_OPCODE_LE_SET_HOST_CHAN_CLASS"; break;
case HCI_OPCODE_LE_READ_CHAN_MAP: ret = "HCI_OPCODE_LE_READ_CHAN_MAP"; break;
case HCI_OPCODE_LE_READ_REMOTE_FEAT: ret = "HCI_OPCODE_LE_READ_REMOTE_FEAT"; break;
case HCI_OPCODE_LE_ENCRYPT: ret = "HCI_OPCODE_LE_ENCRYPT"; break;
case HCI_OPCODE_LE_RAND: ret = "HCI_OPCODE_LE_RAND"; break;
case HCI_OPCODE_LE_START_ENCRYPTION: ret = "HCI_OPCODE_LE_START_ENCRYPTION"; break;
case HCI_OPCODE_LE_LTK_REQ_REPL: ret = "HCI_OPCODE_LE_LTK_REQ_REPL"; break;
case HCI_OPCODE_LE_LTK_REQ_NEG_REPL: ret = "HCI_OPCODE_LE_LTK_REQ_NEG_REPL"; break;
case HCI_OPCODE_LE_READ_SUP_STATES: ret = "HCI_OPCODE_LE_READ_SUP_STATES"; break;
case HCI_OPCODE_LE_RECEIVER_TEST: ret = "HCI_OPCODE_LE_RECEIVER_TEST"; break;
case HCI_OPCODE_LE_TRANSMITTER_TEST: ret = "HCI_OPCODE_LE_TRANSMITTER_TEST"; break;
case HCI_OPCODE_LE_TEST_END: ret = "HCI_OPCODE_LE_TEST_END"; break;
/* Version 4.1 */
case HCI_OPCODE_LE_REM_CONN_PARAM_REP: ret = "HCI_OPCODE_LE_REM_CONN_PARAM_REP"; break;
case HCI_OPCODE_LE_REM_CONN_PARAM_NEG_REP: ret = "HCI_OPCODE_LE_REM_CONN_PARAM_NEG_REP"; break;
/* Version 4.2 */
case HCI_OPCODE_LE_SET_DATA_LEN: ret = "HCI_OPCODE_LE_SET_DATA_LEN"; break;
case HCI_OPCODE_LE_READ_DEF_DATA_LEN: ret = "HCI_OPCODE_LE_READ_DEF_DATA_LEN"; break;
case HCI_OPCODE_LE_WRITE_DEF_DATA_LEN: ret = "HCI_OPCODE_LE_WRITE_DEF_DATA_LEN"; break;
case HCI_OPCODE_LE_READ_LOCAL_P256_PUB_KEY: ret = "HCI_OPCODE_LE_READ_LOCAL_P256_PUB_KEY"; break;
case HCI_OPCODE_LE_GENERATE_DHKEY: ret = "HCI_OPCODE_LE_GENERATE_DHKEY"; break;
case HCI_OPCODE_LE_ADD_DEV_RES_LIST: ret = "HCI_OPCODE_LE_ADD_DEV_RES_LIST"; break;
case HCI_OPCODE_LE_REMOVE_DEV_RES_LIST: ret = "HCI_OPCODE_LE_REMOVE_DEV_RES_LIST"; break;
case HCI_OPCODE_LE_CLEAR_RES_LIST: ret = "HCI_OPCODE_LE_CLEAR_RES_LIST"; break;
case HCI_OPCODE_LE_READ_RES_LIST_SIZE: ret = "HCI_OPCODE_LE_READ_RES_LIST_SIZE"; break;
case HCI_OPCODE_LE_READ_PEER_RES_ADDR: ret = "HCI_OPCODE_LE_READ_PEER_RES_ADDR"; break;
case HCI_OPCODE_LE_READ_LOCAL_RES_ADDR: ret = "HCI_OPCODE_LE_READ_LOCAL_RES_ADDR"; break;
case HCI_OPCODE_LE_SET_ADDR_RES_ENABLE: ret = "HCI_OPCODE_LE_SET_ADDR_RES_ENABLE"; break;
case HCI_OPCODE_LE_SET_RES_PRIV_ADDR_TO: ret = "HCI_OPCODE_LE_SET_RES_PRIV_ADDR_TO"; break;
case HCI_OPCODE_LE_READ_MAX_DATA_LEN: ret = "HCI_OPCODE_LE_READ_MAX_DATA_LEN"; break;
/* Version 5.0 */
case HCI_OPCODE_LE_READ_PHY: ret = "HCI_OPCODE_LE_READ_PHY"; break;
case HCI_OPCODE_LE_SET_DEF_PHY: ret = "HCI_OPCODE_LE_SET_DEF_PHY"; break;
case HCI_OPCODE_LE_SET_PHY: ret = "HCI_OPCODE_LE_SET_PHY"; break;
case HCI_OPCODE_LE_ENHANCED_RECEIVER_TEST: ret = "HCI_OPCODE_LE_ENHANCED_RECEIVER_TEST"; break;
case HCI_OPCODE_LE_ENHANCED_TRANSMITTER_TEST: ret = "HCI_OPCODE_LE_ENHANCED_TRANSMITTER_TEST"; break;
case HCI_OPCODE_LE_SET_ADV_SET_RAND_ADDR: ret = "HCI_OPCODE_LE_SET_ADV_SET_RAND_ADDR"; break;
case HCI_OPCODE_LE_SET_EXT_ADV_PARAM: ret = "HCI_OPCODE_LE_SET_EXT_ADV_PARAM"; break;
case HCI_OPCODE_LE_SET_EXT_ADV_DATA: ret = "HCI_OPCODE_LE_SET_EXT_ADV_DATA"; break;
case HCI_OPCODE_LE_SET_EXT_SCAN_RESP_DATA: ret = "HCI_OPCODE_LE_SET_EXT_SCAN_RESP_DATA"; break;
case HCI_OPCODE_LE_SET_EXT_ADV_ENABLE: ret = "HCI_OPCODE_LE_SET_EXT_ADV_ENABLE"; break;
case HCI_OPCODE_LE_READ_MAX_ADV_DATA_LEN: ret = "HCI_OPCODE_LE_READ_MAX_ADV_DATA_LEN"; break;
case HCI_OPCODE_LE_READ_NUM_SUP_ADV_SETS: ret = "HCI_OPCODE_LE_READ_NUM_SUP_ADV_SETS"; break;
case HCI_OPCODE_LE_REMOVE_ADV_SET: ret = "HCI_OPCODE_LE_REMOVE_ADV_SET"; break;
case HCI_OPCODE_LE_CLEAR_ADV_SETS: ret = "HCI_OPCODE_LE_CLEAR_ADV_SETS"; break;
case HCI_OPCODE_LE_SET_PER_ADV_PARAM: ret = "HCI_OPCODE_LE_SET_PER_ADV_PARAM"; break;
case HCI_OPCODE_LE_SET_PER_ADV_DATA: ret = "HCI_OPCODE_LE_SET_PER_ADV_DATA"; break;
case HCI_OPCODE_LE_SET_PER_ADV_ENABLE: ret = "HCI_OPCODE_LE_SET_PER_ADV_ENABLE"; break;
case HCI_OPCODE_LE_SET_EXT_SCAN_PARAM: ret = "HCI_OPCODE_LE_SET_EXT_SCAN_PARAM"; break;
case HCI_OPCODE_LE_SET_EXT_SCAN_ENABLE: ret = "HCI_OPCODE_LE_SET_EXT_SCAN_ENABLE"; break;
case HCI_OPCODE_LE_EXT_CREATE_CONN: ret = "HCI_OPCODE_LE_EXT_CREATE_CONN"; break;
case HCI_OPCODE_LE_PER_ADV_CREATE_SYNC: ret = "HCI_OPCODE_LE_PER_ADV_CREATE_SYNC"; break;
case HCI_OPCODE_LE_PER_ADV_CREATE_SYNC_CANCEL: ret = "HCI_OPCODE_LE_PER_ADV_CREATE_SYNC_CANCEL"; break;
case HCI_OPCODE_LE_PER_ADV_TERMINATE_SYNC: ret = "HCI_OPCODE_LE_PER_ADV_TERMINATE_SYNC"; break;
case HCI_OPCODE_LE_ADD_DEV_PER_ADV_LIST: ret = "HCI_OPCODE_LE_ADD_DEV_PER_ADV_LIST"; break;
case HCI_OPCODE_LE_REMOVE_DEV_PER_ADV_LIST: ret = "HCI_OPCODE_LE_REMOVE_DEV_PER_ADV_LIST"; break;
case HCI_OPCODE_LE_CLEAR_PER_ADV_LIST: ret = "HCI_OPCODE_LE_CLEAR_PER_ADV_LIST"; break;
case HCI_OPCODE_LE_READ_PER_ADV_LIST_SIZE: ret = "HCI_OPCODE_LE_READ_PER_ADV_LIST_SIZE"; break;
case HCI_OPCODE_LE_READ_TX_POWER: ret = "HCI_OPCODE_LE_READ_TX_POWER"; break;
case HCI_OPCODE_LE_WRITE_RF_PATH_COMP: ret = "HCI_OPCODE_LE_WRITE_RF_PATH_COMP"; break;
case HCI_OPCODE_LE_READ_RF_PATH_COMP: ret = "HCI_OPCODE_LE_READ_RF_PATH_COMP"; break;
case HCI_OPCODE_LE_SET_PRIVACY_MODE: ret = "HCI_OPCODE_LE_SET_PRIVACY_MODE"; break;
/* Version 5.1 */
case HCI_OPCODE_LE_RECEIVER_TEST_V3: ret = "HCI_OPCODE_LE_RECEIVER_TEST_V3"; break;
case HCI_OPCODE_LE_TRANSMITTER_TEST_V3: ret = "HCI_OPCODE_LE_TRANSMITTER_TEST_V3"; break;
case HCI_OPCODE_LE_SET_CONNLESS_CTE_TX_PARAMS: ret = "HCI_OPCODE_LE_SET_CONNLESS_CTE_TX_PARAMS"; break;
case HCI_OPCODE_LE_SET_CONNLESS_CTE_TX_ENABLE: ret = "HCI_OPCODE_LE_SET_CONNLESS_CTE_TX_ENABLE"; break;
case HCI_OPCODE_LE_SET_CONNLESS_IQ_SAMP_ENABLE: ret = "HCI_OPCODE_LE_SET_CONNLESS_IQ_SAMP_ENABLE"; break;
case HCI_OPCODE_LE_SET_CONN_CTE_RX_PARAMS: ret = "HCI_OPCODE_LE_SET_CONN_CTE_RX_PARAMS"; break;
case HCI_OPCODE_LE_SET_CONN_CTE_TX_PARAMS: ret = "HCI_OPCODE_LE_SET_CONN_CTE_TX_PARAMS"; break;
case HCI_OPCODE_LE_CONN_CTE_REQ_ENABLE: ret = "HCI_OPCODE_LE_CONN_CTE_REQ_ENABLE"; break;
case HCI_OPCODE_LE_CONN_CTE_RSP_ENABLE: ret = "HCI_OPCODE_LE_CONN_CTE_RSP_ENABLE"; break;
case HCI_OPCODE_LE_READ_ANTENNA_INFO: ret = "HCI_OPCODE_LE_READ_ANTENNA_INFO"; break;
case HCI_OPCODE_LE_SET_PER_ADV_RCV_ENABLE: ret = "HCI_OPCODE_LE_SET_PER_ADV_RCV_ENABLE"; break;
case HCI_OPCODE_LE_PER_ADV_SYNC_TRANSFER: ret = "HCI_OPCODE_LE_PER_ADV_SYNC_TRANSFER"; break;
case HCI_OPCODE_LE_PER_ADV_SET_INFO_TRANSFER: ret = "HCI_OPCODE_LE_PER_ADV_SET_INFO_TRANSFER"; break;
case HCI_OPCODE_LE_SET_PAST_PARAM: ret = "HCI_OPCODE_LE_SET_PAST_PARAM"; break;
case HCI_OPCODE_LE_SET_DEFAULT_PAST_PARAM: ret = "HCI_OPCODE_LE_SET_DEFAULT_PAST_PARAM"; break;
case HCI_OPCODE_LE_GENERATE_DHKEY_V2: ret = "HCI_OPCODE_LE_GENERATE_DHKEY_V2"; break;
case HCI_OPCODE_LE_MODIFY_SLEEP_CLK_ACC: ret = "HCI_OPCODE_LE_MODIFY_SLEEP_CLK_ACC"; break;
/* Version 5.2 */
case HCI_OPCODE_LE_READ_BUF_SIZE_V2: ret = "HCI_OPCODE_LE_READ_BUF_SIZE_V2"; break;
case HCI_OPCODE_LE_READ_ISO_TX_SYNC: ret = "HCI_OPCODE_LE_READ_ISO_TX_SYNC"; break;
case HCI_OPCODE_LE_SET_CIG_PARAMS: ret = "HCI_OPCODE_LE_SET_CIG_PARAMS"; break;
case HCI_OPCODE_LE_SET_CIG_PARAMS_TEST: ret = "HCI_OPCODE_LE_SET_CIG_PARAMS_TEST"; break;
case HCI_OPCODE_LE_CREATE_CIS: ret = "HCI_OPCODE_LE_CREATE_CIS"; break;
case HCI_OPCODE_LE_REMOVE_CIG: ret = "HCI_OPCODE_LE_REMOVE_CIG"; break;
case HCI_OPCODE_LE_ACCEPT_CIS_REQ: ret = "HCI_OPCODE_LE_ACCEPT_CIS_REQ"; break;
case HCI_OPCODE_LE_REJECT_CIS_REQ: ret = "HCI_OPCODE_LE_REJECT_CIS_REQ"; break;
case HCI_OPCODE_LE_CREATE_BIG: ret = "HCI_OPCODE_LE_CREATE_BIG"; break;
case HCI_OPCODE_LE_CREATE_BIG_TEST: ret = "HCI_OPCODE_LE_CREATE_BIG_TEST"; break;
case HCI_OPCODE_LE_TERMINATE_BIG: ret = "HCI_OPCODE_LE_TERMINATE_BIG"; break;
case HCI_OPCODE_LE_BIG_CREATE_SYNC: ret = "HCI_OPCODE_LE_BIG_CREATE_SYNC"; break;
case HCI_OPCODE_LE_BIG_TERMINATE_SYNC: ret = "HCI_OPCODE_LE_BIG_TERMINATE_SYNC"; break;
case HCI_OPCODE_LE_REQUEST_PEER_SCA: ret = "HCI_OPCODE_LE_REQUEST_PEER_SCA"; break;
case HCI_OPCODE_LE_SETUP_ISO_DATA_PATH: ret = "HCI_OPCODE_LE_SETUP_ISO_DATA_PATH"; break;
case HCI_OPCODE_LE_REMOVE_ISO_DATA_PATH: ret = "HCI_OPCODE_LE_REMOVE_ISO_DATA_PATH"; break;
case HCI_OPCODE_LE_ISO_TX_TEST: ret = "HCI_OPCODE_LE_ISO_TX_TEST"; break;
case HCI_OPCODE_LE_ISO_RX_TEST: ret = "HCI_OPCODE_LE_ISO_RX_TEST"; break;
case HCI_OPCODE_LE_ISO_READ_TEST_COUNTERS: ret = "HCI_OPCODE_LE_ISO_READ_TEST_COUNTERS"; break;
case HCI_OPCODE_LE_ISO_TEST_END: ret = "HCI_OPCODE_LE_ISO_TEST_END"; break;
case HCI_OPCODE_LE_SET_HOST_FEATURE: ret = "HCI_OPCODE_LE_SET_HOST_FEATURE"; break;
case HCI_OPCODE_LE_READ_ISO_LINK_QUAL: ret = "HCI_OPCODE_LE_READ_ISO_LINK_QUAL"; break;
case HCI_OPCODE_LE_READ_ENHANCED_TX_POWER: ret = "HCI_OPCODE_LE_READ_ENHANCED_TX_POWER"; break;
case HCI_OPCODE_LE_READ_REMOTE_TX_POWER: ret = "HCI_OPCODE_LE_READ_REMOTE_TX_POWER"; break;
case HCI_OPCODE_LE_SET_PATH_LOSS_REPORTING_PARAMS: ret = "HCI_OPCODE_LE_SET_PATH_LOSS_REPORTING_PARAMS"; break;
case HCI_OPCODE_LE_SET_PATH_LOSS_REPORTING_ENABLE: ret = "HCI_OPCODE_LE_SET_PATH_LOSS_REPORTING_ENABLE"; break;
case HCI_OPCODE_LE_SET_TX_POWER_REPORT_ENABLE: ret = "HCI_OPCODE_LE_SET_TX_POWER_REPORT_ENABLE"; break;
}
#else // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
static char ret[5] = "0000";
sprintf(ret, "%04x", opcode);
#endif // MBED_CONF_BLE_TRACE_HUMAN_READABLE_ENUMS
return ret;
}
#endif //MBED_CONF_MBED_TRACE_ENABLE
const char *to_string(const UUID& uuid)
{
static constexpr const size_t ROW_COUNT = 4;
static constexpr const char *HEX = "0123456789ABCDEF";
static constexpr const size_t HYPHENS_DELIMITER_COUNT = 4;
/*
* For each hex digit, we require 2 bytes. So, we need at most 2 * 16 = 32 bytes for the hex digits.
* In the case of 128-bit UUIDs, we also need space for 4 hyphen delimiters.
* An additional byte is required at the end of each array to store the null terminator.
*/
static char string_buffer[ROW_COUNT][2 * UUID::LENGTH_OF_LONG_UUID + HYPHENS_DELIMITER_COUNT + 1];
static uint8_t idx = 0;
++idx;
if (idx == ROW_COUNT) {
idx= 0;
}
const uint8_t length = uuid.getLen();
const char *reader = (const char *) uuid.getBaseUUID() + length - 1;
char* writer = string_buffer[idx];
if (length == UUID::LENGTH_OF_LONG_UUID) {
constexpr uint8_t format[] = {4, 2, 2, 2, 6};
for ( uint8_t char_count: format) {
for (size_t i = 0; i < char_count; ++i) {
*writer++ = HEX[(*reader >> 4) & 0xF];
*writer++ = HEX[(*reader--) & 0xF];
}
*writer++ = '-';
}
*--writer = 0;
} else {
for (size_t i = 0; i < length; ++i) {
*writer++ = HEX[(*reader >> 4) & 0xF];
*writer++ = HEX[(*reader--) & 0xF];
}
*writer = 0;
}
return string_buffer[idx];
}
const char *to_string(bool v)
{
if (v) {
return "true";
} else {
return "false";
}
}
const char *to_string(ble::SecurityManager::SecurityIOCapabilities_t capabilities)
{
switch(capabilities) {
case ble::SecurityManager::IO_CAPS_DISPLAY_ONLY:
return "IO_CAPS_DISPLAY_ONLY";
case ble::SecurityManager::IO_CAPS_DISPLAY_YESNO:
return "IO_CAPS_DISPLAY_YESNO";
case ble::SecurityManager::IO_CAPS_KEYBOARD_DISPLAY:
return "IO_CAPS_KEYBOARD_DISPLAY";
case ble::SecurityManager::IO_CAPS_KEYBOARD_ONLY:
return "IO_CAPS_KEYBOARD_ONLY";
case ble::SecurityManager::IO_CAPS_NONE:
return "IO_CAPS_NONE";
default:
return "unknown";
}
}
const char *to_string(ble::io_capability_t capabilities)
{
switch (capabilities.value()) {
case ble::io_capability_t::DISPLAY_ONLY:
return "DISPLAY_ONLY";
case ble::io_capability_t::DISPLAY_YES_NO:
return "IO_CAPS_DISPLAY_DISPLAY_YES_NOYESNO";
case ble::io_capability_t::KEYBOARD_ONLY:
return "KEYBOARD_ONLY";
case ble::io_capability_t::NO_INPUT_NO_OUTPUT:
return "NO_INPUT_NO_OUTPUT";
case ble::io_capability_t::KEYBOARD_DISPLAY:
return "KEYBOARD_DISPLAY";
default:
return "unknown";
}
}
const char *to_string(ble::SecurityManager::SecurityMode_t security_mode)
{
switch (security_mode) {
case ble::SecurityManager::SECURITY_MODE_NO_ACCESS:
return "SECURITY_MODE_NO_ACCESS";
case ble::SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK:
return "SECURITY_MODE_ENCRYPTION_OPEN_LINK";
case ble::SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM:
return "SECURITY_MODE_ENCRYPTION_NO_MITM";
case ble::SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM:
return "SECURITY_MODE_ENCRYPTION_WITH_MITM";
case ble::SecurityManager::SECURITY_MODE_SIGNED_NO_MITM:
return "SECURITY_MODE_SIGNED_NO_MITM";
case ble::SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM:
return "SECURITY_MODE_SIGNED_WITH_MITM";
default:
return "Unknown";
}
}
const char *passkey_str(const uint8_t* passkey)
{
if (!passkey) {
return "0";
} else {
return (mbed_trace_array)(passkey, 6);
}
}
const char *to_string(const ble::address_t& address)
{
return (mbed_trace_array)(address.data(), address.size());
}
const char *to_string(const ble::link_encryption_t encryption)
{
using link_encryption_t = ble::link_encryption_t;
switch (encryption.value()) {
case link_encryption_t::NOT_ENCRYPTED:
return "NOT_ENCRYPTED";
case link_encryption_t::ENCRYPTION_IN_PROGRESS:
return "ENCRYPTION_IN_PROGRESS";
case link_encryption_t::ENCRYPTED:
return "ENCRYPTED";
case link_encryption_t::ENCRYPTED_WITH_MITM:
return "ENCRYPTED_WITH_MITM";
case link_encryption_t::ENCRYPTED_WITH_SC_AND_MITM:
return "ENCRYPTED_WITH_SC_AND_MITM";
default:
return "Unknown";
}
}
const char *to_string(Keypress_t keypress)
{
switch (keypress) {
case KEYPRESS_STARTED:
return "KEYPRESS_STARTED";
case KEYPRESS_ENTERED:
return "KEYPRESS_ENTERED";
case KEYPRESS_ERASED:
return "KEYPRESS_ERASED";
case KEYPRESS_CLEARED:
return "KEYPRESS_CLEARED";
case KEYPRESS_COMPLETED:
return "KEYPRESS_COMPLETED";
default:
return "Unknown";
}
}
const char *to_string(ble::pairing_failure_t reason)
{
switch (reason.value()) {
case ble::pairing_failure_t::PASSKEY_ENTRY_FAILED:
return "PASSKEY_ENTRY_FAILED";
case ble::pairing_failure_t::OOB_NOT_AVAILABLE:
return "OOB_NOT_AVAILABLE";
case ble::pairing_failure_t::AUTHENTICATION_REQUIREMENTS:
return "AUTHENTICATION_REQUIREMENTS";
case ble::pairing_failure_t::CONFIRM_VALUE_FAILED:
return "CONFIRM_VALUE_FAILED";
case ble::pairing_failure_t::PAIRING_NOT_SUPPORTED:
return "PAIRING_NOT_SUPPORTED";
case ble::pairing_failure_t::ENCRYPTION_KEY_SIZE:
return "ENCRYPTION_KEY_SIZE";
case ble::pairing_failure_t::COMMAND_NOT_SUPPORTED:
return "COMMAND_NOT_SUPPORTED";
case ble::pairing_failure_t::UNSPECIFIED_REASON:
return "UNSPECIFIED_REASON";
case ble::pairing_failure_t::REPEATED_ATTEMPTS:
return "REPEATED_ATTEMPTS";
case ble::pairing_failure_t::INVALID_PARAMETERS:
return "INVALID_PARAMETERS";
case ble::pairing_failure_t::DHKEY_CHECK_FAILED:
return "DHKEY_CHECK_FAILED";
case ble::pairing_failure_t::NUMERIC_COMPARISON_FAILED:
return "NUMERIC_COMPARISON_FAILED";
case ble::pairing_failure_t::BR_EDR_PAIRING_IN_PROGRESS:
return "BR_EDR_PAIRING_IN_PROGRESS";
case ble::pairing_failure_t::CROSS_TRANSPORT_KEY_DERIVATION_OR_GENERATION_NOT_ALLOWED:
return "CROSS_TRANSPORT_KEY_DERIVATION_OR_GENERATION_NOT_ALLOWED";
default:
return "Unknown";
}
}
const char *to_string(target_peer_address_type_t type)
{
if (type == target_peer_address_type_t::PUBLIC) {
return "PUBLIC";
} else {
return "RANDOM";
}
}
const char *to_string(privacy_mode_t mode)
{
if (mode == privacy_mode_t::NETWORK) {
return "NETWORK";
} else {
return "DEVICE";
}
}
const char *to_string(ble::advertising_type_t advType)
{
switch (advType.value()) {
case ble::advertising_type_t::CONNECTABLE_UNDIRECTED:
return "CONNECTABLE_UNDIRECTED";
case ble::advertising_type_t::CONNECTABLE_DIRECTED:
return "CONNECTABLE_DIRECTED";
case ble::advertising_type_t::SCANNABLE_UNDIRECTED:
return "SCANNABLE_UNDIRECTED";
case ble::advertising_type_t::NON_CONNECTABLE_UNDIRECTED:
return "NON_CONNECTABLE_UNDIRECTED";
case ble::advertising_type_t::CONNECTABLE_DIRECTED_LOW_DUTY:
return "CONNECTABLE_DIRECTED_LOW_DUTY";
case ble::advertising_type_t::CONNECTABLE_NON_SCANNABLE_UNDIRECTED:
return "CONNECTABLE_NON_SCANNABLE_UNDIRECTED";
default:
return "unknown";
}
}
const char *to_string(ble::own_address_type_t addressType)
{
switch (addressType.value()) {
case ble::own_address_type_t::PUBLIC:
return "PUBLIC";
case ble::own_address_type_t::RANDOM:
return "RANDOM";
case ble::own_address_type_t::RESOLVABLE_PRIVATE_ADDRESS_PUBLIC_FALLBACK:
return "RESOLVABLE_PRIVATE_ADDRESS_PUBLIC_FALLBACK";
case ble::own_address_type_t::RESOLVABLE_PRIVATE_ADDRESS_RANDOM_FALLBACK:
return "RESOLVABLE_PRIVATE_ADDRESS_RANDOM_FALLBACK";
default:
return "unknown";
}
}
const char *to_string(ble::advertising_filter_policy_t policy)
{
switch (policy.value()) {
case ble::advertising_filter_policy_t::NO_FILTER:
return "NO_FILTER";
case ble::advertising_filter_policy_t::FILTER_SCAN_REQUESTS:
return "FILTER_SCAN_REQUESTS";
case ble::advertising_filter_policy_t::FILTER_CONNECTION_REQUEST:
return "FILTER_CONNECTION_REQUEST";
case ble::advertising_filter_policy_t::FILTER_SCAN_AND_CONNECTION_REQUESTS:
return "FILTER_SCAN_AND_CONNECTION_REQUESTS";
default:
return "unknown";
}
}
const char *to_string(ble::phy_t phy)
{
switch (phy.value()) {
case ble::phy_t::NONE:
return "NONE";
case ble::phy_t::LE_1M:
return "LE_1M";
case ble::phy_t::LE_2M:
return "LE_2M";
case ble::phy_t::LE_CODED:
return "LE_CODED";
default:
return "unknown";
}
}
const char *to_string(ble::scanning_filter_policy_t policy)
{
switch (policy.value()) {
case ble::scanning_filter_policy_t::NO_FILTER:
return "NO_FILTER";
case ble::scanning_filter_policy_t::FILTER_ADVERTISING:
return "FILTER_ADVERTISING";
case ble::scanning_filter_policy_t::NO_FILTER_INCLUDE_UNRESOLVABLE_DIRECTED:
return "NO_FILTER_INCLUDE_UNRESOLVABLE_DIRECTED";
case ble::scanning_filter_policy_t::FILTER_ADVERTISING_INCLUDE_UNRESOLVABLE_DIRECTED:
return "FILTER_ADVERTISING_INCLUDE_UNRESOLVABLE_DIRECTED";
default:
return "unknown";
}
}
const char *to_string(ble::duplicates_filter_t filtering)
{
switch (filtering.value()) {
case ble::duplicates_filter_t::ENABLE:
return "ENABLE";
case ble::duplicates_filter_t::DISABLE:
return "DISABLE";
case ble::duplicates_filter_t::PERIODIC_RESET:
return "PERIODIC_RESET";
default:
return "unknown";
}
}
const char *to_string(ble::peer_address_type_t addressType)
{
switch (addressType.value()) {
case ble::peer_address_type_t::PUBLIC:
return "PUBLIC";
case ble::peer_address_type_t::RANDOM:
return "RANDOM";
case ble::peer_address_type_t::PUBLIC_IDENTITY:
return "PUBLIC_IDENTITY";
case ble::peer_address_type_t::RANDOM_STATIC_IDENTITY:
return "RANDOM_STATIC_IDENTITY";
case ble::peer_address_type_t::ANONYMOUS:
return "ANONYMOUS";
default:
return "unknown";
}
}
const char *to_string(ble::initiator_filter_policy_t policy)
{
switch(policy.value()) {
case ble::initiator_filter_policy_t::NO_FILTER:
return "NO_FILTER";
case ble::initiator_filter_policy_t::USE_WHITE_LIST:
return "USE_WHITE_LIST";
default:
return "unknown";
}
}
const char *to_string(ble::coded_symbol_per_bit_t sym)
{
switch (sym.value()) {
case ble::coded_symbol_per_bit_t::UNDEFINED:
return "UNDEFINED";
case ble::coded_symbol_per_bit_t::S2:
return "S2";
case ble::coded_symbol_per_bit_t::S8:
return "S8";
default:
return "unknown";
}
}
const char *to_string(ble::local_disconnection_reason_t reason)
{
switch (reason.value()) {
case ble::local_disconnection_reason_t::AUTHENTICATION_FAILURE:
return "AUTHENTICATION_FAILURE";
case ble::local_disconnection_reason_t::USER_TERMINATION:
return "USER_TERMINATION";
case ble::local_disconnection_reason_t::LOW_RESOURCES:
return "LOW_RESOURCES";
case ble::local_disconnection_reason_t::POWER_OFF:
return "POWER OFF";
case ble::local_disconnection_reason_t::UNSUPPORTED_REMOTE_FEATURE:
return "UNSUPPORTED_REMOTE_FEATURE";
case ble::local_disconnection_reason_t::PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
return "PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED";
case ble::local_disconnection_reason_t::UNACCEPTABLE_CONNECTION_PARAMETERS:
return "UNACCEPTABLE_CONNECTION_PARAMETERS";
default:
return "unknown";
}
}
const char *to_string(ble::advertising_channel_map_t map)
{
switch (map.value()) {
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_37:
return "[001]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_38:
return "[010]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_37_AND_38:
return "[011]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_39:
return "[100]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_37_AND_39:
return "[101]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_38_AND_39:
return "[110]";
case ble::advertising_channel_map_t::ALL_ADVERTISING_CHANNELS:
return "[111]";
default:
return "unknown";
}
}
const char *to_string(ble::connection_peer_address_type_t connection_peer_address_type)
{
switch (connection_peer_address_type.value()) {
case ble::connection_peer_address_type_t::PUBLIC_ADDRESS:
return "PUBLIC_ADDRESS";
case ble::connection_peer_address_type_t::RANDOM_ADDRESS:
return "RANDOM_ADDRESS";
case ble::connection_peer_address_type_t::PUBLIC_IDENTITY_ADDRESS:
return "PUBLIC_IDENTITY_ADDRESS";
case ble::connection_peer_address_type_t::RANDOM_IDENTITY_ADDRESS:
return "RANDOM_IDENTITY_ADDRESS";
default:
return "unknown";
}
}
const char *to_string(ble::whitelist_address_type_t whitelist_address_type)
{
if (whitelist_address_type.value() == ble::whitelist_address_type_t::PUBLIC_DEVICE_ADDRESS) {
return "PUBLIC_DEVICE_ADDRESS";
} else {
return "RANDOM_DEVICE_ADDRESS";
}
}
const char *to_string(ble::hci_error_code_t error)
{
switch (error.value()) {
case ble::hci_error_code_t::SUCCESS:
return "SUCCESS";
case ble::hci_error_code_t::UNKNOWN_HCI_COMMAND:
return "UNKNOWN_HCI_COMMAND";
case ble::hci_error_code_t::UNKNOWN_CONNECTION_IDENTIFIER:
return "UNKNOWN_CONNECTION_IDENTIFIER";
case ble::hci_error_code_t::HARDWARE_FAILLURE:
return "HARDWARE_FAILLURE";
case ble::hci_error_code_t::PAGE_TIMEOUT:
return "PAGE_TIMEOUT";
case ble::hci_error_code_t::AUTHENTICATION_FAILLURE:
return "AUTHENTICATION_FAILLURE";
case ble::hci_error_code_t::PIN_OR_KEY_MISSING:
return "PIN_OR_KEY_MISSING";
case ble::hci_error_code_t::MEMORY_CAPACITY_EXCEEDED:
return "MEMORY_CAPACITY_EXCEEDED";
case ble::hci_error_code_t::CONNECTION_TIMEOUT:
return "CONNECTION_TIMEOUT";
case ble::hci_error_code_t::CONNECTION_LIMIT_EXCEEDED:
return "CONNECTION_LIMIT_EXCEEDED";
case ble::hci_error_code_t::SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED:
return "SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED";
case ble::hci_error_code_t::CONNECTION_ALREADY_EXIST:
return "CONNECTION_ALREADY_EXIST";
case ble::hci_error_code_t::COMMAND_DISALLOWED:
return "COMMAND_DISALLOWED";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES:
return "CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS:
return "CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR:
return "CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR";
case ble::hci_error_code_t::CONNECTION_ACCEPT_TIMEOUT_EXCEEDED:
return "CONNECTION_ACCEPT_TIMEOUT_EXCEEDED";
case ble::hci_error_code_t::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE:
return "UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE";
case ble::hci_error_code_t::INVALID_HCI_COMMAND_PARAMETERS:
return "INVALID_HCI_COMMAND_PARAMETERS";
case ble::hci_error_code_t::REMOTE_USER_TERMINATED_CONNECTION:
return "REMOTE_USER_TERMINATED_CONNECTION";
case ble::hci_error_code_t::REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES:
return "REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES";
case ble::hci_error_code_t::REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF:
return "REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF";
case ble::hci_error_code_t::CONNECTION_TERMINATED_BY_LOCAL_HOST:
return "CONNECTION_TERMINATED_BY_LOCAL_HOST";
case ble::hci_error_code_t::REPEATED_ATTEMPTS:
return "REPEATED_ATTEMPTS";
case ble::hci_error_code_t::PAIRING_NOT_ALLOWED:
return "PAIRING_NOT_ALLOWED";
case ble::hci_error_code_t::UNKNOWN_LMP_PDU:
return "UNKNOWN_LMP_PDU";
case ble::hci_error_code_t::UNSUPPORTED_REMOTE_FEATURE | ble::hci_error_code_t::UNSUPPORTED_LMP_FEATURE:
return "UNSUPPORTED_REMOTE_FEATURE/UNSUPPORTED_LMP_FEATURE";
case ble::hci_error_code_t::SCO_OFFSET_REJECTED:
return "SCO_OFFSET_REJECTED";
case ble::hci_error_code_t::SCO_INTERVAL_REJECTED:
return "SCO_INTERVAL_REJECTED";
case ble::hci_error_code_t::SCO_AIR_MODE_REJECTED:
return "SCO_AIR_MODE_REJECTED";
case ble::hci_error_code_t::INVALID_LMP_PARAMETERS | ble::hci_error_code_t::INVALID_LL_PARAMETERS:
return "INVALID_LMP_PARAMETERS/INVALID_LL_PARAMETERS";
case ble::hci_error_code_t::UNSPECIFIED_ERROR:
return "UNSPECIFIED_ERROR";
case ble::hci_error_code_t::UNSUPPORTED_LMP_PARAMETER_VALUE | ble::hci_error_code_t::UNSUPPORTED_LL_PARAMETER_VALUE:
return "UNSUPPORTED_LMP_PARAMETER_VALUE/UNSUPPORTED_LL_PARAMETER_VALUE";
case ble::hci_error_code_t::ROLE_CHANGE_NOT_ALLOWED:
return "ROLE_CHANGE_NOT_ALLOWED";
case ble::hci_error_code_t::LMP_RESPONSE_TIMEOUT | ble::hci_error_code_t::LL_RESPONSE_TIMEOUT:
return "LMP_RESPONSE_TIMEOUT/LL_RESPONSE_TIMEOUT";
case ble::hci_error_code_t::LMP_ERROR_TRANSACTION_COLLISION | ble::hci_error_code_t::LL_PROCEDURE_COLLISION:
return "LMP_ERROR_TRANSACTION_COLLISION/LL_PROCEDURE_COLLISION";
case ble::hci_error_code_t::LMP_PDU_NOT_ALLOWED:
return "LMP_PDU_NOT_ALLOWED";
case ble::hci_error_code_t::ENCRYPTION_MODE_NOT_ACCEPTABLE:
return "ENCRYPTION_MODE_NOT_ACCEPTABLE";
case ble::hci_error_code_t::LINK_KEY_CANNOT_BE_CHANGED:
return "LINK_KEY_CANNOT_BE_CHANGED";
case ble::hci_error_code_t::REQUESTED_QOS_NOT_SUPPORTED:
return "REQUESTED_QOS_NOT_SUPPORTED";
case ble::hci_error_code_t::INSTANT_PASSED:
return "INSTANT_PASSED";
case ble::hci_error_code_t::PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
return "PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED";
case ble::hci_error_code_t::DIFFERENT_TRANSACTION_COLLISION:
return "DIFFERENT_TRANSACTION_COLLISION";
case ble::hci_error_code_t::RESERVED_FOR_FUTURE_USE:
return "RESERVED_FOR_FUTURE_USE";
case ble::hci_error_code_t::QOS_UNACCEPTABLE_PARAMETER:
return "QOS_UNACCEPTABLE_PARAMETER";
case ble::hci_error_code_t::QOS_REJECTED:
return "QOS_REJECTED";
case ble::hci_error_code_t::CHANNEL_CLASSIFICATION_NOT_SUPPORTED:
return "CHANNEL_CLASSIFICATION_NOT_SUPPORTED";
case ble::hci_error_code_t::INSUFFICIENT_SECURITY:
return "INSUFFICIENT_SECURITY";
case ble::hci_error_code_t::PARAMETER_OUT_OF_MANDATORY_RANGE:
return "PARAMETER_OUT_OF_MANDATORY_RANGE";
case ble::hci_error_code_t::ROLE_SWITCH_PENDING:
return "ROLE_SWITCH_PENDING";
case ble::hci_error_code_t::RESERVED_SLOT_VIOLATION:
return "RESERVED_SLOT_VIOLATION";
case ble::hci_error_code_t::ROLE_SWITCH_FAILED:
return "ROLE_SWITCH_FAILED";
case ble::hci_error_code_t::EXTENDED_INQUIRY_RESPONSE_TOO_LARGE:
return "EXTENDED_INQUIRY_RESPONSE_TOO_LARGE";
case ble::hci_error_code_t::SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST:
return "SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST";
case ble::hci_error_code_t::HOST_BUSY_PAIRING:
return "HOST_BUSY_PAIRING";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND:
return "CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND";
case ble::hci_error_code_t::CONTROLLER_BUSY:
return "CONTROLLER_BUSY";
case ble::hci_error_code_t::UNACCEPTABLE_CONNECTION_PARAMETERS:
return "UNACCEPTABLE_CONNECTION_PARAMETERS";
case ble::hci_error_code_t::ADVERTISING_TIMEOUT:
return "ADVERTISING_TIMEOUT";
case ble::hci_error_code_t::CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE:
return "CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE";
case ble::hci_error_code_t::CONNECTION_FAILED_TO_BE_ESTABLISHED:
return "CONNECTION_FAILED_TO_BE_ESTABLISHED";
case ble::hci_error_code_t::MAC_CONNECTION_FAILED:
return "MAC_CONNECTION_FAILED";
case ble::hci_error_code_t::COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING:
return "COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING";
case ble::hci_error_code_t::TYPE0_SUBMAP_NOT_DEFINED:
return "TYPE0_SUBMAP_NOT_DEFINED";
case ble::hci_error_code_t::UNKNOWN_ADVERTISING_IDENTIFIER:
return "UNKNOWN_ADVERTISING_IDENTIFIER";
case ble::hci_error_code_t::LIMIT_REACHED:
return "LIMIT_REACHED";
case ble::hci_error_code_t::OPERATION_CANCELLED_BY_HOST:
return "OPERATION_CANCELLED_BY_HOST";
default:
return "unknown";
}
}
const char *to_string(ble::advertising_fragment_description_t fragment_description)
{
switch (fragment_description.value()) {
case ble::advertising_fragment_description_t::INTERMEDIATE_FRAGMENT:
return "INTERMEDIATE_FRAGMENT";
case ble::advertising_fragment_description_t::FIRST_FRAGMENT:
return "FIRST_FRAGMENT";
case ble::advertising_fragment_description_t::LAST_FRAGMENT:
return "LAST_FRAGMENT";
case ble::advertising_fragment_description_t::COMPLETE_FRAGMENT:
return "COMPLETE_FRAGMENT";
case ble::advertising_fragment_description_t::UNCHANGED_DATA:
return "UNCHANGED_DATA";
default:
return "unknown";
}
}
const char *to_string(ble::peripheral_privacy_configuration_t::resolution_strategy_t resolution_strategy)
{
switch (resolution_strategy) {
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::DO_NOT_RESOLVE:
return "DO_NOT_RESOLVE";
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::REJECT_NON_RESOLVED_ADDRESS:
return "REJECT_NON_RESOLVED_ADDRESS";
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::PERFORM_PAIRING_PROCEDURE:
return "PERFORM_PAIRING_PROCEDURE";
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::PERFORM_AUTHENTICATION_PROCEDURE:
return "PERFORM_AUTHENTICATION_PROCEDURE";
default:
return "unknown";
}
}
const char *to_string(ble::GapEventType event_type)
{
switch (event_type.value()) {
case ble::GapEventType::type::UNEXPECTED_ERROR:
return "UNEXPECTED_ERROR";
case ble::GapEventType::type::CONNECTION_COMPLETE:
return "CONNECTION_COMPLETE";
case ble::GapEventType::type::ADVERTISING_REPORT:
return "ADVERTISING_REPORT";
case ble::GapEventType::type::CONNECTION_UPDATE:
return "CONNECTION_UPDATE";
case ble::GapEventType::type::REMOTE_CONNECTION_PARAMETER_REQUEST:
return "REMOTE_CONNECTION_PARAMETER_REQUEST";
case ble::GapEventType::type::DISCONNECTION_COMPLETE:
return "DISCONNECTION_COMPLETE";
default:
return "unknown";
}
}
const char *to_string(ble::received_advertising_type_t type)
{
switch (type.value()) {
case ble::received_advertising_type_t::ADV_IND:
return "ADV_IND";
case ble::received_advertising_type_t::ADV_DIRECT_IND:
return "ADV_DIRECT_IND";
case ble::received_advertising_type_t::ADV_SCAN_IND:
return "ADV_SCAN_IND";
case ble::received_advertising_type_t::ADV_NONCONN_IND:
return "ADV_NONCONN_IND";
case ble::received_advertising_type_t::SCAN_RESPONSE:
return "SCAN_RESPONSE";
default:
return "unknown";
}
}
const char *to_string(ble::connection_role_t role)
{
if (role.value() == ble::connection_role_t::CENTRAL) {
return "CENTRAL";
} else {
return "PERIPHERAL";
}
}
const char *to_string(ble::direct_address_type_t direct_address_type)
{
switch (direct_address_type.value()) {
case ble::direct_address_type_t::PUBLIC_ADDRESS:
return "PUBLIC_ADDRESS";
case ble::direct_address_type_t::RANDOM_ADDRESS:
return "RANDOM_ADDRESS";
case ble::direct_address_type_t::PUBLIC_IDENTITY_ADDRESS:
return "PUBLIC_IDENTITY_ADDRESS";
case ble::direct_address_type_t::RANDOM_IDENTITY_ADDRESS:
return "RANDOM_IDENTITY_ADDRESS";
case ble::direct_address_type_t::RANDOM_DEVICE_ADDRESS:
return "RANDOM_DEVICE_ADDRESS";
default:
return "unknown";
}
}
const char *to_string(ble::advertising_data_status_t data_status) {
switch (data_status.value()) {
case ble::advertising_data_status_t::COMPLETE:
return "COMPLETE";
case ble::advertising_data_status_t::INCOMPLETE_MORE_DATA:
return "INCOMPLETE_MORE_DATA";
case ble::advertising_data_status_t::INCOMPLETE_DATA_TRUNCATED:
return "INCOMPLETE_DATA_TRUNCATED";
default:
return "unknown";
}
}
const char *to_string(ble::att_security_requirement_t security_requirement)
{
switch (security_requirement.value()) {
case ble::att_security_requirement_t::NONE:
return "NONE";
case ble::att_security_requirement_t::UNAUTHENTICATED:
return "UNAUTHENTICATED";
case ble::att_security_requirement_t::AUTHENTICATED:
return "AUTHENTICATED";
case ble::att_security_requirement_t::SC_AUTHENTICATED:
return "SC_AUTHENTICATED";
default:
return "unknown";
}
}
const char *to_string(GattAuthCallbackReply_t authorization_reply)
{
switch (authorization_reply) {
case AUTH_CALLBACK_REPLY_SUCCESS:
return "SUCCESS";
case AUTH_CALLBACK_REPLY_ATTERR_INVALID_HANDLE:
return "INVALID_HANDLE";
case AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED:
return "READ_NOT_PERMITTED";
case AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED:
return "WRITE_NOT_PERMITTED";
case AUTH_CALLBACK_REPLY_ATTERR_INVALID_PDU:
return "INVALID_PDU";
case AUTH_CALLBACK_REPLY_ATTERR_INSUFFICIENT_AUTHENTICATION:
return "INSUFFICIENT_AUTHENTICATION";
case AUTH_CALLBACK_REPLY_ATTERR_REQUEST_NOT_SUPPORTED:
return "REQUEST_NOT_SUPPORTED";
case AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET:
return "INVALID_OFFSET";
case AUTH_CALLBACK_REPLY_ATTERR_INSUFFICIENT_AUTHORIZATION:
return "INSUFFICIENT_AUTHORIZATION";
case AUTH_CALLBACK_REPLY_ATTERR_PREPARE_QUEUE_FULL:
return "PREPARE_QUEUE_FULL";
case AUTH_CALLBACK_REPLY_ATTERR_ATTRIBUTE_NOT_FOUND:
return "ATTRIBUTE_NOT_FOUND";
case AUTH_CALLBACK_REPLY_ATTERR_ATTRIBUTE_NOT_LONG:
return "ATTRIBUTE_NOT_LONG";
case AUTH_CALLBACK_REPLY_ATTERR_INSUFFICIENT_ENCRYPTION_KEY_SIZE:
return "INSUFFICIENT_ENCRYPTION_KEY_SIZE";
case AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATTRIBUTE_VALUE_LENGTH:
return "INVALID_ATTRIBUTE_VALUE_LENGTH";
case AUTH_CALLBACK_REPLY_ATTERR_UNLIKELY_ERROR:
return "UNLIKELY_ERROR";
case AUTH_CALLBACK_REPLY_ATTERR_INSUFFICIENT_ENCRYPTION:
return "INSUFFICIENT_ENCRYPTION";
case AUTH_CALLBACK_REPLY_ATTERR_UNSUPPORTED_GROUP_TYPE:
return "UNSUPPORTED_GROUP_TYPE";
case AUTH_CALLBACK_REPLY_ATTERR_INSUFFICIENT_RESOURCES:
return "INSUFFICIENT_RESOURCES";
case AUTH_CALLBACK_REPLY_ATTERR_WRITE_REQUEST_REJECTED:
return "WRITE_REQUEST_REJECTED";
case AUTH_CALLBACK_REPLY_ATTERR_CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED:
return "CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED";
case AUTH_CALLBACK_REPLY_ATTERR_PROCEDURE_ALREADY_IN_PROGRESS:
return "PROCEDURE_ALREADY_IN_PROGRESS";
case AUTH_CALLBACK_REPLY_ATTERR_OUT_OF_RANGE:
return "OUT_OF_RANGE";
default:
return "unknown";
}
}
} // namespace ble