diff options
| author | 2021-10-27 00:20:28 -0500 | |
|---|---|---|
| committer | 2021-11-24 20:30:26 -0600 | |
| commit | c085e54316c5520ed7d58a92a7faa9e896bb6c71 (patch) | |
| tree | 05a5798ddc25ce2afa423cd70bec979705b63143 | |
| parent | input_common: Fix UDP uuid (diff) | |
| download | yuzu-c085e54316c5520ed7d58a92a7faa9e896bb6c71.tar.gz yuzu-c085e54316c5520ed7d58a92a7faa9e896bb6c71.tar.xz yuzu-c085e54316c5520ed7d58a92a7faa9e896bb6c71.zip | |
core/hid: Add TAS input
Diffstat (limited to '')
| -rw-r--r-- | src/common/settings.h | 1 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 72 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.h | 9 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_tas.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_tas.ui | 9 |
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 | |||
| 133 | void 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 | ||
| 125 | void EmulatedController::ReloadInput() { | 172 | void 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 | ||
| 179 | void EmulatedController::UnloadInput() { | 245 | void 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 | ||
| 200 | void EmulatedController::EnableConfiguration() { | 272 | void 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() { | |||
| 40 | void ConfigureTasDialog::ApplyConfiguration() { | 39 | void 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> |