mirror of https://github.com/labapart/gattlib
Make indications work properly
parent
3d656b1e19
commit
08ce1b3303
110
dbus/gattlib.c
110
dbus/gattlib.c
|
@ -885,6 +885,44 @@ static gboolean on_handle_characteristic_property_change(
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean on_handle_characteristic_indication(
|
||||||
|
OrgBluezGattCharacteristic1 *object,
|
||||||
|
GVariant *arg_changed_properties,
|
||||||
|
const gchar *const *arg_invalidated_properties,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
gatt_connection_t* connection = user_data;
|
||||||
|
|
||||||
|
if (gattlib_has_valid_handler(&connection->indication)) {
|
||||||
|
// Retrieve 'Value' from 'arg_changed_properties'
|
||||||
|
if (g_variant_n_children (arg_changed_properties) > 0) {
|
||||||
|
GVariantIter *iter;
|
||||||
|
const gchar *key;
|
||||||
|
GVariant *value;
|
||||||
|
|
||||||
|
g_variant_get (arg_changed_properties, "a{sv}", &iter);
|
||||||
|
while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
|
||||||
|
if (strcmp(key, "Value") == 0) {
|
||||||
|
uuid_t uuid;
|
||||||
|
size_t data_length;
|
||||||
|
const uint8_t* data = g_variant_get_fixed_array(value, &data_length, sizeof(guchar));
|
||||||
|
|
||||||
|
gattlib_string_to_uuid(
|
||||||
|
org_bluez_gatt_characteristic1_get_uuid(object),
|
||||||
|
MAX_LEN_UUID_STR + 1,
|
||||||
|
&uuid);
|
||||||
|
|
||||||
|
gattlib_call_notification_handler(&connection->indication,
|
||||||
|
&uuid, data, data_length);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_variant_iter_free(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid) {
|
int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid) {
|
||||||
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
|
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
|
||||||
if (dbus_characteristic.type == TYPE_NONE) {
|
if (dbus_characteristic.type == TYPE_NONE) {
|
||||||
|
@ -957,6 +995,78 @@ int gattlib_notification_stop(gatt_connection_t* connection, const uuid_t* uuid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gattlib_indication_start(gatt_connection_t* connection, const uuid_t* uuid) {
|
||||||
|
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
|
||||||
|
if (dbus_characteristic.type == TYPE_NONE) {
|
||||||
|
return GATTLIB_NOT_FOUND;
|
||||||
|
}
|
||||||
|
#if BLUEZ_VERSION > BLUEZ_VERSIONS(5, 40)
|
||||||
|
else if (dbus_characteristic.type == TYPE_BATTERY_LEVEL) {
|
||||||
|
// Register a handle for notification
|
||||||
|
g_signal_connect(dbus_characteristic.battery,
|
||||||
|
"g-properties-changed",
|
||||||
|
G_CALLBACK (on_handle_battery_level_property_change),
|
||||||
|
connection);
|
||||||
|
|
||||||
|
return GATTLIB_SUCCESS;
|
||||||
|
} else {
|
||||||
|
assert(dbus_characteristic.type == TYPE_GATT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Register a handle for notification
|
||||||
|
g_signal_connect(dbus_characteristic.gatt,
|
||||||
|
"g-properties-changed",
|
||||||
|
G_CALLBACK (on_handle_characteristic_indication),
|
||||||
|
connection);
|
||||||
|
|
||||||
|
GError *error = NULL;
|
||||||
|
org_bluez_gatt_characteristic1_call_start_notify_sync(dbus_characteristic.gatt, NULL, &error);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
fprintf(stderr, "Failed to start DBus GATT indication: %s\n", error->message);
|
||||||
|
g_error_free(error);
|
||||||
|
return GATTLIB_ERROR_DBUS;
|
||||||
|
} else {
|
||||||
|
return GATTLIB_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int gattlib_indication_stop(gatt_connection_t* connection, const uuid_t* uuid) {
|
||||||
|
struct dbus_characteristic dbus_characteristic = get_characteristic_from_uuid(connection, uuid);
|
||||||
|
if (dbus_characteristic.type == TYPE_NONE) {
|
||||||
|
return GATTLIB_NOT_FOUND;
|
||||||
|
}
|
||||||
|
#if BLUEZ_VERSION > BLUEZ_VERSIONS(5, 40)
|
||||||
|
else if (dbus_characteristic.type == TYPE_BATTERY_LEVEL) {
|
||||||
|
g_signal_handlers_disconnect_by_func(
|
||||||
|
dbus_characteristic.battery,
|
||||||
|
G_CALLBACK (on_handle_battery_level_property_change),
|
||||||
|
connection);
|
||||||
|
return GATTLIB_SUCCESS;
|
||||||
|
} else {
|
||||||
|
assert(dbus_characteristic.type == TYPE_GATT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_signal_handlers_disconnect_by_func(
|
||||||
|
dbus_characteristic.gatt,
|
||||||
|
G_CALLBACK (on_handle_characteristic_indication),
|
||||||
|
connection);
|
||||||
|
|
||||||
|
GError *error = NULL;
|
||||||
|
org_bluez_gatt_characteristic1_call_stop_notify_sync(
|
||||||
|
dbus_characteristic.gatt, NULL, &error);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
fprintf(stderr, "Failed to stop DBus GATT indication: %s\n", error->message);
|
||||||
|
g_error_free(error);
|
||||||
|
return GATTLIB_NOT_FOUND;
|
||||||
|
} else {
|
||||||
|
return GATTLIB_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int get_bluez_device_from_mac(void *adapter, const char *mac_address, OrgBluezDevice1 **bluez_device1)
|
int get_bluez_device_from_mac(void *adapter, const char *mac_address, OrgBluezDevice1 **bluez_device1)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
|
@ -530,6 +530,26 @@ int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid
|
||||||
*/
|
*/
|
||||||
int gattlib_notification_stop(gatt_connection_t* connection, const uuid_t* uuid);
|
int gattlib_notification_stop(gatt_connection_t* connection, const uuid_t* uuid);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Enable indication on GATT characteristic represented by its UUID
|
||||||
|
*
|
||||||
|
* @param connection Active GATT connection
|
||||||
|
* @param uuid UUID of the characteristic that will trigger the indication
|
||||||
|
*
|
||||||
|
* @return GATTLIB_SUCCESS on success or GATTLIB_* error code
|
||||||
|
*/
|
||||||
|
int gattlib_indication_start(gatt_connection_t* connection, const uuid_t* uuid);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Disable indication on GATT characteristic represented by its UUID
|
||||||
|
*
|
||||||
|
* @param connection Active GATT connection
|
||||||
|
* @param uuid UUID of the characteristic that will trigger the indication
|
||||||
|
*
|
||||||
|
* @return GATTLIB_SUCCESS on success or GATTLIB_* error code
|
||||||
|
*/
|
||||||
|
int gattlib_indication_stop(gatt_connection_t* connection, const uuid_t* uuid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @brief Register a handle for the GATT notifications
|
* @brief Register a handle for the GATT notifications
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue