diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/frontend/input.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 8 |
4 files changed, 25 insertions, 13 deletions
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h index 9da0d2829..277b70e53 100644 --- a/src/core/frontend/input.h +++ b/src/core/frontend/input.h | |||
| @@ -33,6 +33,9 @@ public: | |||
| 33 | virtual bool GetAnalogDirectionStatus(AnalogDirection direction) const { | 33 | virtual bool GetAnalogDirectionStatus(AnalogDirection direction) const { |
| 34 | return {}; | 34 | return {}; |
| 35 | } | 35 | } |
| 36 | virtual bool SetRumblePlay(f32 amp_high, f32 amp_low, f32 freq_high, f32 freq_low) const { | ||
| 37 | return {}; | ||
| 38 | } | ||
| 36 | }; | 39 | }; |
| 37 | 40 | ||
| 38 | /// An abstract class template for a factory that can create input devices. | 41 | /// An abstract class template for a factory that can create input devices. |
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index e34ee519e..fb007767d 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -665,20 +665,31 @@ void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode) | |||
| 665 | } | 665 | } |
| 666 | } | 666 | } |
| 667 | 667 | ||
| 668 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | 668 | void Controller_NPad::VibrateController(const std::vector<u32>& controllers, |
| 669 | const std::vector<Vibration>& vibrations) { | 669 | const std::vector<Vibration>& vibrations) { |
| 670 | LOG_DEBUG(Service_HID, "(STUBBED) called"); | 670 | LOG_TRACE(Service_HID, "called"); |
| 671 | 671 | ||
| 672 | if (!Settings::values.vibration_enabled || !can_controllers_vibrate) { | 672 | if (!Settings::values.vibration_enabled || !can_controllers_vibrate) { |
| 673 | return; | 673 | return; |
| 674 | } | 674 | } |
| 675 | for (std::size_t i = 0; i < controller_ids.size(); i++) { | 675 | bool success = true; |
| 676 | std::size_t controller_pos = NPadIdToIndex(static_cast<u32>(i)); | 676 | for (std::size_t i = 0; i < controllers.size(); ++i) { |
| 677 | if (connected_controllers[controller_pos].is_connected) { | 677 | if (!connected_controllers[i].is_connected) { |
| 678 | // TODO(ogniK): Vibrate the physical controller | 678 | continue; |
| 679 | } | ||
| 680 | using namespace Settings::NativeButton; | ||
| 681 | const auto& button_state = buttons[i]; | ||
| 682 | if (button_state[A - BUTTON_HID_BEGIN]) { | ||
| 683 | if (button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay( | ||
| 684 | vibrations[0].amp_high, vibrations[0].amp_low, vibrations[0].freq_high, | ||
| 685 | vibrations[0].freq_low)) { | ||
| 686 | success = false; | ||
| 687 | } | ||
| 679 | } | 688 | } |
| 680 | } | 689 | } |
| 681 | last_processed_vibration = vibrations.back(); | 690 | if (success) { |
| 691 | last_processed_vibration = vibrations.back(); | ||
| 692 | } | ||
| 682 | } | 693 | } |
| 683 | 694 | ||
| 684 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { | 695 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 0fa7455ba..e65277c7b 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -125,7 +125,7 @@ public: | |||
| 125 | 125 | ||
| 126 | void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode); | 126 | void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode); |
| 127 | 127 | ||
| 128 | void VibrateController(const std::vector<u32>& controller_ids, | 128 | void VibrateController(const std::vector<u32>& controllers, |
| 129 | const std::vector<Vibration>& vibrations); | 129 | const std::vector<Vibration>& vibrations); |
| 130 | 130 | ||
| 131 | Vibration GetLastVibration() const; | 131 | Vibration GetLastVibration() const; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 9a7e5e265..90a71ab1c 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -817,18 +817,18 @@ void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) { | |||
| 817 | 817 | ||
| 818 | void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { | 818 | void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { |
| 819 | IPC::RequestParser rp{ctx}; | 819 | IPC::RequestParser rp{ctx}; |
| 820 | const auto controller_id{rp.Pop<u32>()}; | 820 | const auto controller{rp.Pop<u32>()}; |
| 821 | const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()}; | 821 | const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()}; |
| 822 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 822 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 823 | 823 | ||
| 824 | LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", controller_id, | 824 | LOG_DEBUG(Service_HID, "called, controller={}, applet_resource_user_id={}", controller, |
| 825 | applet_resource_user_id); | 825 | applet_resource_user_id); |
| 826 | 826 | ||
| 827 | IPC::ResponseBuilder rb{ctx, 2}; | 827 | IPC::ResponseBuilder rb{ctx, 2}; |
| 828 | rb.Push(RESULT_SUCCESS); | 828 | rb.Push(RESULT_SUCCESS); |
| 829 | 829 | ||
| 830 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 830 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 831 | .VibrateController({controller_id}, {vibration_values}); | 831 | .VibrateController({controller}, {vibration_values}); |
| 832 | } | 832 | } |
| 833 | 833 | ||
| 834 | void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { | 834 | void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { |
| @@ -846,8 +846,6 @@ void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { | |||
| 846 | 846 | ||
| 847 | std::memcpy(controller_list.data(), controllers.data(), controllers.size()); | 847 | std::memcpy(controller_list.data(), controllers.data(), controllers.size()); |
| 848 | std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size()); | 848 | std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size()); |
| 849 | std::transform(controller_list.begin(), controller_list.end(), controller_list.begin(), | ||
| 850 | [](u32 controller_id) { return controller_id - 3; }); | ||
| 851 | 849 | ||
| 852 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 850 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 853 | .VibrateController(controller_list, vibration_list); | 851 | .VibrateController(controller_list, vibration_list); |