HidController.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using System.Runtime.InteropServices;
  2. namespace Ryujinx
  3. {
  4. public enum HidControllerKeys
  5. {
  6. KEY_A = (1 << 0),
  7. KEY_B = (1 << 1),
  8. KEY_X = (1 << 2),
  9. KEY_Y = (1 << 3),
  10. KEY_LSTICK = (1 << 4),
  11. KEY_RSTICK = (1 << 5),
  12. KEY_L = (1 << 6),
  13. KEY_R = (1 << 7),
  14. KEY_ZL = (1 << 8),
  15. KEY_ZR = (1 << 9),
  16. KEY_PLUS = (1 << 10),
  17. KEY_MINUS = (1 << 11),
  18. KEY_DLEFT = (1 << 12),
  19. KEY_DUP = (1 << 13),
  20. KEY_DRIGHT = (1 << 14),
  21. KEY_DDOWN = (1 << 15),
  22. KEY_LSTICK_LEFT = (1 << 16),
  23. KEY_LSTICK_UP = (1 << 17),
  24. KEY_LSTICK_RIGHT = (1 << 18),
  25. KEY_LSTICK_DOWN = (1 << 19),
  26. KEY_RSTICK_LEFT = (1 << 20),
  27. KEY_RSTICK_UP = (1 << 21),
  28. KEY_RSTICK_RIGHT = (1 << 22),
  29. KEY_RSTICK_DOWN = (1 << 23),
  30. KEY_SL = (1 << 24),
  31. KEY_SR = (1 << 25),
  32. // Pseudo-key for at least one finger on the touch screen
  33. KEY_TOUCH = (1 << 26),
  34. // Buttons by orientation (for single Joy-Con), also works with Joy-Con pairs, Pro Controller
  35. KEY_JOYCON_RIGHT = (1 << 0),
  36. KEY_JOYCON_DOWN = (1 << 1),
  37. KEY_JOYCON_UP = (1 << 2),
  38. KEY_JOYCON_LEFT = (1 << 3),
  39. // Generic catch-all directions, also works for single Joy-Con
  40. KEY_UP = KEY_DUP | KEY_LSTICK_UP | KEY_RSTICK_UP,
  41. KEY_DOWN = KEY_DDOWN | KEY_LSTICK_DOWN | KEY_RSTICK_DOWN,
  42. KEY_LEFT = KEY_DLEFT | KEY_LSTICK_LEFT | KEY_RSTICK_LEFT,
  43. KEY_RIGHT = KEY_DRIGHT | KEY_LSTICK_RIGHT | KEY_RSTICK_RIGHT,
  44. }
  45. public enum HidControllerID
  46. {
  47. CONTROLLER_PLAYER_1 = 0,
  48. CONTROLLER_PLAYER_2 = 1,
  49. CONTROLLER_PLAYER_3 = 2,
  50. CONTROLLER_PLAYER_4 = 3,
  51. CONTROLLER_PLAYER_5 = 4,
  52. CONTROLLER_PLAYER_6 = 5,
  53. CONTROLLER_PLAYER_7 = 6,
  54. CONTROLLER_PLAYER_8 = 7,
  55. CONTROLLER_HANDHELD = 8,
  56. CONTROLLER_UNKNOWN = 9
  57. }
  58. public enum HidControllerJoystick
  59. {
  60. Joystick_Left = 0,
  61. Joystick_Right = 1,
  62. Joystick_Num_Sticks = 2
  63. }
  64. public enum HidControllerLayouts
  65. {
  66. Pro_Controller,
  67. Handheld_Joined,
  68. Joined,
  69. Left,
  70. Right,
  71. Main_No_Analog,
  72. Main
  73. }
  74. public enum HidControllerConnectionState
  75. {
  76. Controller_State_Connected = (1 << 0),
  77. Controller_State_Wired = (1 << 1)
  78. }
  79. public enum HidControllerType
  80. {
  81. ControllerType_ProController = (1 << 0),
  82. ControllerType_Handheld = (1 << 1),
  83. ControllerType_JoyconPair = (1 << 2),
  84. ControllerType_JoyconLeft = (1 << 3),
  85. ControllerType_JoyconRight = (1 << 4)
  86. }
  87. public enum HidControllerColorDescription
  88. {
  89. ColorDesc_ColorsNonexistent = (1 << 1),
  90. }
  91. [StructLayout(LayoutKind.Sequential, Size = 0x8)]
  92. public struct JoystickPosition
  93. {
  94. public int DX;
  95. public int DY;
  96. }
  97. [StructLayout(LayoutKind.Sequential, Size = 0x20)]
  98. public struct HidControllerMAC
  99. {
  100. public ulong Timestamp;
  101. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
  102. public byte[] MAC;
  103. public ulong Unknown;
  104. public ulong Timestamp_2;
  105. }
  106. [StructLayout(LayoutKind.Sequential, Size = 0x28)]
  107. public struct HidControllerHeader
  108. {
  109. public uint Type;
  110. public uint IsHalf;
  111. public uint SingleColorsDescriptor;
  112. public uint SingleColorBody;
  113. public uint SingleColorButtons;
  114. public uint SplitColorsDescriptor;
  115. public uint LeftColorBody;
  116. public uint LeftColorButtons;
  117. public uint RightColorBody;
  118. public uint RightColorButtons;
  119. }
  120. [StructLayout(LayoutKind.Sequential, Size = 0x20)]
  121. public struct HidControllerLayoutHeader
  122. {
  123. public ulong TimestampTicks;
  124. public ulong NumEntries;
  125. public ulong LatestEntry;
  126. public ulong MaxEntryIndex;
  127. }
  128. [StructLayout(LayoutKind.Sequential, Size = 0x30)]
  129. public struct HidControllerInputEntry
  130. {
  131. public ulong Timestamp;
  132. public ulong Timestamp_2;
  133. public ulong Buttons;
  134. [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)HidControllerJoystick.Joystick_Num_Sticks)]
  135. public JoystickPosition[] Joysticks;
  136. public ulong ConnectionState;
  137. }
  138. [StructLayout(LayoutKind.Sequential, Size = 0x350)]
  139. public struct HidControllerLayout
  140. {
  141. public HidControllerLayoutHeader Header;
  142. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
  143. public HidControllerInputEntry[] Entries;
  144. }
  145. [StructLayout(LayoutKind.Sequential, Size = 0x5000)]
  146. public struct HidController
  147. {
  148. public HidControllerHeader Header;
  149. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
  150. public HidControllerLayout[] Layouts;
  151. /*
  152. pro_controller
  153. handheld_joined
  154. joined
  155. left
  156. right
  157. main_no_analog
  158. main
  159. */
  160. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x2A70)]
  161. public byte[] Unknown_1;
  162. public HidControllerMAC MacLeft;
  163. public HidControllerMAC MacRight;
  164. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0xDF8)]
  165. public byte[] Unknown_2;
  166. }
  167. }