summaryrefslogtreecommitdiff
path: root/src/input_common/udp/udp.cpp
diff options
context:
space:
mode:
authorGravatar fearlessTobi2019-08-24 15:57:49 +0200
committerGravatar FearlessTobi2020-01-23 20:55:26 +0100
commitac3690f2057fb93ce18f156ff5ffd720a6d6f60c (patch)
treed0ec80a2537b992146d34f5bf17ba0cc549bd88e /src/input_common/udp/udp.cpp
parentMerge pull request #3341 from bunnei/time-posix-myrule (diff)
downloadyuzu-ac3690f2057fb93ce18f156ff5ffd720a6d6f60c.tar.gz
yuzu-ac3690f2057fb93ce18f156ff5ffd720a6d6f60c.tar.xz
yuzu-ac3690f2057fb93ce18f156ff5ffd720a6d6f60c.zip
Input: UDP Client to provide motion and touch controls
An implementation of the cemuhook motion/touch protocol, this adds the ability for users to connect several different devices to citra to send direct motion and touch data to citra. Co-Authored-By: jroweboy <jroweboy@gmail.com>
Diffstat (limited to 'src/input_common/udp/udp.cpp')
-rw-r--r--src/input_common/udp/udp.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/input_common/udp/udp.cpp b/src/input_common/udp/udp.cpp
new file mode 100644
index 000000000..a80f38614
--- /dev/null
+++ b/src/input_common/udp/udp.cpp
@@ -0,0 +1,96 @@
1// Copyright 2018 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/logging/log.h"
6#include "common/param_package.h"
7#include "core/frontend/input.h"
8#include "core/settings.h"
9#include "input_common/udp/client.h"
10#include "input_common/udp/udp.h"
11
12namespace InputCommon::CemuhookUDP {
13
14class UDPTouchDevice final : public Input::TouchDevice {
15public:
16 explicit UDPTouchDevice(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {}
17 std::tuple<float, float, bool> GetStatus() const {
18 std::lock_guard guard(status->update_mutex);
19 return status->touch_status;
20 }
21
22private:
23 std::shared_ptr<DeviceStatus> status;
24};
25
26class UDPMotionDevice final : public Input::MotionDevice {
27public:
28 explicit UDPMotionDevice(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {}
29 std::tuple<Common::Vec3<float>, Common::Vec3<float>> GetStatus() const {
30 std::lock_guard guard(status->update_mutex);
31 return status->motion_status;
32 }
33
34private:
35 std::shared_ptr<DeviceStatus> status;
36};
37
38class UDPTouchFactory final : public Input::Factory<Input::TouchDevice> {
39public:
40 explicit UDPTouchFactory(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {}
41
42 std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage& params) override {
43 {
44 std::lock_guard guard(status->update_mutex);
45 status->touch_calibration.emplace();
46 // These default values work well for DS4 but probably not other touch inputs
47 status->touch_calibration->min_x = params.Get("min_x", 100);
48 status->touch_calibration->min_y = params.Get("min_y", 50);
49 status->touch_calibration->max_x = params.Get("max_x", 1800);
50 status->touch_calibration->max_y = params.Get("max_y", 850);
51 }
52 return std::make_unique<UDPTouchDevice>(status);
53 }
54
55private:
56 std::shared_ptr<DeviceStatus> status;
57};
58
59class UDPMotionFactory final : public Input::Factory<Input::MotionDevice> {
60public:
61 explicit UDPMotionFactory(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {}
62
63 std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override {
64 return std::make_unique<UDPMotionDevice>(status);
65 }
66
67private:
68 std::shared_ptr<DeviceStatus> status;
69};
70
71State::State() {
72 auto status = std::make_shared<DeviceStatus>();
73 client =
74 std::make_unique<Client>(status, Settings::values.udp_input_address,
75 Settings::values.udp_input_port, Settings::values.udp_pad_index);
76
77 Input::RegisterFactory<Input::TouchDevice>("cemuhookudp",
78 std::make_shared<UDPTouchFactory>(status));
79 Input::RegisterFactory<Input::MotionDevice>("cemuhookudp",
80 std::make_shared<UDPMotionFactory>(status));
81}
82
83State::~State() {
84 Input::UnregisterFactory<Input::TouchDevice>("cemuhookudp");
85 Input::UnregisterFactory<Input::MotionDevice>("cemuhookudp");
86}
87
88void State::ReloadUDPClient() {
89 client->ReloadSocket(Settings::values.udp_input_address, Settings::values.udp_input_port,
90 Settings::values.udp_pad_index);
91}
92
93std::unique_ptr<State> Init() {
94 return std::make_unique<State>();
95}
96} // namespace InputCommon::CemuhookUDP