diff options
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 12 |
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 | ||
| 577 | void 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 | |||
| 577 | void Controller_NPad::StartLRAssignmentMode() { | 593 | void 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 | ||
| 672 | void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { | 672 | void 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); |