Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #9689 from Filoppi/input_cleanup_2
Input cleanup 2
  • Loading branch information
JMC47 committed May 19, 2021
2 parents 736de8a + 379ffc2 commit fbf7e93
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 24 deletions.
3 changes: 2 additions & 1 deletion Source/Core/Core/HW/WiimoteEmu/Extension/Guitar.cpp
Expand Up @@ -107,7 +107,8 @@ void Guitar::Update()
}

// slider bar
if (m_slider_bar->controls[0]->control_ref->BoundCount())
if (m_slider_bar->controls[0]->control_ref->BoundCount() &&
m_slider_bar->controls[1]->control_ref->BoundCount())
{
const ControllerEmu::Slider::StateData slider_data = m_slider_bar->GetState();

Expand Down
Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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
{
Expand All @@ -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;
Expand Down
Expand Up @@ -20,5 +20,7 @@ class IMUAccelerometer : public ControlGroup
IMUAccelerometer(std::string name, std::string ui_name);

std::optional<StateData> GetState() const;

bool AreInputsBound() const;
};
} // namespace ControllerEmu
36 changes: 25 additions & 11 deletions Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp
Expand Up @@ -12,7 +12,6 @@

#include "InputCommon/ControlReference/ControlReference.h"
#include "InputCommon/ControllerEmu/Control/Control.h"
#include "InputCommon/ControllerEmu/Control/Input.h"

namespace ControllerEmu
{
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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;
Expand Down
Expand Up @@ -23,7 +23,8 @@ class IMUGyroscope : public ControlGroup
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;
Expand All @@ -33,14 +34,16 @@ class IMUGyroscope : public ControlGroup
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

0 comments on commit fbf7e93

Please sign in to comment.