From b7239a6e3e2541d21b05a757804f897e65605364 Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sun, 10 Mar 2024 23:14:56 +0000 Subject: [PATCH] Finish Irs --- .../HOS/Services/Hid/Irs/IIrSensorServer.cs | 139 ------------------ .../HOS/Services/Hid/Irs/ResultCode.cs | 15 -- src/Ryujinx.Horizon/Irs/IrSensorServer.cs | 58 ++++++-- .../Sdk/Irs/IIrSensorServer.cs | 4 +- 4 files changed, 46 insertions(+), 170 deletions(-) delete mode 100644 src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs delete mode 100644 src/Ryujinx.HLE/HOS/Services/Hid/Irs/ResultCode.cs 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 fb0f4fb36..000000000 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs +++ /dev/null @@ -1,139 +0,0 @@ -using Ryujinx.Common; -using Ryujinx.Common.Logging; -using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Services.Hid.HidServer; -using Ryujinx.Horizon.Common; -using Ryujinx.Horizon.Sdk.Hid.Npad; -using System; - -namespace Ryujinx.HLE.HOS.Services.Hid.Irs -{ - [Service("irs")] - class IIrSensorServer : IpcService - { - private int _irsensorSharedMemoryHandle = 0; - - public IIrSensorServer(ServiceCtx context) { } - - [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(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(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/ResultCode.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Irs/ResultCode.cs deleted file mode 100644 index 8cee32cdf..000000000 --- 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.Horizon/Irs/IrSensorServer.cs b/src/Ryujinx.Horizon/Irs/IrSensorServer.cs index a7baf1c54..59737d148 100644 --- a/src/Ryujinx.Horizon/Irs/IrSensorServer.cs +++ b/src/Ryujinx.Horizon/Irs/IrSensorServer.cs @@ -35,8 +35,11 @@ namespace Ryujinx.Horizon.Irs 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 - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + arg0 = 0; + + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id }); return Result.Success; } @@ -84,11 +87,24 @@ namespace Ryujinx.Horizon.Irs } [CmifCommand(309)] - public Result GetImageTransferProcessorState(AppletResourceUserId appletResourceUserId, out ImageTransferProcessorState arg1, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span arg2, IrCameraHandle irCameraHandle, [ClientProcessId] ulong pid) + public Result GetImageTransferProcessorState(AppletResourceUserId appletResourceUserId, out ImageTransferProcessorState imageTransferProcessorState, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span imageTransferBuffer, IrCameraHandle irCameraHandle, [ClientProcessId] ulong pid) { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + // 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; } @@ -98,7 +114,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.RequiredMcuVersion }); return Result.Success; } @@ -106,7 +122,21 @@ namespace Ryujinx.Horizon.Irs [CmifCommand(311)] public Result GetNpadIrCameraHandle(out IrCameraHandle irCameraHandle, NpadIdType npadIdType) { - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + 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; } @@ -116,7 +146,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.RequiredMcuVersion }); return Result.Success; } @@ -126,7 +156,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); return Result.Success; } @@ -136,7 +166,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, mcuVersion.MajorVersion, mcuVersion.MinorVersion }); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, mcuVersion }); return Result.Success; } @@ -146,7 +176,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, functionLevel.IrSensorFunctionLevel }); return Result.Success; } @@ -156,7 +186,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.ExposureTime, arg3, arg4 }); return Result.Success; } @@ -166,7 +196,7 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, config.RequiredMcuVersion }); return Result.Success; } @@ -176,15 +206,15 @@ namespace Ryujinx.Horizon.Irs { CheckCameraHandle(irCameraHandle); - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType }); return Result.Success; } [CmifCommand(319)] - public Result ActivateIrsensorWithFunctionLevel(AppletResourceUserId appletResourceUserId, PackedFunctionLevel arg1, [ClientProcessId] ulong pid) + public Result ActivateIrsensorWithFunctionLevel(AppletResourceUserId appletResourceUserId, PackedFunctionLevel functionLevel, [ClientProcessId] ulong pid) { - Logger.Stub?.PrintStub(LogClass.ServiceIrs); + Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId.Id, functionLevel.IrSensorFunctionLevel }); return Result.Success; } diff --git a/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs b/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs index 0929f1a3c..2ac07193c 100644 --- a/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs +++ b/src/Ryujinx.Horizon/Sdk/Irs/IIrSensorServer.cs @@ -15,7 +15,7 @@ namespace Ryujinx.Horizon.Sdk.Irs 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 arg1, Span arg2, IrCameraHandle irCameraHandle, 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); @@ -25,6 +25,6 @@ namespace Ryujinx.Horizon.Sdk.Irs 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 arg1, ulong pid); + Result ActivateIrsensorWithFunctionLevel(AppletResourceUserId appletResourceUserId, PackedFunctionLevel functionLevel, ulong pid); } }