summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/yuzu/applets/qt_controller.cpp2
-rw-r--r--src/yuzu/configuration/configure_input.cpp2
-rw-r--r--src/yuzu/configuration/configure_vibration.cpp74
-rw-r--r--src/yuzu/configuration/configure_vibration.h18
-rw-r--r--src/yuzu/configuration/configure_vibration.ui7
5 files changed, 95 insertions, 8 deletions
diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp
index 4239c17f5..4104928d1 100644
--- a/src/yuzu/applets/qt_controller.cpp
+++ b/src/yuzu/applets/qt_controller.cpp
@@ -257,7 +257,7 @@ void QtControllerSelectorDialog::LoadConfiguration() {
257} 257}
258 258
259void QtControllerSelectorDialog::CallConfigureVibrationDialog() { 259void QtControllerSelectorDialog::CallConfigureVibrationDialog() {
260 ConfigureVibration dialog(this); 260 ConfigureVibration dialog(this, system.HIDCore());
261 261
262 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | 262 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
263 Qt::WindowSystemMenuHint); 263 Qt::WindowSystemMenuHint);
diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp
index d53179dbb..7c5776189 100644
--- a/src/yuzu/configuration/configure_input.cpp
+++ b/src/yuzu/configuration/configure_input.cpp
@@ -164,7 +164,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
164 }); 164 });
165 165
166 connect(ui->vibrationButton, &QPushButton::clicked, 166 connect(ui->vibrationButton, &QPushButton::clicked,
167 [this] { CallConfigureDialog<ConfigureVibration>(*this); }); 167 [this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); });
168 168
169 connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] { 169 connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {
170 CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); 170 CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp
index adce04b27..779b6401c 100644
--- a/src/yuzu/configuration/configure_vibration.cpp
+++ b/src/yuzu/configuration/configure_vibration.cpp
@@ -9,11 +9,14 @@
9 9
10#include "common/param_package.h" 10#include "common/param_package.h"
11#include "common/settings.h" 11#include "common/settings.h"
12#include "core/hid/emulated_controller.h"
13#include "core/hid/hid_core.h"
14#include "core/hid/hid_types.h"
12#include "ui_configure_vibration.h" 15#include "ui_configure_vibration.h"
13#include "yuzu/configuration/configure_vibration.h" 16#include "yuzu/configuration/configure_vibration.h"
14 17
15ConfigureVibration::ConfigureVibration(QWidget* parent) 18ConfigureVibration::ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_)
16 : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) { 19 : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()), hid_core{hid_core_} {
17 ui->setupUi(this); 20 ui->setupUi(this);
18 21
19 vibration_groupboxes = { 22 vibration_groupboxes = {
@@ -31,6 +34,13 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)
31 const auto& players = Settings::values.players.GetValue(); 34 const auto& players = Settings::values.players.GetValue();
32 35
33 for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { 36 for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
37 auto controller = hid_core.GetEmulatedControllerByIndex(i);
38 Core::HID::ControllerUpdateCallback engine_callback{
39 .on_change = [this,
40 i](Core::HID::ControllerTriggerType type) { VibrateController(type, i); },
41 .is_npad_service = false,
42 };
43 controller_callback_key[i] = controller->SetCallback(engine_callback);
34 vibration_groupboxes[i]->setChecked(players[i].vibration_enabled); 44 vibration_groupboxes[i]->setChecked(players[i].vibration_enabled);
35 vibration_spinboxes[i]->setValue(players[i].vibration_strength); 45 vibration_spinboxes[i]->setValue(players[i].vibration_strength);
36 } 46 }
@@ -45,7 +55,14 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)
45 RetranslateUI(); 55 RetranslateUI();
46} 56}
47 57
48ConfigureVibration::~ConfigureVibration() = default; 58ConfigureVibration::~ConfigureVibration() {
59 StopVibrations();
60
61 for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
62 auto controller = hid_core.GetEmulatedControllerByIndex(i);
63 controller->DeleteCallback(controller_callback_key[i]);
64 }
65};
49 66
50void ConfigureVibration::ApplyConfiguration() { 67void ConfigureVibration::ApplyConfiguration() {
51 auto& players = Settings::values.players.GetValue(); 68 auto& players = Settings::values.players.GetValue();
@@ -70,3 +87,54 @@ void ConfigureVibration::changeEvent(QEvent* event) {
70void ConfigureVibration::RetranslateUI() { 87void ConfigureVibration::RetranslateUI() {
71 ui->retranslateUi(this); 88 ui->retranslateUi(this);
72} 89}
90
91void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type,
92 std::size_t player_index) {
93 if (type != Core::HID::ControllerTriggerType::Button) {
94 return;
95 }
96
97 auto& player = Settings::values.players.GetValue()[player_index];
98 auto controller = hid_core.GetEmulatedControllerByIndex(player_index);
99 const int vibration_strenght = vibration_spinboxes[player_index]->value();
100 const auto& buttons = controller->GetButtonsValues();
101
102 bool button_is_pressed = false;
103 for (std::size_t i = 0; i < buttons.size(); ++i) {
104 if (buttons[i].value) {
105 button_is_pressed = true;
106 break;
107 }
108 }
109
110 if (!button_is_pressed) {
111 StopVibrations();
112 return;
113 }
114
115 const int old_vibration_enabled = player.vibration_enabled;
116 const bool old_vibration_strenght = player.vibration_strength;
117 player.vibration_enabled = true;
118 player.vibration_strength = vibration_strenght;
119
120 const Core::HID::VibrationValue vibration{
121 .low_amplitude = 1.0f,
122 .low_frequency = 160.0f,
123 .high_amplitude = 1.0f,
124 .high_frequency = 320.0f,
125 };
126 controller->SetVibration(0, vibration);
127 controller->SetVibration(1, vibration);
128
129 // Restore previous values
130 player.vibration_enabled = old_vibration_enabled;
131 player.vibration_strength = old_vibration_strenght;
132}
133
134void ConfigureVibration::StopVibrations() {
135 for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
136 auto controller = hid_core.GetEmulatedControllerByIndex(i);
137 controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE);
138 controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE);
139 }
140}
diff --git a/src/yuzu/configuration/configure_vibration.h b/src/yuzu/configuration/configure_vibration.h
index 37bbc2653..50b8195fa 100644
--- a/src/yuzu/configuration/configure_vibration.h
+++ b/src/yuzu/configuration/configure_vibration.h
@@ -15,11 +15,16 @@ namespace Ui {
15class ConfigureVibration; 15class ConfigureVibration;
16} 16}
17 17
18namespace Core::HID {
19enum class ControllerTriggerType;
20class HIDCore;
21} // namespace Core::HID
22
18class ConfigureVibration : public QDialog { 23class ConfigureVibration : public QDialog {
19 Q_OBJECT 24 Q_OBJECT
20 25
21public: 26public:
22 explicit ConfigureVibration(QWidget* parent); 27 explicit ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_);
23 ~ConfigureVibration() override; 28 ~ConfigureVibration() override;
24 29
25 void ApplyConfiguration(); 30 void ApplyConfiguration();
@@ -27,14 +32,21 @@ public:
27private: 32private:
28 void changeEvent(QEvent* event) override; 33 void changeEvent(QEvent* event) override;
29 void RetranslateUI(); 34 void RetranslateUI();
35 void VibrateController(Core::HID::ControllerTriggerType type, std::size_t player_index);
36 void StopVibrations();
30 37
31 std::unique_ptr<Ui::ConfigureVibration> ui; 38 std::unique_ptr<Ui::ConfigureVibration> ui;
32 39
33 static constexpr std::size_t NUM_PLAYERS = 8; 40 static constexpr std::size_t NUM_PLAYERS = 8;
34 41
35 // Groupboxes encapsulating the vibration strength spinbox. 42 /// Groupboxes encapsulating the vibration strength spinbox.
36 std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; 43 std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes;
37 44
38 // Spinboxes representing the vibration strength percentage. 45 /// Spinboxes representing the vibration strength percentage.
39 std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; 46 std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes;
47
48 /// Callback index to stop the controllers events
49 std::array<int, NUM_PLAYERS> controller_callback_key;
50
51 Core::HID::HIDCore& hid_core;
40}; 52};
diff --git a/src/yuzu/configuration/configure_vibration.ui b/src/yuzu/configuration/configure_vibration.ui
index efdf317a9..447a18eb1 100644
--- a/src/yuzu/configuration/configure_vibration.ui
+++ b/src/yuzu/configuration/configure_vibration.ui
@@ -17,6 +17,13 @@
17 <string notr="true"/> 17 <string notr="true"/>
18 </property> 18 </property>
19 <layout class="QVBoxLayout"> 19 <layout class="QVBoxLayout">
20 <item row="0" column="0" colspan="4">
21 <widget class="QLabel" name="label_1">
22 <property name="text">
23 <string>Press any controller button to vibrate the controller.</string>
24 </property>
25 </widget>
26 </item>
20 <item> 27 <item>
21 <widget class="QGroupBox" name="vibrationStrengthGroup"> 28 <widget class="QGroupBox" name="vibrationStrengthGroup">
22 <property name="title"> 29 <property name="title">