mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-12-16 04:09:39 +00:00
Merge 80da48f631 into ed2fe134aa
This commit is contained in:
commit
6df748f350
@ -6,10 +6,10 @@
|
||||
#include <QCheckBox>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QLabel>
|
||||
#include <QTimer>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include "Core/Config/MainSettings.h"
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "DolphinQt/QtUtils/QueueOnObject.h"
|
||||
|
||||
#include "InputCommon/GCAdapter.h"
|
||||
@ -23,27 +23,25 @@ GCPadWiiUConfigDialog::GCPadWiiUConfigDialog(int port, QWidget* parent)
|
||||
ConnectWidgets();
|
||||
}
|
||||
|
||||
GCPadWiiUConfigDialog::~GCPadWiiUConfigDialog()
|
||||
{
|
||||
GCAdapter::SetAdapterCallback(nullptr);
|
||||
}
|
||||
|
||||
void GCPadWiiUConfigDialog::CreateLayout()
|
||||
{
|
||||
setWindowTitle(tr("GameCube Controller Adapter at Port %1").arg(m_port + 1));
|
||||
|
||||
m_layout = new QVBoxLayout();
|
||||
m_status_label = new QLabel();
|
||||
m_poll_rate_label = new QLabel;
|
||||
m_rumble = new QCheckBox(tr("Enable Rumble"));
|
||||
m_simulate_bongos = new QCheckBox(tr("Simulate DK Bongos"));
|
||||
m_button_box = new QDialogButtonBox(QDialogButtonBox::Ok);
|
||||
|
||||
UpdateAdapterStatus();
|
||||
|
||||
auto callback = [this] { QueueOnObject(this, &GCPadWiiUConfigDialog::UpdateAdapterStatus); };
|
||||
GCAdapter::SetAdapterCallback(callback);
|
||||
auto* const timer = new QTimer{this};
|
||||
connect(timer, &QTimer::timeout, this, &GCPadWiiUConfigDialog::UpdateAdapterStatus);
|
||||
timer->start(std::chrono::milliseconds{500});
|
||||
|
||||
m_layout->addWidget(m_status_label);
|
||||
m_layout->addWidget(m_poll_rate_label);
|
||||
m_layout->addWidget(m_rumble);
|
||||
m_layout->addWidget(m_simulate_bongos);
|
||||
m_layout->addWidget(m_button_box);
|
||||
@ -79,6 +77,12 @@ void GCPadWiiUConfigDialog::UpdateAdapterStatus()
|
||||
|
||||
m_status_label->setText(status_text);
|
||||
|
||||
const auto poll_rate = GCAdapter::GetCurrentPollRate();
|
||||
if (poll_rate != 0)
|
||||
m_poll_rate_label->setText(tr("Poll Rate: %1 Hz").arg(poll_rate, 0, 'f', 2));
|
||||
else
|
||||
m_poll_rate_label->clear();
|
||||
|
||||
m_rumble->setEnabled(detected);
|
||||
m_simulate_bongos->setEnabled(detected);
|
||||
}
|
||||
|
||||
@ -15,7 +15,6 @@ class GCPadWiiUConfigDialog final : public QDialog
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit GCPadWiiUConfigDialog(int port, QWidget* parent = nullptr);
|
||||
~GCPadWiiUConfigDialog() override;
|
||||
|
||||
private:
|
||||
void LoadSettings();
|
||||
@ -31,6 +30,7 @@ private:
|
||||
|
||||
QVBoxLayout* m_layout;
|
||||
QLabel* m_status_label;
|
||||
QLabel* m_poll_rate_label;
|
||||
QDialogButtonBox* m_button_box;
|
||||
|
||||
// Checkboxes
|
||||
|
||||
@ -163,6 +163,8 @@ static std::optional<Config::ConfigChangedCallbackID> s_config_callback_id = std
|
||||
static bool s_is_adapter_wanted = false;
|
||||
static std::array<bool, SerialInterface::MAX_SI_CHANNELS> s_config_rumble_enabled{};
|
||||
|
||||
static std::atomic<double> s_adapter_poll_rate{};
|
||||
|
||||
static void ReadThreadFunc()
|
||||
{
|
||||
Common::SetCurrentThreadName("GCAdapter Read Thread");
|
||||
@ -199,6 +201,11 @@ static void ReadThreadFunc()
|
||||
// Reset rumble once on initial reading
|
||||
ResetRumble();
|
||||
|
||||
// Measure poll rate for display in UI.
|
||||
constexpr int POLL_RATE_MEASUREMENT_SAMPLE_COUNT = 50;
|
||||
auto poll_rate_measurement_start_time = Clock::now();
|
||||
int poll_rate_measurement_count = 0;
|
||||
|
||||
while (s_read_adapter_thread_running.IsSet())
|
||||
{
|
||||
#if GCADAPTER_USE_LIBUSB_IMPLEMENTATION
|
||||
@ -242,6 +249,19 @@ static void ReadThreadFunc()
|
||||
}
|
||||
#endif
|
||||
|
||||
// Update poll rate measurement.
|
||||
if (++poll_rate_measurement_count == POLL_RATE_MEASUREMENT_SAMPLE_COUNT)
|
||||
{
|
||||
const auto now = Clock::now();
|
||||
|
||||
const auto poll_rate =
|
||||
POLL_RATE_MEASUREMENT_SAMPLE_COUNT / DT_s(now - poll_rate_measurement_start_time).count();
|
||||
s_adapter_poll_rate.store(poll_rate, std::memory_order_relaxed);
|
||||
|
||||
poll_rate_measurement_start_time = now;
|
||||
poll_rate_measurement_count = 0;
|
||||
}
|
||||
|
||||
Common::YieldCPU();
|
||||
}
|
||||
|
||||
@ -259,6 +279,8 @@ static void ReadThreadFunc()
|
||||
s_detected = false;
|
||||
#endif
|
||||
|
||||
s_adapter_poll_rate.store(0.0, std::memory_order_relaxed);
|
||||
|
||||
NOTICE_LOG_FMT(CONTROLLERINTERFACE, "GCAdapter read thread stopped");
|
||||
}
|
||||
|
||||
@ -1013,4 +1035,9 @@ bool IsDetected(const char** error_message)
|
||||
#endif
|
||||
}
|
||||
|
||||
double GetCurrentPollRate()
|
||||
{
|
||||
return s_adapter_poll_rate.load(std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
} // namespace GCAdapter
|
||||
|
||||
@ -28,4 +28,7 @@ bool DeviceConnected(int chan);
|
||||
void ResetDeviceType(int chan);
|
||||
bool UseAdapter();
|
||||
|
||||
// Callable from any thread. Returns 0 when the adapter is not detected.
|
||||
double GetCurrentPollRate();
|
||||
|
||||
} // namespace GCAdapter
|
||||
|
||||
Loading…
Reference in New Issue
Block a user