diff options
| author | 2022-05-21 16:29:41 -0500 | |
|---|---|---|
| committer | 2022-05-27 10:21:09 -0500 | |
| commit | 7aa1d10655c769c9d2a32d65a810ad81eefe7ead (patch) | |
| tree | a829187ae6e99d9e76405369531d20b2b1d3daf2 | |
| parent | service: hid: Quick RE fixes and comments (diff) | |
| download | yuzu-7aa1d10655c769c9d2a32d65a810ad81eefe7ead.tar.gz yuzu-7aa1d10655c769c9d2a32d65a810ad81eefe7ead.tar.xz yuzu-7aa1d10655c769c9d2a32d65a810ad81eefe7ead.zip | |
service: hid: Add error handling to setNpadAssignment and variants
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 24 |
3 files changed, 27 insertions, 23 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 147021fbd..5df49d22f 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -701,11 +701,12 @@ Controller_NPad::NpadCommunicationMode Controller_NPad::GetNpadCommunicationMode | |||
| 701 | return communication_mode; | 701 | return communication_mode; |
| 702 | } | 702 | } |
| 703 | 703 | ||
| 704 | void Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type, | 704 | ResultCode Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, |
| 705 | NpadJoyAssignmentMode assignment_mode) { | 705 | NpadJoyDeviceType npad_device_type, |
| 706 | NpadJoyAssignmentMode assignment_mode) { | ||
| 706 | if (!IsNpadIdValid(npad_id)) { | 707 | if (!IsNpadIdValid(npad_id)) { |
| 707 | LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); | 708 | LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); |
| 708 | return; | 709 | return InvalidNpadId; |
| 709 | } | 710 | } |
| 710 | 711 | ||
| 711 | auto& controller = GetControllerFromNpadIdType(npad_id); | 712 | auto& controller = GetControllerFromNpadIdType(npad_id); |
| @@ -714,7 +715,7 @@ void Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceTy | |||
| 714 | } | 715 | } |
| 715 | 716 | ||
| 716 | if (!controller.device->IsConnected()) { | 717 | if (!controller.device->IsConnected()) { |
| 717 | return; | 718 | return ResultSuccess; |
| 718 | } | 719 | } |
| 719 | 720 | ||
| 720 | if (assignment_mode == NpadJoyAssignmentMode::Dual) { | 721 | if (assignment_mode == NpadJoyAssignmentMode::Dual) { |
| @@ -723,34 +724,34 @@ void Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceTy | |||
| 723 | controller.is_dual_left_connected = true; | 724 | controller.is_dual_left_connected = true; |
| 724 | controller.is_dual_right_connected = false; | 725 | controller.is_dual_right_connected = false; |
| 725 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); | 726 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
| 726 | return; | 727 | return ResultSuccess; |
| 727 | } | 728 | } |
| 728 | if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight) { | 729 | if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight) { |
| 729 | DisconnectNpad(npad_id); | 730 | DisconnectNpad(npad_id); |
| 730 | controller.is_dual_left_connected = false; | 731 | controller.is_dual_left_connected = false; |
| 731 | controller.is_dual_right_connected = true; | 732 | controller.is_dual_right_connected = true; |
| 732 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); | 733 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
| 733 | return; | 734 | return ResultSuccess; |
| 734 | } | 735 | } |
| 735 | return; | 736 | return ResultSuccess; |
| 736 | } | 737 | } |
| 737 | 738 | ||
| 738 | // This is for NpadJoyAssignmentMode::Single | 739 | // This is for NpadJoyAssignmentMode::Single |
| 739 | 740 | ||
| 740 | // Only JoyconDual get affected by this function | 741 | // Only JoyconDual get affected by this function |
| 741 | if (controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::JoyconDual) { | 742 | if (controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::JoyconDual) { |
| 742 | return; | 743 | return ResultSuccess; |
| 743 | } | 744 | } |
| 744 | 745 | ||
| 745 | if (controller.is_dual_left_connected && !controller.is_dual_right_connected) { | 746 | if (controller.is_dual_left_connected && !controller.is_dual_right_connected) { |
| 746 | DisconnectNpad(npad_id); | 747 | DisconnectNpad(npad_id); |
| 747 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); | 748 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
| 748 | return; | 749 | return ResultSuccess; |
| 749 | } | 750 | } |
| 750 | if (!controller.is_dual_left_connected && controller.is_dual_right_connected) { | 751 | if (!controller.is_dual_left_connected && controller.is_dual_right_connected) { |
| 751 | DisconnectNpad(npad_id); | 752 | DisconnectNpad(npad_id); |
| 752 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); | 753 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
| 753 | return; | 754 | return ResultSuccess; |
| 754 | } | 755 | } |
| 755 | 756 | ||
| 756 | // We have two controllers connected to the same npad_id we need to split them | 757 | // We have two controllers connected to the same npad_id we need to split them |
| @@ -768,6 +769,7 @@ void Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceTy | |||
| 768 | controller_2.is_dual_right_connected = false; | 769 | controller_2.is_dual_right_connected = false; |
| 769 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_2, true); | 770 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_2, true); |
| 770 | } | 771 | } |
| 772 | return ResultSuccess; | ||
| 771 | } | 773 | } |
| 772 | 774 | ||
| 773 | bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, | 775 | bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 31364a420..f03e9294d 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -107,8 +107,8 @@ public: | |||
| 107 | void SetNpadCommunicationMode(NpadCommunicationMode communication_mode_); | 107 | void SetNpadCommunicationMode(NpadCommunicationMode communication_mode_); |
| 108 | NpadCommunicationMode GetNpadCommunicationMode() const; | 108 | NpadCommunicationMode GetNpadCommunicationMode() const; |
| 109 | 109 | ||
| 110 | void SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type, | 110 | ResultCode SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type, |
| 111 | NpadJoyAssignmentMode assignment_mode); | 111 | NpadJoyAssignmentMode assignment_mode); |
| 112 | 112 | ||
| 113 | bool VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, std::size_t device_index, | 113 | bool VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, std::size_t device_index, |
| 114 | const Core::HID::VibrationValue& vibration_value); | 114 | const Core::HID::VibrationValue& vibration_value); |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 18c02d47d..b41fc60d6 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -1026,15 +1026,16 @@ void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx | |||
| 1026 | 1026 | ||
| 1027 | const auto parameters{rp.PopRaw<Parameters>()}; | 1027 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 1028 | 1028 | ||
| 1029 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 1029 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); |
| 1030 | .SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyDeviceType::Left, | 1030 | const auto result = |
| 1031 | Controller_NPad::NpadJoyAssignmentMode::Single); | 1031 | controller.SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyDeviceType::Left, |
| 1032 | Controller_NPad::NpadJoyAssignmentMode::Single); | ||
| 1032 | 1033 | ||
| 1033 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, | 1034 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, |
| 1034 | parameters.applet_resource_user_id); | 1035 | parameters.applet_resource_user_id); |
| 1035 | 1036 | ||
| 1036 | IPC::ResponseBuilder rb{ctx, 2}; | 1037 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1037 | rb.Push(ResultSuccess); | 1038 | rb.Push(result); |
| 1038 | } | 1039 | } |
| 1039 | 1040 | ||
| 1040 | void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) { | 1041 | void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) { |
| @@ -1049,16 +1050,16 @@ void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) { | |||
| 1049 | 1050 | ||
| 1050 | const auto parameters{rp.PopRaw<Parameters>()}; | 1051 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 1051 | 1052 | ||
| 1052 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 1053 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); |
| 1053 | .SetNpadMode(parameters.npad_id, parameters.npad_joy_device_type, | 1054 | const auto result = controller.SetNpadMode(parameters.npad_id, parameters.npad_joy_device_type, |
| 1054 | Controller_NPad::NpadJoyAssignmentMode::Single); | 1055 | Controller_NPad::NpadJoyAssignmentMode::Single); |
| 1055 | 1056 | ||
| 1056 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", | 1057 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", |
| 1057 | parameters.npad_id, parameters.applet_resource_user_id, | 1058 | parameters.npad_id, parameters.applet_resource_user_id, |
| 1058 | parameters.npad_joy_device_type); | 1059 | parameters.npad_joy_device_type); |
| 1059 | 1060 | ||
| 1060 | IPC::ResponseBuilder rb{ctx, 2}; | 1061 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1061 | rb.Push(ResultSuccess); | 1062 | rb.Push(result); |
| 1062 | } | 1063 | } |
| 1063 | 1064 | ||
| 1064 | void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) { | 1065 | void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) { |
| @@ -1072,14 +1073,15 @@ void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) { | |||
| 1072 | 1073 | ||
| 1073 | const auto parameters{rp.PopRaw<Parameters>()}; | 1074 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 1074 | 1075 | ||
| 1075 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 1076 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); |
| 1076 | .SetNpadMode(parameters.npad_id, {}, Controller_NPad::NpadJoyAssignmentMode::Dual); | 1077 | const auto result = controller.SetNpadMode(parameters.npad_id, {}, |
| 1078 | Controller_NPad::NpadJoyAssignmentMode::Dual); | ||
| 1077 | 1079 | ||
| 1078 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, | 1080 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, |
| 1079 | parameters.applet_resource_user_id); | 1081 | parameters.applet_resource_user_id); |
| 1080 | 1082 | ||
| 1081 | IPC::ResponseBuilder rb{ctx, 2}; | 1083 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1082 | rb.Push(ResultSuccess); | 1084 | rb.Push(result); |
| 1083 | } | 1085 | } |
| 1084 | 1086 | ||
| 1085 | void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { | 1087 | void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { |