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@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html