Linux bluetooth development
 help / color / mirror / Atom feed
From: Bastien Nocera <hadess@hadess.net>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH 2/2] fakehid: Disconnect from PS3 remote after 10 mins
Date: Fri, 07 Sep 2012 13:02:14 +0100	[thread overview]
Message-ID: <1347019334.26781.3.camel@sirocco.hadess.net> (raw)


After 10 minutes, disconnect the PS3 BD Remote to avoid draining its
battery. This is consistent with its behaviour on the PS3.

Original patch by Ruslan N. Marchenko <rufferson@gmail.com>
---
 profiles/input/device.h  |  1 +
 profiles/input/fakehid.c | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/profiles/input/device.h b/profiles/input/device.h
index ff52967..d8baa2c 100644
--- a/profiles/input/device.h
+++ b/profiles/input/device.h
@@ -33,6 +33,7 @@ struct fake_input {
 	int		uinput;		/* uinput socket */
 	int		rfcomm;		/* RFCOMM socket */
 	uint8_t		ch;		/* RFCOMM channel number */
+	guint           timeout_id;	/* Disconnect timeout ID */
 	gboolean	(*connect) (struct input_conn *iconn, GError **err);
 	int		(*disconnect) (struct input_conn *iconn);
 	void		*priv;
diff --git a/profiles/input/fakehid.c b/profiles/input/fakehid.c
index 305a204..4c7c9ab 100644
--- a/profiles/input/fakehid.c
+++ b/profiles/input/fakehid.c
@@ -41,6 +41,9 @@
 #include "fakehid.h"
 #include "uinput.h"
 
+/* Timeout to get the PS3 remote disconnected, in seconds */
+#define PS3_REMOTE_TIMEOUT 10 * 60
+
 enum ps3remote_special_keys {
 	PS3R_BIT_PS = 0,
 	PS3R_BIT_ENTER = 3,
@@ -200,6 +203,24 @@ error:
 	return -1;
 }
 
+static gboolean ps3_remote_timeout_cb(gpointer user_data)
+{
+	struct fake_input *fake = user_data;
+
+	input_device_request_disconnect(fake);
+	DBG("Disconnected PS3 BD Remote after timeout");
+
+	fake->timeout_id = 0;
+
+	return FALSE;
+}
+
+static void ps3remote_set_timeout(struct fake_input *fake)
+{
+	fake->timeout_id = g_timeout_add_seconds(PS3_REMOTE_TIMEOUT,
+			ps3_remote_timeout_cb, fake);
+}
+
 static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
 				gpointer data)
 {
@@ -253,9 +274,17 @@ static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
 		goto failed;
 	}
 
+	if (fake->timeout_id > 0)
+		g_source_remove(fake->timeout_id);
+	ps3remote_set_timeout(fake);
+
 	return TRUE;
 
 failed:
+	if (fake->timeout_id > 0) {
+		g_source_remove(fake->timeout_id);
+		fake->timeout_id = 0;
+	}
 	ioctl(fake->uinput, UI_DEV_DESTROY);
 	close(fake->uinput);
 	fake->uinput = -1;
@@ -315,6 +344,8 @@ static int ps3remote_setup_uinput(struct fake_input *fake,
 		goto err;
 	}
 
+	ps3remote_set_timeout(fake);
+
 	return 0;
 
 err:
@@ -375,6 +406,8 @@ struct fake_input *fake_hid_connadd(struct fake_input *fake,
 	for (l = fake_hid->devices; l != NULL; l = l->next) {
 		old = l->data;
 		if (old->idev == fake->idev) {
+			if (fake->timeout_id > 0)
+				g_source_remove(fake->timeout_id);
 			g_free(fake);
 			fake = old;
 			fake_hid->connect(fake, NULL);
-- 
1.7.12



                 reply	other threads:[~2012-09-07 12:02 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1347019334.26781.3.camel@sirocco.hadess.net \
    --to=hadess@hadess.net \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox