GC Adapter Implementation

This commit is contained in:
Ameer
2020-06-21 12:36:28 -04:00
parent f98bf1025f
commit 0248614add
18 changed files with 1156 additions and 158 deletions

View File

@ -49,7 +49,8 @@ static int SDLEventWatcher(void* user_data, SDL_Event* event) {
class SDLJoystick {
public:
SDLJoystick(std::string guid_, int port_, SDL_Joystick* joystick)
: guid{std::move(guid_)}, port{port_}, sdl_joystick{joystick, &SDL_JoystickClose} {}
: guid{std::move(guid_)}, port{port_}, sdl_joystick{joystick, &SDL_JoystickClose} {
}
void SetButton(int button, bool value) {
std::lock_guard lock{mutex};
@ -97,6 +98,7 @@ public:
std::lock_guard lock{mutex};
return (state.hats.at(hat) & direction) != 0;
}
/**
* The guid of the joystick
*/
@ -125,6 +127,7 @@ private:
std::unordered_map<int, Sint16> axes;
std::unordered_map<int, Uint8> hats;
} state;
std::string guid;
int port;
std::unique_ptr<SDL_Joystick, decltype(&SDL_JoystickClose)> sdl_joystick;
@ -155,7 +158,8 @@ std::shared_ptr<SDLJoystick> SDLState::GetSDLJoystickBySDLID(SDL_JoystickID sdl_
if (map_it != joystick_map.end()) {
const auto vec_it =
std::find_if(map_it->second.begin(), map_it->second.end(),
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick) {
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick)
{
return sdl_joystick == joystick->GetSDLJoystick();
});
if (vec_it != map_it->second.end()) {
@ -166,7 +170,8 @@ std::shared_ptr<SDLJoystick> SDLState::GetSDLJoystickBySDLID(SDL_JoystickID sdl_
// Search for a SDLJoystick without a mapped SDL_Joystick...
const auto nullptr_it = std::find_if(map_it->second.begin(), map_it->second.end(),
[](const std::shared_ptr<SDLJoystick>& joystick) {
[](const std::shared_ptr<SDLJoystick>& joystick)
{
return !joystick->GetSDLJoystick();
});
if (nullptr_it != map_it->second.end()) {
@ -223,7 +228,8 @@ void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) {
const auto& joystick_guid_list = joystick_map[guid];
const auto joystick_it =
std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(),
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick) {
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick)
{
return joystick->GetSDLJoystick() == sdl_joystick;
});
joystick = *joystick_it;
@ -279,7 +285,8 @@ void SDLState::CloseJoysticks() {
class SDLButton final : public Input::ButtonDevice {
public:
explicit SDLButton(std::shared_ptr<SDLJoystick> joystick_, int button_)
: joystick(std::move(joystick_)), button(button_) {}
: joystick(std::move(joystick_)), button(button_) {
}
bool GetStatus() const override {
return joystick->GetButton(button);
@ -293,7 +300,8 @@ private:
class SDLDirectionButton final : public Input::ButtonDevice {
public:
explicit SDLDirectionButton(std::shared_ptr<SDLJoystick> joystick_, int hat_, Uint8 direction_)
: joystick(std::move(joystick_)), hat(hat_), direction(direction_) {}
: joystick(std::move(joystick_)), hat(hat_), direction(direction_) {
}
bool GetStatus() const override {
return joystick->GetHatDirection(hat, direction);
@ -310,7 +318,8 @@ public:
explicit SDLAxisButton(std::shared_ptr<SDLJoystick> joystick_, int axis_, float threshold_,
bool trigger_if_greater_)
: joystick(std::move(joystick_)), axis(axis_), threshold(threshold_),
trigger_if_greater(trigger_if_greater_) {}
trigger_if_greater(trigger_if_greater_) {
}
bool GetStatus() const override {
const float axis_value = joystick->GetAxis(axis);
@ -330,7 +339,8 @@ private:
class SDLAnalog final : public Input::AnalogDevice {
public:
SDLAnalog(std::shared_ptr<SDLJoystick> joystick_, int axis_x_, int axis_y_, float deadzone_)
: joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_) {}
: joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_) {
}
std::tuple<float, float> GetStatus() const override {
const auto [x, y] = joystick->GetAnalog(axis_x, axis_y);
@ -368,7 +378,9 @@ private:
/// A button device factory that creates button devices from SDL joystick
class SDLButtonFactory final : public Input::Factory<Input::ButtonDevice> {
public:
explicit SDLButtonFactory(SDLState& state_) : state(state_) {}
explicit SDLButtonFactory(SDLState& state_)
: state(state_) {
}
/**
* Creates a button device from a joystick button
@ -443,7 +455,10 @@ private:
/// An analog device factory that creates analog devices from SDL joystick
class SDLAnalogFactory final : public Input::Factory<Input::AnalogDevice> {
public:
explicit SDLAnalogFactory(SDLState& state_) : state(state_) {}
explicit SDLAnalogFactory(SDLState& state_)
: state(state_) {
}
/**
* Creates analog device from joystick axes
* @param params contains parameters for creating the device:
@ -490,7 +505,8 @@ SDLState::SDLState() {
initialized = true;
if (start_thread) {
poll_thread = std::thread([this] {
poll_thread = std::thread([this]
{
using namespace std::chrono_literals;
while (initialized) {
SDL_PumpEvents();
@ -576,7 +592,9 @@ namespace Polling {
class SDLPoller : public InputCommon::Polling::DevicePoller {
public:
explicit SDLPoller(SDLState& state_) : state(state_) {}
explicit SDLPoller(SDLState& state_)
: state(state_) {
}
void Start() override {
state.event_queue.Clear();
@ -593,7 +611,9 @@ protected:
class SDLButtonPoller final : public SDLPoller {
public:
explicit SDLButtonPoller(SDLState& state_) : SDLPoller(state_) {}
explicit SDLButtonPoller(SDLState& state_)
: SDLPoller(state_) {
}
Common::ParamPackage GetNextInput() override {
SDL_Event event;
@ -602,8 +622,7 @@ public:
case SDL_JOYAXISMOTION:
if (std::abs(event.jaxis.value / 32767.0) < 0.5) {
break;
}
[[fallthrough]];
}[[fallthrough]];
case SDL_JOYBUTTONUP:
case SDL_JOYHATMOTION:
return SDLEventToButtonParamPackage(state, event);
@ -615,7 +634,9 @@ public:
class SDLAnalogPoller final : public SDLPoller {
public:
explicit SDLAnalogPoller(SDLState& state_) : SDLPoller(state_) {}
explicit SDLAnalogPoller(SDLState& state_)
: SDLPoller(state_) {
}
void Start() override {
SDLPoller::Start();