mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-04 00:35:47 +00:00
Add controller arrival metadata support
This commit is contained in:
parent
8f5416ff31
commit
a2e628f3f8
@ -41,6 +41,7 @@ import com.limelight.utils.Vector2d;
|
|||||||
import org.cgutman.shieldcontrollerextensions.SceManager;
|
import org.cgutman.shieldcontrollerextensions.SceManager;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class ControllerHandler implements InputManager.InputDeviceListener, UsbDriverListener {
|
public class ControllerHandler implements InputManager.InputDeviceListener, UsbDriverListener {
|
||||||
|
|
||||||
@ -55,6 +56,28 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
|
|
||||||
private static final short MAX_GAMEPADS = 16; // Limited by bits in activeGamepadMask
|
private static final short MAX_GAMEPADS = 16; // Limited by bits in activeGamepadMask
|
||||||
|
|
||||||
|
private static final Map<Integer, Integer> ANDROID_TO_LI_BUTTON_MAP = Map.ofEntries(
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_A, ControllerPacket.A_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_B, ControllerPacket.B_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_X, ControllerPacket.X_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_Y, ControllerPacket.Y_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_DPAD_UP, ControllerPacket.UP_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_DPAD_DOWN, ControllerPacket.DOWN_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_DPAD_LEFT, ControllerPacket.LEFT_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_DPAD_RIGHT, ControllerPacket.RIGHT_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_L1, ControllerPacket.LB_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_R1, ControllerPacket.RB_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_THUMBL, ControllerPacket.LS_CLK_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_THUMBR, ControllerPacket.RS_CLK_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_START, ControllerPacket.PLAY_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_MENU, ControllerPacket.PLAY_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_SELECT, ControllerPacket.BACK_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BACK, ControllerPacket.BACK_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_BUTTON_MODE, ControllerPacket.SPECIAL_BUTTON_FLAG),
|
||||||
|
Map.entry(KeyEvent.KEYCODE_MEDIA_RECORD, ControllerPacket.MISC_FLAG)
|
||||||
|
// FIXME: Paddles?
|
||||||
|
);
|
||||||
|
|
||||||
private final Vector2d inputVector = new Vector2d();
|
private final Vector2d inputVector = new Vector2d();
|
||||||
|
|
||||||
private final SparseArray<InputDeviceContext> inputDeviceContexts = new SparseArray<>();
|
private final SparseArray<InputDeviceContext> inputDeviceContexts = new SparseArray<>();
|
||||||
@ -386,6 +409,9 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
|
|
||||||
LimeLog.info("Assigned as controller "+context.controllerNumber);
|
LimeLog.info("Assigned as controller "+context.controllerNumber);
|
||||||
context.assignedControllerNumber = true;
|
context.assignedControllerNumber = true;
|
||||||
|
|
||||||
|
// Report attributes of this new controller to the host
|
||||||
|
context.sendControllerArrival();
|
||||||
}
|
}
|
||||||
|
|
||||||
private UsbDeviceContext createUsbDeviceContextForDevice(AbstractController device) {
|
private UsbDeviceContext createUsbDeviceContextForDevice(AbstractController device) {
|
||||||
@ -2183,6 +2209,8 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
mouseEmulationActive = false;
|
mouseEmulationActive = false;
|
||||||
handler.removeCallbacks(mouseEmulationRunnable);
|
handler.removeCallbacks(mouseEmulationRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendControllerArrival() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class InputDeviceContext extends GenericControllerContext {
|
class InputDeviceContext extends GenericControllerContext {
|
||||||
@ -2262,6 +2290,80 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendControllerArrival() {
|
||||||
|
// Below KitKat we can't get enough information to report controller details accurately
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte type = MoonBridge.LI_CTYPE_UNKNOWN;
|
||||||
|
switch (inputDevice.getVendorId()) {
|
||||||
|
case 0x045e: // Microsoft
|
||||||
|
type = MoonBridge.LI_CTYPE_XBOX;
|
||||||
|
break;
|
||||||
|
case 0x054c: // Sony
|
||||||
|
type = MoonBridge.LI_CTYPE_PS;
|
||||||
|
break;
|
||||||
|
case 0x057e: // Nintendo
|
||||||
|
type = MoonBridge.LI_CTYPE_NINTENDO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int supportedButtonFlags = 0;
|
||||||
|
for (Map.Entry<Integer, Integer> entry : ANDROID_TO_LI_BUTTON_MAP.entrySet()) {
|
||||||
|
if (inputDevice.hasKeys(entry.getKey())[0]) {
|
||||||
|
supportedButtonFlags |= entry.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_HAT_X) != null) {
|
||||||
|
supportedButtonFlags |= ControllerPacket.LEFT_FLAG | ControllerPacket.RIGHT_FLAG;
|
||||||
|
}
|
||||||
|
if (getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_HAT_Y) != null) {
|
||||||
|
supportedButtonFlags |= ControllerPacket.UP_FLAG | ControllerPacket.DOWN_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
short capabilities = 0;
|
||||||
|
if (getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_LTRIGGER) != null ||
|
||||||
|
getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_RTRIGGER) != null ||
|
||||||
|
getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_BRAKE) != null ||
|
||||||
|
getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_GAS) != null ||
|
||||||
|
getMotionRangeForJoystickAxis(inputDevice, MotionEvent.AXIS_THROTTLE) != null) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_ANALOG_TRIGGERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
if (hasQuadAmplitudeControlledRumbleVibrators(inputDevice.getVibratorManager())) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_RUMBLE | MoonBridge.LI_CCAP_TRIGGER_RUMBLE;
|
||||||
|
}
|
||||||
|
else if (hasDualAmplitudeControlledRumbleVibrators(inputDevice.getVibratorManager())) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_RUMBLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputDevice.getSensorManager().getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_ACCEL;
|
||||||
|
}
|
||||||
|
if (inputDevice.getSensorManager().getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_GYRO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputDevice.getVibrator().hasVibrator()) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_RUMBLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((inputDevice.getSources() & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) {
|
||||||
|
capabilities |= MoonBridge.LI_CCAP_TOUCHPAD;
|
||||||
|
|
||||||
|
// FIXME: Can we actually tell a clickpad from a touchpad using Android APIs?
|
||||||
|
supportedButtonFlags |= ControllerPacket.TOUCHPAD_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.sendControllerArrivalEvent((byte)controllerNumber, getActiveControllerMask(),
|
||||||
|
type, supportedButtonFlags, capabilities);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class UsbDeviceContext extends GenericControllerContext {
|
class UsbDeviceContext extends GenericControllerContext {
|
||||||
@ -2273,5 +2375,11 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
|
|
||||||
// Nothing for now
|
// Nothing for now
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendControllerArrival() {
|
||||||
|
conn.sendControllerArrivalEvent((byte)controllerNumber, getActiveControllerMask(),
|
||||||
|
device.getType(), device.getSupportedButtonFlags(), device.getCapabilities());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user