summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/frontend/input.h3
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp25
-rw-r--r--src/core/hle/service/hid/controllers/npad.h2
-rw-r--r--src/core/hle/service/hid/hid.cpp8
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
668void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, 668void 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
684Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { 695Controller_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
818void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { 818void 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
834void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { 834void 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);