From b6cb2d3ec320bdfdf1cdcdf750e767d214170efd Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 11 Nov 2015 13:08:52 +0200 Subject: bas: Move code from android to profiles This is a place holder until the code is ported to use shared API so it can be shared by android and D-Bus daemon. --- android/Android.mk | 2 +- android/Makefile.am | 2 +- android/bas.c | 340 ---------------------------------------------------- android/bas.h | 32 ----- android/hog.c | 2 +- 5 files changed, 3 insertions(+), 375 deletions(-) delete mode 100644 android/bas.c delete mode 100644 android/bas.h (limited to 'android') diff --git a/android/Android.mk b/android/Android.mk index 89ca2c268..2f1f6bbdc 100644 --- a/android/Android.mk +++ b/android/Android.mk @@ -41,7 +41,7 @@ LOCAL_SRC_FILES := \ bluez/android/bluetooth.c \ bluez/android/scpp.c \ bluez/android/dis.c \ - bluez/android/bas.c \ + bluez/profiles/battery/bas.c \ bluez/android/hog.c \ bluez/android/hidhost.c \ bluez/android/socket.c \ diff --git a/android/Makefile.am b/android/Makefile.am index cb32bc3df..63bcb63ee 100644 --- a/android/Makefile.am +++ b/android/Makefile.am @@ -30,7 +30,7 @@ android_bluetoothd_SOURCES = android/main.c \ android/hidhost.h android/hidhost.c \ android/scpp.h android/scpp.c \ android/dis.h android/dis.c \ - android/bas.h android/bas.c \ + profiles/battery/bas.h profiles/battery/bas.c \ android/hog.h android/hog.c \ android/ipc-common.h \ android/ipc.h android/ipc.c \ diff --git a/android/bas.c b/android/bas.c deleted file mode 100644 index 7a1c4ca56..000000000 --- a/android/bas.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2014 Intel Corporation. All rights reserved. - * - * - * This library is free software; you can rebastribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is bastributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include - -#include "src/log.h" - -#include "lib/bluetooth.h" -#include "lib/sdp.h" -#include "lib/uuid.h" - -#include "src/shared/util.h" -#include "src/shared/queue.h" - -#include "attrib/gattrib.h" -#include "attrib/att.h" -#include "attrib/gatt.h" - -#include "android/bas.h" - -#define ATT_NOTIFICATION_HEADER_SIZE 3 -#define ATT_READ_RESPONSE_HEADER_SIZE 1 - -struct bt_bas { - int ref_count; - GAttrib *attrib; - struct gatt_primary *primary; - uint16_t handle; - uint16_t ccc_handle; - guint id; - struct queue *gatt_op; -}; - -struct gatt_request { - unsigned int id; - struct bt_bas *bas; - void *user_data; -}; - -static void destroy_gatt_req(struct gatt_request *req) -{ - queue_remove(req->bas->gatt_op, req); - bt_bas_unref(req->bas); - free(req); -} - -static void bas_free(struct bt_bas *bas) -{ - bt_bas_detach(bas); - - g_free(bas->primary); - queue_destroy(bas->gatt_op, (void *) destroy_gatt_req); - free(bas); -} - -struct bt_bas *bt_bas_new(void *primary) -{ - struct bt_bas *bas; - - bas = new0(struct bt_bas, 1); - bas->gatt_op = queue_new(); - - if (primary) - bas->primary = g_memdup(primary, sizeof(*bas->primary)); - - return bt_bas_ref(bas); -} - -struct bt_bas *bt_bas_ref(struct bt_bas *bas) -{ - if (!bas) - return NULL; - - __sync_fetch_and_add(&bas->ref_count, 1); - - return bas; -} - -void bt_bas_unref(struct bt_bas *bas) -{ - if (!bas) - return; - - if (__sync_sub_and_fetch(&bas->ref_count, 1)) - return; - - bas_free(bas); -} - -static struct gatt_request *create_request(struct bt_bas *bas, - void *user_data) -{ - struct gatt_request *req; - - req = new0(struct gatt_request, 1); - req->user_data = user_data; - req->bas = bt_bas_ref(bas); - - return req; -} - -static void set_and_store_gatt_req(struct bt_bas *bas, - struct gatt_request *req, - unsigned int id) -{ - req->id = id; - queue_push_head(bas->gatt_op, req); -} - -static void write_char(struct bt_bas *bas, GAttrib *attrib, uint16_t handle, - const uint8_t *value, size_t vlen, - GAttribResultFunc func, - gpointer user_data) -{ - struct gatt_request *req; - unsigned int id; - - req = create_request(bas, user_data); - - id = gatt_write_char(attrib, handle, value, vlen, func, req); - - set_and_store_gatt_req(bas, req, id); -} - -static void read_char(struct bt_bas *bas, GAttrib *attrib, uint16_t handle, - GAttribResultFunc func, gpointer user_data) -{ - struct gatt_request *req; - unsigned int id; - - req = create_request(bas, user_data); - - id = gatt_read_char(attrib, handle, func, req); - - set_and_store_gatt_req(bas, req, id); -} - -static void discover_char(struct bt_bas *bas, GAttrib *attrib, - uint16_t start, uint16_t end, - bt_uuid_t *uuid, gatt_cb_t func, - gpointer user_data) -{ - struct gatt_request *req; - unsigned int id; - - req = create_request(bas, user_data); - - id = gatt_discover_char(attrib, start, end, uuid, func, req); - - set_and_store_gatt_req(bas, req, id); -} - -static void discover_desc(struct bt_bas *bas, GAttrib *attrib, - uint16_t start, uint16_t end, bt_uuid_t *uuid, - gatt_cb_t func, gpointer user_data) -{ - struct gatt_request *req; - unsigned int id; - - req = create_request(bas, user_data); - - id = gatt_discover_desc(attrib, start, end, uuid, func, req); - set_and_store_gatt_req(bas, req, id); -} - -static void notification_cb(const guint8 *pdu, guint16 len, gpointer user_data) -{ - DBG("Battery Level at %u", pdu[ATT_NOTIFICATION_HEADER_SIZE]); -} - -static void read_value_cb(guint8 status, const guint8 *pdu, guint16 len, - gpointer user_data) -{ - DBG("Battery Level at %u", pdu[ATT_READ_RESPONSE_HEADER_SIZE]); -} - -static void ccc_written_cb(guint8 status, const guint8 *pdu, - guint16 plen, gpointer user_data) -{ - struct gatt_request *req = user_data; - struct bt_bas *bas = req->user_data; - - destroy_gatt_req(req); - - if (status != 0) { - error("Write Scan Refresh CCC failed: %s", - att_ecode2str(status)); - return; - } - - DBG("Battery Level: notification enabled"); - - bas->id = g_attrib_register(bas->attrib, ATT_OP_HANDLE_NOTIFY, - bas->handle, notification_cb, bas, - NULL); -} - -static void write_ccc(struct bt_bas *bas, GAttrib *attrib, uint16_t handle, - void *user_data) -{ - uint8_t value[2]; - - put_le16(GATT_CLIENT_CHARAC_CFG_NOTIF_BIT, value); - - write_char(bas, attrib, handle, value, sizeof(value), ccc_written_cb, - user_data); -} - -static void ccc_read_cb(guint8 status, const guint8 *pdu, guint16 len, - gpointer user_data) -{ - struct gatt_request *req = user_data; - struct bt_bas *bas = req->user_data; - - destroy_gatt_req(req); - - if (status != 0) { - error("Error reading CCC value: %s", att_ecode2str(status)); - return; - } - - write_ccc(bas, bas->attrib, bas->ccc_handle, bas); -} - -static void discover_descriptor_cb(uint8_t status, GSList *descs, - void *user_data) -{ - struct gatt_request *req = user_data; - struct bt_bas *bas = req->user_data; - struct gatt_desc *desc; - - destroy_gatt_req(req); - - if (status != 0) { - error("Discover descriptors failed: %s", att_ecode2str(status)); - return; - } - - /* There will be only one descriptor on list and it will be CCC */ - desc = descs->data; - bas->ccc_handle = desc->handle; - - read_char(bas, bas->attrib, desc->handle, ccc_read_cb, bas); -} - -static void bas_discovered_cb(uint8_t status, GSList *chars, void *user_data) -{ - struct gatt_request *req = user_data; - struct bt_bas *bas = req->user_data; - struct gatt_char *chr; - uint16_t start, end; - bt_uuid_t uuid; - - destroy_gatt_req(req); - - if (status) { - error("Battery: %s", att_ecode2str(status)); - return; - } - - chr = chars->data; - bas->handle = chr->value_handle; - - DBG("Battery handle: 0x%04x", bas->handle); - - read_char(bas, bas->attrib, bas->handle, read_value_cb, bas); - - start = chr->value_handle + 1; - end = bas->primary->range.end; - - bt_uuid16_create(&uuid, GATT_CLIENT_CHARAC_CFG_UUID); - - discover_desc(bas, bas->attrib, start, end, &uuid, - discover_descriptor_cb, bas); -} - -bool bt_bas_attach(struct bt_bas *bas, void *attrib) -{ - if (!bas || bas->attrib || !bas->primary) - return false; - - bas->attrib = g_attrib_ref(attrib); - - if (bas->handle > 0) - return true; - - discover_char(bas, bas->attrib, bas->primary->range.start, - bas->primary->range.end, NULL, - bas_discovered_cb, bas); - - return true; -} - -static void cancel_gatt_req(struct gatt_request *req) -{ - if (g_attrib_cancel(req->bas->attrib, req->id)) - destroy_gatt_req(req); -} - -void bt_bas_detach(struct bt_bas *bas) -{ - if (!bas || !bas->attrib) - return; - - if (bas->id > 0) { - g_attrib_unregister(bas->attrib, bas->id); - bas->id = 0; - } - - queue_foreach(bas->gatt_op, (void *) cancel_gatt_req, NULL); - g_attrib_unref(bas->attrib); - bas->attrib = NULL; -} diff --git a/android/bas.h b/android/bas.h deleted file mode 100644 index 3e175b5b5..000000000 --- a/android/bas.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2014 Intel Corporation. All rights reserved. - * - * - * This library is free software; you can rebastribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is bastributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -struct bt_bas; - -struct bt_bas *bt_bas_new(void *primary); - -struct bt_bas *bt_bas_ref(struct bt_bas *bas); -void bt_bas_unref(struct bt_bas *bas); - -bool bt_bas_attach(struct bt_bas *bas, void *gatt); -void bt_bas_detach(struct bt_bas *bas); diff --git a/android/hog.c b/android/hog.c index 3af932961..93e0655c0 100644 --- a/android/hog.c +++ b/android/hog.c @@ -55,7 +55,7 @@ #include "android/scpp.h" #include "android/dis.h" -#include "android/bas.h" +#include "profiles/battery/bas.h" #include "android/hog.h" #define HOG_UUID "00001812-0000-1000-8000-00805f9b34fb" -- cgit v1.2.1