gattlib.h: Pass 'uuid' instead of 'handle' to 'gattlib_event_handler_t'

pull/21/head
Olivier Martin 2017-03-15 01:41:08 +01:00
parent 1655e8c329
commit 5391388201
6 changed files with 56 additions and 16 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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]);

View File

@ -23,8 +23,8 @@
#include <readline/readline.h>
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);

View File

@ -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]);

View File

@ -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;