diff --git a/src/core/hle/service/am/applets/applet_cabinet.cpp b/src/core/hle/service/am/applets/applet_cabinet.cpp index e7f46c1b8..a21cdb442 100644 --- a/src/core/hle/service/am/applets/applet_cabinet.cpp +++ b/src/core/hle/service/am/applets/applet_cabinet.cpp @@ -12,7 +12,7 @@ #include "core/hle/service/am/applets/applet_cabinet.h" #include "core/hle/service/mii/mii_manager.h" #include "core/hle/service/nfc/common/device.h" -#include "core/hle/service/hid/hid_server/hid_types.h" +#include "core/hle/service/hid/hid_types.h" namespace Service::AM::Applets { diff --git a/src/core/hle/service/am/applets/applet_controller.cpp b/src/core/hle/service/am/applets/applet_controller.cpp index 754adcc55..7a14e6815 100644 --- a/src/core/hle/service/am/applets/applet_controller.cpp +++ b/src/core/hle/service/am/applets/applet_controller.cpp @@ -10,7 +10,7 @@ #include "core/core.h" #include "core/frontend/applets/controller.h" #include "core/hid/hid_core.h" -#include "core/hle/service/hid/hid_server/hid_types.h" +#include "core/hle/service/hid/hid_types.h" #include "core/hle/result.h" #include "core/hle/service/am/am.h" #include "core/hle/service/am/applets/applet_controller.h" diff --git a/src/core/hle/service/hid/hid_result.h b/src/core/hle/service/hid/hid_result.h index e7c50051c..67e8100dc 100644 --- a/src/core/hle/service/hid/hid_result.h +++ b/src/core/hle/service/hid/hid_result.h @@ -20,6 +20,7 @@ constexpr Result ResultInvalidNpadId{ErrorModule::HID, 709}; constexpr Result ResultNpadNotConnected{ErrorModule::HID, 710}; constexpr Result ResultInvalidArraySize{ErrorModule::HID, 715}; constexpr Result ResultUndefinedStyleSet{ErrorModule::HID, 716}; +constexpr Result ResultInvalidStyleSet{ErrorModule::HID, 717}; constexpr Result ResultUnknown108{ErrorModule::HID, 108}; diff --git a/src/core/hle/service/hid/hid_types.h b/src/core/hle/service/hid/hid_types.h index 27f3b18f3..d62186d92 100644 --- a/src/core/hle/service/hid/hid_types.h +++ b/src/core/hle/service/hid/hid_types.h @@ -338,6 +338,10 @@ struct NpadStyleTag { BitField<30, 1, u32> system; }; + NpadStyleTag() { + raw = NpadStyleSet::None; + } + NpadStyleTag(NpadStyleSet style_set) { raw = style_set; } diff --git a/src/core/hle/service/hid/hid_util.h b/src/core/hle/service/hid/hid_util.h index 2e078caff..cc5c22cd2 100644 --- a/src/core/hle/service/hid/hid_util.h +++ b/src/core/hle/service/hid/hid_util.h @@ -81,4 +81,23 @@ constexpr NpadIdType IndexToNpadIdType(size_t index) { } } +constexpr NpadStyleSet GetStylesetByIndex(std::size_t index) { + switch (index) { + case 0: + return NpadStyleSet::Fullkey; + case 1: + return NpadStyleSet::Handheld; + case 2: + return NpadStyleSet::JoyDual; + case 3: + return NpadStyleSet::JoyLeft; + case 4: + return NpadStyleSet::JoyRight; + case 5: + return NpadStyleSet::Palma; + default: + return NpadStyleSet::None; + } +} + } // namespace Service::HID diff --git a/src/core/hle/service/hid/resource_manager.cpp b/src/core/hle/service/hid/resource_manager.cpp index 06a504eb1..be8f7d6ca 100644 --- a/src/core/hle/service/hid/resource_manager.cpp +++ b/src/core/hle/service/hid/resource_manager.cpp @@ -67,7 +67,7 @@ namespace Service::HID { return player_memory; }*/ -ResourceManager::ResourceManager(Core::System& system_) {} +ResourceManager::ResourceManager(Core::System& system_) : service_context{system_, "hid"} {} ResourceManager::~ResourceManager() = default; @@ -76,7 +76,7 @@ void ResourceManager::Initialize() { gesture = std::make_shared(); keyboard = std::make_shared(); mouse = std::make_shared(); - npad = std::make_shared(); + npad = std::make_shared(service_context); palma = std::make_shared(); sixaxis = std::make_shared(); touch_screen = std::make_shared(); diff --git a/src/core/hle/service/hid/resource_manager.h b/src/core/hle/service/hid/resource_manager.h index 98fc2759a..80da9e66f 100644 --- a/src/core/hle/service/hid/resource_manager.h +++ b/src/core/hle/service/hid/resource_manager.h @@ -4,6 +4,7 @@ #pragma once #include "core/hle/service/service.h" +#include "core/hle/service/kernel_helpers.h" namespace Core { class System; @@ -38,7 +39,6 @@ public: std::shared_ptr GetSixAxis(); std::shared_ptr GetTouchScreen(); - std::shared_ptr debug_pad = nullptr; std::shared_ptr gesture = nullptr; std::shared_ptr keyboard = nullptr; @@ -47,6 +47,8 @@ public: std::shared_ptr palma = nullptr; std::shared_ptr sixaxis = nullptr; std::shared_ptr touch_screen = nullptr; + + KernelHelpers::ServiceContext service_context; }; } // namespace Service::HID diff --git a/src/core/hle/service/hid/resource_manager/npad.cpp b/src/core/hle/service/hid/resource_manager/npad.cpp index a2f45b21f..aceca0487 100644 --- a/src/core/hle/service/hid/resource_manager/npad.cpp +++ b/src/core/hle/service/hid/resource_manager/npad.cpp @@ -6,7 +6,6 @@ #include "core/hle/service/hid/hid_types.h" #include "core/hle/service/hid/hid_util.h" #include "core/hle/service/hid/resource_manager/npad.h" -#include "core/hle/service/kernel_helpers.h" #pragma optimize("", off) namespace Service::HID { @@ -97,11 +96,12 @@ NpadJoyHoldType NpadState::GetNpadJoyHoldType() const { } Result NpadState::SetSupportedNpadIdType(std::span list) { - if (list.size() >= SUPPORTED_NPAD_TYPES_MAX) { + // Note: Real limit is 11. But array size is 10. N's bug? + if (list.size() >= PLAYERS_MAX) { return ResultInvalidArraySize; } - data.supported_npad_id_types_count = list.size(); + data.supported_npad_id_types_count = static_cast(list.size()); memcpy(data.supported_npad_id_types.data(), list.data(), list.size_bytes()); return ResultSuccess; @@ -141,6 +141,10 @@ void NpadState::SetNpadAnalogStickUseCenterClampImpl(const bool is_enabled) { data.status.use_center_clamp.Assign(is_enabled); } +void NpadState::SetCaptureButtonAssignment(std::size_t index, NpadButton npad_button_set) { + data.npad_button_assignment[index] = npad_button_set; +} + Npad::Npad(KernelHelpers::ServiceContext& context) : service_context{context} { for (auto& npad : npad_state) { npad = std::make_shared(); @@ -566,7 +570,19 @@ Result Npad::EnableUnintendedHomeButtonInputProtection(const u64 aruid, const Np } void Npad::SetNpadAnalogStickUseCenterClamp(const u64 aruid, const bool use_center_clamp) { + std::scoped_lock lock{mutex}; SetNpadAnalogStickUseCenterClampImpl(aruid, use_center_clamp); + // update abstract handles + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+1)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+2)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+3)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+4)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+5)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+6)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+7)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+8)); + // UpdateAbstractCenterClamp(GetAbstractHandle(param_1->abstract_active_player+9)); } Result Npad::SetNpadAnalogStickUseCenterClampImpl(const u64 aruid, const bool use_center_clamp) { @@ -585,13 +601,55 @@ Result Npad::SetNpadAnalogStickUseCenterClampImpl(const u64 aruid, const bool us } Result Npad::SetNpadCaptureButtonAssignment(const u64 aruid, const NpadStyleSet npad_styleset, - const NpadButton buttons) { - // tooo complicated + const NpadButton npad_button_set) { + std::scoped_lock lock{mutex}; + const auto index = GetIndexFromAruid(aruid); + + if (index >= ARUID_MAX) { + return ResultNpadNotConnected; + } + + // Must be a power of two + const auto raw_styleset = static_cast(npad_styleset); + if (raw_styleset == 0 && (raw_styleset & (raw_styleset - 1)) != 0) { + return ResultInvalidStyleSet; + } + + int style_index{}; + NpadStyleSet style_selected{}; + for (style_index = 0; style_index < 7; ++style_index) { + style_selected = GetStylesetByIndex(style_index); + if (npad_styleset == style_selected) { + break; + } + } + + if (style_selected == NpadStyleSet::None) { + return ResultInvalidStyleSet; + } + + npad_state[index]->SetCaptureButtonAssignment(style_index, npad_button_set); + if (active_aruid == aruid) { + active_npad_state->SetCaptureButtonAssignment(style_index, npad_button_set); + } return ResultSuccess; } Result Npad::ClearNpadCaptureButtonAssignment(const u64 aruid) { + std::scoped_lock lock{mutex}; + const auto index = GetIndexFromAruid(aruid); + + if (index >= ARUID_MAX) { + return ResultNpadNotConnected; + } + + for (std::size_t style_index = 0; style_index < 7; ++style_index) { + npad_state[index]->SetCaptureButtonAssignment(style_index, NpadButton::None); + if (active_aruid == aruid) { + active_npad_state->SetCaptureButtonAssignment(style_index, NpadButton::None); + } + } return ResultSuccess; } diff --git a/src/core/hle/service/hid/resource_manager/npad.h b/src/core/hle/service/hid/resource_manager/npad.h index d0e6c0ba1..231ef9d7d 100644 --- a/src/core/hle/service/hid/resource_manager/npad.h +++ b/src/core/hle/service/hid/resource_manager/npad.h @@ -4,8 +4,11 @@ #pragma once #include +#include +#include #include "core/hle/service/hid/resource_manager/base_resource.h" +#include "core/hle/service/kernel_helpers.h" namespace Core { class System; @@ -15,10 +18,6 @@ namespace Kernel { class KReadableEvent; } -namespace KernelHelpers { -class ServiceContext; -} - namespace Service::HID { enum class NpadIdType : u32; enum class NpadJoyAssignmentMode : u32; @@ -97,14 +96,17 @@ public: bool IsUnintendedHomeButtonInputProtectionEnabled(const NpadIdType npad_id) const; void SetNpadAnalogStickUseCenterClampImpl(const bool is_enabled); + void SetCaptureButtonAssignment(std::size_t index, NpadButton npad_button_set); + private: struct DataStructure { NpadStatus status{}; NpadStyleSet supported_npad_style_set{}; u32 npad_hold_type{}; u32 handheld_activation_mode{}; - std::array supported_npad_id_types{}; - INSERT_PADDING_BYTES(0x64); + std::array supported_npad_id_types{}; + std::array npad_button_assignment; + INSERT_PADDING_BYTES(0x30); u32 supported_npad_id_types_count{}; std::array is_unintended_home_button_input_proptection{}; INSERT_PADDING_BYTES(0x2); @@ -164,7 +166,7 @@ public: const bool is_enabled); void SetNpadAnalogStickUseCenterClamp(const u64 aruid, const bool use_center_clamp); Result SetNpadCaptureButtonAssignment(const u64 aruid, const NpadStyleSet npad_styleset, - const NpadButton buttons); + const NpadButton npad_button_set); Result ClearNpadCaptureButtonAssignment(const u64 aruid); // Events diff --git a/src/core/hle/service/nfc/nfc_interface.cpp b/src/core/hle/service/nfc/nfc_interface.cpp index 686a8e703..a511206a8 100644 --- a/src/core/hle/service/nfc/nfc_interface.cpp +++ b/src/core/hle/service/nfc/nfc_interface.cpp @@ -3,7 +3,7 @@ #include "common/logging/log.h" #include "core/core.h" -#include "core/hle/service/hid/hid_server/hid_types.h" +#include "core/hle/service/hid/hid_types.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/nfc/common/device.h" diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index 6f5a17039..a15a725a3 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp @@ -8,7 +8,7 @@ #include "common/string_util.h" #include "core/core.h" #include "core/hid/hid_core.h" -#include "core/hle/service/hid/hid_server/hid_types.h" +#include "core/hle/service/hid/hid_types.h" #include "core/hle/service/hid/hid.h" #include "core/hle/service/sm/sm.h" #include "ui_qt_controller.h" diff --git a/src/yuzu/applets/qt_software_keyboard.cpp b/src/yuzu/applets/qt_software_keyboard.cpp index 3d7f7dab2..fd2bd71b4 100644 --- a/src/yuzu/applets/qt_software_keyboard.cpp +++ b/src/yuzu/applets/qt_software_keyboard.cpp @@ -10,7 +10,7 @@ #include "common/string_util.h" #include "core/core.h" #include "core/hid/hid_core.h" -#include "core/hle/service/hid/hid_server/hid_types.h" +#include "core/hle/service/hid/hid_types.h" //#include "core/hid/input_interpreter.h" #include "ui_qt_software_keyboard.h" #include "yuzu/applets/qt_software_keyboard.h" diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 0a84dad3f..a31fc7a36 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -13,7 +13,7 @@ #include "common/assert.h" #include "common/param_package.h" #include "core/hid/hid_core.h" -#include "core/hle/service/hid/hid_server/hid_types.h" +#include "core/hle/service/hid/hid_types.h" #include "input_common/drivers/keyboard.h" #include "input_common/drivers/mouse.h" #include "input_common/main.h"