aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs
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/ControllerApplet.cs
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/ControllerApplet.cs')
-rw-r--r--Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs48
1 files changed, 36 insertions, 12 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}");