HidController.cs 5.5 KB

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