npad.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <array>
  6. #include "common/bit_field.h"
  7. #include "common/common_types.h"
  8. #include "core/frontend/input.h"
  9. #include "core/hle/kernel/object.h"
  10. #include "core/hle/kernel/writable_event.h"
  11. #include "core/hle/service/hid/controllers/controller_base.h"
  12. #include "core/settings.h"
  13. namespace Service::HID {
  14. constexpr u32 NPAD_HANDHELD = 32;
  15. constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this?
  16. class Controller_NPad final : public ControllerBase {
  17. public:
  18. explicit Controller_NPad(Core::System& system);
  19. ~Controller_NPad() override;
  20. // Called when the controller is initialized
  21. void OnInit() override;
  22. // When the controller is released
  23. void OnRelease() override;
  24. // When the controller is requesting an update for the shared memory
  25. void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
  26. // Called when input devices should be loaded
  27. void OnLoadInputDevices() override;
  28. struct NPadType {
  29. union {
  30. u32_le raw{};
  31. BitField<0, 1, u32> pro_controller;
  32. BitField<1, 1, u32> handheld;
  33. BitField<2, 1, u32> joycon_dual;
  34. BitField<3, 1, u32> joycon_left;
  35. BitField<4, 1, u32> joycon_right;
  36. BitField<6, 1, u32> pokeball; // TODO(ogniK): Confirm when possible
  37. };
  38. };
  39. static_assert(sizeof(NPadType) == 4, "NPadType is an invalid size");
  40. struct Vibration {
  41. f32 amp_low;
  42. f32 freq_low;
  43. f32 amp_high;
  44. f32 freq_high;
  45. };
  46. static_assert(sizeof(Vibration) == 0x10, "Vibration is an invalid size");
  47. enum class GyroscopeZeroDriftMode : u32 {
  48. Loose = 0,
  49. Standard = 1,
  50. Tight = 2,
  51. };
  52. enum class NpadHoldType : u64 {
  53. Vertical = 0,
  54. Horizontal = 1,
  55. };
  56. enum class NPadAssignments : u32_le {
  57. Dual = 0,
  58. Single = 1,
  59. };
  60. enum class NPadControllerType {
  61. None,
  62. ProController,
  63. Handheld,
  64. JoyDual,
  65. JoyLeft,
  66. JoyRight,
  67. Pokeball,
  68. };
  69. struct LedPattern {
  70. explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) {
  71. position1.Assign(light1);
  72. position2.Assign(light2);
  73. position3.Assign(light3);
  74. position4.Assign(light4);
  75. }
  76. union {
  77. u64 raw{};
  78. BitField<0, 1, u64> position1;
  79. BitField<1, 1, u64> position2;
  80. BitField<2, 1, u64> position3;
  81. BitField<3, 1, u64> position4;
  82. };
  83. };
  84. void SetSupportedStyleSet(NPadType style_set);
  85. NPadType GetSupportedStyleSet() const;
  86. void SetSupportedNPadIdTypes(u8* data, std::size_t length);
  87. void GetSupportedNpadIdTypes(u32* data, std::size_t max_length);
  88. std::size_t GetSupportedNPadIdTypesSize() const;
  89. void SetHoldType(NpadHoldType joy_hold_type);
  90. NpadHoldType GetHoldType() const;
  91. void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode);
  92. void VibrateController(const std::vector<u32>& controller_ids,
  93. const std::vector<Vibration>& vibrations);
  94. Vibration GetLastVibration() const;
  95. std::shared_ptr<Kernel::ReadableEvent> GetStyleSetChangedEvent(u32 npad_id) const;
  96. void SignalStyleSetChangedEvent(u32 npad_id) const;
  97. // Adds a new controller at an index.
  98. void AddNewControllerAt(NPadControllerType controller, std::size_t npad_index);
  99. // Adds a new controller at an index with connection status.
  100. void UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, bool connected);
  101. void DisconnectNPad(u32 npad_id);
  102. void DisconnectNPadAtIndex(std::size_t index);
  103. void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode);
  104. GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const;
  105. LedPattern GetLedPattern(u32 npad_id);
  106. void SetVibrationEnabled(bool can_vibrate);
  107. bool IsVibrationEnabled() const;
  108. void ClearAllConnectedControllers();
  109. void DisconnectAllConnectedControllers();
  110. void ConnectAllDisconnectedControllers();
  111. void ClearAllControllers();
  112. void StartLRAssignmentMode();
  113. void StopLRAssignmentMode();
  114. bool SwapNpadAssignment(u32 npad_id_1, u32 npad_id_2);
  115. // Logical OR for all buttons presses on all controllers
  116. // Specifically for cheat engine and other features.
  117. u32 GetAndResetPressState();
  118. static Controller_NPad::NPadControllerType MapSettingsTypeToNPad(Settings::ControllerType type);
  119. static Settings::ControllerType MapNPadToSettingsType(Controller_NPad::NPadControllerType type);
  120. static std::size_t NPadIdToIndex(u32 npad_id);
  121. static u32 IndexToNPad(std::size_t index);
  122. private:
  123. struct CommonHeader {
  124. s64_le timestamp;
  125. s64_le total_entry_count;
  126. s64_le last_entry_index;
  127. s64_le entry_count;
  128. };
  129. static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size");
  130. struct ControllerColor {
  131. u32_le body_color;
  132. u32_le button_color;
  133. };
  134. static_assert(sizeof(ControllerColor) == 8, "ControllerColor is an invalid size");
  135. struct ControllerPadState {
  136. union {
  137. u64_le raw{};
  138. // Button states
  139. BitField<0, 1, u64> a;
  140. BitField<1, 1, u64> b;
  141. BitField<2, 1, u64> x;
  142. BitField<3, 1, u64> y;
  143. BitField<4, 1, u64> l_stick;
  144. BitField<5, 1, u64> r_stick;
  145. BitField<6, 1, u64> l;
  146. BitField<7, 1, u64> r;
  147. BitField<8, 1, u64> zl;
  148. BitField<9, 1, u64> zr;
  149. BitField<10, 1, u64> plus;
  150. BitField<11, 1, u64> minus;
  151. // D-Pad
  152. BitField<12, 1, u64> d_left;
  153. BitField<13, 1, u64> d_up;
  154. BitField<14, 1, u64> d_right;
  155. BitField<15, 1, u64> d_down;
  156. // Left JoyStick
  157. BitField<16, 1, u64> l_stick_left;
  158. BitField<17, 1, u64> l_stick_up;
  159. BitField<18, 1, u64> l_stick_right;
  160. BitField<19, 1, u64> l_stick_down;
  161. // Right JoyStick
  162. BitField<20, 1, u64> r_stick_left;
  163. BitField<21, 1, u64> r_stick_up;
  164. BitField<22, 1, u64> r_stick_right;
  165. BitField<23, 1, u64> r_stick_down;
  166. // Not always active?
  167. BitField<24, 1, u64> left_sl;
  168. BitField<25, 1, u64> left_sr;
  169. BitField<26, 1, u64> right_sl;
  170. BitField<27, 1, u64> right_sr;
  171. };
  172. };
  173. static_assert(sizeof(ControllerPadState) == 8, "ControllerPadState is an invalid size");
  174. struct AnalogPosition {
  175. s32_le x;
  176. s32_le y;
  177. };
  178. static_assert(sizeof(AnalogPosition) == 8, "AnalogPosition is an invalid size");
  179. struct ConnectionState {
  180. union {
  181. u32_le raw{};
  182. BitField<0, 1, u32> IsConnected;
  183. BitField<1, 1, u32> IsWired;
  184. BitField<2, 1, u32> IsLeftJoyConnected;
  185. BitField<3, 1, u32> IsLeftJoyWired;
  186. BitField<4, 1, u32> IsRightJoyConnected;
  187. BitField<5, 1, u32> IsRightJoyWired;
  188. };
  189. };
  190. static_assert(sizeof(ConnectionState) == 4, "ConnectionState is an invalid size");
  191. struct ControllerPad {
  192. ControllerPadState pad_states;
  193. AnalogPosition l_stick;
  194. AnalogPosition r_stick;
  195. };
  196. static_assert(sizeof(ControllerPad) == 0x18, "ControllerPad is an invalid size");
  197. struct GenericStates {
  198. s64_le timestamp;
  199. s64_le timestamp2;
  200. ControllerPad pad;
  201. ConnectionState connection_status;
  202. };
  203. static_assert(sizeof(GenericStates) == 0x30, "NPadGenericStates is an invalid size");
  204. struct NPadGeneric {
  205. CommonHeader common;
  206. std::array<GenericStates, 17> npad;
  207. };
  208. static_assert(sizeof(NPadGeneric) == 0x350, "NPadGeneric is an invalid size");
  209. enum class ColorReadError : u32_le {
  210. ReadOk = 0,
  211. ColorDoesntExist = 1,
  212. NoController = 2,
  213. };
  214. struct NPadProperties {
  215. union {
  216. s64_le raw{};
  217. BitField<11, 1, s64> is_vertical;
  218. BitField<12, 1, s64> is_horizontal;
  219. BitField<13, 1, s64> use_plus;
  220. BitField<14, 1, s64> use_minus;
  221. };
  222. };
  223. struct NPadDevice {
  224. union {
  225. u32_le raw{};
  226. BitField<0, 1, s32> pro_controller;
  227. BitField<1, 1, s32> handheld;
  228. BitField<2, 1, s32> handheld_left;
  229. BitField<3, 1, s32> handheld_right;
  230. BitField<4, 1, s32> joycon_left;
  231. BitField<5, 1, s32> joycon_right;
  232. BitField<6, 1, s32> pokeball;
  233. };
  234. };
  235. struct NPadEntry {
  236. NPadType joy_styles;
  237. NPadAssignments pad_assignment;
  238. ColorReadError single_color_error;
  239. ControllerColor single_color;
  240. ColorReadError dual_color_error;
  241. ControllerColor left_color;
  242. ControllerColor right_color;
  243. NPadGeneric main_controller_states;
  244. NPadGeneric handheld_states;
  245. NPadGeneric dual_states;
  246. NPadGeneric left_joy_states;
  247. NPadGeneric right_joy_states;
  248. NPadGeneric pokeball_states;
  249. NPadGeneric libnx; // TODO(ogniK): Find out what this actually is, libnx seems to only be
  250. // relying on this for the time being
  251. INSERT_PADDING_BYTES(
  252. 0x708 *
  253. 6); // TODO(ogniK): SixAxis states, require more information before implementation
  254. NPadDevice device_type;
  255. NPadProperties properties;
  256. INSERT_PADDING_WORDS(1);
  257. std::array<u32, 3> battery_level;
  258. INSERT_PADDING_BYTES(0x5c);
  259. INSERT_PADDING_BYTES(0xdf8);
  260. };
  261. static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size");
  262. struct ControllerHolder {
  263. NPadControllerType type;
  264. bool is_connected;
  265. };
  266. void InitNewlyAddedController(std::size_t controller_idx);
  267. bool IsControllerSupported(NPadControllerType controller) const;
  268. NPadControllerType DecideBestController(NPadControllerType priority) const;
  269. void RequestPadStateUpdate(u32 npad_id);
  270. u32 press_state{};
  271. NPadType style{};
  272. std::array<NPadEntry, 10> shared_memory_entries{};
  273. std::array<
  274. std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>,
  275. 10>
  276. buttons;
  277. std::array<
  278. std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>,
  279. 10>
  280. sticks;
  281. std::vector<u32> supported_npad_id_types{};
  282. NpadHoldType hold_type{NpadHoldType::Vertical};
  283. // Each controller should have their own styleset changed event
  284. std::array<Kernel::EventPair, 10> styleset_changed_events;
  285. Vibration last_processed_vibration{};
  286. std::array<ControllerHolder, 10> connected_controllers{};
  287. GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};
  288. bool can_controllers_vibrate{true};
  289. std::array<ControllerPad, 10> npad_pad_states{};
  290. bool is_in_lr_assignment_mode{false};
  291. Core::System& system;
  292. };
  293. } // namespace Service::HID