diff options
Diffstat (limited to 'bta/hh/bta_hh_act.cc')
-rw-r--r-- | bta/hh/bta_hh_act.cc | 243 |
1 files changed, 109 insertions, 134 deletions
diff --git a/bta/hh/bta_hh_act.cc b/bta/hh/bta_hh_act.cc index 81163c755..bc092b68c 100644 --- a/bta/hh/bta_hh_act.cc +++ b/bta/hh/bta_hh_act.cc @@ -22,25 +22,36 @@ * ******************************************************************************/ -#include "bt_target.h" +#define LOG_TAG "bluetooth" +// BTA_HH_INCLUDED +#include "bt_target.h" // Must be first to define build configuration #if (BTA_HH_INCLUDED == TRUE) -#include <log/log.h> -#include <string.h> +#include <cstdint> +#include <string> -#include "bta_hh_co.h" -#include "bta_hh_int.h" -#include "bta_sys.h" -#include "btm_api.h" -#include "l2c_api.h" -#include "osi/include/osi.h" -#include "utl.h" +#include "bta/hh/bta_hh_int.h" +#include "bta/include/bta_hh_api.h" +#include "bta/include/bta_hh_co.h" +#include "bta/sys/bta_sys.h" +#include "main/shim/dumpsys.h" +#include "osi/include/log.h" +#include "osi/include/osi.h" // UNUSED_ATTR +#include "stack/include/hiddefs.h" +#include "stack/include/hidh_api.h" +#include "types/raw_address.h" /***************************************************************************** * Constants ****************************************************************************/ +namespace { + +constexpr char kBtmLogTag[] = "HIDH"; + +} + /***************************************************************************** * Local Function prototypes ****************************************************************************/ @@ -48,10 +59,8 @@ static void bta_hh_cback(uint8_t dev_handle, const RawAddress& addr, uint8_t event, uint32_t data, BT_HDR* pdata); static tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result); -#if (BTA_HH_DEBUG == TRUE) static const char* bta_hh_get_w4_event(uint16_t event); static const char* bta_hh_hid_event_name(uint16_t event); -#endif /***************************************************************************** * Action Functions @@ -75,8 +84,6 @@ void bta_hh_api_enable(tBTA_HH_DATA* p_data) { memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); - HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask); - /* Register with L2CAP */ if (HID_HostRegister(bta_hh_cback) == HID_SUCCESS) { /* store parameters */ @@ -95,11 +102,9 @@ void bta_hh_api_enable(tBTA_HH_DATA* p_data) { bta_hh_cb.cb_index[xx] = BTA_HH_IDX_INVALID; } -#if (BTA_HH_LE_INCLUDED == TRUE) if (status == BTA_HH_OK) { bta_hh_le_enable(); } else -#endif { /* signal BTA call back event */ tBTA_HH bta_hh; @@ -153,10 +158,10 @@ void bta_hh_api_disable(void) { * ******************************************************************************/ void bta_hh_disc_cmpl(void) { -#if (BTA_HH_LE_INCLUDED == TRUE) + LOG_DEBUG("Disconnect complete"); + HID_HostDeregister(); bta_hh_le_deregister(); -#else tBTA_HH_STATUS status = BTA_HH_OK; /* Deregister with lower layer */ @@ -184,12 +189,10 @@ static void bta_hh_sdp_cback(uint16_t result, uint16_t attr_mask, /* make sure sdp succeeded and hh has not been disabled */ if ((result == SDP_SUCCESS) && (p_cb != NULL)) { /* security is required for the connection, add attr_mask bit*/ - if (p_cb->sec_mask) attr_mask |= HID_SEC_REQUIRED; + attr_mask |= HID_SEC_REQUIRED; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_EVENT("%s: p_cb: %d result 0x%02x, attr_mask 0x%02x, handle %x", __func__, p_cb, result, attr_mask, p_cb->hid_handle); -#endif /* check to see type of device is supported , and should not been added * before */ @@ -244,14 +247,12 @@ static void bta_hh_sdp_cback(uint16_t result, uint16_t attr_mask, * Returns void * ******************************************************************************/ -static void bta_hh_di_sdp_cback(uint16_t result) { +static void bta_hh_di_sdp_cback(tSDP_RESULT result) { tBTA_HH_DEV_CB* p_cb = bta_hh_cb.p_cur; tBTA_HH_STATUS status = BTA_HH_ERR_SDP; tSDP_DI_GET_RECORD di_rec; tHID_STATUS ret; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_EVENT("%s: p_cb: %d result 0x%02x", __func__, p_cb, result); -#endif /* if DI record does not exist on remote device, vendor_id in * tBTA_HH_DEV_DSCP_INFO will be set to 0xffff and we will allow the @@ -279,10 +280,8 @@ static void bta_hh_di_sdp_cback(uint16_t result) { if (ret == HID_SUCCESS) { status = BTA_HH_OK; } else { -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("%s: HID_HostGetSDPRecord failed: Status 0x%2x", __func__, ret); -#endif } } @@ -308,27 +307,23 @@ static void bta_hh_di_sdp_cback(uint16_t result) { * Returns void * ******************************************************************************/ -void bta_hh_start_sdp(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_start_sdp(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { tBTA_HH_STATUS status = BTA_HH_ERR_SDP; uint8_t hdl; - p_cb->sec_mask = p_data->api_conn.sec_mask; p_cb->mode = p_data->api_conn.mode; bta_hh_cb.p_cur = p_cb; -#if (BTA_HH_LE_INCLUDED == TRUE) - if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) { + if (BTM_UseLeLink(p_data->api_conn.bd_addr)) { + p_cb->is_le_device = true; bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr); return; } -#endif /* if previously virtually cabled device, skip SDP */ if (p_cb->app_id) { status = BTA_HH_OK; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("%s: skip SDP for known devices", __func__); -#endif if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { if (HID_HostAddDev(p_cb->addr, p_cb->attr_mask, &hdl) == HID_SUCCESS) { /* update device CB with newly register device handle */ @@ -356,10 +351,8 @@ void bta_hh_start_sdp(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { if (SDP_DiDiscover(p_data->api_conn.bd_addr, bta_hh_cb.p_disc_db, p_bta_hh_cfg->sdp_db_size, bta_hh_di_sdp_cback) != SDP_SUCCESS) { -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("%s: SDP_DiDiscover failed: Status 0x%2X", __func__, status); -#endif status = BTA_HH_ERR_SDP; osi_free_and_reset((void**)&bta_hh_cb.p_disc_db); } else { @@ -396,13 +389,13 @@ void bta_hh_start_sdp(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { + CHECK(p_data != nullptr); + tBTA_HH_CONN conn_dat; tBTA_HH_STATUS status = p_data->status; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("%s: status 0x%2X", __func__, p_data->status); -#endif /* initialize call back data */ memset((void*)&conn_dat, 0, sizeof(tBTA_HH_CONN)); @@ -414,8 +407,6 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { /* not incoming connection doing SDP, initiate a HID connection */ if (!p_cb->incoming_conn) { tHID_STATUS ret; - /* set security level */ - HID_HostSetSecurityLevel("", p_cb->sec_mask); /* open HID connection */ ret = HID_HostOpenDev(p_cb->hid_handle); @@ -429,10 +420,8 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { APPL_TRACE_DEBUG("%s: connection already in progress", __func__); return; } else { -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("%s: HID_HostOpenDev failed: Status 0x%2X", __func__, ret); -#endif /* open fail, remove device from management device list */ HID_HostRemoveDev(p_cb->hid_handle); status = BTA_HH_ERR; @@ -466,9 +455,7 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { /* clean up device control block */ bta_hh_clean_up_kdev(p_cb); } -#if (BTA_HH_DEBUG == TRUE) bta_hh_trace_dev_db(); -#endif } p_cb->incoming_conn = false; p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; @@ -485,32 +472,37 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_api_disc_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { - tBTA_HH_CBDATA disc_dat; - tHID_STATUS status; +extern void btif_hh_remove_device(RawAddress bd_addr); +void bta_hh_api_disc_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { + CHECK(p_cb != nullptr); -#if (BTA_HH_LE_INCLUDED == TRUE) - if (p_cb->is_le_device) - bta_hh_le_api_disc_act(p_cb); - else -#endif - { - /* found an active connection */ - disc_dat.handle = - p_data ? (uint8_t)p_data->hdr.layer_specific : p_cb->hid_handle; - disc_dat.status = BTA_HH_ERR; + if (p_cb->is_le_device) { + LOG_DEBUG("Host initiating close to le device:%s", + PRIVATE_ADDRESS(p_cb->addr)); - status = HID_HostCloseDev(disc_dat.handle); + bta_hh_le_api_disc_act(p_cb); - if (status) { - tBTA_HH bta_hh; - bta_hh.dev_status = disc_dat; - (*bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, &bta_hh); + } else { + const uint8_t hid_handle = + (p_data != nullptr) ? static_cast<uint8_t>(p_data->hdr.layer_specific) + : p_cb->hid_handle; + tHID_STATUS status = HID_HostCloseDev(hid_handle); + if (status != HID_SUCCESS) { + LOG_WARN("Failed closing classic device:%s status:%s", + PRIVATE_ADDRESS(p_cb->addr), hid_status_text(status).c_str()); + } else { + LOG_DEBUG("Host initiated close to classic device:%s", + PRIVATE_ADDRESS(p_cb->addr)); } + tBTA_HH bta_hh = { + .dev_status = {.status = + (status == HID_SUCCESS) ? BTA_HH_OK : BTA_HH_ERR, + .handle = hid_handle}, + }; + (*bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, &bta_hh); } - - return; } + /******************************************************************************* * * Function bta_hh_open_cmpl_act @@ -521,7 +513,7 @@ void bta_hh_api_disc_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { tBTA_HH_CONN conn; uint8_t dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : p_cb->hid_handle; @@ -537,22 +529,23 @@ void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class, p_cb->attr_mask, p_cb->app_id); -#if (BTA_HH_LE_INCLUDED == TRUE) conn.status = p_cb->status; conn.le_hid = p_cb->is_le_device; conn.scps_supported = p_cb->scps_supported; + BTM_LogHistory(kBtmLogTag, p_cb->addr, "Opened", + base::StringPrintf( + "%s initiator:%s", (p_cb->is_le_device) ? "le" : "classic", + (p_cb->incoming_conn) ? "remote" : "local")); + if (!p_cb->is_le_device) -#endif { /* inform role manager */ bta_sys_conn_open(BTA_ID_HH, p_cb->app_id, p_cb->addr); } /* set protocol mode when not default report mode */ if (p_cb->mode != BTA_HH_PROTO_RPT_MODE -#if (BTA_HH_LE_INCLUDED == TRUE) && !p_cb->is_le_device -#endif ) { if ((HID_HostWriteDev(dev_handle, HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE, 0, 0, NULL)) != @@ -580,15 +573,13 @@ void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_open_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_open_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { tBTA_HH_API_CONN conn_data; uint8_t dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : p_cb->hid_handle; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_EVENT("%s: Device[%d] connected", __func__, dev_handle); -#endif /* SDP has been done */ if (p_cb->app_id != 0) { @@ -620,7 +611,7 @@ void bta_hh_open_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_data_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_data_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { BT_HDR* pdata = p_data->hid_cback.p_data; uint8_t* p_rpt = (uint8_t*)(pdata + 1) + pdata->offset; @@ -641,11 +632,9 @@ void bta_hh_data_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_handsk_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { -#if (BTA_HH_DEBUG == TRUE) +void bta_hh_handsk_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d", bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); -#endif tBTA_HH bta_hh; memset(&bta_hh, 0, sizeof(tBTA_HH)); @@ -690,9 +679,7 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { bta_hh.conn.handle = p_cb->hid_handle; bta_hh.conn.bda = p_cb->addr; (*bta_hh_cb.p_cback)(p_cb->w4_evt, &bta_hh); -#if (BTA_HH_DEBUG == TRUE) bta_hh_trace_dev_db(); -#endif p_cb->w4_evt = 0; break; @@ -716,15 +703,13 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { BT_HDR* pdata = p_data->hid_cback.p_data; uint8_t* data = (uint8_t*)(pdata + 1) + pdata->offset; tBTA_HH_HSDATA hs_data; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]", bta_hh_get_w4_event(p_cb->w4_evt)); -#endif if (pdata->len == 0) { android_errorWriteLog(0x534e4554, "116108738"); p_cb->w4_evt = 0; @@ -748,12 +733,10 @@ void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT) ? BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]", (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report" : "Boot"); -#endif break; /* should not expect control DATA for SET_ transaction */ case BTA_HH_SET_PROTO_EVT: @@ -763,10 +746,8 @@ void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { case BTA_HH_SET_IDLE_EVT: FALLTHROUGH_INTENDED; /* FALLTHROUGH */ default: -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]", bta_hh_get_w4_event(p_cb->w4_evt)); -#endif break; } @@ -791,7 +772,7 @@ void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_open_failure(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_open_failure(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { tBTA_HH_CONN conn_dat; uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ @@ -805,9 +786,7 @@ void bta_hh_open_failure(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { /* Report OPEN fail event */ (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn_dat); -#if (BTA_HH_DEBUG == TRUE) bta_hh_trace_dev_db(); -#endif /* clean up control block, but retain SDP info and device handle */ p_cb->vp = false; p_cb->w4_evt = 0; @@ -832,16 +811,31 @@ void bta_hh_open_failure(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_close_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +void bta_hh_close_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { tBTA_HH_CONN conn_dat; tBTA_HH_CBDATA disc_dat = {BTA_HH_OK, 0}; + uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ + const bool l2cap_conn_fail = reason & HID_L2CAP_CONN_FAIL; + const bool l2cap_req_fail = reason & HID_L2CAP_REQ_FAIL; + const bool l2cap_cfg_fail = reason & HID_L2CAP_CFG_FAIL; + const tHID_STATUS hid_status = static_cast<tHID_STATUS>(reason & 0xff); /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */ uint16_t event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT; disc_dat.handle = p_cb->hid_handle; - disc_dat.status = p_data->hid_cback.data; + disc_dat.status = to_bta_hh_status(p_data->hid_cback.data); + + std::string overlay_fail = + base::StringPrintf("%s %s %s", (l2cap_conn_fail) ? "l2cap_conn_fail" : "", + (l2cap_req_fail) ? "l2cap_req_fail" : "", + (l2cap_cfg_fail) ? "l2cap_cfg_fail" : ""); + BTM_LogHistory(kBtmLogTag, p_cb->addr, "Closed", + base::StringPrintf("%s reason %s %s", + (p_cb->is_le_device) ? "le" : "classic", + hid_status_text(hid_status).c_str(), + overlay_fail.c_str())); /* Check reason for closing */ if ((reason & (HID_L2CAP_CONN_FAIL | @@ -861,9 +855,7 @@ void bta_hh_close_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { /* Report OPEN fail event */ (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn_dat); -#if (BTA_HH_DEBUG == TRUE) bta_hh_trace_dev_db(); -#endif return; } /* otherwise report CLOSE/VC_UNPLUG event */ @@ -885,9 +877,7 @@ void bta_hh_close_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { bta_hh_clean_up_kdev(p_cb); } -#if (BTA_HH_DEBUG == TRUE) bta_hh_trace_dev_db(); -#endif } /* clean up control block, but retain SDP info and device handle */ @@ -913,12 +903,10 @@ void bta_hh_close_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * ******************************************************************************/ void bta_hh_get_dscp_act(tBTA_HH_DEV_CB* p_cb, - UNUSED_ATTR tBTA_HH_DATA* p_data) { -#if (BTA_HH_LE_INCLUDED == TRUE) + UNUSED_ATTR const tBTA_HH_DATA* p_data) { if (p_cb->is_le_device) { bta_hh_le_get_dscp_act(p_cb); } else -#endif (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH*)&p_cb->dscp_info); } @@ -932,8 +920,8 @@ void bta_hh_get_dscp_act(tBTA_HH_DEV_CB* p_cb, * Returns void * ******************************************************************************/ -void bta_hh_maint_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { - tBTA_HH_MAINT_DEV* p_dev_info = &p_data->api_maintdev; +void bta_hh_maint_dev_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { + const tBTA_HH_MAINT_DEV* p_dev_info = &p_data->api_maintdev; tBTA_HH_DEV_INFO dev_info; uint8_t dev_handle; @@ -945,31 +933,23 @@ void bta_hh_maint_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { dev_info.bda = p_dev_info->bda; /* initialize callback data */ if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { -#if (BTA_HH_LE_INCLUDED == TRUE) - if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) { + if (BTM_UseLeLink(p_data->api_conn.bd_addr)) { + p_cb->is_le_device = true; dev_info.handle = bta_hh_le_add_device(p_cb, p_dev_info); if (dev_info.handle != BTA_HH_INVALID_HANDLE) dev_info.status = BTA_HH_OK; } else -#endif if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle) == HID_SUCCESS) { dev_info.handle = dev_handle; dev_info.status = BTA_HH_OK; -#if (BTA_HH_LE_INCLUDED == TRUE) /* update DI information */ bta_hh_update_di_info(p_cb, p_dev_info->dscp_info.vendor_id, p_dev_info->dscp_info.product_id, p_dev_info->dscp_info.version, p_dev_info->dscp_info.flag); -#else - bta_hh_update_di_info(p_cb, p_dev_info->dscp_info.vendor_id, - p_dev_info->dscp_info.product_id, - p_dev_info->dscp_info.version, 0); - -#endif /* add to BTA device list */ bta_hh_add_device_to_list( p_cb, dev_handle, p_dev_info->attr_mask, @@ -984,22 +964,18 @@ void bta_hh_maint_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { dev_info.handle = p_cb->hid_handle; dev_info.status = BTA_HH_OK; } -#if (BTA_HH_DEBUG == TRUE) bta_hh_trace_dev_db(); -#endif break; case BTA_HH_RMV_DEV_EVT: /* remove device */ dev_info.handle = (uint8_t)p_dev_info->hdr.layer_specific; dev_info.bda = p_cb->addr; -#if (BTA_HH_LE_INCLUDED == TRUE) if (p_cb->is_le_device) { bta_hh_le_remove_dev_bg_conn(p_cb); bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); bta_hh_clean_up_kdev(p_cb); } else -#endif { if (HID_HostRemoveDev(dev_info.handle) == HID_SUCCESS) { dev_info.status = BTA_HH_OK; @@ -1026,30 +1002,34 @@ void bta_hh_maint_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { * Returns void * ******************************************************************************/ -void bta_hh_write_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { +static uint8_t convert_api_sndcmd_param(const tBTA_HH_CMD_DATA& api_sndcmd) { + uint8_t api_sndcmd_param = api_sndcmd.param; + if (api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) { + api_sndcmd_param = (api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) + ? HID_PAR_PROTOCOL_REPORT + : HID_PAR_PROTOCOL_BOOT_MODE; + } + return api_sndcmd_param; +} + +void bta_hh_write_dev_act(tBTA_HH_DEV_CB* p_cb, const tBTA_HH_DATA* p_data) { tBTA_HH_CBDATA cbdata = {BTA_HH_OK, 0}; - uint16_t event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + - BTA_HH_FST_TRANS_CB_EVT; + uint16_t event = + (p_data->api_sndcmd.t_type - HID_TRANS_GET_REPORT) + BTA_HH_GET_RPT_EVT; -#if (BTA_HH_LE_INCLUDED == TRUE) if (p_cb->is_le_device) bta_hh_le_write_dev_act(p_cb, p_data); else -#endif { cbdata.handle = p_cb->hid_handle; /* match up BTE/BTA report/boot mode def */ - if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) { - p_data->api_sndcmd.param = - (p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) - ? HID_PAR_PROTOCOL_REPORT - : HID_PAR_PROTOCOL_BOOT_MODE; - } + const uint8_t api_sndcmd_param = + convert_api_sndcmd_param(p_data->api_sndcmd); if (HID_HostWriteDev(p_cb->hid_handle, p_data->api_sndcmd.t_type, - p_data->api_sndcmd.param, p_data->api_sndcmd.data, + api_sndcmd_param, p_data->api_sndcmd.data, p_data->api_sndcmd.rpt_id, p_data->api_sndcmd.p_data) != HID_SUCCESS) { APPL_TRACE_ERROR("HID_HostWriteDev Error "); @@ -1058,7 +1038,7 @@ void bta_hh_write_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && p_data->api_sndcmd.t_type != HID_TRANS_DATA) (*bta_hh_cb.p_cback)(event, (tBTA_HH*)&cbdata); - else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) + else if (api_sndcmd_param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) (*bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH*)&cbdata); } else { switch (p_data->api_sndcmd.t_type) { @@ -1081,7 +1061,7 @@ void bta_hh_write_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { case HID_TRANS_CONTROL: /* no handshake event will be generated */ /* if VC_UNPLUG is issued, set flag */ - if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) + if (api_sndcmd_param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) p_cb->vp = true; break; @@ -1098,9 +1078,9 @@ void bta_hh_write_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { /* inform PM for mode change */ bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); - } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) { + } else if (api_sndcmd_param == BTA_HH_CTRL_SUSPEND) { bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); - } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) { + } else if (api_sndcmd_param == BTA_HH_CTRL_EXIT_SUSPEND) { bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); } } @@ -1126,10 +1106,8 @@ static void bta_hh_cback(uint8_t dev_handle, const RawAddress& addr, uint16_t sm_event = BTA_HH_INVALID_EVT; uint8_t xx = 0; -#if (BTA_HH_DEBUG == TRUE) APPL_TRACE_DEBUG("%s::HID_event [%s]", __func__, bta_hh_hid_event_name(event)); -#endif switch (event) { case HID_HDEV_EVT_OPEN: @@ -1205,7 +1183,6 @@ static tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result) { * Debug Functions ****************************************************************************/ -#if (BTA_HH_DEBUG == TRUE) static const char* bta_hh_get_w4_event(uint16_t event) { switch (event) { case BTA_HH_GET_RPT_EVT: @@ -1251,5 +1228,3 @@ static const char* bta_hh_hid_event_name(uint16_t event) { return "Unknown HID event"; } } -#endif -#endif /* BTA_HH_INCLUDED */ |