moar
This commit is contained in:
parent
ad8ba6c0cf
commit
94d1a9c761
|
@ -13,6 +13,10 @@
|
||||||
|
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
|
|
||||||
|
NpadAbstractButtonHandler::NpadAbstractButtonHandler() {}
|
||||||
|
|
||||||
|
NpadAbstractButtonHandler::~NpadAbstractButtonHandler() = default;
|
||||||
|
|
||||||
void NpadAbstractButtonHandler::SetAbstractPadHolder(NpadAbstractedPadHolder* holder) {
|
void NpadAbstractButtonHandler::SetAbstractPadHolder(NpadAbstractedPadHolder* holder) {
|
||||||
abstract_pad_holder = holder;
|
abstract_pad_holder = holder;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ void NpadAbstractIrSensorHandler::SetPropertiesHandler(NpadAbstractPropertiesHan
|
||||||
}
|
}
|
||||||
|
|
||||||
Result NpadAbstractIrSensorHandler::IncrementRefCounter() {
|
Result NpadAbstractIrSensorHandler::IncrementRefCounter() {
|
||||||
if (ref_counter == 0x7ffffffe) {
|
if (ref_counter == std::numeric_limits<s32>::max() - 1) {
|
||||||
return ResultNpadHandlerOverflow;
|
return ResultNpadHandlerOverflow;
|
||||||
}
|
}
|
||||||
ref_counter++;
|
ref_counter++;
|
||||||
|
@ -45,7 +45,7 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() {
|
||||||
const std::size_t count = abstract_pad_holder->GetAbstractedPads(abstract_pads);
|
const std::size_t count = abstract_pad_holder->GetAbstractedPads(abstract_pads);
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
sensor_state = 0;
|
sensor_state = NpadIrSensorState::Disabled;
|
||||||
if (sensor_state == previous_state) {
|
if (sensor_state == previous_state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -70,10 +70,10 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_found) {
|
if (is_found) {
|
||||||
if (sensor_state == 3) {
|
if (sensor_state == NpadIrSensorState::Active) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sensor_state = 2;
|
sensor_state = NpadIrSensorState::Available;
|
||||||
if (sensor_state == previous_state) {
|
if (sensor_state == previous_state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sensor_state = 1;
|
sensor_state = NpadIrSensorState::Unavailable;
|
||||||
if (sensor_state == previous_state) {
|
if (sensor_state == previous_state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -91,19 +91,19 @@ void NpadAbstractIrSensorHandler::UpdateIrSensorState() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Result NpadAbstractIrSensorHandler::ActivateIrSensor(bool is_enabled) {
|
Result NpadAbstractIrSensorHandler::ActivateIrSensor(bool is_enabled) {
|
||||||
if (sensor_state == 1) {
|
if (sensor_state == NpadIrSensorState::Unavailable) {
|
||||||
return ResultIrSensorIsNotReady;
|
return ResultIrSensorIsNotReady;
|
||||||
}
|
}
|
||||||
if (is_enabled && sensor_state == 2) {
|
if (is_enabled && sensor_state == NpadIrSensorState::Available) {
|
||||||
sensor_state = 3;
|
sensor_state = NpadIrSensorState::Active;
|
||||||
} else {
|
} else {
|
||||||
if (is_enabled) {
|
if (is_enabled) {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
if (sensor_state != 3) {
|
if (sensor_state != NpadIrSensorState::Active) {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
sensor_state = 2;
|
sensor_state = NpadIrSensorState::Available;
|
||||||
}
|
}
|
||||||
ir_sensor_event->Signal();
|
ir_sensor_event->Signal();
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
|
@ -115,14 +115,14 @@ Result NpadAbstractIrSensorHandler::GetIrSensorEventHandle(Kernel::KReadableEven
|
||||||
}
|
}
|
||||||
|
|
||||||
Result NpadAbstractIrSensorHandler::GetXcdHandleForNpadWithIrSensor(u64& handle) const {
|
Result NpadAbstractIrSensorHandler::GetXcdHandleForNpadWithIrSensor(u64& handle) const {
|
||||||
if (sensor_state < 2) {
|
if (sensor_state < NpadIrSensorState::Available) {
|
||||||
return ResultIrSensorIsNotReady;
|
return ResultIrSensorIsNotReady;
|
||||||
}
|
}
|
||||||
handle = xcd_handle;
|
handle = xcd_handle;
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 NpadAbstractIrSensorHandler::GetSensorState() const {
|
NpadIrSensorState NpadAbstractIrSensorHandler::GetSensorState() const {
|
||||||
return sensor_state;
|
return sensor_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,13 @@ namespace Kernel {
|
||||||
class KReadableEvent;
|
class KReadableEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class NpadIrSensorState : u32 {
|
||||||
|
Disabled,
|
||||||
|
Unavailable,
|
||||||
|
Available,
|
||||||
|
Active,
|
||||||
|
};
|
||||||
|
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
class NpadAbstractedPadHolder;
|
class NpadAbstractedPadHolder;
|
||||||
class NpadAbstractPropertiesHandler;
|
class NpadAbstractPropertiesHandler;
|
||||||
|
@ -34,15 +41,15 @@ public:
|
||||||
|
|
||||||
Result GetXcdHandleForNpadWithIrSensor(u64& handle) const;
|
Result GetXcdHandleForNpadWithIrSensor(u64& handle) const;
|
||||||
|
|
||||||
u32 GetSensorState() const;
|
NpadIrSensorState GetSensorState() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NpadAbstractedPadHolder* abstract_pad_holder{nullptr};
|
NpadAbstractedPadHolder* abstract_pad_holder{nullptr};
|
||||||
NpadAbstractPropertiesHandler* properties_handler{nullptr};
|
NpadAbstractPropertiesHandler* properties_handler{nullptr};
|
||||||
|
|
||||||
s32 ref_counter{};
|
s32 ref_counter{};
|
||||||
Kernel::KEvent* ir_sensor_event;
|
Kernel::KEvent* ir_sensor_event{nullptr};
|
||||||
u64 xcd_handle;
|
u64 xcd_handle{};
|
||||||
u32 sensor_state;
|
NpadIrSensorState sensor_state{};
|
||||||
};
|
};
|
||||||
} // namespace Service::HID
|
} // namespace Service::HID
|
||||||
|
|
|
@ -29,7 +29,7 @@ void NpadAbstractLedHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler*
|
||||||
}
|
}
|
||||||
|
|
||||||
Result NpadAbstractLedHandler::IncrementRefCounter() {
|
Result NpadAbstractLedHandler::IncrementRefCounter() {
|
||||||
if (ref_counter == 0x7ffffffe) {
|
if (ref_counter == std::numeric_limits<s32>::max() - 1) {
|
||||||
return ResultNpadHandlerOverflow;
|
return ResultNpadHandlerOverflow;
|
||||||
}
|
}
|
||||||
ref_counter++;
|
ref_counter++;
|
||||||
|
|
|
@ -52,13 +52,13 @@ void NpadAbstractMcuHandler::UpdateMcuState() {
|
||||||
!abstract_pad->disabled_feature_set.has_right_joy_six_axis_sensor) {
|
!abstract_pad->disabled_feature_set.has_right_joy_six_axis_sensor) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (mcu_holder[1].state != NpadMcuState::Ready) {
|
if (mcu_holder[1].state != NpadMcuState::Active) {
|
||||||
mcu_holder[1].state = NpadMcuState::Available;
|
mcu_holder[1].state = NpadMcuState::Available;
|
||||||
}
|
}
|
||||||
mcu_holder[1].abstracted_pad = abstract_pad;
|
mcu_holder[1].abstracted_pad = abstract_pad;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (mcu_holder[0].state != NpadMcuState::Ready) {
|
if (mcu_holder[0].state != NpadMcuState::Active) {
|
||||||
mcu_holder[0].state = NpadMcuState::Available;
|
mcu_holder[0].state = NpadMcuState::Available;
|
||||||
}
|
}
|
||||||
mcu_holder[0].abstracted_pad = abstract_pad;
|
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)) {
|
if ((is_enabled) && (state == NpadMcuState::Available)) {
|
||||||
state = NpadMcuState::Ready;
|
state = NpadMcuState::Active;
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_enabled) {
|
if (is_enabled) {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
if (state != NpadMcuState::Ready) {
|
if (state != NpadMcuState::Active) {
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,10 +62,10 @@ void NpadAbstractNfcHandler::UpdateNfcState() {
|
||||||
}
|
}
|
||||||
is_found = true;
|
is_found = true;
|
||||||
xcd_handle = 0;
|
xcd_handle = 0;
|
||||||
const Result result = (**(code**)(*plVar5 + 0x18))();
|
//const Result result = (**(code**)(*plVar5 + 0x18))();
|
||||||
if (result.IsSuccess()) {
|
//if (result.IsSuccess()) {
|
||||||
xcd_handle = GetXcdHandle();
|
// xcd_handle = GetXcdHandle();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_found) {
|
if (is_found) {
|
||||||
|
|
|
@ -3,189 +3,72 @@
|
||||||
|
|
||||||
#include "core/hle/service/hid/controllers/abstract/abstract_pad_holder.h"
|
#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/controllers/types/npad_types.h"
|
||||||
|
#include "core/hle/service/hid/errors.h"
|
||||||
|
|
||||||
namespace Service::HID {
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NpadAbstractedPadHolder::FUN_710005d8f0(u64* param_2)
|
for (std::size_t i = 0; i < list_size; i++) {
|
||||||
|
if (assignment_list[i].device_type == abstracted_pad->device_type) {
|
||||||
{
|
return ResultNpadIsNotProController;
|
||||||
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;
|
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::RemoveAbstractPadByControllerId(u64 controller_id) {
|
||||||
|
if (list_size == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uVar5 = uVar5 + 1;
|
if (controller_id == 0) {
|
||||||
pNVar7 = (NpadAbstractAssignmentMode*)(pNVar7->assignment_list + 1);
|
|
||||||
} while (uVar2 != uVar5);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
for (std::size_t i = 0; i < list_size; i++) {
|
||||||
void NpadAbstractedPadHolder::DetachAbstractedPad()
|
if (assignment_list[i].controller_id != controller_id) {
|
||||||
|
continue;
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
param_1->object_size = uVar3 - 1;
|
for (std::size_t e = i+1; e < list_size; e++) {
|
||||||
*(u64*)(&DAT_ffffffffffffffe8 + (u64)(param_1->assignment_list + (int)uVar3)) = 0;
|
assignment_list[e - 1] = assignment_list[e];
|
||||||
*(undefined2*)((u64)(param_1->assignment_list + (int)uVar3 + -1) + 8) = 0;
|
|
||||||
uVar1 = param_1->object_size;
|
|
||||||
}
|
}
|
||||||
|
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;
|
void NpadAbstractedPadHolder::DetachAbstractedPad() {
|
||||||
*(undefined2*)((u64)(param_1->assignment_list + (int)uVar4 + -1) + 8) = 0;
|
while (list_size > 0) {
|
||||||
return lVar2;
|
for (std::size_t i = 1; i < list_size; i++) {
|
||||||
|
assignment_list[i - 1] = assignment_list[i];
|
||||||
}
|
}
|
||||||
uVar6 = uVar6 + 1;
|
list_size--;
|
||||||
pNVar8 = (NpadAbstractAssignmentMode*)(pNVar8->assignment_list + 1);
|
|
||||||
} while (uVar4 != uVar6);
|
|
||||||
}
|
}
|
||||||
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)
|
int NpadAbstractedPadHolder::FUN_710005db00(u64 param_2)
|
||||||
|
@ -203,28 +86,28 @@ int NpadAbstractedPadHolder::FUN_710005db00(u64 param_2)
|
||||||
u64 uVar10;
|
u64 uVar10;
|
||||||
u64 uVar11;
|
u64 uVar11;
|
||||||
|
|
||||||
uVar5 = param_1->object_size;
|
uVar5 = list_size;
|
||||||
if ((int)uVar5 < 1) {
|
if ((int)uVar5 < 1) {
|
||||||
iVar3 = 0;
|
iVar3 = 0;
|
||||||
} else {
|
} else {
|
||||||
uVar4 = 0;
|
uVar4 = 0;
|
||||||
iVar3 = 0;
|
iVar3 = 0;
|
||||||
do {
|
do {
|
||||||
while (((*(byte*)(*(u64*)(param_1->assignment_list + (int)uVar4) + 8) >> 1 & 1) == 0 ||
|
while (((*(byte*)(*(u64*)(assignment_list + (int)uVar4) + 8) >> 1 & 1) == 0 ||
|
||||||
(*(u64*)(*(u64*)(param_1->assignment_list + (int)uVar4) + 0x10) !=
|
(*(u64*)(*(u64*)(assignment_list + (int)uVar4) + 0x10) !=
|
||||||
*(u64*)¶m_1->assignment_list[(int)uVar4].field_0x10))) {
|
*(u64*)&assignment_list[(int)uVar4].field_0x10))) {
|
||||||
if ((int)uVar4 < 0) {
|
if ((int)uVar4 < 0) {
|
||||||
// WARNING: Subroutine does not return
|
// WARNING: Subroutine does not return
|
||||||
nn::diag::detail::AbortImpl();
|
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) {
|
if ((int)(uVar4 + 1) < (int)uVar5) {
|
||||||
uVar8 = (uu64)uVar4;
|
uVar8 = (uu64)uVar4;
|
||||||
pNVar7 = param_1->assignment_list + uVar8 + 1;
|
pNVar7 = assignment_list + uVar8 + 1;
|
||||||
do {
|
do {
|
||||||
uVar9 = *(u64*)pNVar7;
|
uVar9 = *(u64*)pNVar7;
|
||||||
uVar10 = *(u64*)&pNVar7->field_0x8;
|
uVar10 = *(u64*)&pNVar7->field_0x8;
|
||||||
pNVar6 = param_1->assignment_list + (int)uVar8;
|
pNVar6 = assignment_list + (int)uVar8;
|
||||||
uVar11 = *(u64*)&pNVar7->field_0x10;
|
uVar11 = *(u64*)&pNVar7->field_0x10;
|
||||||
pNVar7 = pNVar7 + 1;
|
pNVar7 = pNVar7 + 1;
|
||||||
*(u64*)pNVar6 = uVar9;
|
*(u64*)pNVar6 = uVar9;
|
||||||
|
@ -232,15 +115,15 @@ int NpadAbstractedPadHolder::FUN_710005db00(u64 param_2)
|
||||||
*(u64*)&pNVar6->field_0x10 = uVar11;
|
*(u64*)&pNVar6->field_0x10 = uVar11;
|
||||||
lVar1 = uVar8 + 2;
|
lVar1 = uVar8 + 2;
|
||||||
uVar8 = uVar8 + 1;
|
uVar8 = uVar8 + 1;
|
||||||
uVar5 = param_1->object_size;
|
uVar5 = list_size;
|
||||||
} while (lVar1 < (int)uVar5);
|
} while (lVar1 < (int)uVar5);
|
||||||
}
|
}
|
||||||
param_1->object_size = uVar5 - 1;
|
list_size = uVar5 - 1;
|
||||||
*(u64*)(&DAT_ffffffffffffffe8 + (u64)(param_1->assignment_list + (int)uVar5)) = 0;
|
*(u64*)(&DAT_ffffffffffffffe8 + (u64)(assignment_list + (int)uVar5)) = 0;
|
||||||
*(undefined2*)((u64)(param_1->assignment_list + (int)uVar5 + -1) + 8) = 0;
|
*(undefined2*)((u64)(assignment_list + (int)uVar5 + -1) + 8) = 0;
|
||||||
*(undefined2*)(param_2 + (u64)iVar3 * 2) = uVar2;
|
*(undefined2*)(param_2 + (u64)iVar3 * 2) = uVar2;
|
||||||
iVar3 = iVar3 + 1;
|
iVar3 = iVar3 + 1;
|
||||||
uVar5 = param_1->object_size;
|
uVar5 = list_size;
|
||||||
if ((int)uVar5 <= (int)uVar4) {
|
if ((int)uVar5 <= (int)uVar4) {
|
||||||
return iVar3;
|
return iVar3;
|
||||||
}
|
}
|
||||||
|
@ -261,17 +144,17 @@ bool NpadAbstractedPadHolder::FUN_710005dc00(u64* param_2)
|
||||||
u64 lVar5;
|
u64 lVar5;
|
||||||
uu64 uVar6;
|
uu64 uVar6;
|
||||||
|
|
||||||
uVar1 = param_1->object_size;
|
uVar1 = list_size;
|
||||||
if (uVar1 == 0) {
|
if (uVar1 == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
lVar5 = *param_2;
|
lVar5 = *param_2;
|
||||||
bVar3 = false;
|
bVar3 = false;
|
||||||
if ((lVar5 != 0) && (0 < (int)uVar1)) {
|
if ((lVar5 != 0) && (0 < (int)uVar1)) {
|
||||||
if (*(u64*)(*(u64*)param_1->assignment_list + 0x10) == lVar5) {
|
if (*(u64*)(*(u64*)assignment_list + 0x10) == lVar5) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pNVar4 = param_1->assignment_list;
|
pNVar4 = assignment_list;
|
||||||
uVar2 = 1;
|
uVar2 = 1;
|
||||||
do {
|
do {
|
||||||
uVar6 = uVar2;
|
uVar6 = uVar2;
|
||||||
|
@ -316,7 +199,7 @@ u32 NpadAbstractedPadHolder::FUN_710005dd60() {
|
||||||
uu64 uVar5;
|
uu64 uVar5;
|
||||||
AbstracAssignmentMode* pNVar6;
|
AbstracAssignmentMode* pNVar6;
|
||||||
|
|
||||||
uVar1 = param_1->object_size;
|
uVar1 = list_size;
|
||||||
if (0 < (int)uVar1) {
|
if (0 < (int)uVar1) {
|
||||||
if (uVar1 == 1) {
|
if (uVar1 == 1) {
|
||||||
uVar5 = 0;
|
uVar5 = 0;
|
||||||
|
@ -334,7 +217,7 @@ u32 NpadAbstractedPadHolder::FUN_710005dd60() {
|
||||||
} while (((uu64)uVar1 & 0xfffffffe) != uVar5);
|
} while (((uu64)uVar1 & 0xfffffffe) != uVar5);
|
||||||
}
|
}
|
||||||
if ((uVar1 & 1) != 0) {
|
if ((uVar1 & 1) != 0) {
|
||||||
uVar4 = *(u32*)(*(u64*)(param_1->assignment_list + uVar5) + 0x40) | uVar4;
|
uVar4 = *(u32*)(*(u64*)(assignment_list + uVar5) + 0x40) | uVar4;
|
||||||
}
|
}
|
||||||
return uVar4;
|
return uVar4;
|
||||||
}
|
}
|
||||||
|
@ -351,7 +234,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005ddf0()
|
||||||
NpadAbstractAssignmentModeList* list2;
|
NpadAbstractAssignmentModeList* list2;
|
||||||
NpadAbstractAssignmentModeList* list_1;
|
NpadAbstractAssignmentModeList* list_1;
|
||||||
|
|
||||||
uVar1 = param_1->object_size;
|
uVar1 = list_size;
|
||||||
if (0 < (int)uVar1) {
|
if (0 < (int)uVar1) {
|
||||||
if (uVar1 == 1) {
|
if (uVar1 == 1) {
|
||||||
uVar3 = 0;
|
uVar3 = 0;
|
||||||
|
@ -370,8 +253,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005ddf0()
|
||||||
} while (((uu64)uVar1 & 0xfffffffe) != uVar3);
|
} while (((uu64)uVar1 & 0xfffffffe) != uVar3);
|
||||||
}
|
}
|
||||||
if ((uVar1 & 1) != 0) {
|
if ((uVar1 & 1) != 0) {
|
||||||
uVar2 =
|
uVar2 = *(uu64*)(*(u64*)(*(u64*)(assignment_list + uVar3) + 0x48) + 0x10) | uVar2;
|
||||||
*(uu64*)(*(u64*)(*(u64*)(param_1->assignment_list + uVar3) + 0x48) + 0x10) | uVar2;
|
|
||||||
}
|
}
|
||||||
return uVar2;
|
return uVar2;
|
||||||
}
|
}
|
||||||
|
@ -388,7 +270,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005de90()
|
||||||
uu64 uVar5;
|
uu64 uVar5;
|
||||||
NpadAbstractAssignmentMode* pNVar6;
|
NpadAbstractAssignmentMode* pNVar6;
|
||||||
|
|
||||||
uVar1 = param_1->object_size;
|
uVar1 = list_size;
|
||||||
if (0 < (int)uVar1) {
|
if (0 < (int)uVar1) {
|
||||||
if (uVar1 == 1) {
|
if (uVar1 == 1) {
|
||||||
uVar5 = 0;
|
uVar5 = 0;
|
||||||
|
@ -407,7 +289,7 @@ uu64 NpadAbstractedPadHolder::FUN_710005de90()
|
||||||
} while (((uu64)uVar1 & 0xfffffffe) != uVar5);
|
} while (((uu64)uVar1 & 0xfffffffe) != uVar5);
|
||||||
}
|
}
|
||||||
if ((uVar1 & 1) != 0) {
|
if ((uVar1 & 1) != 0) {
|
||||||
uVar4 = *(uu64*)(*(u64*)(param_1->assignment_list + uVar5) + 0x38) | uVar4;
|
uVar4 = *(uu64*)(*(u64*)(assignment_list + uVar5) + 0x38) | uVar4;
|
||||||
}
|
}
|
||||||
return uVar4;
|
return uVar4;
|
||||||
}
|
}
|
||||||
|
@ -423,8 +305,8 @@ int NpadAbstractedPadHolder::GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg
|
||||||
NpadAbstractAssignmentMode* pNVar2;
|
NpadAbstractAssignmentMode* pNVar2;
|
||||||
u32 some_value;
|
u32 some_value;
|
||||||
|
|
||||||
some_value = param_1->object_size;
|
some_value = list_size;
|
||||||
if ((int)arg_size <= (int)param_1->object_size) {
|
if ((int)arg_size <= (int)list_size) {
|
||||||
some_value = arg_size;
|
some_value = arg_size;
|
||||||
}
|
}
|
||||||
if (0 < (int)some_value) {
|
if (0 < (int)some_value) {
|
||||||
|
@ -438,8 +320,8 @@ int NpadAbstractedPadHolder::GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg
|
||||||
object_count = object_count + 1;
|
object_count = object_count + 1;
|
||||||
}
|
}
|
||||||
index = index + 1;
|
index = index + 1;
|
||||||
some_value = param_1->object_size;
|
some_value = list_size;
|
||||||
if ((int)arg_size <= (int)param_1->object_size) {
|
if ((int)arg_size <= (int)list_size) {
|
||||||
some_value = arg_size;
|
some_value = arg_size;
|
||||||
}
|
}
|
||||||
pNVar2 = (NpadAbstractAssignmentMode*)(pNVar2->assignment_list + 1);
|
pNVar2 = (NpadAbstractAssignmentMode*)(pNVar2->assignment_list + 1);
|
||||||
|
|
|
@ -13,19 +13,24 @@
|
||||||
#include "core/hle/service/hid/controllers/types/npad_types.h"
|
#include "core/hle/service/hid/controllers/types/npad_types.h"
|
||||||
|
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
|
class IAbstractedPad;
|
||||||
|
|
||||||
struct AbstracAssignmentMode {
|
struct AbstracAssignmentHolder {
|
||||||
Core::HID::NpadStyleIndex style_index;
|
IAbstractedPad* abstracted_pad;
|
||||||
u8 element_a;
|
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
|
/// This is nn::hid::server::NpadAbstractedPadHolder
|
||||||
class NpadAbstractedPadHolder final {
|
class NpadAbstractedPadHolder final {
|
||||||
public:
|
public:
|
||||||
Result FUN_710005d81c(u64 param_2);
|
Result RegisterAbstractPad(IAbstractedPad* abstracted_pad);
|
||||||
void FUN_710005d8f0(u64* param_2);
|
void RemoveAbstractPadByControllerId(u64 controller_id);
|
||||||
void DetachAbstractedPad();
|
void DetachAbstractedPad();
|
||||||
u64 FUN_710005da30(u32* param_2);
|
u64 RemoveAbstractPadByAssignmentStyle(Service::HID::AssignmentStyle assignment_style);
|
||||||
int FUN_710005db00(u64 param_2);
|
int FUN_710005db00(u64 param_2);
|
||||||
bool FUN_710005dc00(u64* param_2);
|
bool FUN_710005dc00(u64* param_2);
|
||||||
u32 GetAbstractedPads(std::span<IAbstractedPad*> list);
|
u32 GetAbstractedPads(std::span<IAbstractedPad*> list);
|
||||||
|
@ -40,7 +45,7 @@ public:
|
||||||
int GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg_size);
|
int GetAbstractedPadIdDataFromNpad(u64 out_arg, u32 arg_size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::array<AbstracAssignmentMode, 5> assignment_list{};
|
std::array<AbstracAssignmentHolder, 5> assignment_list{};
|
||||||
u32 list_size{};
|
u32 list_size{};
|
||||||
NpadJoyAssignmentMode assignment_mode{NpadJoyAssignmentMode::Dual};
|
NpadJoyAssignmentMode assignment_mode{NpadJoyAssignmentMode::Dual};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue