// Copyright 2018 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include #include #include #include "common/param_package.h" #include "core/frontend/input.h" #include "core/settings.h" #include "input_common/udp/client.h" #include "input_common/udp/udp.h" namespace InputCommon::CemuhookUDP { class UDPTouchDevice final : public Input::TouchDevice { public: explicit UDPTouchDevice(std::shared_ptr status_) : status(std::move(status_)) { } std::tuple GetStatus() const override { std::lock_guard guard(status->update_mutex); return status->touch_status; } private: std::shared_ptr status; }; class UDPMotionDevice final : public Input::MotionDevice { public: explicit UDPMotionDevice(std::shared_ptr status_) : status(std::move(status_)) { } std::tuple, Common::Vec3> GetStatus() const override { std::lock_guard guard(status->update_mutex); return status->motion_status; } private: std::shared_ptr status; }; class UDPTouchFactory final : public Input::Factory { public: explicit UDPTouchFactory(std::shared_ptr status_) : status(std::move(status_)) { } std::unique_ptr Create(const Common::ParamPackage& params) override { { std::lock_guard guard(status->update_mutex); status->touch_calibration = DeviceStatus::CalibrationData{}; // These default values work well for DS4 but probably not other touch inputs status->touch_calibration->min_x = params.Get("min_x", 100); status->touch_calibration->min_y = params.Get("min_y", 50); status->touch_calibration->max_x = params.Get("max_x", 1800); status->touch_calibration->max_y = params.Get("max_y", 850); } return std::make_unique(status); } private: std::shared_ptr status; }; class UDPMotionFactory final : public Input::Factory { public: explicit UDPMotionFactory(std::shared_ptr status_) : status(std::move(status_)) { } std::unique_ptr Create(const Common::ParamPackage& params) override { return std::make_unique(status); } private: std::shared_ptr status; }; State::State() { auto status = std::make_shared(); client = std::make_unique(status, Settings::values.udp_input_address, Settings::values.udp_input_port, Settings::values.udp_pad_index); Input::RegisterFactory("cemuhookudp", std::make_shared(status)); Input::RegisterFactory("cemuhookudp", std::make_shared(status)); } State::~State() { Input::UnregisterFactory("cemuhookudp"); Input::UnregisterFactory("cemuhookudp"); } void State::ReloadUDPClient() { client->ReloadSocket(Settings::values.udp_input_address, Settings::values.udp_input_port, Settings::values.udp_pad_index); } std::unique_ptr Init() { return std::make_unique(); } } // namespace InputCommon::CemuhookUDP