From 166bff88b852037c92c267bcc22e1f48ac0121c1 Mon Sep 17 00:00:00 2001 From: german77 Date: Mon, 3 Apr 2023 23:08:11 -0600 Subject: [PATCH] android: Move motion listener to emulation activity --- .../yuzu_emu/activities/EmulationActivity.kt | 71 ++++++++++++++++++- .../org/yuzu/yuzu_emu/overlay/InputOverlay.kt | 64 +---------------- 2 files changed, 71 insertions(+), 64 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 4670bc375e..974e8b7a83 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -4,9 +4,14 @@ package org.yuzu.yuzu_emu.activities import android.app.Activity +import android.content.Context import android.content.DialogInterface import android.content.Intent import android.graphics.Rect +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager import android.os.Bundle import android.view.* import android.view.KeyEvent @@ -29,7 +34,7 @@ import org.yuzu.yuzu_emu.utils.SerializableHelper.parcelable import org.yuzu.yuzu_emu.utils.ThemeHelper import kotlin.math.roundToInt -open class EmulationActivity : AppCompatActivity() { +open class EmulationActivity : AppCompatActivity(), SensorEventListener { private var controllerMappingHelper: ControllerMappingHelper? = null // TODO(bunnei): Disable notifications until we support app suspension. @@ -41,6 +46,10 @@ open class EmulationActivity : AppCompatActivity() { private lateinit var nfcReader: NfcReader private lateinit var inputHandler: InputHandler + private val gyro = FloatArray(3) + private val accel = FloatArray(3) + private var motionTimestamp: Long = 0 + private lateinit var game: Game override fun onDestroy() { @@ -160,6 +169,49 @@ open class EmulationActivity : AppCompatActivity() { return inputHandler.dispatchGenericMotionEvent(event) } + override fun onSensorChanged(event: SensorEvent) { + if (event.sensor.type == 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.type == Sensor.TYPE_GYROSCOPE) { + // Investigate why sensor value is off by 6x + gyro[0] = event.values[1] / 6.0f + gyro[1] = -event.values[0] / 6.0f + gyro[2] = event.values[2] / 6.0f + } + + // Only update state on accelerometer data + if (event.sensor.type != Sensor.TYPE_ACCELEROMETER) { + return + } + val deltaTimestamp = (event.timestamp - motionTimestamp) / 1000 + motionTimestamp = event.timestamp + NativeLibrary.onGamePadMotionEvent( + NativeLibrary.Player1Device, + deltaTimestamp, + gyro[0], + gyro[1], + gyro[2], + accel[0], + accel[1], + accel[2] + ) + NativeLibrary.onGamePadMotionEvent( + NativeLibrary.ConsoleDevice, + deltaTimestamp, + gyro[0], + gyro[1], + gyro[2], + accel[0], + accel[1], + accel[2] + ) + } + + override fun onAccuracyChanged(sensor: Sensor, i: Int) {} + private fun restoreState(savedInstanceState: Bundle) { game = savedInstanceState.parcelable(EXTRA_SELECTED_GAME)!! } @@ -212,6 +264,23 @@ open class EmulationActivity : AppCompatActivity() { .show() } + private fun startMotionSensorListener() { + val sensorManager = this.getSystemService(Context.SENSOR_SERVICE) as SensorManager + val gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) + val accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) + sensorManager.registerListener(this, gyroSensor, SensorManager.SENSOR_DELAY_GAME) + sensorManager.registerListener(this, accelSensor, SensorManager.SENSOR_DELAY_GAME) + } + + private fun stopMotionSensorListener() { + val sensorManager = this.getSystemService(Context.SENSOR_SERVICE) as SensorManager + val gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) + val accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) + + sensorManager.unregisterListener(this, gyroSensor) + sensorManager.unregisterListener(this, accelSensor) + } + private fun setControlScale(scale: Int) { PreferenceManager.getDefaultSharedPreferences(applicationContext).edit() .putInt(Settings.PREF_CONTROL_SCALE, scale) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt index c2adf0ec6f..5c3d79a166 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt @@ -12,10 +12,6 @@ import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.Drawable import android.graphics.drawable.VectorDrawable -import android.hardware.Sensor -import android.hardware.SensorEvent -import android.hardware.SensorEventListener -import android.hardware.SensorManager import android.os.Build import android.util.AttributeSet import android.view.MotionEvent @@ -41,7 +37,7 @@ import kotlin.math.min * [SurfaceView] that is rendering emulation. */ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context, attrs), - OnTouchListener, SensorEventListener { + OnTouchListener { private val overlayButtons: MutableSet = HashSet() private val overlayDpads: MutableSet = HashSet() private val overlayJoysticks: MutableSet = HashSet() @@ -54,21 +50,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context private val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) - private val gyro = FloatArray(3) - private val accel = FloatArray(3) - private var motionTimestamp: Long = 0 - private lateinit var windowInsets: WindowInsets - private fun setMotionSensorListener(context: Context) { - val sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager - val gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) - val accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) - - sensorManager.registerListener(this, gyroSensor, SensorManager.SENSOR_DELAY_GAME) - sensorManager.registerListener(this, accelSensor, SensorManager.SENSOR_DELAY_GAME) - } - override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { super.onLayout(changed, left, top, right, bottom) @@ -81,9 +64,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context // Load the controls. refreshControls() - // Set the on motion sensor listener. - setMotionSensorListener(context) - // Set the on touch listener. setOnTouchListener(this) @@ -338,48 +318,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context return true } - override fun onSensorChanged(event: SensorEvent) { - if (event.sensor.type == 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.type == 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.type != Sensor.TYPE_ACCELEROMETER) { - return - } - val deltaTimestamp = (event.timestamp - motionTimestamp) / 1000 - motionTimestamp = event.timestamp - NativeLibrary.onGamePadMotionEvent( - NativeLibrary.Player1Device, - deltaTimestamp, - gyro[0], - gyro[1], - gyro[2], - accel[0], - accel[1], - accel[2] - ) - NativeLibrary.onGamePadMotionEvent( - NativeLibrary.ConsoleDevice, - deltaTimestamp, - gyro[0], - gyro[1], - gyro[2], - accel[0], - accel[1], - accel[2] - ) - } - - override fun onAccuracyChanged(sensor: Sensor, i: Int) {} private fun addOverlayControls(orientation: String) { if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_0, true)) { overlayButtons.add(