summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp32
-rw-r--r--src/core/hle/service/hid/controllers/npad.h4
-rw-r--r--src/core/hle/service/hid/hid.cpp41
-rw-r--r--src/core/hle/service/hid/hid.h1
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
822Result Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, 822bool 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
893bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, 893bool 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
1377void 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
1372void Hid::SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx) { 1405void 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);