mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-12-18 19:41:01 +01:00
Merge pull request #12600 from german77/npad-impl
service: hid: Hook interface implementations
This commit is contained in:
commit
2a4ac7cfac
5 changed files with 129 additions and 21 deletions
|
@ -1444,8 +1444,8 @@ void IHidServer::SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx) {
|
||||||
|
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, use_center_clamp={}, applet_resource_user_id={}",
|
LOG_INFO(Service_HID, "called, use_center_clamp={}, applet_resource_user_id={}",
|
||||||
parameters.use_center_clamp, parameters.applet_resource_user_id);
|
parameters.use_center_clamp, parameters.applet_resource_user_id);
|
||||||
|
|
||||||
GetResourceManager()->GetNpad()->SetNpadAnalogStickUseCenterClamp(
|
GetResourceManager()->GetNpad()->SetNpadAnalogStickUseCenterClamp(
|
||||||
parameters.applet_resource_user_id, parameters.use_center_clamp);
|
parameters.applet_resource_user_id, parameters.use_center_clamp);
|
||||||
|
@ -1466,23 +1466,27 @@ void IHidServer::SetNpadCaptureButtonAssignment(HLERequestContext& ctx) {
|
||||||
|
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
LOG_WARNING(Service_HID,
|
LOG_INFO(Service_HID, "called, npad_styleset={}, applet_resource_user_id={}, button={}",
|
||||||
"(STUBBED) called, npad_styleset={}, applet_resource_user_id={}, button={}",
|
parameters.npad_styleset, parameters.applet_resource_user_id, parameters.button);
|
||||||
parameters.npad_styleset, parameters.applet_resource_user_id, parameters.button);
|
|
||||||
|
const auto result = GetResourceManager()->GetNpad()->SetNpadCaptureButtonAssignment(
|
||||||
|
parameters.applet_resource_user_id, parameters.npad_styleset, parameters.button);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::ClearNpadCaptureButtonAssignment(HLERequestContext& ctx) {
|
void IHidServer::ClearNpadCaptureButtonAssignment(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
applet_resource_user_id);
|
|
||||||
|
const auto result =
|
||||||
|
GetResourceManager()->GetNpad()->ClearNpadCaptureButtonAssignment(applet_resource_user_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) {
|
void IHidServer::GetVibrationDeviceInfo(HLERequestContext& ctx) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
|
||||||
{310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
|
{310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
|
||||||
{311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
|
{311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
|
||||||
{312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
|
{312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
|
||||||
{313, nullptr, "GetNpadCaptureButtonAssignment"},
|
{313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"},
|
||||||
{314, nullptr, "GetAppletFooterUiType"},
|
{314, nullptr, "GetAppletFooterUiType"},
|
||||||
{315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
|
{315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
|
||||||
{316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
|
{316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
|
||||||
|
@ -54,8 +54,8 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
|
||||||
{318, &IHidSystemServer::HasBattery, "HasBattery"},
|
{318, &IHidSystemServer::HasBattery, "HasBattery"},
|
||||||
{319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
|
{319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
|
||||||
{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
|
{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
|
||||||
{322, &IHidSystemServer::GetIrSensorState, "GetIrSensorState"},
|
{322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"},
|
||||||
{323, nullptr, "GetXcdHandleForNpadWithIrSensor"},
|
{323, nullptr, "GetLastActiveUniquePad"},
|
||||||
{324, nullptr, "GetUniquePadButtonSet"},
|
{324, nullptr, "GetUniquePadButtonSet"},
|
||||||
{325, nullptr, "GetUniquePadColor"},
|
{325, nullptr, "GetUniquePadColor"},
|
||||||
{326, nullptr, "GetUniquePadAppletDetailedUiType"},
|
{326, nullptr, "GetUniquePadAppletDetailedUiType"},
|
||||||
|
@ -251,25 +251,38 @@ void IHidSystemServer::ApplyNpadSystemCommonPolicy(HLERequestContext& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidSystemServer::EnableAssigningSingleOnSlSrPress(HLERequestContext& ctx) {
|
void IHidSystemServer::EnableAssigningSingleOnSlSrPress(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called");
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
GetResourceManager()->GetNpad()->AssigningSingleOnSlSrPress(applet_resource_user_id, true);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidSystemServer::DisableAssigningSingleOnSlSrPress(HLERequestContext& ctx) {
|
void IHidSystemServer::DisableAssigningSingleOnSlSrPress(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called");
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
GetResourceManager()->GetNpad()->AssigningSingleOnSlSrPress(applet_resource_user_id, false);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidSystemServer::GetLastActiveNpad(HLERequestContext& ctx) {
|
void IHidSystemServer::GetLastActiveNpad(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_HID, "(STUBBED) called"); // Spams a lot when controller applet is running
|
Core::HID::NpadIdType npad_id{};
|
||||||
|
const Result result = GetResourceManager()->GetNpad()->GetLastActiveNpad(npad_id);
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
rb.Push(0); // Dont forget to fix this
|
rb.PushEnum(npad_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidSystemServer::ApplyNpadSystemCommonPolicyFull(HLERequestContext& ctx) {
|
void IHidSystemServer::ApplyNpadSystemCommonPolicyFull(HLERequestContext& ctx) {
|
||||||
|
@ -331,6 +344,27 @@ void IHidSystemServer::SetSupportedNpadStyleSetAll(HLERequestContext& ctx) {
|
||||||
rb.Push(result);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IHidSystemServer::GetNpadCaptureButtonAssignment(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
const auto capture_button_list_size{ctx.GetWriteBufferNumElements<Core::HID::NpadButton>()};
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
std::vector<Core::HID::NpadButton> capture_button_list(capture_button_list_size);
|
||||||
|
const auto& npad = GetResourceManager()->GetNpad();
|
||||||
|
const u64 list_size =
|
||||||
|
npad->GetNpadCaptureButtonAssignment(capture_button_list, applet_resource_user_id);
|
||||||
|
|
||||||
|
if (list_size != 0) {
|
||||||
|
ctx.WriteBuffer(capture_button_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 4};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(list_size);
|
||||||
|
}
|
||||||
|
|
||||||
void IHidSystemServer::GetAppletDetailedUiType(HLERequestContext& ctx) {
|
void IHidSystemServer::GetAppletDetailedUiType(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
|
const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
|
||||||
|
@ -423,13 +457,25 @@ void IHidSystemServer::GetUniquePadsFromNpad(HLERequestContext& ctx) {
|
||||||
rb.Push(static_cast<u32>(unique_pads.size()));
|
rb.Push(static_cast<u32>(unique_pads.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidSystemServer::GetIrSensorState(HLERequestContext& ctx) {
|
void IHidSystemServer::SetNpadSystemExtStateEnabled(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
|
struct Parameters {
|
||||||
|
bool is_enabled;
|
||||||
|
INSERT_PADDING_BYTES_NOINIT(7);
|
||||||
|
u64 applet_resource_user_id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called");
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
|
LOG_INFO(Service_HID, "called, is_enabled={}, applet_resource_user_id={}",
|
||||||
|
parameters.is_enabled, parameters.applet_resource_user_id);
|
||||||
|
|
||||||
|
const auto result = GetResourceManager()->GetNpad()->SetNpadSystemExtStateEnabled(
|
||||||
|
parameters.applet_resource_user_id, parameters.is_enabled);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
void IHidSystemServer::RegisterAppletResourceUserId(HLERequestContext& ctx) {
|
void IHidSystemServer::RegisterAppletResourceUserId(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
|
|
|
@ -31,13 +31,14 @@ private:
|
||||||
void GetNpadFullKeyGripColor(HLERequestContext& ctx);
|
void GetNpadFullKeyGripColor(HLERequestContext& ctx);
|
||||||
void GetMaskedSupportedNpadStyleSet(HLERequestContext& ctx);
|
void GetMaskedSupportedNpadStyleSet(HLERequestContext& ctx);
|
||||||
void SetSupportedNpadStyleSetAll(HLERequestContext& ctx);
|
void SetSupportedNpadStyleSetAll(HLERequestContext& ctx);
|
||||||
|
void GetNpadCaptureButtonAssignment(HLERequestContext& ctx);
|
||||||
void GetAppletDetailedUiType(HLERequestContext& ctx);
|
void GetAppletDetailedUiType(HLERequestContext& ctx);
|
||||||
void GetNpadInterfaceType(HLERequestContext& ctx);
|
void GetNpadInterfaceType(HLERequestContext& ctx);
|
||||||
void GetNpadLeftRightInterfaceType(HLERequestContext& ctx);
|
void GetNpadLeftRightInterfaceType(HLERequestContext& ctx);
|
||||||
void HasBattery(HLERequestContext& ctx);
|
void HasBattery(HLERequestContext& ctx);
|
||||||
void HasLeftRightBattery(HLERequestContext& ctx);
|
void HasLeftRightBattery(HLERequestContext& ctx);
|
||||||
void GetUniquePadsFromNpad(HLERequestContext& ctx);
|
void GetUniquePadsFromNpad(HLERequestContext& ctx);
|
||||||
void GetIrSensorState(HLERequestContext& ctx);
|
void SetNpadSystemExtStateEnabled(HLERequestContext& ctx);
|
||||||
void RegisterAppletResourceUserId(HLERequestContext& ctx);
|
void RegisterAppletResourceUserId(HLERequestContext& ctx);
|
||||||
void UnregisterAppletResourceUserId(HLERequestContext& ctx);
|
void UnregisterAppletResourceUserId(HLERequestContext& ctx);
|
||||||
void EnableAppletToGetInput(HLERequestContext& ctx);
|
void EnableAppletToGetInput(HLERequestContext& ctx);
|
||||||
|
|
|
@ -1344,4 +1344,49 @@ AppletDetailedUiType NPad::GetAppletDetailedUiType(Core::HID::NpadIdType npad_id
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result NPad::SetNpadCaptureButtonAssignment(u64 aruid, Core::HID::NpadStyleSet npad_style_set,
|
||||||
|
Core::HID::NpadButton button_assignment) {
|
||||||
|
std::scoped_lock lock{mutex};
|
||||||
|
return npad_resource.SetNpadCaptureButtonAssignment(aruid, npad_style_set, button_assignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result NPad::ClearNpadCaptureButtonAssignment(u64 aruid) {
|
||||||
|
std::scoped_lock lock{mutex};
|
||||||
|
return npad_resource.ClearNpadCaptureButtonAssignment(aruid);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t NPad::GetNpadCaptureButtonAssignment(std::span<Core::HID::NpadButton> out_list,
|
||||||
|
u64 aruid) const {
|
||||||
|
std::scoped_lock lock{mutex};
|
||||||
|
return npad_resource.GetNpadCaptureButtonAssignment(out_list, aruid);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result NPad::SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled) {
|
||||||
|
std::scoped_lock lock{mutex};
|
||||||
|
const auto result = npad_resource.SetNpadSystemExtStateEnabled(aruid, is_enabled);
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex};
|
||||||
|
// TODO: abstracted_pad->EnableAppletToGetInput(aruid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result NPad::AssigningSingleOnSlSrPress(u64 aruid, bool is_enabled) {
|
||||||
|
std::scoped_lock lock{mutex};
|
||||||
|
bool is_currently_enabled{};
|
||||||
|
Result result = npad_resource.IsAssigningSingleOnSlSrPressEnabled(is_currently_enabled, aruid);
|
||||||
|
if (result.IsSuccess() && is_enabled != is_currently_enabled) {
|
||||||
|
result = npad_resource.SetAssigningSingleOnSlSrPress(aruid, is_enabled);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result NPad::GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const {
|
||||||
|
std::scoped_lock lock{mutex};
|
||||||
|
out_npad_id = hid_core.GetLastActiveController();
|
||||||
|
return ResultSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::HID
|
} // namespace Service::HID
|
||||||
|
|
|
@ -149,6 +149,18 @@ public:
|
||||||
|
|
||||||
AppletDetailedUiType GetAppletDetailedUiType(Core::HID::NpadIdType npad_id);
|
AppletDetailedUiType GetAppletDetailedUiType(Core::HID::NpadIdType npad_id);
|
||||||
|
|
||||||
|
Result SetNpadCaptureButtonAssignment(u64 aruid, Core::HID::NpadStyleSet npad_style_set,
|
||||||
|
Core::HID::NpadButton button_assignment);
|
||||||
|
Result ClearNpadCaptureButtonAssignment(u64 aruid);
|
||||||
|
std::size_t GetNpadCaptureButtonAssignment(std::span<Core::HID::NpadButton> out_list,
|
||||||
|
u64 aruid) const;
|
||||||
|
|
||||||
|
Result SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled);
|
||||||
|
|
||||||
|
Result AssigningSingleOnSlSrPress(u64 aruid, bool is_enabled);
|
||||||
|
|
||||||
|
Result GetLastActiveNpad(Core::HID::NpadIdType& out_npad_id) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct VibrationData {
|
struct VibrationData {
|
||||||
bool device_mounted{};
|
bool device_mounted{};
|
||||||
|
|
Loading…
Reference in a new issue