From 98b760c645088ef690c7fe5941bdebeed34a3012 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Fri, 12 Oct 2018 16:28:00 +1100 Subject: Wip --- src/core/hle/service/hid/controllers/npad.cpp | 20 ++++++++++++++++++-- src/core/hle/service/hid/hid.cpp | 6 +++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index dbb0dd72d..9aa8d6f92 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp @@ -287,15 +287,31 @@ Controller_NPad::NPadType Controller_NPad::GetSupportedStyleSet() const { void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { ASSERT(length > 0 && (length % sizeof(u32)) == 0); + supported_npad_id_types.clear(); supported_npad_id_types.resize(length / sizeof(u32)); std::memcpy(supported_npad_id_types.data(), data, length); CheckForHandheldVariant(); } - +#pragma optimize("", off) void Controller_NPad::CheckForHandheldVariant() { // As some games expect us to use the variant of handheld mode and some games don't. It's // consistent that games set the npad ids in order of priority. We can just swap the controller // ids on the fly then if we're in handheld mode + if (std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), 32) != + supported_npad_id_types.end()) { + const auto& first_controller = connected_controllers.front(); + if (first_controller.is_connected && + first_controller.type == NPadControllerType::Handheld) { + DisconnectNPad(0); + AddNewController(NPadControllerType::Handheld, true); + } + } else { + if (connected_controllers[8].is_connected) { + DisconnectNPad(8); + AddNewController(NPadControllerType::Handheld); + } + } + /* if (supported_npad_id_types.size() > 0) { const auto& first_controller = supported_npad_id_types.front(); if (first_controller == 32 && !connected_controllers[8].is_connected) { @@ -311,7 +327,7 @@ void Controller_NPad::CheckForHandheldVariant() { AddNewController(NPadControllerType::Handheld); } } - } + }*/ } const void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index e5cbd2ef6..db1537b40 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -284,7 +284,7 @@ public: private: std::shared_ptr applet_resource; - +#pragma optimize("", off) void CreateAppletResource(Kernel::HLERequestContext& ctx) { if (applet_resource == nullptr) { applet_resource = std::make_shared(); @@ -405,6 +405,8 @@ private: } void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + auto npad_id = rp.PopRaw(); IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(RESULT_SUCCESS); rb.PushCopyObjects(applet_resource->GetController(HidController::NPad) @@ -454,6 +456,8 @@ private: } void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + auto npad_id = rp.PopRaw(); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); LOG_WARNING(Service_HID, "(STUBBED) called"); -- cgit v1.2.3