From 53913882015daf6c8adf0ae2e7dd5c44cb84b581 Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Wed, 15 Mar 2017 01:41:08 +0100 Subject: [PATCH] gattlib.h: Pass 'uuid' instead of 'handle' to 'gattlib_event_handler_t' --- bluez/gattlib_connect.c | 49 +++++++++++++++++++++++++----- bluez/gattlib_internal.h | 3 ++ examples/gatttool/gatttool.c | 12 +++++--- examples/gatttool/gatttool.h | 4 +-- examples/nordic_uart/nordic_uart.c | 2 +- include/gattlib.h | 2 +- 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/bluez/gattlib_connect.c b/bluez/gattlib_connect.c index c1cafae..81cf428 100644 --- a/bluez/gattlib_connect.c +++ b/bluez/gattlib_connect.c @@ -52,6 +52,7 @@ static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) gatt_connection_t *conn = user_data; uint8_t opdu[ATT_MAX_MTU]; uint16_t handle, olen = 0; + uuid_t uuid; #if BLUEZ_VERSION_MAJOR == 4 handle = att_get_u16(&pdu[1]); @@ -59,15 +60,20 @@ static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) handle = get_le16(&pdu[1]); #endif + int ret = get_uuid_from_handle(conn, handle, &uuid); + if (ret) { + return; + } + switch (pdu[0]) { case ATT_OP_HANDLE_NOTIFY: if (conn->notification_handler) { - conn->notification_handler(handle, &pdu[3], len - 3, conn->notification_user_data); + conn->notification_handler(&uuid, &pdu[3], len - 3, conn->notification_user_data); } break; case ATT_OP_HANDLE_IND: if (conn->indication_handler) { - conn->indication_handler(handle, &pdu[3], len - 3, conn->indication_user_data); + conn->indication_handler(&uuid, &pdu[3], len - 3, conn->indication_user_data); } break; default: @@ -140,6 +146,11 @@ static void io_connect_cb(GIOChannel *io, GError *err, gpointer user_data) { g_source_unref (source); assert(id != 0); + // + // Save list of characteristics to do the correspondence handle/UUID + // + gattlib_discover_char(io_connect_arg->conn, &conn_context->characteristics, &conn_context->characteristic_count); + // // Call callback if defined // @@ -428,12 +439,34 @@ GSource* gattlib_timeout_add_seconds(guint interval, GSourceFunc function, gpoin return source; } -void gattlib_register_notification(gatt_connection_t* connection, gattlib_event_handler_t notification_handler, void* user_data) { - connection->notification_handler = notification_handler; - connection->notification_user_data = user_data; +int get_uuid_from_handle(gatt_connection_t* connection, uint16_t handle, uuid_t* uuid) { + gattlib_context_t* conn_context = connection->context; + int i; + + for (i = 0; i < conn_context->characteristic_count; i++) { + if (conn_context->characteristics[i].value_handle == handle) { + memcpy(uuid, &conn_context->characteristics[i].uuid, sizeof(uuid_t)); + return 0; + } + + + if (gattlib_uuid_cmp(&conn_context->characteristics[i].uuid, uuid) == 0) { + handle = conn_context->characteristics[i].value_handle; + return 0; + } + } + return -1; } -void gattlib_register_indication(gatt_connection_t* connection, gattlib_event_handler_t indication_handler, void* user_data) { - connection->indication_handler = indication_handler; - connection->indication_user_data = user_data; +int get_handle_from_uuid(gatt_connection_t* connection, const uuid_t* uuid, uint16_t* handle) { + gattlib_context_t* conn_context = connection->context; + int i; + + for (i = 0; i < conn_context->characteristic_count; i++) { + if (gattlib_uuid_cmp(&conn_context->characteristics[i].uuid, uuid) == 0) { + *handle = conn_context->characteristics[i].value_handle; + return 0; + } + } + return -1; } diff --git a/bluez/gattlib_internal.h b/bluez/gattlib_internal.h index 34b4cdd..3300dbe 100644 --- a/bluez/gattlib_internal.h +++ b/bluez/gattlib_internal.h @@ -66,4 +66,7 @@ GSource* gattlib_timeout_add_seconds(guint interval, GSourceFunc function, gpoin void uuid_to_bt_uuid(uuid_t* uuid, bt_uuid_t* bt_uuid); void bt_uuid_to_uuid(bt_uuid_t* bt_uuid, uuid_t* uuid); +int get_uuid_from_handle(gatt_connection_t* connection, uint16_t handle, uuid_t* uuid); +int get_handle_from_uuid(gatt_connection_t* connection, const uuid_t* uuid, uint16_t* handle); + #endif diff --git a/examples/gatttool/gatttool.c b/examples/gatttool/gatttool.c index b85bfab..e431a1b 100644 --- a/examples/gatttool/gatttool.c +++ b/examples/gatttool/gatttool.c @@ -76,10 +76,12 @@ struct characteristic_data { uint16_t end; }; -void notification_handler(uint16_t handle, const uint8_t* data, size_t data_length, void* user_data) { +void notification_handler(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data) { + char uuid_str[MAX_LEN_UUID_STR + 1]; int i; - g_print("Notification handle = 0x%04x value: ", handle); + gattlib_uuid_to_string(uuid, uuid_str, MAX_LEN_UUID_STR + 1); + g_print("Notification uuid = %s value: ", uuid_str); for (i = 0; i < data_length; i++) g_print("%02x ", data[i]); @@ -88,10 +90,12 @@ void notification_handler(uint16_t handle, const uint8_t* data, size_t data_leng rl_forced_update_display(); } -void indication_handler(uint16_t handle, const uint8_t* data, size_t data_length, void* user_data) { +void indication_handler(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data) { + char uuid_str[MAX_LEN_UUID_STR + 1]; int i; - g_print("Indication handle = 0x%04x value: ", handle); + gattlib_uuid_to_string(uuid, uuid_str, MAX_LEN_UUID_STR + 1); + g_print("Indication uuid = %s value: ", uuid_str); for (i = 0; i < data_length; i++) g_print("%02x ", data[i]); diff --git a/examples/gatttool/gatttool.h b/examples/gatttool/gatttool.h index 08f282f..ca84ceb 100644 --- a/examples/gatttool/gatttool.h +++ b/examples/gatttool/gatttool.h @@ -23,8 +23,8 @@ #include -void notification_handler(uint16_t handle, const uint8_t* data, size_t data_length, void* user_data); -void indication_handler(uint16_t handle, const uint8_t* data, size_t data_length, void* user_data); +void notification_handler(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data); +void indication_handler(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data); int interactive(const gchar *src, const gchar *dst, const gchar *dst_type, gboolean le); diff --git a/examples/nordic_uart/nordic_uart.c b/examples/nordic_uart/nordic_uart.c index f10a7e9..9702b62 100644 --- a/examples/nordic_uart/nordic_uart.c +++ b/examples/nordic_uart/nordic_uart.c @@ -35,7 +35,7 @@ gatt_connection_t* m_connection; -void notification_cb(uint16_t handle, const uint8_t* data, size_t data_length, void* user_data) { +void notification_cb(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data) { int i; for(i = 0; i < data_length; i++) { printf("%c", data[i]); diff --git a/include/gattlib.h b/include/gattlib.h index 20ec78f..76cb698 100644 --- a/include/gattlib.h +++ b/include/gattlib.h @@ -65,7 +65,7 @@ typedef enum { typedef struct _GAttrib GAttrib; -typedef void (*gattlib_event_handler_t)(uint16_t handle, const uint8_t* data, size_t data_length, void* user_data); +typedef void (*gattlib_event_handler_t)(const uuid_t* uuid, const uint8_t* data, size_t data_length, void* user_data); typedef struct _gatt_connection_t { void* context;