ControllerInterface/DolphinQt: Make mapping "all devices" way less hacky.

This commit is contained in:
Jordan Woyak
2019-02-27 18:10:18 -06:00
parent 48b69ca018
commit c389d68186
10 changed files with 192 additions and 232 deletions

View File

@ -4,9 +4,6 @@
#include "InputCommon/ControlReference/ControlReference.h"
#include <vector>
#include "Common/Thread.h"
// For InputGateOn()
// This is a bad layering violation, but it's the cleanest
// place I could find to put it.
@ -15,12 +12,6 @@
using namespace ciface::ExpressionParser;
namespace
{
// Compared to an input's current state (ideally 1.0) minus abs(initial_state) (ideally 0.0).
constexpr ControlState INPUT_DETECT_THRESHOLD = 0.55;
} // namespace
bool ControlReference::InputGateOn()
{
return SConfig::GetInstance().m_BackgroundInput || Host_RendererHasFocus() ||
@ -115,83 +106,3 @@ ControlState OutputReference::State(const ControlState state)
m_parsed_expression->SetValue(state * range);
return 0.0;
}
// Wait for input on a particular device.
// Inputs are considered if they are first seen in a neutral state.
// This is useful for crazy flightsticks that have certain buttons that are always held down
// and also properly handles detection when using "FullAnalogSurface" inputs.
// Upon input, return a pointer to the detected Control, else return nullptr.
ciface::Core::Device::Control* InputReference::Detect(const unsigned int ms,
ciface::Core::Device* const device)
{
struct InputState
{
ciface::Core::Device::Input& input;
ControlState initial_state;
};
std::vector<InputState> input_states;
for (auto* input : device->Inputs())
{
// Don't detect things like absolute cursor position.
if (!input->IsDetectable())
continue;
// Undesirable axes will have negative values here when trying to map a "FullAnalogSurface".
input_states.push_back({*input, input->GetState()});
}
if (input_states.empty())
return nullptr;
unsigned int time = 0;
while (time < ms)
{
Common::SleepCurrentThread(10);
time += 10;
device->UpdateInput();
for (auto& input_state : input_states)
{
// We want an input that was initially 0.0 and currently 1.0.
const auto detection_score =
(input_state.input.GetState() - std::abs(input_state.initial_state));
if (detection_score > INPUT_DETECT_THRESHOLD)
return &input_state.input;
}
}
// No input was detected. :'(
return nullptr;
}
//
// OutputReference :: Detect
//
// Totally different from the inputReference detect / I have them combined so it was simpler to make
// the GUI.
// The GUI doesn't know the difference between an input and an output / it's odd but I was lazy and
// it was easy
//
// set all binded outputs to <range> power for x milliseconds return false
//
ciface::Core::Device::Control* OutputReference::Detect(const unsigned int ms,
ciface::Core::Device* const device)
{
// ignore device
// don't hang if we don't even have any controls mapped
if (BoundCount() > 0)
{
State(1);
unsigned int slept = 0;
// this loop is to make stuff like flashing keyboard LEDs work
while (ms > (slept += 10))
Common::SleepCurrentThread(10);
State(0);
}
return nullptr;
}