From dc02ac08caa84456e8b280a3347ac8907b5249ff Mon Sep 17 00:00:00 2001 From: emmauss Date: Tue, 20 Nov 2018 02:01:36 +0200 Subject: Support other switch controller types (#487) * Make controllers modular, support changing controller type * return readable events * signal hid events * fix style --- Ryujinx.HLE/Input/HidNpadController.cs | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Ryujinx.HLE/Input/HidNpadController.cs (limited to 'Ryujinx.HLE/Input/HidNpadController.cs') diff --git a/Ryujinx.HLE/Input/HidNpadController.cs b/Ryujinx.HLE/Input/HidNpadController.cs new file mode 100644 index 00000000..7b3fa64c --- /dev/null +++ b/Ryujinx.HLE/Input/HidNpadController.cs @@ -0,0 +1,86 @@ +namespace Ryujinx.HLE.Input +{ + public class HidNpadController : HidControllerBase + { + private (NpadColor Left, NpadColor Right) NpadBodyColors; + private (NpadColor Left, NpadColor Right) NpadButtonColors; + + private HidControllerLayouts CurrentLayout; + + private bool IsHalf; + + public HidNpadController( + HidControllerType ControllerType, + Switch Device, + (NpadColor, NpadColor) NpadBodyColors, + (NpadColor, NpadColor) NpadButtonColors) : base(ControllerType, Device) + { + this.NpadBodyColors = NpadBodyColors; + this.NpadButtonColors = NpadButtonColors; + + CurrentLayout = HidControllerLayouts.Handheld_Joined; + + switch (ControllerType) + { + case HidControllerType.NpadLeft: + CurrentLayout = HidControllerLayouts.Left; + break; + case HidControllerType.NpadRight: + CurrentLayout = HidControllerLayouts.Right; + break; + case HidControllerType.NpadPair: + CurrentLayout = HidControllerLayouts.Joined; + break; + } + } + + public override void Connect(HidControllerId ControllerId) + { + if(HidControllerType != HidControllerType.NpadLeft && HidControllerType != HidControllerType.NpadRight) + { + IsHalf = false; + } + + base.Connect(CurrentLayout == HidControllerLayouts.Handheld_Joined ? HidControllerId.CONTROLLER_HANDHELD : ControllerId); + + HidControllerColorDesc SingleColorDesc = + HidControllerColorDesc.ColorDesc_ColorsNonexistent; + + HidControllerColorDesc SplitColorDesc = 0; + + NpadColor SingleColorBody = NpadColor.Black; + NpadColor SingleColorButtons = NpadColor.Black; + + Device.Memory.WriteInt32(Offset + 0x04, IsHalf ? 1 : 0); + + if (IsHalf) + { + Device.Memory.WriteInt32(Offset + 0x08, (int)SingleColorDesc); + Device.Memory.WriteInt32(Offset + 0x0c, (int)SingleColorBody); + Device.Memory.WriteInt32(Offset + 0x10, (int)SingleColorButtons); + Device.Memory.WriteInt32(Offset + 0x14, (int)SplitColorDesc); + } + else + { + Device.Memory.WriteInt32(Offset + 0x18, (int)NpadBodyColors.Left); + Device.Memory.WriteInt32(Offset + 0x1c, (int)NpadButtonColors.Left); + Device.Memory.WriteInt32(Offset + 0x20, (int)NpadBodyColors.Right); + Device.Memory.WriteInt32(Offset + 0x24, (int)NpadButtonColors.Right); + } + + Connected = true; + } + + public override void SendInput + (HidControllerButtons Buttons, + HidJoystickPosition LeftStick, + HidJoystickPosition RightStick) + { + long ControllerOffset = WriteInput(Buttons, LeftStick, RightStick, CurrentLayout); + + Device.Memory.WriteInt64(ControllerOffset + 0x28, + (Connected ? (uint)HidControllerConnState.Controller_State_Connected : 0) | + (CurrentLayout == HidControllerLayouts.Handheld_Joined ? (uint)HidControllerConnState.Controller_State_Wired : 0)); + } + } +} -- cgit v1.2.3