Add support for multiple charateristics with same UUID 59/277359/1
authorAnuj Jain <anuj01.jain@samsung.com>
Tue, 5 Jul 2022 12:32:37 +0000 (18:02 +0530)
committerAnuj Jain <anuj01.jain@samsung.com>
Tue, 5 Jul 2022 12:32:37 +0000 (18:02 +0530)
This patch adds support to handle GATT operations on multiple
characteristics of a Service with same UUID.

Change-Id: Ic3574862d76a050baf9e2ebb0e90e8767a4bbfbf
Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
bt-oal/bluez_hal/inc/bt-hal-msg.h
bt-oal/bluez_hal/src/bt-hal-gatt-client.c
bt-oal/bluez_hal/src/bt-hal-gatt.c

index 56884ae..b11ec31 100644 (file)
@@ -697,6 +697,7 @@ struct hal_ev_gatt_client_char_search_result {
        uint8_t svc_uuid[16];
        uint8_t char_uuid[16];
        int32_t char_prop;
+       int32_t char_handle;
 } __attribute__((packed));
 
 #define HAL_EV_GATT_CLIENT_DESC_SEARCH_RESULT 0XC2
@@ -708,6 +709,7 @@ struct hal_ev_gatt_client_desc_search_result {
        uint8_t svc_uuid[16];
        uint8_t char_uuid[16];
        uint8_t desc_uuid[16];
+       uint32_t char_handle;
 } __attribute__((packed));
 
 #define HAL_EV_GATT_CLIENT_READ_CHARAC 0XC3
@@ -722,6 +724,7 @@ struct hal_ev_gatt_client_read_data {
        uint8_t desc_uuid[16];
        uint8_t value[600];
        int32_t len;
+       uint32_t char_handle;
 } __attribute__((packed));
 
 #define HAL_EV_GATT_CLIENT_WRITE_CHARAC        0XC5
@@ -734,6 +737,7 @@ struct hal_ev_gatt_client_write_result {
        uint8_t svc_uuid[16];
        uint8_t char_uuid[16];
        uint8_t desc_uuid[16];
+       uint32_t char_handle;
 } __attribute__((packed));
 
 #define HAL_EV_GATT_CLIENT_WATCH_NOTIFICATION  0XC7
@@ -745,6 +749,7 @@ struct hal_ev_gatt_client_watch_notification {
        int32_t inst_id;
        uint8_t svc_uuid[16];
        uint8_t char_uuid[16];
+       uint32_t char_handle;
 } __attribute__((packed));
 
 #define HAL_EV_GATT_ACQUIRE_WRITE  0XC8
@@ -786,6 +791,7 @@ struct hal_ev_gatt_client_notify_changed_value {
        uint8_t svc_uuid[16];
        uint8_t char_uuid[16];
        uint8_t is_notify;
+       uint32_t char_handle;
 } __attribute__((packed));
 
 #define HAL_EV_GATT_SERVER_MTU_CHANGED 0XCC
index 219e80b..a119b54 100644 (file)
@@ -1001,7 +1001,7 @@ bt_status_t get_included_service(int conn_id, btgatt_srvc_id_t *srvc_id,
 }
 
 static void _bt_hal_send_client_char_search_result_event(int conn_id, int status,
-               btgatt_srvc_id_t *svc_id, bt_uuid_t *char_uuid, int char_prop)
+               btgatt_srvc_id_t *svc_id, bt_uuid_t *char_uuid, int char_prop, char *char_handle)
 {
        struct hal_ev_gatt_client_char_search_result  ev;
 
@@ -1021,6 +1021,8 @@ static void _bt_hal_send_client_char_search_result_event(int conn_id, int status
                /* building char uuid */
                memcpy(ev.char_uuid, char_uuid->uu, sizeof(ev.char_uuid));
                ev.char_prop = char_prop;
+
+               ev.char_handle = (int)strtol(char_handle +54, NULL, 16);
        }
 
        DBG("sending the char search event.  conn_id[%d] status[%d]", conn_id, status);
@@ -1232,12 +1234,12 @@ static bt_status_t _gattc_get_all_characteristic(int conn_id,
                /* send event */
                if (BT_STATUS_SUCCESS == status) {
                        _bt_hal_send_client_char_search_result_event(conn_id, status, srvc_id,
-                                       &gattc_char->chr_uuid, gattc_char->permission);
+                                       &gattc_char->chr_uuid, gattc_char->permission, gattc_char->chr_path);
                }
        }
 
        status = BT_STATUS_FAIL;
