summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgerman77 <juangerman-13@hotmail.com>2023-04-04 07:08:11 +0200
committerbunnei <bunneidev@gmail.com>2023-06-03 09:05:56 +0200
commit166bff88b852037c92c267bcc22e1f48ac0121c1 (patch)
tree8c542f9af097f5ef22610fe378d9d1ef8e676769
parentcore: hid: Finish linking motion from virtual controllers (diff)
downloadyuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.tar
yuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.tar.gz
yuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.tar.bz2
yuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.tar.lz
yuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.tar.xz
yuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.tar.zst
yuzu-166bff88b852037c92c267bcc22e1f48ac0121c1.zip
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt71
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt64
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 4670bc375..974e8b7a8 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 c2adf0ec6..5c3d79a16 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<InputOverlayDrawableButton> = HashSet()
private val overlayDpads: MutableSet<InputOverlayDrawableDpad> = HashSet()
private val overlayJoysticks: MutableSet<InputOverlayDrawableJoystick> = 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(