From 56f35ab2629c3753dbb624799bd8aaff2a179f58 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sat, 6 Oct 2018 00:23:21 +1000 Subject: "Better Hid" rework part 1 --- src/core/hle/service/hid/controllers/npad.h | 249 ++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 src/core/hle/service/hid/controllers/npad.h (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h new file mode 100644 index 000000000..e57b67da4 --- /dev/null +++ b/src/core/hle/service/hid/controllers/npad.h @@ -0,0 +1,249 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once +#include +#include "common/common_types.h" +#include "core/frontend/input.h" +#include "core/hle/service/hid/controllers/controller_base.h" +#include "core/settings.h" + +namespace Service::HID { + +class Controller_NPad final : public ControllerBase { +public: + Controller_NPad() = default; + + // Called when the controller is initialized + void OnInit() override; + + // When the controller is released + void OnRelease() override; + + // When the controller is requesting an update for the shared memory + void OnUpdate(u8* data, size_t size) override; + + // Called when input devices should be loaded + void OnLoadInputDevices() override; + + struct NPadType { + union { + u32_le raw{}; + + BitField<0, 1, u32_le> pro_controller; + BitField<1, 1, u32_le> handheld; + BitField<2, 1, u32_le> joycon_dual; + BitField<3, 1, u32_le> joycon_left; + BitField<4, 1, u32_le> joycon_right; + + BitField<6, 1, u32_le> pokeball; // TODO(ogniK): Confirm when possible + }; + }; + static_assert(sizeof(NPadType) == 4, "NPadType is an invalid size"); + + struct Vibration { + f32 amp_low; + f32 freq_low; + f32 amp_high; + f32 freq_high; + }; + static_assert(sizeof(Vibration) == 0x10, "Vibration is an invalid size"); + + enum class NpadHoldType : u64 { + Vertical = 0, + Horizontal = 1, + }; + + enum class NPadAssignments : u32_le { + Dual = 0, + Single = 1, + }; + + enum class NPadControllerType { + None, + ProController, + Handheld, + JoyLeft, + JoyRight, + Tabletop, + Pokeball + }; + + void SetSupportedStyleSet(NPadType style_set); + NPadType GetSupportedStyleSet() const; + + void SetSupportedNPadIdTypes(u8* data, size_t length); + void GetSupportedNpadIdTypes(u32* data, size_t max_length); + size_t GetSupportedNPadIdTypesSize() const; + + void SetHoldType(NpadHoldType joy_hold_type); + NpadHoldType GetHoldType() const; + + void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode); + + void VibrateController(const std::vector& controller_ids, + const std::vector& vibrations); + + Kernel::SharedPtr GetStyleSetChangedEvent() const; + Vibration GetLastVibration() const; + + void AddNewController(NPadControllerType controller); + +private: + struct CommonHeader { + s64_le timestamp; + s64_le total_entry_count; + s64_le last_entry_index; + s64_le entry_count; + }; + static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size"); + + struct ControllerColor { + u32_le body_color; + u32_le button_color; + }; + static_assert(sizeof(ControllerColor) == 8, "ControllerColor is an invalid size"); + + struct ControllerPadState { + union { + u64_le raw{}; + // Button states + BitField<0, 1, u64_le> a; + BitField<1, 1, u64_le> b; + BitField<2, 1, u64_le> x; + BitField<3, 1, u64_le> y; + BitField<4, 1, u64_le> l_stick; + BitField<5, 1, u64_le> r_stick; + BitField<6, 1, u64_le> l; + BitField<7, 1, u64_le> r; + BitField<8, 1, u64_le> zl; + BitField<9, 1, u64_le> zr; + BitField<10, 1, u64_le> plus; + BitField<11, 1, u64_le> minus; + + // D-Pad + BitField<12, 1, u64_le> dleft; + BitField<13, 1, u64_le> dup; + BitField<14, 1, u64_le> dright; + BitField<15, 1, u64_le> ddown; + + // Left JoyStick + BitField<16, 1, u64_le> lstickleft; + BitField<17, 1, u64_le> lstickup; + BitField<18, 1, u64_le> lstickright; + BitField<19, 1, u64_le> lstickdown; + + // Right JoyStick + BitField<20, 1, u64_le> rstickleft; + BitField<21, 1, u64_le> rstickup; + BitField<22, 1, u64_le> rstickright; + BitField<23, 1, u64_le> rstickdown; + + // Not always active? + BitField<24, 1, u64_le> sl; + BitField<25, 1, u64_le> sr; + }; + }; + static_assert(sizeof(ControllerPadState) == 8, "ControllerPadState is an invalid size"); + + struct AnalogPosition { + s32_le x; + s32_le y; + }; + static_assert(sizeof(AnalogPosition) == 8, "AnalogPosition is an invalid size"); + + struct ConnectionState { + union { + u32_le raw{}; + BitField<0, 1, u32_le> IsConnected; + BitField<1, 1, u32_le> IsWired; + }; + }; + static_assert(sizeof(ConnectionState) == 4, "ConnectionState is an invalid size"); + + struct GenericStates { + s64_le timestamp; + s64_le timestamp2; + ControllerPadState pad_states; + AnalogPosition lstick; + AnalogPosition rstick; + ConnectionState connection_status; + }; + static_assert(sizeof(GenericStates) == 0x30, "NPadGenericStates is an invalid size"); + + struct NPadGeneric { + CommonHeader common; + std::array npad; + }; + static_assert(sizeof(NPadGeneric) == 0x350, "NPadGeneric is an invalid size"); + + enum class ColorReadError : u32_le { + ReadOk = 0, + ColorDoesntExist = 1, + NoController = 2, + }; + + struct NPadProperties { + union { + s64_le raw{}; + BitField<11, 1, s64_le> is_verticle; + BitField<12, 1, s64_le> is_horizontal; + }; + }; + + struct NPadDevice { + union { + u32_le raw{}; + BitField<0, 1, s32_le> pro_controller; + BitField<1, 1, s32_le> handheld; + BitField<2, 1, s32_le> handheld_left; + BitField<3, 1, s32_le> handheld_right; + BitField<4, 1, s32_le> joycon_left; + BitField<5, 1, s32_le> joycon_right; + BitField<6, 1, s32_le> pokeball; + }; + }; + + struct NPadEntry { + NPadType joy_styles; + NPadAssignments pad_assignment; + + ColorReadError single_color_error; + ControllerColor single_color; + + ColorReadError dual_color_error; + ControllerColor left_color; + ControllerColor right_color; + + NPadGeneric main_controller_states; + NPadGeneric handheld_states; + NPadGeneric dual_states; + NPadGeneric left_joy_states; + NPadGeneric right_joy_states; + NPadGeneric pokeball_states; + NPadGeneric libnx; // TODO(ogniK): Find out what this actually is, libnx seems to only be + // relying on this for the time being + INSERT_PADDING_BYTES( + 0x708 * + 6); // TODO(ogniK)L SixAxis states, require more information before implementation + NPadDevice device_type; + NPadProperties properties; + INSERT_PADDING_WORDS(4); + INSERT_PADDING_BYTES(0x60); + INSERT_PADDING_BYTES(0xdf8); + }; + static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size"); + NPadType style{}; + std::array shared_memory_entries{}; + std::array, Settings::NativeButton::NUM_BUTTONS_HID> + buttons; + std::array, Settings::NativeAnalog::NUM_STICKS_HID> sticks; + std::vector supported_npad_id_types{}; + NpadHoldType hold_type{NpadHoldType::Vertical}; + Kernel::SharedPtr styleset_changed_event; + size_t dump_idx{}; + Vibration last_processed_vibration{}; + void InitNewlyAddedControler(size_t controller_idx); +}; +}; // namespace Service::HID -- cgit v1.2.3 From 5857aea94ef52186f64a6794adf418ba92329329 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sat, 6 Oct 2018 13:14:42 +1000 Subject: Addressed changes for better hid --- src/core/hle/service/hid/controllers/npad.h | 63 +++++++++++++++++------------ 1 file changed, 37 insertions(+), 26 deletions(-) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index e57b67da4..e5c212aa5 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -3,17 +3,24 @@ // Refer to the license.txt file included. #pragma once + #include #include "common/common_types.h" -#include "core/frontend/input.h" #include "core/hle/service/hid/controllers/controller_base.h" #include "core/settings.h" +namespace Input { +template +class InputDevice; +using ButtonDevice = InputDevice; +using AnalogDevice = InputDevice>; +} // namespace Input + namespace Service::HID { class Controller_NPad final : public ControllerBase { public: - Controller_NPad() = default; + Controller_NPad(); // Called when the controller is initialized void OnInit() override; @@ -22,7 +29,7 @@ public: void OnRelease() override; // When the controller is requesting an update for the shared memory - void OnUpdate(u8* data, size_t size) override; + void OnUpdate(u8* data, std::size_t size) override; // Called when input devices should be loaded void OnLoadInputDevices() override; @@ -67,15 +74,15 @@ public: JoyLeft, JoyRight, Tabletop, - Pokeball + Pokeball, }; void SetSupportedStyleSet(NPadType style_set); NPadType GetSupportedStyleSet() const; - void SetSupportedNPadIdTypes(u8* data, size_t length); - void GetSupportedNpadIdTypes(u32* data, size_t max_length); - size_t GetSupportedNPadIdTypesSize() const; + void SetSupportedNPadIdTypes(u8* data, std::size_t length); + const void GetSupportedNpadIdTypes(u32* data, std::size_t max_length); + std::size_t GetSupportedNPadIdTypesSize() const; void SetHoldType(NpadHoldType joy_hold_type); NpadHoldType GetHoldType() const; @@ -123,22 +130,22 @@ private: BitField<11, 1, u64_le> minus; // D-Pad - BitField<12, 1, u64_le> dleft; - BitField<13, 1, u64_le> dup; - BitField<14, 1, u64_le> dright; - BitField<15, 1, u64_le> ddown; + BitField<12, 1, u64_le> d_left; + BitField<13, 1, u64_le> d_up; + BitField<14, 1, u64_le> d_right; + BitField<15, 1, u64_le> d_down; // Left JoyStick - BitField<16, 1, u64_le> lstickleft; - BitField<17, 1, u64_le> lstickup; - BitField<18, 1, u64_le> lstickright; - BitField<19, 1, u64_le> lstickdown; + BitField<16, 1, u64_le> l_stick_left; + BitField<17, 1, u64_le> l_stick_up; + BitField<18, 1, u64_le> l_stick_right; + BitField<19, 1, u64_le> l_stick_down; // Right JoyStick - BitField<20, 1, u64_le> rstickleft; - BitField<21, 1, u64_le> rstickup; - BitField<22, 1, u64_le> rstickright; - BitField<23, 1, u64_le> rstickdown; + BitField<20, 1, u64_le> r_stick_left; + BitField<21, 1, u64_le> r_stick_up; + BitField<22, 1, u64_le> r_stick_right; + BitField<23, 1, u64_le> r_stick_down; // Not always active? BitField<24, 1, u64_le> sl; @@ -166,8 +173,8 @@ private: s64_le timestamp; s64_le timestamp2; ControllerPadState pad_states; - AnalogPosition lstick; - AnalogPosition rstick; + AnalogPosition l_stick; + AnalogPosition r_stick; ConnectionState connection_status; }; static_assert(sizeof(GenericStates) == 0x30, "NPadGenericStates is an invalid size"); @@ -187,7 +194,7 @@ private: struct NPadProperties { union { s64_le raw{}; - BitField<11, 1, s64_le> is_verticle; + BitField<11, 1, s64_le> is_vertical; BitField<12, 1, s64_le> is_horizontal; }; }; @@ -226,7 +233,7 @@ private: // relying on this for the time being INSERT_PADDING_BYTES( 0x708 * - 6); // TODO(ogniK)L SixAxis states, require more information before implementation + 6); // TODO(ogniK): SixAxis states, require more information before implementation NPadDevice device_type; NPadProperties properties; INSERT_PADDING_WORDS(4); @@ -242,8 +249,12 @@ private: std::vector supported_npad_id_types{}; NpadHoldType hold_type{NpadHoldType::Vertical}; Kernel::SharedPtr styleset_changed_event; - size_t dump_idx{}; + std::size_t dump_idx{}; Vibration last_processed_vibration{}; - void InitNewlyAddedControler(size_t controller_idx); + std::size_t CONTROLLER_COUNT{}; + const std::array NPAD_ID_LIST{0, 1, 2, 3, 4, 5, 6, 7, 32}; + std::array CONNECTED_CONTROLLERS{}; + + void InitNewlyAddedControler(std::size_t controller_idx); }; -}; // namespace Service::HID +} // namespace Service::HID -- cgit v1.2.3 From b79c294c0290886266e8c9059314903c38978db6 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sat, 6 Oct 2018 13:27:06 +1000 Subject: Removed unneeded forward declarations --- src/core/hle/service/hid/controllers/npad.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index e5c212aa5..2d1614747 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -6,16 +6,10 @@ #include #include "common/common_types.h" +#include "core/frontend/input.h" #include "core/hle/service/hid/controllers/controller_base.h" #include "core/settings.h" -namespace Input { -template -class InputDevice; -using ButtonDevice = InputDevice; -using AnalogDevice = InputDevice>; -} // namespace Input - namespace Service::HID { class Controller_NPad final : public ControllerBase { -- cgit v1.2.3 From f43815af5d59bb1b31696f317c2e2ce243445cb5 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sun, 7 Oct 2018 20:17:04 +1100 Subject: Added the ability to "disconnect" individual npads Fixes arms --- src/core/hle/service/hid/controllers/npad.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 2d1614747..86ab0e429 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -91,6 +91,9 @@ public: void AddNewController(NPadControllerType controller); + void ConnectNPad(u32 npad_id); + void DisconnectNPad(u32 npad_id); + private: struct CommonHeader { s64_le timestamp; @@ -235,6 +238,12 @@ private: INSERT_PADDING_BYTES(0xdf8); }; static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size"); + + struct ControllerHolder { + Controller_NPad::NPadControllerType type; + bool is_connected; + }; + NPadType style{}; std::array shared_memory_entries{}; std::array, Settings::NativeButton::NUM_BUTTONS_HID> @@ -245,9 +254,9 @@ private: Kernel::SharedPtr styleset_changed_event; std::size_t dump_idx{}; Vibration last_processed_vibration{}; - std::size_t CONTROLLER_COUNT{}; - const std::array NPAD_ID_LIST{0, 1, 2, 3, 4, 5, 6, 7, 32}; - std::array CONNECTED_CONTROLLERS{}; + std::size_t controller_count{}; + static constexpr std::array npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32}; + std::array connected_controllers{}; void InitNewlyAddedControler(std::size_t controller_idx); }; -- cgit v1.2.3 From 3d75c9cd7a75f7ef97e2e14fc2eb15e4bba92934 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Wed, 10 Oct 2018 21:38:43 +1100 Subject: Added GetLedPattern and HandheldVariant HandheldVariant is for specific games which expect handheld controllers to be at position 8(kirby), however this doesn't fix all games as some games require handhelds to be at position 0(snipperclips) --- src/core/hle/service/hid/controllers/npad.h | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 86ab0e429..28c89768c 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -65,12 +65,29 @@ public: None, ProController, Handheld, + HandheldVariant, // Games which require the handheld controller to be at index 8 JoyLeft, JoyRight, Tabletop, Pokeball, }; + struct LedPattern { + explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) { + position1.Assign(light1); + position1.Assign(light2); + position1.Assign(light3); + position1.Assign(light4); + }; + union { + u64 raw{}; + BitField<0, 1, u64> position1; + BitField<1, 1, u64> position2; + BitField<2, 1, u64> position3; + BitField<3, 1, u64> position4; + }; + }; + void SetSupportedStyleSet(NPadType style_set); NPadType GetSupportedStyleSet() const; @@ -93,6 +110,7 @@ public: void ConnectNPad(u32 npad_id); void DisconnectNPad(u32 npad_id); + LedPattern GetLedPattern(u32 npad_id); private: struct CommonHeader { @@ -255,8 +273,8 @@ private: std::size_t dump_idx{}; Vibration last_processed_vibration{}; std::size_t controller_count{}; - static constexpr std::array npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32}; - std::array connected_controllers{}; + static constexpr std::array npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16}; + std::array connected_controllers{}; void InitNewlyAddedControler(std::size_t controller_idx); }; -- cgit v1.2.3 From 9e924f2ef2add0f351df6addc01c356b52c8d7be Mon Sep 17 00:00:00 2001 From: David Marcec Date: Thu, 11 Oct 2018 00:58:47 +1100 Subject: Added BeginPermitVibrationSession and EndPermitVibrationSession Used by Mario Party --- src/core/hle/service/hid/controllers/npad.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 28c89768c..b1aa98820 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -111,6 +111,7 @@ public: void ConnectNPad(u32 npad_id); void DisconnectNPad(u32 npad_id); LedPattern GetLedPattern(u32 npad_id); + void SetVibrationEnabled(bool can_vibrate); private: struct CommonHeader { @@ -275,6 +276,7 @@ private: std::size_t controller_count{}; static constexpr std::array npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16}; std::array connected_controllers{}; + bool can_controllers_vibrate{true}; void InitNewlyAddedControler(std::size_t controller_idx); }; -- cgit v1.2.3 From 85b0d9a7be05eeec2fc230003341f9b444a17bf5 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Fri, 12 Oct 2018 02:56:49 +1100 Subject: Dynamically decide handheld variant based on supported npad id priority Kirby input still doesn't work, should fix a lot of other games --- src/core/hle/service/hid/controllers/npad.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index b1aa98820..bc3d15ce6 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -65,7 +65,6 @@ public: None, ProController, Handheld, - HandheldVariant, // Games which require the handheld controller to be at index 8 JoyLeft, JoyRight, Tabletop, @@ -106,12 +105,13 @@ public: Kernel::SharedPtr GetStyleSetChangedEvent() const; Vibration GetLastVibration() const; - void AddNewController(NPadControllerType controller); + void AddNewController(NPadControllerType controller, bool is_handheld_variant = false); void ConnectNPad(u32 npad_id); void DisconnectNPad(u32 npad_id); LedPattern GetLedPattern(u32 npad_id); void SetVibrationEnabled(bool can_vibrate); + void SetHandheldActiviationMode(u32 mode); private: struct CommonHeader { @@ -273,10 +273,10 @@ private: Kernel::SharedPtr styleset_changed_event; std::size_t dump_idx{}; Vibration last_processed_vibration{}; - std::size_t controller_count{}; static constexpr std::array npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16}; std::array connected_controllers{}; bool can_controllers_vibrate{true}; + void CheckForHandheldVariant(); void InitNewlyAddedControler(std::size_t controller_idx); }; -- cgit v1.2.3 From 8144fa42bdeb96524f506f935109df128f961847 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Thu, 18 Oct 2018 00:11:47 +1100 Subject: Using dual joycons as the default controller Reason for the change is to allow both docked and undocked mode to work --- src/core/hle/service/hid/controllers/npad.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src/core/hle/service/hid/controllers/npad.h') diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index bc3d15ce6..9d07d258d 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -65,9 +65,9 @@ public: None, ProController, Handheld, + JoyDual, JoyLeft, JoyRight, - Tabletop, Pokeball, }; @@ -105,13 +105,12 @@ public: Kernel::SharedPtr GetStyleSetChangedEvent() const; Vibration GetLastVibration() const; - void AddNewController(NPadControllerType controller, bool is_handheld_variant = false); + void AddNewController(NPadControllerType controller); void ConnectNPad(u32 npad_id); void DisconnectNPad(u32 npad_id); LedPattern GetLedPattern(u32 npad_id); void SetVibrationEnabled(bool can_vibrate); - void SetHandheldActiviationMode(u32 mode); private: struct CommonHeader { @@ -181,6 +180,10 @@ private: u32_le raw{}; BitField<0, 1, u32_le> IsConnected; BitField<1, 1, u32_le> IsWired; + BitField<2, 1, u32_le> IsLeftJoyConnected; + BitField<3, 1, u32_le> IsLeftJoyWired; + BitField<4, 1, u32_le> IsRightJoyConnected; + BitField<5, 1, u32_le> IsRightJoyWired; }; }; static_assert(sizeof(ConnectionState) == 4, "ConnectionState is an invalid size"); @@ -212,6 +215,8 @@ private: s64_le raw{}; BitField<11, 1, s64_le> is_vertical; BitField<12, 1, s64_le> is_horizontal; + BitField<13, 1, s64_le> use_plus; + BitField<14, 1, s64_le> use_minus; }; }; @@ -252,8 +257,9 @@ private: 6); // TODO(ogniK): SixAxis states, require more information before implementation NPadDevice device_type; NPadProperties properties; - INSERT_PADDING_WORDS(4); - INSERT_PADDING_BYTES(0x60); + INSERT_PADDING_WORDS(1); + std::array battery_level; + INSERT_PADDING_BYTES(0x5c); INSERT_PADDING_BYTES(0xdf8); }; static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size"); @@ -276,7 +282,6 @@ private: static constexpr std::array npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16}; std::array connected_controllers{}; bool can_controllers_vibrate{true}; - void CheckForHandheldVariant(); void InitNewlyAddedControler(std::size_t controller_idx); }; -- cgit v1.2.3