aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Applets/Controller
diff options
context:
space:
mode:
authormageven <62494521+mageven@users.noreply.github.com>2020-08-24 02:24:11 +0530
committerGitHub <noreply@github.com>2020-08-23 22:54:11 +0200
commit27179d02180396750cc2ea08ac1e2cc5a91a8763 (patch)
treed9fb3e03f4553b0aad2c9dec7e74e38f864e199c /Ryujinx.HLE/HOS/Applets/Controller
parent01ff648bdf46b85409d1a834987a69150de7adb9 (diff)
Improve multi-controller support in HID and Controller Applet (#1453)
* Initial commit Enable proper LED patterns Toggle Hotkeys only on focus Ignore Handheld on Docked mode Remove PrimaryController Validate NpadIdType Rewrite NpadDevices to process config in update loop Cleanup * Notify in log periodically when no matched controllers * Remove duplicate StructArrayHelpers in favor of Common.Memory Fix struct padding CS0169 warns in Touchscreen * Remove GTK markup from Controller Applet Use IList instead of List Explicit list capacity in 1ms loop Fix formatting * Restrict ControllerWindow to show valid controller types Add selected player name to ControllerWindow title * ControllerWindow: Fix controller type initial value NpadDevices: Simplify default battery charge * Address AcK's comments Use explicit types and fix formatting * Remove HashSet for SupportedPlayers Fixes potential exceptions due to race * Fix ControllerSupportArg struct packing Also comes with two revisions of struct for 4/8 players max.
Diffstat (limited to 'Ryujinx.HLE/HOS/Applets/Controller')
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs48
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUiArgs.cs14
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgHeader.cs3
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgV7.cs (renamed from Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArg.cs)5
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgVPre7.cs16
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportResultInfo.cs3
6 files changed, 76 insertions, 13 deletions
diff --git a/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs b/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs
index 39503157..4f806225 100644
--- a/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs
+++ b/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs
@@ -32,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Applets
byte[] controllerSupportArgPrivate = _normalSession.Pop();
ControllerSupportArgPrivate privateArg = IApplet.ReadStruct<ControllerSupportArgPrivate>(controllerSupportArgPrivate);
- Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet ArgPriv {privateArg.PrivateSize} {privateArg.ArgSize} {privateArg.Mode}" +
+ Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet ArgPriv {privateArg.PrivateSize} {privateArg.ArgSize} {privateArg.Mode} " +
$"HoldType:{(NpadJoyHoldType)privateArg.NpadJoyHoldType} StyleSets:{(ControllerType)privateArg.NpadStyleSet}");
if (privateArg.Mode != ControllerSupportMode.ShowControllerSupport)
@@ -47,33 +47,57 @@ namespace Ryujinx.HLE.HOS.Applets
ControllerSupportArgHeader argHeader;
- if (privateArg.ArgSize == Marshal.SizeOf<ControllerSupportArg>())
+ if (privateArg.ArgSize == Marshal.SizeOf<ControllerSupportArgV7>())
{
- ControllerSupportArg arg = IApplet.ReadStruct<ControllerSupportArg>(controllerSupportArg);
+ ControllerSupportArgV7 arg = IApplet.ReadStruct<ControllerSupportArgV7>(controllerSupportArg);
argHeader = arg.Header;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerSupportArg Version 7 EnableExplainText={arg.EnableExplainText != 0}");
+ // Read enable text here?
+ }
+ else if (privateArg.ArgSize == Marshal.SizeOf<ControllerSupportArgVPre7>())
+ {
+ ControllerSupportArgVPre7 arg = IApplet.ReadStruct<ControllerSupportArgVPre7>(controllerSupportArg);
+ argHeader = arg.Header;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerSupportArg Version Pre-7 EnableExplainText={arg.EnableExplainText != 0}");
// Read enable text here?
}
else
{
- Logger.Stub?.PrintStub(LogClass.ServiceHid, $"Unknown revision of ControllerSupportArg.");
+ Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerSupportArg Version Unknown");
argHeader = IApplet.ReadStruct<ControllerSupportArgHeader>(controllerSupportArg); // Read just the header
}
- Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet Arg {argHeader.PlayerCountMin} {argHeader.PlayerCountMax} {argHeader.EnableTakeOverConnection} {argHeader.EnableSingleMode}");
+ int playerMin = argHeader.PlayerCountMin;
+ int playerMax = argHeader.PlayerCountMax;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet Arg {playerMin} {playerMax} {argHeader.EnableTakeOverConnection} {argHeader.EnableSingleMode}");
- // Currently, the only purpose of this applet is to help
- // choose the primary input controller for the game
- // TODO: Ideally should hook back to HID.Controller. When applet is called, can choose appropriate controller and attach to appropriate id.
- if (argHeader.PlayerCountMin > 1)
+ int configuredCount = 0;
+ PlayerIndex primaryIndex = PlayerIndex.Unknown;
+ while (!_system.Device.Hid.Npads.Validate(playerMin, playerMax, (ControllerType)privateArg.NpadStyleSet, out configuredCount, out primaryIndex))
{
- Logger.Warning?.Print(LogClass.ServiceHid, "More than one controller was requested.");
+ ControllerAppletUiArgs uiArgs = new ControllerAppletUiArgs
+ {
+ PlayerCountMin = playerMin,
+ PlayerCountMax = playerMax,
+ SupportedStyles = (ControllerType)privateArg.NpadStyleSet,
+ SupportedPlayers = _system.Device.Hid.Npads.GetSupportedPlayers(),
+ IsDocked = _system.State.DockedMode
+ };
+
+ if (!_system.Device.UiHandler.DisplayMessageDialog(uiArgs))
+ {
+ break;
+ }
}
ControllerSupportResultInfo result = new ControllerSupportResultInfo
{
- PlayerCount = 1,
- SelectedId = (uint)GetNpadIdTypeFromIndex(_system.Device.Hid.Npads.PrimaryController)
+ PlayerCount = (sbyte)configuredCount,
+ SelectedId = (uint)GetNpadIdTypeFromIndex(primaryIndex)
};
Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet ReturnResult {result.PlayerCount} {result.SelectedId}");
diff --git a/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUiArgs.cs b/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUiArgs.cs
new file mode 100644
index 00000000..cc15a406
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUiArgs.cs
@@ -0,0 +1,14 @@
+using Ryujinx.HLE.HOS.Services.Hid;
+using System.Collections.Generic;
+
+namespace Ryujinx.HLE.HOS.Applets
+{
+ public struct ControllerAppletUiArgs
+ {
+ public int PlayerCountMin;
+ public int PlayerCountMax;
+ public ControllerType SupportedStyles;
+ public IEnumerable<PlayerIndex> SupportedPlayers;
+ public bool IsDocked;
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgHeader.cs b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgHeader.cs
index 945f0ef6..8eaf1d44 100644
--- a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgHeader.cs
+++ b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgHeader.cs
@@ -1,6 +1,9 @@
+using System.Runtime.InteropServices;
+
namespace Ryujinx.HLE.HOS.Applets
{
#pragma warning disable CS0649
+ [StructLayout(LayoutKind.Sequential, Pack=1)]
struct ControllerSupportArgHeader
{
public sbyte PlayerCountMin;
diff --git a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArg.cs b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgV7.cs
index 908e9049..a01e7c04 100644
--- a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArg.cs
+++ b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgV7.cs
@@ -1,8 +1,11 @@
+using System.Runtime.InteropServices;
+
namespace Ryujinx.HLE.HOS.Applets
{
#pragma warning disable CS0649
// (8.0.0+ version)
- unsafe struct ControllerSupportArg
+ [StructLayout(LayoutKind.Sequential, Pack=1)]
+ unsafe struct ControllerSupportArgV7
{
public ControllerSupportArgHeader Header;
public fixed uint IdentificationColor[8];
diff --git a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgVPre7.cs b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgVPre7.cs
new file mode 100644
index 00000000..6d46aea5
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportArgVPre7.cs
@@ -0,0 +1,16 @@
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.HLE.HOS.Applets
+{
+#pragma warning disable CS0649
+ // (1.0.0+ version)
+ [StructLayout(LayoutKind.Sequential, Pack=1)]
+ unsafe struct ControllerSupportArgVPre7
+ {
+ public ControllerSupportArgHeader Header;
+ public fixed uint IdentificationColor[4];
+ public byte EnableExplainText;
+ public fixed byte ExplainText[4 * 0x81];
+ }
+#pragma warning restore CS0649
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportResultInfo.cs b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportResultInfo.cs
index 09a19bf0..c213e592 100644
--- a/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportResultInfo.cs
+++ b/Ryujinx.HLE/HOS/Applets/Controller/ControllerSupportResultInfo.cs
@@ -1,6 +1,9 @@
+using System.Runtime.InteropServices;
+
namespace Ryujinx.HLE.HOS.Applets
{
#pragma warning disable CS0649
+ [StructLayout(LayoutKind.Sequential, Pack=1)]
unsafe struct ControllerSupportResultInfo
{
public sbyte PlayerCount;