[PATCH BlueZ 00/14] Userspace patches for RSSI threshold monitor

STALE5510d

15 messages, 1 author, 2011-08-09 · open the first message on its own page

[PATCH BlueZ 00/14] Userspace patches for RSSI threshold monitor

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:27

Dependency: kernel patches sent from Anderson Briglia implementing the
RSSI threshold monitor in the kernel: "[PATCH 0/7] RSSI Monitor"

The following patches are implementing the userspace functions to handle
RSSI threshold monitor, required for Proximity Path Loss. The mgmt-api
changes was proposed by: "[PATCH] Add RSSI Monitor documentation API"
(sent to ML)

Initial RFC of this patch series: "[RFC BlueZ 0/8] Userspace patches
for RSSI threshold monitor".

Changes since the RFC: Included changes in the Proximity Monitor.
Initial RFC was including changes in the mgmtops and adapter only.

Claudio Takahasi (14):
  Add RSSI threshold monitor definition in mgmt
  Add RSSI threshold monitor implementation
  Add enable RSSI threshold monitoring
  Return FALSE if RSSI monitor is already enabled
  Add disable for RSSI threshold monitor
  Add adapter_ops calls for RSSI Enable/Disable
  Notify registered monitors when alert is triggered
  Add handle for RSSI monitor alert event in mgmt
  Add RSSI threshold monitor in Proximity Monitor
  Disable RSSI monitor when device is removed
  Disable RSSI threshold monitor when disconnected
  Emit SignalLevel when RSSI alert is received
  Define low/high RSSI threshold for Proximity
  Reset SignalLevel to unknown when disconnected

 lib/mgmt.h          |   18 ++++++++++
 plugins/hciops.c    |   13 +++++++
 plugins/mgmtops.c   |   85 ++++++++++++++++++++++++++++++++++++++++++++++++
 proximity/monitor.c |   75 +++++++++++++++++++++++++++++++++++++++++--
 src/adapter.c       |   89 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/adapter.h       |   13 +++++++
 src/event.c         |   14 ++++++++
 src/event.h         |    2 +
 8 files changed, 306 insertions(+), 3 deletions(-)

-- 
1.7.6

[PATCH BlueZ 01/14] Add RSSI threshold monitor definition in mgmt

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:28

Add RSSI threshold monitor in Management header. Low and high threshold
value range is -128 to 127. Alert events are sent by the kernel when the
measured RSSI crosses the defined thresholds.

Alert types are:
0x00 In range
0x01 Low alert
0x02 High alert
---
 lib/mgmt.h |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/lib/mgmt.h b/lib/mgmt.h
index f22434e..8cca51e 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -215,6 +215,18 @@ struct mgmt_cp_unblock_device {
 	bdaddr_t bdaddr;
 } __packed;
 
+#define MGMT_OP_ENABLE_RSSI_MONITOR	0x001F
+struct mgmt_cp_enable_rssi_monitor {
+	bdaddr_t bdaddr;
+	int8_t low;
+	int8_t high;
+} __packed;
+
+#define MGMT_OP_DISABLE_RSSI_MONITOR	0x0020
+struct mgmt_cp_disable_rssi_monitor {
+	bdaddr_t bdaddr;
+} __packed;
+
 #define MGMT_EV_CMD_COMPLETE		0x0001
 struct mgmt_ev_cmd_complete {
 	uint16_t opcode;
@@ -305,3 +317,9 @@ struct mgmt_ev_remote_name {
 } __packed;
 
 #define MGMT_EV_DISCOVERING		0x0014
+
+#define MGMT_EV_RSSI_MONITOR_ALERT	0x0015
+struct mgmt_ev_rssi_monitor_alert {
+	bdaddr_t bdaddr;
+	uint8_t alert_type;
+} __packed;
-- 
1.7.6

[PATCH BlueZ 02/14] Add RSSI threshold monitor implementation

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:29

Implements new commands to enable and disable the RSSI threshold
monitoring through the management interface.
---
 plugins/hciops.c  |   13 +++++++++++
 plugins/mgmtops.c |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/adapter.h     |    3 ++
 3 files changed, 77 insertions(+), 0 deletions(-)
diff --git a/plugins/hciops.c b/plugins/hciops.c
index ecc0e86..1f7bd52 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -3193,6 +3193,17 @@ static int hciops_unblock_device(int index, bdaddr_t *bdaddr)
 	return 0;
 }
 
