summaryrefslogtreecommitdiff
path: root/src/input_common/input_engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/input_engine.cpp')
-rw-r--r--src/input_common/input_engine.cpp135
1 files changed, 104 insertions, 31 deletions
diff --git a/src/input_common/input_engine.cpp b/src/input_common/input_engine.cpp
index 65ae1b848..61cfd0911 100644
--- a/src/input_common/input_engine.cpp
+++ b/src/input_common/input_engine.cpp
@@ -1,45 +1,43 @@
1// Copyright 2021 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
2// Licensed under GPLv2 or any later version 2// SPDX-License-Identifier: GPL-2.0-or-later
3// Refer to the license.txt file included
4 3
5#include "common/logging/log.h" 4#include "common/logging/log.h"
6#include "common/param_package.h"
7#include "input_common/input_engine.h" 5#include "input_common/input_engine.h"
8 6
9namespace InputCommon { 7namespace InputCommon {
10 8
11void InputEngine::PreSetController(const PadIdentifier& identifier) { 9void InputEngine::PreSetController(const PadIdentifier& identifier) {
12 std::lock_guard lock{mutex}; 10 std::scoped_lock lock{mutex};
13 controller_list.try_emplace(identifier); 11 controller_list.try_emplace(identifier);
14} 12}
15 13
16void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) { 14void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) {
17 std::lock_guard lock{mutex}; 15 std::scoped_lock lock{mutex};
18 ControllerData& controller = controller_list.at(identifier); 16 ControllerData& controller = controller_list.at(identifier);
19 controller.buttons.try_emplace(button, false); 17 controller.buttons.try_emplace(button, false);
20} 18}
21 19
22void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) { 20void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) {
23 std::lock_guard lock{mutex}; 21 std::scoped_lock lock{mutex};
24 ControllerData& controller = controller_list.at(identifier); 22 ControllerData& controller = controller_list.at(identifier);
25 controller.hat_buttons.try_emplace(button, u8{0}); 23 controller.hat_buttons.try_emplace(button, u8{0});
26} 24}
27 25
28void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) { 26void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) {
29 std::lock_guard lock{mutex}; 27 std::scoped_lock lock{mutex};
30 ControllerData& controller = controller_list.at(identifier); 28 ControllerData& controller = controller_list.at(identifier);
31 controller.axes.try_emplace(axis, 0.0f); 29 controller.axes.try_emplace(axis, 0.0f);
32} 30}
33 31
34void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) { 32void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) {
35 std::lock_guard lock{mutex}; 33 std::scoped_lock lock{mutex};
36 ControllerData& controller = controller_list.at(identifier); 34 ControllerData& controller = controller_list.at(identifier);
37 controller.motions.try_emplace(motion); 35 controller.motions.try_emplace(motion);
38} 36}
39 37
40void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) { 38void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) {
41 { 39 {
42 std::lock_guard lock{mutex}; 40 std::scoped_lock lock{mutex};
43 ControllerData& controller = controller_list.at(identifier); 41 ControllerData& controller = controller_list.at(identifier);
44 if (!configuring) { 42 if (!configuring) {
45 controller.buttons.insert_or_assign(button, value); 43 controller.buttons.insert_or_assign(button, value);
@@ -50,7 +48,7 @@ void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool va
50 48
51void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 value) { 49void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 value) {
52 { 50 {
53 std::lock_guard lock{mutex}; 51 std::scoped_lock lock{mutex};
54 ControllerData& controller = controller_list.at(identifier); 52 ControllerData& controller = controller_list.at(identifier);
55 if (!configuring) { 53 if (!configuring) {
56 controller.hat_buttons.insert_or_assign(button, value); 54 controller.hat_buttons.insert_or_assign(button, value);
@@ -61,7 +59,7 @@ void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 v
61 59
62void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value) { 60void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value) {
63 { 61 {
64 std::lock_guard lock{mutex}; 62 std::scoped_lock lock{mutex};
65 ControllerData& controller = controller_list.at(identifier); 63 ControllerData& controller = controller_list.at(identifier);
66 if (!configuring) { 64 if (!configuring) {
67 controller.axes.insert_or_assign(axis, value); 65 controller.axes.insert_or_assign(axis, value);
@@ -70,9 +68,9 @@ void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value)
70 TriggerOnAxisChange(identifier, axis, value); 68 TriggerOnAxisChange(identifier, axis, value);
71} 69}
72 70
73void InputEngine::SetBattery(const PadIdentifier& identifier, BatteryLevel value) { 71void InputEngine::SetBattery(const PadIdentifier& identifier, Common::Input::BatteryLevel value) {
74 { 72 {
75 std::lock_guard lock{mutex}; 73 std::scoped_lock lock{mutex};
76 ControllerData& controller = controller_list.at(identifier); 74 ControllerData& controller = controller_list.at(identifier);
77 if (!configuring) { 75 if (!configuring) {
78 controller.battery = value; 76 controller.battery = value;
@@ -83,7 +81,7 @@ void InputEngine::SetBattery(const PadIdentifier& identifier, BatteryLevel value
83 81
84void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) { 82void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) {
85 { 83 {
86 std::lock_guard lock{mutex}; 84 std::scoped_lock lock{mutex};
87 ControllerData& controller = controller_list.at(identifier); 85 ControllerData& controller = controller_list.at(identifier);
88 if (!configuring) { 86 if (!configuring) {
89 controller.motions.insert_or_assign(motion, value); 87 controller.motions.insert_or_assign(motion, value);
@@ -92,8 +90,31 @@ void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const B
92 TriggerOnMotionChange(identifier, motion, value); 90 TriggerOnMotionChange(identifier, motion, value);
93} 91}
94 92
93void InputEngine::SetCamera(const PadIdentifier& identifier,
94 const Common::Input::CameraStatus& value) {
95 {
96 std::scoped_lock lock{mutex};
97 ControllerData& controller = controller_list.at(identifier);
98 if (!configuring) {
99 controller.camera = value;
100 }
101 }
102 TriggerOnCameraChange(identifier, value);
103}
104
105void InputEngine::SetNfc(const PadIdentifier& identifier, const Common::Input::NfcStatus& value) {
106 {
107 std::scoped_lock lock{mutex};
108 ControllerData& controller = controller_list.at(identifier);
109 if (!configuring) {
110 controller.nfc = value;
111 }
112 }
113 TriggerOnNfcChange(identifier, value);
114}
115
95bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { 116bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const {
96 std::lock_guard lock{mutex}; 117 std::scoped_lock lock{mutex};
97 const auto controller_iter = controller_list.find(identifier); 118 const auto controller_iter = controller_list.find(identifier);
98 if (controller_iter == controller_list.cend()) { 119 if (controller_iter == controller_list.cend()) {
99 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), 120 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
@@ -110,7 +131,7 @@ bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const {
110} 131}
111 132
112bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const { 133bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const {
113 std::lock_guard lock{mutex}; 134 std::scoped_lock lock{mutex};
114 const auto controller_iter = controller_list.find(identifier); 135 const auto controller_iter = controller_list.find(identifier);
115 if (controller_iter == controller_list.cend()) { 136 if (controller_iter == controller_list.cend()) {
116 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), 137 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
@@ -127,7 +148,7 @@ bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 d
127} 148}
128 149
129f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { 150f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const {
130 std::lock_guard lock{mutex}; 151 std::scoped_lock lock{mutex};
131 const auto controller_iter = controller_list.find(identifier); 152 const auto controller_iter = controller_list.find(identifier);
132 if (controller_iter == controller_list.cend()) { 153 if (controller_iter == controller_list.cend()) {
133 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), 154 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
@@ -143,20 +164,20 @@ f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const {
143 return axis_iter->second; 164 return axis_iter->second;
144} 165}
145 166
146BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const { 167Common::Input::BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const {
147 std::lock_guard lock{mutex}; 168 std::scoped_lock lock{mutex};
148 const auto controller_iter = controller_list.find(identifier); 169 const auto controller_iter = controller_list.find(identifier);
149 if (controller_iter == controller_list.cend()) { 170 if (controller_iter == controller_list.cend()) {
150 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), 171 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
151 identifier.pad, identifier.port); 172 identifier.pad, identifier.port);
152 return BatteryLevel::Charging; 173 return Common::Input::BatteryLevel::Charging;
153 } 174 }
154 const ControllerData& controller = controller_iter->second; 175 const ControllerData& controller = controller_iter->second;
155 return controller.battery; 176 return controller.battery;
156} 177}
157 178
158BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { 179BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const {
159 std::lock_guard lock{mutex}; 180 std::scoped_lock lock{mutex};
160 const auto controller_iter = controller_list.find(identifier); 181 const auto controller_iter = controller_list.find(identifier);
161 if (controller_iter == controller_list.cend()) { 182 if (controller_iter == controller_list.cend()) {
162 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), 183 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
@@ -167,6 +188,30 @@ BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion)
167 return controller.motions.at(motion); 188 return controller.motions.at(motion);
168} 189}
169 190
191Common::Input::CameraStatus InputEngine::GetCamera(const PadIdentifier& identifier) const {
192 std::scoped_lock lock{mutex};
193 const auto controller_iter = controller_list.find(identifier);
194 if (controller_iter == controller_list.cend()) {
195 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
196 identifier.pad, identifier.port);
197 return {};
198 }
199 const ControllerData& controller = controller_iter->second;
200 return controller.camera;
201}
202
203Common::Input::NfcStatus InputEngine::GetNfc(const PadIdentifier& identifier) const {
204 std::scoped_lock lock{mutex};
205 const auto controller_iter = controller_list.find(identifier);
206 if (controller_iter == controller_list.cend()) {
207 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(),
208 identifier.pad, identifier.port);
209 return {};
210 }
211 const ControllerData& controller = controller_iter->second;
212 return controller.nfc;
213}
214
170void InputEngine::ResetButtonState() { 215void InputEngine::ResetButtonState() {
171 for (const auto& controller : controller_list) { 216 for (const auto& controller : controller_list) {
172 for (const auto& button : controller.second.buttons) { 217 for (const auto& button : controller.second.buttons) {
@@ -187,7 +232,7 @@ void InputEngine::ResetAnalogState() {
187} 232}
188 233
189void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) { 234void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) {
190 std::lock_guard lock{mutex_callback}; 235 std::scoped_lock lock{mutex_callback};
191 for (const auto& poller_pair : callback_list) { 236 for (const auto& poller_pair : callback_list) {
192 const InputIdentifier& poller = poller_pair.second; 237 const InputIdentifier& poller = poller_pair.second;
193 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) { 238 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) {
@@ -215,7 +260,7 @@ void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int but
215} 260}
216 261
217void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) { 262void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) {
218 std::lock_guard lock{mutex_callback}; 263 std::scoped_lock lock{mutex_callback};
219 for (const auto& poller_pair : callback_list) { 264 for (const auto& poller_pair : callback_list) {
220 const InputIdentifier& poller = poller_pair.second; 265 const InputIdentifier& poller = poller_pair.second;
221 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) { 266 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) {
@@ -244,7 +289,7 @@ void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int
244} 289}
245 290
246void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) { 291void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) {
247 std::lock_guard lock{mutex_callback}; 292 std::scoped_lock lock{mutex_callback};
248 for (const auto& poller_pair : callback_list) { 293 for (const auto& poller_pair : callback_list) {
249 const InputIdentifier& poller = poller_pair.second; 294 const InputIdentifier& poller = poller_pair.second;
250 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) { 295 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) {
@@ -270,8 +315,8 @@ void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis,
270} 315}
271 316
272void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, 317void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier,
273 [[maybe_unused]] BatteryLevel value) { 318 [[maybe_unused]] Common::Input::BatteryLevel value) {
274 std::lock_guard lock{mutex_callback}; 319 std::scoped_lock lock{mutex_callback};
275 for (const auto& poller_pair : callback_list) { 320 for (const auto& poller_pair : callback_list) {
276 const InputIdentifier& poller = poller_pair.second; 321 const InputIdentifier& poller = poller_pair.second;
277 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) { 322 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) {
@@ -285,7 +330,7 @@ void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier,
285 330
286void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion, 331void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion,
287 const BasicMotion& value) { 332 const BasicMotion& value) {
288 std::lock_guard lock{mutex_callback}; 333 std::scoped_lock lock{mutex_callback};
289 for (const auto& poller_pair : callback_list) { 334 for (const auto& poller_pair : callback_list) {
290 const InputIdentifier& poller = poller_pair.second; 335 const InputIdentifier& poller = poller_pair.second;
291 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) { 336 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) {
@@ -319,6 +364,34 @@ void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int mot
319 }); 364 });
320} 365}
321 366
367void InputEngine::TriggerOnCameraChange(const PadIdentifier& identifier,
368 [[maybe_unused]] const Common::Input::CameraStatus& value) {
369 std::scoped_lock lock{mutex_callback};
370 for (const auto& poller_pair : callback_list) {
371 const InputIdentifier& poller = poller_pair.second;
372 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Camera, 0)) {
373 continue;
374 }
375 if (poller.callback.on_change) {
376 poller.callback.on_change();
377 }
378 }
379}
380
381void InputEngine::TriggerOnNfcChange(const PadIdentifier& identifier,
382 [[maybe_unused]] const Common::Input::NfcStatus& value) {
383 std::scoped_lock lock{mutex_callback};
384 for (const auto& poller_pair : callback_list) {
385 const InputIdentifier& poller = poller_pair.second;
386 if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Nfc, 0)) {
387 continue;
388 }
389 if (poller.callback.on_change) {
390 poller.callback.on_change();
391 }
392 }
393}
394
322bool InputEngine::IsInputIdentifierEqual(const InputIdentifier& input_identifier, 395bool InputEngine::IsInputIdentifierEqual(const InputIdentifier& input_identifier,
323 const PadIdentifier& identifier, EngineInputType type, 396 const PadIdentifier& identifier, EngineInputType type,
324 int index) const { 397 int index) const {
@@ -347,18 +420,18 @@ const std::string& InputEngine::GetEngineName() const {
347} 420}
348 421
349int InputEngine::SetCallback(InputIdentifier input_identifier) { 422int InputEngine::SetCallback(InputIdentifier input_identifier) {
350 std::lock_guard lock{mutex_callback}; 423 std::scoped_lock lock{mutex_callback};
351 callback_list.insert_or_assign(last_callback_key, std::move(input_identifier)); 424 callback_list.insert_or_assign(last_callback_key, std::move(input_identifier));
352 return last_callback_key++; 425 return last_callback_key++;
353} 426}
354 427
355void InputEngine::SetMappingCallback(MappingCallback callback) { 428void InputEngine::SetMappingCallback(MappingCallback callback) {
356 std::lock_guard lock{mutex_callback}; 429 std::scoped_lock lock{mutex_callback};
357 mapping_callback = std::move(callback); 430 mapping_callback = std::move(callback);
358} 431}
359 432
360void InputEngine::DeleteCallback(int key) { 433void InputEngine::DeleteCallback(int key) {
361 std::lock_guard lock{mutex_callback}; 434 std::scoped_lock lock{mutex_callback};
362 const auto& iterator = callback_list.find(key); 435 const auto& iterator = callback_list.find(key);
363 if (iterator == callback_list.end()) { 436 if (iterator == callback_list.end()) {
364 LOG_ERROR(Input, "Tried to delete non-existent callback {}", key); 437 LOG_ERROR(Input, "Tried to delete non-existent callback {}", key);