summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp16
-rw-r--r--src/core/hle/service/hid/controllers/npad.h1
-rw-r--r--src/core/hle/service/hid/hid.cpp12
3 files changed, 24 insertions, 5 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 45fde8df2..e742497e1 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -574,6 +574,22 @@ Controller_NPad::GyroscopeZeroDriftMode Controller_NPad::GetGyroscopeZeroDriftMo
574 return gyroscope_zero_drift_mode; 574 return gyroscope_zero_drift_mode;
575} 575}
576 576
577void Controller_NPad::MergeSingleJoyAsDualJoy(u32 npad_id_1, u32 npad_id_2) {
578 const auto npad_index_1 = NPadIdToIndex(npad_id_1);
579 const auto npad_index_2 = NPadIdToIndex(npad_id_2);
580
581 // If the controllers at both npad indices form a pair of left and right joycons, merge them.
582 // Otherwise, do nothing.
583 if ((connected_controllers[npad_index_1].type == NPadControllerType::JoyLeft &&
584 connected_controllers[npad_index_2].type == NPadControllerType::JoyRight) ||
585 (connected_controllers[npad_index_2].type == NPadControllerType::JoyLeft &&
586 connected_controllers[npad_index_1].type == NPadControllerType::JoyRight)) {
587 // Disconnect the joycon at the second id and connect the dual joycon at the first index.
588 DisconnectNPad(npad_id_2);
589 AddNewControllerAt(NPadControllerType::JoyDual, npad_index_1);
590 }
591}
592
577void Controller_NPad::StartLRAssignmentMode() { 593void Controller_NPad::StartLRAssignmentMode() {
578 // Nothing internally is used for lr assignment mode. Since we have the ability to set the 594 // Nothing internally is used for lr assignment mode. Since we have the ability to set the
579 // controller types from boot, it doesn't really matter about showing a selection screen 595 // controller types from boot, it doesn't really matter about showing a selection screen
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index 75ce5b731..ad25c6fbf 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -134,6 +134,7 @@ public:
134 void ConnectAllDisconnectedControllers(); 134 void ConnectAllDisconnectedControllers();
135 void ClearAllControllers(); 135 void ClearAllControllers();
136 136
137 void MergeSingleJoyAsDualJoy(u32 npad_id_1, u32 npad_id_2);
137 void StartLRAssignmentMode(); 138 void StartLRAssignmentMode();
138 void StopLRAssignmentMode(); 139 void StopLRAssignmentMode();
139 bool SwapNpadAssignment(u32 npad_id_1, u32 npad_id_2); 140 bool SwapNpadAssignment(u32 npad_id_1, u32 npad_id_2);
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 33416b5dd..bd3c2f26b 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -671,13 +671,15 @@ void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
671 671
672void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { 672void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) {
673 IPC::RequestParser rp{ctx}; 673 IPC::RequestParser rp{ctx};
674 const auto unknown_1{rp.Pop<u32>()}; 674 const auto npad_id_1{rp.Pop<u32>()};
675 const auto unknown_2{rp.Pop<u32>()}; 675 const auto npad_id_2{rp.Pop<u32>()};
676 const auto applet_resource_user_id{rp.Pop<u64>()}; 676 const auto applet_resource_user_id{rp.Pop<u64>()};
677 677
678 LOG_WARNING(Service_HID, 678 LOG_DEBUG(Service_HID, "called, npad_id_1={}, npad_id_2={}, applet_resource_user_id={}",
679 "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}", 679 npad_id_1, npad_id_2, applet_resource_user_id);
680 unknown_1, unknown_2, applet_resource_user_id); 680
681 auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
682 controller.MergeSingleJoyAsDualJoy(npad_id_1, npad_id_2);
681 683
682 IPC::ResponseBuilder rb{ctx, 2}; 684 IPC::ResponseBuilder rb{ctx, 2};
683 rb.Push(RESULT_SUCCESS); 685 rb.Push(RESULT_SUCCESS);