From d6f6307050daf7f6fd787229db1f7f686d5ffa95 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 24 Jun 2023 23:12:28 -0500 Subject: [PATCH] Fix units of gyro motion and deduplicate sensor events --- .../binding/input/ControllerHandler.java | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java index 23d6dfc7..c6ca36a7 100644 --- a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java +++ b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java @@ -1697,13 +1697,40 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD reportRateHz = (short) Math.min(200, reportRateHz); SensorEventListener newSensorListener = new SensorEventListener() { + private float[] lastValues = new float[3]; + @Override public void onSensorChanged(SensorEvent sensorEvent) { - conn.sendControllerMotionEvent((byte) controllerNumber, - motionType, - sensorEvent.values[0], - sensorEvent.values[1], - sensorEvent.values[2]); + // Android will invoke our callback any time we get a new reading, + // even if the values are the same as last time. Don't report a + // duplicate set of values to save bandwidth. + if (sensorEvent.values[0] == lastValues[0] && + sensorEvent.values[1] == lastValues[1] && + sensorEvent.values[2] == lastValues[2]) { + return; + } + else { + lastValues[0] = sensorEvent.values[0]; + lastValues[1] = sensorEvent.values[1]; + lastValues[2] = sensorEvent.values[2]; + } + + if (motionType == MoonBridge.LI_MOTION_TYPE_GYRO) { + // Convert from rad/s to deg/s + conn.sendControllerMotionEvent((byte) controllerNumber, + motionType, + sensorEvent.values[0] * 57.2957795f, + sensorEvent.values[1] * 57.2957795f, + sensorEvent.values[2] * 57.2957795f); + } + else { + // Pass m/s^2 directly without conversion + conn.sendControllerMotionEvent((byte) controllerNumber, + motionType, + sensorEvent.values[0], + sensorEvent.values[1], + sensorEvent.values[2]); + } } @Override