aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs85
1 files changed, 51 insertions, 34 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs b/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs
index 1af9baf8..e34c4213 100644
--- a/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs
+++ b/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs
@@ -3,7 +3,6 @@ using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.HOS.Services.Hid.HidServer;
-using Ryujinx.HLE.Input;
using System;
namespace Ryujinx.HLE.HOS.Services.Hid
@@ -11,7 +10,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid
[Service("hid")]
class IHidServer : IpcService
{
- private KEvent _npadStyleSetUpdateEvent;
private KEvent _xpadIdEvent;
private KEvent _palmaOperationCompleteEvent;
@@ -22,8 +20,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid
private bool _vibrationPermitted;
private bool _usbFullKeyControllerEnabled;
- private HidNpadJoyHoldType _npadJoyHoldType;
- private HidNpadStyle _npadStyleSet;
private HidNpadJoyAssignmentMode _npadJoyAssignmentMode;
private HidNpadHandheldActivationMode _npadHandheldActivationMode;
private HidGyroscopeZeroDriftMode _gyroscopeZeroDriftMode;
@@ -39,12 +35,9 @@ namespace Ryujinx.HLE.HOS.Services.Hid
public IHidServer(ServiceCtx context)
{
- _npadStyleSetUpdateEvent = new KEvent(context.Device.System);
_xpadIdEvent = new KEvent(context.Device.System);
_palmaOperationCompleteEvent = new KEvent(context.Device.System);
- _npadJoyHoldType = HidNpadJoyHoldType.Vertical;
- _npadStyleSet = HidNpadStyle.FullKey | HidNpadStyle.Dual | HidNpadStyle.Left | HidNpadStyle.Right | HidNpadStyle.Handheld;
_npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Dual;
_npadHandheldActivationMode = HidNpadHandheldActivationMode.Dual;
_gyroscopeZeroDriftMode = HidGyroscopeZeroDriftMode.Standard;
@@ -85,6 +78,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
+ context.Device.Hid.Touchscreen.Active = true;
Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
return ResultCode.Success;
@@ -96,6 +90,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
+ context.Device.Hid.Mouse.Active = true;
Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
return ResultCode.Success;
@@ -107,6 +102,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
+ context.Device.Hid.Keyboard.Active = true;
Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
return ResultCode.Success;
@@ -542,13 +538,15 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// SetSupportedNpadStyleSet(nn::applet::AppletResourceUserId, nn::hid::NpadStyleTag)
public ResultCode SetSupportedNpadStyleSet(ServiceCtx context)
{
- _npadStyleSet = (HidNpadStyle)context.RequestData.ReadInt32();
-
+ ControllerType type = (ControllerType)context.RequestData.ReadInt32();
long appletResourceUserId = context.RequestData.ReadInt64();
- Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadStyleSet });
+ Logger.PrintStub(LogClass.ServiceHid, new {
+ appletResourceUserId,
+ type
+ });
- _npadStyleSetUpdateEvent.ReadableEvent.Signal();
+ context.Device.Hid.Npads.SupportedStyleSets = type;
return ResultCode.Success;
}
@@ -559,9 +557,12 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
- context.ResponseData.Write((int)_npadStyleSet);
+ context.ResponseData.Write((int)context.Device.Hid.Npads.SupportedStyleSets);
- Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadStyleSet });
+ Logger.PrintStub(LogClass.ServiceHid, new {
+ appletResourceUserId,
+ context.Device.Hid.Npads.SupportedStyleSets
+ });
return ResultCode.Success;
}
@@ -570,10 +571,17 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// SetSupportedNpadIdType(nn::applet::AppletResourceUserId, array<NpadIdType, 9>)
public ResultCode SetSupportedNpadIdType(ServiceCtx context)
{
- long appletResourceUserId = context.RequestData.ReadInt64();
- ControllerId npadIdType = (ControllerId)context.RequestData.ReadInt64();
+ long appletResourceUserId = context.RequestData.ReadInt64();
+ long arraySize = context.Request.PtrBuff[0].Size / 4;
- Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, npadIdType });
+ NpadIdType[] supportedPlayerIds = new NpadIdType[arraySize];
+
+ for (int i = 0; i < arraySize; ++i)
+ {
+ supportedPlayerIds[i] = (NpadIdType)context.Memory.ReadInt32(context.Request.PtrBuff[0].Position + i * 4);
+ }
+
+ Logger.PrintStub(LogClass.ServiceHid, $"{arraySize} " + string.Join(",", supportedPlayerIds));
return ResultCode.Success;
}
@@ -584,6 +592,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
+ context.Device.Hid.Npads.Active = true;
Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
return ResultCode.Success;
@@ -595,6 +604,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
+ context.Device.Hid.Npads.Active = false;
Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
return ResultCode.Success;
@@ -604,11 +614,12 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// AcquireNpadStyleSetUpdateEventHandle(nn::applet::AppletResourceUserId, uint, ulong) -> nn::sf::NativeHandle
public ResultCode AcquireNpadStyleSetUpdateEventHandle(ServiceCtx context)
{
- long appletResourceUserId = context.RequestData.ReadInt64();
- int npadId = context.RequestData.ReadInt32();
- long npadStyleSet = context.RequestData.ReadInt64();
+ PlayerIndex npadId = HidUtils.GetIndexFromNpadIdType((NpadIdType)context.RequestData.ReadInt32());
+ long appletResourceUserId = context.RequestData.ReadInt64();
+ long npadStyleSet = context.RequestData.ReadInt64();
- if (context.Process.HandleTable.GenerateHandle(_npadStyleSetUpdateEvent.ReadableEvent, out int handle) != KernelResult.Success)
+ KEvent evnt = context.Device.Hid.Npads.GetStyleSetUpdateEvent(npadId);
+ if (context.Process.HandleTable.GenerateHandle(evnt.ReadableEvent, out int handle) != KernelResult.Success)
{
throw new InvalidOperationException("Out of handles!");
}
@@ -624,8 +635,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// DisconnectNpad(nn::applet::AppletResourceUserId, uint NpadIdType)
public ResultCode DisconnectNpad(ServiceCtx context)
{
- long appletResourceUserId = context.RequestData.ReadInt64();
- int npadIdType = context.RequestData.ReadInt32();
+ NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadInt32();
+ long appletResourceUserId = context.RequestData.ReadInt64();
Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, npadIdType });
@@ -651,10 +662,10 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// ActivateNpadWithRevision(nn::applet::AppletResourceUserId, int Unknown)
public ResultCode ActivateNpadWithRevision(ServiceCtx context)
{
+ int revision = context.RequestData.ReadInt32();
long appletResourceUserId = context.RequestData.ReadInt64();
- int unknown = context.RequestData.ReadInt32();
- Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknown });
+ Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, revision });
return ResultCode.Success;
}
@@ -664,9 +675,12 @@ namespace Ryujinx.HLE.HOS.Services.Hid
public ResultCode SetNpadJoyHoldType(ServiceCtx context)
{
long appletResourceUserId = context.RequestData.ReadInt64();
- _npadJoyHoldType = (HidNpadJoyHoldType)context.RequestData.ReadInt64();
+ context.Device.Hid.Npads.JoyHold = (NpadJoyHoldType)context.RequestData.ReadInt64();
- Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadJoyHoldType });
+ Logger.PrintStub(LogClass.ServiceHid, new {
+ appletResourceUserId,
+ context.Device.Hid.Npads.JoyHold
+ });
return ResultCode.Success;
}
@@ -677,9 +691,12 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
long appletResourceUserId = context.RequestData.ReadInt64();
- context.ResponseData.Write((long)_npadJoyHoldType);
+ context.ResponseData.Write((long)context.Device.Hid.Npads.JoyHold);
- Logger.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadJoyHoldType });
+ Logger.PrintStub(LogClass.ServiceHid, new {
+ appletResourceUserId,
+ context.Device.Hid.Npads.JoyHold
+ });
return ResultCode.Success;
}
@@ -688,8 +705,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// SetNpadJoyAssignmentModeSingleByDefault(uint HidControllerId, nn::applet::AppletResourceUserId)
public ResultCode SetNpadJoyAssignmentModeSingleByDefault(ServiceCtx context)
{
- ControllerId hidControllerId = (ControllerId)context.RequestData.ReadInt32();
- long appletResourceUserId = context.RequestData.ReadInt64();
+ PlayerIndex hidControllerId = (PlayerIndex)context.RequestData.ReadInt32();
+ long appletResourceUserId = context.RequestData.ReadInt64();
_npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Single;
@@ -702,7 +719,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// SetNpadJoyAssignmentModeSingle(uint HidControllerId, nn::applet::AppletResourceUserId, long HidNpadJoyDeviceType)
public ResultCode SetNpadJoyAssignmentModeSingle(ServiceCtx context)
{
- ControllerId hidControllerId = (ControllerId)context.RequestData.ReadInt32();
+ PlayerIndex hidControllerId = (PlayerIndex)context.RequestData.ReadInt32();
long appletResourceUserId = context.RequestData.ReadInt64();
HidNpadJoyDeviceType hidNpadJoyDeviceType = (HidNpadJoyDeviceType)context.RequestData.ReadInt64();
@@ -717,8 +734,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// SetNpadJoyAssignmentModeDual(uint HidControllerId, nn::applet::AppletResourceUserId)
public ResultCode SetNpadJoyAssignmentModeDual(ServiceCtx context)
{
- ControllerId hidControllerId = (ControllerId)context.RequestData.ReadInt32();
- long appletResourceUserId = context.RequestData.ReadInt64();
+ PlayerIndex hidControllerId = HidUtils.GetIndexFromNpadIdType((NpadIdType)context.RequestData.ReadInt32());
+ long appletResourceUserId = context.RequestData.ReadInt64();
_npadJoyAssignmentMode = HidNpadJoyAssignmentMode.Dual;
@@ -831,7 +848,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// SetNpadJoyAssignmentModeSingleWithDestination(uint HidControllerId, long HidNpadJoyDeviceType, nn::applet::AppletResourceUserId) -> bool Unknown0, uint Unknown1
public ResultCode SetNpadJoyAssignmentModeSingleWithDestination(ServiceCtx context)
{
- ControllerId hidControllerId = (ControllerId)context.RequestData.ReadInt32();
+ PlayerIndex hidControllerId = (PlayerIndex)context.RequestData.ReadInt32();
HidNpadJoyDeviceType hidNpadJoyDeviceType = (HidNpadJoyDeviceType)context.RequestData.ReadInt64();
long appletResourceUserId = context.RequestData.ReadInt64();