Merge pull request #7842 from german77/vibration_test

yuzu: config: Vibrate the controller while configuring vibration strength
This commit is contained in:
bunnei 2022-02-05 02:57:26 -07:00 committed by GitHub
commit 5cb1c2ad84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 95 additions and 8 deletions

View File

@ -257,7 +257,7 @@ void QtControllerSelectorDialog::LoadConfiguration() {
} }
void QtControllerSelectorDialog::CallConfigureVibrationDialog() { void QtControllerSelectorDialog::CallConfigureVibrationDialog() {
ConfigureVibration dialog(this); ConfigureVibration dialog(this, system.HIDCore());
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
Qt::WindowSystemMenuHint); Qt::WindowSystemMenuHint);

View File

@ -164,7 +164,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
}); });
connect(ui->vibrationButton, &QPushButton::clicked, connect(ui->vibrationButton, &QPushButton::clicked,
[this] { CallConfigureDialog<ConfigureVibration>(*this); }); [this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); });
connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] { connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);

View File

@ -9,11 +9,14 @@
#include "common/param_package.h" #include "common/param_package.h"
#include "common/settings.h" #include "common/settings.h"
#include "core/hid/emulated_controller.h"
#include "core/hid/hid_core.h"
#include "core/hid/hid_types.h"
#include "ui_configure_vibration.h" #include "ui_configure_vibration.h"
#include "yuzu/configuration/configure_vibration.h" #include "yuzu/configuration/configure_vibration.h"
ConfigureVibration::ConfigureVibration(QWidget* parent) ConfigureVibration::ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_)
: QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) { : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()), hid_core{hid_core_} {
ui->setupUi(this); ui->setupUi(this);
vibration_groupboxes = { vibration_groupboxes = {
@ -31,6 +34,13 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)
const auto& players = Settings::values.players.GetValue(); const auto& players = Settings::values.players.GetValue();
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
auto controller = hid_core.GetEmulatedControllerByIndex(i);
Core::HID::ControllerUpdateCallback engine_callback{
.on_change = [this,
i](Core::HID::ControllerTriggerType type) { VibrateController(type, i); },
.is_npad_service = false,
};
controller_callback_key[i] = controller->SetCallback(engine_callback);
vibration_groupboxes[i]->setChecked(players[i].vibration_enabled); vibration_groupboxes[i]->setChecked(players[i].vibration_enabled);
vibration_spinboxes[i]->setValue(players[i].vibration_strength); vibration_spinboxes[i]->setValue(players[i].vibration_strength);
} }
@ -45,7 +55,14 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)
RetranslateUI(); RetranslateUI();
} }
ConfigureVibration::~ConfigureVibration() = default; ConfigureVibration::~ConfigureVibration() {
StopVibrations();
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
auto controller = hid_core.GetEmulatedControllerByIndex(i);
controller->DeleteCallback(controller_callback_key[i]);
}
};
void ConfigureVibration::ApplyConfiguration() { void ConfigureVibration::ApplyConfiguration() {
auto& players = Settings::values.players.GetValue(); auto& players = Settings::values.players.GetValue();
@ -70,3 +87,54 @@ void ConfigureVibration::changeEvent(QEvent* event) {
void ConfigureVibration::RetranslateUI() { void ConfigureVibration::RetranslateUI() {
ui->retranslateUi(this); ui->retranslateUi(this);
} }
void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type,
std::size_t player_index) {
if (type != Core::HID::ControllerTriggerType::Button) {
return;
}
auto& player = Settings::values.players.GetValue()[player_index];
auto controller = hid_core.GetEmulatedControllerByIndex(player_index);
const int vibration_strenght = vibration_spinboxes[player_index]->value();
const auto& buttons = controller->GetButtonsValues();
bool button_is_pressed = false;
for (std::size_t i = 0; i < buttons.size(); ++i) {
if (buttons[i].value) {
button_is_pressed = true;
break;
}
}
if (!button_is_pressed) {
StopVibrations();
return;
}
const int old_vibration_enabled = player.vibration_enabled;
const bool old_vibration_strenght = player.vibration_strength;
player.vibration_enabled = true;
player.vibration_strength = vibration_strenght;
const Core::HID::VibrationValue vibration{
.low_amplitude = 1.0f,
.low_frequency = 160.0f,
.high_amplitude = 1.0f,
.high_frequency = 320.0f,
};
controller->SetVibration(0, vibration);
controller->SetVibration(1, vibration);
// Restore previous values
player.vibration_enabled = old_vibration_enabled;
player.vibration_strength = old_vibration_strenght;
}
void ConfigureVibration::StopVibrations() {
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
auto controller = hid_core.GetEmulatedControllerByIndex(i);
controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE);
controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE);
}
}

View File

@ -15,11 +15,16 @@ namespace Ui {
class ConfigureVibration; class ConfigureVibration;
} }
namespace Core::HID {
enum class ControllerTriggerType;
class HIDCore;
} // namespace Core::HID
class ConfigureVibration : public QDialog { class ConfigureVibration : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
explicit ConfigureVibration(QWidget* parent); explicit ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_);
~ConfigureVibration() override; ~ConfigureVibration() override;
void ApplyConfiguration(); void ApplyConfiguration();
@ -27,14 +32,21 @@ public:
private: private:
void changeEvent(QEvent* event) override; void changeEvent(QEvent* event) override;
void RetranslateUI(); void RetranslateUI();
void VibrateController(Core::HID::ControllerTriggerType type, std::size_t player_index);
void StopVibrations();
std::unique_ptr<Ui::ConfigureVibration> ui; std::unique_ptr<Ui::ConfigureVibration> ui;
static constexpr std::size_t NUM_PLAYERS = 8; static constexpr std::size_t NUM_PLAYERS = 8;
// Groupboxes encapsulating the vibration strength spinbox. /// Groupboxes encapsulating the vibration strength spinbox.
std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes;
// Spinboxes representing the vibration strength percentage. /// Spinboxes representing the vibration strength percentage.
std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes;
/// Callback index to stop the controllers events
std::array<int, NUM_PLAYERS> controller_callback_key;
Core::HID::HIDCore& hid_core;
}; };

View File

@ -17,6 +17,13 @@
<string notr="true"/> <string notr="true"/>
</property> </property>
<layout class="QVBoxLayout"> <layout class="QVBoxLayout">
<item row="0" column="0" colspan="4">
<widget class="QLabel" name="label_1">
<property name="text">
<string>Press any controller button to vibrate the controller.</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QGroupBox" name="vibrationStrengthGroup"> <widget class="QGroupBox" name="vibrationStrengthGroup">
<property name="title"> <property name="title">