* [PATCH 2/2] fakehid: Disconnect from PS3 remote after 10 mins
@ 2012-09-07 12:02 Bastien Nocera
0 siblings, 0 replies; only message in thread
From: Bastien Nocera @ 2012-09-07 12:02 UTC (permalink / raw)
To: linux-bluetooth
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
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2012-09-07 12:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-07 12:02 [PATCH 2/2] fakehid: Disconnect from PS3 remote after 10 mins Bastien Nocera
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox