summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu/ControlGroup
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2021-05-19 14:18:46 -0400
committerGitHub <noreply@github.com>2021-05-19 14:18:46 -0400
commitfbf7e93f9bc6df2581b37d51ee47d8457149159c (patch)
tree0cfd71788bd0c8fdfa4d009050b4f0ef2890e6fa /Source/Core/InputCommon/ControllerEmu/ControlGroup
parent736de8abf618fdd3846ec90fa3d51a71ed3d0a68 (diff)
parent379ffc268d30c66c9cc43a15998369de769efaf0 (diff)
Merge pull request #9689 from Filoppi/input_cleanup_2
Input cleanup 2
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup')
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp7
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp11
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h2
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp36
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h15
5 files changed, 48 insertions, 23 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp
index 6f980d8c60..18ccbc1966 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Attachments.cpp
@@ -17,10 +17,11 @@ void Attachments::AddAttachment(std::unique_ptr<EmulatedController> att)
u32 Attachments::GetSelectedAttachment() const
{
- const u32 value = m_selection_value.GetValue();
+ // This is originally an int, treat it as such
+ const int value = m_selection_value.GetValue();
- if (value < m_attachments.size())
- return value;
+ if (value > 0 && static_cast<size_t>(value) < m_attachments.size())
+ return u32(value);
return 0;
}
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp
index 1e23c5dffe..ef9f519633 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp
@@ -4,13 +4,12 @@
#include "InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h"
+#include <algorithm>
#include <memory>
#include "Common/Common.h"
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
-#include "InputCommon/ControlReference/ControlReference.h"
#include "InputCommon/ControllerEmu/Control/Control.h"
-#include "InputCommon/ControllerEmu/Control/Input.h"
namespace ControllerEmu
{
@@ -25,9 +24,15 @@ IMUAccelerometer::IMUAccelerometer(std::string name_, std::string ui_name_)
AddInput(Translate, _trans("Backward"));
}
+bool IMUAccelerometer::AreInputsBound() const
+{
+ return std::all_of(controls.begin(), controls.end(),
+ [](const auto& control) { return control->control_ref->BoundCount() > 0; });
+}
+
std::optional<IMUAccelerometer::StateData> IMUAccelerometer::GetState() const
{
- if (controls[0]->control_ref->BoundCount() == 0)
+ if (!AreInputsBound())
return std::nullopt;
StateData state;
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h
index b5d8e0c935..57fa4ea0b6 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h
@@ -20,5 +20,7 @@ public:
IMUAccelerometer(std::string name, std::string ui_name);
std::optional<StateData> GetState() const;
+
+ bool AreInputsBound() const;
};
} // namespace ControllerEmu
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;
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h
index 459f885882..c040e11781 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h
@@ -23,7 +23,8 @@ public:
IMUGyroscope(std::string name, std::string ui_name);
StateData GetRawState() const;
- std::optional<StateData> GetState() const;
+ // Also updates the state by default
+ std::optional<StateData> GetState(bool update = true);
// Value is in rad/s.
ControlState GetDeadzone() const;
@@ -33,14 +34,16 @@ public:
private:
using Clock = std::chrono::steady_clock;
- void RestartCalibration() const;
- void UpdateCalibration(const StateData&) const;
+ bool AreInputsBound() const;
+ bool CanCalibrate() const;
+ void RestartCalibration();
+ void UpdateCalibration(const StateData&);
SettingValue<double> m_deadzone_setting;
SettingValue<double> m_calibration_period_setting;
- mutable StateData m_calibration = {};
- mutable MathUtil::RunningMean<StateData> m_running_calibration;
- mutable Clock::time_point m_calibration_period_start = Clock::now();
+ StateData m_calibration = {};
+ MathUtil::RunningMean<StateData> m_running_calibration;
+ Clock::time_point m_calibration_period_start = Clock::now();
};
} // namespace ControllerEmu