Merge pull request #7400 from zackhow/phone-rumble

Android: Add rumble for phone
This commit is contained in:
Markus Wick 2018-09-21 17:05:46 +02:00 committed by GitHub
commit 85961f996e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 415 additions and 61 deletions

View File

@ -18,6 +18,7 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA"/> <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA"/>
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA"/> <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA"/>
<uses-permission android:name="android.permission.VIBRATE" />
<application <application
android:name=".DolphinApplication" android:name=".DolphinApplication"

View File

@ -25,6 +25,7 @@ Triggers/R = `Axis 21`
Triggers/L-Analog = `Axis 20` Triggers/L-Analog = `Axis 20`
Triggers/R-Analog = `Axis 21` Triggers/R-Analog = `Axis 21`
Triggers/Threshold = 90,000000 Triggers/Threshold = 90,000000
Rumble/Motor = `Rumble 700`
[GCPad2] [GCPad2]
Device = Android/1/Touchscreen Device = Android/1/Touchscreen
Buttons/A = `Button 0` Buttons/A = `Button 0`
@ -52,6 +53,7 @@ Triggers/R = `Axis 21`
Triggers/L-Analog = `Axis 20` Triggers/L-Analog = `Axis 20`
Triggers/R-Analog = `Axis 21` Triggers/R-Analog = `Axis 21`
Triggers/Threshold = 90,000000 Triggers/Threshold = 90,000000
Rumble/Motor = `Rumble 700`
[GCPad3] [GCPad3]
Device = Android/2/Touchscreen Device = Android/2/Touchscreen
Buttons/A = `Button 0` Buttons/A = `Button 0`
@ -79,6 +81,7 @@ Triggers/R = `Axis 21`
Triggers/L-Analog = `Axis 20` Triggers/L-Analog = `Axis 20`
Triggers/R-Analog = `Axis 21` Triggers/R-Analog = `Axis 21`
Triggers/Threshold = 90,000000 Triggers/Threshold = 90,000000
Rumble/Motor = `Rumble 700`
[GCPad4] [GCPad4]
Device = Android/3/Touchscreen Device = Android/3/Touchscreen
Buttons/A = `Button 0` Buttons/A = `Button 0`
@ -106,3 +109,4 @@ Triggers/R = `Axis 21`
Triggers/L-Analog = `Axis 20` Triggers/L-Analog = `Axis 20`
Triggers/R-Analog = `Axis 21` Triggers/R-Analog = `Axis 21`
Triggers/Threshold = 90,000000 Triggers/Threshold = 90,000000
Rumble/Motor = `Rumble 700`

View File

@ -133,6 +133,7 @@ Turntable/Effect/Dial = `Axis 621`
Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Left = `Axis 623`
Turntable/Crossfade/Right = `Axis 624` Turntable/Crossfade/Right = `Axis 624`
Source = 1 Source = 1
Rumble/Motor = `Rumble 700`
[Wiimote2] [Wiimote2]
Device = Android/5/Touchscreen Device = Android/5/Touchscreen
Buttons/A = `Button 100` Buttons/A = `Button 100`
@ -268,6 +269,7 @@ Turntable/Effect/Dial = `Axis 621`
Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Left = `Axis 623`
Turntable/Crossfade/Right = `Axis 624` Turntable/Crossfade/Right = `Axis 624`
Source = 0 Source = 0
Rumble/Motor = `Rumble 700`
[Wiimote3] [Wiimote3]
Device = Android/6/Touchscreen Device = Android/6/Touchscreen
Buttons/A = `Button 100` Buttons/A = `Button 100`
@ -403,6 +405,7 @@ Turntable/Effect/Dial = `Axis 621`
Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Left = `Axis 623`
Turntable/Crossfade/Right = `Axis 624` Turntable/Crossfade/Right = `Axis 624`
Source = 0 Source = 0
Rumble/Motor = `Rumble 700`
[Wiimote4] [Wiimote4]
Device = Android/7/Touchscreen Device = Android/7/Touchscreen
Buttons/A = `Button 100` Buttons/A = `Button 100`
@ -538,3 +541,4 @@ Turntable/Effect/Dial = `Axis 621`
Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Left = `Axis 623`
Turntable/Crossfade/Right = `Axis 624` Turntable/Crossfade/Right = `Axis 624`
Source = 0 Source = 0
Rumble/Motor = `Rumble 700`

View File

