From 379ffc268d30c66c9cc43a15998369de769efaf0 Mon Sep 17 00:00:00 2001 From: Filoppi Date: Wed, 5 May 2021 00:04:47 +0300 Subject: IMUGyroscope: make GetState update optional (on by default), fix const, clean code My future PRs will split the UI state from the Emulation State of some of these emulated controller values and this readies the code for it. --- .../ControllerEmu/ControlGroup/IMUGyroscope.cpp | 36 +++++++++++++++------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp') 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::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::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; -- cgit v1.2.3