From c8b8a60033bb35917c10eeb5c4043ee428ae61a6 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 20 Nov 2019 19:40:47 +0100 Subject: [PATCH] Android: Let WiimoteEmu know whether we have accelerometer/gyroscope --- .../dolphinemu/dolphinemu/NativeLibrary.java | 3 ++ .../dolphinemu/utils/MotionListener.java | 4 ++ Source/Android/jni/MainAndroid.cpp | 10 ++++ .../ControllerInterface/Android/Android.cpp | 47 ++++++++++++++----- .../ControllerInterface/Android/Android.h | 2 + 5 files changed, 54 insertions(+), 12 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index 5bb6a92b23..60b07902c3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -265,6 +265,9 @@ public final class NativeLibrary Rumble.checkRumble(padID, state); } + public static native void SetMotionSensorsEnabled(boolean accelerometerEnabled, + boolean gyroscopeEnabled); + public static native void NewGameIniFile(); public static native void LoadGameIniFile(String gameId); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/MotionListener.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/MotionListener.java index e0d8d68b98..4230b0b7bc 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/MotionListener.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/MotionListener.java @@ -101,10 +101,14 @@ public class MotionListener implements SensorEventListener mSensorManager.registerListener(this, mAccelSensor, SAMPLING_PERIOD_US); if (mGyroSensor != null) mSensorManager.registerListener(this, mGyroSensor, SAMPLING_PERIOD_US); + + NativeLibrary.SetMotionSensorsEnabled(mAccelSensor != null, mGyroSensor != null); } public void disable() { mSensorManager.unregisterListener(this); + + NativeLibrary.SetMotionSensorsEnabled(false, false); } } diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index aa197f7e5e..d998097fee 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -47,6 +47,8 @@ #include "DiscIO/Enums.h" #include "DiscIO/Volume.h" +#include "InputCommon/ControllerInterface/Android/Android.h" + #include "UICommon/UICommon.h" #include "VideoCommon/OnScreenDisplay.h" @@ -200,6 +202,8 @@ JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePa JNIEnv* env, jobject obj, jstring jDevice, jint Button, jint Action); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent( JNIEnv* env, jobject obj, jstring jDevice, jint Axis, jfloat Value); +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetMotionSensorsEnabled( + JNIEnv* env, jobject obj, jboolean accelerometer_enabled, jboolean gyroscope_enabled); JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv* env, jobject obj); JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetGitRevision(JNIEnv* env, @@ -308,6 +312,12 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMov ButtonManager::GamepadAxisEvent(GetJString(env, jDevice), Axis, Value); } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetMotionSensorsEnabled( + JNIEnv* env, jobject obj, jboolean accelerometer_enabled, jboolean gyroscope_enabled) +{ + ciface::Android::SetMotionSensorsEnabled(accelerometer_enabled, gyroscope_enabled); +} + JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv* env, jobject obj) { diff --git a/Source/Core/InputCommon/ControllerInterface/Android/Android.cpp b/Source/Core/InputCommon/ControllerInterface/Android/Android.cpp index 78fc029374..21537cba15 100644 --- a/Source/Core/InputCommon/ControllerInterface/Android/Android.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Android/Android.cpp @@ -10,6 +10,21 @@ namespace ciface::Android { +static bool s_accelerometer_enabled = false; +static bool s_gyroscope_enabled = false; + +void SetMotionSensorsEnabled(bool accelerometer_enabled, bool gyroscope_enabled) +{ + const bool any_changes = + s_accelerometer_enabled != accelerometer_enabled || s_gyroscope_enabled != gyroscope_enabled; + + s_accelerometer_enabled = accelerometer_enabled; + s_gyroscope_enabled = gyroscope_enabled; + + if (any_changes) + g_controller_interface.RefreshDevices(); +} + void PopulateDevices() { for (int i = 0; i < 8; ++i) @@ -186,18 +201,26 @@ Touchscreen::Touchscreen(int padID) : _padID(padID) AddInput(new Axis(_padID, ButtonManager::TURNTABLE_EFFECT_DIAL)); // Wiimote IMU - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_LEFT)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_RIGHT)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_FORWARD)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_BACKWARD)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_UP)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_DOWN)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_PITCH_UP)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_PITCH_DOWN)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_ROLL_LEFT)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_ROLL_RIGHT)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_YAW_LEFT)); - AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_YAW_RIGHT)); + // Only add inputs if we actually can receive data from the relevant sensor. + // Whether inputs exist affects what WiimoteEmu gets when calling ControlReference::BoundCount. + if (s_accelerometer_enabled) + { + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_LEFT)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_RIGHT)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_FORWARD)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_BACKWARD)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_UP)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_ACCEL_DOWN)); + } + if (s_gyroscope_enabled) + { + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_PITCH_UP)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_PITCH_DOWN)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_ROLL_LEFT)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_ROLL_RIGHT)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_YAW_LEFT)); + AddInput(new Axis(_padID, ButtonManager::WIIMOTE_GYRO_YAW_RIGHT)); + } // Rumble AddOutput(new Motor(_padID, ButtonManager::RUMBLE)); diff --git a/Source/Core/InputCommon/ControllerInterface/Android/Android.h b/Source/Core/InputCommon/ControllerInterface/Android/Android.h index 82a1a47954..c9e7ddc0a9 100644 --- a/Source/Core/InputCommon/ControllerInterface/Android/Android.h +++ b/Source/Core/InputCommon/ControllerInterface/Android/Android.h @@ -9,6 +9,8 @@ namespace ciface::Android { +void SetMotionSensorsEnabled(bool accelerometer_enabled, bool gyroscope_enabled); + void PopulateDevices(); class Touchscreen : public Core::Device