From 7bd80379a9d85acae1c1b6bcb08c673d9760dee9 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Fri, 7 Sep 2012 13:02:14 +0100 Subject: [PATCH] fakehid: Disconnect from PS3 remote after 10 mins 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 --- 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 ff5296779..d8baa2cec 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 305a204cf..e258e60b9 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); -- 2.47.3