-       _bt_hal_send_client_char_search_result_event(conn_id, status, srvc_id, NULL, 0);
+       _bt_hal_send_client_char_search_result_event(conn_id, status, srvc_id, NULL, 0, NULL);
 
        browse_service_char(conn_id);
        /* retrive uuid for characteristic and object path for descriptor */
@@ -1352,6 +1354,7 @@ static void _bt_hal_send_client_desc_search_result_event(int conn_id, int status
        ev.inst_id = svc_id->id.inst_id;
        ev.is_primary = svc_id->is_primary;
        ev.status = status;
+       ev.char_handle = char_id->inst_id;
 
        memcpy(ev.svc_uuid, svc_id->id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, char_id->uuid.uu, sizeof(ev.char_uuid));
@@ -1395,14 +1398,17 @@ static bt_status_t _hal_gattc_get_all_descriptor(int conn_id,
        _bt_hal_convert_uuid_type_to_string(svc_uuid_str, gattc_service->svc_uuid.uu);
 //     DBG("%s %s", gattc_service->svc_path + 37, svc_uuid_str);
 
+       int characteristic_handle;
        /* find characteristics */
        /* a service can have two char with same uuid */
        for (l = gattc_service->gatt_list_chars; l != NULL; l = g_slist_next(l)) {
                gattc_char = (hal_gattc_char_t*)l->data;
                if (gattc_char == NULL)
                        continue;
+               characteristic_handle = (int)strtol(gattc_char->chr_path + 54, NULL, 16);
 
-               if (!memcmp(&gattc_char->chr_uuid, &char_id->uuid, sizeof(bt_uuid_t))) {
+               if (!memcmp(&gattc_char->chr_uuid, &char_id->uuid, sizeof(bt_uuid_t)) &&
+                               characteristic_handle == char_id->inst_id) {
                        _bt_hal_convert_uuid_type_to_string(char_uuid_str, gattc_char->chr_uuid.uu);
 //                     DBG("%s %s", gattc_char->chr_path + 37, char_uuid_str);
 
@@ -1464,6 +1470,7 @@ static void __hal_send_char_read_event(hal_gatt_resp_data_t *resp_data, int resu
        ev.inst_id = resp_data->srvc_id.id.inst_id;
        ev.is_primary = resp_data->srvc_id.is_primary;
        ev.status = result;
+       ev.char_handle = resp_data->char_id.inst_id;
 
        memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid));
@@ -1617,6 +1624,7 @@ static void __hal_send_char_write_event(hal_gatt_resp_data_t *resp_data, int res
        ev.inst_id = resp_data->srvc_id.id.inst_id;
        ev.is_primary = resp_data->srvc_id.is_primary;
        ev.status = result;
+       ev.char_handle = resp_data->char_id.inst_id;
 
        memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid));
@@ -1986,6 +1994,7 @@ static void __hal_send_desc_read_event(hal_gatt_resp_data_t *resp_data, int resu
        ev.inst_id = resp_data->srvc_id.id.inst_id;
        ev.is_primary = resp_data->srvc_id.is_primary;
        ev.status = result;
+       ev.char_handle = resp_data->char_id.inst_id;
 
        memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid));
@@ -2171,6 +2180,7 @@ static void __hal_send_desc_write_event(hal_gatt_resp_data_t *resp_data, int res
        ev.inst_id = resp_data->srvc_id.id.inst_id;
        ev.is_primary = resp_data->srvc_id.is_primary;
        ev.status = result;
+       ev.char_handle = resp_data->char_id.inst_id;
 
        memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid));
@@ -2364,6 +2374,7 @@ static gboolean _hal_watch_register_notifi_cb(gpointer user_data)
 
        ev.is_primary = resp_data->srvc_id.is_primary;
        ev.inst_id = resp_data->srvc_id.id.inst_id;
+       ev.char_handle = resp_data->char_id.inst_id;
 
        memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid));
@@ -2524,6 +2535,7 @@ static gboolean _hal_watch_deregister_notifi_cb(gpointer user_data)
 
        ev.is_primary = resp_data->srvc_id.is_primary;
        ev.inst_id = resp_data->srvc_id.id.inst_id;
+       ev.char_handle = resp_data->char_id.inst_id;
 
        memcpy(ev.svc_uuid, resp_data->srvc_id.id.uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, resp_data->char_id.uuid.uu, sizeof(ev.char_uuid));
