mirror of https://github.com/labapart/gattlib
gattlib_adapter: Add support to reconnect disconnected device
parent
b28a0422f0
commit
1530184776
|
@ -191,8 +191,59 @@ on_interface_proxy_properties_changed (GDBusObjectManagerClient *device_manager,
|
||||||
invalidated_properties_count);
|
invalidated_properties_count);
|
||||||
|
|
||||||
// Check if the object is a 'org.bluez.Device1'
|
// Check if the object is a 'org.bluez.Device1'
|
||||||
if (strcmp(g_dbus_proxy_get_interface_name(interface_proxy), "org.bluez.Device1") != 0) {
|
if (strcmp(g_dbus_proxy_get_interface_name(interface_proxy), "org.bluez.Device1") == 0) {
|
||||||
return;
|
// It is a 'org.bluez.Device1'
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
OrgBluezDevice1* device1 = org_bluez_device1_proxy_new_for_bus_sync(
|
||||||
|
G_BUS_TYPE_SYSTEM,
|
||||||
|
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
|
||||||
|
"org.bluez",
|
||||||
|
proxy_object_path, NULL, &error);
|
||||||
|
if (error) {
|
||||||
|
GATTLIB_LOG(GATTLIB_ERROR, "Failed to connection to new DBus Bluez Device: %s", error->message);
|
||||||
|
g_error_free(error);
|
||||||
|
return;
|
||||||
|
} else if (device1 == NULL) {
|
||||||
|
GATTLIB_LOG(GATTLIB_ERROR, "Unexpected NULL device");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* device_mac_address = org_bluez_device1_get_address(device1);
|
||||||
|
|
||||||
|
// Check if the device has been disconnected
|
||||||
|
GVariantDict dict;
|
||||||
|
g_variant_dict_init(&dict, changed_properties);
|
||||||
|
GVariant* connected = g_variant_dict_lookup_value(&dict, "Connected", NULL);
|
||||||
|
GVariant* rssi = g_variant_dict_lookup_value(&dict, "RSSI", NULL);
|
||||||
|
|
||||||
|
g_mutex_lock(&gattlib_adapter->ble_scan.discovered_devices_mutex);
|
||||||
|
|
||||||
|
// Check if the device is already part of the list
|
||||||
|
GSList *found_device = g_slist_find_custom(gattlib_adapter->ble_scan.discovered_devices, device_mac_address, (GCompareFunc)g_ascii_strcasecmp);
|
||||||
|
|
||||||
|
if (connected && !g_variant_get_boolean(connected)) {
|
||||||
|
// The device has been disconnected. We will remove it from the list of discovered device.
|
||||||
|
// In case the device has been found again, it will be seen as a new device
|
||||||
|
|
||||||
|
GATTLIB_LOG(GATTLIB_INFO, "Device %s has been disconnected", device_mac_address);
|
||||||
|
|
||||||
|
if (found_device) {
|
||||||
|
gattlib_adapter->ble_scan.discovered_devices = g_slist_remove(gattlib_adapter->ble_scan.discovered_devices, found_device);
|
||||||
|
}
|
||||||
|
} else if (rssi) {
|
||||||
|
// First time this device is in the list
|
||||||
|
if (found_device == NULL) {
|
||||||
|
// Add the device to the list
|
||||||
|
gattlib_adapter->ble_scan.discovered_devices = g_slist_append(gattlib_adapter->ble_scan.discovered_devices, g_strdup(device_mac_address));
|
||||||
|
gattlib_on_discovered_device(gattlib_adapter, device1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_mutex_unlock(&gattlib_adapter->ble_scan.discovered_devices_mutex);
|
||||||
|
|
||||||
|
g_variant_dict_end(&dict);
|
||||||
|
|
||||||
|
g_object_unref(device1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue