| | |
| | |
| | |
| |
|
| | #include <mutex> |
| | #include <optional> |
| | #include <tuple> |
| | #include "common/param_package.h" |
| | #include "common/settings.h" |
| | #include "core/frontend/input.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<DeviceStatus> status_) : status(std::move(status_)) {} |
| | std::tuple<float, float, bool> GetStatus() const override { |
| | std::lock_guard guard(status->update_mutex); |
| | return status->touch_status; |
| | } |
| |
|
| | private: |
| | std::shared_ptr<DeviceStatus> status; |
| | }; |
| |
|
| | class UDPMotionDevice final : public Input::MotionDevice { |
| | public: |
| | explicit UDPMotionDevice(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {} |
| | std::tuple<Common::Vec3<float>, Common::Vec3<float>> GetStatus() const override { |
| | std::lock_guard guard(status->update_mutex); |
| | return status->motion_status; |
| | } |
| |
|
| | private: |
| | std::shared_ptr<DeviceStatus> status; |
| | }; |
| |
|
| | class UDPTouchFactory final : public Input::Factory<Input::TouchDevice> { |
| | public: |
| | explicit UDPTouchFactory(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {} |
| |
|
| | std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage& params) override { |
| | { |
| | std::lock_guard guard(status->update_mutex); |
| | status->touch_calibration = DeviceStatus::CalibrationData{}; |
| | |
| | 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<UDPTouchDevice>(status); |
| | } |
| |
|
| | private: |
| | std::shared_ptr<DeviceStatus> status; |
| | }; |
| |
|
| | class UDPMotionFactory final : public Input::Factory<Input::MotionDevice> { |
| | public: |
| | explicit UDPMotionFactory(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {} |
| |
|
| | std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override { |
| | return std::make_unique<UDPMotionDevice>(status); |
| | } |
| |
|
| | private: |
| | std::shared_ptr<DeviceStatus> status; |
| | }; |
| |
|
| | State::State() { |
| | auto status = std::make_shared<DeviceStatus>(); |
| | client = |
| | std::make_unique<Client>(status, Settings::values.current_input_profile.udp_input_address, |
| | Settings::values.current_input_profile.udp_input_port, |
| | Settings::values.current_input_profile.udp_pad_index); |
| |
|
| | Input::RegisterFactory<Input::TouchDevice>("cemuhookudp", |
| | std::make_shared<UDPTouchFactory>(status)); |
| | Input::RegisterFactory<Input::MotionDevice>("cemuhookudp", |
| | std::make_shared<UDPMotionFactory>(status)); |
| | } |
| |
|
| | State::~State() { |
| | Input::UnregisterFactory<Input::TouchDevice>("cemuhookudp"); |
| | Input::UnregisterFactory<Input::MotionDevice>("cemuhookudp"); |
| | } |
| |
|
| | void State::ReloadUDPClient() { |
| | client->ReloadSocket(Settings::values.current_input_profile.udp_input_address, |
| | Settings::values.current_input_profile.udp_input_port, |
| | Settings::values.current_input_profile.udp_pad_index); |
| | } |
| |
|
| | std::unique_ptr<State> Init() { |
| | return std::make_unique<State>(); |
| | } |
| | } |
| |
|