diff --git a/src/adapter.c b/src/adapter.c
index 5af8489..8ee5b5b 100644
--- a/src/adapter.c
+++ b/src/adapter.c
return g_strcmp0(client->owner, sender);
}
-static void invalidate_rssi(gpointer a)
+static void invalidate_rssi_and_tx_power(gpointer a)
{
struct btd_device *dev = a;
device_set_rssi(dev, 0);
+ device_set_tx_power(dev, 127);
}
static void discovery_cleanup(struct btd_adapter *adapter)
{
- g_slist_free_full(adapter->discovery_found, invalidate_rssi);
+ g_slist_free_full(adapter->discovery_found,
+ invalidate_rssi_and_tx_power);
adapter->discovery_found = NULL;
}
else
device_set_rssi(dev, rssi);
+ if (eir_data.tx_power != 127)
+ device_set_tx_power(dev, eir_data.tx_power);
+
if (eir_data.appearance != 0)
device_set_appearance(dev, eir_data.appearance);
diff --git a/src/device.c b/src/device.c
index 3552999..8b678a9 100644
--- a/src/device.c
+++ b/src/device.c
bool legacy;
int8_t rssi;
+ int8_t tx_power;
GIOChannel *att_io;
guint store_id;
return TRUE;
}
+static gboolean dev_property_get_tx_power(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_device *dev = data;
+ dbus_int16_t val = dev->tx_power;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_INT16, &val);
+
+ return TRUE;
+}
+
+static gboolean dev_property_exists_tx_power(const GDBusPropertyTable *property,
+ void *data)
+{
+ struct btd_device *dev = data;
+
+ if (dev->tx_power == 127)
+ return FALSE;
+
+ return TRUE;
+}
+
static gboolean dev_property_get_trusted(const GDBusPropertyTable *property,
DBusMessageIter *iter, void *data)
{
{ "ServiceData", "a{sv}", dev_property_get_service_data,
NULL, dev_property_service_data_exist,
G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "TxPower", "n", dev_property_get_tx_power, NULL,
+ dev_property_exists_tx_power,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+
{ }
};
if (device == NULL)
return NULL;
+ device->tx_power = 127;
+
device->db = gatt_db_new();
if (!device->db) {
g_free(device);
device_set_rssi_with_delta(device, rssi, RSSI_THRESHOLD);
}
+void device_set_tx_power(struct btd_device *device, int8_t tx_power)
+{
+ if (!device)
+ return;
+
+ if (device->tx_power == tx_power)
+ return;
+
+ DBG("tx_power %d", tx_power);
+
+ device->tx_power = tx_power;
+
+ g_dbus_emit_property_changed(dbus_conn, device->path,
+ DEVICE_INTERFACE, "TxPower");
+}
+
static gboolean start_discovery(gpointer user_data)
{
struct btd_device *device = user_data;
diff --git a/src/device.h b/src/device.h
index b91916d..1955f54 100644
--- a/src/device.h
+++ b/src/device.h
void device_set_rssi_with_delta(struct btd_device *device, int8_t rssi,
int8_t delta_threshold);
void device_set_rssi(struct btd_device *device, int8_t rssi);
+void device_set_tx_power(struct btd_device *device, int8_t tx_power);
bool btd_device_is_connected(struct btd_device *dev);
uint8_t btd_device_get_bdaddr_type(struct btd_device *dev);
bool device_is_retrying(struct btd_device *device);