summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp')
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp36
1 files changed, 25 insertions, 11 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp
index 95c74b1896..212e2e0f8d 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp
@@ -12,7 +12,6 @@
#include "InputCommon/ControlReference/ControlReference.h"
#include "InputCommon/ControllerEmu/Control/Control.h"
-#include "InputCommon/ControllerEmu/Control/Input.h"
namespace ControllerEmu
{
@@ -52,13 +51,13 @@ IMUGyroscope::IMUGyroscope(std::string name_, std::string ui_name_)
3, 0, 30);
}
-void IMUGyroscope::RestartCalibration() const
+void IMUGyroscope::RestartCalibration()
{
m_calibration_period_start = Clock::now();
m_running_calibration.Clear();
}
-void IMUGyroscope::UpdateCalibration(const StateData& state) const
+void IMUGyroscope::UpdateCalibration(const StateData& state)
{
const auto now = Clock::now();
const auto calibration_period = m_calibration_period_setting.GetValue();
@@ -123,21 +122,36 @@ auto IMUGyroscope::GetRawState() const -> StateData
controls[4]->GetState() - controls[5]->GetState());
}
-std::optional<IMUGyroscope::StateData> IMUGyroscope::GetState() const
+bool IMUGyroscope::AreInputsBound() const
{
- if (std::all_of(controls.begin(), controls.end(),
- [](const auto& control) { return control->control_ref->BoundCount() == 0; }))
+ return std::all_of(controls.begin(), controls.end(),
+ [](const auto& control) { return control->control_ref->BoundCount() > 0; });
+}
+
+bool IMUGyroscope::CanCalibrate() const
+{
+ // If the input gate is disabled, miscalibration to zero values would occur.
+ return ControlReference::GetInputGate();
+}
+
+std::optional<IMUGyroscope::StateData> IMUGyroscope::GetState(bool update)
+{
+ if (!AreInputsBound())
{
- // Set calibration to zero.
- m_calibration = {};
- RestartCalibration();
+ if (update)
+ {
+ // Set calibration to zero.
+ m_calibration = {};
+ RestartCalibration();
+ }
return std::nullopt;
}
auto state = GetRawState();
- // If the input gate is disabled, miscalibration to zero values would occur.
- if (ControlReference::GetInputGate())
+ // Alternatively we could open the control gate around GetRawState() while calibrating,
+ // but that would imply background input would temporarily be treated differently for our controls
+ if (update && CanCalibrate())
UpdateCalibration(state);
state -= m_calibration;