summaryrefslogtreecommitdiff
path: root/src/input_common/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/main.cpp')
-rw-r--r--src/input_common/main.cpp257
1 files changed, 218 insertions, 39 deletions
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index c98c848cf..e59ad4ff5 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -6,9 +6,14 @@
6#include <thread> 6#include <thread>
7#include "common/param_package.h" 7#include "common/param_package.h"
8#include "input_common/analog_from_button.h" 8#include "input_common/analog_from_button.h"
9#include "input_common/gcadapter/gc_adapter.h"
10#include "input_common/gcadapter/gc_poller.h"
9#include "input_common/keyboard.h" 11#include "input_common/keyboard.h"
10#include "input_common/main.h" 12#include "input_common/main.h"
11#include "input_common/motion_emu.h" 13#include "input_common/motion_emu.h"
14#include "input_common/motion_from_button.h"
15#include "input_common/touch_from_button.h"
16#include "input_common/udp/client.h"
12#include "input_common/udp/udp.h" 17#include "input_common/udp/udp.h"
13#ifdef HAVE_SDL2 18#ifdef HAVE_SDL2
14#include "input_common/sdl/sdl.h" 19#include "input_common/sdl/sdl.h"
@@ -16,40 +21,228 @@
16 21
17namespace InputCommon { 22namespace InputCommon {
18 23
19static std::shared_ptr<Keyboard> keyboard; 24struct InputSubsystem::Impl {
20static std::shared_ptr<MotionEmu> motion_emu; 25 void Initialize() {
21static std::unique_ptr<SDL::State> sdl; 26 gcadapter = std::make_shared<GCAdapter::Adapter>();
22static std::unique_ptr<CemuhookUDP::State> udp; 27 gcbuttons = std::make_shared<GCButtonFactory>(gcadapter);
28 Input::RegisterFactory<Input::ButtonDevice>("gcpad", gcbuttons);
29 gcanalog = std::make_shared<GCAnalogFactory>(gcadapter);
30 Input::RegisterFactory<Input::AnalogDevice>("gcpad", gcanalog);
31 gcvibration = std::make_shared<GCVibrationFactory>(gcadapter);
32 Input::RegisterFactory<Input::VibrationDevice>("gcpad", gcvibration);
23 33
24void Init() { 34 keyboard = std::make_shared<Keyboard>();
25 keyboard = std::make_shared<Keyboard>(); 35 Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard);
26 Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard); 36 Input::RegisterFactory<Input::AnalogDevice>("analog_from_button",
27 Input::RegisterFactory<Input::AnalogDevice>("analog_from_button", 37 std::make_shared<AnalogFromButton>());
28 std::make_shared<AnalogFromButton>()); 38 Input::RegisterFactory<Input::MotionDevice>("keyboard",
29 motion_emu = std::make_shared<MotionEmu>(); 39 std::make_shared<MotionFromButton>());
30 Input::RegisterFactory<Input::MotionDevice>("motion_emu", motion_emu); 40 motion_emu = std::make_shared<MotionEmu>();
41 Input::RegisterFactory<Input::MotionDevice>("motion_emu", motion_emu);
42 Input::RegisterFactory<Input::TouchDevice>("touch_from_button",
43 std::make_shared<TouchFromButtonFactory>());
31 44
32 sdl = SDL::Init(); 45#ifdef HAVE_SDL2
46 sdl = SDL::Init();
47#endif
48
49 udp = std::make_shared<InputCommon::CemuhookUDP::Client>();
50 udpmotion = std::make_shared<UDPMotionFactory>(udp);
51 Input::RegisterFactory<Input::MotionDevice>("cemuhookudp", udpmotion);
52 udptouch = std::make_shared<UDPTouchFactory>(udp);
53 Input::RegisterFactory<Input::TouchDevice>("cemuhookudp", udptouch);
54 }
55
56 void Shutdown() {
57 Input::UnregisterFactory<Input::ButtonDevice>("keyboard");
58 Input::UnregisterFactory<Input::MotionDevice>("keyboard");
59 keyboard.reset();
60 Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
61 Input::UnregisterFactory<Input::MotionDevice>("motion_emu");
62 motion_emu.reset();
63 Input::UnregisterFactory<Input::TouchDevice>("touch_from_button");
64#ifdef HAVE_SDL2
65 sdl.reset();
66#endif
67 Input::UnregisterFactory<Input::ButtonDevice>("gcpad");
68 Input::UnregisterFactory<Input::AnalogDevice>("gcpad");
69 Input::UnregisterFactory<Input::VibrationDevice>("gcpad");
70
71 gcbuttons.reset();
72 gcanalog.reset();
73 gcvibration.reset();
74
75 Input::UnregisterFactory<Input::MotionDevice>("cemuhookudp");
76 Input::UnregisterFactory<Input::TouchDevice>("cemuhookudp");
77
78 udpmotion.reset();
79 udptouch.reset();
80 }
81
82 [[nodiscard]] std::vector<Common::ParamPackage> GetInputDevices() const {
83 std::vector<Common::ParamPackage> devices = {
84 Common::ParamPackage{{"display", "Any"}, {"class", "any"}},
85 Common::ParamPackage{{"display", "Keyboard/Mouse"}, {"class", "keyboard"}},
86 };
87#ifdef HAVE_SDL2
88 auto sdl_devices = sdl->GetInputDevices();
89 devices.insert(devices.end(), sdl_devices.begin(), sdl_devices.end());
90#endif
91 auto udp_devices = udp->GetInputDevices();
92 devices.insert(devices.end(), udp_devices.begin(), udp_devices.end());
93 auto gcpad_devices = gcadapter->GetInputDevices();
94 devices.insert(devices.end(), gcpad_devices.begin(), gcpad_devices.end());
95 return devices;
96 }
97
98 [[nodiscard]] AnalogMapping GetAnalogMappingForDevice(
99 const Common::ParamPackage& params) const {
100 if (!params.Has("class") || params.Get("class", "") == "any") {
101 return {};
102 }
103 if (params.Get("class", "") == "gcpad") {
104 return gcadapter->GetAnalogMappingForDevice(params);
105 }
106#ifdef HAVE_SDL2
107 if (params.Get("class", "") == "sdl") {
108 return sdl->GetAnalogMappingForDevice(params);
109 }
110#endif
111 return {};
112 }
113
114 [[nodiscard]] ButtonMapping GetButtonMappingForDevice(
115 const Common::ParamPackage& params) const {
116 if (!params.Has("class") || params.Get("class", "") == "any") {
117 return {};
118 }
119 if (params.Get("class", "") == "gcpad") {
120 return gcadapter->GetButtonMappingForDevice(params);
121 }
122#ifdef HAVE_SDL2
123 if (params.Get("class", "") == "sdl") {
124 return sdl->GetButtonMappingForDevice(params);
125 }
126#endif
127 return {};
128 }
129
130 [[nodiscard]] MotionMapping GetMotionMappingForDevice(
131 const Common::ParamPackage& params) const {
132 if (!params.Has("class") || params.Get("class", "") == "any") {
133 return {};
134 }
135 if (params.Get("class", "") == "cemuhookudp") {
136 // TODO return the correct motion device
137 return {};
138 }
139 return {};
140 }
141
142 std::shared_ptr<Keyboard> keyboard;
143 std::shared_ptr<MotionEmu> motion_emu;
144#ifdef HAVE_SDL2
145 std::unique_ptr<SDL::State> sdl;
146#endif
147 std::shared_ptr<GCButtonFactory> gcbuttons;
148 std::shared_ptr<GCAnalogFactory> gcanalog;
149 std::shared_ptr<GCVibrationFactory> gcvibration;
150 std::shared_ptr<UDPMotionFactory> udpmotion;
151 std::shared_ptr<UDPTouchFactory> udptouch;
152 std::shared_ptr<CemuhookUDP::Client> udp;
153 std::shared_ptr<GCAdapter::Adapter> gcadapter;
154};
155
156InputSubsystem::InputSubsystem() : impl{std::make_unique<Impl>()} {}
157
158InputSubsystem::~InputSubsystem() = default;
159
160void InputSubsystem::Initialize() {
161 impl->Initialize();
162}
163
164void InputSubsystem::Shutdown() {
165 impl->Shutdown();
166}
167
168Keyboard* InputSubsystem::GetKeyboard() {
169 return impl->keyboard.get();
170}
171
172const Keyboard* InputSubsystem::GetKeyboard() const {
173 return impl->keyboard.get();
174}
175
176MotionEmu* InputSubsystem::GetMotionEmu() {
177 return impl->motion_emu.get();
178}
179
180const MotionEmu* InputSubsystem::GetMotionEmu() const {
181 return impl->motion_emu.get();
182}
183
184std::vector<Common::ParamPackage> InputSubsystem::GetInputDevices() const {
185 return impl->GetInputDevices();
186}
187
188AnalogMapping InputSubsystem::GetAnalogMappingForDevice(const Common::ParamPackage& device) const {
189 return impl->GetAnalogMappingForDevice(device);
190}
191
192ButtonMapping InputSubsystem::GetButtonMappingForDevice(const Common::ParamPackage& device) const {
193 return impl->GetButtonMappingForDevice(device);
194}
195
196MotionMapping InputSubsystem::GetMotionMappingForDevice(const Common::ParamPackage& device) const {
197 return impl->GetMotionMappingForDevice(device);
198}
199
200GCAnalogFactory* InputSubsystem::GetGCAnalogs() {
201 return impl->gcanalog.get();
202}
203
204const GCAnalogFactory* InputSubsystem::GetGCAnalogs() const {
205 return impl->gcanalog.get();
206}
207
208GCButtonFactory* InputSubsystem::GetGCButtons() {
209 return impl->gcbuttons.get();
210}
33 211
34 udp = CemuhookUDP::Init(); 212const GCButtonFactory* InputSubsystem::GetGCButtons() const {
213 return impl->gcbuttons.get();
35} 214}
36 215
37void Shutdown() { 216UDPMotionFactory* InputSubsystem::GetUDPMotions() {
38 Input::UnregisterFactory<Input::ButtonDevice>("keyboard"); 217 return impl->udpmotion.get();
39 keyboard.reset();
40 Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
41 Input::UnregisterFactory<Input::MotionDevice>("motion_emu");
42 motion_emu.reset();
43 sdl.reset();
44 udp.reset();
45} 218}
46 219
47Keyboard* GetKeyboard() { 220const UDPMotionFactory* InputSubsystem::GetUDPMotions() const {
48 return keyboard.get(); 221 return impl->udpmotion.get();
49} 222}
50 223
51MotionEmu* GetMotionEmu() { 224UDPTouchFactory* InputSubsystem::GetUDPTouch() {
52 return motion_emu.get(); 225 return impl->udptouch.get();
226}
227
228const UDPTouchFactory* InputSubsystem::GetUDPTouch() const {
229 return impl->udptouch.get();
230}
231
232void InputSubsystem::ReloadInputDevices() {
233 if (!impl->udp) {
234 return;
235 }
236 impl->udp->ReloadUDPClient();
237}
238
239std::vector<std::unique_ptr<Polling::DevicePoller>> InputSubsystem::GetPollers(
240 Polling::DeviceType type) const {
241#ifdef HAVE_SDL2
242 return impl->sdl->GetPollers(type);
243#else
244 return {};
245#endif
53} 246}
54 247
55std::string GenerateKeyboardParam(int key_code) { 248std::string GenerateKeyboardParam(int key_code) {
@@ -73,18 +266,4 @@ std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left,
73 }; 266 };
74 return circle_pad_param.Serialize(); 267 return circle_pad_param.Serialize();
75} 268}
76
77namespace Polling {
78
79std::vector<std::unique_ptr<DevicePoller>> GetPollers(DeviceType type) {
80 std::vector<std::unique_ptr<DevicePoller>> pollers;
81
82#ifdef HAVE_SDL2
83 pollers = sdl->GetPollers(type);
84#endif
85
86 return pollers;
87}
88
89} // namespace Polling
90} // namespace InputCommon 269} // namespace InputCommon