diff options
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 32 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 41 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 1 |
4 files changed, 56 insertions, 22 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 21bd7b0c5..b070327ec 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -819,12 +819,12 @@ Controller_NPad::NpadCommunicationMode Controller_NPad::GetNpadCommunicationMode | |||
| 819 | return communication_mode; | 819 | return communication_mode; |
| 820 | } | 820 | } |
| 821 | 821 | ||
| 822 | Result Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, | 822 | bool Controller_NPad::SetNpadMode(Core::HID::NpadIdType& new_npad_id, Core::HID::NpadIdType npad_id, |
| 823 | NpadJoyDeviceType npad_device_type, | 823 | NpadJoyDeviceType npad_device_type, |
| 824 | NpadJoyAssignmentMode assignment_mode) { | 824 | NpadJoyAssignmentMode assignment_mode) { |
| 825 | if (!IsNpadIdValid(npad_id)) { | 825 | if (!IsNpadIdValid(npad_id)) { |
| 826 | LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); | 826 | LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); |
| 827 | return InvalidNpadId; | 827 | return false; |
| 828 | } | 828 | } |
| 829 | 829 | ||
| 830 | auto& controller = GetControllerFromNpadIdType(npad_id); | 830 | auto& controller = GetControllerFromNpadIdType(npad_id); |
| @@ -833,7 +833,7 @@ Result Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, | |||
| 833 | } | 833 | } |
| 834 | 834 | ||
| 835 | if (!controller.device->IsConnected()) { | 835 | if (!controller.device->IsConnected()) { |
| 836 | return ResultSuccess; | 836 | return false; |
| 837 | } | 837 | } |
| 838 | 838 | ||
| 839 | if (assignment_mode == NpadJoyAssignmentMode::Dual) { | 839 | if (assignment_mode == NpadJoyAssignmentMode::Dual) { |
| @@ -842,52 +842,52 @@ Result Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, | |||
| 842 | controller.is_dual_left_connected = true; | 842 | controller.is_dual_left_connected = true; |
| 843 | controller.is_dual_right_connected = false; | 843 | controller.is_dual_right_connected = false; |
| 844 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); | 844 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
| 845 | return ResultSuccess; | 845 | return false; |
| 846 | } | 846 | } |
| 847 | if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight) { | 847 | if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight) { |
| 848 | DisconnectNpad(npad_id); | 848 | DisconnectNpad(npad_id); |
| 849 | controller.is_dual_left_connected = false; | 849 | controller.is_dual_left_connected = false; |
| 850 | controller.is_dual_right_connected = true; | 850 | controller.is_dual_right_connected = true; |
| 851 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); | 851 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
| 852 | return ResultSuccess; | 852 | return false; |
| 853 | } | 853 | } |
| 854 | return ResultSuccess; | 854 | return false; |
| 855 | } | 855 | } |
| 856 | 856 | ||
| 857 | // This is for NpadJoyAssignmentMode::Single | 857 | // This is for NpadJoyAssignmentMode::Single |
| 858 | 858 | ||
| 859 | // Only JoyconDual get affected by this function | 859 | // Only JoyconDual get affected by this function |
| 860 | if (controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::JoyconDual) { | 860 | if (controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::JoyconDual) { |
| 861 | return ResultSuccess; | 861 | return false; |
| 862 | } | 862 | } |
| 863 | 863 | ||
| 864 | if (controller.is_dual_left_connected && !controller.is_dual_right_connected) { | 864 | if (controller.is_dual_left_connected && !controller.is_dual_right_connected) { |
| 865 | DisconnectNpad(npad_id); | 865 | DisconnectNpad(npad_id); |
| 866 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); | 866 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
| 867 | return ResultSuccess; | 867 | return false; |
| 868 | } | 868 | } |
| 869 | if (!controller.is_dual_left_connected && controller.is_dual_right_connected) { | 869 | if (!controller.is_dual_left_connected && controller.is_dual_right_connected) { |
| 870 | DisconnectNpad(npad_id); | 870 | DisconnectNpad(npad_id); |
| 871 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); | 871 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
| 872 | return ResultSuccess; | 872 | return false; |
| 873 | } | 873 | } |
| 874 | 874 | ||
| 875 | // We have two controllers connected to the same npad_id we need to split them | 875 | // We have two controllers connected to the same npad_id we need to split them |
| 876 | const auto npad_id_2 = hid_core.GetFirstDisconnectedNpadId(); | 876 | new_npad_id = hid_core.GetFirstDisconnectedNpadId(); |
| 877 | auto& controller_2 = GetControllerFromNpadIdType(npad_id_2); | 877 | auto& controller_2 = GetControllerFromNpadIdType(new_npad_id); |
| 878 | DisconnectNpad(npad_id); | 878 | DisconnectNpad(npad_id); |
| 879 | if (npad_device_type == NpadJoyDeviceType::Left) { | 879 | if (npad_device_type == NpadJoyDeviceType::Left) { |
| 880 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); | 880 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
| 881 | controller_2.is_dual_left_connected = false; | 881 | controller_2.is_dual_left_connected = false; |
| 882 | controller_2.is_dual_right_connected = true; | 882 | controller_2.is_dual_right_connected = true; |
| 883 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_2, true); | 883 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, new_npad_id, true); |
| 884 | } else { | 884 | } else { |
| 885 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); | 885 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
| 886 | controller_2.is_dual_left_connected = true; | 886 | controller_2.is_dual_left_connected = true; |
| 887 | controller_2.is_dual_right_connected = false; | 887 | controller_2.is_dual_right_connected = false; |
| 888 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_2, true); | 888 | UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, new_npad_id, true); |
| 889 | } | 889 | } |
| 890 | return ResultSuccess; | 890 | return true; |
| 891 | } | 891 | } |
| 892 | 892 | ||
| 893 | bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, | 893 | 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 a5998c453..9cfe298f1 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -102,8 +102,8 @@ public: | |||
| 102 | void SetNpadCommunicationMode(NpadCommunicationMode communication_mode_); | 102 | void SetNpadCommunicationMode(NpadCommunicationMode communication_mode_); |
| 103 | NpadCommunicationMode GetNpadCommunicationMode() const; | 103 | NpadCommunicationMode GetNpadCommunicationMode() const; |
| 104 | 104 | ||
| 105 | Result SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type, | 105 | bool SetNpadMode(Core::HID::NpadIdType& new_npad_id, Core::HID::NpadIdType npad_id, |
| 106 | NpadJoyAssignmentMode assignment_mode); | 106 | NpadJoyDeviceType npad_device_type, NpadJoyAssignmentMode assignment_mode); |
| 107 | 107 | ||
| 108 | bool VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, std::size_t device_index, | 108 | bool VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, std::size_t device_index, |
| 109 | const Core::HID::VibrationValue& vibration_value); | 109 | 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 4529ad643..87e7b864a 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -302,7 +302,7 @@ Hid::Hid(Core::System& system_) | |||
| 302 | {130, &Hid::SwapNpadAssignment, "SwapNpadAssignment"}, | 302 | {130, &Hid::SwapNpadAssignment, "SwapNpadAssignment"}, |
| 303 | {131, &Hid::IsUnintendedHomeButtonInputProtectionEnabled, "IsUnintendedHomeButtonInputProtectionEnabled"}, | 303 | {131, &Hid::IsUnintendedHomeButtonInputProtectionEnabled, "IsUnintendedHomeButtonInputProtectionEnabled"}, |
| 304 | {132, &Hid::EnableUnintendedHomeButtonInputProtection, "EnableUnintendedHomeButtonInputProtection"}, | 304 | {132, &Hid::EnableUnintendedHomeButtonInputProtection, "EnableUnintendedHomeButtonInputProtection"}, |
| 305 | {133, nullptr, "SetNpadJoyAssignmentModeSingleWithDestination"}, | 305 | {133, &Hid::SetNpadJoyAssignmentModeSingleWithDestination, "SetNpadJoyAssignmentModeSingleWithDestination"}, |
| 306 | {134, &Hid::SetNpadAnalogStickUseCenterClamp, "SetNpadAnalogStickUseCenterClamp"}, | 306 | {134, &Hid::SetNpadAnalogStickUseCenterClamp, "SetNpadAnalogStickUseCenterClamp"}, |
| 307 | {135, &Hid::SetNpadCaptureButtonAssignment, "SetNpadCaptureButtonAssignment"}, | 307 | {135, &Hid::SetNpadCaptureButtonAssignment, "SetNpadCaptureButtonAssignment"}, |
| 308 | {136, &Hid::ClearNpadCaptureButtonAssignment, "ClearNpadCaptureButtonAssignment"}, | 308 | {136, &Hid::ClearNpadCaptureButtonAssignment, "ClearNpadCaptureButtonAssignment"}, |
| @@ -1180,8 +1180,10 @@ void Hid::SetNpadJoyAssignmentModeSingleByDefault(HLERequestContext& ctx) { | |||
| 1180 | 1180 | ||
| 1181 | const auto parameters{rp.PopRaw<Parameters>()}; | 1181 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 1182 | 1182 | ||
| 1183 | Core::HID::NpadIdType new_npad_id{}; | ||
| 1183 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); | 1184 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); |
| 1184 | controller.SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyDeviceType::Left, | 1185 | controller.SetNpadMode(new_npad_id, parameters.npad_id, |
| 1186 | Controller_NPad::NpadJoyDeviceType::Left, | ||
| 1185 | Controller_NPad::NpadJoyAssignmentMode::Single); | 1187 | Controller_NPad::NpadJoyAssignmentMode::Single); |
| 1186 | 1188 | ||
| 1187 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, | 1189 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, |
| @@ -1203,8 +1205,9 @@ void Hid::SetNpadJoyAssignmentModeSingle(HLERequestContext& ctx) { | |||
| 1203 | 1205 | ||
| 1204 | const auto parameters{rp.PopRaw<Parameters>()}; | 1206 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 1205 | 1207 | ||
| 1208 | Core::HID::NpadIdType new_npad_id{}; | ||
| 1206 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); | 1209 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); |
| 1207 | controller.SetNpadMode(parameters.npad_id, parameters.npad_joy_device_type, | 1210 | controller.SetNpadMode(new_npad_id, parameters.npad_id, parameters.npad_joy_device_type, |
| 1208 | Controller_NPad::NpadJoyAssignmentMode::Single); | 1211 | Controller_NPad::NpadJoyAssignmentMode::Single); |
| 1209 | 1212 | ||
| 1210 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", | 1213 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", |
| @@ -1226,8 +1229,10 @@ void Hid::SetNpadJoyAssignmentModeDual(HLERequestContext& ctx) { | |||
| 1226 | 1229 | ||
| 1227 | const auto parameters{rp.PopRaw<Parameters>()}; | 1230 | const auto parameters{rp.PopRaw<Parameters>()}; |
| 1228 | 1231 | ||
| 1232 | Core::HID::NpadIdType new_npad_id{}; | ||
| 1229 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); | 1233 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); |
| 1230 | controller.SetNpadMode(parameters.npad_id, {}, Controller_NPad::NpadJoyAssignmentMode::Dual); | 1234 | controller.SetNpadMode(new_npad_id, parameters.npad_id, {}, |
| 1235 | Controller_NPad::NpadJoyAssignmentMode::Dual); | ||
| 1231 | 1236 | ||
| 1232 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, | 1237 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id, |
| 1233 | parameters.applet_resource_user_id); | 1238 | parameters.applet_resource_user_id); |
| @@ -1369,6 +1374,34 @@ void Hid::EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx) { | |||
| 1369 | rb.Push(result); | 1374 | rb.Push(result); |
| 1370 | } | 1375 | } |
| 1371 | 1376 | ||
| 1377 | void Hid::SetNpadJoyAssignmentModeSingleWithDestination(HLERequestContext& ctx) { | ||
| 1378 | IPC::RequestParser rp{ctx}; | ||
| 1379 | struct Parameters { | ||
| 1380 | Core::HID::NpadIdType npad_id; | ||
| 1381 | INSERT_PADDING_WORDS_NOINIT(1); | ||
| 1382 | u64 applet_resource_user_id; | ||
| 1383 | Controller_NPad::NpadJoyDeviceType npad_joy_device_type; | ||
| 1384 | }; | ||
| 1385 | static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size."); | ||
| 1386 | |||
| 1387 | const auto parameters{rp.PopRaw<Parameters>()}; | ||
| 1388 | |||
| 1389 | Core::HID::NpadIdType new_npad_id{}; | ||
| 1390 | auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); | ||
| 1391 | const auto is_reassigned = | ||
| 1392 | controller.SetNpadMode(new_npad_id, parameters.npad_id, parameters.npad_joy_device_type, | ||
| 1393 | Controller_NPad::NpadJoyAssignmentMode::Single); | ||
| 1394 | |||
| 1395 | LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", | ||
| 1396 | parameters.npad_id, parameters.applet_resource_user_id, | ||
| 1397 | parameters.npad_joy_device_type); | ||
| 1398 | |||
| 1399 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 1400 | rb.Push(ResultSuccess); | ||
| 1401 | rb.Push(is_reassigned); | ||
| 1402 | rb.PushEnum(new_npad_id); | ||
| 1403 | } | ||
| 1404 | |||
| 1372 | void Hid::SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx) { | 1405 | void Hid::SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx) { |
| 1373 | IPC::RequestParser rp{ctx}; | 1406 | IPC::RequestParser rp{ctx}; |
| 1374 | struct Parameters { | 1407 | struct Parameters { |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index c69e5f3fb..f247b83c2 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -151,6 +151,7 @@ private: | |||
| 151 | void SwapNpadAssignment(HLERequestContext& ctx); | 151 | void SwapNpadAssignment(HLERequestContext& ctx); |
| 152 | void IsUnintendedHomeButtonInputProtectionEnabled(HLERequestContext& ctx); | 152 | void IsUnintendedHomeButtonInputProtectionEnabled(HLERequestContext& ctx); |
| 153 | void EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx); | 153 | void EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx); |
| 154 | void SetNpadJoyAssignmentModeSingleWithDestination(HLERequestContext& ctx); | ||
| 154 | void SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx); | 155 | void SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx); |
| 155 | void SetNpadCaptureButtonAssignment(HLERequestContext& ctx); | 156 | void SetNpadCaptureButtonAssignment(HLERequestContext& ctx); |
| 156 | void ClearNpadCaptureButtonAssignment(HLERequestContext& ctx); | 157 | void ClearNpadCaptureButtonAssignment(HLERequestContext& ctx); |