From d2b0e093fc9f7cb33f1d822a8d6c102f4630c68f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 17 Sep 2022 13:07:52 -0500 Subject: [PATCH] Reduce power by avoiding resends when OSC state is not changing --- .../virtual_controller/VirtualController.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java index 683873b1..ce9f4014 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java @@ -43,23 +43,12 @@ public class VirtualController { private final Context context; private final Handler handler; - // HACK: GFE sometimes discards gamepad packets when they are received - // very shortly after another. This can be critical if an axis zeroing packet - // is lost and causes an analog stick to get stuck. To avoid this, we send - // a gamepad input packet every 100 ms to ensure any loss can be recovered. - private static final int RETRANSMIT_PERIOD_MS = 100; - private final Runnable retransmitRunnable = new Runnable() { + private final Runnable delayedRetransmitRunnable = new Runnable() { @Override public void run() { - if (hidden) { - return; - } - - sendControllerInputContext(); - handler.postDelayed(this, RETRANSMIT_PERIOD_MS); + sendControllerInputContextInternal(); } }; - private boolean hidden; private FrameLayout frame_layout = null; @@ -114,9 +103,6 @@ public class VirtualController { } public void hide() { - hidden = true; - handler.removeCallbacks(retransmitRunnable); - for (VirtualControllerElement element : elements) { element.setVisibility(View.INVISIBLE); } @@ -125,15 +111,11 @@ public class VirtualController { } public void show() { - hidden = false; - for (VirtualControllerElement element : elements) { element.setVisibility(View.VISIBLE); } buttonConfigure.setVisibility(View.VISIBLE); - - handler.postDelayed(retransmitRunnable, RETRANSMIT_PERIOD_MS); } public void removeElements() { @@ -196,7 +178,7 @@ public class VirtualController { return inputContext; } - void sendControllerInputContext() { + private void sendControllerInputContextInternal() { _DBG("INPUT_MAP + " + inputContext.inputMap); _DBG("LEFT_TRIGGER " + inputContext.leftTrigger); _DBG("RIGHT_TRIGGER " + inputContext.rightTrigger); @@ -215,4 +197,19 @@ public class VirtualController { ); } } + + void sendControllerInputContext() { + // Cancel retransmissions of prior gamepad inputs + handler.removeCallbacks(delayedRetransmitRunnable); + + sendControllerInputContextInternal(); + + // HACK: GFE sometimes discards gamepad packets when they are received + // very shortly after another. This can be critical if an axis zeroing packet + // is lost and causes an analog stick to get stuck. To avoid this, we retransmit + // the gamepad state a few times unless another input event happens before then. + handler.postDelayed(delayedRetransmitRunnable, 25); + handler.postDelayed(delayedRetransmitRunnable, 50); + handler.postDelayed(delayedRetransmitRunnable, 75); + } }