diff --git a/android/hal-gatt.c b/android/hal-gatt.c
index 0e81a56..ce59f96 100644
--- a/android/hal-gatt.c
+++ b/android/hal-gatt.c
*/
#include <stdbool.h>
+#include <string.h>
#include "hal-log.h"
#include "hal.h"
return cbs != NULL;
}
+static void gatt_id_from_hal(btgatt_gatt_id_t *to,
+ struct hal_gatt_gatt_id *from)
+{
+ memcpy(&to->uuid, from->uuid, sizeof(to->uuid));
+ to->inst_id = from->inst_id;
+}
+
+static void srvc_id_from_hal(btgatt_srvc_id_t *to,
+ struct hal_gatt_srvc_id *from)
+{
+ memcpy(&to->id.uuid, from->uuid, sizeof(to->id.uuid));
+ to->id.inst_id = from->inst_id;
+ to->is_primary = from->is_primary;
+}
+
/* Client Event Handlers */
static void handle_register_client(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_register_client *ev = buf;
+ if (cbs->client->register_client_cb)
+ cbs->client->register_client_cb(ev->status, ev->client_if,
+ (bt_uuid_t *) ev->app_uuid);
}
static void handle_scan_result(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_scan_result *ev = buf;
+ if (cbs->client->scan_result_cb)
+ cbs->client->scan_result_cb((bt_bdaddr_t *) ev->bda, ev->rssi,
+ ev->adv_data);
}
static void handle_connect(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_connect *ev = buf;
+ if (cbs->client->open_cb)
+ cbs->client->open_cb(ev->conn_id, ev->status, ev->client_if,
+ (bt_bdaddr_t *) ev->bda);
}
static void handle_disconnect(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_disconnect *ev = buf;
+ if (cbs->client->close_cb)
+ cbs->client->close_cb(ev->conn_id, ev->status, ev->client_if,
+ (bt_bdaddr_t *) ev->bda);
}
static void handle_search_complete(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_search_complete *ev = buf;
+ if (cbs->client->search_complete_cb)
+ cbs->client->search_complete_cb(ev->conn_id, ev->status);
}
static void handle_search_result(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_search_result *ev = buf;
+
+ btgatt_srvc_id_t srvc_id;
+ srvc_id_from_hal(&srvc_id, &ev->srvc_id);
+ if (cbs->client->search_result_cb)
+ cbs->client->search_result_cb(ev->conn_id, &srvc_id);
}
static void handle_get_characteristic(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_get_characteristic *ev = buf;
+ btgatt_gatt_id_t char_id;
+ btgatt_srvc_id_t srvc_id;
+ srvc_id_from_hal(&srvc_id, &ev->srvc_id);
+ gatt_id_from_hal(&char_id, &ev->char_id);
+
+ if (cbs->client->get_characteristic_cb)
+ cbs->client->get_characteristic_cb(ev->conn_id, ev->status,
+ &srvc_id, &char_id,
+ ev->char_prop);
}
static void handle_get_descriptor(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_get_descriptor *ev = buf;
+ btgatt_gatt_id_t descr_id;
+ btgatt_gatt_id_t char_id;
+ btgatt_srvc_id_t srvc_id;
+
+ srvc_id_from_hal(&srvc_id, &ev->srvc_id);
+ gatt_id_from_hal(&char_id, &ev->char_id);
+ gatt_id_from_hal(&descr_id, &ev->descr_id);
+ if (cbs->client->get_descriptor_cb)
+ cbs->client->get_descriptor_cb(ev->conn_id, ev->status,
+ &srvc_id, &char_id, &descr_id);
}
static void handle_get_included_service(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_get_inc_service *ev = buf;
+ btgatt_srvc_id_t srvc_id;
+ btgatt_srvc_id_t incl_srvc_id;
+ srvc_id_from_hal(&srvc_id, &ev->srvc_id);
+ srvc_id_from_hal(&incl_srvc_id, &ev->incl_srvc_id);
+
+ if (cbs->client->get_included_service_cb)
+ cbs->client->get_included_service_cb(ev->conn_id, ev->status,
+ &srvc_id,
+ &incl_srvc_id);
}
static void handle_register_for_notification(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_reg_for_notif *ev = buf;
+ btgatt_gatt_id_t char_id;
+ btgatt_srvc_id_t srvc_id;
+
+ srvc_id_from_hal(&srvc_id, &ev->srvc_id);
+ gatt_id_from_hal(&char_id, &ev->char_id);
+ if (cbs->client->register_for_notification_cb)
+ cbs->client->register_for_notification_cb(ev->conn_id,
+ ev->registered,
+ ev->status,
+ &srvc_id,
+ &char_id);
}
static void handle_notify(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_notify *ev = buf;
+ btgatt_notify_params_t params;
+
+ memset(¶ms, 0, sizeof(params));
+ memcpy(params.value, ev->value, ev->len);
+ memcpy(¶ms.bda, ev->bda, sizeof(params.bda));
+
+ srvc_id_from_hal(¶ms.srvc_id, &ev->srvc_id);
+ gatt_id_from_hal(¶ms.char_id, &ev->char_id);
+
+ params.len = ev->len;
+ params.is_notify = ev->is_notify;
+ if (cbs->client->notify_cb)
+ cbs->client->notify_cb(ev->conn_id, ¶ms);
}
static void handle_read_characteristic(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_read_characteristic *ev = buf;
+ btgatt_read_params_t params;
+ memset(¶ms, 0, sizeof(params));
+
+ srvc_id_from_hal(¶ms.srvc_id, &ev->data.srvc_id);
+ gatt_id_from_hal(¶ms.char_id, &ev->data.char_id);
+ gatt_id_from_hal(¶ms.descr_id, &ev->data.descr_id);
+
+ memcpy(¶ms.value.value, ev->data.value, ev->data.len);
+
+ params.value_type = ev->data.value_type;
+ params.value.len = ev->data.len;
+ params.status = ev->data.status;
+
+ if (cbs->client->read_characteristic_cb)
+ cbs->client->read_characteristic_cb(ev->conn_id, ev->status,
+ ¶ms);
}
static void handle_write_characteristic(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_write_characteristic *ev = buf;
+ btgatt_write_params_t params;
+
+ memset(¶ms, 0, sizeof(params));
+
+ srvc_id_from_hal(¶ms.srvc_id, &ev->data.srvc_id);
+ gatt_id_from_hal(¶ms.char_id, &ev->data.char_id);
+ gatt_id_from_hal(¶ms.descr_id, &ev->data.descr_id);
+
+ params.status = ev->data.status;
+ if (cbs->client->write_characteristic_cb)
+ cbs->client->write_characteristic_cb(ev->conn_id, ev->status,
+ ¶ms);
}
static void handle_read_descriptor(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_read_descriptor *ev = buf;
+ btgatt_read_params_t params;
+ memset(¶ms, 0, sizeof(params));
+
+ srvc_id_from_hal(¶ms.srvc_id, &ev->data.srvc_id);
+ gatt_id_from_hal(¶ms.char_id, &ev->data.char_id);
+ gatt_id_from_hal(¶ms.descr_id, &ev->data.descr_id);
+
+ memcpy(¶ms.value.value, ev->data.value, ev->data.len);
+
+ params.value_type = ev->data.value_type;
+ params.value.len = ev->data.len;
+ params.status = ev->data.status;
+
+ if (cbs->client->read_descriptor_cb)
+ cbs->client->read_descriptor_cb(ev->conn_id, ev->status,
+ ¶ms);
}
static void handle_write_descriptor(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_write_descriptor *ev = buf;
+ btgatt_write_params_t params;
+
+ memset(¶ms, 0, sizeof(params));
+
+ srvc_id_from_hal(¶ms.srvc_id, &ev->data.srvc_id);
+ gatt_id_from_hal(¶ms.char_id, &ev->data.char_id);
+ gatt_id_from_hal(¶ms.descr_id, &ev->data.descr_id);
+
+ params.status = ev->data.status;
+ if (cbs->client->write_descriptor_cb)
+ cbs->client->write_descriptor_cb(ev->conn_id, ev->status,
+ ¶ms);
}
static void handle_execute_write(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_exec_write *ev = buf;
+ if (cbs->client->execute_write_cb)
+ cbs->client->execute_write_cb(ev->conn_id, ev->status);
}
static void handle_read_remote_rssi(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_read_remote_rssi *ev = buf;
+ if (cbs->client->read_remote_rssi_cb)
+ cbs->client->read_remote_rssi_cb(ev->client_if,
+ (bt_bdaddr_t *) ev->address,
+ ev->rssi, ev->status);
}
static void handle_listen(void *buf, uint16_t len)
{
+ struct hal_ev_gatt_client_listen *ev = buf;
+ if (cbs->client->listen_cb)
+ cbs->client->listen_cb(ev->status, ev->server_if);
}
/* Server Event Handlers */
sizeof(struct hal_ev_gatt_client_read_characteristic)},
{handle_write_characteristic, false,
sizeof(struct hal_ev_gatt_client_write_characteristic)},
- {handle_read_descriptor, false,
+ {handle_read_descriptor, true,
sizeof(struct hal_ev_gatt_client_read_descriptor)},
{handle_write_descriptor, false,
sizeof(struct hal_ev_gatt_client_write_descriptor)},