diff --git a/src/core/analog_controller.cpp b/src/core/analog_controller.cpp index 216a35c50..f991885f4 100644 --- a/src/core/analog_controller.cpp +++ b/src/core/analog_controller.cpp @@ -171,6 +171,11 @@ float AnalogController::GetBindState(u32 index) const } } +float AnalogController::GetVibrationMotorState(u32 index) const +{ + return ((index < m_motor_state.size()) ? m_motor_state[index] : 0) * (1.0f / 255.0f); +} + void AnalogController::SetBindState(u32 index, float value) { if (index == static_cast(Button::Analog)) diff --git a/src/core/analog_controller.h b/src/core/analog_controller.h index 5cbf47c45..2611d7ca7 100644 --- a/src/core/analog_controller.h +++ b/src/core/analog_controller.h @@ -72,6 +72,7 @@ public: bool DoState(StateWrapper& sw, bool ignore_input_state) override; float GetBindState(u32 index) const override; + float GetVibrationMotorState(u32 index) const override; void SetBindState(u32 index, float value) override; u32 GetButtonStateBits() const override; std::optional GetAnalogInputBytes() const override; diff --git a/src/core/controller.cpp b/src/core/controller.cpp index 303e7d052..54b8eb80e 100644 --- a/src/core/controller.cpp +++ b/src/core/controller.cpp @@ -90,6 +90,11 @@ u32 Controller::GetButtonStateBits() const return 0; } +float Controller::GetVibrationMotorState(u32 index) const +{ + return 0.0f; +} + bool Controller::InAnalogMode() const { return false; diff --git a/src/core/controller.h b/src/core/controller.h index ca21c95bf..f5e7f07ff 100644 --- a/src/core/controller.h +++ b/src/core/controller.h @@ -78,6 +78,9 @@ public: /// Returns a bitmask of the current button states, 1 = on. virtual u32 GetButtonStateBits() const; + /// Returns the current state of the specified vibration motor. + virtual float GetVibrationMotorState(u32 index) const; + /// Returns true if the controller supports analog mode, and it is active. virtual bool InAnalogMode() const; diff --git a/src/core/jogcon.cpp b/src/core/jogcon.cpp index d183cf84f..a4c90b70f 100644 --- a/src/core/jogcon.cpp +++ b/src/core/jogcon.cpp @@ -96,6 +96,11 @@ float JogCon::GetBindState(u32 index) const } } +float JogCon::GetVibrationMotorState(u32 index) const +{ + return (index == 0) ? m_last_strength : 0.0f; +} + void JogCon::SetBindState(u32 index, float value) { if (index == static_cast(Button::Mode)) @@ -275,7 +280,13 @@ void JogCon::SetMotorDirection(u8 direction_command, u8 strength) DEV_LOG("Stop motor"); if (m_force_feedback_device) m_force_feedback_device->DisableForce(ForceFeedbackDevice::Effect::Constant); - InputManager::SetPadVibrationIntensity(m_index, 0.0f, 0.0f); + + if (m_last_strength != 0.0f) + { + m_last_strength = 0.0f; + InputManager::SetPadVibrationIntensity(m_index, 0.0f, 0.0f); + } + return; } @@ -290,7 +301,11 @@ void JogCon::SetMotorDirection(u8 direction_command, u8 strength) m_force_feedback_device->SetConstantForce(ffb_value); } - InputManager::SetPadVibrationIntensity(m_index, f_strength, 0.0f); + if (f_strength != m_last_strength) + { + m_last_strength = f_strength; + InputManager::SetPadVibrationIntensity(m_index, f_strength, 0.0f); + } } void JogCon::UpdateSteeringHold() diff --git a/src/core/jogcon.h b/src/core/jogcon.h index b8c0e3549..0af8bf9b5 100644 --- a/src/core/jogcon.h +++ b/src/core/jogcon.h @@ -54,6 +54,7 @@ public: bool DoState(StateWrapper& sw, bool apply_input_state) override; float GetBindState(u32 index) const override; + float GetVibrationMotorState(u32 index) const override; void SetBindState(u32 index, float value) override; u32 GetButtonStateBits() const override; u32 GetInputOverlayIconColor() const override; @@ -146,6 +147,9 @@ private: float m_analog_sensitivity = 1.33f; float m_button_deadzone = 0.0f; - std::string m_force_feedback_device_name; + float m_last_strength = 0.0f; + std::unique_ptr m_force_feedback_device; + + std::string m_force_feedback_device_name; }; diff --git a/src/core/negcon_rumble.cpp b/src/core/negcon_rumble.cpp index 4da924c09..e17f68a68 100644 --- a/src/core/negcon_rumble.cpp +++ b/src/core/negcon_rumble.cpp @@ -141,6 +141,11 @@ float NeGconRumble::GetBindState(u32 index) const } } +float NeGconRumble::GetVibrationMotorState(u32 index) const +{ + return ((index < m_motor_state.size()) ? m_motor_state[index] : 0) * (1.0f / 255.0f); +} + void NeGconRumble::SetBindState(u32 index, float value) { if (index == static_cast(Button::Analog)) diff --git a/src/core/negcon_rumble.h b/src/core/negcon_rumble.h index 59c1a5fc4..1cc191077 100644 --- a/src/core/negcon_rumble.h +++ b/src/core/negcon_rumble.h @@ -61,6 +61,7 @@ public: bool DoState(StateWrapper& sw, bool apply_input_state) override; float GetBindState(u32 index) const override; + float GetVibrationMotorState(u32 index) const override; void SetBindState(u32 index, float value) override; void ResetTransferState() override;