diff --git a/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs b/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs index e6521c041e..b63f99c846 100644 --- a/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs +++ b/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs @@ -1,5 +1,7 @@ using Ryujinx.Common.Logging; +using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; +using System; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Services.Irs @@ -10,14 +12,13 @@ namespace Ryujinx.HLE.HOS.Services.Irs public override IReadOnlyDictionary Commands => _commands; - private bool _activated; - public IIrSensorServer() { _commands = new Dictionary { - { 302, ActivateIrsensor }, - { 303, DeactivateIrsensor } + { 302, ActivateIrsensor }, + { 303, DeactivateIrsensor }, + { 311, GetNpadIrCameraHandle } }; } @@ -40,5 +41,45 @@ namespace Ryujinx.HLE.HOS.Services.Irs return 0; } + + // GetNpadIrCameraHandle(u32) -> nn::irsensor::IrCameraHandle + public long GetNpadIrCameraHandle(ServiceCtx context) + { + uint npadId = context.RequestData.ReadUInt32(); + + if (npadId >= 8 && npadId != 16 && npadId != 32) + { + return ErrorCode.MakeError(ErrorModule.Hid, 0x2c5); + } + + if (((1 << (int)npadId) & 0x1000100FF) == 0) + { + return ErrorCode.MakeError(ErrorModule.Hid, 0x2c5); + } + + int npadTypeId = GetNpadTypeId(npadId); + + context.ResponseData.Write(npadTypeId); + + return 0; + } + + private int GetNpadTypeId(uint npadId) + { + switch(npadId) + { + case 0: return 0; + case 1: return 1; + case 2: return 2; + case 3: return 3; + case 4: return 4; + case 5: return 5; + case 6: return 6; + case 7: return 7; + case 32: return 8; + case 16: return 9; + default: throw new ArgumentOutOfRangeException(nameof(npadId)); + } + } } } \ No newline at end of file