summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar german772022-05-21 16:29:41 -0500
committerGravatar Narr the Reg2022-05-27 10:21:09 -0500
commit7aa1d10655c769c9d2a32d65a810ad81eefe7ead (patch)
treea829187ae6e99d9e76405369531d20b2b1d3daf2
parentservice: hid: Quick RE fixes and comments (diff)
downloadyuzu-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.cpp22
-rw-r--r--src/core/hle/service/hid/controllers/npad.h4
-rw-r--r--src/core/hle/service/hid/hid.cpp24
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
704void Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type, 704ResultCode 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
773bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, 775bool 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
1040void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) { 1041void 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
1064void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) { 1065void 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
1085void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { 1087void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) {