#define BTA_HH_LE_RPT_TYPE_VALID(x) ((x) <= BTA_LE_HID_RPT_FEATURE && (x)>=BTA_LE_HID_RPT_INPUT)
-#define BTA_HH_LE_RPT_INST_ID_MAP(s,c) (UINT8)(((s)<<4)|(c))
-#define BTA_HH_LE_RPT_GET_SRVC_INST_ID(x) (UINT8)(x >> 4)
-#define BTA_HH_LE_RPT_GET_RPT_INST_ID(x) (UINT8)(x & 0x0f)
-
-
#define BTA_HH_LE_PROTO_BOOT_MODE 0x00
#define BTA_HH_LE_PROTO_REPORT_MODE 0x01
tBTA_HH_RPT_CACHE_ENTRY *p_rpt_cache,
UINT8 num_rpt);
-#define BTA_HH_LE_SRVC_DEF 0
-
#if BTA_HH_DEBUG == TRUE
static const char *bta_hh_le_rpt_name[4] =
{
*******************************************************************************/
static void bta_hh_le_hid_report_dbg(tBTA_HH_DEV_CB *p_cb)
{
- UINT8 i , j;
- tBTA_HH_LE_RPT *p_rpt;
- char * rpt_name;
+ APPL_TRACE_DEBUG("%s: HID Report DB", __func__);
- APPL_TRACE_DEBUG("HID Report DB");
- for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
- {
- if (p_cb->hid_srvc[i].in_use)
- {
- p_rpt = &p_cb->hid_srvc[i].report[0];
+ if (!p_cb->hid_srvc.in_use)
+ return;
- APPL_TRACE_DEBUG("\t HID serivce inst: %d", i);
+ tBTA_HH_LE_RPT *p_rpt = &p_cb->hid_srvc.report[0];
- for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++)
- {
- rpt_name = "Unknown";
- if (p_rpt->in_use)
- {
- if (p_rpt->uuid == GATT_UUID_HID_REPORT)
- rpt_name = "Report";
- if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT)
- rpt_name = "Boot KB Input";
- if (p_rpt->uuid == GATT_UUID_HID_BT_KB_OUTPUT)
- rpt_name = "Boot KB Output";
- if (p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
- rpt_name = "Boot MI Input";
-
-
- APPL_TRACE_DEBUG("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d] [Clt_cfg: %d]",
- rpt_name,
- p_rpt->uuid ,
- ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"),
- p_rpt->rpt_id,
- p_rpt->inst_id,
- p_rpt->client_cfg_value);
- }
- else
- break;
- }
- }
- else
+ for (int j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++)
+ {
+ char * rpt_name = "Unknown";
+
+ if (!p_rpt->in_use)
break;
+
+ if (p_rpt->uuid == GATT_UUID_HID_REPORT)
+ rpt_name = "Report";
+ if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT)
+ rpt_name = "Boot KB Input";
+ if (p_rpt->uuid == GATT_UUID_HID_BT_KB_OUTPUT)
+ rpt_name = "Boot KB Output";
+ if (p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
+ rpt_name = "Boot MI Input";
+
+ APPL_TRACE_DEBUG("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [srvc_inst_id: %d] [char_inst_id: %d] [Clt_cfg: %d]",
+ rpt_name,
+ p_rpt->uuid ,
+ ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"),
+ p_rpt->rpt_id,
+ p_rpt->srvc_inst_id,
+ p_rpt->char_inst_id,
+ p_rpt->client_cfg_value);
}
}
/*******************************************************************************
**
-** Function bta_hh_le_add_hid_srvc_entry
-**
-** Description Add a HID service entry in the HID device control block
-**
-** Parameters:
-**
-*******************************************************************************/
-BOOLEAN bta_hh_le_add_hid_srvc_entry(tBTA_HH_DEV_CB *p_dev_cb, UINT8 idx)
-{
- BOOLEAN added = FALSE;
-
- if (idx < BTA_HH_LE_HID_SRVC_MAX)
- {
- p_dev_cb->hid_srvc[idx].in_use = TRUE;
- added = TRUE;
- }
- else
- {
- APPL_TRACE_ERROR("DB full,max HID service entry!");
- }
- return added;
-}
-
-/*******************************************************************************
-**
** Function bta_hh_le_open_conn
**
** Description open a GATT connection first.
*******************************************************************************/
UINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 ba_inst_id)
{
- UINT8 i;
-
- for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
+ if (p_cb->hid_srvc.in_use &&
+ p_cb->hid_srvc.incl_srvc_inst == ba_inst_id)
{
- if (p_cb->hid_srvc[i].in_use &&
- p_cb->hid_srvc[i].incl_srvc_inst == ba_inst_id)
- {
- return i;
- }
+ return p_cb->hid_srvc.srvc_inst_id;
}
return BTA_HH_IDX_INVALID;
}
return NULL;
}
- p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0];
+ p_rpt = &p_cb->hid_srvc.report[0];
for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
{
if (p_rpt->uuid == rpt_uuid &&
- p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, char_inst_id))
+ p_rpt->srvc_inst_id == srvc_inst_id &&
+ p_rpt->char_inst_id == char_inst_id)
{
return p_rpt;
if (hid_inst_id == BTA_HH_IDX_INVALID)
return NULL;
}
- p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0];
+ p_rpt = &p_cb->hid_srvc.report[0];
for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
{
if (!p_rpt->in_use ||
(p_rpt->uuid == rpt_uuid &&
- p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id)))
+ p_rpt->srvc_inst_id == srvc_inst_id &&
+ p_rpt->char_inst_id == inst_id))
{
if (!p_rpt->in_use)
{
p_rpt->in_use = TRUE;
p_rpt->index = i;
- p_rpt->inst_id = BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id);
+ p_rpt->srvc_inst_id = srvc_inst_id;
+ p_rpt->char_inst_id = inst_id;
p_rpt->prop = prop;
p_rpt->uuid = rpt_uuid;
if (bta_hh_le_read_char_dscrpt(p_dev_cb,
srvc_uuid,
- BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id),
+ p_rpt->srvc_inst_id,
char_uuid,
- BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id),
+ p_rpt->char_inst_id,
GATT_UUID_RPT_REF_DESCR)
== BTA_HH_OK)
{
rpt_entry.rpt_type = p_rpt->rpt_type;
rpt_entry.rpt_uuid = p_rpt->uuid;
rpt_entry.prop = p_rpt->prop;
- rpt_entry.inst_id = p_rpt->inst_id;
+ rpt_entry.srvc_inst_id = p_rpt->srvc_inst_id;
+ rpt_entry.char_inst_id = p_rpt->char_inst_id;
bta_hh_le_co_rpt_info(p_dev_cb->addr,
&rpt_entry,
p_data->p_value && p_data->p_value->unformat.len == 2)
{
pp = p_data->p_value->unformat.p_value;
- STREAM_TO_UINT16(p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref, pp);
+ STREAM_TO_UINT16(p_dev_cb->hid_srvc.ext_rpt_ref, pp);
#if BTA_HH_DEBUG == TRUE
APPL_TRACE_DEBUG("External Report Reference UUID 0x%04x",
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref);
+ p_dev_cb->hid_srvc.ext_rpt_ref);
#endif
}
bta_hh_le_search_hid_chars(p_dev_cb);
void bta_hh_le_register_input_notif(tBTA_HH_DEV_CB *p_dev_cb, UINT8 srvc_inst,
UINT8 proto_mode, BOOLEAN register_ba)
{
- tBTA_HH_LE_RPT *p_rpt = &p_dev_cb->hid_srvc[srvc_inst].report[0];
+ tBTA_HH_LE_RPT *p_rpt = &p_dev_cb->hid_srvc.report[0];
tBTA_GATTC_CHAR_ID char_id;
UINT8 i;
UINT16 srvc_uuid;
else
srvc_uuid = UUID_SERVCLASS_LE_HID;
- bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), srvc_uuid, &char_id.srvc_id);
- bta_hh_le_fill_16bits_char_id(BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), p_rpt->uuid, &char_id.char_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, p_rpt->srvc_inst_id, srvc_uuid, &char_id.srvc_id);
+ bta_hh_le_fill_16bits_char_id(p_rpt->char_inst_id, p_rpt->uuid, &char_id.char_id);
if (register_ba && p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
{
BOOLEAN bta_hh_le_write_rpt_clt_cfg(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst_id)
{
UINT8 i;
- tBTA_HH_LE_RPT *p_rpt = &p_cb->hid_srvc[srvc_inst_id].report[p_cb->clt_cfg_idx];
+ tBTA_HH_LE_RPT *p_rpt = &p_cb->hid_srvc.report[p_cb->clt_cfg_idx];
UINT16 srvc_uuid;
for (i = p_cb->clt_cfg_idx; i < BTA_HH_LE_RPT_MAX && p_rpt->in_use; i ++, p_rpt ++)
srvc_uuid = UUID_SERVCLASS_LE_HID;
if (bta_hh_le_write_char_clt_cfg(p_cb,
- BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id),
+ p_rpt->srvc_inst_id,
srvc_uuid,
- BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id),
+ p_rpt->char_inst_id,
p_rpt->uuid,
BTA_GATT_CLT_CONFIG_NOTIFICATION))
{
cback_data.handle = p_cb->hid_handle;
/* boot mode is not supported in the remote device */
- if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0)
+ if ((p_cb->hid_srvc.option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0)
{
p_cb->mode = BTA_HH_PROTO_RPT_MODE;
{
tBTA_GATTC_CHAR_ID char_id;
tBTA_HH_HSDATA hs_data;
- UINT8 i;
p_cb->w4_evt = BTA_HH_GET_PROTO_EVT;
- for (i = 0; i< BTA_HH_LE_HID_SRVC_MAX; i ++)
+ if (p_cb->hid_srvc.in_use &&
+ p_cb->hid_srvc.option_char & BTA_HH_LE_PROTO_MODE_BIT)
{
- if (p_cb->hid_srvc[i].in_use &&
- p_cb->hid_srvc[i].option_char & BTA_HH_LE_PROTO_MODE_BIT)
- {
- bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
- bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
+ bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id);
- BTA_GATTC_ReadCharacteristic(p_cb->conn_id,
- &char_id,
- BTA_GATT_AUTH_REQ_NONE);
- break;
- }
- }
- /* no service support protocol_mode, by default report mode */
- if (i == BTA_HH_LE_HID_SRVC_MAX)
- {
- hs_data.status = BTA_HH_OK;
- hs_data.handle = p_cb->hid_handle;
- hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE;
- p_cb->w4_evt = 0;
- (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data);
+ BTA_GATTC_ReadCharacteristic(p_cb->conn_id,
+ &char_id,
+ BTA_GATT_AUTH_REQ_NONE);
+ return;
}
+ /* no service support protocol_mode, by default report mode */
+ hs_data.status = BTA_HH_OK;
+ hs_data.handle = p_cb->hid_handle;
+ hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE;
+ p_cb->w4_evt = 0;
+ (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data);
}
/*******************************************************************************
do
{
if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
- p_dev_cb->cur_srvc_index,
+ p_dev_cb->hid_srvc.srvc_inst_id,
GATT_UUID_HID_REPORT,
p_char_id->char_id.inst_id,
prop) == NULL)
LOG_INFO(LOG_TAG, "%s all BLE reports searched", __func__);
bta_hh_le_read_rpt_ref_descr(p_dev_cb,
- &p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].report[0]);
+ &p_dev_cb->hid_srvc.report[0]);
return ;
tBTA_GATT_CHAR_PROP prop)
{
if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
- p_dev_cb->cur_srvc_index,
+ p_dev_cb->hid_srvc.srvc_inst_id,
char_uuid,
0,
prop) == NULL)
if (p_cb->status == BTA_HH_OK)
{
APPL_TRACE_DEBUG("bta_hh_security_cmpl OK");
- if (!p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
+ if (!p_cb->hid_srvc.in_use)
{
APPL_TRACE_DEBUG("bta_hh_security_cmpl no reports loaded, try to load");
/* start loading the cache if not in stack */
}
}
/* discovery has been done for HID service */
- if (p_cb->app_id != 0 && p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
+ if (p_cb->app_id != 0 && p_cb->hid_srvc.in_use)
{
/* configure protocol mode */
if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE)
*******************************************************************************/
void bta_hh_clear_service_cache(tBTA_HH_DEV_CB *p_cb)
{
- UINT8 i;
- tBTA_HH_LE_HID_SRVC *p_hid_srvc = &p_cb->hid_srvc[0];
+ tBTA_HH_LE_HID_SRVC *p_hid_srvc = &p_cb->hid_srvc;
p_cb->app_id = 0;
- p_cb->total_srvc = 0;
p_cb->dscp_info.descriptor.dsc_list = NULL;
- for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i++, p_hid_srvc++) {
- osi_free_and_reset((void **)&p_hid_srvc->rpt_map);
- memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
- }
+ osi_free_and_reset((void **)&p_hid_srvc->rpt_map);
+ memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
}
/*******************************************************************************
{
/* found HID primamry service */
/* TODO: proceed to find battery and device info */
- if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc))
- p_dev_cb->total_srvc ++;
- APPL_TRACE_DEBUG("num of hid service: %d", p_dev_cb->total_srvc);
+
+ p_dev_cb->hid_srvc.in_use = TRUE;
+ p_dev_cb->hid_srvc.srvc_inst_id = p_srvc_result->service_uuid.id.inst_id;
+
+ APPL_TRACE_DEBUG("%s: have HID service inst_id=", __func__, p_dev_cb->hid_srvc.srvc_inst_id);
}
break;
/* set report notification configuration */
p_cb->clt_cfg_idx = 0;
- bta_hh_le_write_rpt_clt_cfg(p_cb, BTA_HH_LE_SRVC_DEF);
+ bta_hh_le_write_rpt_clt_cfg(p_cb, p_cb->hid_srvc.srvc_inst_id);
}
else /* error, close the GATT connection */
{
void bta_hh_le_srvc_expl_srvc(tBTA_HH_DEV_CB *p_dev_cb)
{
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d",
- p_dev_cb->cur_srvc_index,
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use);
+ APPL_TRACE_DEBUG("%s: srvc_inst_id = %d in_use = %d", __func__,
+ p_dev_cb->hid_srvc.srvc_inst_id,
+ p_dev_cb->hid_srvc.in_use);
#endif
- if (p_dev_cb->cur_srvc_index < BTA_HH_LE_HID_SRVC_MAX &&
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use)
+ if (p_dev_cb->hid_srvc.in_use)
{
- if (!p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc)
+ if (!p_dev_cb->hid_srvc.expl_incl_srvc)
/* explore included service first */
bta_hh_le_search_hid_included(p_dev_cb);
else
{
/* explore characterisc */
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0;
+ p_dev_cb->hid_srvc.cur_expl_char_idx = 0;
bta_hh_le_search_hid_chars(p_dev_cb);
}
}
if (p_dev_cb == NULL)
return;
- if(p_data->status != BTA_GATT_OK || p_dev_cb->total_srvc == 0)
+ if(p_data->status != BTA_GATT_OK)
{
p_dev_cb->status = BTA_HH_ERR_SDP;
/* close the connection and report service discovery complete with error */
}
else /* discover HID service */
{
- p_dev_cb->cur_srvc_index = 0;
bta_hh_le_srvc_expl_srvc(p_dev_cb);
}
}
tBTA_GATTC_CHAR_ID char_result;
tBTA_GATT_CHAR_PROP prop = 0;
- bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->hid_srvc.srvc_inst_id, UUID_SERVCLASS_LE_HID, &srvc_id);
srvc_cond.len = LEN_UUID_16;
srvc_cond.uu.uuid16 = UUID_SERVCLASS_BATTERY;
&inc_srvc_result) == BTA_GATT_OK)
{
/* read include service UUID */
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id;
+ p_dev_cb->hid_srvc.incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id;
char_cond.len = LEN_UUID_16;
char_cond.uu.uuid16 = GATT_UUID_BATTERY_LEVEL;
}
}
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc = TRUE;
+ p_dev_cb->hid_srvc.expl_incl_srvc = TRUE;
bta_hh_le_srvc_expl_srvc(p_dev_cb);
UNUSED(status);
UNUSED(p_data);
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc = TRUE;
+ p_dev_cb->hid_srvc.expl_incl_srvc = TRUE;
bta_hh_le_srvc_expl_srvc(p_dev_cb);
}
/*******************************************************************************
UINT16 char_uuid = 0;
tBTA_GATT_SRVC_ID srvc_id;
- if (p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx == BTA_HH_LE_DISC_CHAR_NUM ||
+ if (p_dev_cb->hid_srvc.cur_expl_char_idx == BTA_HH_LE_DISC_CHAR_NUM ||
(p_dev_cb->status != BTA_HH_OK && p_dev_cb->status != BTA_HH_ERR_PROTO))
{
- p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0;
+ p_dev_cb->hid_srvc.cur_expl_char_idx = 0;
/* explore next service */
- p_dev_cb->cur_srvc_index ++;
- bta_hh_le_srvc_expl_srvc(p_dev_cb);
+ bta_hh_le_gatt_disc_cmpl(p_dev_cb, p_dev_cb->status);
return;
}
- p_dev_cb->hid_srvc[ p_dev_cb->cur_srvc_index].cur_expl_char_idx ++;
- char_uuid = bta_hh_le_disc_char_uuid[p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx - 1];
+ p_dev_cb->hid_srvc.cur_expl_char_idx ++;
+ char_uuid = bta_hh_le_disc_char_uuid[p_dev_cb->hid_srvc.cur_expl_char_idx - 1];
char_cond.len = LEN_UUID_16;
char_cond.uu.uuid16 = char_uuid;
- bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &srvc_id);
#if BTA_HH_DEBUG == TRUE
APPL_TRACE_DEBUG("bta_hh_le_search_hid_chars: looking for %s(0x%04x)",
switch (char_uuid)
{
case GATT_UUID_HID_CONTROL_POINT:
- p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_CP_BIT;
+ p_dev_cb->hid_srvc.option_char |= BTA_HH_LE_CP_BIT;
next = TRUE;
break;
case GATT_UUID_HID_INFORMATION:
break;
case GATT_UUID_HID_PROTO_MODE:
- p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_PROTO_MODE_BIT;
+ p_dev_cb->hid_srvc.option_char |= BTA_HH_LE_PROTO_MODE_BIT;
next = !bta_hh_le_set_protocol_mode(p_dev_cb, p_dev_cb->mode);
break;
void bta_hh_le_save_rpt_map(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data)
{
UINT8 *pp ;
- tBTA_HH_LE_HID_SRVC *p_srvc = &p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id];
+ tBTA_HH_LE_HID_SRVC *p_srvc = &p_dev_cb->hid_srvc;
pp = p_data->p_value->unformat.p_value;
{
STREAM_TO_ARRAY(p_srvc->rpt_map, pp, p_data->p_value->unformat.len);
p_srvc->descriptor.dl_len = p_data->p_value->unformat.len;
- p_srvc->descriptor.dsc_list = p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id].rpt_map;
+ p_srvc->descriptor.dsc_list = p_dev_cb->hid_srvc.rpt_map;
}
if (bta_hh_le_read_char_dscrpt(p_dev_cb,
if (p_data->status == BTA_GATT_OK)
{
p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
- p_data->srvc_id.id.inst_id,//BTA_HH_LE_SRVC_DEF,
+ p_data->srvc_id.id.inst_id,
p_data->char_id.uuid.uu.uuid16,
p_data->char_id.inst_id);
if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
{
if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
- BTA_HH_LE_SRVC_DEF,
+ p_data->srvc_id.id.inst_id,
p_data->char_id.uuid.uu.uuid16,
p_data->char_id.inst_id)) != NULL)
{
case GATT_UUID_HID_BT_MOUSE_INPUT:
case GATT_UUID_HID_REPORT:
if (p_data->status == BTA_GATT_OK)
- p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx].client_cfg_value =
+ p_dev_cb->hid_srvc.report[p_dev_cb->clt_cfg_idx].client_cfg_value =
BTA_GATT_CLT_CONFIG_NOTIFICATION;
p_dev_cb->clt_cfg_idx ++;
bta_hh_le_write_rpt_clt_cfg(p_dev_cb, hid_inst_id);
app_id= p_dev_cb->app_id;
p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
- BTA_HH_LE_SRVC_DEF,
+ p_dev_cb->hid_srvc.srvc_inst_id,
p_data->char_id.char_id.uuid.uu.uuid16,
p_data->char_id.char_id.inst_id);
if (p_rpt == NULL)
** Returns void
**
*******************************************************************************/
-void bta_hh_le_get_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id)
+void bta_hh_le_get_rpt(tBTA_HH_DEV_CB *p_cb, tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id)
{
- tBTA_HH_LE_RPT *p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id);
+ tBTA_HH_LE_RPT *p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc.report, p_cb->mode, r_type, rpt_id);
tBTA_GATTC_CHAR_ID char_id;
UINT16 srvc_uuid = UUID_SERVCLASS_LE_HID;
p_cb->w4_evt = BTA_HH_GET_RPT_EVT;
- bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst, srvc_uuid, &char_id.srvc_id);
- bta_hh_le_fill_16bits_char_id(p_rpt->inst_id, p_rpt->uuid, &char_id.char_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, p_rpt->srvc_inst_id, srvc_uuid, &char_id.srvc_id);
+ bta_hh_le_fill_16bits_char_id(p_rpt->char_inst_id, p_rpt->uuid, &char_id.char_id);
BTA_GATTC_ReadCharacteristic(p_cb->conn_id,
&char_id,
** Returns void
**
*******************************************************************************/
-void bta_hh_le_write_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst,
+void bta_hh_le_write_rpt(tBTA_HH_DEV_CB *p_cb,
tBTA_GATTC_WRITE_TYPE write_type,
tBTA_HH_RPT_TYPE r_type,
BT_HDR *p_buf, UINT16 w4_evt )
STREAM_TO_UINT8(rpt_id, p_value);
p_buf->len -= 1;
- p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id);
+ p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc.report, p_cb->mode, r_type, rpt_id);
if (p_rpt == NULL)
{
p_cb->w4_evt = w4_evt;
- bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
- bta_hh_le_fill_16bits_char_id(p_rpt->inst_id, p_rpt->uuid, &char_id.char_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, p_rpt->srvc_inst_id, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
+ bta_hh_le_fill_16bits_char_id(p_rpt->char_inst_id, p_rpt->uuid, &char_id.char_id);
BTA_GATTC_WriteCharValue(p_cb->conn_id,
&char_id,
*******************************************************************************/
void bta_hh_le_suspend(tBTA_HH_DEV_CB *p_cb, tBTA_HH_TRANS_CTRL_TYPE ctrl_type)
{
- UINT8 i;
tBTA_GATTC_CHAR_ID char_id;
ctrl_type -= BTA_HH_CTRL_SUSPEND;
- for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
- {
- bta_hh_le_fill_16bits_srvc_id(TRUE, i, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
- bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_CONTROL_POINT, &char_id.char_id);
+ bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
+ bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_CONTROL_POINT, &char_id.char_id);
- BTA_GATTC_WriteCharValue(p_cb->conn_id,
- &char_id,
- BTA_GATTC_TYPE_WRITE_NO_RSP, /* default to use write request */
- 1,
- &ctrl_type,
- BTA_GATT_AUTH_REQ_NONE);
- }
+ BTA_GATTC_WriteCharValue(p_cb->conn_id,
+ &char_id,
+ BTA_GATTC_TYPE_WRITE_NO_RSP, /* default to use write request */
+ 1,
+ &ctrl_type,
+ BTA_GATT_AUTH_REQ_NONE);
}
/*******************************************************************************
case HID_TRANS_GET_REPORT:
bta_hh_le_get_rpt(p_cb,
- BTA_HH_LE_SRVC_DEF,
p_data->api_sndcmd.param,
p_data->api_sndcmd.rpt_id);
break;
case HID_TRANS_SET_REPORT:
bta_hh_le_write_rpt(p_cb,
- BTA_HH_LE_SRVC_DEF,
BTA_GATTC_TYPE_WRITE,
p_data->api_sndcmd.param,
p_data->api_sndcmd.p_data,
case HID_TRANS_DATA: /* output report */
bta_hh_le_write_rpt(p_cb,
- BTA_HH_LE_SRVC_DEF,
BTA_GATTC_TYPE_WRITE_NO_RSP,
p_data->api_sndcmd.param,
p_data->api_sndcmd.p_data,
*******************************************************************************/
void bta_hh_le_get_dscp_act(tBTA_HH_DEV_CB *p_cb)
{
- UINT8 i;
-
- for (i = 0 ;i < BTA_HH_LE_HID_SRVC_MAX; i ++)
+ if (p_cb->hid_srvc.in_use)
{
- if (p_cb->hid_srvc[i].in_use)
- {
- p_cb->dscp_info.descriptor.dl_len = p_cb->hid_srvc[i].descriptor.dl_len;
- p_cb->dscp_info.descriptor.dsc_list = p_cb->hid_srvc[i].descriptor.dsc_list;
+ p_cb->dscp_info.descriptor.dl_len = p_cb->hid_srvc.descriptor.dl_len;
+ p_cb->dscp_info.descriptor.dsc_list = p_cb->hid_srvc.descriptor.dsc_list;
- (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
- }
- else
- break;
+ (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
}
}
p_cb = &bta_hh_cb.kdev[index];
- p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].report, p_cb->mode, BTA_HH_RPTT_INPUT, rpt_id);
+ p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc.report, p_cb->mode, BTA_HH_RPTT_INPUT, rpt_id);
if (p_rpt == NULL)
{
bta_hh_le_read_char_dscrpt(p_cb,
UUID_SERVCLASS_LE_HID,
- BTA_HH_LE_SRVC_DEF,
+ p_rpt->srvc_inst_id,
p_rpt->uuid,
- p_rpt->inst_id,
+ p_rpt->char_inst_id,
GATT_UUID_CHAR_CLIENT_CONFIG);
if (num_rpt != 0) /* no cache is found */
{
- p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].in_use = TRUE;
+ p_cb->hid_srvc.in_use = TRUE;
/* set the descriptor info */
- p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dl_len =
+ p_cb->hid_srvc.descriptor.dl_len =
p_cb->dscp_info.descriptor.dl_len;
- p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dsc_list =
+ p_cb->hid_srvc.descriptor.dsc_list =
p_cb->dscp_info.descriptor.dsc_list;
for (; i <num_rpt; i ++, p_rpt_cache ++)
{
if ((p_rpt = bta_hh_le_find_alloc_report_entry (p_cb,
- BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id),
+ p_rpt_cache->srvc_inst_id,
p_rpt_cache->rpt_uuid,
- BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt_cache->inst_id),
+ p_rpt_cache->char_inst_id,
p_rpt_cache->prop)) == NULL)
{
APPL_TRACE_ERROR("bta_hh_process_cache_rpt: allocation report entry failure");