summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar german772021-10-27 00:20:28 -0500
committerGravatar Narr the Reg2021-11-24 20:30:26 -0600
commitc085e54316c5520ed7d58a92a7faa9e896bb6c71 (patch)
tree05a5798ddc25ce2afa423cd70bec979705b63143 /src
parentinput_common: Fix UDP uuid (diff)
downloadyuzu-c085e54316c5520ed7d58a92a7faa9e896bb6c71.tar.gz
yuzu-c085e54316c5520ed7d58a92a7faa9e896bb6c71.tar.xz
yuzu-c085e54316c5520ed7d58a92a7faa9e896bb6c71.zip
core/hid: Add TAS input
Diffstat (limited to 'src')
-rw-r--r--src/common/settings.h1
-rw-r--r--src/core/hid/emulated_controller.cpp72
-rw-r--r--src/core/hid/emulated_controller.h9
-rw-r--r--src/yuzu/configuration/config.cpp2
-rw-r--r--src/yuzu/configuration/configure_tas.cpp2
-rw-r--r--src/yuzu/configuration/configure_tas.ui9
6 files changed, 82 insertions, 13 deletions
diff --git a/src/common/settings.h b/src/common/settings.h
index 4cf28617c..dac44d000 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -567,7 +567,6 @@ struct Values {
567 BasicSetting<bool> pause_tas_on_load{true, "pause_tas_on_load"}; 567 BasicSetting<bool> pause_tas_on_load{true, "pause_tas_on_load"};
568 BasicSetting<bool> tas_enable{false, "tas_enable"}; 568 BasicSetting<bool> tas_enable{false, "tas_enable"};
569 BasicSetting<bool> tas_loop{false, "tas_loop"}; 569 BasicSetting<bool> tas_loop{false, "tas_loop"};
570 BasicSetting<bool> tas_swap_controllers{true, "tas_swap_controllers"};
571 570
572 BasicSetting<bool> mouse_panning{false, "mouse_panning"}; 571 BasicSetting<bool> mouse_panning{false, "mouse_panning"};
573 BasicRangedSetting<u8> mouse_panning_sensitivity{10, 1, 100, "mouse_panning_sensitivity"}; 572 BasicRangedSetting<u8> mouse_panning_sensitivity{10, 1, 100, "mouse_panning_sensitivity"};
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 916368c68..2b051ccaf 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -105,6 +105,8 @@ void EmulatedController::LoadDevices() {
105 output_params[LeftIndex].Set("output", true); 105 output_params[LeftIndex].Set("output", true);
106 output_params[RightIndex].Set("output", true); 106 output_params[RightIndex].Set("output", true);
107 107
108 LoadTASParams();
109
108 std::transform(button_params.begin() + Settings::NativeButton::BUTTON_HID_BEGIN, 110 std::transform(button_params.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
109 button_params.begin() + Settings::NativeButton::BUTTON_NS_END, 111 button_params.begin() + Settings::NativeButton::BUTTON_NS_END,
110 button_devices.begin(), Input::CreateDevice<Input::InputDevice>); 112 button_devices.begin(), Input::CreateDevice<Input::InputDevice>);
@@ -120,6 +122,51 @@ void EmulatedController::LoadDevices() {
120 Input::CreateDevice<Input::InputDevice>); 122 Input::CreateDevice<Input::InputDevice>);
121 std::transform(output_params.begin(), output_params.end(), output_devices.begin(), 123 std::transform(output_params.begin(), output_params.end(), output_devices.begin(),
122 Input::CreateDevice<Input::OutputDevice>); 124 Input::CreateDevice<Input::OutputDevice>);
125
126 // Initialize TAS devices
127 std::transform(tas_button_params.begin(), tas_button_params.end(), tas_button_devices.begin(),
128 Input::CreateDevice<Input::InputDevice>);
129 std::transform(tas_stick_params.begin(), tas_stick_params.begin(), tas_stick_devices.begin(),
130 Input::CreateDevice<Input::InputDevice>);
131}
132
133void EmulatedController::LoadTASParams() {
134 const auto player_index = NpadIdTypeToIndex(npad_id_type);
135 Common::ParamPackage common_params{};
136 common_params.Set("engine", "tas");
137 common_params.Set("pad", static_cast<int>(player_index));
138 for (auto& param : tas_button_params) {
139 param = common_params;
140 }
141 for (auto& param : tas_stick_params) {
142 param = common_params;
143 }
144
145 tas_button_params[Settings::NativeButton::A].Set("button", 1 << 0);
146 tas_button_params[Settings::NativeButton::B].Set("button", 1 << 1);
147 tas_button_params[Settings::NativeButton::X].Set("button", 1 << 2);
148 tas_button_params[Settings::NativeButton::Y].Set("button", 1 << 3);
149 tas_button_params[Settings::NativeButton::LStick].Set("button", 1 << 4);
150 tas_button_params[Settings::NativeButton::RStick].Set("button", 1 << 5);
151 tas_button_params[Settings::NativeButton::L].Set("button", 1 << 6);
152 tas_button_params[Settings::NativeButton::R].Set("button", 1 << 7);
153 tas_button_params[Settings::NativeButton::ZL].Set("button", 1 << 8);
154 tas_button_params[Settings::NativeButton::ZR].Set("button", 1 << 9);
155 tas_button_params[Settings::NativeButton::Plus].Set("button", 1 << 10);
156 tas_button_params[Settings::NativeButton::Minus].Set("button", 1 << 11);
157 tas_button_params[Settings::NativeButton::DLeft].Set("button", 1 << 12);
158 tas_button_params[Settings::NativeButton::DUp].Set("button", 1 << 13);
159 tas_button_params[Settings::NativeButton::DRight].Set("button", 1 << 14);
160 tas_button_params[Settings::NativeButton::DDown].Set("button", 1 << 15);
161 tas_button_params[Settings::NativeButton::SL].Set("button", 1 << 16);
162 tas_button_params[Settings::NativeButton::SR].Set("button", 1 << 17);
163 tas_button_params[Settings::NativeButton::Home].Set("button", 1 << 18);
164 tas_button_params[Settings::NativeButton::Screenshot].Set("button", 1 << 19);
165
166 tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
167 tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
168 tas_stick_params[Settings::NativeAnalog::RStick].Set("axis_x", 2);
169 tas_stick_params[Settings::NativeAnalog::RStick].Set("axis_y", 3);
123} 170}
124 171
125void EmulatedController::ReloadInput() { 172void EmulatedController::ReloadInput() {
@@ -174,6 +221,25 @@ void EmulatedController::ReloadInput() {
174 motion_devices[index]->SetCallback(motion_callback); 221 motion_devices[index]->SetCallback(motion_callback);
175 motion_devices[index]->ForceUpdate(); 222 motion_devices[index]->ForceUpdate();
176 } 223 }
224
225 // Register TAS devices. No need to force update
226 for (std::size_t index = 0; index < tas_button_devices.size(); ++index) {
227 if (!tas_button_devices[index]) {
228 continue;
229 }
230 Input::InputCallback button_callback{
231 [this, index](Input::CallbackStatus callback) { SetButton(callback, index); }};
232 tas_button_devices[index]->SetCallback(button_callback);
233 }
234
235 for (std::size_t index = 0; index < tas_stick_devices.size(); ++index) {
236 if (!tas_stick_devices[index]) {
237 continue;
238 }
239 Input::InputCallback stick_callback{
240 [this, index](Input::CallbackStatus callback) { SetStick(callback, index); }};
241 tas_stick_devices[index]->SetCallback(stick_callback);
242 }
177} 243}
178 244
179void EmulatedController::UnloadInput() { 245void EmulatedController::UnloadInput() {
@@ -195,6 +261,12 @@ void EmulatedController::UnloadInput() {
195 for (auto& output : output_devices) { 261 for (auto& output : output_devices) {
196 output.reset(); 262 output.reset();
197 } 263 }
264 for (auto& button : tas_button_devices) {
265 button.reset();
266 }
267 for (auto& stick : tas_stick_devices) {
268 stick.reset();
269 }
198} 270}
199 271
200void EmulatedController::EnableConfiguration() { 272void EmulatedController::EnableConfiguration() {
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
index eb705a241..eec51e34a 100644
--- a/src/core/hid/emulated_controller.h
+++ b/src/core/hid/emulated_controller.h
@@ -299,6 +299,9 @@ private:
299 /// creates input devices from params 299 /// creates input devices from params
300 void LoadDevices(); 300 void LoadDevices();
301 301
302 /// Set the params for TAS devices
303 void LoadTASParams();
304
302 /** 305 /**
303 * Updates the button status of the controller 306 * Updates the button status of the controller
304 * @param callback: A CallbackStatus containing the button status 307 * @param callback: A CallbackStatus containing the button status
@@ -363,6 +366,12 @@ private:
363 BatteryDevices battery_devices; 366 BatteryDevices battery_devices;
364 OutputDevices output_devices; 367 OutputDevices output_devices;
365 368
369 // TAS related variables
370 ButtonParams tas_button_params;
371 StickParams tas_stick_params;
372 ButtonDevices tas_button_devices;
373 StickDevices tas_stick_devices;
374
366 mutable std::mutex mutex; 375 mutable std::mutex mutex;
367 std::unordered_map<int, ControllerUpdateCallback> callback_list; 376 std::unordered_map<int, ControllerUpdateCallback> callback_list;
368 int last_callback_key = 0; 377 int last_callback_key = 0;
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 56af07507..7a748d9c8 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -573,7 +573,6 @@ void Config::ReadControlValues() {
573 573
574 ReadBasicSetting(Settings::values.tas_enable); 574 ReadBasicSetting(Settings::values.tas_enable);
575 ReadBasicSetting(Settings::values.tas_loop); 575 ReadBasicSetting(Settings::values.tas_loop);
576 ReadBasicSetting(Settings::values.tas_swap_controllers);
577 ReadBasicSetting(Settings::values.pause_tas_on_load); 576 ReadBasicSetting(Settings::values.pause_tas_on_load);
578 577
579 ReadGlobalSetting(Settings::values.use_docked_mode); 578 ReadGlobalSetting(Settings::values.use_docked_mode);
@@ -1209,7 +1208,6 @@ void Config::SaveControlValues() {
1209 1208
1210 WriteBasicSetting(Settings::values.tas_enable); 1209 WriteBasicSetting(Settings::values.tas_enable);
1211 WriteBasicSetting(Settings::values.tas_loop); 1210 WriteBasicSetting(Settings::values.tas_loop);
1212 WriteBasicSetting(Settings::values.tas_swap_controllers);
1213 WriteBasicSetting(Settings::values.pause_tas_on_load); 1211 WriteBasicSetting(Settings::values.pause_tas_on_load);
1214 1212
1215 qt_config->endGroup(); 1213 qt_config->endGroup();
diff --git a/src/yuzu/configuration/configure_tas.cpp b/src/yuzu/configuration/configure_tas.cpp
index 8e5a4c72d..979a8db61 100644
--- a/src/yuzu/configuration/configure_tas.cpp
+++ b/src/yuzu/configuration/configure_tas.cpp
@@ -32,7 +32,6 @@ void ConfigureTasDialog::LoadConfiguration() {
32 ui->tas_path_edit->setText( 32 ui->tas_path_edit->setText(
33 QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::TASDir))); 33 QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::TASDir)));
34 ui->tas_enable->setChecked(Settings::values.tas_enable.GetValue()); 34 ui->tas_enable->setChecked(Settings::values.tas_enable.GetValue());
35 ui->tas_control_swap->setChecked(Settings::values.tas_swap_controllers.GetValue());
36 ui->tas_loop_script->setChecked(Settings::values.tas_loop.GetValue()); 35 ui->tas_loop_script->setChecked(Settings::values.tas_loop.GetValue());
37 ui->tas_pause_on_load->setChecked(Settings::values.pause_tas_on_load.GetValue()); 36 ui->tas_pause_on_load->setChecked(Settings::values.pause_tas_on_load.GetValue());
38} 37}
@@ -40,7 +39,6 @@ void ConfigureTasDialog::LoadConfiguration() {
40void ConfigureTasDialog::ApplyConfiguration() { 39void ConfigureTasDialog::ApplyConfiguration() {
41 Common::FS::SetYuzuPath(Common::FS::YuzuPath::TASDir, ui->tas_path_edit->text().toStdString()); 40 Common::FS::SetYuzuPath(Common::FS::YuzuPath::TASDir, ui->tas_path_edit->text().toStdString());
42 Settings::values.tas_enable.SetValue(ui->tas_enable->isChecked()); 41 Settings::values.tas_enable.SetValue(ui->tas_enable->isChecked());
43 Settings::values.tas_swap_controllers.SetValue(ui->tas_control_swap->isChecked());
44 Settings::values.tas_loop.SetValue(ui->tas_loop_script->isChecked()); 42 Settings::values.tas_loop.SetValue(ui->tas_loop_script->isChecked());
45 Settings::values.pause_tas_on_load.SetValue(ui->tas_pause_on_load->isChecked()); 43 Settings::values.pause_tas_on_load.SetValue(ui->tas_pause_on_load->isChecked());
46} 44}
diff --git a/src/yuzu/configuration/configure_tas.ui b/src/yuzu/configuration/configure_tas.ui
index 7d44895c4..cf88a5bf0 100644
--- a/src/yuzu/configuration/configure_tas.ui
+++ b/src/yuzu/configuration/configure_tas.ui
@@ -59,20 +59,13 @@
59 </widget> 59 </widget>
60 </item> 60 </item>
61 <item row="1" column="0" colspan="4"> 61 <item row="1" column="0" colspan="4">
62 <widget class="QCheckBox" name="tas_control_swap">
63 <property name="text">
64 <string>Automatic controller profile swapping</string>
65 </property>
66 </widget>
67 </item>
68 <item row="2" column="0" colspan="4">
69 <widget class="QCheckBox" name="tas_loop_script"> 62 <widget class="QCheckBox" name="tas_loop_script">
70 <property name="text"> 63 <property name="text">
71 <string>Loop script</string> 64 <string>Loop script</string>
72 </property> 65 </property>
73 </widget> 66 </widget>
74 </item> 67 </item>
75 <item row="3" column="0" colspan="4"> 68 <item row="2" column="0" colspan="4">
76 <widget class="QCheckBox" name="tas_pause_on_load"> 69 <widget class="QCheckBox" name="tas_pause_on_load">
77 <property name="enabled"> 70 <property name="enabled">
78 <bool>false</bool> 71 <bool>false</bool>