aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/Hid/HidController.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core/Hid/HidController.cs')
-rw-r--r--Ryujinx.Core/Hid/HidController.cs188
1 files changed, 188 insertions, 0 deletions
diff --git a/Ryujinx.Core/Hid/HidController.cs b/Ryujinx.Core/Hid/HidController.cs
new file mode 100644
index 00000000..641bc556
--- /dev/null
+++ b/Ryujinx.Core/Hid/HidController.cs
@@ -0,0 +1,188 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Core
+{
+ [Flags]
+ public enum HidControllerKeys
+ {
+ KEY_A = (1 << 0),
+ KEY_B = (1 << 1),
+ KEY_X = (1 << 2),
+ KEY_Y = (1 << 3),
+ KEY_LSTICK = (1 << 4),
+ KEY_RSTICK = (1 << 5),
+ KEY_L = (1 << 6),
+ KEY_R = (1 << 7),
+ KEY_ZL = (1 << 8),
+ KEY_ZR = (1 << 9),
+ KEY_PLUS = (1 << 10),
+ KEY_MINUS = (1 << 11),
+ KEY_DLEFT = (1 << 12),
+ KEY_DUP = (1 << 13),
+ KEY_DRIGHT = (1 << 14),
+ KEY_DDOWN = (1 << 15),
+ KEY_LSTICK_LEFT = (1 << 16),
+ KEY_LSTICK_UP = (1 << 17),
+ KEY_LSTICK_RIGHT = (1 << 18),
+ KEY_LSTICK_DOWN = (1 << 19),
+ KEY_RSTICK_LEFT = (1 << 20),
+ KEY_RSTICK_UP = (1 << 21),
+ KEY_RSTICK_RIGHT = (1 << 22),
+ KEY_RSTICK_DOWN = (1 << 23),
+ KEY_SL = (1 << 24),
+ KEY_SR = (1 << 25),
+
+ // Pseudo-key for at least one finger on the touch screen
+ KEY_TOUCH = (1 << 26),
+
+ // Buttons by orientation (for single Joy-Con), also works with Joy-Con pairs, Pro Controller
+ KEY_JOYCON_RIGHT = (1 << 0),
+ KEY_JOYCON_DOWN = (1 << 1),
+ KEY_JOYCON_UP = (1 << 2),
+ KEY_JOYCON_LEFT = (1 << 3),
+
+ // Generic catch-all directions, also works for single Joy-Con
+ KEY_UP = KEY_DUP | KEY_LSTICK_UP | KEY_RSTICK_UP,
+ KEY_DOWN = KEY_DDOWN | KEY_LSTICK_DOWN | KEY_RSTICK_DOWN,
+ KEY_LEFT = KEY_DLEFT | KEY_LSTICK_LEFT | KEY_RSTICK_LEFT,
+ KEY_RIGHT = KEY_DRIGHT | KEY_LSTICK_RIGHT | KEY_RSTICK_RIGHT,
+ }
+
+ public enum HidControllerID
+ {
+ CONTROLLER_PLAYER_1 = 0,
+ CONTROLLER_PLAYER_2 = 1,
+ CONTROLLER_PLAYER_3 = 2,
+ CONTROLLER_PLAYER_4 = 3,
+ CONTROLLER_PLAYER_5 = 4,
+ CONTROLLER_PLAYER_6 = 5,
+ CONTROLLER_PLAYER_7 = 6,
+ CONTROLLER_PLAYER_8 = 7,
+ CONTROLLER_HANDHELD = 8,
+ CONTROLLER_UNKNOWN = 9
+ }
+
+ public enum HidControllerJoystick
+ {
+ Joystick_Left = 0,
+ Joystick_Right = 1,
+ Joystick_Num_Sticks = 2
+ }
+
+ public enum HidControllerLayouts
+ {
+ Pro_Controller,
+ Handheld_Joined,
+ Joined,
+ Left,
+ Right,
+ Main_No_Analog,
+ Main
+ }
+
+ [Flags]
+ public enum HidControllerConnectionState
+ {
+ Controller_State_Connected = (1 << 0),
+ Controller_State_Wired = (1 << 1)
+ }
+
+ [Flags]
+ public enum HidControllerType
+ {
+ ControllerType_ProController = (1 << 0),
+ ControllerType_Handheld = (1 << 1),
+ ControllerType_JoyconPair = (1 << 2),
+ ControllerType_JoyconLeft = (1 << 3),
+ ControllerType_JoyconRight = (1 << 4)
+ }
+
+ public enum HidControllerColorDescription
+ {
+ ColorDesc_ColorsNonexistent = (1 << 1),
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x8)]
+ public struct JoystickPosition
+ {
+ public int DX;
+ public int DY;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x20)]
+ public struct HidControllerMAC
+ {
+ public ulong Timestamp;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
+ public byte[] MAC;
+ public ulong Unknown;
+ public ulong Timestamp_2;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x28)]
+ public struct HidControllerHeader
+ {
+ public uint Type;
+ public uint IsHalf;
+ public uint SingleColorsDescriptor;
+ public uint SingleColorBody;
+ public uint SingleColorButtons;
+ public uint SplitColorsDescriptor;
+ public uint LeftColorBody;
+ public uint LeftColorButtons;
+ public uint RightColorBody;
+ public uint RightColorButtons;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x20)]
+ public struct HidControllerLayoutHeader
+ {
+ public ulong TimestampTicks;
+ public ulong NumEntries;
+ public ulong LatestEntry;
+ public ulong MaxEntryIndex;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x30)]
+ public struct HidControllerInputEntry
+ {
+ public ulong Timestamp;
+ public ulong Timestamp_2;
+ public ulong Buttons;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)HidControllerJoystick.Joystick_Num_Sticks)]
+ public JoystickPosition[] Joysticks;
+ public ulong ConnectionState;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x350)]
+ public struct HidControllerLayout
+ {
+ public HidControllerLayoutHeader Header;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
+ public HidControllerInputEntry[] Entries;
+ }
+
+ [StructLayout(LayoutKind.Sequential, Size = 0x5000)]
+ public struct HidController
+ {
+ public HidControllerHeader Header;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
+ public HidControllerLayout[] Layouts;
+ /*
+ pro_controller
+ handheld_joined
+ joined
+ left
+ right
+ main_no_analog
+ main
+ */
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x2A70)]
+ public byte[] Unknown_1;
+ public HidControllerMAC MacLeft;
+ public HidControllerMAC MacRight;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0xDF8)]
+ public byte[] Unknown_2;
+ }
+}