From 3d18d1a7fe9669d957e6cdbe02eb53a695dd0edc Mon Sep 17 00:00:00 2001 From: Mickael Istria Date: Wed, 1 Apr 2026 17:57:36 +0200 Subject: [PATCH] Capture and send orientation to server Requires https://github.com/kitswas/VGP_Data_Exchange/pull/4 ; Part of https://github.com/kitswas/VirtualGamePad-Mobile/issues/18 --- VGP_Data_Exchange | 2 +- .../network/NetworkCommand.kt | 2 ++ .../ui/screens/Gamepad.kt | 30 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/VGP_Data_Exchange b/VGP_Data_Exchange index 3b1496d..7845f28 160000 --- a/VGP_Data_Exchange +++ b/VGP_Data_Exchange @@ -1 +1 @@ -Subproject commit 3b1496d03f841b229741b5b4eb6e127ef88ad8a3 +Subproject commit 7845f283a0a7cbd3208bd645e989c961cd9570db diff --git a/app/src/main/java/io/github/kitswas/virtualgamepadmobile/network/NetworkCommand.kt b/app/src/main/java/io/github/kitswas/virtualgamepadmobile/network/NetworkCommand.kt index 96d63e6..6b3b48b 100644 --- a/app/src/main/java/io/github/kitswas/virtualgamepadmobile/network/NetworkCommand.kt +++ b/app/src/main/java/io/github/kitswas/virtualgamepadmobile/network/NetworkCommand.kt @@ -31,6 +31,8 @@ sealed class NetworkCommand { RightThumbstickY = originalState.RightThumbstickY LeftTrigger = originalState.LeftTrigger RightTrigger = originalState.RightTrigger + Pitch = originalState.Pitch + Roll = originalState.Roll } } diff --git a/app/src/main/java/io/github/kitswas/virtualgamepadmobile/ui/screens/Gamepad.kt b/app/src/main/java/io/github/kitswas/virtualgamepadmobile/ui/screens/Gamepad.kt index 5d3a25d..25f0dc5 100644 --- a/app/src/main/java/io/github/kitswas/virtualgamepadmobile/ui/screens/Gamepad.kt +++ b/app/src/main/java/io/github/kitswas/virtualgamepadmobile/ui/screens/Gamepad.kt @@ -1,7 +1,11 @@ package io.github.kitswas.virtualgamepadmobile.ui.screens import android.annotation.SuppressLint +import android.app.Activity import android.content.res.Configuration +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorManager import android.util.Log import android.widget.Toast import androidx.compose.runtime.Composable @@ -57,6 +61,32 @@ fun GamePad( DrawGamepad(screenWidth, screenHeight, gamepadState, buttonConfigs) val activity = LocalContext.current.findActivity() + val sensorService = activity?.getSystemService(Activity.SENSOR_SERVICE) + if (sensorService is SensorManager) { + val rotationSensor = sensorService.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) + sensorService.registerListener(object : android.hardware.SensorEventListener { + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { + // If you need to process this as well, it would be a good idea + // to wrap the values from this as well as onSensorChanged() into + // a custom SensorEvent class and then put it on a channel. + } + + override fun onSensorChanged(event: SensorEvent?) { + if (event?.sensor == rotationSensor) { + val rotationMatrix = FloatArray(9) + SensorManager.getRotationMatrixFromVector(rotationMatrix, event?.values) + // TODO rotate + val orientation = FloatArray(3) + SensorManager.getOrientation(rotationMatrix, orientation) + gamepadState.Pitch = orientation[1]; + gamepadState.Roll = orientation[2]; + } + } + + }, rotationSensor, 20000); + } + // disconnect on back press androidx.lifecycle.compose.LocalLifecycleOwner.current.lifecycle .addObserver(androidx.lifecycle.LifecycleEventObserver { _, event ->