+static int hciops_enable_rssi_monitor(int index, bdaddr_t *bdaddr,
+						int8_t low, int8_t high)
+{
+	return -ENOSYS;
+}
+
+static int hciops_disable_rssi_monitor(int index, bdaddr_t *bdaddr)
+{
+	return -ENOSYS;
+}
+
 static int hciops_get_conn_list(int index, GSList **conns)
 {
 	struct dev_info *dev = &devs[index];
@@ -3652,6 +3663,8 @@ static struct btd_adapter_ops hci_ops = {
 	.read_bdaddr = hciops_read_bdaddr,
 	.block_device = hciops_block_device,
 	.unblock_device = hciops_unblock_device,
+	.enable_rssi_monitor = hciops_enable_rssi_monitor,
+	.disable_rssi_monitor = hciops_disable_rssi_monitor,
 	.get_conn_list = hciops_get_conn_list,
 	.disconnect = hciops_disconnect,
 	.remove_bonding = hciops_remove_bonding,
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 3cdb97e..e01f330 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -1751,6 +1751,65 @@ static int mgmt_unblock_device(int index, bdaddr_t *bdaddr)
 	return 0;
 }
 
+static int mgmt_enable_rssi_monitor(int index, bdaddr_t *bdaddr,
+						int8_t low, int8_t high)
+{
+	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_enable_rssi_monitor)];
+	struct mgmt_hdr *hdr = (void *) buf;
+	struct mgmt_cp_enable_rssi_monitor *cp;
+	size_t buf_len;
+	char addr[18];
+
+	ba2str(bdaddr, addr);
+	DBG("index %d addr %s", index, addr);
+
+	memset(buf, 0, sizeof(buf));
+
+	hdr->opcode = htobs(MGMT_OP_ENABLE_RSSI_MONITOR);
+	hdr->len = htobs(sizeof(*cp));
+	hdr->index = htobs(index);
+
+	cp = (void *) &buf[sizeof(*hdr)];
+	bacpy(&cp->bdaddr, bdaddr);
+	cp->low = low;
+	cp->high = high;
+
+	buf_len = sizeof(*hdr) + sizeof(*cp);
+
+	if (write(mgmt_sock, buf, buf_len) < 0)
+		return -errno;
+
+	return 0;
+}
+
+static int mgmt_disable_rssi_monitor(int index, bdaddr_t *bdaddr)
+{
+	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_disable_rssi_monitor)];
+	struct mgmt_hdr *hdr = (void *) buf;
+	struct mgmt_cp_disable_rssi_monitor *cp;
+	size_t buf_len;
+	char addr[18];
+
+	ba2str(bdaddr, addr);
+	DBG("index %d addr %s", index, addr);
+
+	memset(buf, 0, sizeof(buf));
+
+	hdr->opcode = htobs(MGMT_OP_DISABLE_RSSI_MONITOR);
+	hdr->len = htobs(sizeof(*cp));
+	hdr->index = htobs(index);
+
+	cp = (void *) &buf[sizeof(*hdr)];
+	bacpy(&cp->bdaddr, bdaddr);
+
+	buf_len = sizeof(*hdr) + sizeof(*cp);
+
+	if (write(mgmt_sock, buf, buf_len) < 0)
+		return -errno;
+
+	return 0;
+}
+
 static int mgmt_get_conn_list(int index, GSList **conns)
 {
 	struct controller_info *info = &controllers[index];
@@ -2047,6 +2106,8 @@ static struct btd_adapter_ops mgmt_ops = {
 	.read_bdaddr = mgmt_read_bdaddr,
 	.block_device = mgmt_block_device,
 	.unblock_device = mgmt_unblock_device,
+	.enable_rssi_monitor = mgmt_enable_rssi_monitor,
+	.disable_rssi_monitor = mgmt_disable_rssi_monitor,
 	.get_conn_list = mgmt_get_conn_list,
 	.disconnect = mgmt_disconnect,
 	.remove_bonding = mgmt_remove_bonding,
diff --git a/src/adapter.h b/src/adapter.h
index 687275a..658a211 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -196,6 +196,9 @@ struct btd_adapter_ops {
 	int (*read_bdaddr) (int index, bdaddr_t *bdaddr);
 	int (*block_device) (int index, bdaddr_t *bdaddr);
 	int (*unblock_device) (int index, bdaddr_t *bdaddr);
+	int (*enable_rssi_monitor) (int index, bdaddr_t *bdaddr, int8_t low,
+								int8_t high);
+	int (*disable_rssi_monitor) (int index, bdaddr_t *bdaddr);
 	int (*get_conn_list) (int index, GSList **conns);
 	int (*disconnect) (int index, bdaddr_t *bdaddr);
 	int (*remove_bonding) (int index, bdaddr_t *bdaddr);
-- 
1.7.6

[PATCH BlueZ 03/14] Add enable RSSI threshold monitoring

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:30

Initial RSSI threshold monitoring in the adapter. RSSI monitor callback
will be called when the RSSI monitor state changes triggered by one of
the thresholds transition. Not yet functional.
---
 src/adapter.c |   27 +++++++++++++++++++++++++++
 src/adapter.h |    6 ++++++
 2 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 4c88a0e..37ed727 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -104,6 +104,11 @@ struct service_auth {
 	struct btd_adapter *adapter;
 };
 
+struct rssi_monitor_data {
+	rssi_monitor cb;
+	gpointer user_data;
+};
+
 struct btd_adapter {
 	uint16_t dev_id;
 	int up;
@@ -148,6 +153,8 @@ struct btd_adapter {
 	GSList *powered_callbacks;
 	GSList *pin_callbacks;
 
+	GSList *rssi_monitors;		/* RSSI Threshold monitors */
+
 	GSList *loaded_drivers;
 };
 
@@ -2467,6 +2474,7 @@ static void adapter_free(gpointer user_data)
 	sdp_list_free(adapter->services, NULL);
 
 	g_slist_free_full(adapter->found_devices, dev_info_free);
+	g_slist_free_full(adapter->rssi_monitors, g_free);
 
 	g_slist_free(adapter->oor_devices);
 
@@ -3625,3 +3633,22 @@ int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
 {
 	return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);
 }
+
+gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
+					bdaddr_t *bdaddr, int8_t low,
+					int high, rssi_monitor cb,
+					gpointer user_data)
+{
+	struct rssi_monitor_data *monitor;
+
+	monitor = g_try_new(struct rssi_monitor_data, 1);
+	if (monitor == NULL)
+		return FALSE;
+
+	monitor->cb = cb;
+	monitor->user_data = user_data;
+
+	adapter->rssi_monitors = g_slist_append(adapter->rssi_monitors, monitor);
+
+	return TRUE;
+}
diff --git a/src/adapter.h b/src/adapter.h
index 658a211..ca53152 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -279,3 +279,9 @@ int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
 
 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
 							bdaddr_t *bdaddr);
+
+typedef void (*rssi_monitor) (uint8_t alert, gpointer user_data);
+gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
+					bdaddr_t *bdaddr, int8_t low,
+					int high, rssi_monitor cb,
+					gpointer user_data);
-- 
1.7.6

