Support other switch controller types (#487)
* Make controllers modular, support changing controller type * return readable events * signal hid events * fix style
This commit is contained in:
parent
0c36835f6d
commit
dc02ac08ca
24 changed files with 574 additions and 409 deletions
86
Ryujinx.HLE/Input/HidNpadController.cs
Normal file
86
Ryujinx.HLE/Input/HidNpadController.cs
Normal file
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue