From 9b57f0802ec52f9169ebbd164c6f104724190ec1 Mon Sep 17 00:00:00 2001 From: Adam Hampson Date: Fri, 25 Jul 2014 13:39:11 -0700 Subject: [PATCH] Bluetooth: DIS: Only read the requested DIS characteristics The BLE HID code only uses the PNP_ID characteristic from DIS. Previously the DIS client would read all DIS characteristics when a read request was made. This change allows the DIS user to request certain DIS characteristics. Bug: 16521059 Change-Id: I09c24718bb2e2da73c518b64c3cbdd07e7d6cf27 Signed-off-by: Adam Hampson --- bta/hh/bta_hh_le.c | 2 +- stack/include/srvc_api.h | 3 ++- stack/srvc/srvc_dis.c | 53 ++++++++++++++++++++++++++++++++++++----------- stack/srvc/srvc_dis_int.h | 2 ++ 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/bta/hh/bta_hh_le.c b/bta/hh/bta_hh_le.c index a71ee45f1..054ac9efd 100644 --- a/bta/hh/bta_hh_le.c +++ b/bta/hh/bta_hh_le.c @@ -1187,7 +1187,7 @@ void bta_hh_le_pri_service_discovery(tBTA_HH_DEV_CB *p_cb) p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS|BTA_HH_LE_DISC_DIS); /* read DIS info */ - if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback)) + if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback, DIS_ATTR_PNP_ID_BIT)) { APPL_TRACE_ERROR("read DIS failed"); p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS; diff --git a/stack/include/srvc_api.h b/stack/include/srvc_api.h index e957ff263..d04964ad9 100644 --- a/stack/include/srvc_api.h +++ b/stack/include/srvc_api.h @@ -176,7 +176,8 @@ extern "C" ** Returns void ** *******************************************************************************/ - GATT_API extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback); + GATT_API extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback, + tDIS_ATTR_MASK mask); /******************************************************************************* ** BATTERY SERVICE API diff --git a/stack/srvc/srvc_dis.c b/stack/srvc/srvc_dis.c index c9d8a395a..e29221282 100644 --- a/stack/srvc/srvc_dis.c +++ b/stack/srvc/srvc_dis.c @@ -25,8 +25,6 @@ #if BLE_INCLUDED == TRUE -#define DIS_UUID_TO_ATTR_MASK(x) (UINT16)(1 << ((x) - GATT_UUID_SYSTEM_ID)) - #define DIS_MAX_NUM_INC_SVR 0 #define DIS_MAX_CHAR_NUM 9 #define DIS_MAX_ATTR_NUM (DIS_MAX_CHAR_NUM * 2 + DIS_MAX_NUM_INC_SVR + 1) @@ -57,6 +55,34 @@ static const UINT16 dis_attr_uuid[DIS_MAX_CHAR_NUM] = }; tDIS_CB dis_cb; + +static tDIS_ATTR_MASK dis_uuid_to_attr(UINT16 uuid) +{ + switch (uuid) + { + case GATT_UUID_SYSTEM_ID: + return DIS_ATTR_SYS_ID_BIT; + case GATT_UUID_MODEL_NUMBER_STR: + return DIS_ATTR_MODEL_NUM_BIT; + case GATT_UUID_SERIAL_NUMBER_STR: + return DIS_ATTR_SERIAL_NUM_BIT; + case GATT_UUID_FW_VERSION_STR: + return DIS_ATTR_FW_NUM_BIT; + case GATT_UUID_HW_VERSION_STR: + return DIS_ATTR_HW_NUM_BIT; + case GATT_UUID_SW_VERSION_STR: + return DIS_ATTR_SW_NUM_BIT; + case GATT_UUID_MANU_NAME: + return DIS_ATTR_MANU_NAME_BIT; + case GATT_UUID_IEEE_DATA: + return DIS_ATTR_IEEE_DATA_BIT; + case GATT_UUID_PNP_ID: + return DIS_ATTR_PNP_ID_BIT; + default: + return 0; + }; +} + /******************************************************************************* ** dis_valid_handle_range ** @@ -212,17 +238,18 @@ BOOLEAN dis_gatt_c_read_dis_req(UINT16 conn_id) while (dis_cb.dis_read_uuid_idx < DIS_MAX_CHAR_NUM) { - param.service.uuid.uu.uuid16 = dis_attr_uuid[dis_cb.dis_read_uuid_idx]; - - if (GATTC_Read(conn_id, GATT_READ_BY_TYPE, ¶m) == GATT_SUCCESS) - { - return(TRUE); - } - else + if (dis_uuid_to_attr(dis_attr_uuid[dis_cb.dis_read_uuid_idx]) & + dis_cb.request_mask) { + param.service.uuid.uu.uuid16 = dis_attr_uuid[dis_cb.dis_read_uuid_idx]; + + if (GATTC_Read(conn_id, GATT_READ_BY_TYPE, ¶m) == GATT_SUCCESS) + return TRUE; + GATT_TRACE_ERROR ("Read DISInfo: 0x%04x GATT_Read Failed", param.service.uuid.uu.uuid16); - dis_cb.dis_read_uuid_idx ++; } + + dis_cb.dis_read_uuid_idx++; } dis_gatt_c_read_dis_value_cmpl(conn_id); @@ -291,7 +318,7 @@ void dis_c_cmpl_cback (tSRVC_CLCB *p_clcb, tGATTC_OPTYPE op, GKI_freebuf(p_str); if ((p_str = (UINT8 *)GKI_getbuf((UINT16)(p_data->att_value.len + 1))) != NULL) { - p_clcb->dis_value.attr_mask |= DIS_UUID_TO_ATTR_MASK (read_type); + p_clcb->dis_value.attr_mask |= dis_uuid_to_attr(read_type); memcpy(p_str, p_data->att_value.value, p_data->att_value.len); p_str[p_data->att_value.len] = 0; p_clcb->dis_value.data_string[read_type - GATT_UUID_MODEL_NUMBER_STR] = p_str; @@ -425,7 +452,7 @@ Overrunning static array "dis_cb.dis_value.data_string", with 7 elements, at pos ** Returns void ** *******************************************************************************/ -BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback) +BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback, tDIS_ATTR_MASK mask) { UINT16 conn_id; @@ -443,6 +470,8 @@ BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback) /* Mark currently active operation */ dis_cb.dis_read_uuid_idx = 0; + dis_cb.request_mask = mask; + GATT_TRACE_EVENT ("DIS_ReadDISInfo() - BDA: %08x%04x cl_read_uuid: 0x%04x", (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3], (peer_bda[4]<<8)+peer_bda[5], dis_attr_uuid[dis_cb.dis_read_uuid_idx]); diff --git a/stack/srvc/srvc_dis_int.h b/stack/srvc/srvc_dis_int.h index f8180637f..f9f4dcdaa 100644 --- a/stack/srvc/srvc_dis_int.h +++ b/stack/srvc/srvc_dis_int.h @@ -50,6 +50,8 @@ typedef struct BOOLEAN enabled; UINT8 dis_read_uuid_idx; + + tDIS_ATTR_MASK request_mask; }tDIS_CB; -- 2.11.0