summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java65
1 files changed, 56 insertions, 9 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
index e6e91aea1..881c6de91 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
@@ -16,6 +16,10 @@ import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
import android.preference.PreferenceManager;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -38,20 +42,19 @@ import java.util.Set;
* Draws the interactive input overlay on top of the
* {@link SurfaceView} that is rendering emulation.
*/
-public final class InputOverlay extends SurfaceView implements OnTouchListener {
+public final class InputOverlay extends SurfaceView implements OnTouchListener, SensorEventListener {
private final Set<InputOverlayDrawableButton> overlayButtons = new HashSet<>();
private final Set<InputOverlayDrawableDpad> overlayDpads = new HashSet<>();
private final Set<InputOverlayDrawableJoystick> overlayJoysticks = new HashSet<>();
private boolean mIsInEditMode = false;
- private InputOverlayDrawableButton mButtonBeingConfigured;
- private InputOverlayDrawableDpad mDpadBeingConfigured;
- private InputOverlayDrawableJoystick mJoystickBeingConfigured;
private SharedPreferences mPreferences;
- // Stores the ID of the pointer that interacted with the 3DS touchscreen.
- private int mTouchscreenPointerId = -1;
+ private float[] gyro = new float[3];
+ private float[] accel = new float[3];
+
+ private long motionTimestamp;
/**
* Constructor
@@ -67,12 +70,12 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener {
defaultOverlay();
}
- // Reset 3ds touchscreen pointer ID
- mTouchscreenPointerId = -1;
-
// Load the controls.
refreshControls();
+ // Set the on motion sensor listener.
+ setMotionSensorListener(context);
+
// Set the on touch listener.
setOnTouchListener(this);
@@ -83,6 +86,20 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener {
requestFocus();
}
+ private void setMotionSensorListener(Context context) {
+ SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+ Sensor gyro_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
+ Sensor accel_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+
+ if (gyro_sensor != null) {
+ sensorManager.registerListener(this, gyro_sensor, SensorManager.SENSOR_DELAY_GAME);
+ }
+ if (accel_sensor != null) {
+ sensorManager.registerListener(this, accel_sensor, SensorManager.SENSOR_DELAY_GAME);
+ }
+ }
+
+
/**
* Resizes a {@link Bitmap} by a given scale factor
*
@@ -427,6 +444,36 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener {
return true;
}
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+ accel[0] = -event.values[1] / SensorManager.GRAVITY_EARTH;
+ accel[1] = event.values[0] / SensorManager.GRAVITY_EARTH;
+ accel[2] = -event.values[2] / SensorManager.GRAVITY_EARTH;
+ }
+
+ if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
+ // Investigate why sensor value is off by 12x
+ gyro[0] = event.values[1] / 12.0f;
+ gyro[1] = -event.values[0] / 12.0f;
+ gyro[2] = event.values[2] / 12.0f;
+ }
+
+ // Only update state on accelerometer data
+ if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
+ return;
+ }
+
+ long delta_timestamp = (event.timestamp - motionTimestamp) / 1000;
+ motionTimestamp = event.timestamp;
+ NativeLibrary.onGamePadMotionEvent(NativeLibrary.Player1Device, delta_timestamp, gyro[0], gyro[1], gyro[2], accel[0], accel[1], accel[2]);
+ NativeLibrary.onGamePadMotionEvent(NativeLibrary.ConsoleDevice, delta_timestamp, gyro[0], gyro[1], gyro[2], accel[0], accel[1], accel[2]);
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int i) {
+ }
+
private void addOverlayControls(String orientation) {
if (mPreferences.getBoolean("buttonToggle0", true)) {
overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_a,