mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-27 08:15:33 +01:00
UDPServer: Add configuration UI.
Accessed through button "Alternate Input Sources" in the "Controller Settings" dialog.
This commit is contained in:
parent
8aec424191
commit
5ff79499a5
@ -51,6 +51,10 @@ add_executable(dolphin-emu
|
|||||||
Config/CheatCodeEditor.h
|
Config/CheatCodeEditor.h
|
||||||
Config/CheatWarningWidget.cpp
|
Config/CheatWarningWidget.cpp
|
||||||
Config/CheatWarningWidget.h
|
Config/CheatWarningWidget.h
|
||||||
|
Config/ControllerInterface/CemuHookUDPServerWidget.cpp
|
||||||
|
Config/ControllerInterface/CemuHookUDPServerWidget.h
|
||||||
|
Config/ControllerInterface/ControllerInterfaceWindow.cpp
|
||||||
|
Config/ControllerInterface/ControllerInterfaceWindow.h
|
||||||
Config/ControllersWindow.cpp
|
Config/ControllersWindow.cpp
|
||||||
Config/ControllersWindow.h
|
Config/ControllersWindow.h
|
||||||
Config/FilesystemWidget.cpp
|
Config/FilesystemWidget.cpp
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
// Copyright 2019 Dolphin Emulator Project5~5~5~
|
||||||
|
// Licensed under GPLv2+
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "DolphinQt/Config/ControllerInterface/CemuHookUDPServerWidget.h"
|
||||||
|
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QSpinBox>
|
||||||
|
|
||||||
|
#include "Common/Config/Config.h"
|
||||||
|
#include "InputCommon/ControllerInterface/CemuHookUDPServer/CemuHookUDPServer.h"
|
||||||
|
|
||||||
|
CemuHookUDPServerWidget::CemuHookUDPServerWidget()
|
||||||
|
{
|
||||||
|
CreateWidgets();
|
||||||
|
ConnectWidgets();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CemuHookUDPServerWidget::CreateWidgets()
|
||||||
|
{
|
||||||
|
auto* main_layout = new QGridLayout;
|
||||||
|
|
||||||
|
m_server_enabled = new QCheckBox(tr("Enable"));
|
||||||
|
m_server_enabled->setChecked(Config::Get(ciface::CemuHookUDPServer::Settings::SERVER_ENABLED));
|
||||||
|
|
||||||
|
m_server_address = new QLineEdit(
|
||||||
|
QString::fromStdString(Config::Get(ciface::CemuHookUDPServer::Settings::SERVER_ADDRESS)));
|
||||||
|
|
||||||
|
m_server_port = new QSpinBox();
|
||||||
|
m_server_port->setMaximum(65535);
|
||||||
|
m_server_port->setValue(Config::Get(ciface::CemuHookUDPServer::Settings::SERVER_PORT));
|
||||||
|
|
||||||
|
auto* description =
|
||||||
|
new QLabel(tr("UDPServer protocol enables the use of input and motion data from compatible "
|
||||||
|
"sources, like PlayStation, Nintendo Switch and Steam controllers.<br><br>"
|
||||||
|
"For setup instructions, "
|
||||||
|
"<a href=\"https://wiki.dolphin-emu.org/index.php?title=UDPServer\">"
|
||||||
|
"refer to this page</a>."));
|
||||||
|
description->setTextFormat(Qt::RichText);
|
||||||
|
description->setWordWrap(true);
|
||||||
|
description->setTextInteractionFlags(Qt::TextBrowserInteraction);
|
||||||
|
description->setOpenExternalLinks(true);
|
||||||
|
|
||||||
|
main_layout->addWidget(m_server_enabled, 1, 1);
|
||||||
|
main_layout->addWidget(new QLabel(tr("Server IP Address")), 2, 1);
|
||||||
|
main_layout->addWidget(m_server_address, 2, 2);
|
||||||
|
main_layout->addWidget(new QLabel(tr("Server Port")), 3, 1);
|
||||||
|
main_layout->addWidget(m_server_port, 3, 2);
|
||||||
|
main_layout->addWidget(description, 4, 1, 1, 2);
|
||||||
|
|
||||||
|
setLayout(main_layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CemuHookUDPServerWidget::ConnectWidgets()
|
||||||
|
{
|
||||||
|
connect(m_server_enabled, &QCheckBox::toggled, this, [this] {
|
||||||
|
Config::SetBaseOrCurrent(ciface::CemuHookUDPServer::Settings::SERVER_ENABLED,
|
||||||
|
m_server_enabled->isChecked());
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_server_address, &QLineEdit::editingFinished, this, [this] {
|
||||||
|
Config::SetBaseOrCurrent(ciface::CemuHookUDPServer::Settings::SERVER_ADDRESS,
|
||||||
|
m_server_address->text().toStdString());
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_server_port, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,
|
||||||
|
[this] {
|
||||||
|
Config::SetBaseOrCurrent(ciface::CemuHookUDPServer::Settings::SERVER_PORT,
|
||||||
|
static_cast<u16>(m_server_port->value()));
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
// Copyright 2019 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2+
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class QCheckBox;
|
||||||
|
class QLineEdit;
|
||||||
|
class QSpinBox;
|
||||||
|
|
||||||
|
class CemuHookUDPServerWidget final : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit CemuHookUDPServerWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CreateWidgets();
|
||||||
|
void ConnectWidgets();
|
||||||
|
|
||||||
|
QCheckBox* m_server_enabled;
|
||||||
|
QLineEdit* m_server_address;
|
||||||
|
QSpinBox* m_server_port;
|
||||||
|
};
|
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright 2019 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2+
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h"
|
||||||
|
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QTabWidget>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
#if defined(CIFACE_USE_CEMUHOOKUDPSERVER)
|
||||||
|
#include "DolphinQt/Config/ControllerInterface/CemuHookUDPServerWidget.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ControllerInterfaceWindow::ControllerInterfaceWindow(QWidget* parent) : QDialog(parent)
|
||||||
|
{
|
||||||
|
CreateMainLayout();
|
||||||
|
|
||||||
|
setWindowTitle(tr("Alternate Input Sources"));
|
||||||
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ControllerInterfaceWindow::CreateMainLayout()
|
||||||
|
{
|
||||||
|
m_button_box = new QDialogButtonBox(QDialogButtonBox::Close);
|
||||||
|
connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||||
|
|
||||||
|
m_tab_widget = new QTabWidget();
|
||||||
|
#if defined(CIFACE_USE_CEMUHOOKUDPSERVER)
|
||||||
|
m_udpserver_widget = new CemuHookUDPServerWidget();
|
||||||
|
m_tab_widget->addTab(m_udpserver_widget, tr("UDPServer")); // TODO: use GetWrappedWidget()?
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto* main_layout = new QVBoxLayout();
|
||||||
|
if (m_tab_widget->count() > 0)
|
||||||
|
{
|
||||||
|
main_layout->addWidget(m_tab_widget);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
main_layout->addWidget(new QLabel(tr("Nothing to configure")), 0,
|
||||||
|
Qt::AlignVCenter | Qt::AlignHCenter);
|
||||||
|
}
|
||||||
|
main_layout->addWidget(m_button_box);
|
||||||
|
setLayout(main_layout);
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright 2019 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2+
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "InputCommon/ControllerInterface/ControllerInterface.h"
|
||||||
|
|
||||||
|
#if defined(CIFACE_USE_CEMUHOOKUDPSERVER)
|
||||||
|
class CemuHookUDPServerWidget;
|
||||||
|
#endif
|
||||||
|
class QTabWidget;
|
||||||
|
class QDialogButtonBox;
|
||||||
|
|
||||||
|
class ControllerInterfaceWindow final : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit ControllerInterfaceWindow(QWidget* parent);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CreateMainLayout();
|
||||||
|
|
||||||
|
QTabWidget* m_tab_widget;
|
||||||
|
QDialogButtonBox* m_button_box;
|
||||||
|
|
||||||
|
#if defined(CIFACE_USE_CEMUHOOKUDPSERVER)
|
||||||
|
CemuHookUDPServerWidget* m_udpserver_widget;
|
||||||
|
#endif
|
||||||
|
};
|
@ -31,6 +31,7 @@
|
|||||||
#include "Core/IOS/IOS.h"
|
#include "Core/IOS/IOS.h"
|
||||||
#include "Core/IOS/USB/Bluetooth/BTReal.h"
|
#include "Core/IOS/USB/Bluetooth/BTReal.h"
|
||||||
|
|
||||||
|
#include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h"
|
||||||
#include "DolphinQt/Config/Mapping/GCPadWiiUConfigDialog.h"
|
#include "DolphinQt/Config/Mapping/GCPadWiiUConfigDialog.h"
|
||||||
#include "DolphinQt/Config/Mapping/MappingWindow.h"
|
#include "DolphinQt/Config/Mapping/MappingWindow.h"
|
||||||
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
||||||
@ -203,10 +204,12 @@ void ControllersWindow::CreateCommonLayout()
|
|||||||
{
|
{
|
||||||
// i18n: This is "common" as in "shared", not the opposite of "uncommon"
|
// i18n: This is "common" as in "shared", not the opposite of "uncommon"
|
||||||
m_common_box = new QGroupBox(tr("Common"));
|
m_common_box = new QGroupBox(tr("Common"));
|
||||||
m_common_layout = new QHBoxLayout();
|
m_common_layout = new QVBoxLayout();
|
||||||
m_common_bg_input = new QCheckBox(tr("Background Input"));
|
m_common_bg_input = new QCheckBox(tr("Background Input"));
|
||||||
|
m_common_configure_controller_interface = new QPushButton(tr("Alternate Input Sources"));
|
||||||
|
|
||||||
m_common_layout->addWidget(m_common_bg_input);
|
m_common_layout->addWidget(m_common_bg_input);
|
||||||
|
m_common_layout->addWidget(m_common_configure_controller_interface);
|
||||||
|
|
||||||
m_common_box->setLayout(m_common_layout);
|
m_common_box->setLayout(m_common_layout);
|
||||||
}
|
}
|
||||||
@ -219,6 +222,7 @@ void ControllersWindow::CreateMainLayout()
|
|||||||
layout->addWidget(m_gc_box);
|
layout->addWidget(m_gc_box);
|
||||||
layout->addWidget(m_wiimote_box);
|
layout->addWidget(m_wiimote_box);
|
||||||
layout->addWidget(m_common_box);
|
layout->addWidget(m_common_box);
|
||||||
|
layout->addStretch();
|
||||||
layout->addWidget(m_button_box);
|
layout->addWidget(m_button_box);
|
||||||
|
|
||||||
WrapInScrollArea(this, layout);
|
WrapInScrollArea(this, layout);
|
||||||
@ -234,6 +238,8 @@ void ControllersWindow::ConnectWidgets()
|
|||||||
&ControllersWindow::OnWiimoteModeChanged);
|
&ControllersWindow::OnWiimoteModeChanged);
|
||||||
|
|
||||||
connect(m_common_bg_input, &QCheckBox::toggled, this, &ControllersWindow::SaveSettings);
|
connect(m_common_bg_input, &QCheckBox::toggled, this, &ControllersWindow::SaveSettings);
|
||||||
|
connect(m_common_configure_controller_interface, &QPushButton::clicked, this,
|
||||||
|
&ControllersWindow::OnControllerInterfaceConfigure);
|
||||||
connect(m_wiimote_continuous_scanning, &QCheckBox::toggled, this,
|
connect(m_wiimote_continuous_scanning, &QCheckBox::toggled, this,
|
||||||
&ControllersWindow::SaveSettings);
|
&ControllersWindow::SaveSettings);
|
||||||
connect(m_wiimote_real_balance_board, &QCheckBox::toggled, this,
|
connect(m_wiimote_real_balance_board, &QCheckBox::toggled, this,
|
||||||
@ -463,6 +469,14 @@ void ControllersWindow::OnWiimoteConfigure()
|
|||||||
window->show();
|
window->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ControllersWindow::OnControllerInterfaceConfigure()
|
||||||
|
{
|
||||||
|
ControllerInterfaceWindow* window = new ControllerInterfaceWindow(this);
|
||||||
|
window->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
window->setWindowModality(Qt::WindowModality::WindowModal);
|
||||||
|
window->show();
|
||||||
|
}
|
||||||
|
|
||||||
void ControllersWindow::LoadSettings()
|
void ControllersWindow::LoadSettings()
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_wiimote_groups.size(); i++)
|
for (size_t i = 0; i < m_wiimote_groups.size(); i++)
|
||||||
|
@ -37,6 +37,7 @@ private:
|
|||||||
void OnWiimoteRefreshPressed();
|
void OnWiimoteRefreshPressed();
|
||||||
void OnGCPadConfigure();
|
void OnGCPadConfigure();
|
||||||
void OnWiimoteConfigure();
|
void OnWiimoteConfigure();
|
||||||
|
void OnControllerInterfaceConfigure();
|
||||||
|
|
||||||
void CreateGamecubeLayout();
|
void CreateGamecubeLayout();
|
||||||
void CreateWiimoteLayout();
|
void CreateWiimoteLayout();
|
||||||
@ -75,6 +76,7 @@ private:
|
|||||||
|
|
||||||
// Common
|
// Common
|
||||||
QGroupBox* m_common_box;
|
QGroupBox* m_common_box;
|
||||||
QHBoxLayout* m_common_layout;
|
QVBoxLayout* m_common_layout;
|
||||||
QCheckBox* m_common_bg_input;
|
QCheckBox* m_common_bg_input;
|
||||||
|
QPushButton* m_common_configure_controller_interface;
|
||||||
};
|
};
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
<AdditionalDependencies>avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>$(ProjectDir)VideoInterface;$(ProjectDir)GameList;$(ProjectDir)Debugger;$(ProjectDir)Settings;$(ProjectDir)Config;$(ProjectDir)Config\Mapping;$(ProjectDir)Config\Graphics;$(ProjectDir)NetPlay;$(ProjectDir)QtUtils;$(ProjectDir)TAS;$(ProjectDir)FIFO;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(ProjectDir)VideoInterface;$(ProjectDir)GameList;$(ProjectDir)Debugger;$(ProjectDir)Settings;$(ProjectDir)Config;$(ProjectDir)Config\Mapping;$(ProjectDir)Config\Graphics;$(ProjectDir)Config\ControllerInterface;$(ProjectDir)NetPlay;$(ProjectDir)QtUtils;$(ProjectDir)TAS;$(ProjectDir)FIFO;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Manifest>
|
<Manifest>
|
||||||
<AdditionalManifestFiles>DolphinQt.manifest;%(AdditionalManifestFiles)</AdditionalManifestFiles>
|
<AdditionalManifestFiles>DolphinQt.manifest;%(AdditionalManifestFiles)</AdditionalManifestFiles>
|
||||||
@ -106,6 +106,8 @@
|
|||||||
<QtMoc Include="Config\Graphics\HacksWidget.h" />
|
<QtMoc Include="Config\Graphics\HacksWidget.h" />
|
||||||
<QtMoc Include="Config\Graphics\PostProcessingConfigWindow.h" />
|
<QtMoc Include="Config\Graphics\PostProcessingConfigWindow.h" />
|
||||||
<QtMoc Include="Config\Graphics\SoftwareRendererWidget.h" />
|
<QtMoc Include="Config\Graphics\SoftwareRendererWidget.h" />
|
||||||
|
<QtMoc Include="Config\ControllerInterface\CemuHookUDPServerWidget.h" />
|
||||||
|
<QtMoc Include="Config\ControllerInterface\ControllerInterfaceWindow.h" />
|
||||||
<QtMoc Include="Config\InfoWidget.h" />
|
<QtMoc Include="Config\InfoWidget.h" />
|
||||||
<QtMoc Include="Config\PatchesWidget.h" />
|
<QtMoc Include="Config\PatchesWidget.h" />
|
||||||
<QtMoc Include="Config\PropertiesDialog.h" />
|
<QtMoc Include="Config\PropertiesDialog.h" />
|
||||||
@ -187,6 +189,8 @@
|
|||||||
<ClCompile Include="$(QtMocOutPrefix)ChunkedProgressDialog.cpp" />
|
<ClCompile Include="$(QtMocOutPrefix)ChunkedProgressDialog.cpp" />
|
||||||
<ClCompile Include="$(QtMocOutPrefix)CodeViewWidget.cpp" />
|
<ClCompile Include="$(QtMocOutPrefix)CodeViewWidget.cpp" />
|
||||||
<ClCompile Include="$(QtMocOutPrefix)CodeWidget.cpp" />
|
<ClCompile Include="$(QtMocOutPrefix)CodeWidget.cpp" />
|
||||||
|
<ClCompile Include="$(QtMocOutPrefix)CemuHookUDPServerWidget.cpp" />
|
||||||
|
<ClCompile Include="$(QtMocOutPrefix)ControllerInterfaceWindow.cpp" />
|
||||||
<ClCompile Include="$(QtMocOutPrefix)ControllersWindow.cpp" />
|
<ClCompile Include="$(QtMocOutPrefix)ControllersWindow.cpp" />
|
||||||
<ClCompile Include="$(QtMocOutPrefix)DiscordHandler.cpp" />
|
<ClCompile Include="$(QtMocOutPrefix)DiscordHandler.cpp" />
|
||||||
<ClCompile Include="$(QtMocOutPrefix)DiscordJoinRequestDialog.cpp" />
|
<ClCompile Include="$(QtMocOutPrefix)DiscordJoinRequestDialog.cpp" />
|
||||||
@ -291,6 +295,8 @@
|
|||||||
<ClCompile Include="Config\CheatCodeEditor.cpp" />
|
<ClCompile Include="Config\CheatCodeEditor.cpp" />
|
||||||
<ClCompile Include="Config\ARCodeWidget.cpp" />
|
<ClCompile Include="Config\ARCodeWidget.cpp" />
|
||||||
<ClCompile Include="Config\CheatWarningWidget.cpp" />
|
<ClCompile Include="Config\CheatWarningWidget.cpp" />
|
||||||
|
<ClCompile Include="Config\ControllerInterface\CemuHookUDPServerWidget.cpp" />
|
||||||
|
<ClCompile Include="Config\ControllerInterface\ControllerInterfaceWindow.cpp" />
|
||||||
<ClCompile Include="Config\ControllersWindow.cpp" />
|
<ClCompile Include="Config\ControllersWindow.cpp" />
|
||||||
<ClCompile Include="Config\FilesystemWidget.cpp" />
|
<ClCompile Include="Config\FilesystemWidget.cpp" />
|
||||||
<ClCompile Include="Config\GameConfigEdit.cpp" />
|
<ClCompile Include="Config\GameConfigEdit.cpp" />
|
||||||
|
@ -135,6 +135,7 @@ static std::thread s_hotplug_thread;
|
|||||||
static Common::Flag s_hotplug_thread_running;
|
static Common::Flag s_hotplug_thread_running;
|
||||||
static std::mutex s_port_info_mutex;
|
static std::mutex s_port_info_mutex;
|
||||||
static Proto::MessageType::PortInfo s_port_info[Proto::PORT_COUNT];
|
static Proto::MessageType::PortInfo s_port_info[Proto::PORT_COUNT];
|
||||||
|
static sf::UdpSocket s_socket;
|
||||||
|
|
||||||
static bool IsSameController(const Proto::MessageType::PortInfo& a,
|
static bool IsSameController(const Proto::MessageType::PortInfo& a,
|
||||||
const Proto::MessageType::PortInfo& b)
|
const Proto::MessageType::PortInfo& b)
|
||||||
@ -162,8 +163,6 @@ static void HotplugThreadFunc()
|
|||||||
Common::SetCurrentThreadName("CemuHookUDPServer Hotplug Thread");
|
Common::SetCurrentThreadName("CemuHookUDPServer Hotplug Thread");
|
||||||
NOTICE_LOG(SERIALINTERFACE, "CemuHookUDPServer hotplug thread started");
|
NOTICE_LOG(SERIALINTERFACE, "CemuHookUDPServer hotplug thread started");
|
||||||
|
|
||||||
sf::UdpSocket socket;
|
|
||||||
|
|
||||||
while (s_hotplug_thread_running.IsSet())
|
while (s_hotplug_thread_running.IsSet())
|
||||||
{
|
{
|
||||||
const auto now = std::chrono::steady_clock::now();
|
const auto now = std::chrono::steady_clock::now();
|
||||||
@ -180,7 +179,7 @@ static void HotplugThreadFunc()
|
|||||||
list_ports.pad_id[2] = 2;
|
list_ports.pad_id[2] = 2;
|
||||||
list_ports.pad_id[3] = 3;
|
list_ports.pad_id[3] = 3;
|
||||||
msg.Finish();
|
msg.Finish();
|
||||||
if (socket.send(&list_ports, sizeof list_ports, s_server_address, s_server_port) !=
|
if (s_socket.send(&list_ports, sizeof list_ports, s_server_address, s_server_port) !=
|
||||||
sf::Socket::Status::Done)
|
sf::Socket::Status::Done)
|
||||||
ERROR_LOG(SERIALINTERFACE, "CemuHookUDPServer HotplugThreadFunc send failed");
|
ERROR_LOG(SERIALINTERFACE, "CemuHookUDPServer HotplugThreadFunc send failed");
|
||||||
}
|
}
|
||||||
@ -194,7 +193,7 @@ static void HotplugThreadFunc()
|
|||||||
std::size_t received_bytes;
|
std::size_t received_bytes;
|
||||||
sf::IpAddress sender;
|
sf::IpAddress sender;
|
||||||
u16 port;
|
u16 port;
|
||||||
if (ReceiveWithTimeout(socket, &msg, sizeof(msg), received_bytes, sender, port,
|
if (ReceiveWithTimeout(s_socket, &msg, sizeof(msg), received_bytes, sender, port,
|
||||||
sf::milliseconds(timeout_ms)) == sf::Socket::Status::Done)
|
sf::milliseconds(timeout_ms)) == sf::Socket::Status::Done)
|
||||||
{
|
{
|
||||||
if (auto port_info = msg.CheckAndCastTo<Proto::MessageType::PortInfo>())
|
if (auto port_info = msg.CheckAndCastTo<Proto::MessageType::PortInfo>())
|
||||||
@ -233,14 +232,15 @@ static void StopHotplugThread()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s_socket.unbind(); // interrupt blocking socket
|
||||||
s_hotplug_thread.join();
|
s_hotplug_thread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Init()
|
static void Restart()
|
||||||
{
|
{
|
||||||
s_server_enabled = Config::Get(Settings::SERVER_ENABLED);
|
NOTICE_LOG(SERIALINTERFACE, "CemuHookUDPServer Restart");
|
||||||
s_server_address = Config::Get(Settings::SERVER_ADDRESS);
|
|
||||||
s_server_port = Config::Get(Settings::SERVER_PORT);
|
StopHotplugThread();
|
||||||
|
|
||||||
s_client_uid = Common::Random::GenerateValue<u32>();
|
s_client_uid = Common::Random::GenerateValue<u32>();
|
||||||
s_next_listports = std::chrono::steady_clock::time_point::min();
|
s_next_listports = std::chrono::steady_clock::time_point::min();
|
||||||
@ -250,10 +250,32 @@ void Init()
|
|||||||
s_port_info[port_index].pad_id = port_index;
|
s_port_info[port_index].pad_id = port_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PopulateDevices(); // remove devices
|
||||||
|
|
||||||
if (s_server_enabled)
|
if (s_server_enabled)
|
||||||
StartHotplugThread();
|
StartHotplugThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ConfigChanged()
|
||||||
|
{
|
||||||
|
bool server_enabled = Config::Get(Settings::SERVER_ENABLED);
|
||||||
|
std::string server_address = Config::Get(Settings::SERVER_ADDRESS);
|
||||||
|
u16 server_port = Config::Get(Settings::SERVER_PORT);
|
||||||
|
if (server_enabled != s_server_enabled || server_address != s_server_address ||
|
||||||
|
server_port != s_server_port)
|
||||||
|
{
|
||||||
|
s_server_enabled = server_enabled;
|
||||||
|
s_server_address = server_address;
|
||||||
|
s_server_port = server_port;
|
||||||
|
Restart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Init()
|
||||||
|
{
|
||||||
|
Config::AddConfigChangedCallback(ConfigChanged);
|
||||||
|
}
|
||||||
|
|
||||||
void PopulateDevices()
|
void PopulateDevices()
|
||||||
{
|
{
|
||||||
NOTICE_LOG(SERIALINTERFACE, "CemuHookUDPServer PopulateDevices");
|
NOTICE_LOG(SERIALINTERFACE, "CemuHookUDPServer PopulateDevices");
|
||||||
@ -273,16 +295,6 @@ void PopulateDevices()
|
|||||||
void DeInit()
|
void DeInit()
|
||||||
{
|
{
|
||||||
StopHotplugThread();
|
StopHotplugThread();
|
||||||
SaveSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaveSettings()
|
|
||||||
{
|
|
||||||
Config::ConfigChangeCallbackGuard config_guard;
|
|
||||||
|
|
||||||
Config::SetBaseOrCurrent(Settings::SERVER_ENABLED, s_server_enabled);
|
|
||||||
Config::SetBaseOrCurrent(Settings::SERVER_ADDRESS, s_server_address);
|
|
||||||
Config::SetBaseOrCurrent(Settings::SERVER_PORT, s_server_port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Device::Device(Proto::DsModel model, int index)
|
Device::Device(Proto::DsModel model, int index)
|
||||||
|
@ -2,10 +2,18 @@
|
|||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "Common/Config/Config.h"
|
||||||
|
|
||||||
namespace ciface::CemuHookUDPServer
|
namespace ciface::CemuHookUDPServer
|
||||||
{
|
{
|
||||||
|
namespace Settings
|
||||||
|
{
|
||||||
|
extern const Config::ConfigInfo<bool> SERVER_ENABLED;
|
||||||
|
extern const Config::ConfigInfo<std::string> SERVER_ADDRESS;
|
||||||
|
extern const Config::ConfigInfo<int> SERVER_PORT;
|
||||||
|
} // namespace Settings
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
void PopulateDevices();
|
void PopulateDevices();
|
||||||
void DeInit();
|
void DeInit();
|
||||||
void SaveSettings();
|
|
||||||
} // namespace ciface::CemuHookUDPServer
|
} // namespace ciface::CemuHookUDPServer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user