[PATCH BlueZ 04/14] Return FALSE if RSSI monitor is already enabled

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:31

---
 src/adapter.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 37ed727..08675a1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -105,6 +105,7 @@ struct service_auth {
 };
 
 struct rssi_monitor_data {
+	bdaddr_t bdaddr;
 	rssi_monitor cb;
 	gpointer user_data;
 };
@@ -3634,6 +3635,14 @@ int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
 	return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);
 }
 
+static int rssi_monitor_bacmp(gconstpointer data, gconstpointer user_data)
+{
+	const struct rssi_monitor_data *monitor = data;
+	const bdaddr_t *bdaddr = user_data;
+
+	return bacmp(&monitor->bdaddr, bdaddr);
+}
+
 gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
 					bdaddr_t *bdaddr, int8_t low,
 					int high, rssi_monitor cb,
@@ -3641,10 +3650,15 @@ gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
 {
 	struct rssi_monitor_data *monitor;
 
+	if (g_slist_find_custom(adapter->rssi_monitors, bdaddr,
+						rssi_monitor_bacmp))
+		return FALSE;
+
 	monitor = g_try_new(struct rssi_monitor_data, 1);
 	if (monitor == NULL)
 		return FALSE;
 
+	bacpy(&monitor->bdaddr, bdaddr);
 	monitor->cb = cb;
 	monitor->user_data = user_data;
 
-- 
1.7.6

[PATCH BlueZ 05/14] Add disable for RSSI threshold monitor

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:32

---
 src/adapter.c |   20 ++++++++++++++++++++
 src/adapter.h |    2 ++
 2 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 08675a1..aa65135 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3666,3 +3666,23 @@ gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
 
 	return TRUE;
 }
