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 620386cd1..83c3beab6 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -609,20 +609,31 @@ void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode)
609 } 609 }
610} 610}
611 611
612void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, 612void Controller_NPad::VibrateController(const std::vector<u32>& controllers,
613 const std::vector<Vibration>& vibrations) { 613 const std::vector<Vibration>& vibrations) {
614 LOG_DEBUG(Service_HID, "(STUBBED) called"); 614 LOG_TRACE(Service_HID, "called");
615 615
616 if (!Settings::values.vibration_enabled || !can_controllers_vibrate) { 616 if (!Settings::values.vibration_enabled || !can_controllers_vibrate) {
617 return; 617 return;
618 } 618 }
619 for (std::size_t i = 0; i < controller_ids.size(); i++) { 619 bool success = true;
620 std::size_t controller_pos = NPadIdToIndex(static_cast<u32>(i)); 620 for (std::size_t i = 0; i < controllers.size(); ++i) {
621 if (connected_controllers[controller_pos].is_connected) { 621 if (!connected_controllers[i].is_connected) {
622 // TODO(ogniK): Vibrate the physical controller 622 continue;
623 }
624 using namespace Settings::NativeButton;
625 const auto& button_state = buttons[i];
626 if (button_state[A - BUTTON_HID_BEGIN]) {
627 if (button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay(
628 vibrations[0].amp_high, vibrations[0].amp_low, vibrations[0].freq_high,
629 vibrations[0].freq_low)) {
630 success = false;
631 }
623 } 632 }
624 } 633 }
625 last_processed_vibration = vibrations.back(); 634 if (success) {
635 last_processed_vibration = vibrations.back();
636 }
626} 637}
627 638
628Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { 639Controller_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 654d97c3f..0cff6821f 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -121,7 +121,7 @@ public:
121 121
122 void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode); 122 void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode);
123 123
124 void VibrateController(const std::vector<u32>& controller_ids, 124 void VibrateController(const std::vector<u32>& controllers,
125 const std::vector<Vibration>& vibrations); 125 const std::vector<Vibration>& vibrations);
126 126
127 Vibration GetLastVibration() const; 127 Vibration GetLastVibration() const;
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 395e83b3f..dc198791d 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -802,18 +802,18 @@ void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) {
802 802
803void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { 803void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) {
804 IPC::RequestParser rp{ctx}; 804 IPC::RequestParser rp{ctx};
805 const auto controller_id{rp.Pop<u32>()}; 805 const auto controller{rp.Pop<u32>()};
806 const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()}; 806 const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()};
807 const auto applet_resource_user_id{rp.Pop<u64>()}; 807 const auto applet_resource_user_id{rp.Pop<u64>()};
808 808
809 LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", controller_id, 809 LOG_DEBUG(Service_HID, "called, controller={}, applet_resource_user_id={}", controller,
810 applet_resource_user_id); 810 applet_resource_user_id);
811 811
812 IPC::ResponseBuilder rb{ctx, 2}; 812 IPC::ResponseBuilder rb{ctx, 2};
813 rb.Push(RESULT_SUCCESS); 813 rb.Push(RESULT_SUCCESS);
814 814
815 applet_resource->GetController<Controller_NPad>(HidController::NPad) 815 applet_resource->GetController<Controller_NPad>(HidController::NPad)
816 .VibrateController({controller_id}, {vibration_values}); 816 .VibrateController({controller}, {vibration_values});
817} 817}
818 818
819void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { 819void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) {
@@ -831,8 +831,6 @@ void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) {
831 831
832 std::memcpy(controller_list.data(), controllers.data(), controllers.size()); 832 std::memcpy(controller_list.data(), controllers.data(), controllers.size());
833 std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size()); 833 std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size());
834 std::transform(controller_list.begin(), controller_list.end(), controller_list.begin(),
835 [](u32 controller_id) { return controller_id - 3; });
836 834
837 applet_resource->GetController<Controller_NPad>(HidController::NPad) 835 applet_resource->GetController<Controller_NPad>(HidController::NPad)
838 .VibrateController(controller_list, vibration_list); 836 .VibrateController(controller_list, vibration_list);