From 94d1a9c761a9101004a975e76dde2157caa136c4 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Sat, 30 Dec 2023 22:20:19 -0600 Subject: [PATCH] moar --- .../abstract/abstract_button_handler.cpp | 4 + .../abstract/abstract_ir_sensor_handler.cpp | 24 +- .../abstract/abstract_ir_sensor_handler.h | 15 +- .../abstract/abstract_led_handler.cpp | 2 +- .../abstract/abstract_mcu_handler.cpp | 8 +- .../abstract/abstract_nfc_handler.cpp | 8 +- .../abstract/abstract_pad_holder.cpp | 272 +++++------------- .../abstract/abstract_pad_holder.h | 19 +- 8 files changed, 125 insertions(+), 227 deletions(-) diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_button_handler.cpp b/src/core/hle/service/hid/controllers/abstract/abstract_button_handler.cpp index 16bb2ba2f..5de60b39b 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_button_handler.cpp +++ b/src/core/hle/service/hid/controllers/abstract/abstract_button_handler.cpp @@ -13,6 +13,10 @@ namespace Service::HID { +NpadAbstractButtonHandler::NpadAbstractButtonHandler() {} + +NpadAbstractButtonHandler::~NpadAbstractButtonHandler() = default; + void NpadAbstractButtonHandler::SetAbstractPadHolder(NpadAbstractedPadHolder* holder) { abstract_pad_holder = holder; } diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.cpp b/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.cpp index 2880967fc..7c0f1e04d 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.cpp +++ b/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.cpp @@ -24,7 +24,7 @@ void NpadAbstractIrSensorHandler::SetPropertiesHandler(NpadAbstractPropertiesHan } Result NpadAbstractIrSensorHandler::IncrementRefCounter() { - if (ref_counter == 0x7ffffffe) { + if (ref_counter == std::numeric_limits::max() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; @@ -45,7 +45,7 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() { const std::size_t count = abstract_pad_holder->GetAbstractedPads(abstract_pads); if (count == 0) { - sensor_state = 0; + sensor_state = NpadIrSensorState::Disabled; if (sensor_state == previous_state) { return; } @@ -70,10 +70,10 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() { } if (is_found) { - if (sensor_state == 3) { + if (sensor_state == NpadIrSensorState::Active) { return; } - sensor_state = 2; + sensor_state = NpadIrSensorState::Available; if (sensor_state == previous_state) { return; } @@ -81,7 +81,7 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() { return; } - sensor_state = 1; + sensor_state = NpadIrSensorState::Unavailable; if (sensor_state == previous_state) { return; } @@ -91,19 +91,19 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() { } Result NpadAbstractIrSensorHandler::ActivateIrSensor(bool is_enabled) { - if (sensor_state == 1) { + if (sensor_state == NpadIrSensorState::Unavailable) { return ResultIrSensorIsNotReady; } - if (is_enabled && sensor_state == 2) { - sensor_state = 3; + if (is_enabled && sensor_state == NpadIrSensorState::Available) { + sensor_state = NpadIrSensorState::Active; } else { if (is_enabled) { return ResultSuccess; } - if (sensor_state != 3) { + if (sensor_state != NpadIrSensorState::Active) { return ResultSuccess; } - sensor_state = 2; + sensor_state = NpadIrSensorState::Available; } ir_sensor_event->Signal(); return ResultSuccess; @@ -115,14 +115,14 @@ Result NpadAbstractIrSensorHandler::GetIrSensorEventHandle(Kernel::KReadableEven } Result NpadAbstractIrSensorHandler::GetXcdHandleForNpadWithIrSensor(u64& handle) const { - if (sensor_state < 2) { + if (sensor_state < NpadIrSensorState::Available) { return ResultIrSensorIsNotReady; } handle = xcd_handle; return ResultSuccess; } -u32 NpadAbstractIrSensorHandler::GetSensorState() const { +NpadIrSensorState NpadAbstractIrSensorHandler::GetSensorState() const { return sensor_state; } diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.h b/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.h index e87ce9758..80e9dcea4 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.h +++ b/src/core/hle/service/hid/controllers/abstract/abstract_ir_sensor_handler.h @@ -11,6 +11,13 @@ namespace Kernel { class KReadableEvent; } +enum class NpadIrSensorState : u32 { + Disabled, + Unavailable, + Available, + Active, +}; + namespace Service::HID { class NpadAbstractedPadHolder; class NpadAbstractPropertiesHandler; @@ -34,15 +41,15 @@ public: Result GetXcdHandleForNpadWithIrSensor(u64& handle) const; - u32 GetSensorState() const; + NpadIrSensorState GetSensorState() const; private: NpadAbstractedPadHolder* abstract_pad_holder{nullptr}; NpadAbstractPropertiesHandler* properties_handler{nullptr}; s32 ref_counter{}; - Kernel::KEvent* ir_sensor_event; - u64 xcd_handle; - u32 sensor_state; + Kernel::KEvent* ir_sensor_event{nullptr}; + u64 xcd_handle{}; + NpadIrSensorState sensor_state{}; }; } // namespace Service::HID diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_led_handler.cpp b/src/core/hle/service/hid/controllers/abstract/abstract_led_handler.cpp index b73c89e2a..6faf47d04 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_led_handler.cpp +++ b/src/core/hle/service/hid/controllers/abstract/abstract_led_handler.cpp @@ -29,7 +29,7 @@ void NpadAbstractLedHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler* } Result NpadAbstractLedHandler::IncrementRefCounter() { - if (ref_counter == 0x7ffffffe) { + if (ref_counter == std::numeric_limits::max() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_mcu_handler.cpp b/src/core/hle/service/hid/controllers/abstract/abstract_mcu_handler.cpp index 02ad6512a..a5efcf6a2 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_mcu_handler.cpp +++ b/src/core/hle/service/hid/controllers/abstract/abstract_mcu_handler.cpp @@ -52,13 +52,13 @@ void NpadAbstractMcuHandler::UpdateMcuState() { !abstract_pad->disabled_feature_set.has_right_joy_six_axis_sensor) { continue; } - if (mcu_holder[1].state != NpadMcuState::Ready) { + if (mcu_holder[1].state != NpadMcuState::Active) { mcu_holder[1].state = NpadMcuState::Available; } mcu_holder[1].abstracted_pad = abstract_pad; continue; } - if (mcu_holder[0].state != NpadMcuState::Ready) { + if (mcu_holder[0].state != NpadMcuState::Active) { mcu_holder[0].state = NpadMcuState::Available; } mcu_holder[0].abstracted_pad = abstract_pad; @@ -86,14 +86,14 @@ Result NpadAbstractMcuHandler::FUN_7100067d88(bool is_enabled, u32 mcu_index) { } if ((is_enabled) && (state == NpadMcuState::Available)) { - state = NpadMcuState::Ready; + state = NpadMcuState::Active; return ResultSuccess; } if (is_enabled) { return ResultSuccess; } - if (state != NpadMcuState::Ready) { + if (state != NpadMcuState::Active) { return ResultSuccess; } diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_nfc_handler.cpp b/src/core/hle/service/hid/controllers/abstract/abstract_nfc_handler.cpp index b1cd8ef9f..b96e72bca 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_nfc_handler.cpp +++ b/src/core/hle/service/hid/controllers/abstract/abstract_nfc_handler.cpp @@ -62,10 +62,10 @@ void NpadAbstractNfcHandler::UpdateNfcState() { } is_found = true; xcd_handle = 0; - const Result result = (**(code**)(*plVar5 + 0x18))(); - if (result.IsSuccess()) { - xcd_handle = GetXcdHandle(); - } + //const Result result = (**(code**)(*plVar5 + 0x18))(); + //if (result.IsSuccess()) { + // xcd_handle = GetXcdHandle(); + //} } if (is_found) { diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.cpp b/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.cpp index 17d639df2..f84dc9029 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.cpp +++ b/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.cpp @@ -3,189 +3,72 @@ #include "core/hle/service/hid/controllers/abstract/abstract_pad_holder.h" #include "core/hle/service/hid/controllers/types/npad_types.h" +#include "core/hle/service/hid/errors.h" namespace Service::HID { -Result NpadAbstractedPadHolder::FUN_710005d81c(u64 param_2) +Result NpadAbstractedPadHolder::RegisterAbstractPad(IAbstractedPad* abstracted_pad) { + if (list_size >= assignment_list.size()) { + return ResultNpadIsNotProController; + } -{ - char cVar1; - u32 uVar2; - Result nVar3; - NpadAbstractAssignmentModeList* pNVar4; - - nVar3 = Hid_0604_Unknown; - uVar2 = param_1->object_size; - if ((int)uVar2 < 5) { - if (0 < (int)uVar2) { - cVar1 = **(char**)(param_2 + 0x48); - if (**(char**)(*(u64*)param_1->assignment_list + 0x48) == cVar1) { - return Hid_0604_Unknown; - } - if (uVar2 != 1) { - if (**(char**)(*(u64*)(param_1->assignment_list + 1) + 0x48) == cVar1) { - return Hid_0604_Unknown; - } - if (uVar2 != 2) { - if (**(char**)(*(u64*)(param_1->assignment_list + 2) + 0x48) == cVar1) { - return Hid_0604_Unknown; - } - if ((uVar2 != 3) && - (**(char**)(*(u64*)(param_1->assignment_list + 3) + 0x48) == cVar1)) { - return Hid_0604_Unknown; - } - } - } + for (std::size_t i = 0; i < list_size; i++) { + if (assignment_list[i].device_type == abstracted_pad->device_type) { + return ResultNpadIsNotProController; } - nVar3 = ResultSuccess; - pNVar4 = param_1->assignment_list + (int)uVar2; - *(u64*)pNVar4 = param_2; - pNVar4->field_0x8 = **(undefined**)(param_2 + 0x48); - pNVar4->field_0x9 = *(undefined*)(param_2 + 0x50); - *(u64*)&pNVar4->field_0x10 = *(u64*)(param_2 + 0x10); - param_1->object_size = param_1->object_size + 1; } - return nVar3; + + assignment_list[list_size] = { + .abstracted_pad = abstracted_pad, + .device_type = abstracted_pad->device_type, + .interface_type = abstracted_pad->interface_type, + .controller_id = abstracted_pad->controller_id, + }; + + list_size++; + return ResultSuccess; } -void NpadAbstractedPadHolder::FUN_710005d8f0(u64* param_2) - -{ - u32 uVar1; - u32 uVar2; - u64 lVar3; - uu64 uVar4; - uu64 uVar5; - NpadAbstractAssignmentModeList* pNVar6; - NpadAbstractAssignmentMode* pNVar7; - NpadAbstractAssignmentModeList* pNVar8; - u64 uVar9; - u64 uVar10; - - uVar2 = param_1->object_size; - if (((uVar2 != 0) && (*param_2 != 0)) && (0 < (int)uVar2)) { - uVar5 = 0; - pNVar7 = param_1; - do { - if (*(u64*)(*(u64*)pNVar7->assignment_list + 0x10) == *param_2) { - uVar1 = (int)uVar5 + 1; - uVar4 = (uu64)uVar1; - if ((int)uVar1 < (int)uVar2) { - lVar3 = uVar5 << 0x20; - pNVar6 = param_1->assignment_list + uVar5; - do { - uVar9 = *(u64*)&pNVar6[1].field_0x8; - pNVar8 = param_1->assignment_list + (lVar3 >> 0x20); - uVar10 = *(u64*)&pNVar6[1].field_0x10; - uVar4 = uVar4 + 1; - lVar3 = lVar3 + 0x100000000; - *(u64*)pNVar8 = *(u64*)(pNVar6 + 1); - *(u64*)&pNVar8->field_0x8 = uVar9; - *(u64*)&pNVar8->field_0x10 = uVar10; - uVar2 = param_1->object_size; - pNVar6 = pNVar6 + 1; - } while ((u64)uVar4 < (u64)(int)uVar2); - } - param_1->object_size = uVar2 - 1; - *(u64*)(&DAT_ffffffffffffffe8 + (u64)(param_1->assignment_list + (int)uVar2)) = 0; - *(undefined2*)((u64)(param_1->assignment_list + (int)uVar2 + -1) + 8) = 0; - return; - } - uVar5 = uVar5 + 1; - pNVar7 = (NpadAbstractAssignmentMode*)(pNVar7->assignment_list + 1); - } while (uVar2 != uVar5); +void NpadAbstractedPadHolder::RemoveAbstractPadByControllerId(u64 controller_id) { + if (list_size == 0) { + return; } - return; -} - -void NpadAbstractedPadHolder::DetachAbstractedPad() - -{ - u32 uVar1; - u64 lVar2; - u32 uVar3; - u64 uVar4; - NpadAbstractAssignmentMode* pNVar5; - u64 uVar6; - - uVar1 = param_1->object_size; - while (0 < (int)uVar1) { - if (uVar1 < 2) { - uVar3 = 1; - } else { - lVar2 = 1; - pNVar5 = param_1; - do { - uVar4 = *(u64*)((NpadAbstractAssignmentMode*)(pNVar5->assignment_list + 1)) - ->assignment_list; - lVar2 = lVar2 + 1; - uVar6 = *(u64*)&pNVar5->assignment_list[1].field_0x8; - *(u64*)&pNVar5->assignment_list[0].field_0x10 = - *(u64*)&pNVar5->assignment_list[1].field_0x10; - *(u64*)pNVar5->assignment_list = uVar4; - *(u64*)&pNVar5->assignment_list[0].field_0x8 = uVar6; - uVar3 = param_1->object_size; - pNVar5 = (NpadAbstractAssignmentMode*)(pNVar5->assignment_list + 1); - } while (lVar2 < (int)uVar3); + if (controller_id == 0) { + return; + } + for (std::size_t i = 0; i < list_size; i++) { + if (assignment_list[i].controller_id != controller_id) { + continue; } - param_1->object_size = uVar3 - 1; - *(u64*)(&DAT_ffffffffffffffe8 + (u64)(param_1->assignment_list + (int)uVar3)) = 0; - *(undefined2*)((u64)(param_1->assignment_list + (int)uVar3 + -1) + 8) = 0; - uVar1 = param_1->object_size; + for (std::size_t e = i+1; e < list_size; e++) { + assignment_list[e - 1] = assignment_list[e]; + } + list_size--; + return; } - return; } -u64 NpadAbstractedPadHolder::FUN_710005da30(u32* param_2) - -{ - u32 uVar1; - u64 lVar2; - uu64 uVar3; - u32 uVar4; - u64 lVar5; - uu64 uVar6; - NpadAbstractAssignmentModeList* pNVar7; - NpadAbstractAssignmentMode* pNVar8; - NpadAbstractAssignmentModeList* pNVar9; - u64 uVar10; - u64 uVar11; - - uVar4 = param_1->object_size; - if (0 < (int)uVar4) { - uVar6 = 0; - pNVar8 = param_1; - do { - lVar2 = *(u64*)pNVar8->assignment_list; - if ((*param_2 & *(u32*)(lVar2 + 0x40)) != 0) { - uVar1 = (int)uVar6 + 1; - uVar3 = (uu64)uVar1; - if ((int)uVar1 < (int)uVar4) { - lVar5 = uVar6 << 0x20; - pNVar7 = param_1->assignment_list + uVar6; - do { - uVar10 = *(u64*)&pNVar7[1].field_0x8; - pNVar9 = param_1->assignment_list + (lVar5 >> 0x20); - uVar11 = *(u64*)&pNVar7[1].field_0x10; - uVar3 = uVar3 + 1; - lVar5 = lVar5 + 0x100000000; - *(u64*)pNVar9 = *(u64*)(pNVar7 + 1); - *(u64*)&pNVar9->field_0x8 = uVar10; - *(u64*)&pNVar9->field_0x10 = uVar11; - uVar4 = param_1->object_size; - pNVar7 = pNVar7 + 1; - } while ((u64)uVar3 < (u64)(int)uVar4); - } - param_1->object_size = uVar4 - 1; - *(u64*)(&DAT_ffffffffffffffe8 + (u64)(param_1->assignment_list + (int)uVar4)) = 0; - *(undefined2*)((u64)(param_1->assignment_list + (int)uVar4 + -1) + 8) = 0; - return lVar2; - } - uVar6 = uVar6 + 1; - pNVar8 = (NpadAbstractAssignmentMode*)(pNVar8->assignment_list + 1); - } while (uVar4 != uVar6); +void NpadAbstractedPadHolder::DetachAbstractedPad() { + while (list_size > 0) { + for (std::size_t i = 1; i < list_size; i++) { + assignment_list[i - 1] = assignment_list[i]; + } + list_size--; } - return 0; +} + +u64 NpadAbstractedPadHolder::RemoveAbstractPadByAssignmentStyle(Service::HID::AssignmentStyle assignment_style) { + for (std::size_t i = 0; i < list_size; i++) { + if ((assignment_style.raw & assignment_list[i].abstracted_pad->assignament_style.raw) == 0) { + continue; + } + for (std::size_t e = i + 1; e < list_size; e++) { + assignment_list[e - 1] = assignment_list[e]; + } + list_size--; + return list_size; + } + return list_size; } int NpadAbstractedPadHolder::FUN_710005db00(u64 param_2) @@ -203,28 +86,28 @@ int NpadAbstractedPadHolder::FUN_710005db00(u64 param_2) u64 uVar10; u64 uVar11; - uVar5 = param_1->object_size; + uVar5 = list_size; if ((int)uVar5 < 1) { iVar3 = 0; } else { uVar4 = 0; iVar3 = 0; do { - while (((*(byte*)(*(u64*)(param_1->assignment_list + (int)uVar4) + 8) >> 1 & 1) == 0 || - (*(u64*)(*(u64*)(param_1->assignment_list + (int)uVar4) + 0x10) != - *(u64*)¶m_1->assignment_list[(int)uVar4].field_0x10))) { + while (((*(byte*)(*(u64*)(assignment_list + (int)uVar4) + 8) >> 1 & 1) == 0 || + (*(u64*)(*(u64*)(assignment_list + (int)uVar4) + 0x10) != + *(u64*)&assignment_list[(int)uVar4].field_0x10))) { if ((int)uVar4 < 0) { // WARNING: Subroutine does not return nn::diag::detail::AbortImpl(); } - uVar2 = *(undefined2*)¶m_1->assignment_list[uVar4].field_0x8; + uVar2 = *(undefined2*)&assignment_list[uVar4].field_0x8; if ((int)(uVar4 + 1) < (int)uVar5) { uVar8 = (uu64)uVar4; - pNVar7 = param_1->assignment_list + uVar8 + 1; + pNVar7 = assignment_list + uVar8 + 1; do { uVar9 = *(u64*)pNVar7; uVar10 = *(u64*)&pNVar7->field_0x8; - pNVar6 = param_1->assignment_list + (int)uVar8; + pNVar6 = assignment_list + (int)uVar8; uVar11 = *(u64*)&pNVar7->field_0x10; pNVar7 = pNVar7 + 1; *(u64*)pNVar6 = uVar9; @@ -232,15 +115,15 @@ int NpadAbstractedPadHolder::FUN_710005db00(u64 param_2) *(u64*)&pNVar6->field_0x10 = uVar11; lVar1 = uVar8 + 2; uVar8 = uVar8 + 1; - uVar5 = param_1->object_size; + uVar5 = list_size; } while (lVar1 < (int)uVar5); } - param_1->object_size = uVar5 - 1; - *(u64*)(&DAT_ffffffffffffffe8 + (u64)(param_1->assignment_list + (int)uVar5)) = 0; - *(undefined2*)((u64)(param_1->assignment_list + (int)uVar5 + -1) + 8) = 0; + list_size = uVar5 - 1; + *(u64*)(&DAT_ffffffffffffffe8 + (u64)(assignment_list + (int)uVar5)) = 0; + *(undefined2*)((u64)(assignment_list + (int)uVar5 + -1) + 8) = 0; *(undefined2*)(param_2 + (u64)iVar3 * 2) = uVar2; iVar3 = iVar3 + 1; - uVar5 = param_1->object_size; + uVar5 = list_size; if ((int)uVar5 <= (int)uVar4) { return iVar3; } @@ -261,17 +144,17 @@ bool NpadAbstractedPadHolder::FUN_710005dc00(u64* param_2) u64 lVar5; uu64 uVar6; - uVar1 = param_1->object_size; + uVar1 = list_size; if (uVar1 == 0) { return false; } lVar5 = *param_2; bVar3 = false; if ((lVar5 != 0) && (0 < (int)uVar1)) { - if (*(u64*)(*(u64*)param_1->assignment_list + 0x10) == lVar5) { + if (*(u64*)(*(u64*)assignment_list + 0x10) == lVar5) { return true; } - pNVar4 = param_1->assignment_list; + pNVar4 = assignment_list; uVar2 = 1; do { uVar6 = uVar2; @@ -316,7 +199,7 @@ u32 NpadAbstractedPadHolder::FUN_710005dd60() { uu64 uVar5; AbstracAssignmentMode* pNVar6; - uVar1 = param_1->object_size; + uVar1 = list_size; if (0 < (int)uVar1) { if (uVar1 == 1) { uVar5 = 0; @@ -334,7 +217,7 @@ u32 NpadAbstractedPadHolder::FUN_710005dd60() { } while (((uu64)uVar1 & 0xfffffffe) != uVar5); } if ((uVar1 & 1) != 0) { - uVar4 = *(u32*)(*(u64*)(param_1->assignment_list + uVar5) + 0x40) | uVar4; + uVar4 = *(u32*)(*(u64*)(assignment_list + uVar5) + 0x40) | uVar4; } return uVar4; } @@ -351,7 +234,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005ddf0() NpadAbstractAssignmentModeList* list2; NpadAbstractAssignmentModeList* list_1; - uVar1 = param_1->object_size; + uVar1 = list_size; if (0 < (int)uVar1) { if (uVar1 == 1) { uVar3 = 0; @@ -370,8 +253,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005ddf0() } while (((uu64)uVar1 & 0xfffffffe) != uVar3); } if ((uVar1 & 1) != 0) { - uVar2 = - *(uu64*)(*(u64*)(*(u64*)(param_1->assignment_list + uVar3) + 0x48) + 0x10) | uVar2; + uVar2 = *(uu64*)(*(u64*)(*(u64*)(assignment_list + uVar3) + 0x48) + 0x10) | uVar2; } return uVar2; } @@ -388,7 +270,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005de90() uu64 uVar5; NpadAbstractAssignmentMode* pNVar6; - uVar1 = param_1->object_size; + uVar1 = list_size; if (0 < (int)uVar1) { if (uVar1 == 1) { uVar5 = 0; @@ -407,7 +289,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005de90() } while (((uu64)uVar1 & 0xfffffffe) != uVar5); } if ((uVar1 & 1) != 0) { - uVar4 = *(uu64*)(*(u64*)(param_1->assignment_list + uVar5) + 0x38) | uVar4; + uVar4 = *(uu64*)(*(u64*)(assignment_list + uVar5) + 0x38) | uVar4; } return uVar4; } @@ -423,8 +305,8 @@ int NpadAbstractedPadHolder::GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg NpadAbstractAssignmentMode* pNVar2; u32 some_value; - some_value = param_1->object_size; - if ((int)arg_size <= (int)param_1->object_size) { + some_value = list_size; + if ((int)arg_size <= (int)list_size) { some_value = arg_size; } if (0 < (int)some_value) { @@ -438,8 +320,8 @@ int NpadAbstractedPadHolder::GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg object_count = object_count + 1; } index = index + 1; - some_value = param_1->object_size; - if ((int)arg_size <= (int)param_1->object_size) { + some_value = list_size; + if ((int)arg_size <= (int)list_size) { some_value = arg_size; } pNVar2 = (NpadAbstractAssignmentMode*)(pNVar2->assignment_list + 1); diff --git a/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.h b/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.h index 82d80d408..39d7ab5fc 100644 --- a/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.h +++ b/src/core/hle/service/hid/controllers/abstract/abstract_pad_holder.h @@ -13,19 +13,24 @@ #include "core/hle/service/hid/controllers/types/npad_types.h" namespace Service::HID { +class IAbstractedPad; -struct AbstracAssignmentMode { - Core::HID::NpadStyleIndex style_index; - u8 element_a; +struct AbstracAssignmentHolder { + IAbstractedPad* abstracted_pad; + Core::HID::NpadStyleIndex device_type; + Core::HID::NpadInterfaceType interface_type; + INSERT_PADDING_BYTES(0x6); + u64 controller_id; }; +static_assert(sizeof(AbstracAssignmentHolder) == 0x18, "AbstracAssignmentHolder is an invalid size"); /// This is nn::hid::server::NpadAbstractedPadHolder class NpadAbstractedPadHolder final { public: - Result FUN_710005d81c(u64 param_2); - void FUN_710005d8f0(u64* param_2); + Result RegisterAbstractPad(IAbstractedPad* abstracted_pad); + void RemoveAbstractPadByControllerId(u64 controller_id); void DetachAbstractedPad(); - u64 FUN_710005da30(u32* param_2); + u64 RemoveAbstractPadByAssignmentStyle(Service::HID::AssignmentStyle assignment_style); int FUN_710005db00(u64 param_2); bool FUN_710005dc00(u64* param_2); u32 GetAbstractedPads(std::span list); @@ -40,7 +45,7 @@ public: int GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg_size); private: - std::array assignment_list{}; + std::array assignment_list{}; u32 list_size{}; NpadJoyAssignmentMode assignment_mode{NpadJoyAssignmentMode::Dual}; };