aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/Input/HidNpadController.cs
diff options
context:
space:
mode:
authoremmauss <emmausssss@gmail.com>2018-11-20 02:01:36 +0200
committerAc_K <Acoustik666@gmail.com>2018-11-20 01:01:36 +0100
commitdc02ac08caa84456e8b280a3347ac8907b5249ff (patch)
treeef71cf05cba18da65c930328f955352f4859e67f /Ryujinx.HLE/Input/HidNpadController.cs
parent0c36835f6de563cd6b4a4c82cac25fbcfb0a6231 (diff)
Support other switch controller types (#487)
* Make controllers modular, support changing controller type * return readable events * signal hid events * fix style
Diffstat (limited to 'Ryujinx.HLE/Input/HidNpadController.cs')
-rw-r--r--Ryujinx.HLE/Input/HidNpadController.cs86
1 files changed, 86 insertions, 0 deletions
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));
+ }
+ }
+}