npad.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  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. // When the controller is requesting a motion update for the shared memory
  27. void OnMotionUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
  28. std::size_t size) override;
  29. // Called when input devices should be loaded
  30. void OnLoadInputDevices() override;
  31. enum class NPadControllerType {
  32. None,
  33. ProController,
  34. Handheld,
  35. JoyDual,
  36. JoyLeft,
  37. JoyRight,
  38. Pokeball,
  39. };
  40. enum class NpadType : u8 {
  41. ProController = 3,
  42. Handheld = 4,
  43. JoyconDual = 5,
  44. JoyconLeft = 6,
  45. JoyconRight = 7,
  46. Pokeball = 9,
  47. };
  48. enum class DeviceIndex : u8 {
  49. Left = 0,
  50. Right = 1,
  51. None = 2,
  52. };
  53. enum class GyroscopeZeroDriftMode : u32 {
  54. Loose = 0,
  55. Standard = 1,
  56. Tight = 2,
  57. };
  58. enum class NpadHoldType : u64 {
  59. Vertical = 0,
  60. Horizontal = 1,
  61. };
  62. enum class NpadAssignments : u32 {
  63. Dual = 0,
  64. Single = 1,
  65. };
  66. enum class NpadHandheldActivationMode : u64 {
  67. Dual = 0,
  68. Single = 1,
  69. None = 2,
  70. };
  71. struct DeviceHandle {
  72. NpadType npad_type{};
  73. u8 npad_id{};
  74. DeviceIndex device_index{};
  75. INSERT_PADDING_BYTES(1);
  76. };
  77. static_assert(sizeof(DeviceHandle) == 4, "DeviceHandle is an invalid size");
  78. struct NpadStyleSet {
  79. union {
  80. u32_le raw{};
  81. BitField<0, 1, u32> pro_controller;
  82. BitField<1, 1, u32> handheld;
  83. BitField<2, 1, u32> joycon_dual;
  84. BitField<3, 1, u32> joycon_left;
  85. BitField<4, 1, u32> joycon_right;
  86. BitField<6, 1, u32> pokeball; // TODO(ogniK): Confirm when possible
  87. };
  88. };
  89. static_assert(sizeof(NpadStyleSet) == 4, "NpadStyleSet is an invalid size");
  90. struct VibrationValue {
  91. f32 amp_low{0.0f};
  92. f32 freq_low{160.0f};
  93. f32 amp_high{0.0f};
  94. f32 freq_high{320.0f};
  95. };
  96. static_assert(sizeof(VibrationValue) == 0x10, "Vibration is an invalid size");
  97. struct LedPattern {
  98. explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) {
  99. position1.Assign(light1);
  100. position2.Assign(light2);
  101. position3.Assign(light3);
  102. position4.Assign(light4);
  103. }
  104. union {
  105. u64 raw{};
  106. BitField<0, 1, u64> position1;
  107. BitField<1, 1, u64> position2;
  108. BitField<2, 1, u64> position3;
  109. BitField<3, 1, u64> position4;
  110. };
  111. };
  112. void SetSupportedStyleSet(NpadStyleSet style_set);
  113. NpadStyleSet GetSupportedStyleSet() const;
  114. void SetSupportedNpadIdTypes(u8* data, std::size_t length);
  115. void GetSupportedNpadIdTypes(u32* data, std::size_t max_length);
  116. std::size_t GetSupportedNpadIdTypesSize() const;
  117. void SetHoldType(NpadHoldType joy_hold_type);
  118. NpadHoldType GetHoldType() const;
  119. void SetNpadHandheldActivationMode(NpadHandheldActivationMode activation_mode);
  120. NpadHandheldActivationMode GetNpadHandheldActivationMode() const;
  121. void SetNpadMode(u32 npad_id, NpadAssignments assignment_mode);
  122. bool VibrateControllerAtIndex(std::size_t npad_index, std::size_t device_index,
  123. const VibrationValue& vibration_value);
  124. void VibrateController(const DeviceHandle& vibration_device_handle,
  125. const VibrationValue& vibration_value);
  126. void VibrateControllers(const std::vector<DeviceHandle>& vibration_device_handles,
  127. const std::vector<VibrationValue>& vibration_values);
  128. VibrationValue GetLastVibration(const DeviceHandle& vibration_device_handle) const;
  129. void InitializeVibrationDevice(const DeviceHandle& vibration_device_handle);
  130. void InitializeVibrationDeviceAtIndex(std::size_t npad_index, std::size_t device_index);
  131. void SetPermitVibrationSession(bool permit_vibration_session);
  132. bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const;
  133. std::shared_ptr<Kernel::ReadableEvent> GetStyleSetChangedEvent(u32 npad_id) const;
  134. void SignalStyleSetChangedEvent(u32 npad_id) const;
  135. // Adds a new controller at an index.
  136. void AddNewControllerAt(NPadControllerType controller, std::size_t npad_index);
  137. // Adds a new controller at an index with connection status.
  138. void UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, bool connected);
  139. void DisconnectNpad(u32 npad_id);
  140. void DisconnectNpadAtIndex(std::size_t index);
  141. void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode);
  142. GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const;
  143. bool IsSixAxisSensorAtRest() const;
  144. void SetSixAxisEnabled(bool six_axis_status);
  145. LedPattern GetLedPattern(u32 npad_id);
  146. bool IsUnintendedHomeButtonInputProtectionEnabled(u32 npad_id) const;
  147. void SetUnintendedHomeButtonInputProtectionEnabled(bool is_protection_enabled, u32 npad_id);
  148. void ClearAllConnectedControllers();
  149. void DisconnectAllConnectedControllers();
  150. void ConnectAllDisconnectedControllers();
  151. void ClearAllControllers();
  152. void MergeSingleJoyAsDualJoy(u32 npad_id_1, u32 npad_id_2);
  153. void StartLRAssignmentMode();
  154. void StopLRAssignmentMode();
  155. bool SwapNpadAssignment(u32 npad_id_1, u32 npad_id_2);
  156. // Logical OR for all buttons presses on all controllers
  157. // Specifically for cheat engine and other features.
  158. u32 GetAndResetPressState();
  159. static Controller_NPad::NPadControllerType MapSettingsTypeToNPad(Settings::ControllerType type);
  160. static Settings::ControllerType MapNPadToSettingsType(Controller_NPad::NPadControllerType type);
  161. static std::size_t NPadIdToIndex(u32 npad_id);
  162. static u32 IndexToNPad(std::size_t index);
  163. private:
  164. struct CommonHeader {
  165. s64_le timestamp;
  166. s64_le total_entry_count;
  167. s64_le last_entry_index;
  168. s64_le entry_count;
  169. };
  170. static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size");
  171. struct ControllerColor {
  172. u32_le body_color;
  173. u32_le button_color;
  174. };
  175. static_assert(sizeof(ControllerColor) == 8, "ControllerColor is an invalid size");
  176. struct ControllerPadState {
  177. union {
  178. u64_le raw{};
  179. // Button states
  180. BitField<0, 1, u64> a;
  181. BitField<1, 1, u64> b;
  182. BitField<2, 1, u64> x;
  183. BitField<3, 1, u64> y;
  184. BitField<4, 1, u64> l_stick;
  185. BitField<5, 1, u64> r_stick;
  186. BitField<6, 1, u64> l;
  187. BitField<7, 1, u64> r;
  188. BitField<8, 1, u64> zl;
  189. BitField<9, 1, u64> zr;
  190. BitField<10, 1, u64> plus;
  191. BitField<11, 1, u64> minus;
  192. // D-Pad
  193. BitField<12, 1, u64> d_left;
  194. BitField<13, 1, u64> d_up;
  195. BitField<14, 1, u64> d_right;
  196. BitField<15, 1, u64> d_down;
  197. // Left JoyStick
  198. BitField<16, 1, u64> l_stick_left;
  199. BitField<17, 1, u64> l_stick_up;
  200. BitField<18, 1, u64> l_stick_right;
  201. BitField<19, 1, u64> l_stick_down;
  202. // Right JoyStick
  203. BitField<20, 1, u64> r_stick_left;
  204. BitField<21, 1, u64> r_stick_up;
  205. BitField<22, 1, u64> r_stick_right;
  206. BitField<23, 1, u64> r_stick_down;
  207. // Not always active?
  208. BitField<24, 1, u64> left_sl;
  209. BitField<25, 1, u64> left_sr;
  210. BitField<26, 1, u64> right_sl;
  211. BitField<27, 1, u64> right_sr;
  212. };
  213. };
  214. static_assert(sizeof(ControllerPadState) == 8, "ControllerPadState is an invalid size");
  215. struct AnalogPosition {
  216. s32_le x;
  217. s32_le y;
  218. };
  219. static_assert(sizeof(AnalogPosition) == 8, "AnalogPosition is an invalid size");
  220. struct ConnectionState {
  221. union {
  222. u32_le raw{};
  223. BitField<0, 1, u32> IsConnected;
  224. BitField<1, 1, u32> IsWired;
  225. BitField<2, 1, u32> IsLeftJoyConnected;
  226. BitField<3, 1, u32> IsLeftJoyWired;
  227. BitField<4, 1, u32> IsRightJoyConnected;
  228. BitField<5, 1, u32> IsRightJoyWired;
  229. };
  230. };
  231. static_assert(sizeof(ConnectionState) == 4, "ConnectionState is an invalid size");
  232. struct ControllerPad {
  233. ControllerPadState pad_states;
  234. AnalogPosition l_stick;
  235. AnalogPosition r_stick;
  236. };
  237. static_assert(sizeof(ControllerPad) == 0x18, "ControllerPad is an invalid size");
  238. struct GenericStates {
  239. s64_le timestamp;
  240. s64_le timestamp2;
  241. ControllerPad pad;
  242. ConnectionState connection_status;
  243. };
  244. static_assert(sizeof(GenericStates) == 0x30, "NPadGenericStates is an invalid size");
  245. struct NPadGeneric {
  246. CommonHeader common;
  247. std::array<GenericStates, 17> npad;
  248. };
  249. static_assert(sizeof(NPadGeneric) == 0x350, "NPadGeneric is an invalid size");
  250. struct SixAxisStates {
  251. s64_le timestamp{};
  252. INSERT_PADDING_WORDS(2);
  253. s64_le timestamp2{};
  254. Common::Vec3f accel{};
  255. Common::Vec3f gyro{};
  256. Common::Vec3f rotation{};
  257. std::array<Common::Vec3f, 3> orientation{};
  258. s64_le always_one{1};
  259. };
  260. static_assert(sizeof(SixAxisStates) == 0x68, "SixAxisStates is an invalid size");
  261. struct SixAxisGeneric {
  262. CommonHeader common{};
  263. std::array<SixAxisStates, 17> sixaxis{};
  264. };
  265. static_assert(sizeof(SixAxisGeneric) == 0x708, "SixAxisGeneric is an invalid size");
  266. enum class ColorReadError : u32_le {
  267. ReadOk = 0,
  268. ColorDoesntExist = 1,
  269. NoController = 2,
  270. };
  271. struct NPadProperties {
  272. union {
  273. s64_le raw{};
  274. BitField<11, 1, s64> is_vertical;
  275. BitField<12, 1, s64> is_horizontal;
  276. BitField<13, 1, s64> use_plus;
  277. BitField<14, 1, s64> use_minus;
  278. };
  279. };
  280. struct NPadDevice {
  281. union {
  282. u32_le raw{};
  283. BitField<0, 1, s32> pro_controller;
  284. BitField<1, 1, s32> handheld;
  285. BitField<2, 1, s32> handheld_left;
  286. BitField<3, 1, s32> handheld_right;
  287. BitField<4, 1, s32> joycon_left;
  288. BitField<5, 1, s32> joycon_right;
  289. BitField<6, 1, s32> pokeball;
  290. };
  291. };
  292. struct MotionDevice {
  293. Common::Vec3f accel;
  294. Common::Vec3f gyro;
  295. Common::Vec3f rotation;
  296. std::array<Common::Vec3f, 3> orientation;
  297. };
  298. struct NPadEntry {
  299. NpadStyleSet joy_styles;
  300. NpadAssignments pad_assignment;
  301. ColorReadError single_color_error;
  302. ControllerColor single_color;
  303. ColorReadError dual_color_error;
  304. ControllerColor left_color;
  305. ControllerColor right_color;
  306. NPadGeneric main_controller_states;
  307. NPadGeneric handheld_states;
  308. NPadGeneric dual_states;
  309. NPadGeneric left_joy_states;
  310. NPadGeneric right_joy_states;
  311. NPadGeneric pokeball_states;
  312. NPadGeneric libnx; // TODO(ogniK): Find out what this actually is, libnx seems to only be
  313. // relying on this for the time being
  314. SixAxisGeneric sixaxis_full;
  315. SixAxisGeneric sixaxis_handheld;
  316. SixAxisGeneric sixaxis_dual_left;
  317. SixAxisGeneric sixaxis_dual_right;
  318. SixAxisGeneric sixaxis_left;
  319. SixAxisGeneric sixaxis_right;
  320. NPadDevice device_type;
  321. NPadProperties properties;
  322. INSERT_PADDING_WORDS(1);
  323. std::array<u32, 3> battery_level;
  324. INSERT_PADDING_BYTES(0x5c);
  325. INSERT_PADDING_BYTES(0xdf8);
  326. };
  327. static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size");
  328. struct ControllerHolder {
  329. NPadControllerType type;
  330. bool is_connected;
  331. };
  332. void InitNewlyAddedController(std::size_t controller_idx);
  333. bool IsControllerSupported(NPadControllerType controller) const;
  334. void RequestPadStateUpdate(u32 npad_id);
  335. u32 press_state{};
  336. NpadStyleSet style{};
  337. std::array<NPadEntry, 10> shared_memory_entries{};
  338. using ButtonArray = std::array<
  339. std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>,
  340. 10>;
  341. using StickArray = std::array<
  342. std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>,
  343. 10>;
  344. using VibrationArray = std::array<std::array<std::unique_ptr<Input::VibrationDevice>,
  345. Settings::NativeVibration::NUM_VIBRATIONS_HID>,
  346. 10>;
  347. using MotionArray = std::array<
  348. std::array<std::unique_ptr<Input::MotionDevice>, Settings::NativeMotion::NUM_MOTIONS_HID>,
  349. 10>;
  350. ButtonArray buttons;
  351. StickArray sticks;
  352. VibrationArray vibrations;
  353. MotionArray motions;
  354. std::vector<u32> supported_npad_id_types{};
  355. NpadHoldType hold_type{NpadHoldType::Vertical};
  356. NpadHandheldActivationMode handheld_activation_mode{NpadHandheldActivationMode::Dual};
  357. // Each controller should have their own styleset changed event
  358. std::array<Kernel::EventPair, 10> styleset_changed_events;
  359. std::array<std::array<std::chrono::steady_clock::time_point, 2>, 10> last_vibration_timepoints;
  360. std::array<std::array<VibrationValue, 2>, 10> latest_vibration_values{};
  361. bool permit_vibration_session_enabled{false};
  362. std::array<std::array<bool, 2>, 10> vibration_devices_mounted{};
  363. std::array<ControllerHolder, 10> connected_controllers{};
  364. std::array<bool, 10> unintended_home_button_input_protection{};
  365. GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};
  366. bool sixaxis_sensors_enabled{true};
  367. bool sixaxis_at_rest{true};
  368. std::array<ControllerPad, 10> npad_pad_states{};
  369. bool is_in_lr_assignment_mode{false};
  370. Core::System& system;
  371. };
  372. } // namespace Service::HID