You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
513 lines
19 KiB
513 lines
19 KiB
/****************************************************************************** |
|
* |
|
* Copyright (C) 2005-2012 Broadcom Corporation |
|
* |
|
* 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. |
|
* |
|
******************************************************************************/ |
|
|
|
/****************************************************************************** |
|
* |
|
* This file contains the HID host main functions and state machine. |
|
* |
|
******************************************************************************/ |
|
|
|
#include "bt_target.h" |
|
|
|
#if (BTA_HH_INCLUDED == TRUE) |
|
|
|
#include <string.h> |
|
|
|
#include "bt_common.h" |
|
#include "bta_hh_api.h" |
|
#include "bta_hh_int.h" |
|
|
|
/***************************************************************************** |
|
* Constants and types |
|
****************************************************************************/ |
|
|
|
/* state machine action enumeration list */ |
|
enum { |
|
BTA_HH_API_DISC_ACT, /* HID host process API close action */ |
|
BTA_HH_OPEN_ACT, /* HID host process BTA_HH_EVT_OPEN */ |
|
BTA_HH_CLOSE_ACT, /* HID host process BTA_HH_EVT_CLOSE */ |
|
BTA_HH_DATA_ACT, /* HID host receive data report */ |
|
BTA_HH_CTRL_DAT_ACT, |
|
BTA_HH_HANDSK_ACT, |
|
BTA_HH_START_SDP, /* HID host inquery */ |
|
BTA_HH_SDP_CMPL, |
|
BTA_HH_WRITE_DEV_ACT, |
|
BTA_HH_GET_DSCP_ACT, |
|
BTA_HH_MAINT_DEV_ACT, |
|
BTA_HH_OPEN_CMPL_ACT, |
|
BTA_HH_OPEN_FAILURE, |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
BTA_HH_GATT_CLOSE, |
|
BTA_HH_LE_OPEN_FAIL, |
|
BTA_HH_GATT_OPEN, |
|
BTA_HH_START_SEC, |
|
BTA_HH_SEC_CMPL, |
|
BTA_HH_GATT_ENC_CMPL, |
|
#endif |
|
BTA_HH_NUM_ACTIONS |
|
}; |
|
|
|
#define BTA_HH_IGNORE BTA_HH_NUM_ACTIONS |
|
|
|
/* type for action functions */ |
|
typedef void (*tBTA_HH_ACTION)(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data); |
|
|
|
/* action functions */ |
|
const tBTA_HH_ACTION bta_hh_action[] = { |
|
bta_hh_api_disc_act, bta_hh_open_act, bta_hh_close_act, bta_hh_data_act, |
|
bta_hh_ctrl_dat_act, bta_hh_handsk_act, bta_hh_start_sdp, bta_hh_sdp_cmpl, |
|
bta_hh_write_dev_act, bta_hh_get_dscp_act, bta_hh_maint_dev_act, |
|
bta_hh_open_cmpl_act, bta_hh_open_failure |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
, |
|
bta_hh_gatt_close, bta_hh_le_open_fail, bta_hh_gatt_open, |
|
bta_hh_start_security, bta_hh_security_cmpl, bta_hh_le_notify_enc_cmpl |
|
#endif |
|
}; |
|
|
|
/* state table information */ |
|
#define BTA_HH_ACTION 0 /* position of action */ |
|
#define BTA_HH_NEXT_STATE 1 /* position of next state */ |
|
#define BTA_HH_NUM_COLS 2 /* number of columns */ |
|
|
|
/* state table for idle state */ |
|
const uint8_t bta_hh_st_idle[][BTA_HH_NUM_COLS] = { |
|
/* Event Action Next state */ |
|
/* BTA_HH_API_OPEN_EVT */ {BTA_HH_START_SDP, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_CLOSE_ACT, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_OPEN_CMPL_ACT, BTA_HH_CONN_ST} |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
/* BTA_HH_GATT_CLOSE_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_IDLE_ST} |
|
/* BTA_HH_GATT_OPEN_EVT */, |
|
{BTA_HH_GATT_OPEN, BTA_HH_W4_CONN_ST} |
|
/* BTA_HH_START_ENC_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_IDLE_ST} |
|
/* BTA_HH_ENC_CMPL_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_IDLE_ST} |
|
/* BTA_HH_GATT_ENC_CMPL_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_IDLE_ST} |
|
#endif |
|
|
|
}; |
|
|
|
const uint8_t bta_hh_st_w4_conn[][BTA_HH_NUM_COLS] = { |
|
/* Event Action Next state */ |
|
/* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_OPEN_FAILURE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_SDP_CMPL, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_WRITE_DEV_ACT, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_OPEN_CMPL_ACT, BTA_HH_CONN_ST} |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
/* BTA_HH_GATT_CLOSE_EVT */, |
|
{BTA_HH_LE_OPEN_FAIL, BTA_HH_IDLE_ST} |
|
/* BTA_HH_GATT_OPEN_EVT */, |
|
{BTA_HH_GATT_OPEN, BTA_HH_W4_CONN_ST} |
|
/* BTA_HH_START_ENC_EVT */, |
|
{BTA_HH_START_SEC, BTA_HH_W4_SEC} |
|
/* BTA_HH_ENC_CMPL_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_W4_CONN_ST} |
|
/* BTA_HH_GATT_ENC_CMPL_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_W4_CONN_ST} |
|
#endif |
|
}; |
|
|
|
const uint8_t bta_hh_st_connected[][BTA_HH_NUM_COLS] = { |
|
/* Event Action Next state */ |
|
/* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST}, |
|
/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_API_DISC_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_CLOSE_ACT, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_DATA_EVT */ {BTA_HH_DATA_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_CTRL_DAT_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_HANDSK_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST}, |
|
/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_WRITE_DEV_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_GET_DSCP_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_CONN_ST}, |
|
/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST} |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
/* BTA_HH_GATT_CLOSE_EVT */, |
|
{BTA_HH_GATT_CLOSE, BTA_HH_IDLE_ST} |
|
/* BTA_HH_GATT_OPEN_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_CONN_ST} |
|
/* BTA_HH_START_ENC_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_CONN_ST} |
|
/* BTA_HH_ENC_CMPL_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_CONN_ST} |
|
/* BTA_HH_GATT_ENC_CMPL_EVT */, |
|
{BTA_HH_IGNORE, BTA_HH_CONN_ST} |
|
#endif |
|
}; |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
const uint8_t bta_hh_st_w4_sec[][BTA_HH_NUM_COLS] = { |
|
/* Event Action Next state */ |
|
/* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_API_DISC_ACT, BTA_HH_W4_SEC}, |
|
/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_OPEN_FAILURE, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_W4_SEC}, |
|
/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_GATT_CLOSE_EVT */ {BTA_HH_LE_OPEN_FAIL, BTA_HH_IDLE_ST}, |
|
/* BTA_HH_GATT_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_START_ENC_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC}, |
|
/* BTA_HH_ENC_CMPL_EVT */ {BTA_HH_SEC_CMPL, BTA_HH_W4_CONN_ST}, |
|
/* BTA_HH_GATT_ENC_CMPL_EVT */ {BTA_HH_GATT_ENC_CMPL, BTA_HH_W4_SEC}}; |
|
#endif |
|
|
|
/* type for state table */ |
|
typedef const uint8_t (*tBTA_HH_ST_TBL)[BTA_HH_NUM_COLS]; |
|
|
|
/* state table */ |
|
const tBTA_HH_ST_TBL bta_hh_st_tbl[] = {bta_hh_st_idle, bta_hh_st_w4_conn, |
|
bta_hh_st_connected |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
, |
|
bta_hh_st_w4_sec |
|
#endif |
|
}; |
|
|
|
/***************************************************************************** |
|
* Global data |
|
****************************************************************************/ |
|
tBTA_HH_CB bta_hh_cb; |
|
|
|
/***************************************************************************** |
|
* Static functions |
|
****************************************************************************/ |
|
#if (BTA_HH_DEBUG == TRUE) |
|
static const char* bta_hh_evt_code(tBTA_HH_INT_EVT evt_code); |
|
static const char* bta_hh_state_code(tBTA_HH_STATE state_code); |
|
#endif |
|
|
|
/******************************************************************************* |
|
* |
|
* Function bta_hh_sm_execute |
|
* |
|
* Description State machine event handling function for HID Host |
|
* |
|
* |
|
* Returns void |
|
* |
|
******************************************************************************/ |
|
void bta_hh_sm_execute(tBTA_HH_DEV_CB* p_cb, uint16_t event, |
|
tBTA_HH_DATA* p_data) { |
|
tBTA_HH_ST_TBL state_table; |
|
uint8_t action; |
|
tBTA_HH cback_data; |
|
tBTA_HH_EVT cback_event = 0; |
|
#if (BTA_HH_DEBUG == TRUE) |
|
tBTA_HH_STATE in_state; |
|
uint16_t debug_event = event; |
|
#endif |
|
|
|
memset(&cback_data, 0, sizeof(tBTA_HH)); |
|
|
|
/* handle exception, no valid control block was found */ |
|
if (!p_cb) { |
|
/* BTA HH enabled already? otherwise ignore the event although it's bad*/ |
|
if (bta_hh_cb.p_cback != NULL) { |
|
switch (event) { |
|
/* no control block available for new connection */ |
|
case BTA_HH_API_OPEN_EVT: |
|
cback_event = BTA_HH_OPEN_EVT; |
|
/* build cback data */ |
|
cback_data.conn.bda = ((tBTA_HH_API_CONN*)p_data)->bd_addr; |
|
cback_data.conn.status = BTA_HH_ERR_DB_FULL; |
|
cback_data.conn.handle = BTA_HH_INVALID_HANDLE; |
|
break; |
|
/* DB full, BTA_HhAddDev */ |
|
case BTA_HH_API_MAINT_DEV_EVT: |
|
cback_event = p_data->api_maintdev.sub_event; |
|
|
|
if (p_data->api_maintdev.sub_event == BTA_HH_ADD_DEV_EVT) { |
|
cback_data.dev_info.bda = p_data->api_maintdev.bda; |
|
cback_data.dev_info.status = BTA_HH_ERR_DB_FULL; |
|
cback_data.dev_info.handle = BTA_HH_INVALID_HANDLE; |
|
} else { |
|
cback_data.dev_info.status = BTA_HH_ERR_HDL; |
|
cback_data.dev_info.handle = |
|
(uint8_t)p_data->api_maintdev.hdr.layer_specific; |
|
} |
|
break; |
|
case BTA_HH_API_WRITE_DEV_EVT: |
|
cback_event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + |
|
BTA_HH_FST_TRANS_CB_EVT; |
|
osi_free_and_reset((void**)&p_data->api_sndcmd.p_data); |
|
if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL || |
|
p_data->api_sndcmd.t_type == HID_TRANS_SET_REPORT || |
|
p_data->api_sndcmd.t_type == HID_TRANS_SET_IDLE) { |
|
cback_data.dev_status.status = BTA_HH_ERR_HDL; |
|
cback_data.dev_status.handle = |
|
(uint8_t)p_data->api_sndcmd.hdr.layer_specific; |
|
} else if (p_data->api_sndcmd.t_type != HID_TRANS_DATA && |
|
p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) { |
|
cback_data.hs_data.handle = |
|
(uint8_t)p_data->api_sndcmd.hdr.layer_specific; |
|
cback_data.hs_data.status = BTA_HH_ERR_HDL; |
|
/* hs_data.rsp_data will be all zero, which is not valid value */ |
|
} else if (p_data->api_sndcmd.t_type == HID_TRANS_CONTROL && |
|
p_data->api_sndcmd.param == |
|
BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) { |
|
cback_data.status = BTA_HH_ERR_HDL; |
|
cback_event = BTA_HH_VC_UNPLUG_EVT; |
|
} else |
|
cback_event = 0; |
|
break; |
|
|
|
case BTA_HH_API_CLOSE_EVT: |
|
cback_event = BTA_HH_CLOSE_EVT; |
|
|
|
cback_data.dev_status.status = BTA_HH_ERR_HDL; |
|
cback_data.dev_status.handle = |
|
(uint8_t)p_data->api_sndcmd.hdr.layer_specific; |
|
break; |
|
|
|
default: |
|
/* invalid handle, call bad API event */ |
|
APPL_TRACE_ERROR("wrong device handle: [%d]", |
|
p_data->hdr.layer_specific); |
|
/* Free the callback buffer now */ |
|
if (p_data != NULL) |
|
osi_free_and_reset((void**)&p_data->hid_cback.p_data); |
|
break; |
|
} |
|
if (cback_event) (*bta_hh_cb.p_cback)(cback_event, &cback_data); |
|
} |
|
} |
|
/* corresponding CB is found, go to state machine */ |
|
else { |
|
#if (BTA_HH_DEBUG == TRUE) |
|
in_state = p_cb->state; |
|
APPL_TRACE_EVENT("bta_hh_sm_execute: State 0x%02x [%s], Event [%s]", |
|
in_state, bta_hh_state_code(in_state), |
|
bta_hh_evt_code(debug_event)); |
|
#endif |
|
|
|
if ((p_cb->state == BTA_HH_NULL_ST) || (p_cb->state >= BTA_HH_INVALID_ST)) { |
|
APPL_TRACE_ERROR( |
|
"bta_hh_sm_execute: Invalid state State = 0x%x, Event = %d", |
|
p_cb->state, event); |
|
return; |
|
} |
|
state_table = bta_hh_st_tbl[p_cb->state - 1]; |
|
|
|
event &= 0xff; |
|
|
|
p_cb->state = state_table[event][BTA_HH_NEXT_STATE]; |
|
|
|
action = state_table[event][BTA_HH_ACTION]; |
|
if (action != BTA_HH_IGNORE) { |
|
(*bta_hh_action[action])(p_cb, p_data); |
|
} |
|
|
|
#if (BTA_HH_DEBUG == TRUE) |
|
if (in_state != p_cb->state) { |
|
APPL_TRACE_DEBUG("HH State Change: [%s] -> [%s] after Event [%s]", |
|
bta_hh_state_code(in_state), |
|
bta_hh_state_code(p_cb->state), |
|
bta_hh_evt_code(debug_event)); |
|
} |
|
#endif |
|
} |
|
|
|
return; |
|
} |
|
/******************************************************************************* |
|
* |
|
* Function bta_hh_hdl_event |
|
* |
|
* Description HID host main event handling function. |
|
* |
|
* |
|
* Returns void |
|
* |
|
******************************************************************************/ |
|
bool bta_hh_hdl_event(BT_HDR* p_msg) { |
|
uint8_t index = BTA_HH_IDX_INVALID; |
|
tBTA_HH_DEV_CB* p_cb = NULL; |
|
|
|
switch (p_msg->event) { |
|
case BTA_HH_API_ENABLE_EVT: |
|
bta_hh_api_enable((tBTA_HH_DATA*)p_msg); |
|
break; |
|
|
|
case BTA_HH_API_DISABLE_EVT: |
|
bta_hh_api_disable(); |
|
break; |
|
|
|
case BTA_HH_DISC_CMPL_EVT: /* disable complete */ |
|
bta_hh_disc_cmpl(); |
|
break; |
|
|
|
default: |
|
/* all events processed in state machine need to find corresponding |
|
CB before proceed */ |
|
if (p_msg->event == BTA_HH_API_OPEN_EVT) { |
|
index = bta_hh_find_cb(((tBTA_HH_API_CONN*)p_msg)->bd_addr); |
|
} else if (p_msg->event == BTA_HH_API_MAINT_DEV_EVT) { |
|
/* if add device */ |
|
if (((tBTA_HH_MAINT_DEV*)p_msg)->sub_event == BTA_HH_ADD_DEV_EVT) { |
|
index = bta_hh_find_cb(((tBTA_HH_MAINT_DEV*)p_msg)->bda); |
|
} else /* else remove device by handle */ |
|
{ |
|
index = bta_hh_dev_handle_to_cb_idx((uint8_t)p_msg->layer_specific); |
|
/* If BT disable is done while the HID device is connected and |
|
* Link_Key uses unauthenticated combination |
|
* then we can get into a situation where remove_bonding is called |
|
* with the index set to 0 (without getting |
|
* cleaned up). Only when VIRTUAL_UNPLUG is called do we cleanup the |
|
* index and make it MAX_KNOWN. |
|
* So if REMOVE_DEVICE is called and in_use is false then we should |
|
* treat this as a NULL p_cb. Hence we |
|
* force the index to be IDX_INVALID |
|
*/ |
|
if ((index != BTA_HH_IDX_INVALID) && |
|
(bta_hh_cb.kdev[index].in_use == false)) { |
|
index = BTA_HH_IDX_INVALID; |
|
} |
|
} |
|
} else if (p_msg->event == BTA_HH_INT_OPEN_EVT) { |
|
index = bta_hh_find_cb(((tBTA_HH_CBACK_DATA*)p_msg)->addr); |
|
} else |
|
index = bta_hh_dev_handle_to_cb_idx((uint8_t)p_msg->layer_specific); |
|
|
|
if (index != BTA_HH_IDX_INVALID) p_cb = &bta_hh_cb.kdev[index]; |
|
|
|
#if (BTA_HH_DEBUG == TRUE) |
|
APPL_TRACE_DEBUG("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", |
|
p_msg->layer_specific, index); |
|
#endif |
|
bta_hh_sm_execute(p_cb, p_msg->event, (tBTA_HH_DATA*)p_msg); |
|
} |
|
return (true); |
|
} |
|
|
|
/***************************************************************************** |
|
* Debug Functions |
|
****************************************************************************/ |
|
#if (BTA_HH_DEBUG == TRUE) |
|
/******************************************************************************* |
|
* |
|
* Function bta_hh_evt_code |
|
* |
|
* Description |
|
* |
|
* Returns void |
|
* |
|
******************************************************************************/ |
|
static const char* bta_hh_evt_code(tBTA_HH_INT_EVT evt_code) { |
|
switch (evt_code) { |
|
case BTA_HH_API_DISABLE_EVT: |
|
return "BTA_HH_API_DISABLE_EVT"; |
|
case BTA_HH_API_ENABLE_EVT: |
|
return "BTA_HH_API_ENABLE_EVT"; |
|
case BTA_HH_API_OPEN_EVT: |
|
return "BTA_HH_API_OPEN_EVT"; |
|
case BTA_HH_API_CLOSE_EVT: |
|
return "BTA_HH_API_CLOSE_EVT"; |
|
case BTA_HH_INT_OPEN_EVT: |
|
return "BTA_HH_INT_OPEN_EVT"; |
|
case BTA_HH_INT_CLOSE_EVT: |
|
return "BTA_HH_INT_CLOSE_EVT"; |
|
case BTA_HH_INT_HANDSK_EVT: |
|
return "BTA_HH_INT_HANDSK_EVT"; |
|
case BTA_HH_INT_DATA_EVT: |
|
return "BTA_HH_INT_DATA_EVT"; |
|
case BTA_HH_INT_CTRL_DATA: |
|
return "BTA_HH_INT_CTRL_DATA"; |
|
case BTA_HH_API_WRITE_DEV_EVT: |
|
return "BTA_HH_API_WRITE_DEV_EVT"; |
|
case BTA_HH_SDP_CMPL_EVT: |
|
return "BTA_HH_SDP_CMPL_EVT"; |
|
case BTA_HH_DISC_CMPL_EVT: |
|
return "BTA_HH_DISC_CMPL_EVT"; |
|
case BTA_HH_API_MAINT_DEV_EVT: |
|
return "BTA_HH_API_MAINT_DEV_EVT"; |
|
case BTA_HH_API_GET_DSCP_EVT: |
|
return "BTA_HH_API_GET_DSCP_EVT"; |
|
case BTA_HH_OPEN_CMPL_EVT: |
|
return "BTA_HH_OPEN_CMPL_EVT"; |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
case BTA_HH_GATT_CLOSE_EVT: |
|
return "BTA_HH_GATT_CLOSE_EVT"; |
|
case BTA_HH_GATT_OPEN_EVT: |
|
return "BTA_HH_GATT_OPEN_EVT"; |
|
case BTA_HH_START_ENC_EVT: |
|
return "BTA_HH_START_ENC_EVT"; |
|
case BTA_HH_ENC_CMPL_EVT: |
|
return "BTA_HH_ENC_CMPL_EVT"; |
|
#endif |
|
default: |
|
return "unknown HID Host event code"; |
|
} |
|
} |
|
|
|
/******************************************************************************* |
|
* |
|
* Function bta_hh_state_code |
|
* |
|
* Description get string representation of HID host state code. |
|
* |
|
* Returns void |
|
* |
|
******************************************************************************/ |
|
static const char* bta_hh_state_code(tBTA_HH_STATE state_code) { |
|
switch (state_code) { |
|
case BTA_HH_NULL_ST: |
|
return "BTA_HH_NULL_ST"; |
|
case BTA_HH_IDLE_ST: |
|
return "BTA_HH_IDLE_ST"; |
|
case BTA_HH_W4_CONN_ST: |
|
return "BTA_HH_W4_CONN_ST"; |
|
case BTA_HH_CONN_ST: |
|
return "BTA_HH_CONN_ST"; |
|
#if (BTA_HH_LE_INCLUDED == TRUE) |
|
case BTA_HH_W4_SEC: |
|
return "BTA_HH_W4_SEC"; |
|
#endif |
|
default: |
|
return "unknown HID Host state"; |
|
} |
|
} |
|
|
|
#endif /* Debug Functions */ |
|
|
|
#endif /* BTA_HH_INCLUDED */
|
|
|