service: hid: Implement GetPlayerLedPattern accurately
This commit is contained in:
		| @@ -8,6 +8,7 @@ | ||||
| #include "core/hle/kernel/k_shared_memory.h" | ||||
| #include "core/hle/kernel/k_transfer_memory.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/hid/hid_server.h" | ||||
| #include "core/hle/service/ipc_helpers.h" | ||||
| #include "core/memory.h" | ||||
| @@ -153,7 +154,7 @@ IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> r | ||||
|         {104, &IHidServer::DeactivateNpad, "DeactivateNpad"}, | ||||
|         {106, &IHidServer::AcquireNpadStyleSetUpdateEventHandle, "AcquireNpadStyleSetUpdateEventHandle"}, | ||||
|         {107, &IHidServer::DisconnectNpad, "DisconnectNpad"}, | ||||
|         {108, &IHidServer::GetPlayerLedPattern, "GetPlayerLedPattern"}, | ||||
|         {108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"}, | ||||
|         {109, &IHidServer::ActivateNpadWithRevision, "ActivateNpadWithRevision"}, | ||||
|         {120, &IHidServer::SetNpadJoyHoldType, "SetNpadJoyHoldType"}, | ||||
|         {121, &IHidServer::GetNpadJoyHoldType, "GetNpadJoyHoldType"}, | ||||
| @@ -1136,19 +1137,39 @@ void IHidServer::DisconnectNpad(HLERequestContext& ctx) { | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void IHidServer::GetPlayerLedPattern(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto npad_id{rp.PopEnum<Core::HID::NpadIdType>()}; | ||||
|  | ||||
|     Core::HID::LedPattern pattern{0, 0, 0, 0}; | ||||
|     auto controller = GetResourceManager()->GetNpad(); | ||||
|     const auto result = controller->GetLedPattern(npad_id, pattern); | ||||
|  | ||||
| Result IHidServer::GetPlayerLedPattern(Out<Core::HID::LedPattern> out_led_pattern, | ||||
|                                        Core::HID::NpadIdType npad_id) { | ||||
|     LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 4}; | ||||
|     rb.Push(result); | ||||
|     rb.Push(pattern.raw); | ||||
|     switch (npad_id) { | ||||
|     case Core::HID::NpadIdType::Player1: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 0, 0, 0}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player2: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 1, 0, 0}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player3: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 1, 1, 0}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player4: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 1, 1, 1}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player5: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 0, 0, 1}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player6: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 0, 1, 0}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player7: | ||||
|         *out_led_pattern = Core::HID::LedPattern{1, 0, 1, 1}; | ||||
|         R_SUCCEED(); | ||||
|     case Core::HID::NpadIdType::Player8: | ||||
|         *out_led_pattern = Core::HID::LedPattern{0, 1, 1, 0}; | ||||
|         R_SUCCEED(); | ||||
|     default: | ||||
|         *out_led_pattern = Core::HID::LedPattern{0, 0, 0, 0}; | ||||
|         R_SUCCEED(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void IHidServer::ActivateNpadWithRevision(HLERequestContext& ctx) { | ||||
|   | ||||
| @@ -3,7 +3,9 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "hid_core/hid_types.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| @@ -66,7 +68,8 @@ private: | ||||
|     void DeactivateNpad(HLERequestContext& ctx); | ||||
|     void AcquireNpadStyleSetUpdateEventHandle(HLERequestContext& ctx); | ||||
|     void DisconnectNpad(HLERequestContext& ctx); | ||||
|     void GetPlayerLedPattern(HLERequestContext& ctx); | ||||
|     Result GetPlayerLedPattern(Out<Core::HID::LedPattern> out_led_pattern, | ||||
|                                Core::HID::NpadIdType npad_id); | ||||
|     void ActivateNpadWithRevision(HLERequestContext& ctx); | ||||
|     void SetNpadJoyHoldType(HLERequestContext& ctx); | ||||
|     void GetNpadJoyHoldType(HLERequestContext& ctx); | ||||
|   | ||||
| @@ -422,7 +422,10 @@ struct NpadPowerInfo { | ||||
| static_assert(sizeof(NpadPowerInfo) == 0xC, "NpadPowerInfo is an invalid size"); | ||||
|  | ||||
| struct LedPattern { | ||||
|     explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) { | ||||
|     LedPattern() { | ||||
|         raw = 0; | ||||
|     } | ||||
|     LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) { | ||||
|         position1.Assign(light1); | ||||
|         position2.Assign(light2); | ||||
|         position3.Assign(light3); | ||||
|   | ||||
| @@ -956,17 +956,6 @@ Result NPad::SwapNpadAssignment(u64 aruid, Core::HID::NpadIdType npad_id_1, | ||||
|     return ResultSuccess; | ||||
| } | ||||
|  | ||||
| Result NPad::GetLedPattern(Core::HID::NpadIdType npad_id, Core::HID::LedPattern& pattern) const { | ||||
|     if (!IsNpadIdValid(npad_id)) { | ||||
|         LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); | ||||
|         return ResultInvalidNpadId; | ||||
|     } | ||||
|     const auto aruid = applet_resource_holder.applet_resource->GetActiveAruid(); | ||||
|     const auto& controller = GetControllerFromNpadIdType(aruid, npad_id).device; | ||||
|     pattern = controller->GetLedPattern(); | ||||
|     return ResultSuccess; | ||||
| } | ||||
|  | ||||
| Result NPad::IsUnintendedHomeButtonInputProtectionEnabled(bool& out_is_enabled, u64 aruid, | ||||
|                                                           Core::HID::NpadIdType npad_id) const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|   | ||||
| @@ -97,8 +97,6 @@ public: | ||||
|     Result ResetIsSixAxisSensorDeviceNewlyAssigned( | ||||
|         u64 aruid, const Core::HID::SixAxisSensorHandle& sixaxis_handle); | ||||
|  | ||||
|     Result GetLedPattern(Core::HID::NpadIdType npad_id, Core::HID::LedPattern& pattern) const; | ||||
|  | ||||
|     Result IsUnintendedHomeButtonInputProtectionEnabled(bool& out_is_enabled, u64 aruid, | ||||
|                                                         Core::HID::NpadIdType npad_id) const; | ||||
|     Result EnableUnintendedHomeButtonInputProtection(u64 aruid, Core::HID::NpadIdType npad_id, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user