+
+gboolean btd_adapter_disable_rssi_monitor(struct btd_adapter *adapter,
+							bdaddr_t *bdaddr)
+{
+	struct rssi_monitor_data *monitor;
+	GSList *l;
+
+	l = g_slist_find_custom(adapter->rssi_monitors, bdaddr,
+						rssi_monitor_bacmp);
+	if (!l)
+		return FALSE;
+
+	monitor = l->data;
+
+	adapter->rssi_monitors = g_slist_remove(adapter->rssi_monitors,
+								monitor);
+	g_free(monitor);
+
+	return TRUE;
+}
diff --git a/src/adapter.h b/src/adapter.h
index ca53152..66949e7 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -285,3 +285,5 @@ gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
 					bdaddr_t *bdaddr, int8_t low,
 					int high, rssi_monitor cb,
 					gpointer user_data);
+gboolean btd_adapter_disable_rssi_monitor(struct btd_adapter *adapter,
+							bdaddr_t *bdaddr);
-- 
1.7.6

[PATCH BlueZ 06/14] Add adapter_ops calls for RSSI Enable/Disable

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:33

---
 src/adapter.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index aa65135..33ad41f 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3649,6 +3649,7 @@ gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
 					gpointer user_data)
 {
 	struct rssi_monitor_data *monitor;
+	int err;
 
 	if (g_slist_find_custom(adapter->rssi_monitors, bdaddr,
 						rssi_monitor_bacmp))
@@ -3658,6 +3659,14 @@ gboolean btd_adapter_enable_rssi_monitor(struct btd_adapter *adapter,
 	if (monitor == NULL)
 		return FALSE;
 
+	err = adapter_ops->enable_rssi_monitor(adapter->dev_id, bdaddr, low,
+									high);
+	if (err < 0) {
+		error("Enable RSSI threshold monitor: %s", strerror(-err));
+		g_free(monitor);
+		return FALSE;
+	}
+
 	bacpy(&monitor->bdaddr, bdaddr);
 	monitor->cb = cb;
 	monitor->user_data = user_data;
@@ -3672,6 +3681,7 @@ gboolean btd_adapter_disable_rssi_monitor(struct btd_adapter *adapter,
 {
 	struct rssi_monitor_data *monitor;
 	GSList *l;
+	int err;
 
 	l = g_slist_find_custom(adapter->rssi_monitors, bdaddr,
 						rssi_monitor_bacmp);
@@ -3684,5 +3694,7 @@ gboolean btd_adapter_disable_rssi_monitor(struct btd_adapter *adapter,
 								monitor);
 	g_free(monitor);
 
-	return TRUE;
+	err = adapter_ops->disable_rssi_monitor(adapter->dev_id, bdaddr);
+
+	return (err < 0 ? FALSE : TRUE);
 }
-- 
1.7.6

[PATCH BlueZ 07/14] Notify registered monitors when alert is triggered

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:34

Add a function in the adapter to notify the registered clients when
the RSSI threshold alert event is received from the low layers.
---
 src/adapter.c |   16 ++++++++++++++++
 src/adapter.h |    2 ++
 src/event.c   |   14 ++++++++++++++
 src/event.h   |    2 ++
 4 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 33ad41f..13155bd 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3635,6 +3635,22 @@ int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
 	return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);
 }
 
+void adapter_rssi_monitor_alert_triggered(struct btd_adapter *adapter,
+					bdaddr_t *bdaddr, uint8_t alert)
+{
+	GSList *l;
+
+	for (l = adapter->rssi_monitors; l; l = l->next) {
+		struct rssi_monitor_data *monitor = l->data;
+
+		if (bacmp(&monitor->bdaddr, bdaddr) != 0)
+			continue;
+
+		monitor->cb(alert, monitor->user_data);
+		break;
+	}
+}
+
 static int rssi_monitor_bacmp(gconstpointer data, gconstpointer user_data)
 {
 	const struct rssi_monitor_data *monitor = data;
diff --git a/src/adapter.h b/src/adapter.h
index 66949e7..0a715c3 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -116,6 +116,8 @@ void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr,
 int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr);
 void adapter_emit_device_found(struct btd_adapter *adapter,
 						struct remote_dev_info *dev);
+void adapter_rssi_monitor_alert_triggered(struct btd_adapter *adapter,
+					bdaddr_t *bdaddr, uint8_t alert);
 void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
 int adapter_update_local_name(struct btd_adapter *adapter, const char *name);
 void adapter_service_insert(struct btd_adapter *adapter, void *rec);
diff --git a/src/event.c b/src/event.c
index dc45bd3..92a73b4 100644
--- a/src/event.c
+++ b/src/event.c
@@ -460,6 +460,20 @@ void btd_event_disconn_complete(bdaddr_t *local, bdaddr_t *peer)
 	adapter_remove_connection(adapter, device);
 }
 
+void btd_event_rssi_monitor_alert(bdaddr_t *local, bdaddr_t *peer,
+							uint8_t alert)
+{
+	struct btd_adapter *adapter;
+
+	adapter = manager_find_adapter(local);
+	if (!adapter) {
+		error("No matching adapter found");
+		return;
+	}
+
+	adapter_rssi_monitor_alert_triggered(adapter, peer, alert);
+}
+
 /* Section reserved to device HCI callbacks */
 
 void btd_event_returned_link_key(bdaddr_t *local, bdaddr_t *peer)
diff --git a/src/event.h b/src/event.h
index 1268edf..72902cc 100644
--- a/src/event.h
+++ b/src/event.h
@@ -40,3 +40,5 @@ int btd_event_user_passkey(bdaddr_t *sba, bdaddr_t *dba);
 int btd_event_user_notify(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey);
 int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer, uint8_t *key,
 					uint8_t key_type, uint8_t pin_length);
+void btd_event_rssi_monitor_alert(bdaddr_t *local, bdaddr_t *peer,
+							uint8_t alert);
-- 
1.7.6

[PATCH BlueZ 08/14] Add handle for RSSI monitor alert event in mgmt

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:35

Changes mgmtops plugin adding the handler for the RSSI threshold alert
event. This event is sent by the kernel when the alerting state/type
changes.
---
 plugins/mgmtops.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index e01f330..3d909ab 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -1385,6 +1385,27 @@ static void mgmt_discovering(int sk, uint16_t index, void *buf, size_t len)
 	adapter_set_state(adapter, state);
 }
 
