This commit is contained in:
Narr the Reg 2023-12-30 22:20:19 -06:00
parent ad8ba6c0cf
commit 94d1a9c761
8 changed files with 125 additions and 227 deletions

View File

@ -13,6 +13,10 @@
namespace Service::HID {
NpadAbstractButtonHandler::NpadAbstractButtonHandler() {}
NpadAbstractButtonHandler::~NpadAbstractButtonHandler() = default;
void NpadAbstractButtonHandler::SetAbstractPadHolder(NpadAbstractedPadHolder* holder) {
abstract_pad_holder = holder;
}

View File

@ -24,7 +24,7 @@ void NpadAbstractIrSensorHandler::SetPropertiesHandler(NpadAbstractPropertiesHan
}
Result NpadAbstractIrSensorHandler::IncrementRefCounter() {
if (ref_counter == 0x7ffffffe) {
if (ref_counter == std::numeric_limits<s32>::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;
}

View File

@ -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

View File

@ -29,7 +29,7 @@ void NpadAbstractLedHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler*
}
Result NpadAbstractLedHandler::IncrementRefCounter() {
if (ref_counter == 0x7ffffffe) {
if (ref_counter == std::numeric_limits<s32>::max() - 1) {
return ResultNpadHandlerOverflow;
}
ref_counter++;

View File

@ -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;
}

View File

@ -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) {

View File

@ -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*)&param_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*)&param_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);

View File

@ -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<IAbstractedPad*> list);
@ -40,7 +45,7 @@ public:
int GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg_size);
private:
std::array<AbstracAssignmentMode, 5> assignment_list{};
std::array<AbstracAssignmentHolder, 5> assignment_list{};
u32 list_size{};
NpadJoyAssignmentMode assignment_mode{NpadJoyAssignmentMode::Dual};
};