@@ -4041,6 +4053,8 @@ static void _bt_hal_send_value_changed_event(hal_gattc_server_info_t *conn_info,
        ev.conn_id = gattc_client->conn_id;
        ev.inst_id = conn_info->inst_id;
        ev.is_primary = svc_info->is_primary;
+       ev.char_handle = (int)strtol(char_info->chr_path +54, NULL, 16);
+
        memcpy(ev.svc_uuid, svc_info->svc_uuid.uu, sizeof(ev.svc_uuid));
        memcpy(ev.char_uuid, char_info->chr_uuid.uu, sizeof(ev.char_uuid));
 
index 0ec2253..371461a 100644 (file)
@@ -526,7 +526,7 @@ static void __bt_handle_gatt_client_search_char_result(void *buf, uint16_t len)
 
        if (BT_STATUS_SUCCESS == ev->status) {
                memcpy(gatt_char_id.uuid.uu, ev->char_uuid, 16);
-               gatt_char_id.inst_id = ev->inst_id;
+               gatt_char_id.inst_id = ev->char_handle;
        }
 
        if (bt_gatt_callbacks->client->get_characteristic_cb)
@@ -547,7 +547,7 @@ static void __bt_handle_gatt_client_search_desc_result(void *buf, uint16_t len)
        memcpy(gatt_srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
        memcpy(gatt_char_id.uuid.uu, ev->char_uuid, 16);
-       gatt_char_id.inst_id = ev->inst_id;
+       gatt_char_id.inst_id = ev->char_handle;
 
        if (BT_STATUS_SUCCESS == ev->status) {
                memcpy(gatt_desc_id.uuid.uu, ev->desc_uuid, 16);
@@ -568,7 +568,7 @@ static void __bt_handle_gatt_client_read_charac(void *buf, uint16_t len)
        char_read_parm.srvc_id.id.inst_id = ev->inst_id;
        memcpy(char_read_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
-       char_read_parm.char_id.inst_id = ev->inst_id;
+       char_read_parm.char_id.inst_id = ev->char_handle;
        memcpy(char_read_parm.char_id.uuid.uu, ev->char_uuid, 16);
 
        char_read_parm.value.len = ev->len;
@@ -591,7 +591,7 @@ static void __bt_handle_gatt_client_read_desc(void *buf, uint16_t len)
        desc_read_parm.srvc_id.id.inst_id = ev->inst_id;
        memcpy(desc_read_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
-       desc_read_parm.char_id.inst_id = ev->inst_id;
+       desc_read_parm.char_id.inst_id = ev->char_handle;
        memcpy(desc_read_parm.char_id.uuid.uu, ev->char_uuid, 16);
 
        desc_read_parm.descr_id.inst_id = ev->inst_id;
@@ -617,7 +617,7 @@ static void __bt_handle_gatt_client_write_char(void *buf, uint16_t len)
        char_write_parm.srvc_id.id.inst_id = ev->inst_id;
        memcpy(char_write_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
-       char_write_parm.char_id.inst_id = ev->inst_id;
+       char_write_parm.char_id.inst_id = ev->char_handle;
        memcpy(char_write_parm.char_id.uuid.uu, ev->char_uuid, 16);
 
        if (bt_gatt_callbacks->client->write_characteristic_cb)
@@ -634,7 +634,7 @@ static void __bt_handle_gatt_client_write_desc(void *buf, uint16_t len)
        desc_write_parm.srvc_id.id.inst_id = ev->inst_id;
        memcpy(desc_write_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
-       desc_write_parm.char_id.inst_id = ev->inst_id;
+       desc_write_parm.char_id.inst_id = ev->char_handle;
        memcpy(desc_write_parm.char_id.uuid.uu, ev->char_uuid, 16);
 
        desc_write_parm.descr_id.inst_id = ev->inst_id;
@@ -656,7 +656,7 @@ static void __bt_handle_gatt_client_watch_notification(void *buf, uint16_t len)
        memcpy(gatt_srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
        memcpy(gatt_char_id.uuid.uu, ev->char_uuid, 16);
-       gatt_char_id.inst_id = ev->inst_id;
+       gatt_char_id.inst_id = ev->char_handle;
 
        if (bt_gatt_callbacks->client->register_for_notification_cb)
                bt_gatt_callbacks->client->register_for_notification_cb(ev->conn_id,
@@ -672,8 +672,9 @@ static void __bt_handle_gatt_client_changed_value(void *buf, uint16_t len)
        changd_value_parm.srvc_id.id.inst_id = ev->inst_id;
        memcpy(changd_value_parm.srvc_id.id.uuid.uu, ev->svc_uuid, 16);
 
-       changd_value_parm.char_id.inst_id = ev->inst_id;
+       changd_value_parm.char_id.inst_id = ev->char_handle;
        memcpy(changd_value_parm.char_id.uuid.uu, ev->char_uuid, 16);
+
        changd_value_parm.is_notify = ev->is_notify;
 
        memcpy(changd_value_parm.bda.address, ev->bdaddr, 6);