+static void rssi_monitor_alert(int sk, uint16_t index, void *buf, size_t len)
+{
+	struct mgmt_ev_rssi_monitor_alert *ev = buf;
+	struct controller_info *info;
+
+	if (len != sizeof(*ev)) {
+		error("Too small rssi_monitor_alert event");
+		return;
+	}
+
+	if (index > max_index) {
+		error("Unexpected index %u in RSSI monitor alert event", index);
+		return;
+	}
+
+	info = &controllers[index];
+
+	btd_event_rssi_monitor_alert(&info->bdaddr, &ev->bdaddr,
+							ev->alert_type);
+}
+
 static gboolean mgmt_event(GIOChannel *io, GIOCondition cond, gpointer user_data)
 {
 	char buf[MGMT_BUF_SIZE];
@@ -1489,6 +1510,9 @@ static gboolean mgmt_event(GIOChannel *io, GIOCondition cond, gpointer user_data
 	case MGMT_EV_DISCOVERING:
 		mgmt_discovering(sk, index, buf + MGMT_HDR_SIZE, len);
 		break;
+	case MGMT_EV_RSSI_MONITOR_ALERT:
+		rssi_monitor_alert(sk, index, buf + MGMT_HDR_SIZE, len);
+		break;
 	default:
 		error("Unknown Management opcode %u (index %u)", opcode, index);
 		break;
-- 
1.7.6

[PATCH BlueZ 09/14] Add RSSI threshold monitor in Proximity Monitor

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:36

---
 proximity/monitor.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index c32ddec..2b5acd5 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
@@ -183,11 +183,20 @@ static int write_alert_level(struct monitor *monitor)
 	return 0;
 }
 
+static void monitor_rssi_alert(uint8_t alert, gpointer user_data)
+{
+	DBG("");
+}
+
 static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 							gpointer user_data)
 {
+	struct monitor *monitor = user_data;
+	struct btd_device *device = monitor->device;
 	uint8_t value;
 	int vlen;
+	int8_t low = -20, high = -40;
+	bdaddr_t dba;
 
 	if (status != 0) {
 		DBG("Tx Power Level read failed: %s", att_ecode2str(status));
@@ -200,6 +209,11 @@ static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 	}
 
 	DBG("Tx Power Level: %02x", (int8_t) value);
+
+	device_get_address(device, &dba);
+	btd_adapter_enable_rssi_monitor(device_get_adapter(device), &dba,
+					low, high, monitor_rssi_alert,
+					monitor);
 }
 
 static void tx_power_handle_cb(GSList *characteristics, guint8 status,
-- 
1.7.6

[PATCH BlueZ 10/14] Disable RSSI monitor when device is removed

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:37

---
 proximity/monitor.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index 2b5acd5..eea77cb 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
@@ -80,6 +80,7 @@ struct monitor {
 	uint16_t immediatehandle;	/* Immediate Alert Value Handle */
 	guint immediateto;		/* Reset Immediate Alert to "none" */
 	guint attioid;
+	gboolean rssimon;		/* RSSI monitor enabled/disabled */
 };
 
 static inline int create_filename(char *buf, size_t size,
@@ -193,6 +194,7 @@ static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 {
 	struct monitor *monitor = user_data;
 	struct btd_device *device = monitor->device;
+	struct btd_adapter *adapter = device_get_adapter(device);
 	uint8_t value;
 	int vlen;
 	int8_t low = -20, high = -40;
@@ -211,9 +213,9 @@ static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 	DBG("Tx Power Level: %02x", (int8_t) value);
 
 	device_get_address(device, &dba);
-	btd_adapter_enable_rssi_monitor(device_get_adapter(device), &dba,
-					low, high, monitor_rssi_alert,
-					monitor);
+	monitor->rssimon = btd_adapter_enable_rssi_monitor(adapter, &dba,
+						low, high, monitor_rssi_alert,
+						monitor);
 }
 
 static void tx_power_handle_cb(GSList *characteristics, guint8 status,
@@ -550,12 +552,21 @@ static GDBusSignalTable monitor_signals[] = {
 static void monitor_destroy(gpointer user_data)
 {
 	struct monitor *monitor = user_data;
+	struct btd_device *device = monitor->device;
 
 	if (monitor->immediateto)
 		g_source_remove(monitor->immediateto);
 
+	if (monitor->rssimon) {
+		struct btd_adapter *adapter = device_get_adapter(device);
+		bdaddr_t dba;
+
+		device_get_address(device, &dba);
+		btd_adapter_disable_rssi_monitor(adapter, &dba);
+	}
+
 	if (monitor->attioid)
-		btd_device_remove_attio_callback(monitor->device,
+		btd_device_remove_attio_callback(device,
 						monitor->attioid);
 	if (monitor->attrib)
 		g_attrib_unref(monitor->attrib);
-- 
1.7.6

[PATCH BlueZ 11/14] Disable RSSI threshold monitor when disconnected

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:38

---
 proximity/monitor.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index eea77cb..4bd4506 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
@@ -358,11 +358,18 @@ static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
 static void attio_disconnected_cb(gpointer user_data)
 {
 	struct monitor *monitor = user_data;
-	const char *path = device_get_path(monitor->device);
+	struct btd_device *device = monitor->device;
+	struct btd_adapter *adapter = device_get_adapter(device);
+	const char *path = device_get_path(device);
+	bdaddr_t dba;
 
 	g_attrib_unref(monitor->attrib);
 	monitor->attrib = NULL;
 
+	device_get_address(device, &dba);
+	btd_adapter_disable_rssi_monitor(adapter, &dba);
+	monitor->rssimon = FALSE;
+
 	if (monitor->immediateto == 0)
 		return;
 
-- 
1.7.6

[PATCH BlueZ 12/14] Emit SignalLevel when RSSI alert is received

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:39

Changes Proximity Monitor emitting a signal when the RSSI threshold
monitoring event is received.
---
 proximity/monitor.c |   26 +++++++++++++++++++++++++-
 1 files changed, 25 insertions(+), 1 deletions(-)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index 4bd4506..818325a 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
@@ -186,7 +186,31 @@ static int write_alert_level(struct monitor *monitor)
 
 static void monitor_rssi_alert(uint8_t alert, gpointer user_data)
 {
-	DBG("");
+	struct monitor *monitor = user_data;
+	const char *level, *path = device_get_path(monitor->device);
+
+	switch (alert) {
+	case 0x00:
+		level = "good";
+		break;
+	case 0x01:
+		level = "regular";
+		break;
+	case 0x02:
+		level = "weak";
+		break;
+	default:
+		level = "unknown";
+		break;
+	}
+
+	emit_property_changed(monitor->conn, path, PROXIMITY_INTERFACE,
+					"SignalLevel", DBUS_TYPE_STRING,
+					&level);
+	g_free(monitor->signallevel);
+	monitor->signallevel = g_strdup(level);
+
+	DBG("SignalLevel: %s", level);
 }
 
 static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
-- 
1.7.6

[PATCH BlueZ 13/14] Define low/high RSSI threshold for Proximity

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:40

Empirical values based on test results with keyfobs. Improvements
may be needed: storing the last operation results to handle situations
which high alert level is not received before disconnection. For this
case, shifting the thresholds may be an option.
---
 proximity/monitor.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index 818325a..4b5a4ff 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
@@ -56,6 +56,9 @@
 
 #define IMMEDIATE_TIMEOUT	5
 
+#define LOW_RSSI_THRESHOLD	-60
+#define HIGH_RSSI_THRESHOLD	-75
+
 enum {
 	ALERT_NONE = 0,
 	ALERT_MILD,
@@ -221,7 +224,7 @@ static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 	struct btd_adapter *adapter = device_get_adapter(device);
 	uint8_t value;
 	int vlen;
-	int8_t low = -20, high = -40;
+	int8_t low, high, txpower;
 	bdaddr_t dba;
 
 	if (status != 0) {
@@ -234,8 +237,11 @@ static void tx_power_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 		return;
 	}
 
-	DBG("Tx Power Level: %02x", (int8_t) value);
+	txpower = (int8_t) value;
+	DBG("Tx Power Level: %d", txpower);
 
+	low = LOW_RSSI_THRESHOLD - txpower;
+	high = HIGH_RSSI_THRESHOLD - txpower;
 	device_get_address(device, &dba);
 	monitor->rssimon = btd_adapter_enable_rssi_monitor(adapter, &dba,
 						low, high, monitor_rssi_alert,
-- 
1.7.6

[PATCH BlueZ 14/14] Reset SignalLevel to unknown when disconnected

From: Claudio Takahasi <hidden>
Date: 2011-08-09 21:00:41

---
 proximity/monitor.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index 4b5a4ff..e28a79d 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
@@ -396,6 +396,13 @@ static void attio_disconnected_cb(gpointer user_data)
 	g_attrib_unref(monitor->attrib);
 	monitor->attrib = NULL;
 
+	g_free(monitor->signallevel);
+	monitor->signallevel = g_strdup("unknown");
+
+	emit_property_changed(monitor->conn, path, PROXIMITY_INTERFACE,
+					"SignalLevel", DBUS_TYPE_STRING,
+					&monitor->signallevel);
+
 	device_get_address(device, &dba);
 	btd_adapter_disable_rssi_monitor(adapter, &dba);
 	monitor->rssimon = FALSE;
-- 
1.7.6
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help