diff --git a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs index 12139e87d9..1f185bd185 100644 --- a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs +++ b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs @@ -7,6 +7,7 @@ using Ryujinx.Common.Utilities; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; +using Ryujinx.Horizon; using Ryujinx.Input; using Ryujinx.Input.GTK3; using Ryujinx.Input.HLE; @@ -365,7 +366,6 @@ namespace Ryujinx.UI } NpadManager.Initialize(device, ConfigurationState.Instance.Hid.InputConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); - TouchScreenManager.Initialize(device); } private unsafe void Renderer_ScreenCaptured(object sender, ScreenCaptureImageInfo e) @@ -738,7 +738,7 @@ namespace Ryujinx.UI TouchScreenManager.Update(false); } - Device.Hid.DebugPad.Update(); + HorizonStatic.Hid.DebugPad.Update(); return true; } diff --git a/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs index 5ec9d4b08b..bc3090aacc 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs @@ -2,7 +2,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Am.AppletAE; using Ryujinx.HLE.HOS.Services.Hid; -using Ryujinx.HLE.HOS.Services.Hid.Types; +using Ryujinx.Horizon.Sdk.Hid.Npad; using System; using System.IO; using System.Runtime.CompilerServices; diff --git a/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUIArgs.cs b/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUIArgs.cs index 10cba58ba2..3038457baf 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUIArgs.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerAppletUIArgs.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.Horizon.Sdk.Hid.Npad; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Applets diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs index 0462a5b003..0402d6c5fd 100644 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs @@ -3,7 +3,6 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard; using Ryujinx.HLE.HOS.Services.Am.AppletAE; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; using Ryujinx.HLE.UI; using Ryujinx.HLE.UI.Input; using Ryujinx.Memory; diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index 64b08e3093..4d94cd84f2 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -41,7 +41,6 @@ namespace Ryujinx.HLE.HOS public class Horizon : IDisposable { - internal const int HidSize = 0x40000; internal const int FontSize = 0x1100000; internal const int IirsSize = 0x8000; internal const int TimeSize = 0x1000; @@ -68,7 +67,6 @@ namespace Ryujinx.HLE.HOS internal ServerBase SmServer { get; private set; } internal ServerBase BsdServer { get; private set; } internal ServerBase FsServer { get; private set; } - internal ServerBase HidServer { get; private set; } internal ServerBase NvDrvServer { get; private set; } internal ServerBase TimeServer { get; private set; } internal ServerBase ViServer { get; private set; } @@ -76,7 +74,6 @@ namespace Ryujinx.HLE.HOS internal ServerBase ViServerS { get; private set; } internal ServerBase LdnServer { get; private set; } - internal KSharedMemory HidSharedMem { get; private set; } internal KSharedMemory FontSharedMem { get; private set; } internal KSharedMemory IirsSharedMem { get; private set; } @@ -101,7 +98,6 @@ namespace Ryujinx.HLE.HOS public int GlobalAccessLogMode { get; set; } - internal SharedMemoryStorage HidStorage { get; private set; } internal NvHostSyncpt HostSyncpoint { get; private set; } @@ -134,33 +130,26 @@ namespace Ryujinx.HLE.HOS // region used that is used is Application, so we can use the other ones for anything. KMemoryRegionManager region = KernelContext.MemoryManager.MemoryRegions[(int)MemoryRegion.NvServices]; - ulong hidPa = region.Address; - ulong fontPa = region.Address + HidSize; - ulong iirsPa = region.Address + HidSize + FontSize; - ulong timePa = region.Address + HidSize + FontSize + IirsSize; - ulong appletCaptureBufferPa = region.Address + HidSize + FontSize + IirsSize + TimeSize; + ulong fontPa = region.Address; + ulong iirsPa = region.Address + FontSize; + ulong timePa = region.Address + FontSize + IirsSize; + ulong appletCaptureBufferPa = region.Address + FontSize + IirsSize + TimeSize; - KPageList hidPageList = new(); KPageList fontPageList = new(); KPageList iirsPageList = new(); KPageList timePageList = new(); KPageList appletCaptureBufferPageList = new(); - hidPageList.AddRange(hidPa, HidSize / KPageTableBase.PageSize); fontPageList.AddRange(fontPa, FontSize / KPageTableBase.PageSize); iirsPageList.AddRange(iirsPa, IirsSize / KPageTableBase.PageSize); timePageList.AddRange(timePa, TimeSize / KPageTableBase.PageSize); appletCaptureBufferPageList.AddRange(appletCaptureBufferPa, AppletCaptureBufferSize / KPageTableBase.PageSize); - var hidStorage = new SharedMemoryStorage(KernelContext, hidPageList); var fontStorage = new SharedMemoryStorage(KernelContext, fontPageList); var iirsStorage = new SharedMemoryStorage(KernelContext, iirsPageList); var timeStorage = new SharedMemoryStorage(KernelContext, timePageList); var appletCaptureBufferStorage = new SharedMemoryStorage(KernelContext, appletCaptureBufferPageList); - HidStorage = hidStorage; - - HidSharedMem = new KSharedMemory(KernelContext, hidStorage, 0, 0, KMemoryPermission.Read); FontSharedMem = new KSharedMemory(KernelContext, fontStorage, 0, 0, KMemoryPermission.Read); IirsSharedMem = new KSharedMemory(KernelContext, iirsStorage, 0, 0, KMemoryPermission.Read); @@ -247,7 +236,6 @@ namespace Ryujinx.HLE.HOS BsdServer = new ServerBase(KernelContext, "BsdServer"); FsServer = new ServerBase(KernelContext, "FsServer"); - HidServer = new ServerBase(KernelContext, "HidServer"); NvDrvServer = new ServerBase(KernelContext, "NvservicesServer"); TimeServer = new ServerBase(KernelContext, "TimeServer"); ViServer = new ServerBase(KernelContext, "ViServerU"); diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/BaseDevice.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/BaseDevice.cs deleted file mode 100644 index a6c21fdaf3..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/BaseDevice.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public abstract class BaseDevice - { - protected readonly Switch _device; - public bool Active; - - public BaseDevice(Switch device, bool active) - { - _device = device; - Active = active; - } - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/ControllerConfig.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/ControllerConfig.cs deleted file mode 100644 index cba5c7b1dd..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/ControllerConfig.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public struct ControllerConfig - { - public PlayerIndex Player; - public ControllerType Type; - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs index 8e2e854fb9..5c467e03ee 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs @@ -1,3 +1,4 @@ +using Ryujinx.Horizon.Sdk.Hid.Npad; using System; namespace Ryujinx.HLE.HOS.Services.Hid.HidServer @@ -39,12 +40,5 @@ namespace Ryujinx.HLE.HOS.Services.Hid.HidServer _ => throw new ArgumentOutOfRangeException(nameof(index)), #pragma warning restore IDE0055 }; - - public static bool IsValidNpadIdType(NpadIdType npadIdType) - { - return (npadIdType >= NpadIdType.Player1 && npadIdType <= NpadIdType.Player8) || - npadIdType == NpadIdType.Handheld || - npadIdType == NpadIdType.Unknown; - } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Npad/NpadHandheldActivationMode.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Npad/NpadHandheldActivationMode.cs deleted file mode 100644 index ba56e93cb4..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Npad/NpadHandheldActivationMode.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public enum NpadHandheldActivationMode - { - Dual, - Single, - None, - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceHandle.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceHandle.cs deleted file mode 100644 index 02f4b68409..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceHandle.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public struct VibrationDeviceHandle - { - public byte DeviceType; - public byte PlayerId; - public byte Position; - public byte Reserved; - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDevicePosition.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDevicePosition.cs deleted file mode 100644 index 90f4abcc36..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDevicePosition.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public enum VibrationDevicePosition - { - None, - Left, - Right, - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceType.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceType.cs deleted file mode 100644 index db586bb348..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public enum VibrationDeviceType - { - None, - LinearResonantActuator, - GcErm, - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceValue.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceValue.cs deleted file mode 100644 index feed8764dd..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationDeviceValue.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid -{ - public struct VibrationDeviceValue - { - public VibrationDeviceType DeviceType; - public VibrationDevicePosition Position; - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs index e3f505f371..3b7ca91588 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs @@ -3,9 +3,12 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Hid.HidServer; -using Ryujinx.HLE.HOS.Services.Hid.Types; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Hid; +using Ryujinx.Horizon.Sdk.Hid.HidDevices; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Hid.SixAxis; +using Ryujinx.Horizon.Sdk.Hid.Vibration; using System; using System.Collections.Generic; using System.Runtime.InteropServices; @@ -73,168 +76,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(1)] - // ActivateDebugPad(nn::applet::AppletResourceUserId) - public ResultCode ActivateDebugPad(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - // Initialize entries to avoid issues with some games. - - for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++) - { - context.Device.Hid.DebugPad.Update(); - } - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(11)] - // ActivateTouchScreen(nn::applet::AppletResourceUserId) - public ResultCode ActivateTouchScreen(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.Device.Hid.Touchscreen.Active = true; - - // Initialize entries to avoid issues with some games. - - for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++) - { - context.Device.Hid.Touchscreen.Update(); - } - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(21)] - // ActivateMouse(nn::applet::AppletResourceUserId) - public ResultCode ActivateMouse(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.Device.Hid.Mouse.Active = true; - - // Initialize entries to avoid issues with some games. - - for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++) - { - context.Device.Hid.Mouse.Update(0, 0); - } - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(31)] - // ActivateKeyboard(nn::applet::AppletResourceUserId) - public ResultCode ActivateKeyboard(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.Device.Hid.Keyboard.Active = true; - - // Initialize entries to avoid issues with some games. - - KeyboardInput emptyInput = new() - { - Keys = new ulong[4], - }; - - for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++) - { - context.Device.Hid.Keyboard.Update(emptyInput); - } - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(32)] - // SendKeyboardLockKeyEvent(uint flags, pid) - public ResultCode SendKeyboardLockKeyEvent(ServiceCtx context) - { - uint flags = context.RequestData.ReadUInt32(); - - // NOTE: This signal the keyboard driver about lock events. - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { flags }); - - return ResultCode.Success; - } - - [CommandCmif(40)] - // AcquireXpadIdEventHandle(ulong XpadId) -> nn::sf::NativeHandle - public ResultCode AcquireXpadIdEventHandle(ServiceCtx context) - { - long xpadId = context.RequestData.ReadInt64(); - - if (context.Process.HandleTable.GenerateHandle(_xpadIdEvent.ReadableEvent, out _xpadIdEventHandle) != Result.Success) - { - throw new InvalidOperationException("Out of handles!"); - } - - context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_xpadIdEventHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { xpadId }); - - return ResultCode.Success; - } - - [CommandCmif(41)] - // ReleaseXpadIdEventHandle(ulong XpadId) - public ResultCode ReleaseXpadIdEventHandle(ServiceCtx context) - { - long xpadId = context.RequestData.ReadInt64(); - - context.Process.HandleTable.CloseHandle(_xpadIdEventHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { xpadId }); - - return ResultCode.Success; - } - - [CommandCmif(51)] - // ActivateXpad(nn::hid::BasicXpadId, nn::applet::AppletResourceUserId) - public ResultCode ActivateXpad(ServiceCtx context) - { - int basicXpadId = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, basicXpadId }); - - return ResultCode.Success; - } - - [CommandCmif(55)] - // GetXpadIds() -> long IdsCount, buffer, type: 0xa> - public ResultCode GetXpadIds(ServiceCtx context) - { - // There is any Xpad, so we return 0 and write nothing inside the type-0xa buffer. - context.ResponseData.Write(0L); - - Logger.Stub?.PrintStub(LogClass.ServiceHid); - - return ResultCode.Success; - } - - [CommandCmif(56)] - // ActivateJoyXpad(nn::hid::JoyXpadId) - public ResultCode ActivateJoyXpad(ServiceCtx context) - { - int joyXpadId = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); - - return ResultCode.Success; - } - [CommandCmif(58)] // GetJoyXpadLifoHandle(nn::hid::JoyXpadId) -> nn::sf::NativeHandle public ResultCode GetJoyXpadLifoHandle(ServiceCtx context) @@ -250,40 +91,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(59)] - // GetJoyXpadIds() -> long IdsCount, buffer, type: 0xa> - public ResultCode GetJoyXpadIds(ServiceCtx context) - { - // There is any JoyXpad, so we return 0 and write nothing inside the type-0xa buffer. - context.ResponseData.Write(0L); - - Logger.Stub?.PrintStub(LogClass.ServiceHid); - - return ResultCode.Success; - } - - [CommandCmif(60)] - // ActivateSixAxisSensor(nn::hid::BasicXpadId) - public ResultCode ActivateSixAxisSensor(ServiceCtx context) - { - int basicXpadId = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { basicXpadId }); - - return ResultCode.Success; - } - - [CommandCmif(61)] - // DeactivateSixAxisSensor(nn::hid::BasicXpadId) - public ResultCode DeactivateSixAxisSensor(ServiceCtx context) - { - int basicXpadId = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { basicXpadId }); - - return ResultCode.Success; - } - [CommandCmif(62)] // GetSixAxisSensorLifoHandle(nn::hid::BasicXpadId) -> nn::sf::NativeHandle public ResultCode GetSixAxisSensorLifoHandle(ServiceCtx context) @@ -299,28 +106,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(63)] - // ActivateJoySixAxisSensor(nn::hid::JoyXpadId) - public ResultCode ActivateJoySixAxisSensor(ServiceCtx context) - { - int joyXpadId = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); - - return ResultCode.Success; - } - - [CommandCmif(64)] - // DeactivateJoySixAxisSensor(nn::hid::JoyXpadId) - public ResultCode DeactivateJoySixAxisSensor(ServiceCtx context) - { - int joyXpadId = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); - - return ResultCode.Success; - } - [CommandCmif(65)] // GetJoySixAxisSensorLifoHandle(nn::hid::JoyXpadId) -> nn::sf::NativeHandle public ResultCode GetJoySixAxisSensorLifoHandle(ServiceCtx context) @@ -336,412 +121,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(66)] - // StartSixAxisSensor(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode StartSixAxisSensor(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(67)] - // StopSixAxisSensor(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode StopSixAxisSensor(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(68)] - // IsSixAxisSensorFusionEnabled(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> bool IsEnabled - public ResultCode IsSixAxisSensorFusionEnabled(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_sixAxisSensorFusionEnabled); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sixAxisSensorFusionEnabled }); - - return ResultCode.Success; - } - - [CommandCmif(69)] - // EnableSixAxisSensorFusion(bool Enabled, nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode EnableSixAxisSensorFusion(ServiceCtx context) - { - _sixAxisSensorFusionEnabled = context.RequestData.ReadUInt32() != 0; - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sixAxisSensorFusionEnabled }); - - return ResultCode.Success; - } - - [CommandCmif(70)] - // SetSixAxisSensorFusionParameters(nn::hid::SixAxisSensorHandle, float RevisePower, float ReviseRange, nn::applet::AppletResourceUserId) - public ResultCode SetSixAxisSensorFusionParameters(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - - _sensorFusionParams = new SensorFusionParameters - { - RevisePower = context.RequestData.ReadInt32(), - ReviseRange = context.RequestData.ReadInt32(), - }; - - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sensorFusionParams.RevisePower, _sensorFusionParams.ReviseRange }); - - return ResultCode.Success; - } - - [CommandCmif(71)] - // GetSixAxisSensorFusionParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> float RevisePower, float ReviseRange) - public ResultCode GetSixAxisSensorFusionParameters(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_sensorFusionParams.RevisePower); - context.ResponseData.Write(_sensorFusionParams.ReviseRange); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sensorFusionParams.RevisePower, _sensorFusionParams.ReviseRange }); - - return ResultCode.Success; - } - - [CommandCmif(72)] - // ResetSixAxisSensorFusionParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode ResetSixAxisSensorFusionParameters(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - _sensorFusionParams.RevisePower = 0; - _sensorFusionParams.ReviseRange = 0; - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sensorFusionParams.RevisePower, _sensorFusionParams.ReviseRange }); - - return ResultCode.Success; - } - - [CommandCmif(73)] - // SetAccelerometerParameters(nn::hid::SixAxisSensorHandle, float X, float Y, nn::applet::AppletResourceUserId) - public ResultCode SetAccelerometerParameters(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - - _accelerometerParams = new AccelerometerParameters - { - X = context.RequestData.ReadInt32(), - Y = context.RequestData.ReadInt32(), - }; - - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerParams.X, _accelerometerParams.Y }); - - return ResultCode.Success; - } - - [CommandCmif(74)] - // GetAccelerometerParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> float X, float Y - public ResultCode GetAccelerometerParameters(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_accelerometerParams.X); - context.ResponseData.Write(_accelerometerParams.Y); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerParams.X, _accelerometerParams.Y }); - - return ResultCode.Success; - } - - [CommandCmif(75)] - // ResetAccelerometerParameters(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode ResetAccelerometerParameters(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - _accelerometerParams.X = 0; - _accelerometerParams.Y = 0; - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerParams.X, _accelerometerParams.Y }); - - return ResultCode.Success; - } - - [CommandCmif(76)] - // SetAccelerometerPlayMode(nn::hid::SixAxisSensorHandle, uint PlayMode, nn::applet::AppletResourceUserId) - public ResultCode SetAccelerometerPlayMode(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - _accelerometerPlayMode = context.RequestData.ReadUInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerPlayMode }); - - return ResultCode.Success; - } - - [CommandCmif(77)] - // GetAccelerometerPlayMode(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> uint PlayMode - public ResultCode GetAccelerometerPlayMode(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_accelerometerPlayMode); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerPlayMode }); - - return ResultCode.Success; - } - - [CommandCmif(78)] - // ResetAccelerometerPlayMode(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode ResetAccelerometerPlayMode(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - _accelerometerPlayMode = 0; - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerPlayMode }); - - return ResultCode.Success; - } - - [CommandCmif(79)] - // SetGyroscopeZeroDriftMode(nn::hid::SixAxisSensorHandle, uint GyroscopeZeroDriftMode, nn::applet::AppletResourceUserId) - public ResultCode SetGyroscopeZeroDriftMode(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - _gyroscopeZeroDriftMode = (GyroscopeZeroDriftMode)context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _gyroscopeZeroDriftMode }); - - return ResultCode.Success; - } - - [CommandCmif(80)] - // GetGyroscopeZeroDriftMode(nn::applet::AppletResourceUserId, nn::hid::SixAxisSensorHandle) -> int GyroscopeZeroDriftMode - public ResultCode GetGyroscopeZeroDriftMode(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write((int)_gyroscopeZeroDriftMode); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _gyroscopeZeroDriftMode }); - - return ResultCode.Success; - } - - [CommandCmif(81)] - // ResetGyroscopeZeroDriftMode(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode ResetGyroscopeZeroDriftMode(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - _gyroscopeZeroDriftMode = GyroscopeZeroDriftMode.Standard; - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _gyroscopeZeroDriftMode }); - - return ResultCode.Success; - } - - [CommandCmif(82)] - // IsSixAxisSensorAtRest(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> bool IsAsRest - public ResultCode IsSixAxisSensorAtRest(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - bool isAtRest = true; - - context.ResponseData.Write(isAtRest); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, isAtRest }); - - return ResultCode.Success; - } - - [CommandCmif(83)] // 6.0.0+ - // IsFirmwareUpdateAvailableForSixAxisSensor(nn::hid::AppletResourceUserId, nn::hid::SixAxisSensorHandle, pid) -> bool UpdateAvailable - public ResultCode IsFirmwareUpdateAvailableForSixAxisSensor(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_isFirmwareUpdateAvailableForSixAxisSensor); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _isFirmwareUpdateAvailableForSixAxisSensor }); - - return ResultCode.Success; - } - - [CommandCmif(84)] // 13.0.0+ - // EnableSixAxisSensorUnalteredPassthrough(nn::applet::AppletResourceUserId, nn::hid::SixAxisSensorHandle, u8 enabled) - public ResultCode EnableSixAxisSensorUnalteredPassthrough(ServiceCtx context) - { - _isSixAxisSensorUnalteredPassthroughEnabled = context.RequestData.ReadUInt32() != 0; - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _isSixAxisSensorUnalteredPassthroughEnabled }); - - return ResultCode.Success; - } - - [CommandCmif(85)] // 13.0.0+ - // IsSixAxisSensorUnalteredPassthroughEnabled(nn::applet::AppletResourceUserId, nn::hid::SixAxisSensorHandle) -> u8 enabled - public ResultCode IsSixAxisSensorUnalteredPassthroughEnabled(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_isSixAxisSensorUnalteredPassthroughEnabled); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(87)] // 13.0.0+ - // LoadSixAxisSensorCalibrationParameter(nn::applet::AppletResourceUserId, nn::hid::SixAxisSensorHandle, u64 unknown) - public ResultCode LoadSixAxisSensorCalibrationParameter(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - // TODO: CalibrationParameter have to be determined. - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(88)] // 13.0.0+ - // GetSixAxisSensorIcInformation(nn::applet::AppletResourceUserId, nn::hid::SixAxisSensorHandle) -> u64 unknown - public ResultCode GetSixAxisSensorIcInformation(ServiceCtx context) - { - int sixAxisSensorHandle = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - // TODO: IcInformation have to be determined. - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(91)] - // ActivateGesture(nn::applet::AppletResourceUserId, int Unknown0) - public ResultCode ActivateGesture(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - int unknown0 = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknown0 }); - - return ResultCode.Success; - } - - [CommandCmif(100)] - // SetSupportedNpadStyleSet(pid, nn::applet::AppletResourceUserId, nn::hid::NpadStyleTag) - public ResultCode SetSupportedNpadStyleSet(ServiceCtx context) - { - ulong pid = context.Request.HandleDesc.PId; - ControllerType type = (ControllerType)context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Position += 4; // Padding - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { pid, appletResourceUserId, type }); - - context.Device.Hid.Npads.SupportedStyleSets = type; - - return ResultCode.Success; - } - - [CommandCmif(101)] - // GetSupportedNpadStyleSet(pid, nn::applet::AppletResourceUserId) -> uint nn::hid::NpadStyleTag - public ResultCode GetSupportedNpadStyleSet(ServiceCtx context) - { -#pragma warning disable IDE0059 // Remove unnecessary value assignment - ulong pid = context.Request.HandleDesc.PId; -#pragma warning restore IDE0059 - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write((int)context.Device.Hid.Npads.SupportedStyleSets); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, context.Device.Hid.Npads.SupportedStyleSets }); - - return ResultCode.Success; - } - - [CommandCmif(102)] - // SetSupportedNpadIdType(nn::applet::AppletResourceUserId, array) - public ResultCode SetSupportedNpadIdType(ServiceCtx context) - { -#pragma warning disable IDE0059 // Remove unnecessary value assignment - long appletResourceUserId = context.RequestData.ReadInt64(); -#pragma warning restore IDE0059 - ulong arrayPosition = context.Request.PtrBuff[0].Position; - ulong arraySize = context.Request.PtrBuff[0].Size; - - ReadOnlySpan supportedPlayerIds = MemoryMarshal.Cast(context.Memory.GetSpan(arrayPosition, (int)arraySize)); - - context.Device.Hid.Npads.ClearSupportedPlayers(); - - for (int i = 0; i < supportedPlayerIds.Length; ++i) - { - if (HidUtils.IsValidNpadIdType(supportedPlayerIds[i])) - { - context.Device.Hid.Npads.SetSupportedPlayer(HidUtils.GetIndexFromNpadIdType(supportedPlayerIds[i])); - } - } - - Logger.Stub?.PrintStub(LogClass.ServiceHid, $"{supportedPlayerIds.Length} Players: " + string.Join(",", supportedPlayerIds.ToArray())); - - return ResultCode.Success; - } - [CommandCmif(103)] // ActivateNpad(nn::applet::AppletResourceUserId) public ResultCode ActivateNpad(ServiceCtx context) @@ -749,18 +128,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ActiveNpadImpl(context); } - [CommandCmif(104)] - // DeactivateNpad(nn::applet::AppletResourceUserId) - public ResultCode DeactivateNpad(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.Device.Hid.Npads.Active = false; - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - [CommandCmif(106)] // AcquireNpadStyleSetUpdateEventHandle(nn::applet::AppletResourceUserId, uint, ulong) -> nn::sf::NativeHandle public ResultCode AcquireNpadStyleSetUpdateEventHandle(ServiceCtx context) @@ -785,44 +152,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(107)] - // DisconnectNpad(nn::applet::AppletResourceUserId, uint NpadIdType) - public ResultCode DisconnectNpad(ServiceCtx context) - { - NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, npadIdType }); - - return ResultCode.Success; - } - - [CommandCmif(108)] - // GetPlayerLedPattern(u32 npad_id) -> u64 led_pattern - public ResultCode GetPlayerLedPattern(ServiceCtx context) - { - NpadIdType npadId = (NpadIdType)context.RequestData.ReadUInt32(); - - ulong ledPattern = npadId switch - { - NpadIdType.Player1 => 0b0001, - NpadIdType.Player2 => 0b0011, - NpadIdType.Player3 => 0b0111, - NpadIdType.Player4 => 0b1111, - NpadIdType.Player5 => 0b1001, - NpadIdType.Player6 => 0b0101, - NpadIdType.Player7 => 0b1101, - NpadIdType.Player8 => 0b0110, - NpadIdType.Unknown => 0b0000, - NpadIdType.Handheld => 0b0000, - _ => throw new InvalidOperationException($"{nameof(npadId)} contains an invalid value: {npadId}"), - }; - - context.ResponseData.Write(ledPattern); - - return ResultCode.Success; - } - [CommandCmif(109)] // 5.0.0+ // ActivateNpadWithRevision(nn::applet::AppletResourceUserId, ulong revision) public ResultCode ActivateNpadWithRevision(ServiceCtx context) @@ -857,7 +186,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid emptySixAxisInputs.Add(sixaxisInput); } - for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++) + for (int entry = 0; entry < Ryujinx.Horizon.Sdk.Hid.Hid.SharedMemEntryCount; entry++) { context.Device.Hid.Npads.Update(emptyGamepadInputs); context.Device.Hid.Npads.UpdateSixAxis(emptySixAxisInputs); @@ -970,82 +299,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(125)] - // MergeSingleJoyAsDualJoy(uint npadIdType0, uint npadIdType1, nn::applet::AppletResourceUserId) - public ResultCode MergeSingleJoyAsDualJoy(ServiceCtx context) - { - NpadIdType npadIdType0 = (NpadIdType)context.RequestData.ReadUInt32(); - NpadIdType npadIdType1 = (NpadIdType)context.RequestData.ReadUInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - if (HidUtils.IsValidNpadIdType(npadIdType0) && HidUtils.IsValidNpadIdType(npadIdType1)) - { - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, npadIdType0, npadIdType1 }); - } - - return ResultCode.Success; - } - - [CommandCmif(126)] - // StartLrAssignmentMode(nn::applet::AppletResourceUserId) - public ResultCode StartLrAssignmentMode(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(127)] - // StopLrAssignmentMode(nn::applet::AppletResourceUserId) - public ResultCode StopLrAssignmentMode(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(128)] - // SetNpadHandheldActivationMode(nn::applet::AppletResourceUserId, long HidNpadHandheldActivationMode) - public ResultCode SetNpadHandheldActivationMode(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - _npadHandheldActivationMode = (NpadHandheldActivationMode)context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadHandheldActivationMode }); - - return ResultCode.Success; - } - - [CommandCmif(129)] - // GetNpadHandheldActivationMode(nn::applet::AppletResourceUserId) -> long HidNpadHandheldActivationMode - public ResultCode GetNpadHandheldActivationMode(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write((long)_npadHandheldActivationMode); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadHandheldActivationMode }); - - return ResultCode.Success; - } - - [CommandCmif(130)] - // SwapNpadAssignment(uint OldNpadAssignment, uint NewNpadAssignment, nn::applet::AppletResourceUserId) - public ResultCode SwapNpadAssignment(ServiceCtx context) - { - int oldNpadAssignment = context.RequestData.ReadInt32(); - int newNpadAssignment = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, oldNpadAssignment, newNpadAssignment }); - - return ResultCode.Success; - } - [CommandCmif(131)] // IsUnintendedHomeButtonInputProtectionEnabled(uint Unknown0, nn::applet::AppletResourceUserId) -> bool IsEnabled public ResultCode IsUnintendedHomeButtonInputProtectionEnabled(ServiceCtx context) @@ -1121,129 +374,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(200)] - // GetVibrationDeviceInfo(nn::hid::VibrationDeviceHandle) -> nn::hid::VibrationDeviceInfo - public ResultCode GetVibrationDeviceInfo(ServiceCtx context) - { - VibrationDeviceHandle deviceHandle = context.RequestData.ReadStruct(); - NpadStyleIndex deviceType = (NpadStyleIndex)deviceHandle.DeviceType; - NpadIdType npadIdType = (NpadIdType)deviceHandle.PlayerId; - - if (deviceType < NpadStyleIndex.System || deviceType >= NpadStyleIndex.FullKey) - { - if (!HidUtils.IsValidNpadIdType(npadIdType)) - { - return ResultCode.InvalidNpadIdType; - } - - if (deviceHandle.Position > 1) - { - return ResultCode.InvalidDeviceIndex; - } - - VibrationDeviceType vibrationDeviceType = VibrationDeviceType.None; - - if (Enum.IsDefined(deviceType)) - { - vibrationDeviceType = VibrationDeviceType.LinearResonantActuator; - } - else if ((uint)deviceType == 8) - { - vibrationDeviceType = VibrationDeviceType.GcErm; - } - - VibrationDevicePosition vibrationDevicePosition = VibrationDevicePosition.None; - - if (vibrationDeviceType == VibrationDeviceType.LinearResonantActuator) - { - if (deviceHandle.Position == 0) - { - vibrationDevicePosition = VibrationDevicePosition.Left; - } - else if (deviceHandle.Position == 1) - { - vibrationDevicePosition = VibrationDevicePosition.Right; - } - else - { - throw new InvalidOperationException($"{nameof(deviceHandle.Position)} contains an invalid value: {deviceHandle.Position}"); - } - } - - VibrationDeviceValue deviceInfo = new() - { - DeviceType = vibrationDeviceType, - Position = vibrationDevicePosition, - }; - - context.ResponseData.WriteStruct(deviceInfo); - - return ResultCode.Success; - } - - return ResultCode.InvalidNpadDeviceType; - } - - [CommandCmif(201)] - // SendVibrationValue(nn::hid::VibrationDeviceHandle, nn::hid::VibrationValue, nn::applet::AppletResourceUserId) - public ResultCode SendVibrationValue(ServiceCtx context) - { - VibrationDeviceHandle deviceHandle = new() - { - DeviceType = context.RequestData.ReadByte(), - PlayerId = context.RequestData.ReadByte(), - Position = context.RequestData.ReadByte(), - Reserved = context.RequestData.ReadByte(), - }; - - VibrationValue vibrationValue = new() - { - AmplitudeLow = context.RequestData.ReadSingle(), - FrequencyLow = context.RequestData.ReadSingle(), - AmplitudeHigh = context.RequestData.ReadSingle(), - FrequencyHigh = context.RequestData.ReadSingle(), - }; - -#pragma warning disable IDE0059 // Remove unnecessary value assignment - long appletResourceUserId = context.RequestData.ReadInt64(); -#pragma warning restore IDE0059 - - Dictionary dualVibrationValues = new() - { - [deviceHandle.Position] = vibrationValue, - }; - - context.Device.Hid.Npads.UpdateRumbleQueue((PlayerIndex)deviceHandle.PlayerId, dualVibrationValues); - - return ResultCode.Success; - } - - [CommandCmif(202)] - // GetActualVibrationValue(nn::hid::VibrationDeviceHandle, nn::applet::AppletResourceUserId) -> nn::hid::VibrationValue - public ResultCode GetActualVibrationValue(ServiceCtx context) - { - VibrationDeviceHandle deviceHandle = new() - { - DeviceType = context.RequestData.ReadByte(), - PlayerId = context.RequestData.ReadByte(), - Position = context.RequestData.ReadByte(), - Reserved = context.RequestData.ReadByte(), - }; - -#pragma warning disable IDE0059 // Remove unnecessary value assignment - long appletResourceUserId = context.RequestData.ReadInt64(); -#pragma warning restore IDE0059 - - VibrationValue vibrationValue = context.Device.Hid.Npads.GetLastVibrationValue((PlayerIndex)deviceHandle.PlayerId, deviceHandle.Position); - - context.ResponseData.Write(vibrationValue.AmplitudeLow); - context.ResponseData.Write(vibrationValue.FrequencyLow); - context.ResponseData.Write(vibrationValue.AmplitudeHigh); - context.ResponseData.Write(vibrationValue.FrequencyHigh); - - return ResultCode.Success; - } - [CommandCmif(203)] // CreateActiveVibrationDeviceList() -> object public ResultCode CreateActiveVibrationDeviceList(ServiceCtx context) @@ -1253,26 +383,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(204)] - // PermitVibration(bool Enable) - public ResultCode PermitVibration(ServiceCtx context) - { - _vibrationPermitted = context.RequestData.ReadBoolean(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _vibrationPermitted }); - - return ResultCode.Success; - } - - [CommandCmif(205)] - // IsVibrationPermitted() -> bool IsEnabled - public ResultCode IsVibrationPermitted(ServiceCtx context) - { - context.ResponseData.Write(_vibrationPermitted); - - return ResultCode.Success; - } - [CommandCmif(206)] // SendVibrationValues(nn::applet::AppletResourceUserId, buffer, type: 9>, buffer, type: 9>) public ResultCode SendVibrationValues(ServiceCtx context) @@ -1318,524 +428,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - [CommandCmif(207)] // 4.0.0+ - // SendVibrationGcErmCommand(nn::hid::VibrationDeviceHandle, nn::hid::VibrationGcErmCommand, nn::applet::AppletResourceUserId) - public ResultCode SendVibrationGcErmCommand(ServiceCtx context) - { - int vibrationDeviceHandle = context.RequestData.ReadInt32(); - long vibrationGcErmCommand = context.RequestData.ReadInt64(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, vibrationDeviceHandle, vibrationGcErmCommand }); - - return ResultCode.Success; - } - - [CommandCmif(208)] // 4.0.0+ - // GetActualVibrationGcErmCommand(nn::hid::VibrationDeviceHandle, nn::applet::AppletResourceUserId) -> nn::hid::VibrationGcErmCommand - public ResultCode GetActualVibrationGcErmCommand(ServiceCtx context) - { - int vibrationDeviceHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_vibrationGcErmCommand); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, vibrationDeviceHandle, _vibrationGcErmCommand }); - - return ResultCode.Success; - } - - [CommandCmif(209)] // 4.0.0+ - // BeginPermitVibrationSession(nn::applet::AppletResourceUserId) - public ResultCode BeginPermitVibrationSession(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(210)] // 4.0.0+ - // EndPermitVibrationSession() - public ResultCode EndPermitVibrationSession(ServiceCtx context) - { - Logger.Stub?.PrintStub(LogClass.ServiceHid); - - return ResultCode.Success; - } - - [CommandCmif(211)] // 7.0.0+ - // IsVibrationDeviceMounted(nn::hid::VibrationDeviceHandle, nn::applet::AppletResourceUserId) - public ResultCode IsVibrationDeviceMounted(ServiceCtx context) - { -#pragma warning disable IDE0059 // Remove unnecessary value assignment - int vibrationDeviceHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); -#pragma warning restore IDE0059 - - // NOTE: Service use vibrationDeviceHandle to get the PlayerIndex. - // And return false if (npadIdType >= (NpadIdType)8 && npadIdType != NpadIdType.Handheld && npadIdType != NpadIdType.Unknown) - - context.ResponseData.Write(true); - - return ResultCode.Success; - } - - [CommandCmif(300)] - // ActivateConsoleSixAxisSensor(nn::applet::AppletResourceUserId) - public ResultCode ActivateConsoleSixAxisSensor(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(301)] - // StartConsoleSixAxisSensor(nn::hid::ConsoleSixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode StartConsoleSixAxisSensor(ServiceCtx context) - { - int consoleSixAxisSensorHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, consoleSixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(302)] - // StopConsoleSixAxisSensor(nn::hid::ConsoleSixAxisSensorHandle, nn::applet::AppletResourceUserId) - public ResultCode StopConsoleSixAxisSensor(ServiceCtx context) - { - int consoleSixAxisSensorHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, consoleSixAxisSensorHandle }); - - return ResultCode.Success; - } - - [CommandCmif(303)] // 5.0.0+ - // ActivateSevenSixAxisSensor(nn::applet::AppletResourceUserId) - public ResultCode ActivateSevenSixAxisSensor(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(304)] // 5.0.0+ - // StartSevenSixAxisSensor(nn::applet::AppletResourceUserId) - public ResultCode StartSevenSixAxisSensor(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(305)] // 5.0.0+ - // StopSevenSixAxisSensor(nn::applet::AppletResourceUserId) - public ResultCode StopSevenSixAxisSensor(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(306)] // 5.0.0+ - // InitializeSevenSixAxisSensor(array, ulong Counter0, array, ulong Counter1, nn::applet::AppletResourceUserId) - public ResultCode InitializeSevenSixAxisSensor(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - long counter0 = context.RequestData.ReadInt64(); - long counter1 = context.RequestData.ReadInt64(); - - // TODO: Determine if array is a buffer or not... - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, counter0, counter1 }); - - return ResultCode.Success; - } - - [CommandCmif(307)] // 5.0.0+ - // FinalizeSevenSixAxisSensor(nn::applet::AppletResourceUserId) - public ResultCode FinalizeSevenSixAxisSensor(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(308)] // 5.0.0+ - // SetSevenSixAxisSensorFusionStrength(float Strength, nn::applet::AppletResourceUserId) - public ResultCode SetSevenSixAxisSensorFusionStrength(ServiceCtx context) - { - _sevenSixAxisSensorFusionStrength = context.RequestData.ReadSingle(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _sevenSixAxisSensorFusionStrength }); - - return ResultCode.Success; - } - - [CommandCmif(309)] // 5.0.0+ - // GetSevenSixAxisSensorFusionStrength(nn::applet::AppletResourceUserId) -> float Strength - public ResultCode GetSevenSixAxisSensorFusionStrength(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - context.ResponseData.Write(_sevenSixAxisSensorFusionStrength); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _sevenSixAxisSensorFusionStrength }); - - return ResultCode.Success; - } - - [CommandCmif(310)] // 6.0.0+ - // ResetSevenSixAxisSensorTimestamp(pid, nn::applet::AppletResourceUserId) - public ResultCode ResetSevenSixAxisSensorTimestamp(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(400)] - // IsUsbFullKeyControllerEnabled() -> bool IsEnabled - public ResultCode IsUsbFullKeyControllerEnabled(ServiceCtx context) - { - context.ResponseData.Write(_usbFullKeyControllerEnabled); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _usbFullKeyControllerEnabled }); - - return ResultCode.Success; - } - - [CommandCmif(401)] - // EnableUsbFullKeyController(bool Enable) - public ResultCode EnableUsbFullKeyController(ServiceCtx context) - { - _usbFullKeyControllerEnabled = context.RequestData.ReadBoolean(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _usbFullKeyControllerEnabled }); - - return ResultCode.Success; - } - - [CommandCmif(402)] - // IsUsbFullKeyControllerConnected(uint Unknown0) -> bool Connected - public ResultCode IsUsbFullKeyControllerConnected(ServiceCtx context) - { - int unknown0 = context.RequestData.ReadInt32(); - - context.ResponseData.Write(true); //FullKeyController is always connected ? - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { unknown0, Connected = true }); - - return ResultCode.Success; - } - - [CommandCmif(403)] // 4.0.0+ - // HasBattery(uint NpadId) -> bool HasBattery - public ResultCode HasBattery(ServiceCtx context) - { - int npadId = context.RequestData.ReadInt32(); - - context.ResponseData.Write(true); //Npad always got a battery ? - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, HasBattery = true }); - - return ResultCode.Success; - } - - [CommandCmif(404)] // 4.0.0+ - // HasLeftRightBattery(uint NpadId) -> bool HasLeftBattery, bool HasRightBattery - public ResultCode HasLeftRightBattery(ServiceCtx context) - { - int npadId = context.RequestData.ReadInt32(); - - context.ResponseData.Write(true); //Npad always got a left battery ? - context.ResponseData.Write(true); //Npad always got a right battery ? - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, HasLeftBattery = true, HasRightBattery = true }); - - return ResultCode.Success; - } - - [CommandCmif(405)] // 4.0.0+ - // GetNpadInterfaceType(uint NpadId) -> uchar InterfaceType - public ResultCode GetNpadInterfaceType(ServiceCtx context) - { - int npadId = context.RequestData.ReadInt32(); - - context.ResponseData.Write((byte)0); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, NpadInterfaceType = 0 }); - - return ResultCode.Success; - } - - [CommandCmif(406)] // 4.0.0+ - // GetNpadLeftRightInterfaceType(uint NpadId) -> uchar LeftInterfaceType, uchar RightInterfaceType - public ResultCode GetNpadLeftRightInterfaceType(ServiceCtx context) - { - int npadId = context.RequestData.ReadInt32(); - - context.ResponseData.Write((byte)0); - context.ResponseData.Write((byte)0); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, LeftInterfaceType = 0, RightInterfaceType = 0 }); - - return ResultCode.Success; - } - - [CommandCmif(500)] // 5.0.0+ - // GetPalmaConnectionHandle(uint Unknown0, nn::applet::AppletResourceUserId) -> nn::hid::PalmaConnectionHandle - public ResultCode GetPalmaConnectionHandle(ServiceCtx context) - { - int unknown0 = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - int palmaConnectionHandle = 0; - - context.ResponseData.Write(palmaConnectionHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknown0, palmaConnectionHandle }); - - return ResultCode.Success; - } - - [CommandCmif(501)] // 5.0.0+ - // InitializePalma(nn::hid::PalmaConnectionHandle) - public ResultCode InitializePalma(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); - - _palmaOperationCompleteEvent.ReadableEvent.Signal(); - - return ResultCode.Success; - } - - [CommandCmif(502)] // 5.0.0+ - // AcquirePalmaOperationCompleteEvent(nn::hid::PalmaConnectionHandle) -> nn::sf::NativeHandle - public ResultCode AcquirePalmaOperationCompleteEvent(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - if (context.Process.HandleTable.GenerateHandle(_palmaOperationCompleteEvent.ReadableEvent, out int handle) != Result.Success) - { - throw new InvalidOperationException("Out of handles!"); - } - - context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); - - return ResultCode.Success; - } - - [CommandCmif(503)] // 5.0.0+ - // GetPalmaOperationInfo(nn::hid::PalmaConnectionHandle) -> long Unknown0, buffer - public ResultCode GetPalmaOperationInfo(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - long unknown0 = 0; //Counter? - - context.ResponseData.Write(unknown0); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown0 }); - - return ResultCode.Success; - } - - [CommandCmif(504)] // 5.0.0+ - // PlayPalmaActivity(nn::hid::PalmaConnectionHandle, ulong Unknown0) - public ResultCode PlayPalmaActivity(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - long unknown0 = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown0 }); - - _palmaOperationCompleteEvent.ReadableEvent.Signal(); - - return ResultCode.Success; - } - - [CommandCmif(505)] // 5.0.0+ - // SetPalmaFrModeType(nn::hid::PalmaConnectionHandle, ulong FrModeType) - public ResultCode SetPalmaFrModeType(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - long frModeType = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, frModeType }); - - _palmaOperationCompleteEvent.ReadableEvent.Signal(); - - return ResultCode.Success; - } - - [CommandCmif(506)] // 5.0.0+ - // ReadPalmaStep(nn::hid::PalmaConnectionHandle) - public ResultCode ReadPalmaStep(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); - - return ResultCode.Success; - } - - [CommandCmif(507)] // 5.0.0+ - // EnablePalmaStep(nn::hid::PalmaConnectionHandle, bool Enable) - public ResultCode EnablePalmaStep(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - bool enabledPalmaStep = context.RequestData.ReadBoolean(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, enabledPalmaStep }); - - _palmaOperationCompleteEvent.ReadableEvent.Signal(); - - return ResultCode.Success; - } - - [CommandCmif(508)] // 5.0.0+ - // ResetPalmaStep(nn::hid::PalmaConnectionHandle) - public ResultCode ResetPalmaStep(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); - - _palmaOperationCompleteEvent.ReadableEvent.Signal(); - - return ResultCode.Success; - } - - [CommandCmif(509)] // 5.0.0+ - // ReadPalmaApplicationSection(nn::hid::PalmaConnectionHandle, ulong Unknown0, ulong Unknown1) - public ResultCode ReadPalmaApplicationSection(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - long unknown0 = context.RequestData.ReadInt64(); - long unknown1 = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown0, unknown1 }); - - return ResultCode.Success; - } - - [CommandCmif(510)] // 5.0.0+ - // WritePalmaApplicationSection(nn::hid::PalmaConnectionHandle, ulong Unknown0, ulong Unknown1, nn::hid::PalmaApplicationSectionAccessBuffer) - public ResultCode WritePalmaApplicationSection(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - long unknown0 = context.RequestData.ReadInt64(); - long unknown1 = context.RequestData.ReadInt64(); - // nn::hid::PalmaApplicationSectionAccessBuffer cast is unknown - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown0, unknown1 }); - - _palmaOperationCompleteEvent.ReadableEvent.Signal(); - - return ResultCode.Success; - } - - [CommandCmif(511)] // 5.0.0+ - // ReadPalmaUniqueCode(nn::hid::PalmaConnectionHandle) - public ResultCode ReadPalmaUniqueCode(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); - - return ResultCode.Success; - } - - [CommandCmif(512)] // 5.0.0+ - // SetPalmaUniqueCodeInvalid(nn::hid::PalmaConnectionHandle) - public ResultCode SetPalmaUniqueCodeInvalid(ServiceCtx context) - { - int palmaConnectionHandle = context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); - - return ResultCode.Success; - } - - [CommandCmif(522)] // 5.1.0+ - // SetIsPalmaAllConnectable(nn::applet::AppletResourceUserId, bool, pid) - public ResultCode SetIsPalmaAllConnectable(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - long unknownBool = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknownBool }); - - return ResultCode.Success; - } - - [CommandCmif(525)] // 5.1.0+ - // SetPalmaBoostMode(bool) - public ResultCode SetPalmaBoostMode(ServiceCtx context) - { - // NOTE: Stubbed in system module. - - return ResultCode.Success; - } - - [CommandCmif(1000)] - // SetNpadCommunicationMode(long CommunicationMode, nn::applet::AppletResourceUserId) - public ResultCode SetNpadCommunicationMode(ServiceCtx context) - { - _npadCommunicationMode = context.RequestData.ReadInt64(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadCommunicationMode }); - - return ResultCode.Success; - } - - [CommandCmif(1001)] - // GetNpadCommunicationMode() -> long CommunicationMode - public ResultCode GetNpadCommunicationMode(ServiceCtx context) - { - context.ResponseData.Write(_npadCommunicationMode); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _npadCommunicationMode }); - - return ResultCode.Success; - } - - [CommandCmif(1002)] // 9.0.0+ - // SetTouchScreenConfiguration(nn::hid::TouchScreenConfigurationForNx, nn::applet::AppletResourceUserId) - public ResultCode SetTouchScreenConfiguration(ServiceCtx context) - { - long touchScreenConfigurationForNx = context.RequestData.ReadInt64(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, touchScreenConfigurationForNx }); - - return ResultCode.Success; - } - [CommandCmif(1004)] // 17.0.0+ // SetTouchScreenResolution(int width, int height, nn::applet::AppletResourceUserId) public ResultCode SetTouchScreenResolution(ServiceCtx context) diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidSystemServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidSystemServer.cs index 0b4eba9486..98a9d022cd 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidSystemServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidSystemServer.cs @@ -1,6 +1,6 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Hid.HidServer; -using Ryujinx.HLE.HOS.Services.Hid.Types; +using Ryujinx.Horizon.Sdk.Hid.Npad; namespace Ryujinx.HLE.HOS.Services.Hid { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs index d6531cc185..936e3c40ae 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs @@ -1,5 +1,6 @@ using Ryujinx.Common; using Ryujinx.Common.Logging; +using Ryujinx.Horizon.Sdk.Hid.Npad; namespace Ryujinx.HLE.HOS.Services.Hid { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs deleted file mode 100644 index a13e77e723..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs +++ /dev/null @@ -1,240 +0,0 @@ -using Ryujinx.Common; -using Ryujinx.Common.Logging; -using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Services.Hid.HidServer; -using Ryujinx.HLE.HOS.Services.Hid.Irs.Types; -using Ryujinx.Horizon.Common; -using System; - -namespace Ryujinx.HLE.HOS.Services.Hid.Irs -{ - [Service("irs")] - class IIrSensorServer : IpcService - { - private int _irsensorSharedMemoryHandle = 0; - - public IIrSensorServer(ServiceCtx context) { } - - [CommandCmif(302)] - // ActivateIrsensor(nn::applet::AppletResourceUserId, pid) - public ResultCode ActivateIrsensor(ServiceCtx context) - { - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - - // NOTE: This seems to initialize the shared memory for irs service. - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(303)] - // DeactivateIrsensor(nn::applet::AppletResourceUserId, pid) - public ResultCode DeactivateIrsensor(ServiceCtx context) - { - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - - // NOTE: This seems to deinitialize the shared memory for irs service. - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId }); - - return ResultCode.Success; - } - - [CommandCmif(304)] - // GetIrsensorSharedMemoryHandle(nn::applet::AppletResourceUserId, pid) -> handle - public ResultCode GetIrsensorSharedMemoryHandle(ServiceCtx context) - { - // NOTE: Shared memory should use the appletResourceUserId. - // ulong appletResourceUserId = context.RequestData.ReadUInt64(); - - if (_irsensorSharedMemoryHandle == 0) - { - if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _irsensorSharedMemoryHandle) != Result.Success) - { - throw new InvalidOperationException("Out of handles!"); - } - } - - context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_irsensorSharedMemoryHandle); - - return ResultCode.Success; - } - - [CommandCmif(305)] - // StopImageProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId) - public ResultCode StopImageProcessor(ServiceCtx context) - { - IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - - CheckCameraHandle(irCameraHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); - - return ResultCode.Success; - } - - [CommandCmif(306)] - // RunMomentProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedMomentProcessorConfig) - public ResultCode RunMomentProcessor(ServiceCtx context) - { - IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedMomentProcessorConfig = context.RequestData.ReadStruct(); - - CheckCameraHandle(irCameraHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedMomentProcessorConfig.ExposureTime }); - - return ResultCode.Success; - } - - [CommandCmif(307)] - // RunClusteringProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedClusteringProcessorConfig) - public ResultCode RunClusteringProcessor(ServiceCtx context) - { - IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedClusteringProcessorConfig = context.RequestData.ReadStruct(); - - CheckCameraHandle(irCameraHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedClusteringProcessorConfig.ExposureTime }); - - return ResultCode.Success; - } - - [CommandCmif(308)] - // RunImageTransferProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedImageTransferProcessorConfig, u64 TransferMemorySize, TransferMemoryHandle) - public ResultCode RunImageTransferProcessor(ServiceCtx context) - { - IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedImageTransferProcessorConfig = context.RequestData.ReadStruct(); - - CheckCameraHandle(irCameraHandle); - - // TODO: Handle the Transfer Memory. - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedImageTransferProcessorConfig.ExposureTime }); - - return ResultCode.Success; - } - - [CommandCmif(309)] - // GetImageTransferProcessorState(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId) - public ResultCode GetImageTransferProcessorState(ServiceCtx context) - { - IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - - // ulong imageTransferBufferAddress = context.Request.ReceiveBuff[0].Position; - ulong imageTransferBufferSize = context.Request.ReceiveBuff[0].Size; - - if (imageTransferBufferSize == 0) - { - return ResultCode.InvalidBufferSize; - } - - CheckCameraHandle(irCameraHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); - - // TODO: Uses the buffer to copy the JoyCon IR data (by using a JoyCon driver) and update the following struct. - context.ResponseData.WriteStruct(new ImageTransferProcessorState() - { - SamplingNumber = 0, - AmbientNoiseLevel = 0, - }); - - return ResultCode.Success; - } - - [CommandCmif(310)] - // RunTeraPluginProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedTeraPluginProcessorConfig) - public ResultCode RunTeraPluginProcessor(ServiceCtx context) - { - IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); - ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedTeraPluginProcessorConfig = context.RequestData.ReadStruct(); - - CheckCameraHandle(irCameraHandle); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedTeraPluginProcessorConfig.RequiredMcuVersion }); - - return ResultCode.Success; - } - - [CommandCmif(311)] - // GetNpadIrCameraHandle(u32) -> nn::irsensor::IrCameraHandle - public ResultCode GetNpadIrCameraHandle(ServiceCtx context) - { - NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadUInt32(); - - if (npadIdType > NpadIdType.Player8 && - npadIdType != NpadIdType.Unknown && - npadIdType != NpadIdType.Handheld) - { - return ResultCode.NpadIdOutOfRange; - } - - PlayerIndex irCameraHandle = HidUtils.GetIndexFromNpadIdType(npadIdType); - - context.ResponseData.Write((int)irCameraHandle); - - // NOTE: If the irCameraHandle pointer is null this error is returned, Doesn't occur in our case. - // return ResultCode.HandlePointerIsNull; - - return ResultCode.Success; - } - - [CommandCmif(314)] // 3.0.0+ - // CheckFirmwareVersion(nn::irsensor::IrCameraHandle, nn::irsensor::PackedMcuVersion, nn::applet::AppletResourceUserId, pid) - public ResultCode CheckFirmwareVersion(ServiceCtx context) - { - int irCameraHandle = context.RequestData.ReadInt32(); - short packedMcuVersionMajor = context.RequestData.ReadInt16(); - short packedMcuVersionMinor = context.RequestData.ReadInt16(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle, packedMcuVersionMajor, packedMcuVersionMinor }); - - return ResultCode.Success; - } - - [CommandCmif(318)] // 4.0.0+ - // StopImageProcessorAsync(nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, pid) - public ResultCode StopImageProcessorAsync(ServiceCtx context) - { - int irCameraHandle = context.RequestData.ReadInt32(); - long appletResourceUserId = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle }); - - return ResultCode.Success; - } - - [CommandCmif(319)] // 4.0.0+ - // ActivateIrsensorWithFunctionLevel(nn::applet::AppletResourceUserId, nn::irsensor::PackedFunctionLevel, pid) - public ResultCode ActivateIrsensorWithFunctionLevel(ServiceCtx context) - { - long appletResourceUserId = context.RequestData.ReadInt64(); - long packedFunctionLevel = context.RequestData.ReadInt64(); - - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, packedFunctionLevel }); - - return ResultCode.Success; - } - - private ResultCode CheckCameraHandle(IrCameraHandle irCameraHandle) - { - if (irCameraHandle.DeviceType == 1 || (PlayerIndex)irCameraHandle.PlayerNumber >= PlayerIndex.Unknown) - { - return ResultCode.InvalidCameraHandle; - } - - return ResultCode.Success; - } - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorSystemServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorSystemServer.cs deleted file mode 100644 index 5046268cbb..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorSystemServer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Irs -{ - [Service("irs:sys")] - class IIrSensorSystemServer : IpcService - { - public IIrSensorSystemServer(ServiceCtx context) { } - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/ResultCode.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Irs/ResultCode.cs deleted file mode 100644 index 8cee32cdf6..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/ResultCode.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Irs -{ - public enum ResultCode - { - ModuleId = 205, - ErrorCodeShift = 9, - - Success = 0, - - InvalidCameraHandle = (204 << ErrorCodeShift) | ModuleId, - InvalidBufferSize = (207 << ErrorCodeShift) | ModuleId, - HandlePointerIsNull = (212 << ErrorCodeShift) | ModuleId, - NpadIdOutOfRange = (709 << ErrorCodeShift) | ModuleId, - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/ControllerType.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/ControllerType.cs deleted file mode 100644 index 1f5da31734..0000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/ControllerType.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace Ryujinx.HLE.HOS.Services.Hid -{ - [Flags] - public enum ControllerType - { - None, - ProController = 1 << 0, - Handheld = 1 << 1, - JoyconPair = 1 << 2, - JoyconLeft = 1 << 3, - JoyconRight = 1 << 4, - Invalid = 1 << 5, - Pokeball = 1 << 6, - SystemExternal = 1 << 29, - System = 1 << 30, - } -} diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs index 20f67a4ef3..4cec5c56f1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs @@ -7,6 +7,7 @@ using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager; using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Hid.Npad; using System; using System.Buffers.Binary; using System.Globalization; diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDevice.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDevice.cs index 3320238a85..f501d414d3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDevice.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/NfpDevice.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.Horizon.Sdk.Hid.Npad; namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager { diff --git a/src/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs b/src/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs index 8171d21771..74428a111c 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.HOS.Tamper.Operations; +using Ryujinx.Horizon.Sdk.Hid.Npad; namespace Ryujinx.HLE.HOS.Tamper { diff --git a/src/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs b/src/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs index 8458d95d66..65c3d77970 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.Horizon.Sdk.Hid.Npad; namespace Ryujinx.HLE.HOS.Tamper { diff --git a/src/Ryujinx.HLE/HOS/TamperMachine.cs b/src/Ryujinx.HLE/HOS/TamperMachine.cs index 609221535d..cf128c6e01 100644 --- a/src/Ryujinx.HLE/HOS/TamperMachine.cs +++ b/src/Ryujinx.HLE/HOS/TamperMachine.cs @@ -3,6 +3,8 @@ using Ryujinx.HLE.HOS.Kernel; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.HOS.Tamper; +using Ryujinx.Horizon.Sdk.Hid; +using Ryujinx.Horizon.Sdk.Hid.Npad; using System; using System.Collections.Concurrent; using System.Collections.Generic; diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index 9dfc698923..9c1f644f1c 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -5,9 +5,9 @@ using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Apm; -using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.Loaders.Processes; using Ryujinx.HLE.UI; +using Ryujinx.Horizon.Sdk.Hid; using Ryujinx.Memory; using System; @@ -23,7 +23,6 @@ namespace Ryujinx.HLE public HOS.Horizon System { get; } public ProcessLoader Processes { get; } public PerformanceStatistics Statistics { get; } - public Hid Hid { get; } public TamperMachine TamperMachine { get; } public IHostUIHandler UIHandler { get; } @@ -51,7 +50,6 @@ namespace Ryujinx.HLE Gpu = new GpuContext(Configuration.GpuRenderer); System = new HOS.Horizon(this); Statistics = new PerformanceStatistics(); - Hid = new Hid(this, System.HidStorage); Processes = new ProcessLoader(this); TamperMachine = new TamperMachine(); diff --git a/src/Ryujinx.HLE/UI/Input/NpadButtonHandler.cs b/src/Ryujinx.HLE/UI/Input/NpadButtonHandler.cs index 73c306614b..62a1997a76 100644 --- a/src/Ryujinx.HLE/UI/Input/NpadButtonHandler.cs +++ b/src/Ryujinx.HLE/UI/Input/NpadButtonHandler.cs @@ -1,5 +1,3 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; - namespace Ryujinx.HLE.UI.Input { delegate void NpadButtonHandler(int npadIndex, NpadButton button); diff --git a/src/Ryujinx.HLE/UI/Input/NpadReader.cs b/src/Ryujinx.HLE/UI/Input/NpadReader.cs index 8276d6160f..5b501ed31c 100644 --- a/src/Ryujinx.HLE/UI/Input/NpadReader.cs +++ b/src/Ryujinx.HLE/UI/Input/NpadReader.cs @@ -1,6 +1,3 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; - namespace Ryujinx.HLE.UI.Input { /// diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx.Headless.SDL2/WindowBase.cs index 8768913f5a..1739d01b53 100644 --- a/src/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/src/Ryujinx.Headless.SDL2/WindowBase.cs @@ -8,6 +8,7 @@ using Ryujinx.Graphics.OpenGL; using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.UI; +using Ryujinx.Horizon; using Ryujinx.Input; using Ryujinx.Input.HLE; using Ryujinx.SDL2.Common; @@ -125,7 +126,6 @@ namespace Ryujinx.Headless.SDL2 Renderer = renderer; NpadManager.Initialize(device, inputConfigs, enableKeyboard, enableMouse); - TouchScreenManager.Initialize(device); } private void SetWindowIcon() @@ -423,7 +423,7 @@ namespace Ryujinx.Headless.SDL2 TouchScreenManager.Update(false); } - Device.Hid.DebugPad.Update(); + HorizonStatic.Hid.DebugPad.Update(); // TODO: Replace this with MouseDriver.CheckIdle() when mouse motion events are received on every supported platform. MouseDriver.UpdatePosition(); diff --git a/src/Ryujinx.Horizon/Hid/HidIpcServer.cs b/src/Ryujinx.Horizon/Hid/HidIpcServer.cs new file mode 100644 index 0000000000..b262002292 --- /dev/null +++ b/src/Ryujinx.Horizon/Hid/HidIpcServer.cs @@ -0,0 +1,47 @@ +using Ryujinx.Horizon.Sdk.Sf.Hipc; +using Ryujinx.Horizon.Sdk.Sm; + +namespace Ryujinx.Horizon.Hid +{ + class HidIpcServer + { + // TODO: RE These values + private const int MaxSessionsCount = 30; + + private const int PointerBufferSize = 0xB40; + private const int MaxDomains = 0; + private const int MaxDomainObjects = 0; + private const int MaxPortsCount = 1; + + private static readonly ManagerOptions _options = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + + private SmApi _sm; + private ServerManager _serverManager; + + public void Initialize() + { + HeapAllocator allocator = new(); + + _sm = new SmApi(); + _sm.Initialize().AbortOnFailure(); + + _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _options, MaxSessionsCount); + + _serverManager.RegisterObjectForServer(new HidServer(), ServiceName.Encode("hid"), MaxSessionsCount); + // _serverManager.RegisterObjectForServer(, ServiceName.Encode("hidbus"), MaxSessionsCount); + // _serverManager.RegisterObjectForServer(, ServiceName.Encode("hid:sys"), MaxSessionsCount); + // _serverManager.RegisterObjectForServer(, ServiceName.Encode("hid:dbg"), MaxSessionsCount); + } + + public void ServiceRequests() + { + _serverManager.ServiceRequests(); + } + + public void Shutdown() + { + _serverManager.Dispose(); + _sm.Dispose(); + } + } +} diff --git a/src/Ryujinx.Horizon/Hid/HidMain.cs b/src/Ryujinx.Horizon/Hid/HidMain.cs new file mode 100644 index 0000000000..42fe0523b8 --- /dev/null +++ b/src/Ryujinx.Horizon/Hid/HidMain.cs @@ -0,0 +1,17 @@ +namespace Ryujinx.Horizon.Hid +{ + class HidMain : IService + { + public static void Main(ServiceTable serviceTable) + { + HidIpcServer ipcServer = new(); + + ipcServer.Initialize(); + + serviceTable.SignalServiceReady(); + + ipcServer.ServiceRequests(); + ipcServer.Shutdown(); + } + } +} diff --git a/src/Ryujinx.Horizon/Hid/HidResult.cs b/src/Ryujinx.Horizon/Hid/HidResult.cs new file mode 100644 index 0000000000..57a2ee6b5d --- /dev/null +++ b/src/Ryujinx.Horizon/Hid/HidResult.cs @@ -0,0 +1,14 @@ +using Ryujinx.Horizon.Common; + +namespace Ryujinx.Horizon.Hid +{ + class HidResult + { + private const int ModuleId = 202; + + public static Result InvalidNpadDeviceType => new Result(ModuleId, 122); + public static Result InvalidNpadIdType => new Result(ModuleId, 123); + public static Result InvalidDeviceIndex => new Result(ModuleId, 124); + public static Result InvalidBufferSize => new Result(ModuleId, 131); + } +} diff --git a/src/Ryujinx.Horizon/Hid/HidServer.cs b/src/Ryujinx.Horizon/Hid/HidServer.cs new file mode 100644 index 0000000000..1c3818a018 --- /dev/null +++ b/src/Ryujinx.Horizon/Hid/HidServer.cs @@ -0,0 +1,1440 @@ +using Ryujinx.Common.Logging; +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Hid; +using Ryujinx.Horizon.Sdk.Hid.HidDevices; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Hid.SixAxis; +using Ryujinx.Horizon.Sdk.Hid.Vibration; +using Ryujinx.Horizon.Sdk.OsTypes; +using Ryujinx.Horizon.Sdk.Sf; +using Ryujinx.Horizon.Sdk.Sf.Hipc; +using System; +using System.Collections.Generic; + +namespace Ryujinx.Horizon.Hid +{ + partial class HidServer : IHidServer + { + private SystemEventType _xpadIdEvent; + private SystemEventType _palmaOperationCompleteEvent; + + private bool _sixAxisSensorFusionEnabled; + private bool _unintendedHomeButtonInputProtectionEnabled; + private bool _npadAnalogStickCenterClampEnabled; + private bool _vibrationPermitted; + private bool _usbFullKeyControllerEnabled; + private readonly bool _isFirmwareUpdateAvailableForSixAxisSensor; + private bool _isSixAxisSensorUnalteredPassthroughEnabled; + + private NpadHandheldActivationMode _npadHandheldActivationMode; + private GyroscopeZeroDriftMode _gyroscopeZeroDriftMode; + + private long _npadCommunicationMode; + private uint _accelerometerPlayMode; + private readonly VibrationGcErmCommand _vibrationGcErmCommand; + private float _sevenSixAxisSensorFusionStrength; + + private SensorFusionParameters _sensorFusionParams; + private AccelerometerParameters _accelerometerParams; + + public HidServer() + { + Os.CreateSystemEvent(out _xpadIdEvent, EventClearMode.ManualClear, interProcess: true); + Os.SignalSystemEvent(ref _xpadIdEvent); // TODO: signal event at right place + + Os.CreateSystemEvent(out _palmaOperationCompleteEvent, EventClearMode.ManualClear, interProcess: true); + + _npadHandheldActivationMode = NpadHandheldActivationMode.Dual; + _gyroscopeZeroDriftMode = GyroscopeZeroDriftMode.Standard; + + _isFirmwareUpdateAvailableForSixAxisSensor = false; + + _sensorFusionParams = new SensorFusionParameters(); + _accelerometerParams = new AccelerometerParameters(); + + _vibrationPermitted = true; + } + + [CmifCommand(0)] + public Result CreateAppletResource(out IAppletResource arg0, AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(1)] + public Result ActivateDebugPad(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + // Initialize entries to avoid issues with some games. + + for (int i = 0; i < HorizonStatic.Hid.SharedMemEntryCount; i++) + { + HorizonStatic.Hid.DebugPad.Update(); + } + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(11)] + public Result ActivateTouchScreen(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + HorizonStatic.Hid.Touchscreen.Active = true; + + // Initialize entries to avoid issues with some games. + + for (int i = 0; i < HorizonStatic.Hid.SharedMemEntryCount; i++) + { + HorizonStatic.Hid.Touchscreen.Update(); + } + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(21)] + public Result ActivateMouse(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + HorizonStatic.Hid.Mouse.Active = true; + + // Initialize entries to avoid issues with some games. + + for (int i = 0; i < HorizonStatic.Hid.SharedMemEntryCount; i++) + { + HorizonStatic.Hid.Mouse.Update(0, 0); + } + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(31)] + public Result ActivateKeyboard(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + HorizonStatic.Hid.Keyboard.Active = true; + + // Initialize entries to avoid issues with some games. + + KeyboardInput emptyInput = new() + { + Keys = new ulong[4], + }; + + for (int i = 0; i < HorizonStatic.Hid.SharedMemEntryCount; i++) + { + HorizonStatic.Hid.Keyboard.Update(emptyInput); + } + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(32)] + public Result SendKeyboardLockKeyEvent(AppletResourceUserId appletResourceUserId, KeyboardLockKeyEvent keyboardLockKeyEvent, [ClientProcessId] ulong pid) + { + // NOTE: This signals the keyboard driver about lock events. + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { keyboardLockKeyEvent }); + + return Result.Success; + } + + [CmifCommand(40)] + public Result AcquireXpadIdEventHandle([CopyHandle] out int handle, ulong xpadId) + { + handle = Os.GetReadableHandleOfSystemEvent(ref _xpadIdEvent); + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { xpadId }); + + return Result.Success; + } + + [CmifCommand(41)] + public Result ReleaseXpadIdEventHandle(ulong xpadId) + { + Os.DetachReadableHandleOfSystemEvent(ref _xpadIdEvent); + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { xpadId }); + + return Result.Success; + } + + [CmifCommand(51)] + public Result ActivateXpad(AppletResourceUserId appletResourceUserId, uint basicXpadId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, basicXpadId }); + + return Result.Success; + } + + [CmifCommand(55)] + public Result GetXpadIds(out long idCount, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer)] Span basicXpadIds) + { + // There aren't any Xpads, so we return 0 and write nothing inside the buffer. + idCount = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(56)] + public Result ActivateJoyXpad(uint joyXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); + + return Result.Success; + } + + [CmifCommand(58)] + public Result GetJoyXpadLifoHandle([CopyHandle] out int arg0, uint joyXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); + + return Result.Success; + } + + [CmifCommand(59)] + public Result GetJoyXpadIds(out long idCount, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer)] Span joyXpadIds) + { + // There aren't any JoyXpad, so we return 0 and write nothing inside the buffer. + idCount = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(60)] + public Result ActivateSixAxisSensor(uint basicXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { basicXpadId }); + + return Result.Success; + } + + [CmifCommand(61)] + public Result DeactivateSixAxisSensor(uint basicXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { basicXpadId }); + + return Result.Success; + } + + [CmifCommand(62)] + public Result GetSixAxisSensorLifoHandle([CopyHandle] out int arg0, uint basicXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { basicXpadId }); + + return Result.Success; + } + + [CmifCommand(63)] + public Result ActivateJoySixAxisSensor(uint joyXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); + + return Result.Success; + } + + [CmifCommand(64)] + public Result DeactivateJoySixAxisSensor(uint joyXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); + + return Result.Success; + } + + [CmifCommand(65)] + public Result GetJoySixAxisSensorLifoHandle([CopyHandle] out int arg0, uint joyXpadId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { joyXpadId }); + + return Result.Success; + } + + [CmifCommand(66)] + public Result StartSixAxisSensor(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(67)] + public Result StopSixAxisSensor(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(68)] + public Result IsSixAxisSensorFusionEnabled(out bool sixAxisSensorFusionEnabled, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + sixAxisSensorFusionEnabled = _sixAxisSensorFusionEnabled; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sixAxisSensorFusionEnabled }); + + return Result.Success; + } + + [CmifCommand(69)] + public Result EnableSixAxisSensorFusion(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, bool sixAxisSensorFusionEnabled, [ClientProcessId] ulong pid) + { + _sixAxisSensorFusionEnabled = sixAxisSensorFusionEnabled; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sixAxisSensorFusionEnabled }); + + return Result.Success; + } + + [CmifCommand(70)] + public Result SetSixAxisSensorFusionParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, float revisePower, float reviseRange, [ClientProcessId] ulong pid) + { + _sensorFusionParams = new SensorFusionParameters + { + RevisePower = revisePower, + ReviseRange = reviseRange + }; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sensorFusionParams.RevisePower, _sensorFusionParams.ReviseRange }); + + return Result.Success; + } + + [CmifCommand(71)] + public Result GetSixAxisSensorFusionParameters(out float revisePower, out float reviseRange, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + revisePower = _sensorFusionParams.RevisePower; + reviseRange = _sensorFusionParams.ReviseRange; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sensorFusionParams.RevisePower, _sensorFusionParams.ReviseRange }); + + return Result.Success; + } + + [CmifCommand(72)] + public Result ResetSixAxisSensorFusionParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + _sensorFusionParams.RevisePower = 0; + _sensorFusionParams.ReviseRange = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _sensorFusionParams.RevisePower, _sensorFusionParams.ReviseRange }); + + return Result.Success; + } + + [CmifCommand(73)] + public Result SetAccelerometerParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, float x, float y, [ClientProcessId] ulong pid) + { + _accelerometerParams = new AccelerometerParameters + { + X = x, + Y = y, + }; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerParams.X, _accelerometerParams.Y }); + + return Result.Success; + } + + [CmifCommand(74)] + public Result GetAccelerometerParameters(out float x, out float y, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + x = _accelerometerParams.X; + y = _accelerometerParams.Y; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerParams.X, _accelerometerParams.Y }); + + return Result.Success; + } + + [CmifCommand(75)] + public Result ResetAccelerometerParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + _accelerometerParams.X = 0; + _accelerometerParams.Y = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerParams.X, _accelerometerParams.Y }); + + return Result.Success; + } + + [CmifCommand(76)] + public Result SetAccelerometerPlayMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, uint accelerometerPlayMode, [ClientProcessId] ulong pid) + { + _accelerometerPlayMode = accelerometerPlayMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerPlayMode }); + + return Result.Success; + } + + [CmifCommand(77)] + public Result GetAccelerometerPlayMode(out uint accelerometerPlayMode, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + accelerometerPlayMode = _accelerometerPlayMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerPlayMode }); + + return Result.Success; + } + + [CmifCommand(78)] + public Result ResetAccelerometerPlayMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + _accelerometerPlayMode = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _accelerometerPlayMode }); + + return Result.Success; + } + + [CmifCommand(79)] + public Result SetGyroscopeZeroDriftMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, GyroscopeZeroDriftMode gyroscopeZeroDriftMode, [ClientProcessId] ulong pid) + { + _gyroscopeZeroDriftMode = gyroscopeZeroDriftMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _gyroscopeZeroDriftMode }); + + return Result.Success; + } + + [CmifCommand(80)] + public Result GetGyroscopeZeroDriftMode(out GyroscopeZeroDriftMode gyroscopeZeroDriftMode, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + gyroscopeZeroDriftMode = _gyroscopeZeroDriftMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _gyroscopeZeroDriftMode }); + + return Result.Success; + } + + [CmifCommand(81)] + public Result ResetGyroscopeZeroDriftMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + _gyroscopeZeroDriftMode = GyroscopeZeroDriftMode.Standard; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _gyroscopeZeroDriftMode }); + + return Result.Success; + } + + [CmifCommand(82)] + public Result IsSixAxisSensorAtRest(out bool isAtRest, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + isAtRest = true; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, isAtRest }); + + return Result.Success; + } + + [CmifCommand(83)] + public Result IsFirmwareUpdateAvailableForSixAxisSensor(out bool isFirmwareUpdateAvailableForSixAxisSensor, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + isFirmwareUpdateAvailableForSixAxisSensor = _isFirmwareUpdateAvailableForSixAxisSensor; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _isFirmwareUpdateAvailableForSixAxisSensor }); + + return Result.Success; + } + + [CmifCommand(84)] + public Result EnableSixAxisSensorUnalteredPassthrough(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, bool sixAxisSensorUnalteredPassthrough, [ClientProcessId] ulong pid) + { + _isSixAxisSensorUnalteredPassthroughEnabled = sixAxisSensorUnalteredPassthrough; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _isSixAxisSensorUnalteredPassthroughEnabled }); + + return Result.Success; + } + + [CmifCommand(85)] + public Result IsSixAxisSensorUnalteredPassthroughEnabled(out bool sixAxisSensorUnalteredPassthrough, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + sixAxisSensorUnalteredPassthrough = _isSixAxisSensorUnalteredPassthroughEnabled; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(86)] + public Result StoreSixAxisSensorCalibrationParameter(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias, 0x744)] in SixAxisSensorCalibrationParameter sixAxisSensorCalibrationParameter, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { sixAxisSensorHandle, sixAxisSensorCalibrationParameter }); + + return Result.Success; + } + + [CmifCommand(87)] + public Result LoadSixAxisSensorCalibrationParameter(AppletResourceUserId appletResourceUserId, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias, 0x744)] out SixAxisSensorCalibrationParameter sixAxisSensorCalibrationParameter, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + // TODO: CalibrationParameter have to be determined. + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(88)] + public Result GetSixAxisSensorIcInformation(AppletResourceUserId appletResourceUserId, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0xC8)] out SixAxisSensorIcInformation sixAxisSensorIcInformation, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + // TODO: IcInformation have to be determined. + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(89)] + public Result ResetIsSixAxisSensorDeviceNewlyAssigned(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(91)] + public Result ActivateGesture(AppletResourceUserId appletResourceUserId, int unknown, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknown }); + + return Result.Success; + } + + [CmifCommand(100)] + public Result SetSupportedNpadStyleSet(AppletResourceUserId appletResourceUserId, NpadStyleTag supportedStyleSets, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { pid, appletResourceUserId, supportedStyleSets }); + + HorizonStatic.Hid.Npads.SupportedStyleSets = supportedStyleSets; + + return Result.Success; + } + + [CmifCommand(101)] + public Result GetSupportedNpadStyleSet(AppletResourceUserId appletResourceUserId, out NpadStyleTag supportedStyleSets, [ClientProcessId] ulong pid) + { + supportedStyleSets = HorizonStatic.Hid.Npads.SupportedStyleSets; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, HorizonStatic.Hid.Npads.SupportedStyleSets }); + + return Result.Success; + } + + [CmifCommand(102)] + public Result SetSupportedNpadIdType(AppletResourceUserId appletResourceUserId, [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan npadIds, [ClientProcessId] ulong pid) + { + HorizonStatic.Hid.Npads.ClearSupportedPlayers(); + + for (int i = 0; i < npadIds.Length; i++) + { + if (IsValidNpadIdType(npadIds[i])) + { + HorizonStatic.Hid.Npads.SetSupportedPlayer(GetIndexFromNpadIdType(npadIds[i])); + } + } + + Logger.Stub?.PrintStub(LogClass.ServiceHid, $"{npadIds.Length} Players: " + string.Join(",", npadIds.ToArray())); + + return Result.Success; + } + + [CmifCommand(103)] + public Result ActivateNpad(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(104)] + public Result DeactivateNpad(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + HorizonStatic.Hid.Npads.Active = false; + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(106)] + public Result AcquireNpadStyleSetUpdateEventHandle(AppletResourceUserId appletResourceUserId, [CopyHandle] out int arg1, uint arg2, ulong arg3, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(107)] + public Result DisconnectNpad(AppletResourceUserId appletResourceUserId, NpadIdType npadIdType, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, npadIdType }); + + return Result.Success; + } + + [CmifCommand(108)] + public Result GetPlayerLedPattern(out ulong ledPattern, NpadIdType npadId) + { + ledPattern = npadId switch + { + NpadIdType.Player1 => 0b0001, + NpadIdType.Player2 => 0b0011, + NpadIdType.Player3 => 0b0111, + NpadIdType.Player4 => 0b1111, + NpadIdType.Player5 => 0b1001, + NpadIdType.Player6 => 0b0101, + NpadIdType.Player7 => 0b1101, + NpadIdType.Player8 => 0b0110, + NpadIdType.Unknown => 0b0000, + NpadIdType.Handheld => 0b0000, + _ => throw new InvalidOperationException($"{nameof(npadId)} contains an invalid value: {npadId}"), + }; + + return Result.Success; + } + + [CmifCommand(109)] + public Result ActivateNpadWithRevision(AppletResourceUserId appletResourceUserId, int arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(120)] + public Result SetNpadJoyHoldType(AppletResourceUserId appletResourceUserId, long arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(121)] + public Result GetNpadJoyHoldType(AppletResourceUserId appletResourceUserId, out long arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(122)] + public Result SetNpadJoyAssignmentModeSingleByDefault(AppletResourceUserId appletResourceUserId, uint arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(123)] + public Result SetNpadJoyAssignmentModeSingle(AppletResourceUserId appletResourceUserId, uint arg1, long arg2, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(124)] + public Result SetNpadJoyAssignmentModeDual(AppletResourceUserId appletResourceUserId, NpadIdType npadIdType, [ClientProcessId] ulong pid) + { + if (IsValidNpadIdType(npadIdType)) + { + // context.Device.Hid.SharedMemory.Npads[(int)HidUtils.GetIndexFromNpadIdType(npadIdType)].InternalState.JoyAssignmentMode = NpadJoyAssignmentMode.Dual; + } + + return Result.Success; + } + + [CmifCommand(125)] + public Result MergeSingleJoyAsDualJoy(AppletResourceUserId appletResourceUserId, NpadIdType npadIdType0, NpadIdType npadIdType1, [ClientProcessId] ulong pid) + { + if (IsValidNpadIdType(npadIdType0) && IsValidNpadIdType(npadIdType1)) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, npadIdType0, npadIdType1 }); + } + + return Result.Success; + } + + [CmifCommand(126)] + public Result StartLrAssignmentMode(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(127)] + public Result StopLrAssignmentMode(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(128)] + public Result SetNpadHandheldActivationMode(AppletResourceUserId appletResourceUserId, NpadHandheldActivationMode npadHandheldActivationMode, [ClientProcessId] ulong pid) + { + _npadHandheldActivationMode = npadHandheldActivationMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadHandheldActivationMode }); + + return Result.Success; + } + + [CmifCommand(129)] + public Result GetNpadHandheldActivationMode(AppletResourceUserId appletResourceUserId, out NpadHandheldActivationMode npadHandheldActivationMode, [ClientProcessId] ulong pid) + { + npadHandheldActivationMode = _npadHandheldActivationMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadHandheldActivationMode }); + + return Result.Success; + } + + [CmifCommand(130)] + public Result SwapNpadAssignment(AppletResourceUserId appletResourceUserId, uint oldNpadAssignment, uint newNpadAssignment, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, oldNpadAssignment, newNpadAssignment }); + + return Result.Success; + } + + [CmifCommand(131)] + public Result IsUnintendedHomeButtonInputProtectionEnabled(out bool arg0, AppletResourceUserId appletResourceUserId, uint arg2, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(132)] + public Result EnableUnintendedHomeButtonInputProtection(AppletResourceUserId appletResourceUserId, uint arg1, bool arg2, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(133)] + public Result SetNpadJoyAssignmentModeSingleWithDestination(out bool arg0, out uint arg1, AppletResourceUserId appletResourceUserId, uint arg3, long arg4, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(134)] + public Result SetNpadAnalogStickUseCenterClamp(AppletResourceUserId appletResourceUserId, bool arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(135)] + public Result SetNpadCaptureButtonAssignment(AppletResourceUserId appletResourceUserId, NpadStyleTag arg1, NpadButton arg2, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(136)] + public Result ClearNpadCaptureButtonAssignment(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(200)] + public Result GetVibrationDeviceInfo(out VibrationDeviceInfoForIpc vibrationDeviceInfoForIpc, VibrationDeviceHandle vibrationDeviceHandle) + { + NpadStyleIndex deviceType = vibrationDeviceHandle.DeviceType; + NpadIdType npadIdType = vibrationDeviceHandle.PlayerId; + vibrationDeviceInfoForIpc = new(); + + if (deviceType < NpadStyleIndex.System || deviceType >= NpadStyleIndex.FullKey) + { + if (!IsValidNpadIdType(npadIdType)) + { + return HidResult.InvalidNpadIdType; + } + + if (vibrationDeviceHandle.Position > 1) + { + return HidResult.InvalidDeviceIndex; + } + + VibrationDeviceType vibrationDeviceType = VibrationDeviceType.None; + + if (Enum.IsDefined(deviceType)) + { + vibrationDeviceType = VibrationDeviceType.LinearResonantActuator; + } + else if ((uint)deviceType == 8) + { + vibrationDeviceType = VibrationDeviceType.GcErm; + } + + VibrationDevicePosition vibrationDevicePosition = VibrationDevicePosition.None; + + if (vibrationDeviceType == VibrationDeviceType.LinearResonantActuator) + { + if (vibrationDeviceHandle.Position == 0) + { + vibrationDevicePosition = VibrationDevicePosition.Left; + } + else if (vibrationDeviceHandle.Position == 1) + { + vibrationDevicePosition = VibrationDevicePosition.Right; + } + else + { + throw new InvalidOperationException($"{nameof(vibrationDeviceHandle.Position)} contains an invalid value: {vibrationDeviceHandle.Position}"); + } + } + + vibrationDeviceInfoForIpc = new() + { + DeviceType = vibrationDeviceType, + Position = vibrationDevicePosition, + }; + + return Result.Success; + } + + return HidResult.InvalidNpadDeviceType; + } + + [CmifCommand(201)] + public Result SendVibrationValue(AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, VibrationValue vibrationValue, [ClientProcessId] ulong pid) + { + Dictionary dualVibrationValues = new() + { + [vibrationDeviceHandle.Position] = vibrationValue, + }; + + HorizonStatic.Hid.Npads.UpdateRumbleQueue(vibrationDeviceHandle.PlayerId, dualVibrationValues); + + return Result.Success; + } + + [CmifCommand(202)] + public Result GetActualVibrationValue(out VibrationValue vibrationValue, AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, [ClientProcessId] ulong pid) + { + vibrationValue = HorizonStatic.Hid.Npads.GetLastVibrationValue(vibrationDeviceHandle.PlayerId, vibrationDeviceHandle.Position); + + return Result.Success; + } + + [CmifCommand(203)] + public Result CreateActiveVibrationDeviceList(out IActiveVibrationDeviceList arg0) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(204)] + public Result PermitVibration(bool vibrationPermitted) + { + _vibrationPermitted = vibrationPermitted; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _vibrationPermitted }); + + return Result.Success; + } + + [CmifCommand(205)] + public Result IsVibrationPermitted(out bool vibrationPermitted) + { + vibrationPermitted = _vibrationPermitted; + + return Result.Success; + } + + [CmifCommand(206)] + public Result SendVibrationValues(AppletResourceUserId appletResourceUserId, [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan vibrationDeviceHandles, [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan vibrationValues) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(207)] + public Result SendVibrationGcErmCommand(AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, VibrationGcErmCommand vibrationGcErmCommand, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, vibrationDeviceHandle, vibrationGcErmCommand }); + + return Result.Success; + } + + [CmifCommand(208)] + public Result GetActualVibrationGcErmCommand(out VibrationGcErmCommand vibrationGcErmCommand, AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, [ClientProcessId] ulong pid) + { + vibrationGcErmCommand = _vibrationGcErmCommand; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, vibrationDeviceHandle, _vibrationGcErmCommand }); + + return Result.Success; + } + + [CmifCommand(209)] + public Result BeginPermitVibrationSession(AppletResourceUserId appletResourceUserId) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(210)] + public Result EndPermitVibrationSession() + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(211)] + public Result IsVibrationDeviceMounted(out bool isVibrationDeviceMounted, AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, [ClientProcessId] ulong pid) + { + // NOTE: Service use vibrationDeviceHandle to get the PlayerIndex. + // And return false if (npadIdType >= (NpadIdType)8 && npadIdType != NpadIdType.Handheld && npadIdType != NpadIdType.Unknown) + + isVibrationDeviceMounted = true; + + return Result.Success; + } + + [CmifCommand(212)] + public Result SendVibrationValueInBool(AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, bool arg2, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(300)] + public Result ActivateConsoleSixAxisSensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(301)] + public Result StartConsoleSixAxisSensor(AppletResourceUserId appletResourceUserId, ConsoleSixAxisSensorHandle consoleSixAxisSensorHandle, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, consoleSixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(302)] + public Result StopConsoleSixAxisSensor(AppletResourceUserId appletResourceUserId, ConsoleSixAxisSensorHandle consoleSixAxisSensorHandle, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, consoleSixAxisSensorHandle }); + + return Result.Success; + } + + [CmifCommand(303)] + public Result ActivateSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(304)] + public Result StartSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(305)] + public Result StopSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(306)] + public Result InitializeSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, [CopyHandle] int nativeHandle0, ulong counter0, [CopyHandle] int nativeHandle1, ulong counter1, [ClientProcessId] ulong pid) + { + // TODO: Determine if array is a buffer or not... + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, counter0, counter1 }); + + return Result.Success; + } + + [CmifCommand(307)] + public Result FinalizeSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(308)] + public Result SetSevenSixAxisSensorFusionStrength(AppletResourceUserId appletResourceUserId, float sevenSixAxisSensorFusionStrength, [ClientProcessId] ulong pid) + { + _sevenSixAxisSensorFusionStrength = sevenSixAxisSensorFusionStrength; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _sevenSixAxisSensorFusionStrength }); + + return Result.Success; + } + + [CmifCommand(309)] + public Result GetSevenSixAxisSensorFusionStrength(out float sevenSixSensorFusionStrength, AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + sevenSixSensorFusionStrength = _sevenSixAxisSensorFusionStrength; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _sevenSixAxisSensorFusionStrength }); + + return Result.Success; + } + + [CmifCommand(310)] + public Result ResetSevenSixAxisSensorTimestamp(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(400)] + public Result IsUsbFullKeyControllerEnabled(out bool isUsbFullKeyControllerEnabled) + { + isUsbFullKeyControllerEnabled = _usbFullKeyControllerEnabled; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _usbFullKeyControllerEnabled }); + + return Result.Success; + } + + [CmifCommand(401)] + public Result EnableUsbFullKeyController(bool usbFullKeyControllerEnabled) + { + _usbFullKeyControllerEnabled = usbFullKeyControllerEnabled; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _usbFullKeyControllerEnabled }); + + return Result.Success; + } + + [CmifCommand(402)] + public Result IsUsbFullKeyControllerConnected(out bool isConnected, uint unknown) + { + isConnected = true; // FullKeyController is always connected? + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { unknown, Connected = true }); + + return Result.Success; + } + + [CmifCommand(403)] + public Result HasBattery(out bool hasBattery, uint npadId) + { + hasBattery = true; // Npad always has a battery? + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, HasBattery = true }); + + return Result.Success; + } + + [CmifCommand(404)] + public Result HasLeftRightBattery(out bool hasLeftBattery, out bool hasRightBattery, uint npadId) + { + hasLeftBattery = true; // Npad always has a left battery? + hasRightBattery = true; // Npad always has a right battery? + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, HasLeftBattery = true, HasRightBattery = true }); + + return Result.Success; + } + + [CmifCommand(405)] + public Result GetNpadInterfaceType(out byte npadInterfaceType, uint npadId) + { + npadInterfaceType = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, NpadInterfaceType = 0 }); + + return Result.Success; + } + + [CmifCommand(406)] + public Result GetNpadLeftRightInterfaceType(out byte leftInterfaceType, out byte rightInterfaceType, uint npadId) + { + leftInterfaceType = 0; + rightInterfaceType = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { npadId, LeftInterfaceType = 0, RightInterfaceType = 0 }); + + return Result.Success; + } + + [CmifCommand(500)] + public Result GetPalmaConnectionHandle(out PalmaConnectionHandle palmaConnectionHandle, uint unknown, AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknown, palmaConnectionHandle }); + + return Result.Success; + } + + [CmifCommand(501)] + public Result InitializePalma(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); + + Os.SignalSystemEvent(ref _palmaOperationCompleteEvent); + + return Result.Success; + } + + [CmifCommand(502)] + public Result AcquirePalmaOperationCompleteEvent([CopyHandle] out int handle, PalmaConnectionHandle palmaConnectionHandle) + { + handle = Os.GetReadableHandleOfSystemEvent(ref _palmaOperationCompleteEvent); + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); + + return Result.Success; + } + + [CmifCommand(503)] + public Result GetPalmaOperationInfo(out ulong unknown, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span arg1, PalmaConnectionHandle palmaConnectionHandle) + { + unknown = 0; // Counter? + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown }); + + return Result.Success; + } + + [CmifCommand(504)] + public Result PlayPalmaActivity(PalmaConnectionHandle palmaConnectionHandle, ulong unknown) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown }); + + Os.SignalSystemEvent(ref _palmaOperationCompleteEvent); + + return Result.Success; + } + + [CmifCommand(505)] + public Result SetPalmaFrModeType(PalmaConnectionHandle palmaConnectionHandle, ulong frModeType) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, frModeType }); + + Os.SignalSystemEvent(ref _palmaOperationCompleteEvent); + + return Result.Success; + } + + [CmifCommand(506)] + public Result ReadPalmaStep(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); + + return Result.Success; + } + + [CmifCommand(507)] + public Result EnablePalmaStep(PalmaConnectionHandle palmaConnectionHandle, bool enabledPalmaStep) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, enabledPalmaStep }); + + Os.SignalSystemEvent(ref _palmaOperationCompleteEvent); + + return Result.Success; + } + + [CmifCommand(508)] + public Result ResetPalmaStep(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); + + Os.SignalSystemEvent(ref _palmaOperationCompleteEvent); + + return Result.Success; + } + + [CmifCommand(509)] + public Result ReadPalmaApplicationSection(PalmaConnectionHandle palmaConnectionHandle, ulong unknown0, ulong unknown1) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown0, unknown1 }); + + return Result.Success; + } + + [CmifCommand(510)] + public Result WritePalmaApplicationSection(PalmaConnectionHandle palmaConnectionHandle, ulong unknown0, ulong unknown1, [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x100)] in PalmaApplicationSectionAccessBuffer palmaApplicationSectionAccessBuffer) + { + // nn::hid::PalmaApplicationSectionAccessBuffer cast is unknown + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle, unknown0, unknown1 }); + + Os.SignalSystemEvent(ref _palmaOperationCompleteEvent); + + return Result.Success; + } + + [CmifCommand(511)] + public Result ReadPalmaUniqueCode(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); + + return Result.Success; + } + + [CmifCommand(512)] + public Result SetPalmaUniqueCodeInvalid(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { palmaConnectionHandle }); + + return Result.Success; + } + + [CmifCommand(513)] + public Result WritePalmaActivityEntry(PalmaConnectionHandle palmaConnectionHandle, ulong arg1, ulong arg2, ulong arg3, ulong arg4) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(514)] + public Result WritePalmaRgbLedPatternEntry(PalmaConnectionHandle palmaConnectionHandle, ulong arg1, [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan arg2) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(515)] + public Result WritePalmaWaveEntry(PalmaConnectionHandle palmaConnectionHandle, PalmaWaveSet palmaWaveSet, ulong arg2, [CopyHandle] int arg3, ulong arg4, ulong arg5) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(516)] + public Result SetPalmaDataBaseIdentificationVersion(PalmaConnectionHandle palmaConnectionHandle, int arg1) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(517)] + public Result GetPalmaDataBaseIdentificationVersion(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(518)] + public Result SuspendPalmaFeature(PalmaConnectionHandle palmaConnectionHandle, PalmaFeature palmaFeature) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(519)] + public Result GetPalmaOperationResult(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(520)] + public Result ReadPalmaPlayLog(PalmaConnectionHandle palmaConnectionHandle, ushort arg1) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(521)] + public Result ResetPalmaPlayLog(PalmaConnectionHandle palmaConnectionHandle, ushort arg1) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(522)] + public Result SetIsPalmaAllConnectable(AppletResourceUserId appletResourceUserId, bool unknownBool, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, unknownBool }); + + return Result.Success; + } + + [CmifCommand(523)] + public Result SetIsPalmaPairedConnectable(AppletResourceUserId appletResourceUserId, bool arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(524)] + public Result PairPalma(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(525)] + public Result SetPalmaBoostMode(bool arg0) + { + // NOTE: Stubbed in system module. + + return Result.Success; + } + + [CmifCommand(526)] + public Result CancelWritePalmaWaveEntry(PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(527)] + public Result EnablePalmaBoostMode(AppletResourceUserId appletResourceUserId, bool arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(528)] + public Result GetPalmaBluetoothAddress(out Address arg0, PalmaConnectionHandle palmaConnectionHandle) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(529)] + public Result SetDisallowedPalmaConnection(AppletResourceUserId appletResourceUserId, [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan
arg1, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + [CmifCommand(1000)] + public Result SetNpadCommunicationMode(AppletResourceUserId appletResourceUserId, long npadCommunicationMode, [ClientProcessId] ulong pid) + { + _npadCommunicationMode = npadCommunicationMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, _npadCommunicationMode }); + + return Result.Success; + } + + [CmifCommand(1001)] + public Result GetNpadCommunicationMode(out long npadCommunicationMode) + { + npadCommunicationMode = _npadCommunicationMode; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { _npadCommunicationMode }); + + return Result.Success; + } + + [CmifCommand(1002)] + public Result SetTouchScreenConfiguration(AppletResourceUserId appletResourceUserId, TouchScreenConfigurationForNx touchScreenConfigurationForNx, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, touchScreenConfigurationForNx }); + + return Result.Success; + } + + [CmifCommand(1003)] + public Result IsFirmwareUpdateNeededForNotification(out bool isFirmwareUpdateNeededForNotification, int unknown, AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + isFirmwareUpdateNeededForNotification = false; + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { IsFirmwareUpdateNeededForNotification = false, unknown, appletResourceUserId }); + + return Result.Success; + } + + [CmifCommand(2000)] + public Result ActivateDigitizer(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceHid); + + return Result.Success; + } + + public static PlayerIndex GetIndexFromNpadIdType(NpadIdType npadIdType) + => npadIdType switch + { +#pragma warning disable IDE0055 // Disable formatting + NpadIdType.Player1 => PlayerIndex.Player1, + NpadIdType.Player2 => PlayerIndex.Player2, + NpadIdType.Player3 => PlayerIndex.Player3, + NpadIdType.Player4 => PlayerIndex.Player4, + NpadIdType.Player5 => PlayerIndex.Player5, + NpadIdType.Player6 => PlayerIndex.Player6, + NpadIdType.Player7 => PlayerIndex.Player7, + NpadIdType.Player8 => PlayerIndex.Player8, + NpadIdType.Handheld => PlayerIndex.Handheld, + NpadIdType.Unknown => PlayerIndex.Unknown, + _ => throw new ArgumentOutOfRangeException(nameof(npadIdType)), +#pragma warning restore IDE0055 + }; + + public static NpadIdType GetNpadIdTypeFromIndex(PlayerIndex index) + => index switch + { +#pragma warning disable IDE0055 // Disable formatting + PlayerIndex.Player1 => NpadIdType.Player1, + PlayerIndex.Player2 => NpadIdType.Player2, + PlayerIndex.Player3 => NpadIdType.Player3, + PlayerIndex.Player4 => NpadIdType.Player4, + PlayerIndex.Player5 => NpadIdType.Player5, + PlayerIndex.Player6 => NpadIdType.Player6, + PlayerIndex.Player7 => NpadIdType.Player7, + PlayerIndex.Player8 => NpadIdType.Player8, + PlayerIndex.Handheld => NpadIdType.Handheld, + PlayerIndex.Unknown => NpadIdType.Unknown, + _ => throw new ArgumentOutOfRangeException(nameof(index)), +#pragma warning restore IDE0055 + }; + + private static bool IsValidNpadIdType(NpadIdType npadIdType) + { + return (npadIdType >= NpadIdType.Player1 && npadIdType <= NpadIdType.Player8) || + npadIdType == NpadIdType.Handheld || + npadIdType == NpadIdType.Unknown; + } + } +} diff --git a/src/Ryujinx.Horizon/HorizonStatic.cs b/src/Ryujinx.Horizon/HorizonStatic.cs index 305d54bd1a..a89c78f69e 100644 --- a/src/Ryujinx.Horizon/HorizonStatic.cs +++ b/src/Ryujinx.Horizon/HorizonStatic.cs @@ -6,6 +6,9 @@ namespace Ryujinx.Horizon { public static class HorizonStatic { + [ThreadStatic] + private static Sdk.Hid.Hid _hid; + [ThreadStatic] private static HorizonOptions _options; @@ -21,6 +24,7 @@ namespace Ryujinx.Horizon [ThreadStatic] private static int _threadHandle; + public static Sdk.Hid.Hid Hid => _hid; public static HorizonOptions Options => _options; public static ISyscallApi Syscall => _syscall; public static IVirtualMemoryManager AddressSpace => _addressSpace; diff --git a/src/Ryujinx.Horizon/Irs/IrSensorServer.cs b/src/Ryujinx.Horizon/Irs/IrSensorServer.cs new file mode 100644 index 0000000000..59737d1484 --- /dev/null +++ b/src/Ryujinx.Horizon/Irs/IrSensorServer.cs @@ -0,0 +1,233 @@ +using Ryujinx.Common.Logging; +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Irs; +using Ryujinx.Horizon.Sdk.Sf; +using Ryujinx.Horizon.Sdk.Sf.Hipc; +using System; + +namespace Ryujinx.Horizon.Irs +{ + class IrSensorServer : IIrSensorServer + { + [CmifCommand(302)] + public Result ActivateIrsensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + // NOTE: This seems to initialize the shared memory for irs service. + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id }); + + return Result.Success; + } + + [CmifCommand(303)] + public Result DeactivateIrsensor(AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + // NOTE: This seems to deinitialize the shared memory for irs service. + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id }); + + return Result.Success; + } + + [CmifCommand(304)] + public Result GetIrsensorSharedMemoryHandle([CopyHandle] out int arg0, AppletResourceUserId appletResourceUserId, [ClientProcessId] ulong pid) + { + // NOTE: Shared memory should use the appletResourceUserId. + // TODO: Update when HorizonStatic has support for CreateSharedMemory + + arg0 = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id }); + + return Result.Success; + } + + [CmifCommand(305)] + public Result StopImageProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); + + return Result.Success; + } + + [CmifCommand(306)] + public Result RunMomentProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedMomentProcessorConfig config, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.ExposureTime }); + + return Result.Success; + } + + [CmifCommand(307)] + public Result RunClusteringProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedClusteringProcessorConfig config, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.ExposureTime }); + + return Result.Success; + } + + [CmifCommand(308)] + public Result RunImageTransferProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedImageTransferProcessorConfig config, [CopyHandle] int arg3, ulong arg4, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + // TODO: Handle the Transfer Memory. + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.ExposureTime }); + + return Result.Success; + } + + [CmifCommand(309)] + public Result GetImageTransferProcessorState(AppletResourceUserId appletResourceUserId, out ImageTransferProcessorState imageTransferProcessorState, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span imageTransferBuffer, IrCameraHandle irCameraHandle, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + // TODO: Uses the buffer to copy the JoyCon IR data (by using a JoyCon driver) and update the following struct. + imageTransferProcessorState = new ImageTransferProcessorState + { + SamplingNumber = 0, + AmbientNoiseLevel = 0 + }; + + if (imageTransferBuffer.Length == 0) + { + // InvalidBufferSize + return new Result(207); + } + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); + + return Result.Success; + } + + [CmifCommand(310)] + public Result RunTeraPluginProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedTeraPluginProcessorConfig config, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.RequiredMcuVersion }); + + return Result.Success; + } + + [CmifCommand(311)] + public Result GetNpadIrCameraHandle(out IrCameraHandle irCameraHandle, NpadIdType npadIdType) + { + if (npadIdType > NpadIdType.Player8 && + npadIdType != NpadIdType.Unknown && + npadIdType != NpadIdType.Handheld) + { + // NpadIdOutOfRange + irCameraHandle = new IrCameraHandle(); + return new Result(709); + } + + irCameraHandle = new IrCameraHandle + { + PlayerNumber = (byte)npadIdType + }; + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { npadIdType }); + + return Result.Success; + } + + [CmifCommand(312)] + public Result RunPointingProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedPointingProcessorConfig config, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.RequiredMcuVersion }); + + return Result.Success; + } + + [CmifCommand(313)] + public Result SuspendImageProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); + + return Result.Success; + } + + [CmifCommand(314)] + public Result CheckFirmwareVersion(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedMcuVersion mcuVersion, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, mcuVersion }); + + return Result.Success; + } + + [CmifCommand(315)] + public Result SetFunctionLevel(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedFunctionLevel functionLevel, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, functionLevel.IrSensorFunctionLevel }); + + return Result.Success; + } + + [CmifCommand(316)] + public Result RunImageTransferExProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedImageTransferProcessorExConfig config, int arg3, ulong arg4, ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.ExposureTime, arg3, arg4 }); + + return Result.Success; + } + + [CmifCommand(317)] + public Result RunIrLedProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedIrLedProcessorConfig config, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.RequiredMcuVersion }); + + return Result.Success; + } + + [CmifCommand(318)] + public Result StopImageProcessorAsync(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, [ClientProcessId] ulong pid) + { + CheckCameraHandle(irCameraHandle); + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); + + return Result.Success; + } + + [CmifCommand(319)] + public Result ActivateIrsensorWithFunctionLevel(AppletResourceUserId appletResourceUserId, PackedFunctionLevel functionLevel, [ClientProcessId] ulong pid) + { + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, functionLevel.IrSensorFunctionLevel }); + + return Result.Success; + } + + private Result CheckCameraHandle(IrCameraHandle irCameraHandle) + { + if (irCameraHandle.DeviceType == 1 || (PlayerIndex)irCameraHandle.PlayerNumber >= PlayerIndex.Unknown) + { + // InvalidCameraHandle + return new Result(204); + } + + return Result.Success; + } + } +} diff --git a/src/Ryujinx.Horizon/Irs/IrSensorSystemServer.cs b/src/Ryujinx.Horizon/Irs/IrSensorSystemServer.cs new file mode 100644 index 0000000000..f774ff5f93 --- /dev/null +++ b/src/Ryujinx.Horizon/Irs/IrSensorSystemServer.cs @@ -0,0 +1,43 @@ +using Ryujinx.Common.Logging; +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Irs; +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Irs +{ + class IrSensorSystemServer : IIrSensorSystemServer + { + [CmifCommand(500)] + public Result SetAppletResourceUserId(AppletResourceUserId appletResourceUserId) + { + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id }); + + return Result.Success; + } + + [CmifCommand(501)] + public Result RegisterAppletResourceUserId(AppletResourceUserId appletResourceUserId, bool arg1) + { + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, arg1 }); + + return Result.Success; + } + + [CmifCommand(502)] + public Result UnregisterAppletResourceUserId(AppletResourceUserId appletResourceUserId) + { + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id }); + + return Result.Success; + } + + [CmifCommand(503)] + public Result EnableAppletToGetInput(AppletResourceUserId appletResourceUserId, bool arg1) + { + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, arg1 }); + + return Result.Success; + } + } +} diff --git a/src/Ryujinx.Horizon/Irs/IrsIpcServer.cs b/src/Ryujinx.Horizon/Irs/IrsIpcServer.cs new file mode 100644 index 0000000000..ae66264237 --- /dev/null +++ b/src/Ryujinx.Horizon/Irs/IrsIpcServer.cs @@ -0,0 +1,45 @@ +using Ryujinx.Horizon.Sdk.Sf.Hipc; +using Ryujinx.Horizon.Sdk.Sm; + +namespace Ryujinx.Horizon.Irs +{ + class IrsIpcServer + { + // TODO: RE These values + private const int MaxSessionsCount = 30; + + private const int PointerBufferSize = 0xB40; + private const int MaxDomains = 0; + private const int MaxDomainObjects = 0; + private const int MaxPortsCount = 1; + + private static readonly ManagerOptions _options = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + + private SmApi _sm; + private ServerManager _serverManager; + + public void Initialize() + { + HeapAllocator allocator = new(); + + _sm = new SmApi(); + _sm.Initialize().AbortOnFailure(); + + _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _options, MaxSessionsCount); + + _serverManager.RegisterObjectForServer(new IrSensorServer(), ServiceName.Encode("irs"), MaxSessionsCount); + _serverManager.RegisterObjectForServer(new IrSensorSystemServer(), ServiceName.Encode("irs:sys"), MaxSessionsCount); + } + + public void ServiceRequests() + { + _serverManager.ServiceRequests(); + } + + public void Shutdown() + { + _serverManager.Dispose(); + _sm.Dispose(); + } + } +} diff --git a/src/Ryujinx.Horizon/Irs/IrsMain.cs b/src/Ryujinx.Horizon/Irs/IrsMain.cs new file mode 100644 index 0000000000..6f8652e9ac --- /dev/null +++ b/src/Ryujinx.Horizon/Irs/IrsMain.cs @@ -0,0 +1,17 @@ +namespace Ryujinx.Horizon.Irs +{ + class IrsMain : IService + { + public static void Main(ServiceTable serviceTable) + { + IrsIpcServer ipcServer = new(); + + ipcServer.Initialize(); + + serviceTable.SignalServiceReady(); + + ipcServer.ServiceRequests(); + ipcServer.Shutdown(); + } + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Address.cs b/src/Ryujinx.Horizon/Sdk/Hid/Address.cs new file mode 100644 index 0000000000..b317032616 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Address.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + [StructLayout(LayoutKind.Sequential, Size = 0x6)] + struct Address + { + + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/AppletFooterUiType.cs b/src/Ryujinx.Horizon/Sdk/Hid/AppletFooterUiType.cs similarity index 92% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/AppletFooterUiType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/AppletFooterUiType.cs index b9b0c5f99f..4a5ec53238 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/AppletFooterUiType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/AppletFooterUiType.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum AppletFooterUiType : byte diff --git a/src/Ryujinx.Horizon/Sdk/Hid/ControllerConfig.cs b/src/Ryujinx.Horizon/Sdk/Hid/ControllerConfig.cs new file mode 100644 index 0000000000..902ac0d00e --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/ControllerConfig.cs @@ -0,0 +1,10 @@ +using Ryujinx.Horizon.Sdk.Hid.Npad; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + public struct ControllerConfig + { + public PlayerIndex Player; + public NpadStyleTag Type; + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/GamepadInput.cs b/src/Ryujinx.Horizon/Sdk/Hid/GamepadInput.cs similarity index 74% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/GamepadInput.cs rename to src/Ryujinx.Horizon/Sdk/Hid/GamepadInput.cs index 452901a087..f7ed1c5295 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/GamepadInput.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/GamepadInput.cs @@ -1,4 +1,6 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +using Ryujinx.Horizon.Sdk.Hid.Npad; + +namespace Ryujinx.Horizon.Sdk.Hid { public struct GamepadInput { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Hid.cs b/src/Ryujinx.Horizon/Sdk/Hid/Hid.cs similarity index 70% rename from src/Ryujinx.HLE/HOS/Services/Hid/Hid.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Hid.cs index dbcbe18708..4a901fa19b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Hid.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Hid.cs @@ -1,29 +1,22 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Memory; -using Ryujinx.HLE.Exceptions; -using Ryujinx.HLE.HOS.Kernel.Memory; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; +using Ryujinx.Horizon.Sdk.Hid.HidDevices; +using Ryujinx.Horizon.Sdk.Hid.Npad; using System.Collections.Generic; using System.Runtime.CompilerServices; +using PlayerIndex = Ryujinx.Horizon.Sdk.Hid.Npad.PlayerIndex; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid { public class Hid { - private readonly Switch _device; - + internal const int HidSize = 0x40000; private readonly SharedMemoryStorage _storage; internal ref SharedMemory SharedMemory => ref _storage.GetRef(0); - internal const int SharedMemEntryCount = 17; + internal readonly int SharedMemEntryCount = 17; public DebugPadDevice DebugPad; public TouchDevice Touchscreen; @@ -46,12 +39,11 @@ namespace Ryujinx.HLE.HOS.Services.Hid CheckTypeSizeOrThrow>(0x350); CheckTypeSizeOrThrow>(0x3D8); CheckTypeSizeOrThrow>(0x32000); - CheckTypeSizeOrThrow(Horizon.HidSize); + CheckTypeSizeOrThrow(HidSize); } - internal Hid(in Switch device, SharedMemoryStorage storage) + internal Hid(SharedMemoryStorage storage) { - _device = device; _storage = storage; SharedMemory = SharedMemory.Create(); @@ -61,11 +53,11 @@ namespace Ryujinx.HLE.HOS.Services.Hid private void InitDevices() { - DebugPad = new DebugPadDevice(_device, true); - Touchscreen = new TouchDevice(_device, true); - Mouse = new MouseDevice(_device, false); - Keyboard = new KeyboardDevice(_device, false); - Npads = new NpadDevices(_device, true); + DebugPad = new DebugPadDevice(true); + Touchscreen = new TouchDevice(true); + Mouse = new MouseDevice(false); + Keyboard = new KeyboardDevice(false); + Npads = new NpadDevices(true); } public void RefreshInputConfig(List inputConfig) @@ -75,10 +67,10 @@ namespace Ryujinx.HLE.HOS.Services.Hid for (int i = 0; i < npadConfig.Length; ++i) { npadConfig[i].Player = (PlayerIndex)inputConfig[i].PlayerIndex; - npadConfig[i].Type = (ControllerType)inputConfig[i].ControllerType; + npadConfig[i].Type = inputConfig[i].ControllerType; } - _device.Hid.Npads.Configure(npadConfig); + Npads.Configure(npadConfig); } public ControllerKeys UpdateStickButtons(JoystickPosition leftStick, JoystickPosition rightStick) diff --git a/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/BaseDevice.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/BaseDevice.cs new file mode 100644 index 0000000000..11ff18a04a --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/BaseDevice.cs @@ -0,0 +1,12 @@ +namespace Ryujinx.Horizon.Sdk.Hid.HidDevices +{ + public abstract class BaseDevice + { + public bool Active; + + public BaseDevice(bool active) + { + Active = active; + } + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/DebugPadDevice.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/DebugPadDevice.cs similarity index 70% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/DebugPadDevice.cs rename to src/Ryujinx.Horizon/Sdk/Hid/HidDevices/DebugPadDevice.cs index 6b1d7af5dd..04ea1b37b0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/DebugPadDevice.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/DebugPadDevice.cs @@ -1,11 +1,8 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad; - -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.HidDevices { public class DebugPadDevice : BaseDevice { - public DebugPadDevice(Switch device, bool active) : base(device, active) { } + public DebugPadDevice(bool active) : base(active) { } public void Update() { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/KeyboardDevice.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/KeyboardDevice.cs similarity index 74% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/KeyboardDevice.cs rename to src/Ryujinx.Horizon/Sdk/Hid/HidDevices/KeyboardDevice.cs index 0e3630f264..60c8125ef3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/KeyboardDevice.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/KeyboardDevice.cs @@ -1,12 +1,10 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard; using System; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.HidDevices { public class KeyboardDevice : BaseDevice { - public KeyboardDevice(Switch device, bool active) : base(device, active) { } + public KeyboardDevice(bool active) : base(active) { } public void Update(KeyboardInput keyState) { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/MouseDevice.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/MouseDevice.cs similarity index 80% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/MouseDevice.cs rename to src/Ryujinx.Horizon/Sdk/Hid/HidDevices/MouseDevice.cs index 2e62d206b5..71b798cfa7 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/MouseDevice.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/MouseDevice.cs @@ -1,11 +1,8 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse; - -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.HidDevices { public class MouseDevice : BaseDevice { - public MouseDevice(Switch device, bool active) : base(device, active) { } + public MouseDevice(bool active) : base(active) { } public void Update(int mouseX, int mouseY, uint buttons = 0, int scrollX = 0, int scrollY = 0, bool connected = false) { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/NpadDevices.cs similarity index 87% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs rename to src/Ryujinx.Horizon/Sdk/Hid/HidDevices/NpadDevices.cs index 86c6a825f5..76eae65806 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/NpadDevices.cs @@ -1,15 +1,15 @@ using Ryujinx.Common; using Ryujinx.Common.Logging; -using Ryujinx.HLE.HOS.Kernel.Threading; -using Ryujinx.HLE.HOS.Services.Hid.Types; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Hid.SixAxis; +using Ryujinx.Horizon.Sdk.Hid.Vibration; +using Ryujinx.Horizon.Sdk.OsTypes; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Runtime.CompilerServices; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.HidDevices { public class NpadDevices : BaseDevice { @@ -18,8 +18,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid private long _lastNotifyTimestamp; public const int MaxControllers = 9; // Players 1-8 and Handheld - private ControllerType[] _configuredTypes; - private readonly KEvent[] _styleSetUpdateEvents; + private NpadStyleTag[] _configuredTypes; + private readonly Event[] _styleSetUpdateEvents; private readonly bool[] _supportedPlayers; private VibrationValue _neutralVibrationValue = new() { @@ -31,26 +31,26 @@ namespace Ryujinx.HLE.HOS.Services.Hid internal NpadJoyHoldType JoyHold { get; set; } internal bool SixAxisActive = false; // TODO: link to hidserver when implemented - internal ControllerType SupportedStyleSets { get; set; } + internal NpadStyleTag SupportedStyleSets { get; set; } - public Dictionary> RumbleQueues = new(); - public Dictionary LastVibrationValues = new(); + public Dictionary> RumbleQueues = new(); + public Dictionary LastVibrationValues = new(); - public NpadDevices(Switch device, bool active = true) : base(device, active) + public NpadDevices(bool active = true) : base(active) { - _configuredTypes = new ControllerType[MaxControllers]; + _configuredTypes = new NpadStyleTag[MaxControllers]; - SupportedStyleSets = ControllerType.Handheld | ControllerType.JoyconPair | - ControllerType.JoyconLeft | ControllerType.JoyconRight | - ControllerType.ProController; + SupportedStyleSets = NpadStyleTag.Handheld | NpadStyleTag.JoyDual | + NpadStyleTag.JoyLeft | NpadStyleTag.JoyRight | + NpadStyleTag.FullKey; _supportedPlayers = new bool[MaxControllers]; _supportedPlayers.AsSpan().Fill(true); - _styleSetUpdateEvents = new KEvent[MaxControllers]; + _styleSetUpdateEvents = new Event[MaxControllers]; for (int i = 0; i < _styleSetUpdateEvents.Length; ++i) { - _styleSetUpdateEvents[i] = new KEvent(_device.System.KernelContext); + _styleSetUpdateEvents[i] = new Event(_device.System.KernelContext); } _activeCount = 0; @@ -58,7 +58,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid JoyHold = NpadJoyHoldType.Vertical; } - internal ref KEvent GetStyleSetUpdateEvent(PlayerIndex player) + internal ref Event GetStyleSetUpdateEvent(PlayerIndex player) { return ref _styleSetUpdateEvents[(int)player]; } @@ -89,23 +89,23 @@ namespace Ryujinx.HLE.HOS.Services.Hid } } - public bool Validate(int playerMin, int playerMax, ControllerType acceptedTypes, out int configuredCount, out PlayerIndex primaryIndex) + public bool Validate(int playerMin, int playerMax, NpadStyleTag acceptedTypes, out int configuredCount, out PlayerIndex primaryIndex) { primaryIndex = PlayerIndex.Unknown; configuredCount = 0; for (int i = 0; i < MaxControllers; ++i) { - ControllerType npad = _configuredTypes[i]; + NpadStyleTag npad = _configuredTypes[i]; - if (npad == ControllerType.Handheld && _device.System.State.DockedMode) + if (npad == NpadStyleTag.Handheld && _device.System.State.DockedMode) { continue; } - ControllerType currentType = (ControllerType)_device.Hid.SharedMemory.Npads[i].InternalState.StyleSet; + NpadStyleTag currentType = (NpadStyleTag)_device.Hid.SharedMemory.Npads[i].InternalState.StyleSet; - if (currentType != ControllerType.None && (npad & acceptedTypes) != 0 && _supportedPlayers[i]) + if (currentType != NpadStyleTag.None && (npad & acceptedTypes) != 0 && _supportedPlayers[i]) { configuredCount++; if (primaryIndex == PlayerIndex.Unknown) @@ -125,19 +125,19 @@ namespace Ryujinx.HLE.HOS.Services.Hid public void Configure(params ControllerConfig[] configs) { - _configuredTypes = new ControllerType[MaxControllers]; + _configuredTypes = new NpadStyleTag[MaxControllers]; for (int i = 0; i < configs.Length; ++i) { PlayerIndex player = configs[i].Player; - ControllerType controllerType = configs[i].Type; + NpadStyleTag controllerType = configs[i].Type; if (player > PlayerIndex.Handheld) { throw new InvalidOperationException("Player must be Player1-8 or Handheld"); } - if (controllerType == ControllerType.Handheld) + if (controllerType == NpadStyleTag.Handheld) { player = PlayerIndex.Handheld; } @@ -178,28 +178,28 @@ namespace Ryujinx.HLE.HOS.Services.Hid // Remap/Init if necessary for (int i = 0; i < MaxControllers; ++i) { - ControllerType config = _configuredTypes[i]; + NpadStyleTag config = _configuredTypes[i]; // Remove Handheld config when Docked - if (config == ControllerType.Handheld && _device.System.State.DockedMode) + if (config == NpadStyleTag.Handheld && _device.System.State.DockedMode) { - config = ControllerType.None; + config = NpadStyleTag.None; } // Auto-remap ProController and JoyconPair - if (config == ControllerType.JoyconPair && (SupportedStyleSets & ControllerType.JoyconPair) == 0 && (SupportedStyleSets & ControllerType.ProController) != 0) + if (config == NpadStyleTag.JoyDual && (SupportedStyleSets & NpadStyleTag.JoyDual) == 0 && (SupportedStyleSets & NpadStyleTag.FullKey) != 0) { - config = ControllerType.ProController; + config = NpadStyleTag.FullKey; } - else if (config == ControllerType.ProController && (SupportedStyleSets & ControllerType.ProController) == 0 && (SupportedStyleSets & ControllerType.JoyconPair) != 0) + else if (config == NpadStyleTag.FullKey && (SupportedStyleSets & NpadStyleTag.FullKey) == 0 && (SupportedStyleSets & NpadStyleTag.JoyDual) != 0) { - config = ControllerType.JoyconPair; + config = NpadStyleTag.JoyDual; } // Check StyleSet and PlayerSet if ((config & SupportedStyleSets) == 0 || !_supportedPlayers[i]) { - config = ControllerType.None; + config = NpadStyleTag.None; } SetupNpad((PlayerIndex)i, config); @@ -212,11 +212,11 @@ namespace Ryujinx.HLE.HOS.Services.Hid } } - private void SetupNpad(PlayerIndex player, ControllerType type) + private void SetupNpad(PlayerIndex player, NpadStyleTag type) { ref NpadInternalState controller = ref _device.Hid.SharedMemory.Npads[(int)player].InternalState; - ControllerType oldType = (ControllerType)controller.StyleSet; + NpadStyleTag oldType = controller.StyleSet; if (oldType == type) { @@ -225,7 +225,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid controller = NpadInternalState.Create(); // Reset it - if (type == ControllerType.None) + if (type == NpadStyleTag.None) { _styleSetUpdateEvents[(int)player].ReadableEvent.Signal(); // Signal disconnect _activeCount--; @@ -255,7 +255,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid switch (type) { #pragma warning disable IDE0055 // Disable formatting - case ControllerType.ProController: + case NpadStyleTag.FullKey: controller.StyleSet = NpadStyleTag.FullKey; controller.DeviceType = DeviceType.FullKey; controller.SystemProperties |= NpadSystemProperties.IsAbxyButtonOriented | @@ -263,7 +263,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid NpadSystemProperties.IsMinusAvailable; controller.AppletFooterUiType = AppletFooterUiType.SwitchProController; break; - case ControllerType.Handheld: + case NpadStyleTag.Handheld: controller.StyleSet = NpadStyleTag.Handheld; controller.DeviceType = DeviceType.HandheldLeft | DeviceType.HandheldRight; @@ -272,7 +272,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid NpadSystemProperties.IsMinusAvailable; controller.AppletFooterUiType = AppletFooterUiType.HandheldJoyConLeftJoyConRight; break; - case ControllerType.JoyconPair: + case NpadStyleTag.JoyDual: controller.StyleSet = NpadStyleTag.JoyDual; controller.DeviceType = DeviceType.JoyLeft | DeviceType.JoyRight; @@ -281,7 +281,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid NpadSystemProperties.IsMinusAvailable; controller.AppletFooterUiType = _device.System.State.DockedMode ? AppletFooterUiType.JoyDual : AppletFooterUiType.HandheldJoyConLeftJoyConRight; break; - case ControllerType.JoyconLeft: + case NpadStyleTag.JoyLeft: controller.StyleSet = NpadStyleTag.JoyLeft; controller.JoyAssignmentMode = NpadJoyAssignmentMode.Single; controller.DeviceType = DeviceType.JoyLeft; @@ -289,7 +289,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid NpadSystemProperties.IsMinusAvailable; controller.AppletFooterUiType = _device.System.State.DockedMode ? AppletFooterUiType.JoyDualLeftOnly : AppletFooterUiType.HandheldJoyConLeftOnly; break; - case ControllerType.JoyconRight: + case NpadStyleTag.JoyRight: controller.StyleSet = NpadStyleTag.JoyRight; controller.JoyAssignmentMode = NpadJoyAssignmentMode.Single; controller.DeviceType = DeviceType.JoyRight; @@ -297,7 +297,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid NpadSystemProperties.IsPlusAvailable; controller.AppletFooterUiType = _device.System.State.DockedMode ? AppletFooterUiType.JoyDualRightOnly : AppletFooterUiType.HandheldJoyConRightOnly; break; - case ControllerType.Pokeball: + case NpadStyleTag.Palma: controller.StyleSet = NpadStyleTag.Palma; controller.DeviceType = DeviceType.Palma; controller.AppletFooterUiType = AppletFooterUiType.None; @@ -596,7 +596,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid WriteNewSixInputEntry(ref currentNpad.JoyRightSixAxisSensor, ref newState); } - public void UpdateRumbleQueue(PlayerIndex index, Dictionary dualVibrationValues) + public void UpdateRumbleQueue(NpadIdType index, Dictionary dualVibrationValues) { if (RumbleQueues.TryGetValue(index, out ConcurrentQueue<(VibrationValue, VibrationValue)> currentQueue)) { @@ -619,7 +619,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid } } - public VibrationValue GetLastVibrationValue(PlayerIndex index, byte position) + public VibrationValue GetLastVibrationValue(NpadIdType index, byte position) { if (!LastVibrationValues.TryGetValue(index, out (VibrationValue, VibrationValue) dualVibrationValue)) { @@ -629,7 +629,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid return (position == 0) ? dualVibrationValue.Item1 : dualVibrationValue.Item2; } - public ConcurrentQueue<(VibrationValue, VibrationValue)> GetRumbleQueue(PlayerIndex index) + public ConcurrentQueue<(VibrationValue, VibrationValue)> GetRumbleQueue(NpadIdType index) { if (!RumbleQueues.TryGetValue(index, out ConcurrentQueue<(VibrationValue, VibrationValue)> rumbleQueue)) { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/TouchDevice.cs similarity index 83% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs rename to src/Ryujinx.Horizon/Sdk/Hid/HidDevices/TouchDevice.cs index 35ac1a16f4..237d5c69da 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidDevices/TouchDevice.cs @@ -1,12 +1,10 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; using System; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.HidDevices { public class TouchDevice : BaseDevice { - public TouchDevice(Switch device, bool active) : base(device, active) { } + public TouchDevice(bool active) : base(active) { } public void Update(params TouchPoint[] points) { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/HidVector.cs b/src/Ryujinx.Horizon/Sdk/Hid/HidVector.cs similarity index 70% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/HidVector.cs rename to src/Ryujinx.Horizon/Sdk/Hid/HidVector.cs index 8d667796ad..6d65c05111 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/HidVector.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/HidVector.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types +namespace Ryujinx.Horizon.Sdk.Hid { struct HidVector { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/IHidDebugServer.cs b/src/Ryujinx.Horizon/Sdk/Hid/IHidDebugServer.cs new file mode 100644 index 0000000000..311832ab9d --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/IHidDebugServer.cs @@ -0,0 +1,128 @@ +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + interface IHidDebugServer : IServiceObject + { + // Result DeactivateDebugPad(); + // Result SetDebugPadAutoPilotState(DebugPadAutoPilotState arg0); + // Result UnsetDebugPadAutoPilotState(); + // Result DeactivateTouchScreen(); + // Result SetTouchScreenAutoPilotState(ReadOnlySpan arg0); + // Result UnsetTouchScreenAutoPilotState(); + // Result GetTouchScreenConfiguration(out TouchScreenConfigurationForNx arg0, AppletResourceUserId arg1, ulong pid); + // Result ProcessTouchScreenAutoTune(); + // Result ForceStopTouchScreenManagement(); + // Result ForceRestartTouchScreenManagement(AppletResourceUserId arg0, int arg1, ulong pid); + // Result IsTouchScreenManaged(out bool arg0); + // Result DeactivateMouse(); + // Result SetMouseAutoPilotState(MouseAutoPilotState arg0); + // Result UnsetMouseAutoPilotState(); + // Result DeactivateKeyboard(); + // Result SetKeyboardAutoPilotState(KeyboardAutoPilotState arg0); + // Result UnsetKeyboardAutoPilotState(); + // Result DeactivateXpad(BasicXpadId arg0); + // Result ClearNpadSystemCommonPolicy(AppletResourceUserId arg0, ulong pid); + // Result DeactivateNpad(AppletResourceUserId arg0, ulong pid); + // Result ForceDisconnectNpad(uint arg0); + // Result DeactivateGesture(); + // Result DeactivateHomeButton(); + // Result SetHomeButtonAutoPilotState(HomeButtonAutoPilotState arg0); + // Result UnsetHomeButtonAutoPilotState(); + // Result DeactivateSleepButton(); + // Result SetSleepButtonAutoPilotState(SleepButtonAutoPilotState arg0); + // Result UnsetSleepButtonAutoPilotState(); + // Result DeactivateCaptureButton(); + // Result SetCaptureButtonAutoPilotState(CaptureButtonAutoPilotState arg0); + // Result UnsetCaptureButtonAutoPilotState(); + // Result SetShiftAccelerometerCalibrationValue(SixAxisSensorHandle arg0, AppletResourceUserId arg1, float arg2, float arg3, ulong pid); + // Result GetShiftAccelerometerCalibrationValue(out float arg0, out float arg1, SixAxisSensorHandle arg2, AppletResourceUserId arg3, ulong pid); + // Result SetShiftGyroscopeCalibrationValue(SixAxisSensorHandle arg0, AppletResourceUserId arg1, float arg2, float arg3, ulong pid); + // Result GetShiftGyroscopeCalibrationValue(out float arg0, out float arg1, SixAxisSensorHandle arg2, AppletResourceUserId arg3, ulong pid); + // Result DeactivateConsoleSixAxisSensor(); + // Result GetConsoleSixAxisSensorSamplingFrequency(out long arg0, AppletResourceUserId arg1, ulong pid); + // Result DeactivateSevenSixAxisSensor(); + // Result GetConsoleSixAxisSensorCountStates(out int arg0, Span arg1, AppletResourceUserId arg2, ulong pid); + // Result GetAccelerometerFsr(out AccelerometerFsr arg0, AppletResourceUserId arg1, ulong pid); + // Result SetAccelerometerFsr(AccelerometerFsr arg0, AppletResourceUserId arg1, ulong pid); + // Result GetAccelerometerOdr(out AccelerometerOdr arg0, AppletResourceUserId arg1, ulong pid); + // Result SetAccelerometerOdr(AccelerometerOdr arg0, AppletResourceUserId arg1, ulong pid); + // Result GetGyroscopeFsr(out GyroscopeFsr arg0, AppletResourceUserId arg1, ulong pid); + // Result SetGyroscopeFsr(GyroscopeFsr arg0, AppletResourceUserId arg1, ulong pid); + // Result GetGyroscopeOdr(out GyroscopeOdr arg0, AppletResourceUserId arg1, ulong pid); + // Result SetGyroscopeOdr(GyroscopeOdr arg0, AppletResourceUserId arg1, ulong pid); + // Result GetWhoAmI(out WhoAmIValue arg0, AppletResourceUserId arg1, ulong pid); + // Result ActivateFirmwareUpdate(); + // Result DeactivateFirmwareUpdate(); + // Result StartFirmwareUpdate(UniquePadId arg0); + // Result GetFirmwareUpdateStage(out long arg0, out long arg1); + // Result GetFirmwareVersion(out FirmwareVersion arg0, uint arg1, DeviceType arg2); + // Result GetDestinationFirmwareVersion(out FirmwareVersion arg0, uint arg1, DeviceType arg2); + // Result DiscardFirmwareInfoCacheForRevert(); + // Result StartFirmwareUpdateForRevert(UniquePadId arg0); + // Result GetAvailableFirmwareVersionForRevert(out FirmwareVersion arg0, UniquePadId arg1); + // Result IsFirmwareUpdatingDevice(out bool arg0, UniquePadId arg1); + // Result StartFirmwareUpdateIndividual(out FirmwareUpdateDeviceHandle arg0, UniquePadId arg1, long arg2, int arg3, ulong arg4); + // Result SetUsbFirmwareForceUpdateEnabled(bool arg0); + // Result SetAllKuinaDevicesToFirmwareUpdateMode(); + // Result UpdateControllerColor(Unorm8x4 arg0, Unorm8x4 arg1, UniquePadId arg2); + // Result ConnectUsbPadsAsync(); + // Result DisconnectUsbPadsAsync(); + // Result UpdateDesignInfo(Unorm8x4 arg0, Unorm8x4 arg1, Unorm8x4 arg2, Unorm8x4 arg3, uint arg4, UniquePadId arg5); + // Result GetUniquePadDriverState(out PadRawState arg0, UniquePadId arg1); + // Result GetSixAxisSensorDriverStates(out long arg0, Span arg1, UniquePadId arg2); + // Result GetRxPacketHistory(out JoyConFormatPacketRxHistory arg0, UniquePadId arg1); + // Result AcquireOperationEventHandle(out int arg0, UniquePadId arg1); + // Result ReadSerialFlash(uint arg0, int arg1, ulong arg2, UniquePadId arg3); + // Result WriteSerialFlash(uint arg0, int arg1, ulong arg2, ulong arg3, UniquePadId arg4); + // Result GetOperationResult(UniquePadId arg0); + // Result EnableShipmentMode(UniquePadId arg0); + // Result ClearPairingInfo(UniquePadId arg0); + // Result GetUniquePadDeviceTypeSetInternal(out DeviceType arg0, UniquePadId arg1); + // Result EnableAnalogStickPower(bool arg0, UniquePadId arg1); + // Result RequestKuinaUartClockCal(UniquePadId arg0); + // Result GetKuinaUartClockCal(out byte arg0, UniquePadId arg1); + // Result SetKuinaUartClockTrim(UniquePadId arg0, byte arg1); + // Result KuinaLoopbackTest(UniquePadId arg0); + // Result RequestBatteryVoltage(UniquePadId arg0); + // Result GetBatteryVoltage(out ushort arg0, UniquePadId arg1); + // Result GetUniquePadPowerInfo(out PowerInfo arg0, UniquePadId arg1); + // Result RebootUniquePad(UniquePadId arg0); + // Result RequestKuinaFirmwareVersion(UniquePadId arg0); + // Result GetKuinaFirmwareVersion(out UsbFirmwareVersion arg0, UniquePadId arg1); + // Result GetVidPid(out ushort arg0, out ushort arg1, UniquePadId arg2); + // Result GetAnalogStickCalibrationValue(out AnalogStickCalibrationValue arg0, UniquePadId arg1, AnalogStickDeviceType arg2); + // Result GetUniquePadIdsFull(out int arg0, Span arg1); + // Result ConnectUniquePad(UniquePadId arg0); + // Result IsVirtual(out bool arg0, out bool arg1, UniquePadId arg2); + // Result GetAnalogStickModuleParam(out AnalogStickModuleParam arg0, UniquePadId arg1, AnalogStickDeviceType arg2); + // Result UnsetAllAutoPilotVirtualPadState(); + // Result AttachHdlsWorkBuffer(out HdlsSessionId arg0, int arg1, ulong arg2); + // Result ReleaseHdlsWorkBuffer(HdlsSessionId arg0); + // Result DumpHdlsNpadAssignmentState(HdlsSessionId arg0); + // Result DumpHdlsStates(HdlsSessionId arg0); + // Result ApplyHdlsNpadAssignmentState(HdlsSessionId arg0, bool arg1); + // Result ApplyHdlsStateList(HdlsSessionId arg0); + // Result AttachHdlsVirtualDevice(out HdlsHandle arg0, HdlsDeviceInfo arg1); + // Result DetachHdlsVirtualDevice(HdlsHandle arg0); + // Result SetHdlsState(HdlsHandle arg0, HdlsState arg1); + // Result AddRegisteredDevice(RegisteredDevice arg0); + // Result DisableExternalMcuOnNxDevice(bool arg0); + // Result DisableRailDeviceFiltering(bool arg0); + // Result EnableWiredPairing(bool arg0); + // Result EnableShipmentModeAutoClear(bool arg0); + // Result SetRailEnabled(bool arg0); + // Result SetFactoryInt(bool arg0, UniquePadId arg1); + // Result IsFactoryBootEnabled(out bool arg0, UniquePadId arg1); + // Result SetAnalogStickModelDataTemporarily(AnalogStickModelData arg0, UniquePadId arg1, int arg2); + // Result GetAnalogStickModelData(out AnalogStickModelData arg0, out bool arg1, UniquePadId arg2, int arg3); + // Result ResetAnalogStickModelData(UniquePadId arg0, int arg1); + // Result ConvertPadState(out PadState arg0, PadState arg1, UniquePadId arg2); + // Result AddButtonPlayData(ButtonPlayData arg0, UniquePadId arg1); + // Result StartButtonPlayData(UniquePadId arg0); + // Result StopButtonPlayData(UniquePadId arg0); + // Result DeactivateDigitizer(); + // Result SetDigitizerAutoPilotState(DigitizerAutoPilotState arg0); + // Result UnsetDigitizerAutoPilotState(); + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/IHidServer.cs b/src/Ryujinx.Horizon/Sdk/Hid/IHidServer.cs new file mode 100644 index 0000000000..8aac66d76b --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/IHidServer.cs @@ -0,0 +1,150 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Hid.SixAxis; +using Ryujinx.Horizon.Sdk.Hid.Vibration; +using Ryujinx.Horizon.Sdk.Sf; +using System; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + interface IHidServer : IServiceObject + { + Result CreateAppletResource(out IAppletResource arg0, AppletResourceUserId appletResourceUserId, ulong pid); + Result ActivateDebugPad(AppletResourceUserId appletResourceUserId, ulong pid); + Result ActivateTouchScreen(AppletResourceUserId appletResourceUserId, ulong pid); + Result ActivateMouse(AppletResourceUserId appletResourceUserId, ulong pid); + Result ActivateKeyboard(AppletResourceUserId appletResourceUserId, ulong pid); + Result SendKeyboardLockKeyEvent(AppletResourceUserId appletResourceUserId, KeyboardLockKeyEvent keyboardLockKeyEvent, ulong pid); + Result AcquireXpadIdEventHandle(out int handle, ulong xpadId); + Result ReleaseXpadIdEventHandle(ulong xpadId); + Result ActivateXpad(AppletResourceUserId appletResourceUserId, uint basicXpadId, ulong pid); + Result GetXpadIds(out long idCount, Span basicXpadIds); + Result ActivateJoyXpad(uint joyXpadId); + Result GetJoyXpadLifoHandle(out int arg0, uint joyXpadId); + Result GetJoyXpadIds(out long idCount, Span joyXpadIds); + Result ActivateSixAxisSensor(uint basicXpadId); + Result DeactivateSixAxisSensor(uint basicXpadId); + Result GetSixAxisSensorLifoHandle(out int arg0, uint basicXpadId); + Result ActivateJoySixAxisSensor(uint joyXpadId); + Result DeactivateJoySixAxisSensor(uint joyXpadId); + Result GetJoySixAxisSensorLifoHandle(out int arg0, uint joyXpadId); + Result StartSixAxisSensor(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result StopSixAxisSensor(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result IsSixAxisSensorFusionEnabled(out bool sixAxisSensorFusionEnabled, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result EnableSixAxisSensorFusion(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, bool sixAxisSensorFusionEnabled, ulong pid); + Result SetSixAxisSensorFusionParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, float revisePower, float reviseRange, ulong pid); + Result GetSixAxisSensorFusionParameters(out float revisePower, out float reviseRange, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result ResetSixAxisSensorFusionParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result SetAccelerometerParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, float x, float y, ulong pid); + Result GetAccelerometerParameters(out float x, out float y, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result ResetAccelerometerParameters(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result SetAccelerometerPlayMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, uint accelerometerPlayMode, ulong pid); + Result GetAccelerometerPlayMode(out uint accelerometerPlayMode, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result ResetAccelerometerPlayMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result SetGyroscopeZeroDriftMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, GyroscopeZeroDriftMode gyroscopeZeroDriftMode, ulong pid); + Result GetGyroscopeZeroDriftMode(out GyroscopeZeroDriftMode gyroscopeZeroDriftMode, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result ResetGyroscopeZeroDriftMode(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result IsSixAxisSensorAtRest(out bool isAtRest, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result IsFirmwareUpdateAvailableForSixAxisSensor(out bool isFirmwareUpdateAvailableForSixAxisSensor, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result EnableSixAxisSensorUnalteredPassthrough(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, bool sixAxisSensorUnalteredPassthrough, ulong pid); + Result IsSixAxisSensorUnalteredPassthroughEnabled(out bool sixAxisSensorUnalteredPassthrough, AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result StoreSixAxisSensorCalibrationParameter(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, in SixAxisSensorCalibrationParameter sixAxisSensorCalibrationParameter, ulong pid); + Result LoadSixAxisSensorCalibrationParameter(AppletResourceUserId appletResourceUserId, out SixAxisSensorCalibrationParameter sixAxisSensorCalibrationParameter, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result GetSixAxisSensorIcInformation(AppletResourceUserId appletResourceUserId, out SixAxisSensorIcInformation sixAxisSensorIcInformation, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result ResetIsSixAxisSensorDeviceNewlyAssigned(AppletResourceUserId appletResourceUserId, SixAxisSensorHandle sixAxisSensorHandle, ulong pid); + Result ActivateGesture(AppletResourceUserId appletResourceUserId, int unknown, ulong pid); + Result SetSupportedNpadStyleSet(AppletResourceUserId appletResourceUserId, NpadStyleTag supportedStyleSets, ulong pid); + Result GetSupportedNpadStyleSet(AppletResourceUserId appletResourceUserId, out NpadStyleTag supportedStyleSets, ulong pid); + Result SetSupportedNpadIdType(AppletResourceUserId appletResourceUserId, ReadOnlySpan npadIds, ulong pid); + Result ActivateNpad(AppletResourceUserId appletResourceUserId, ulong pid); + Result DeactivateNpad(AppletResourceUserId appletResourceUserId, ulong pid); + Result AcquireNpadStyleSetUpdateEventHandle(AppletResourceUserId appletResourceUserId, out int arg1, uint arg2, ulong arg3, ulong pid); + Result DisconnectNpad(AppletResourceUserId appletResourceUserId, NpadIdType npadIdType, ulong pid); + Result GetPlayerLedPattern(out ulong ledPattern, NpadIdType npadId); + Result ActivateNpadWithRevision(AppletResourceUserId appletResourceUserId, int arg1, ulong pid); + Result SetNpadJoyHoldType(AppletResourceUserId appletResourceUserId, long arg1, ulong pid); + Result GetNpadJoyHoldType(AppletResourceUserId appletResourceUserId, out long arg1, ulong pid); + Result SetNpadJoyAssignmentModeSingleByDefault(AppletResourceUserId appletResourceUserId, uint arg1, ulong pid); + Result SetNpadJoyAssignmentModeSingle(AppletResourceUserId appletResourceUserId, uint arg1, long arg2, ulong pid); + Result SetNpadJoyAssignmentModeDual(AppletResourceUserId appletResourceUserId, NpadIdType npadIdType, ulong pid); + Result MergeSingleJoyAsDualJoy(AppletResourceUserId appletResourceUserId, NpadIdType npadIdType0, NpadIdType npadIdType1, ulong pid); + Result StartLrAssignmentMode(AppletResourceUserId appletResourceUserId, ulong pid); + Result StopLrAssignmentMode(AppletResourceUserId appletResourceUserId, ulong pid); + Result SetNpadHandheldActivationMode(AppletResourceUserId appletResourceUserId, NpadHandheldActivationMode npadHandheldActivationMode, ulong pid); + Result GetNpadHandheldActivationMode(AppletResourceUserId appletResourceUserId, out NpadHandheldActivationMode npadHandheldActivationMode, ulong pid); + Result SwapNpadAssignment(AppletResourceUserId appletResourceUserId, uint oldNpadAssignment, uint newNpadAssignment, ulong pid); + Result IsUnintendedHomeButtonInputProtectionEnabled(out bool arg0, AppletResourceUserId appletResourceUserId, uint arg2, ulong pid); + Result EnableUnintendedHomeButtonInputProtection(AppletResourceUserId appletResourceUserId, uint arg1, bool arg2, ulong pid); + Result SetNpadJoyAssignmentModeSingleWithDestination(out bool arg0, out uint arg1, AppletResourceUserId appletResourceUserId, uint arg3, long arg4, ulong pid); + Result SetNpadAnalogStickUseCenterClamp(AppletResourceUserId appletResourceUserId, bool arg1, ulong pid); + Result SetNpadCaptureButtonAssignment(AppletResourceUserId appletResourceUserId, NpadStyleTag arg1, NpadButton arg2, ulong pid); + Result ClearNpadCaptureButtonAssignment(AppletResourceUserId appletResourceUserId, ulong pid); + Result GetVibrationDeviceInfo(out VibrationDeviceInfoForIpc vibrationDeviceInfoForIpc, VibrationDeviceHandle vibrationDeviceHandle); + Result SendVibrationValue(AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, VibrationValue vibrationValue, ulong pid); + Result GetActualVibrationValue(out VibrationValue vibrationValue, AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, ulong pid); + Result CreateActiveVibrationDeviceList(out IActiveVibrationDeviceList arg0); + Result PermitVibration(bool vibrationPermitted); + Result IsVibrationPermitted(out bool vibrationPermitted); + Result SendVibrationValues(AppletResourceUserId appletResourceUserId, ReadOnlySpan vibrationDeviceHandles, ReadOnlySpan vibrationValues); + Result SendVibrationGcErmCommand(AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, VibrationGcErmCommand vibrationGcErmCommand, ulong pid); + Result GetActualVibrationGcErmCommand(out VibrationGcErmCommand vibrationGcErmCommand, AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, ulong pid); + Result BeginPermitVibrationSession(AppletResourceUserId appletResourceUserId); + Result EndPermitVibrationSession(); + Result IsVibrationDeviceMounted(out bool isVibrationDeviceMounted, AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, ulong pid); + Result SendVibrationValueInBool(AppletResourceUserId appletResourceUserId, VibrationDeviceHandle vibrationDeviceHandle, bool arg2, ulong pid); + Result ActivateConsoleSixAxisSensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result StartConsoleSixAxisSensor(AppletResourceUserId appletResourceUserId, ConsoleSixAxisSensorHandle consoleSixAxisSensorHandle, ulong pid); + Result StopConsoleSixAxisSensor(AppletResourceUserId appletResourceUserId, ConsoleSixAxisSensorHandle consoleSixAxisSensorHandle, ulong pid); + Result ActivateSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result StartSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result StopSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result InitializeSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, int nativeHandle0, ulong counter0, int nativeHandle1, ulong counter1, ulong pid); + Result FinalizeSevenSixAxisSensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result SetSevenSixAxisSensorFusionStrength(AppletResourceUserId appletResourceUserId, float sevenSixAxisSensorFusionStrength, ulong pid); + Result GetSevenSixAxisSensorFusionStrength(out float sevenSixSensorFusionStrength, AppletResourceUserId appletResourceUserId, ulong pid); + Result ResetSevenSixAxisSensorTimestamp(AppletResourceUserId appletResourceUserId, ulong pid); + Result IsUsbFullKeyControllerEnabled(out bool isUsbFullKeyControllerEnabled); + Result EnableUsbFullKeyController(bool usbFullKeyControllerEnabled); + Result IsUsbFullKeyControllerConnected(out bool isConnected, uint unknown); + Result HasBattery(out bool hasBattery, uint npadId); + Result HasLeftRightBattery(out bool hasLeftBattery, out bool hasRightBattery, uint npadId); + Result GetNpadInterfaceType(out byte npadInterfaceType, uint npadId); + Result GetNpadLeftRightInterfaceType(out byte leftInterfaceType, out byte rightInterfaceType, uint npadId); + Result GetPalmaConnectionHandle(out PalmaConnectionHandle palmaConnectionHandle, uint unknown, AppletResourceUserId appletResourceUserId, ulong pid); + Result InitializePalma(PalmaConnectionHandle palmaConnectionHandle); + Result AcquirePalmaOperationCompleteEvent(out int handle, PalmaConnectionHandle palmaConnectionHandle); + Result GetPalmaOperationInfo(out ulong unknown, Span arg1, PalmaConnectionHandle palmaConnectionHandle); + Result PlayPalmaActivity(PalmaConnectionHandle palmaConnectionHandle, ulong unknown); + Result SetPalmaFrModeType(PalmaConnectionHandle palmaConnectionHandle, ulong frModeType); + Result ReadPalmaStep(PalmaConnectionHandle palmaConnectionHandle); + Result EnablePalmaStep(PalmaConnectionHandle palmaConnectionHandle, bool enabledPalmaStep); + Result ResetPalmaStep(PalmaConnectionHandle palmaConnectionHandle); + Result ReadPalmaApplicationSection(PalmaConnectionHandle palmaConnectionHandle, ulong unknown0, ulong unknown1); + Result WritePalmaApplicationSection(PalmaConnectionHandle palmaConnectionHandle, ulong unknown0, ulong unknown1, in PalmaApplicationSectionAccessBuffer palmaApplicationSectionAccessBuffer); + Result ReadPalmaUniqueCode(PalmaConnectionHandle palmaConnectionHandle); + Result SetPalmaUniqueCodeInvalid(PalmaConnectionHandle palmaConnectionHandle); + Result WritePalmaActivityEntry(PalmaConnectionHandle palmaConnectionHandle, ulong arg1, ulong arg2, ulong arg3, ulong arg4); + Result WritePalmaRgbLedPatternEntry(PalmaConnectionHandle palmaConnectionHandle, ulong arg1, ReadOnlySpan arg2); + Result WritePalmaWaveEntry(PalmaConnectionHandle palmaConnectionHandle, PalmaWaveSet palmaWaveSet, ulong arg2, int arg3, ulong arg4, ulong arg5); + Result SetPalmaDataBaseIdentificationVersion(PalmaConnectionHandle palmaConnectionHandle, int arg1); + Result GetPalmaDataBaseIdentificationVersion(PalmaConnectionHandle palmaConnectionHandle); + Result SuspendPalmaFeature(PalmaConnectionHandle palmaConnectionHandle, PalmaFeature palmaFeature); + Result GetPalmaOperationResult(PalmaConnectionHandle palmaConnectionHandle); + Result ReadPalmaPlayLog(PalmaConnectionHandle palmaConnectionHandle, ushort arg1); + Result ResetPalmaPlayLog(PalmaConnectionHandle palmaConnectionHandle, ushort arg1); + Result SetIsPalmaAllConnectable(AppletResourceUserId appletResourceUserId, bool unknownBool, ulong pid); + Result SetIsPalmaPairedConnectable(AppletResourceUserId appletResourceUserId, bool arg1, ulong pid); + Result PairPalma(PalmaConnectionHandle palmaConnectionHandle); + Result SetPalmaBoostMode(bool arg0); + Result CancelWritePalmaWaveEntry(PalmaConnectionHandle palmaConnectionHandle); + Result EnablePalmaBoostMode(AppletResourceUserId appletResourceUserId, bool arg1, ulong pid); + Result GetPalmaBluetoothAddress(out Address arg0, PalmaConnectionHandle palmaConnectionHandle); + Result SetDisallowedPalmaConnection(AppletResourceUserId appletResourceUserId, ReadOnlySpan
arg1, ulong pid); + Result SetNpadCommunicationMode(AppletResourceUserId appletResourceUserId, long npadCommunicationMode, ulong pid); + Result GetNpadCommunicationMode(out long npadCommunicationMode); + Result SetTouchScreenConfiguration(AppletResourceUserId appletResourceUserId, TouchScreenConfigurationForNx touchScreenConfigurationForNx, ulong pid); + Result IsFirmwareUpdateNeededForNotification(out bool isFirmwareUpdateNeededForNotification, int unknown, AppletResourceUserId appletResourceUserId, ulong pid); + Result ActivateDigitizer(AppletResourceUserId appletResourceUserId, ulong pid); + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/IHidbusServer.cs b/src/Ryujinx.Horizon/Sdk/Hid/IHidbusServer.cs new file mode 100644 index 0000000000..02d07fc898 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/IHidbusServer.cs @@ -0,0 +1,25 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Sf; +using System; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + interface IHidbusServer : IServiceObject + { + Result GetBusHandle(out BusHandle handle, out bool hasHandle, uint npadIdType, ulong busType, AppletResourceUserId resourceUserId); + Result IsExternalDeviceConnected(out bool isAttached, BusHandle handle); + Result Initialize(BusHandle handle, AppletResourceUserId resourceUserId); + Result Finalize(BusHandle handle, AppletResourceUserId resourceUserId); + Result EnableExternalDevice(BusHandle handle, bool isEnabled, ulong version, AppletResourceUserId resourceUserId); + Result GetExternalDeviceId(out uint deviceId, BusHandle handle); + Result SendCommandAsync(ReadOnlySpan buffer, BusHandle handle); + Result GetSendCommandAsyncResult(out uint outSize, Span buffer, BusHandle handle); + Result SetEventForSendCommandAsyncResult(out int eventHandle, BusHandle handle); + Result GetSharedMemoryHandle(out int sharedMemoryHandle); + Result EnableJoyPollingReceiveMode(ReadOnlySpan buffer, int transferMemoryHandle, uint size, uint joyPollingMode, BusHandle handle); + Result DisableJoyPollingReceiveMode(BusHandle handle); + Result SetStatusManagerType(uint statusManagerType); + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/IHidbusSystemServer.cs b/src/Ryujinx.Horizon/Sdk/Hid/IHidbusSystemServer.cs new file mode 100644 index 0000000000..c4b7a06513 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/IHidbusSystemServer.cs @@ -0,0 +1,13 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + interface IHidbusSystemServer : IServiceObject + { + Result SetAppletResourceUserId(AppletResourceUserId resourceUserId); + Result RegisterAppletResourceUserId(AppletResourceUserId resourceUserId, int arg1); + Result UnregisterAppletResourceUserId(AppletResourceUserId resourceUserId); + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/JoystickPosition.cs b/src/Ryujinx.Horizon/Sdk/Hid/JoystickPosition.cs similarity index 71% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/JoystickPosition.cs rename to src/Ryujinx.Horizon/Sdk/Hid/JoystickPosition.cs index 47be8d4137..4b06eb7fdf 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/JoystickPosition.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/JoystickPosition.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid { public struct JoystickPosition { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/KeyboardInput.cs b/src/Ryujinx.Horizon/Sdk/Hid/KeyboardInput.cs similarity index 73% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/KeyboardInput.cs rename to src/Ryujinx.Horizon/Sdk/Hid/KeyboardInput.cs index 26fe980f50..356c66e1d1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/KeyboardInput.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/KeyboardInput.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid { public struct KeyboardInput { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/KeyboardLockKeyEvent.cs b/src/Ryujinx.Horizon/Sdk/Hid/KeyboardLockKeyEvent.cs new file mode 100644 index 0000000000..5abd5812ce --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/KeyboardLockKeyEvent.cs @@ -0,0 +1,18 @@ +using System; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + [Flags] + enum KeyboardLockKeyEvent + { + NumLockOn = 1 << 0, + NumLockOff = 1 << 1, + NumLockToggle = 1 << 2, + CapsLockOn = 1 << 3, + CapsLockOff = 1 << 4, + CapsLockToggle = 1 << 5, + ScrollLockOn = 1 << 6, + ScrollLockOff = 1 << 7, + ScrollLockToggle = 1 << 8 + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/BusHandle.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/BusHandle.cs similarity index 87% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/BusHandle.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/BusHandle.cs index 8e061351e3..c1c8491175 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/BusHandle.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/BusHandle.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { [StructLayout(LayoutKind.Sequential)] struct BusHandle diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/BusType.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/BusType.cs similarity index 75% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/BusType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/BusType.cs index 6c70ac25c9..9bb3b2a321 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/BusType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/BusType.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { public enum BusType : long { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/ControllerKeys.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/ControllerKeys.cs similarity index 96% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/ControllerKeys.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/ControllerKeys.cs index b43381e6dc..cc9d5bfd87 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/ControllerKeys.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/ControllerKeys.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { [Flags] public enum ControllerKeys : long diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadColor.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadColor.cs similarity index 97% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadColor.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadColor.cs index 010cffbd2d..d02cafb03d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadColor.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadColor.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { public enum NpadColor : uint { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadHandheldActivationMode.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadHandheldActivationMode.cs new file mode 100644 index 0000000000..7bc2c5d1ee --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadHandheldActivationMode.cs @@ -0,0 +1,9 @@ +namespace Ryujinx.Horizon.Sdk.Hid.Npad +{ + public enum NpadHandheldActivationMode : long + { + Dual, + Single, + None, + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadIdType.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadIdType.cs similarity index 75% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadIdType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadIdType.cs index 8f08481cd2..dfc5f3b298 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadIdType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadIdType.cs @@ -1,6 +1,6 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { - public enum NpadIdType + public enum NpadIdType : uint { Player1 = 0, Player2 = 1, diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Npad/NpadJoyDeviceType.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadJoyDeviceType.cs similarity index 66% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Npad/NpadJoyDeviceType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadJoyDeviceType.cs index ac0bb35756..4176d0962e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Npad/NpadJoyDeviceType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadJoyDeviceType.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { public enum NpadJoyDeviceType { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/NpadJoyHoldType.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadJoyHoldType.cs similarity index 63% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/NpadJoyHoldType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadJoyHoldType.cs index cd61dc92cb..114277ea14 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/NpadJoyHoldType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadJoyHoldType.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types +namespace Ryujinx.Horizon.Sdk.Hid.Npad { enum NpadJoyHoldType { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadStyleIndex.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadStyleIndex.cs similarity index 84% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadStyleIndex.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadStyleIndex.cs index c42a5bc56f..037949835f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/NpadStyleIndex.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/NpadStyleIndex.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { public enum NpadStyleIndex : byte { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/PlayerIndex.cs b/src/Ryujinx.Horizon/Sdk/Hid/Npad/PlayerIndex.cs similarity index 88% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/PlayerIndex.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Npad/PlayerIndex.cs index d68b6d938e..38db243e6f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/Npad/PlayerIndex.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Npad/PlayerIndex.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Npad { public enum PlayerIndex { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/PalmaApplicationSectionAccessBuffer.cs b/src/Ryujinx.Horizon/Sdk/Hid/PalmaApplicationSectionAccessBuffer.cs new file mode 100644 index 0000000000..866bd959d2 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/PalmaApplicationSectionAccessBuffer.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + [StructLayout(LayoutKind.Sequential, Size = 0x100)] + struct PalmaApplicationSectionAccessBuffer + { + + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/PalmaConnectionHandle.cs b/src/Ryujinx.Horizon/Sdk/Hid/PalmaConnectionHandle.cs new file mode 100644 index 0000000000..cadfd457f8 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/PalmaConnectionHandle.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + [StructLayout(LayoutKind.Sequential, Size = 0x8)] + struct PalmaConnectionHandle + { + + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/PalmaFeature.cs b/src/Ryujinx.Horizon/Sdk/Hid/PalmaFeature.cs new file mode 100644 index 0000000000..5309e414cd --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/PalmaFeature.cs @@ -0,0 +1,13 @@ +using System; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + [Flags] + enum PalmaFeature + { + FrMode = 1 << 0, + RumbleFeedback = 1 << 1, + Step = 1 << 2, + MuteSwitch = 1 << 3 + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/PalmaWaveSet.cs b/src/Ryujinx.Horizon/Sdk/Hid/PalmaWaveSet.cs new file mode 100644 index 0000000000..279aca0497 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/PalmaWaveSet.cs @@ -0,0 +1,9 @@ +namespace Ryujinx.Horizon.Sdk.Hid +{ + enum PalmaWaveSet : ulong + { + Small = 0, + Medium = 1, + Large = 2 + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/AnalogStickState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/AnalogStickState.cs similarity index 57% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/AnalogStickState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/AnalogStickState.cs index b9af211c10..b2313cf4bb 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/AnalogStickState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/AnalogStickState.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common +namespace Ryujinx.Horizon.Sdk.Hid { struct AnalogStickState { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/AtomicStorage.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/AtomicStorage.cs similarity index 89% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/AtomicStorage.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/AtomicStorage.cs index c9f59ce0fd..2de8bed24e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/AtomicStorage.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/AtomicStorage.cs @@ -1,6 +1,6 @@ using System.Threading; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common +namespace Ryujinx.Horizon.Sdk.Hid { struct AtomicStorage where T : unmanaged, ISampledDataStruct { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/IAppletResource.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/IAppletResource.cs new file mode 100644 index 0000000000..caf5414467 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/IAppletResource.cs @@ -0,0 +1,8 @@ +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + interface IAppletResource : IServiceObject + { + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/ISampledDataStruct.cs similarity index 95% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/ISampledDataStruct.cs index 312075bc46..12c42c582a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/ISampledDataStruct.cs @@ -2,7 +2,7 @@ using System; using System.Buffers.Binary; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common +namespace Ryujinx.Horizon.Sdk.Hid { /// /// This is a "marker interface" to add some compile-time safety to a convention-based optimization. @@ -57,7 +57,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common { return sampledDataStruct switch { - Npad.SixAxisSensorState _ => sizeof(ulong), + SixAxisSensorState _ => sizeof(ulong), _ => 0, }; } diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/RingLifo.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/RingLifo.cs similarity index 98% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/RingLifo.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/RingLifo.cs index 99f2f59e46..79292cfbf9 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/RingLifo.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Common/RingLifo.cs @@ -3,7 +3,7 @@ using System; using System.Runtime.CompilerServices; using System.Threading; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common +namespace Ryujinx.Horizon.Sdk.Hid { struct RingLifo where T : unmanaged, ISampledDataStruct { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadAttribute.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadAttribute.cs similarity index 64% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadAttribute.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadAttribute.cs index dadaf6b295..66b90befeb 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadAttribute.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadAttribute.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum DebugPadAttribute : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadButton.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadButton.cs similarity index 85% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadButton.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadButton.cs index b0bb9b959b..d4bfb743d6 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadButton.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadButton.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum DebugPadButton : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadState.cs similarity index 73% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadState.cs index f26440c4b1..68e8cf5e74 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/DebugPad/DebugPadState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/DebugPad/DebugPadState.cs @@ -1,7 +1,6 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct DebugPadState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardKey.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardKey.cs similarity index 90% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardKey.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardKey.cs index 7f75bc3f9a..c27492dccb 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardKey.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardKey.cs @@ -1,6 +1,6 @@ using Ryujinx.Common.Memory; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard +namespace Ryujinx.Horizon.Sdk.Hid { struct KeyboardKey { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardKeyShift.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardKeyShift.cs similarity index 97% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardKeyShift.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardKeyShift.cs index c19b5e614c..5422511220 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardKeyShift.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardKeyShift.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard +namespace Ryujinx.Horizon.Sdk.Hid { enum KeyboardKeyShift { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardModifier.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardModifier.cs similarity index 84% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardModifier.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardModifier.cs index 890daa0d00..c4458aebf3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardModifier.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardModifier.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum KeyboardModifier : ulong diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardState.cs similarity index 67% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardState.cs index 3f7d9409d2..d58ee2ce2a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Keyboard/KeyboardState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Keyboard/KeyboardState.cs @@ -1,7 +1,6 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct KeyboardState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseAttribute.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseAttribute.cs similarity index 70% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseAttribute.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseAttribute.cs index 048dd357cd..5eaa4c10f9 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseAttribute.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseAttribute.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum MouseAttribute : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseButton.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseButton.cs similarity index 76% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseButton.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseButton.cs index 4a6f73b8b8..ef02f10dbc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseButton.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseButton.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum MouseButton : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseState.cs similarity index 77% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseState.cs index 41fe68b8b0..56f339274c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Mouse/MouseState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Mouse/MouseState.cs @@ -1,7 +1,6 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct MouseState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/DeviceType.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/DeviceType.cs similarity index 90% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/DeviceType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/DeviceType.cs index d56f849a69..3497b0a367 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/DeviceType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/DeviceType.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum DeviceType diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadAttribute.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadAttribute.cs similarity index 81% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadAttribute.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadAttribute.cs index 6d7719e829..928e68ead7 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadAttribute.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadAttribute.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum NpadAttribute : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadBatteryLevel.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadBatteryLevel.cs similarity index 68% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadBatteryLevel.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadBatteryLevel.cs index 7f5b17ff5a..48d13afe95 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadBatteryLevel.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadBatteryLevel.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { enum NpadBatteryLevel { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadButton.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadButton.cs similarity index 93% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadButton.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadButton.cs index c20db8e0b7..17ef6506de 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadButton.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadButton.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum NpadButton : ulong diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadColorAttribute.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadColorAttribute.cs similarity index 62% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadColorAttribute.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadColorAttribute.cs index e8140459ca..bae1f950a9 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadColorAttribute.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadColorAttribute.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { enum NpadColorAttribute : uint { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadCommonState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadCommonState.cs similarity index 76% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadCommonState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadCommonState.cs index d3caf7170a..b17b3908ea 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadCommonState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadCommonState.cs @@ -1,7 +1,6 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct NpadCommonState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadFullKeyColorState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadFullKeyColorState.cs similarity index 72% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadFullKeyColorState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadFullKeyColorState.cs index 77127c2c27..467e2b9bd4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadFullKeyColorState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadFullKeyColorState.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { struct NpadFullKeyColorState { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadGcTriggerState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadGcTriggerState.cs similarity index 73% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadGcTriggerState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadGcTriggerState.cs index 41e8413428..a360a6dfa6 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadGcTriggerState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadGcTriggerState.cs @@ -1,7 +1,6 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct NpadGcTriggerState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadInternalState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadInternalState.cs similarity index 96% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadInternalState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadInternalState.cs index f79a2657e0..82fa810fd4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadInternalState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadInternalState.cs @@ -1,7 +1,6 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { struct NpadInternalState { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadJoyAssignmentMode.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadJoyAssignmentMode.cs similarity index 57% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadJoyAssignmentMode.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadJoyAssignmentMode.cs index b8a4623f40..adfbf33216 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadJoyAssignmentMode.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadJoyAssignmentMode.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { enum NpadJoyAssignmentMode : uint { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadJoyColorState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadJoyColorState.cs similarity index 77% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadJoyColorState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadJoyColorState.cs index 4e00b5aea6..662174ae7b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadJoyColorState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadJoyColorState.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { struct NpadJoyColorState { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadLarkType.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadLarkType.cs similarity index 63% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadLarkType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadLarkType.cs index 013c5fee53..c738904f3e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadLarkType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadLarkType.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { enum NpadLarkType : uint { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadLuciaType.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadLuciaType.cs similarity index 58% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadLuciaType.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadLuciaType.cs index 18756bc345..7ef356bc80 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadLuciaType.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadLuciaType.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { enum NpadLuciaType { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadState.cs similarity index 85% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadState.cs index fb32e716de..b07ac8770a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadState.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Size = 0x5000)] struct NpadState diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadStyleTag.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadStyleTag.cs similarity index 94% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadStyleTag.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadStyleTag.cs index bf4d918794..3f6f73cd47 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadStyleTag.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadStyleTag.cs @@ -1,12 +1,12 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { /// /// Nintendo pad style /// [Flags] - enum NpadStyleTag : uint + public enum NpadStyleTag : uint { /// /// No type. diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadSystemButtonProperties.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadSystemButtonProperties.cs similarity index 72% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadSystemButtonProperties.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadSystemButtonProperties.cs index 6f820ef69a..b7bf81daa8 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadSystemButtonProperties.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadSystemButtonProperties.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum NpadSystemButtonProperties : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadSystemProperties.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadSystemProperties.cs similarity index 90% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadSystemProperties.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadSystemProperties.cs index 79110fe447..f20d67ce2a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/NpadSystemProperties.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/NpadSystemProperties.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum NpadSystemProperties : ulong diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/SixAxisSensorAttribute.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/SixAxisSensorAttribute.cs similarity index 72% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/SixAxisSensorAttribute.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/SixAxisSensorAttribute.cs index b6e57496c9..13edbb4854 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/SixAxisSensorAttribute.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/SixAxisSensorAttribute.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] enum SixAxisSensorAttribute : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/SixAxisSensorState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/SixAxisSensorState.cs similarity index 80% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/SixAxisSensorState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/SixAxisSensorState.cs index f3c2b208f0..7e6ee6bb41 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Npad/SixAxisSensorState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/Npad/SixAxisSensorState.cs @@ -1,8 +1,7 @@ using Ryujinx.Common.Memory; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct SixAxisSensorState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/SharedMemory.cs similarity index 78% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/SharedMemory.cs index d6283eb578..44a96a684c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/SharedMemory.cs @@ -1,13 +1,7 @@ using Ryujinx.Common.Memory; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory +namespace Ryujinx.Horizon.Sdk.Hid { /// /// Represent the shared memory shared between applications for input. diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchAttribute.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchAttribute.cs similarity index 67% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchAttribute.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchAttribute.cs index 44d7c22aa9..c5c8821d9f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchAttribute.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchAttribute.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen +namespace Ryujinx.Horizon.Sdk.Hid { [Flags] public enum TouchAttribute : uint diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchScreenState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchScreenState.cs similarity index 71% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchScreenState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchScreenState.cs index d256da0de1..7e09e0d0ee 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchScreenState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchScreenState.cs @@ -1,8 +1,7 @@ using Ryujinx.Common.Memory; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen +namespace Ryujinx.Horizon.Sdk.Hid { [StructLayout(LayoutKind.Sequential, Pack = 1)] struct TouchScreenState : ISampledDataStruct diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchState.cs b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchState.cs similarity index 88% rename from src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchState.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchState.cs index 06be9b24c2..2c5e58fdeb 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/TouchScreen/TouchState.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SharedMemory/TouchScreen/TouchState.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen +namespace Ryujinx.Horizon.Sdk.Hid { struct TouchState { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/AccelerometerParameters.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/AccelerometerParameters.cs similarity index 71% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/AccelerometerParameters.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SixAxis/AccelerometerParameters.cs index baabffa051..f1c6038c2f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/AccelerometerParameters.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/AccelerometerParameters.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis { public struct AccelerometerParameters { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/ConsoleSixAxisSensorHandle.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/ConsoleSixAxisSensorHandle.cs new file mode 100644 index 0000000000..f9d8ba0d41 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/ConsoleSixAxisSensorHandle.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis +{ + [StructLayout(LayoutKind.Sequential, Size = 0x4)] + struct ConsoleSixAxisSensorHandle + { + public int TypeValue; + public byte Unknown1; + public byte Unknown2; + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/GyroscopeZeroDriftMode.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/GyroscopeZeroDriftMode.cs similarity index 71% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/GyroscopeZeroDriftMode.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SixAxis/GyroscopeZeroDriftMode.cs index d73c602516..1dfd8f3595 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/GyroscopeZeroDriftMode.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/GyroscopeZeroDriftMode.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis { public enum GyroscopeZeroDriftMode { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/SensorFusionParameters.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SensorFusionParameters.cs similarity index 74% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/SensorFusionParameters.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SensorFusionParameters.cs index c74214565c..5f30f8fef4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/SixAxis/SensorFusionParameters.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SensorFusionParameters.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis { public struct SensorFusionParameters { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/SixAxisInput.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisInput.cs similarity index 76% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/SixAxisInput.cs rename to src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisInput.cs index 5c5c5d8c12..23d7b5bacc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/SixAxisInput.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisInput.cs @@ -1,6 +1,7 @@ +using Ryujinx.Horizon.Sdk.Hid.Npad; using System.Numerics; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis { public struct SixAxisInput { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorCalibrationParameter.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorCalibrationParameter.cs new file mode 100644 index 0000000000..bab63644e4 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorCalibrationParameter.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis +{ + [StructLayout(LayoutKind.Sequential, Size = 0x744)] + struct SixAxisSensorCalibrationParameter + { + + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorHandle.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorHandle.cs new file mode 100644 index 0000000000..e3c893cf6c --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorHandle.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis +{ + [StructLayout(LayoutKind.Sequential, Size = 0x4)] + struct SixAxisSensorHandle + { + public int TypeValue; + public byte NpadStyleIndex; + public byte PlayerNumber; + public byte DeviceIdx; + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorIcInformation.cs b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorIcInformation.cs new file mode 100644 index 0000000000..3ec3df114f --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/SixAxis/SixAxisSensorIcInformation.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid.SixAxis +{ + [StructLayout(LayoutKind.Sequential, Size = 0xC8)] + public struct SixAxisSensorIcInformation + { + + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/TouchPoint.cs b/src/Ryujinx.Horizon/Sdk/Hid/TouchPoint.cs similarity index 67% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/TouchPoint.cs rename to src/Ryujinx.Horizon/Sdk/Hid/TouchPoint.cs index ab0c852624..b8052391cd 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/Types/TouchPoint.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/TouchPoint.cs @@ -1,6 +1,4 @@ -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; - -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid { public struct TouchPoint { diff --git a/src/Ryujinx.Horizon/Sdk/Hid/TouchScreenConfigurationForNx.cs b/src/Ryujinx.Horizon/Sdk/Hid/TouchScreenConfigurationForNx.cs new file mode 100644 index 0000000000..dc269f8420 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/TouchScreenConfigurationForNx.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid +{ + [StructLayout(LayoutKind.Sequential, Size = 0x10)] + struct TouchScreenConfigurationForNx + { + public TouchScreenModeForNx Mode; + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/TouchScreenModeForNx.cs b/src/Ryujinx.Horizon/Sdk/Hid/TouchScreenModeForNx.cs new file mode 100644 index 0000000000..9737fc1e55 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/TouchScreenModeForNx.cs @@ -0,0 +1,9 @@ +namespace Ryujinx.Horizon.Sdk.Hid +{ + enum TouchScreenModeForNx : byte + { + UseSystemSetting = 0, + Finger = 1, + Heat2 = 2 + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Vibration/IActiveVibrationDeviceList.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/IActiveVibrationDeviceList.cs new file mode 100644 index 0000000000..7d44126828 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/IActiveVibrationDeviceList.cs @@ -0,0 +1,10 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Sdk.Hid.Vibration +{ + interface IActiveVibrationDeviceList : IServiceObject + { + Result ActivateVibrationDevice(VibrationDeviceHandle vibrationDeviceHandle); + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceHandle.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceHandle.cs new file mode 100644 index 0000000000..434a4cf452 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceHandle.cs @@ -0,0 +1,12 @@ +using Ryujinx.Horizon.Sdk.Hid.Npad; + +namespace Ryujinx.Horizon.Sdk.Hid.Vibration +{ + public struct VibrationDeviceHandle + { + public NpadStyleIndex DeviceType; + public NpadIdType PlayerId; + public byte Position; + public byte Reserved; + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceInfoForIpc.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceInfoForIpc.cs new file mode 100644 index 0000000000..6c28c1ad9a --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceInfoForIpc.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Hid.Vibration +{ + [StructLayout(LayoutKind.Sequential, Size = 0x8)] + struct VibrationDeviceInfoForIpc + { + public VibrationDeviceType DeviceType; + public VibrationDevicePosition Position; + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDevicePosition.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDevicePosition.cs new file mode 100644 index 0000000000..e6634455fd --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDevicePosition.cs @@ -0,0 +1,9 @@ +namespace Ryujinx.Horizon.Sdk.Hid.Vibration +{ + enum VibrationDevicePosition + { + None = 0, + Left = 1, + Right = 2 + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceType.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceType.cs new file mode 100644 index 0000000000..9b960dcbb4 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationDeviceType.cs @@ -0,0 +1,10 @@ +namespace Ryujinx.Horizon.Sdk.Hid.Vibration +{ + enum VibrationDeviceType + { + Unknown = 0, + LinearResonantActuator = 1, + GcErm = 2, + Erm = 3 + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationGcErmCommand.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationGcErmCommand.cs new file mode 100644 index 0000000000..8f51998fad --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationGcErmCommand.cs @@ -0,0 +1,12 @@ +namespace Ryujinx.Horizon.Sdk.Hid.Vibration +{ + enum VibrationGcErmCommand + { + // Stops the vibration with a decay phase. + Stop = 0, + // Starts the vibration. + Start = 1, + // Stops the vibration immediately, with no decay phase. + StopHard = 2 + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationValue.cs b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationValue.cs similarity index 95% rename from src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationValue.cs rename to src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationValue.cs index 490d1e6ab2..5592d64999 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/Types/Vibration/VibrationValue.cs +++ b/src/Ryujinx.Horizon/Sdk/Hid/Vibration/VibrationValue.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.HLE.HOS.Services.Hid +namespace Ryujinx.Horizon.Sdk.Hid.Vibration { public struct VibrationValue { diff --git a/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs b/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs new file mode 100644 index 0000000000..2ac07193c4 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs @@ -0,0 +1,30 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Sf; +using System; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + interface IIrSensorServer : IServiceObject + { + Result ActivateIrsensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result DeactivateIrsensor(AppletResourceUserId appletResourceUserId, ulong pid); + Result GetIrsensorSharedMemoryHandle(out int arg0, AppletResourceUserId appletResourceUserId, ulong pid); + Result StopImageProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, ulong pid); + Result RunMomentProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedMomentProcessorConfig config, ulong pid); + Result RunClusteringProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedClusteringProcessorConfig config, ulong pid); + Result RunImageTransferProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedImageTransferProcessorConfig config, int arg3, ulong arg4, ulong pid); + Result GetImageTransferProcessorState(AppletResourceUserId appletResourceUserId, out ImageTransferProcessorState imageTransferProcessorState, Span imageTransferBuffer, IrCameraHandle irCameraHandle, ulong pid); + Result RunTeraPluginProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedTeraPluginProcessorConfig config, ulong pid); + Result GetNpadIrCameraHandle(out IrCameraHandle irCameraHandle, NpadIdType npadIdType); + Result RunPointingProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedPointingProcessorConfig config, ulong pid); + Result SuspendImageProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, ulong pid); + Result CheckFirmwareVersion(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedMcuVersion mcuVersion, ulong pid); + Result SetFunctionLevel(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedFunctionLevel functionLevel, ulong pid); + Result RunImageTransferExProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedImageTransferProcessorExConfig config, int arg3, ulong arg4, ulong pid); + Result RunIrLedProcessor(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, PackedIrLedProcessorConfig config, ulong pid); + Result StopImageProcessorAsync(AppletResourceUserId appletResourceUserId, IrCameraHandle irCameraHandle, ulong pid); + Result ActivateIrsensorWithFunctionLevel(AppletResourceUserId appletResourceUserId, PackedFunctionLevel functionLevel, ulong pid); + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorSystemServer.cs b/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorSystemServer.cs new file mode 100644 index 0000000000..5736d975a4 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorSystemServer.cs @@ -0,0 +1,14 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Applet; +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + interface IIrSensorSystemServer : IServiceObject + { + Result SetAppletResourceUserId(AppletResourceUserId appletResourceUserId); + Result RegisterAppletResourceUserId(AppletResourceUserId appletResourceUserId, bool arg1); + Result UnregisterAppletResourceUserId(AppletResourceUserId appletResourceUserId); + Result EnableAppletToGetInput(AppletResourceUserId appletResourceUserId, bool arg1); + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/ImageTransferProcessorState.cs b/src/Ryujinx.Horizon/Sdk/Irs/ImageTransferProcessorState.cs similarity index 83% rename from src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/ImageTransferProcessorState.cs rename to src/Ryujinx.Horizon/Sdk/Irs/ImageTransferProcessorState.cs index 76a07f797d..6a3a0d587b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/ImageTransferProcessorState.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/ImageTransferProcessorState.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types +namespace Ryujinx.Horizon.Sdk.Irs { [StructLayout(LayoutKind.Sequential, Size = 0x10)] struct ImageTransferProcessorState diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/IrCameraHandle.cs b/src/Ryujinx.Horizon/Sdk/Irs/IrCameraHandle.cs similarity index 82% rename from src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/IrCameraHandle.cs rename to src/Ryujinx.Horizon/Sdk/Irs/IrCameraHandle.cs index a15e445c7d..e58a592004 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/IrCameraHandle.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/IrCameraHandle.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types +namespace Ryujinx.Horizon.Sdk.Irs { [StructLayout(LayoutKind.Sequential, Size = 0x4)] struct IrCameraHandle diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedClusteringProcessorConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedClusteringProcessorConfig.cs similarity index 89% rename from src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedClusteringProcessorConfig.cs rename to src/Ryujinx.Horizon/Sdk/Irs/PackedClusteringProcessorConfig.cs index d12513fab0..5279a6c26e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedClusteringProcessorConfig.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedClusteringProcessorConfig.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types +namespace Ryujinx.Horizon.Sdk.Irs { [StructLayout(LayoutKind.Sequential, Size = 0x28)] struct PackedClusteringProcessorConfig @@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types public ushort WindowOfInterestY; public ushort WindowOfInterestWidth; public ushort WindowOfInterestHeight; - public uint RequiredMcuVersion; + public PackedMcuVersion RequiredMcuVersion; public uint ObjectPixelCountMin; public uint ObjectPixelCountMax; public byte ObjectIntensityMin; diff --git a/src/Ryujinx.Horizon/Sdk/Irs/PackedFunctionLevel.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedFunctionLevel.cs new file mode 100644 index 0000000000..25dfee9ae0 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedFunctionLevel.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + [StructLayout(LayoutKind.Sequential, Size = 0x4)] + struct PackedFunctionLevel + { + public byte IrSensorFunctionLevel; + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedImageTransferProcessorConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedImageTransferProcessorConfig.cs similarity index 83% rename from src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedImageTransferProcessorConfig.cs rename to src/Ryujinx.Horizon/Sdk/Irs/PackedImageTransferProcessorConfig.cs index 0bc709f207..3a02354ae3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedImageTransferProcessorConfig.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedImageTransferProcessorConfig.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types +namespace Ryujinx.Horizon.Sdk.Irs { [StructLayout(LayoutKind.Sequential, Size = 0x18)] struct PackedImageTransferProcessorConfig @@ -11,7 +11,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types public byte IsNegativeImageUsed; public byte Reserved1; public uint Reserved2; - public uint RequiredMcuVersion; + public PackedMcuVersion RequiredMcuVersion; public byte Format; public byte Reserved3; public ushort Reserved4; diff --git a/src/Ryujinx.Horizon/Sdk/Irs/PackedImageTransferProcessorExConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedImageTransferProcessorExConfig.cs new file mode 100644 index 0000000000..5d29fe8c37 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedImageTransferProcessorExConfig.cs @@ -0,0 +1,20 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + [StructLayout(LayoutKind.Sequential, Size = 0x20)] + struct PackedImageTransferProcessorExConfig + { + public long ExposureTime; + public byte LightTarget; + public byte Gain; + public byte IsNegativeImageUsed; + public byte Reserved1; + public PackedMcuVersion RequiredMcuVersion; + public byte OrigFormat; + public byte TrimmingFormat; + public ushort TrimmingStartX; + public ushort TrimmingStartY; + public byte IsExternalLightFilterEnabled; + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Irs/PackedIrLedProcessorConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedIrLedProcessorConfig.cs new file mode 100644 index 0000000000..2f05f46db3 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedIrLedProcessorConfig.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + [StructLayout(LayoutKind.Sequential, Size = 0x8)] + struct PackedIrLedProcessorConfig + { + public PackedMcuVersion RequiredMcuVersion; + public byte LightTarget; + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Irs/PackedMcuVersion.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedMcuVersion.cs new file mode 100644 index 0000000000..fb4480cd36 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedMcuVersion.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + [StructLayout(LayoutKind.Sequential, Size = 0x4)] + public struct PackedMcuVersion + { + public short MajorVersion; + public short MinorVersion; + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedMomentProcessorConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedMomentProcessorConfig.cs similarity index 87% rename from src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedMomentProcessorConfig.cs rename to src/Ryujinx.Horizon/Sdk/Irs/PackedMomentProcessorConfig.cs index f1905ee3a5..62b195e12e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedMomentProcessorConfig.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedMomentProcessorConfig.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types +namespace Ryujinx.Horizon.Sdk.Irs { [StructLayout(LayoutKind.Sequential, Size = 0x20)] struct PackedMomentProcessorConfig @@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types public ushort WindowOfInterestY; public ushort WindowOfInterestWidth; public ushort WindowOfInterestHeight; - public uint RequiredMcuVersion; + public PackedMcuVersion RequiredMcuVersion; public byte Preprocess; public byte PreprocessIntensityThreshold; public ushort Reserved3; diff --git a/src/Ryujinx.Horizon/Sdk/Irs/PackedPointingProcessorConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedPointingProcessorConfig.cs new file mode 100644 index 0000000000..a7efd5cd25 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedPointingProcessorConfig.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Horizon.Sdk.Irs +{ + [StructLayout(LayoutKind.Sequential, Size = 0x20)] + struct PackedPointingProcessorConfig + { + public ushort WindowOfInterestX; + public ushort WindowOfInterestY; + public ushort WindowOfInterestWidth; + public ushort WindowOfInterestHeight; + public PackedMcuVersion RequiredMcuVersion; + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedTeraPluginProcessorConfig.cs b/src/Ryujinx.Horizon/Sdk/Irs/PackedTeraPluginProcessorConfig.cs similarity index 75% rename from src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedTeraPluginProcessorConfig.cs rename to src/Ryujinx.Horizon/Sdk/Irs/PackedTeraPluginProcessorConfig.cs index 1cc2533a28..34b575d987 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/Types/PackedTeraPluginProcessorConfig.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/PackedTeraPluginProcessorConfig.cs @@ -1,11 +1,11 @@ using System.Runtime.InteropServices; -namespace Ryujinx.HLE.HOS.Services.Hid.Irs.Types +namespace Ryujinx.Horizon.Sdk.Irs { [StructLayout(LayoutKind.Sequential, Size = 0x8)] struct PackedTeraPluginProcessorConfig { - public uint RequiredMcuVersion; + public PackedMcuVersion RequiredMcuVersion; public byte Mode; public byte Unknown1; public byte Unknown2; diff --git a/src/Ryujinx.Horizon/ServiceTable.cs b/src/Ryujinx.Horizon/ServiceTable.cs index 28c43a716f..2e6ebb3fcc 100644 --- a/src/Ryujinx.Horizon/ServiceTable.cs +++ b/src/Ryujinx.Horizon/ServiceTable.cs @@ -2,8 +2,10 @@ using Ryujinx.Horizon.Arp; using Ryujinx.Horizon.Audio; using Ryujinx.Horizon.Bcat; using Ryujinx.Horizon.Friends; +using Ryujinx.Horizon.Hid; using Ryujinx.Horizon.Hshl; using Ryujinx.Horizon.Ins; +using Ryujinx.Horizon.Irs; using Ryujinx.Horizon.Lbl; using Ryujinx.Horizon.LogManager; using Ryujinx.Horizon.MmNv; @@ -58,6 +60,8 @@ namespace Ryujinx.Horizon RegisterService(); RegisterService(); RegisterService(); + RegisterService(); + RegisterService(); _totalServices = entries.Count; diff --git a/src/Ryujinx.Input/HLE/NpadController.cs b/src/Ryujinx.Input/HLE/NpadController.cs index 3807452838..6c25a2923b 100644 --- a/src/Ryujinx.Input/HLE/NpadController.cs +++ b/src/Ryujinx.Input/HLE/NpadController.cs @@ -4,6 +4,10 @@ using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Controller.Motion; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.Horizon.Sdk.Hid; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Hid.SixAxis; +using Ryujinx.Horizon.Sdk.Hid.Vibration; using System; using System.Collections.Concurrent; using System.Numerics; diff --git a/src/Ryujinx.Input/HLE/NpadManager.cs b/src/Ryujinx.Input/HLE/NpadManager.cs index 1dc87358d5..7838e7fb56 100644 --- a/src/Ryujinx.Input/HLE/NpadManager.cs +++ b/src/Ryujinx.Input/HLE/NpadManager.cs @@ -1,7 +1,11 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Keyboard; -using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.Horizon; +using Ryujinx.Horizon.Sdk.Hid; +using Ryujinx.Horizon.Sdk.Hid.HidDevices; +using Ryujinx.Horizon.Sdk.Hid.Npad; +using Ryujinx.Horizon.Sdk.Hid.SixAxis; using System; using System.Collections.Generic; using System.Diagnostics; @@ -9,7 +13,7 @@ using System.Linq; using System.Runtime.CompilerServices; using CemuHookClient = Ryujinx.Input.Motion.CemuHook.Client; using ControllerType = Ryujinx.Common.Configuration.Hid.ControllerType; -using PlayerIndex = Ryujinx.HLE.HOS.Services.Hid.PlayerIndex; +using PlayerIndex = Ryujinx.Horizon.Sdk.Hid.Npad.PlayerIndex; using Switch = Ryujinx.HLE.Switch; namespace Ryujinx.Input.HLE @@ -63,7 +67,7 @@ namespace Ryujinx.Input.HLE } } - _device.Hid.RefreshInputConfig(validInputs); + HorizonStatic.Hid.RefreshInputConfig(validInputs); } } @@ -166,7 +170,7 @@ namespace Ryujinx.Input.HLE _enableKeyboard = enableKeyboard; _enableMouse = enableMouse; - _device.Hid.RefreshInputConfig(validInputs); + HorizonStatic.Hid.RefreshInputConfig(validInputs); } } @@ -225,11 +229,11 @@ namespace Ryujinx.Input.HLE controller.UpdateUserConfiguration(inputConfig); controller.Update(); - controller.UpdateRumble(_device.Hid.Npads.GetRumbleQueue(playerIndex)); + controller.UpdateRumble(HorizonStatic.Hid.Npads.GetRumbleQueue((NpadIdType)playerIndex)); inputState = controller.GetHLEInputState(); - inputState.Buttons |= _device.Hid.UpdateStickButtons(inputState.LStick, inputState.RStick); + inputState.Buttons |= HorizonStatic.Hid.UpdateStickButtons(inputState.LStick, inputState.RStick); isJoyconPair = inputConfig.ControllerType == ControllerType.JoyconPair; @@ -262,12 +266,12 @@ namespace Ryujinx.Input.HLE hleKeyboardInput = NpadController.GetHLEKeyboardInput(_keyboardDriver); } - _device.Hid.Npads.Update(hleInputStates); - _device.Hid.Npads.UpdateSixAxis(hleMotionStates); + HorizonStatic.Hid.Npads.Update(hleInputStates); + HorizonStatic.Hid.Npads.UpdateSixAxis(hleMotionStates); if (hleKeyboardInput.HasValue) { - _device.Hid.Keyboard.Update(hleKeyboardInput.Value); + HorizonStatic.Hid.Keyboard.Update(hleKeyboardInput.Value); } if (_enableMouse) @@ -305,11 +309,11 @@ namespace Ryujinx.Input.HLE var position = IMouse.GetScreenPosition(mouseInput.Position, mouse.ClientSize, aspectRatio); - _device.Hid.Mouse.Update((int)position.X, (int)position.Y, buttons, (int)mouseInput.Scroll.X, (int)mouseInput.Scroll.Y, true); + HorizonStatic.Hid.Mouse.Update((int)position.X, (int)position.Y, buttons, (int)mouseInput.Scroll.X, (int)mouseInput.Scroll.Y, true); } else { - _device.Hid.Mouse.Update(0, 0); + HorizonStatic.Hid.Mouse.Update(0, 0); } _device.TamperMachine.UpdateInput(hleInputStates); diff --git a/src/Ryujinx.Input/HLE/TouchScreenManager.cs b/src/Ryujinx.Input/HLE/TouchScreenManager.cs index c613f9281b..44bcd546af 100644 --- a/src/Ryujinx.Input/HLE/TouchScreenManager.cs +++ b/src/Ryujinx.Input/HLE/TouchScreenManager.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE; -using Ryujinx.HLE.HOS.Services.Hid; -using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; +using Ryujinx.Horizon; +using Ryujinx.Horizon.Sdk.Hid; using System; namespace Ryujinx.Input.HLE @@ -8,7 +8,6 @@ namespace Ryujinx.Input.HLE public class TouchScreenManager : IDisposable { private readonly IMouse _mouse; - private Switch _device; private bool _wasClicking; public TouchScreenManager(IMouse mouse) @@ -16,11 +15,6 @@ namespace Ryujinx.Input.HLE _mouse = mouse; } - public void Initialize(Switch device) - { - _device = device; - } - public bool Update(bool isFocused, bool isClicking = false, float aspectRatio = 0) { if (!isFocused || (!_wasClicking && !isClicking)) @@ -44,13 +38,12 @@ namespace Ryujinx.Input.HLE Angle = 90, }; - _device.Hid.Touchscreen.Update(currentPoint); - + HorizonStatic.Hid.Touchscreen.Update(currentPoint); } _wasClicking = false; - _device.Hid.Touchscreen.Update(); + HorizonStatic.Hid.Touchscreen.Update(); return false; } @@ -84,7 +77,7 @@ namespace Ryujinx.Input.HLE Angle = 90, }; - _device.Hid.Touchscreen.Update(currentPoint); + HorizonStatic.Hid.Touchscreen.Update(currentPoint); _wasClicking = isClicking; diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index f4bfd1169e..c231e6cea8 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -33,6 +33,7 @@ using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; +using Ryujinx.Horizon; using Ryujinx.Input; using Ryujinx.Input.HLE; using Ryujinx.UI.App.Common; @@ -414,7 +415,6 @@ namespace Ryujinx.Ava DisplaySleep.Prevent(); NpadManager.Initialize(Device, ConfigurationState.Instance.Hid.InputConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); - TouchScreenManager.Initialize(Device); _viewModel.IsGameRunning = true; @@ -1225,10 +1225,10 @@ namespace Ryujinx.Ava if (!hasTouch) { - Device.Hid.Touchscreen.Update(); + HorizonStatic.Hid.Touchscreen.Update(); } - Device.Hid.DebugPad.Update(); + HorizonStatic.Hid.DebugPad.Update(); return true; } diff --git a/src/Ryujinx/UI/Applet/ControllerAppletDialog.axaml.cs b/src/Ryujinx/UI/Applet/ControllerAppletDialog.axaml.cs index 6b999b1f44..4e89293d0b 100644 --- a/src/Ryujinx/UI/Applet/ControllerAppletDialog.axaml.cs +++ b/src/Ryujinx/UI/Applet/ControllerAppletDialog.axaml.cs @@ -8,7 +8,7 @@ using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; using Ryujinx.Common; using Ryujinx.HLE.HOS.Applets; -using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.Horizon.Sdk.Hid.Npad; using System.Linq; using System.Threading.Tasks; @@ -46,10 +46,10 @@ namespace Ryujinx.Ava.UI.Applet PlayerCount = $"{args.PlayerCountMin} - {args.PlayerCountMax}"; } - SupportsProController = (args.SupportedStyles & ControllerType.ProController) != 0; - SupportsLeftJoycon = (args.SupportedStyles & ControllerType.JoyconLeft) != 0; - SupportsRightJoycon = (args.SupportedStyles & ControllerType.JoyconRight) != 0; - SupportsJoyconPair = (args.SupportedStyles & ControllerType.JoyconPair) != 0; + SupportsProController = (args.SupportedStyles & NpadStyleIndex.FullKey) != 0; + SupportsLeftJoycon = (args.SupportedStyles & NpadStyleIndex.JoyLeft) != 0; + SupportsRightJoycon = (args.SupportedStyles & NpadStyleIndex.JoyRight) != 0; + SupportsJoyconPair = (args.SupportedStyles & NpadStyleIndex.JoyDual) != 0; IsDocked = args.IsDocked;