dbus/gattlib.c: Add support to read battery level from gattlib_read_char_by_uuid()

pull/95/head
Olivier Martin 2019-03-05 16:55:48 +01:00 committed by Olivier Martin
parent cbeca9d6c0
commit 10af2f1971
1 changed files with 35 additions and 16 deletions

View File

@ -872,27 +872,17 @@ int gattlib_discover_desc(gatt_connection_t* connection, gattlib_descriptor_t**
return -1;
}
int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, void* buffer, size_t* buffer_len) {
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
if (dbus_characteristic.type == TYPE_NONE) {
return -1;
} else if (dbus_characteristic.type == TYPE_BATTERY_LEVEL) {
assert(0); // Not supported yet
return -1;
} else {
assert(dbus_characteristic.type == TYPE_GATT);
}
static int read_gatt_characteristic(struct dbus_characteristic *dbus_characteristic, void* buffer, size_t* buffer_len) {
GVariant *out_value;
GError *error = NULL;
#if BLUEZ_VERSION < BLUEZ_VERSIONS(5, 40)
org_bluez_gatt_characteristic1_call_read_value_sync(
dbus_characteristic.gatt, &out_value, NULL, &error);
dbus_characteristic->gatt, &out_value, NULL, &error);
#else
GVariantBuilder *options = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
org_bluez_gatt_characteristic1_call_read_value_sync(
dbus_characteristic.gatt, g_variant_builder_end(options), &out_value, NULL, &error);
dbus_characteristic->gatt, g_variant_builder_end(options), &out_value, NULL, &error);
g_variant_builder_unref(options);
#endif
if (error != NULL) {
@ -908,7 +898,7 @@ int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, void*
*buffer_len = n_elements;
g_object_unref(dbus_characteristic.gatt);
g_object_unref(dbus_characteristic->gatt);
#if BLUEZ_VERSION >= BLUEZ_VERSIONS(5, 40)
//g_variant_unref(in_params); See: https://github.com/labapart/gattlib/issues/28#issuecomment-311486629
@ -916,13 +906,42 @@ int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, void*
return 0;
}
static int read_battery_level(struct dbus_characteristic *dbus_characteristic, void* buffer, size_t* buffer_len) {
guchar percentage = org_bluez_battery1_get_percentage(dbus_characteristic->battery);
memcpy(buffer, &percentage, sizeof(uint8_t));
*buffer_len = sizeof(uint8_t);
return 0;
}
int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, void* buffer, size_t* buffer_len) {
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
if (dbus_characteristic.type == TYPE_NONE) {
return -1;
} else if (dbus_characteristic.type == TYPE_BATTERY_LEVEL) {
return read_battery_level(&dbus_characteristic, buffer, buffer_len);
} else {
assert(dbus_characteristic.type == TYPE_GATT);
return read_gatt_characteristic(&dbus_characteristic, buffer, buffer_len);
}
}
int gattlib_read_char_by_uuid_async(gatt_connection_t* connection, uuid_t* uuid, gatt_read_cb_t gatt_read_cb) {
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
if (dbus_characteristic.type == TYPE_NONE) {
return -1;
} else if (dbus_characteristic.type == TYPE_BATTERY_LEVEL) {
assert(0); // Not supported yet
return -1;
//TODO: Having 'percentage' as a 'static' is a limitation when we would support multiple connections
static uint8_t percentage;
percentage = org_bluez_battery1_get_percentage(dbus_characteristic.battery);
gatt_read_cb((const void*)&percentage, sizeof(percentage));
return 0;
} else {
assert(dbus_characteristic.type == TYPE_GATT);
}