Merge pull request #7842 from german77/vibration_test
yuzu: config: Vibrate the controller while configuring vibration strength
This commit is contained in:
commit
5cb1c2ad84
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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">
|
||||||
|
|
Reference in New Issue