@ -7,6 +7,11 @@
package org.dolphinemu.dolphinemu; package org.dolphinemu.dolphinemu;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context;
import android.os.Build;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.view.Surface; import android.view.Surface;
import org.dolphinemu.dolphinemu.activities.EmulationActivity; import org.dolphinemu.dolphinemu.activities.EmulationActivity;
@ -225,6 +230,39 @@ public final class NativeLibrary
*/ */
public static native void onGamePadMoveEvent(String Device, int Axis, float Value); public static native void onGamePadMoveEvent(String Device, int Axis, float Value);
/**
* Rumble sent from native. Currently only supports phone rumble.
*
* @param padID Ignored for now. Future use would be to pass rumble to a connected controller
* @param state Ignored for now since phone rumble can't just be 'turned' on/off
*/
public static void rumble(int padID, double state)
{
final EmulationActivity emulationActivity = sEmulationActivity.get();
if (emulationActivity == null)
{
Log.warning("[NativeLibrary] EmulationActivity is null");
return;
}
if (PreferenceManager.getDefaultSharedPreferences(emulationActivity)
.getBoolean("phoneRumble", true))
{
Vibrator vibrator = (Vibrator) emulationActivity.getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator != null && vibrator.hasVibrator())
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
}
else
{
vibrator.vibrate(100);
}
}
}
}
public static native String GetUserSetting(String gameID, String Section, String Key); public static native String GetUserSetting(String gameID, String Section, String Key);
public static native void SetUserSetting(String gameID, String Section, String Key, String Value); public static native void SetUserSetting(String gameID, String Section, String Key, String Value);

View File

@ -124,6 +124,7 @@ public final class EmulationActivity extends AppCompatActivity
public static final int MENU_ACTION_EXIT = 22; public static final int MENU_ACTION_EXIT = 22;
public static final int MENU_ACTION_CHANGE_DISC = 23; public static final int MENU_ACTION_CHANGE_DISC = 23;
public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 24; public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 24;
public static final int MENU_ACTION_RUMBLE = 25;
private static SparseIntArray buttonsActionsMap = new SparseIntArray(); private static SparseIntArray buttonsActionsMap = new SparseIntArray();
@ -163,6 +164,7 @@ public final class EmulationActivity extends AppCompatActivity
buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT); buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT);
buttonsActionsMap.append(R.id.menu_emulation_joystick_rel_center, buttonsActionsMap.append(R.id.menu_emulation_joystick_rel_center,
EmulationActivity.MENU_ACTION_JOYSTICK_REL_CENTER); EmulationActivity.MENU_ACTION_JOYSTICK_REL_CENTER);
buttonsActionsMap.append(R.id.menu_emulation_rumble, EmulationActivity.MENU_ACTION_RUMBLE);
} }
public static void launch(FragmentActivity activity, GameFile gameFile, int position, public static void launch(FragmentActivity activity, GameFile gameFile, int position,
@ -473,6 +475,8 @@ public final class EmulationActivity extends AppCompatActivity
// Populate the checkbox value for joystick center on touch // Populate the checkbox value for joystick center on touch
menu.findItem(R.id.menu_emulation_joystick_rel_center) menu.findItem(R.id.menu_emulation_joystick_rel_center)
.setChecked(mPreferences.getBoolean("joystickRelCenter", true)); .setChecked(mPreferences.getBoolean("joystickRelCenter", true));
menu.findItem(R.id.menu_emulation_rumble)
.setChecked(mPreferences.getBoolean("phoneRumble", true));
return true; return true;
} }
@ -504,7 +508,11 @@ public final class EmulationActivity extends AppCompatActivity
case MENU_ACTION_JOYSTICK_REL_CENTER: case MENU_ACTION_JOYSTICK_REL_CENTER:
item.setChecked(!item.isChecked()); item.setChecked(!item.isChecked());
toggleJoystickRelCenter(item.isChecked()); toggleJoystickRelCenter(item.isChecked());
return; break;
case MENU_ACTION_RUMBLE:
item.setChecked(!item.isChecked());
toggleRumble(item.isChecked());
break;
} }
} }
@ -636,6 +644,13 @@ public final class EmulationActivity extends AppCompatActivity
editor.commit(); editor.commit();
} }
private void toggleRumble(boolean state)
{
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putBoolean("phoneRumble", state);
editor.apply();
}
private void editControlsPlacement() private void editControlsPlacement()
{ {

View File

@ -98,6 +98,10 @@
android:id="@+id/menu_emulation_joystick_rel_center" android:id="@+id/menu_emulation_joystick_rel_center"
android:checkable="true" android:checkable="true"
android:title="@string/emulation_control_joystick_rel_center"/> android:title="@string/emulation_control_joystick_rel_center"/>
<item
android:id="@+id/menu_emulation_rumble"
android:checkable="true"
android:title="@string/emulation_control_rumble"/>
</menu> </menu>
</item> </item>

View File

@ -98,11 +98,16 @@
android:id="@+id/menu_emulation_joystick_rel_center" android:id="@+id/menu_emulation_joystick_rel_center"
android:checkable="true" android:checkable="true"
android:title="@string/emulation_control_joystick_rel_center"/> android:title="@string/emulation_control_joystick_rel_center"/>
<item
android:id="@+id/menu_emulation_rumble"
android:checkable="true"
android:title="@string/emulation_control_rumble"/>
</group> </group>
<item <item
android:id="@+id/menu_emulation_choose_controller" android:id="@+id/menu_emulation_choose_controller"
android:title="@string/emulation_choose_controller"/> android:title="@string/emulation_choose_controller"/>
</menu> </menu>
</item> </item>

View File

@ -271,6 +271,7 @@
<string name="emulation_toggle_all">Toggle All</string> <string name="emulation_toggle_all">Toggle All</string>
<string name="emulation_control_scale">Adjust Scale</string> <string name="emulation_control_scale">Adjust Scale</string>
<string name="emulation_control_joystick_rel_center">Relative Stick Center</string> <string name="emulation_control_joystick_rel_center">Relative Stick Center</string>
<string name="emulation_control_rumble">Rumble</string>
<string name="emulation_choose_controller">Choose Controller</string> <string name="emulation_choose_controller">Choose Controller</string>
<string name="emulation_controller_changed">You may have to reload the game after changing extensions.</string> <string name="emulation_controller_changed">You may have to reload the game after changing extensions.</string>
<string name="emulation_touch_button_help">To change the button layout, open the menu -> Configure Controls -> Edit Layout</string> <string name="emulation_touch_button_help">To change the button layout, open the menu -> Configure Controls -> Edit Layout</string>

View File

@ -18,83 +18,309 @@ const std::string touchScreenKey = "Touchscreen";
std::unordered_map<std::string, InputDevice*> m_controllers; std::unordered_map<std::string, InputDevice*> m_controllers;
std::vector<std::string> configStrings = { std::vector<std::string> configStrings = {
// GC // GC
"InputA", "InputB", "InputStart", "InputX", "InputY", "InputZ", "DPadUp", "DPadDown", "InputA",
"DPadLeft", "DPadRight", "MainUp", "MainDown", "MainLeft", "MainRight", "CStickUp", "InputB",
"CStickDown", "CStickLeft", "CStickRight", "InputL", "InputR", "InputStart",
"InputX",
"InputY",
"InputZ",
"DPadUp",
"DPadDown",
"DPadLeft",
"DPadRight",
"MainUp",
"MainDown",
"MainLeft",
"MainRight",
"CStickUp",
"CStickDown",
"CStickLeft",
"CStickRight",
"InputL",
"InputR",
// Wiimote // Wiimote
"WiimoteA", "WiimoteB", "WiimoteMinus", "WiimotePlus", "WiimoteHome", "Wiimote1", "Wiimote2", "WiimoteA",
"WiimoteUp", "WiimoteDown", "WiimoteLeft", "WiimoteRight", "IRUp", "IRDown", "IRLeft", "WiimoteB",
"IRRight", "IRForward", "IRBackward", "IRHide", "SwingUp", "SwingDown", "SwingLeft", "WiimoteMinus",
"SwingRight", "SwingForward", "SwingBackward", "TiltForward", "TiltBackward", "TiltLeft", "WiimotePlus",
"TiltRight", "TiltModifier", "ShakeX", "ShakeY", "ShakeZ", "WiimoteHome",
"Wiimote1",
"Wiimote2",
"WiimoteUp",
"WiimoteDown",
"WiimoteLeft",
"WiimoteRight",
"IRUp",
"IRDown",
"IRLeft",
"IRRight",
"IRForward",
"IRBackward",
"IRHide",
"SwingUp",
"SwingDown",
"SwingLeft",
"SwingRight",
"SwingForward",
"SwingBackward",
"TiltForward",
"TiltBackward",
"TiltLeft",
"TiltRight",
"TiltModifier",
"ShakeX",
"ShakeY",
"ShakeZ",
// Nunchuk // Nunchuk
"NunchukC", "NunchukZ", "NunchukUp", "NunchukDown", "NunchukLeft", "NunchukRight", "NunchukC",
"NunchukSwingUp", "NunchukSwingDown", "NunchukSwingLeft", "NunchukSwingRight", "NunchukZ",
"NunchukSwingForward", "NunchukSwingBackward", "NunchukTiltForward", "NunchukTiltBackward", "NunchukUp",
"NunchukTiltLeft", "NunchukTiltRight", "NunchukTiltModifier", "NunchukShakeX", "NunchukShakeY", "NunchukDown",
"NunchukLeft",
"NunchukRight",
"NunchukSwingUp",
"NunchukSwingDown",
"NunchukSwingLeft",
"NunchukSwingRight",
"NunchukSwingForward",
"NunchukSwingBackward",
"NunchukTiltForward",
"NunchukTiltBackward",
"NunchukTiltLeft",
"NunchukTiltRight",
"NunchukTiltModifier",
"NunchukShakeX",
"NunchukShakeY",
"NunchukShakeZ", "NunchukShakeZ",
// Classic // Classic
"ClassicA", "ClassicB", "ClassicX", "ClassicY", "ClassicMinus", "ClassicPlus", "ClassicHome", "ClassicA",
"ClassicZL", "ClassicZR", "ClassicUp", "ClassicDown", "ClassicLeft", "ClassicRight", "ClassicB",
"ClassicLeftStickUp", "ClassicLeftStickDown", "ClassicLeftStickLeft", "ClassicLeftStickRight", "ClassicX",
"ClassicRightStickUp", "ClassicRightStickDown", "ClassicRightStickLeft", "ClassicY",
"ClassicRightStickRight", "ClassicTriggerL", "ClassicTriggerR", "ClassicMinus",
"ClassicPlus",
"ClassicHome",
"ClassicZL",
"ClassicZR",
"ClassicUp",
"ClassicDown",
"ClassicLeft",
"ClassicRight",
"ClassicLeftStickUp",
"ClassicLeftStickDown",
"ClassicLeftStickLeft",
"ClassicLeftStickRight",
"ClassicRightStickUp",
"ClassicRightStickDown",
"ClassicRightStickLeft",
"ClassicRightStickRight",
"ClassicTriggerL",
"ClassicTriggerR",
// Guitar // Guitar
"GuitarMinus", "GuitarPlus", "GuitarGreen", "GuitarRed", "GuitarYellow", "GuitarBue", "GuitarMinus",
"GuitarOrange", "GuitarStrumUp", "GuitarStrumDown", "GuitarUp", "GuitarDown", "GuitarLeft", "GuitarPlus",
"GuitarRight", "GuitarWhammy", "GuitarGreen",
"GuitarRed",
"GuitarYellow",
"GuitarBue",
"GuitarOrange",
"GuitarStrumUp",
"GuitarStrumDown",
"GuitarUp",
"GuitarDown",
"GuitarLeft",
"GuitarRight",
"GuitarWhammy",
// Drums // Drums
"DrumsMinus", "DrumsPlus", "DrumsRed", "DrumsYellow", "DrumsBlue", "DrumsGreen", "DrumsOrange", "DrumsMinus",
"DrumsBass", "DrumsUp", "DrumsDown", "DrumsLeft", "DrumsRight", "DrumsPlus",
"DrumsRed",
"DrumsYellow",
"DrumsBlue",
"DrumsGreen",
"DrumsOrange",
"DrumsBass",
"DrumsUp",
"DrumsDown",
"DrumsLeft",
"DrumsRight",
// Turntable // Turntable
"TurntableGreenLeft", "TurntableRedLeft", "TurntableBlueLeft", "TurntableGreenRight", "TurntableGreenLeft",
"TurntableRedRight", "TurntableBlueRight", "TurntableMinus", "TurntablePlus", "TurntableHome", "TurntableRedLeft",
"TurntableEuphoria", "TurntableLeftTLeft", "TurntableLeftTRight", "TurntableRightTLeft", "TurntableBlueLeft",
"TurntableRightTRight", "TurntableUp", "TurntableDown", "TurntableLeft", "TurntableRight", "TurntableGreenRight",
"TurntableEffDial", "TurntableCrossLeft", "TurntableCrossRight", "TurntableRedRight",
"TurntableBlueRight",
"TurntableMinus",
"TurntablePlus",
"TurntableHome",
"TurntableEuphoria",
"TurntableLeftTLeft",
"TurntableLeftTRight",
"TurntableRightTLeft",
"TurntableRightTRight",
"TurntableUp",
"TurntableDown",
"TurntableLeft",
"TurntableRight",
"TurntableEffDial",
"TurntableCrossLeft",
"TurntableCrossRight",
// Rumble
"Rumble",
}; };
std::vector<ButtonType> configTypes = { std::vector<ButtonType> configTypes = {
// GC // GC
BUTTON_A, BUTTON_B, BUTTON_START, BUTTON_X, BUTTON_Y, BUTTON_Z, BUTTON_UP, BUTTON_DOWN, BUTTON_A,
BUTTON_LEFT, BUTTON_RIGHT, STICK_MAIN_UP, STICK_MAIN_DOWN, STICK_MAIN_LEFT, STICK_MAIN_RIGHT, BUTTON_B,
STICK_C_UP, STICK_C_DOWN, STICK_C_LEFT, STICK_C_RIGHT, TRIGGER_L, TRIGGER_R, BUTTON_START,
BUTTON_X,
BUTTON_Y,
BUTTON_Z,
BUTTON_UP,
BUTTON_DOWN,
BUTTON_LEFT,
BUTTON_RIGHT,
STICK_MAIN_UP,
STICK_MAIN_DOWN,
STICK_MAIN_LEFT,
STICK_MAIN_RIGHT,
STICK_C_UP,
STICK_C_DOWN,
STICK_C_LEFT,
STICK_C_RIGHT,
TRIGGER_L,
TRIGGER_R,
// Wiimote // Wiimote
WIIMOTE_BUTTON_A, WIIMOTE_BUTTON_B, WIIMOTE_BUTTON_MINUS, WIIMOTE_BUTTON_PLUS, WIIMOTE_BUTTON_A,
WIIMOTE_BUTTON_HOME, WIIMOTE_BUTTON_1, WIIMOTE_BUTTON_2, WIIMOTE_UP, WIIMOTE_DOWN, WIIMOTE_LEFT, WIIMOTE_BUTTON_B,
WIIMOTE_RIGHT, WIIMOTE_IR_UP, WIIMOTE_IR_DOWN, WIIMOTE_IR_LEFT, WIIMOTE_IR_RIGHT, WIIMOTE_BUTTON_MINUS,
WIIMOTE_IR_FORWARD, WIIMOTE_IR_BACKWARD, WIIMOTE_IR_HIDE, WIIMOTE_SWING_UP, WIIMOTE_SWING_DOWN, WIIMOTE_BUTTON_PLUS,
WIIMOTE_SWING_LEFT, WIIMOTE_SWING_RIGHT, WIIMOTE_SWING_FORWARD, WIIMOTE_SWING_BACKWARD, WIIMOTE_BUTTON_HOME,
WIIMOTE_TILT_FORWARD, WIIMOTE_TILT_BACKWARD, WIIMOTE_TILT_LEFT, WIIMOTE_TILT_RIGHT, WIIMOTE_BUTTON_1,
WIIMOTE_TILT_MODIFIER, WIIMOTE_SHAKE_X, WIIMOTE_SHAKE_Y, WIIMOTE_SHAKE_Z, WIIMOTE_BUTTON_2,
WIIMOTE_UP,
WIIMOTE_DOWN,
WIIMOTE_LEFT,
WIIMOTE_RIGHT,
WIIMOTE_IR_UP,
WIIMOTE_IR_DOWN,
WIIMOTE_IR_LEFT,
WIIMOTE_IR_RIGHT,
WIIMOTE_IR_FORWARD,
WIIMOTE_IR_BACKWARD,
WIIMOTE_IR_HIDE,
WIIMOTE_SWING_UP,
WIIMOTE_SWING_DOWN,
WIIMOTE_SWING_LEFT,
WIIMOTE_SWING_RIGHT,
WIIMOTE_SWING_FORWARD,
WIIMOTE_SWING_BACKWARD,
WIIMOTE_TILT_FORWARD,
WIIMOTE_TILT_BACKWARD,
WIIMOTE_TILT_LEFT,
WIIMOTE_TILT_RIGHT,
WIIMOTE_TILT_MODIFIER,
WIIMOTE_SHAKE_X,
WIIMOTE_SHAKE_Y,
WIIMOTE_SHAKE_Z,
// Nunchuk // Nunchuk
NUNCHUK_BUTTON_C, NUNCHUK_BUTTON_Z, NUNCHUK_STICK_UP, NUNCHUK_STICK_DOWN, NUNCHUK_STICK_LEFT, NUNCHUK_BUTTON_C,
NUNCHUK_STICK_RIGHT, NUNCHUK_SWING_UP, NUNCHUK_SWING_DOWN, NUNCHUK_SWING_LEFT, NUNCHUK_BUTTON_Z,
NUNCHUK_SWING_RIGHT, NUNCHUK_SWING_FORWARD, NUNCHUK_SWING_BACKWARD, NUNCHUK_TILT_FORWARD, NUNCHUK_STICK_UP,
NUNCHUK_TILT_BACKWARD, NUNCHUK_TILT_LEFT, NUNCHUK_TILT_RIGHT, NUNCHUK_TILT_MODIFIER, NUNCHUK_STICK_DOWN,
NUNCHUK_SHAKE_X, NUNCHUK_SHAKE_Y, NUNCHUK_SHAKE_Z, NUNCHUK_STICK_LEFT,
NUNCHUK_STICK_RIGHT,
NUNCHUK_SWING_UP,
NUNCHUK_SWING_DOWN,
NUNCHUK_SWING_LEFT,
NUNCHUK_SWING_RIGHT,
NUNCHUK_SWING_FORWARD,
NUNCHUK_SWING_BACKWARD,
NUNCHUK_TILT_FORWARD,
NUNCHUK_TILT_BACKWARD,
NUNCHUK_TILT_LEFT,
NUNCHUK_TILT_RIGHT,
NUNCHUK_TILT_MODIFIER,
NUNCHUK_SHAKE_X,
NUNCHUK_SHAKE_Y,
NUNCHUK_SHAKE_Z,
// Classic // Classic
CLASSIC_BUTTON_A, CLASSIC_BUTTON_B, CLASSIC_BUTTON_X, CLASSIC_BUTTON_Y, CLASSIC_BUTTON_MINUS, CLASSIC_BUTTON_A,
CLASSIC_BUTTON_PLUS, CLASSIC_BUTTON_HOME, CLASSIC_BUTTON_ZL, CLASSIC_BUTTON_ZR, CLASSIC_DPAD_UP, CLASSIC_BUTTON_B,
CLASSIC_DPAD_DOWN, CLASSIC_DPAD_LEFT, CLASSIC_DPAD_RIGHT, CLASSIC_STICK_LEFT_UP, CLASSIC_BUTTON_X,
CLASSIC_STICK_LEFT_DOWN, CLASSIC_STICK_LEFT_LEFT, CLASSIC_STICK_LEFT_RIGHT, CLASSIC_BUTTON_Y,
CLASSIC_STICK_RIGHT_UP, CLASSIC_STICK_RIGHT_DOWN, CLASSIC_STICK_RIGHT_LEFT, CLASSIC_BUTTON_MINUS,
CLASSIC_STICK_RIGHT_RIGHT, CLASSIC_TRIGGER_L, CLASSIC_TRIGGER_R, CLASSIC_BUTTON_PLUS,
CLASSIC_BUTTON_HOME,
CLASSIC_BUTTON_ZL,
CLASSIC_BUTTON_ZR,
CLASSIC_DPAD_UP,
CLASSIC_DPAD_DOWN,
CLASSIC_DPAD_LEFT,
CLASSIC_DPAD_RIGHT,
CLASSIC_STICK_LEFT_UP,
CLASSIC_STICK_LEFT_DOWN,
CLASSIC_STICK_LEFT_LEFT,
CLASSIC_STICK_LEFT_RIGHT,
CLASSIC_STICK_RIGHT_UP,
CLASSIC_STICK_RIGHT_DOWN,
CLASSIC_STICK_RIGHT_LEFT,
CLASSIC_STICK_RIGHT_RIGHT,
CLASSIC_TRIGGER_L,
CLASSIC_TRIGGER_R,
// Guitar // Guitar
GUITAR_BUTTON_MINUS, GUITAR_BUTTON_PLUS, GUITAR_FRET_GREEN, GUITAR_FRET_RED, GUITAR_FRET_YELLOW, GUITAR_BUTTON_MINUS,
GUITAR_FRET_BLUE, GUITAR_FRET_ORANGE, GUITAR_STRUM_UP, GUITAR_STRUM_DOWN, GUITAR_STICK_UP, GUITAR_BUTTON_PLUS,
GUITAR_STICK_DOWN, GUITAR_STICK_LEFT, GUITAR_STICK_RIGHT, GUITAR_WHAMMY_BAR, GUITAR_FRET_GREEN,
GUITAR_FRET_RED,
GUITAR_FRET_YELLOW,
GUITAR_FRET_BLUE,
GUITAR_FRET_ORANGE,
GUITAR_STRUM_UP,
GUITAR_STRUM_DOWN,
GUITAR_STICK_UP,
GUITAR_STICK_DOWN,
GUITAR_STICK_LEFT,
GUITAR_STICK_RIGHT,
GUITAR_WHAMMY_BAR,
// Drums // Drums
DRUMS_BUTTON_MINUS, DRUMS_BUTTON_PLUS, DRUMS_PAD_RED, DRUMS_PAD_YELLOW, DRUMS_PAD_BLUE, DRUMS_BUTTON_MINUS,
DRUMS_PAD_GREEN, DRUMS_PAD_ORANGE, DRUMS_PAD_BASS, DRUMS_STICK_UP, DRUMS_STICK_DOWN, DRUMS_BUTTON_PLUS,
DRUMS_STICK_LEFT, DRUMS_STICK_RIGHT, DRUMS_PAD_RED,
DRUMS_PAD_YELLOW,
DRUMS_PAD_BLUE,
DRUMS_PAD_GREEN,
DRUMS_PAD_ORANGE,
DRUMS_PAD_BASS,
DRUMS_STICK_UP,
DRUMS_STICK_DOWN,
DRUMS_STICK_LEFT,
DRUMS_STICK_RIGHT,
// Turntable // Turntable
TURNTABLE_BUTTON_GREEN_LEFT, TURNTABLE_BUTTON_RED_LEFT, TURNTABLE_BUTTON_BLUE_LEFT, TURNTABLE_BUTTON_GREEN_LEFT,
TURNTABLE_BUTTON_GREEN_RIGHT, TURNTABLE_BUTTON_RED_RIGHT, TURNTABLE_BUTTON_BLUE_RIGHT, TURNTABLE_BUTTON_RED_LEFT,
TURNTABLE_BUTTON_MINUS, TURNTABLE_BUTTON_PLUS, TURNTABLE_BUTTON_HOME, TURNTABLE_BUTTON_EUPHORIA, TURNTABLE_BUTTON_BLUE_LEFT,
TURNTABLE_TABLE_LEFT_LEFT, TURNTABLE_TABLE_LEFT_RIGHT, TURNTABLE_TABLE_RIGHT_LEFT, TURNTABLE_BUTTON_GREEN_RIGHT,
TURNTABLE_TABLE_RIGHT_RIGHT, TURNTABLE_STICK_UP, TURNTABLE_STICK_DOWN, TURNTABLE_STICK_LEFT, TURNTABLE_BUTTON_RED_RIGHT,
TURNTABLE_STICK_RIGHT, TURNTABLE_EFFECT_DIAL, TURNTABLE_CROSSFADE_LEFT, TURNTABLE_BUTTON_BLUE_RIGHT,
TURNTABLE_BUTTON_MINUS,
TURNTABLE_BUTTON_PLUS,
TURNTABLE_BUTTON_HOME,
TURNTABLE_BUTTON_EUPHORIA,
TURNTABLE_TABLE_LEFT_LEFT,
TURNTABLE_TABLE_LEFT_RIGHT,
TURNTABLE_TABLE_RIGHT_LEFT,
TURNTABLE_TABLE_RIGHT_RIGHT,
TURNTABLE_STICK_UP,
TURNTABLE_STICK_DOWN,
TURNTABLE_STICK_LEFT,
TURNTABLE_STICK_RIGHT,
TURNTABLE_EFFECT_DIAL,
TURNTABLE_CROSSFADE_LEFT,
TURNTABLE_CROSSFADE_RIGHT, TURNTABLE_CROSSFADE_RIGHT,
// Rumble
RUMBLE,
}; };
static void AddBind(const std::string& dev, sBind* bind) static void AddBind(const std::string& dev, sBind* bind)
@ -367,6 +593,7 @@ void Init()
} }
} }
} }
bool GetButtonPressed(int padID, ButtonType button) bool GetButtonPressed(int padID, ButtonType button)
{ {
bool pressed = m_controllers[touchScreenKey]->ButtonValue(padID, button); bool pressed = m_controllers[touchScreenKey]->ButtonValue(padID, button);
@ -376,6 +603,7 @@ bool GetButtonPressed(int padID, ButtonType button)
return pressed; return pressed;
} }
float GetAxisValue(int padID, ButtonType axis) float GetAxisValue(int padID, ButtonType axis)
{ {
float value = m_controllers[touchScreenKey]->AxisValue(padID, axis); float value = m_controllers[touchScreenKey]->AxisValue(padID, axis);
@ -390,6 +618,7 @@ float GetAxisValue(int padID, ButtonType axis)
} }
return value; return value;
} }
bool GamepadEvent(const std::string& dev, int button, int action) bool GamepadEvent(const std::string& dev, int button, int action)
{ {
auto it = m_controllers.find(dev); auto it = m_controllers.find(dev);
@ -397,12 +626,14 @@ bool GamepadEvent(const std::string& dev, int button, int action)
return it->second->PressEvent(button, action); return it->second->PressEvent(button, action);
return false; return false;
} }
void GamepadAxisEvent(const std::string& dev, int axis, float value) void GamepadAxisEvent(const std::string& dev, int axis, float value)
{ {
auto it = m_controllers.find(dev); auto it = m_controllers.find(dev);
if (it != m_controllers.end()) if (it != m_controllers.end())
it->second->AxisEvent(axis, value); it->second->AxisEvent(axis, value);
} }
void Shutdown() void Shutdown()
{ {
for (const auto& controller : m_controllers) for (const auto& controller : m_controllers)
@ -427,6 +658,7 @@ bool InputDevice::PressEvent(int button, int action)
} }
return handled; return handled;
} }
void InputDevice::AxisEvent(int axis, float value) void InputDevice::AxisEvent(int axis, float value)
{ {
for (const auto& binding : _inputbinds) for (const auto& binding : _inputbinds)
@ -440,6 +672,7 @@ void InputDevice::AxisEvent(int axis, float value)
} }
} }
} }
bool InputDevice::ButtonValue(int padID, ButtonType button) bool InputDevice::ButtonValue(int padID, ButtonType button)
{ {
const auto& binding = _inputbinds.find(std::make_pair(padID, button)); const auto& binding = _inputbinds.find(std::make_pair(padID, button));
@ -451,6 +684,7 @@ bool InputDevice::ButtonValue(int padID, ButtonType button)
else else
return (_axises[binding->second->_buttontype] * binding->second->_neg) > 0.5f; return (_axises[binding->second->_buttontype] * binding->second->_neg) > 0.5f;
} }
float InputDevice::AxisValue(int padID, ButtonType axis) float InputDevice::AxisValue(int padID, ButtonType axis)
{ {
const auto& binding = _inputbinds.find(std::make_pair(padID, axis)); const auto& binding = _inputbinds.find(std::make_pair(padID, axis));

View File

@ -176,6 +176,8 @@ enum ButtonType
TURNTABLE_CROSSFADE = 622, // To Be Used on Java Side TURNTABLE_CROSSFADE = 622, // To Be Used on Java Side
TURNTABLE_CROSSFADE_LEFT = 623, TURNTABLE_CROSSFADE_LEFT = 623,
TURNTABLE_CROSSFADE_RIGHT = 624, TURNTABLE_CROSSFADE_RIGHT = 624,
// Rumble
RUMBLE = 700,
}; };
enum ButtonState enum ButtonState
{ {

View File

@ -3,7 +3,9 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "InputCommon/ControllerInterface/Android/Android.h" #include "InputCommon/ControllerInterface/Android/Android.h"
#include <jni/AndroidCommon/IDCache.h>
#include <sstream> #include <sstream>
#include <thread>
#include "InputCommon/ControllerInterface/ControllerInterface.h" #include "InputCommon/ControllerInterface/ControllerInterface.h"
namespace ciface namespace ciface
@ -190,6 +192,8 @@ Touchscreen::Touchscreen(int padID) : _padID(padID)
new Axis(_padID, ButtonManager::TURNTABLE_CROSSFADE_RIGHT)); new Axis(_padID, ButtonManager::TURNTABLE_CROSSFADE_RIGHT));
AddAnalogInputs(new Axis(_padID, ButtonManager::TURNTABLE_EFFECT_DIAL), AddAnalogInputs(new Axis(_padID, ButtonManager::TURNTABLE_EFFECT_DIAL),
new Axis(_padID, ButtonManager::TURNTABLE_EFFECT_DIAL)); new Axis(_padID, ButtonManager::TURNTABLE_EFFECT_DIAL));
// Rumble
AddOutput(new Motor(_padID, ButtonManager::RUMBLE));
} }
// Buttons and stuff // Buttons and stuff
@ -215,5 +219,34 @@ ControlState Touchscreen::Axis::GetState() const
{ {
return ButtonManager::GetAxisValue(_padID, _index) * _neg; return ButtonManager::GetAxisValue(_padID, _index) * _neg;
} }
Touchscreen::Motor::~Motor()
{
}
std::string Touchscreen::Motor::GetName() const
{
std::ostringstream ss;
ss << "Rumble " << (int)_index;
return ss.str();
}
void Touchscreen::Motor::SetState(ControlState state)
{
if (state > 0)
{
std::thread(Rumble, _padID, state).detach();
}
}
void Touchscreen::Motor::Rumble(int padID, double state)
{
JNIEnv* env;
IDCache::GetJavaVM()->AttachCurrentThread(&env, nullptr);
jmethodID rumbleMethod =
env->GetStaticMethodID(IDCache::GetNativeLibraryClass(), "rumble", "(ID)V");
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), rumbleMethod, padID, state);
IDCache::GetJavaVM()->DetachCurrentThread();
}
} }
} }

View File

@ -41,6 +41,19 @@ private:
const ButtonManager::ButtonType _index; const ButtonManager::ButtonType _index;
const float _neg; const float _neg;
}; };
class Motor : public Core::Device::Output
{
public:
Motor(int padID, ButtonManager::ButtonType index) : _padID(padID), _index(index) {}
~Motor();
std::string GetName() const override;
void SetState(ControlState state) override;
private:
const int _padID;
const ButtonManager::ButtonType _index;
static void Rumble(int padID, double state);
};
public: public:
Touchscreen(int padID); Touchscreen(int padID);