Răsfoiți Sursa

irs: Little service cleanup (#712)

* irs: Little service cleanup

* more cleanup

* Fix nit

* Fix condition
Ac_K 6 ani în urmă
părinte
comite
a8965aad97

+ 27 - 0
Ryujinx.HLE/HOS/Services/Hid/HidUtils.cs

@@ -0,0 +1,27 @@
+using Ryujinx.HLE.Input;
+using System;
+
+namespace Ryujinx.HLE.HOS.Services.Hid
+{
+    static class HidUtils
+    {
+        public static HidControllerId GetIndexFromNpadIdType(NpadIdType npadIdType)
+        {
+            switch (npadIdType)
+            {
+                case NpadIdType.Player1:  return HidControllerId.ControllerPlayer1;
+                case NpadIdType.Player2:  return HidControllerId.ControllerPlayer2;
+                case NpadIdType.Player3:  return HidControllerId.ControllerPlayer3;
+                case NpadIdType.Player4:  return HidControllerId.ControllerPlayer4;
+                case NpadIdType.Player5:  return HidControllerId.ControllerPlayer5;
+                case NpadIdType.Player6:  return HidControllerId.ControllerPlayer6;
+                case NpadIdType.Player7:  return HidControllerId.ControllerPlayer7;
+                case NpadIdType.Player8:  return HidControllerId.ControllerPlayer8;
+                case NpadIdType.Handheld: return HidControllerId.ControllerHandheld;
+                case NpadIdType.Unknown:  return HidControllerId.ControllerUnknown;
+
+                default: throw new ArgumentOutOfRangeException(nameof(npadIdType));
+            }
+        }
+    }
+}

+ 34 - 41
Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs → Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs

@@ -1,33 +1,43 @@
 using Ryujinx.Common.Logging;
-using Ryujinx.HLE.Exceptions;
 using Ryujinx.HLE.HOS.Ipc;
 using Ryujinx.HLE.HOS.Kernel.Common;
-using Ryujinx.HLE.HOS.Kernel.Memory;
+using Ryujinx.HLE.Input;
 using System;
 using System.Collections.Generic;
 
-namespace Ryujinx.HLE.HOS.Services.Irs
+namespace Ryujinx.HLE.HOS.Services.Hid.Irs
 {
     class IIrSensorServer : IpcService
     {
+        private int _irsensorSharedMemoryHandle = 0;
+
         private Dictionary<int, ServiceProcessRequest> _commands;
 
         public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
 
-        private KSharedMemory _irsSharedMem;
-
-        public IIrSensorServer(KSharedMemory irsSharedMem)
+        public IIrSensorServer()
         {
             _commands = new Dictionary<int, ServiceProcessRequest>
             {
                 { 302, ActivateIrsensor                  },
                 { 303, DeactivateIrsensor                },
                 { 304, GetIrsensorSharedMemoryHandle     },
+              //{ 305, StopImageProcessor                },
+              //{ 306, RunMomentProcessor                },
+              //{ 307, RunClusteringProcessor            },
+              //{ 308, RunImageTransferProcessor         },
+              //{ 309, GetImageTransferProcessorState    },
+              //{ 310, RunTeraPluginProcessor            },
                 { 311, GetNpadIrCameraHandle             },
-                { 319, ActivateIrsensorWithFunctionLevel }
+              //{ 312, RunPointingProcessor              },
+              //{ 313, SuspendImageProcessor             },
+              //{ 314, CheckFirmwareVersion              }, // 3.0.0+
+              //{ 315, SetFunctionLevel                  }, // 4.0.0+
+              //{ 316, RunImageTransferExProcessor       }, // 4.0.0+
+              //{ 317, RunIrLedProcessor                 }, // 4.0.0+
+              //{ 318, StopImageProcessorAsync           }, // 4.0.0+
+                { 319, ActivateIrsensorWithFunctionLevel }, // 4.0.0+
             };
-
-            _irsSharedMem = irsSharedMem;
         }
 
         // ActivateIrsensor(nn::applet::AppletResourceUserId, pid)
@@ -53,14 +63,15 @@ namespace Ryujinx.HLE.HOS.Services.Irs
         // GetIrsensorSharedMemoryHandle(nn::applet::AppletResourceUserId, pid) -> handle<copy>
         public long GetIrsensorSharedMemoryHandle(ServiceCtx context)
         {
-            var handleTable = context.Process.HandleTable;
-
-            if (handleTable.GenerateHandle(_irsSharedMem, out int handle) != KernelResult.Success)
+            if (_irsensorSharedMemoryHandle == 0)
             {
-                throw new InvalidOperationException("Out of handles!");
+                if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _irsensorSharedMemoryHandle) != KernelResult.Success)
+                {
+                    throw new InvalidOperationException("Out of handles!");
+                }
             }
 
-            context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
+            context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_irsensorSharedMemoryHandle);
 
             return 0;
         }
@@ -68,43 +79,25 @@ namespace Ryujinx.HLE.HOS.Services.Irs
         // GetNpadIrCameraHandle(u32) -> nn::irsensor::IrCameraHandle
         public long GetNpadIrCameraHandle(ServiceCtx context)
         {
-            uint npadId = context.RequestData.ReadUInt32();
+            NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadUInt32();
 
-            if (npadId >= 8 && npadId != 16 && npadId != 32)
+            if (npadIdType >  NpadIdType.Player8 && 
+                npadIdType != NpadIdType.Unknown && 
+                npadIdType != NpadIdType.Handheld)
             {
-                return ErrorCode.MakeError(ErrorModule.Hid, 0x2c5);
+                return ErrorCode.MakeError(ErrorModule.Irsensor, IrsError.NpadIdOutOfRange);
             }
 
-            if (((1 << (int)npadId) & 0x1000100FF) == 0)
-            {
-                return ErrorCode.MakeError(ErrorModule.Hid, 0x2c5);
-            }
+            HidControllerId irCameraHandle = HidUtils.GetIndexFromNpadIdType(npadIdType);
 
-            int npadTypeId = GetNpadTypeId(npadId);
+            context.ResponseData.Write((int)irCameraHandle);
 
-            context.ResponseData.Write(npadTypeId);
+            // NOTE: If the irCameraHandle pointer is null this error is returned, Doesn't occur in our case. 
+            //       return ErrorCode.MakeError(ErrorModule.Irsensor, IrsError.HandlePointerIsNull);
 
             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));
-            }
-        }
-
         // ActivateIrsensorWithFunctionLevel(nn::applet::AppletResourceUserId, nn::irsensor::PackedFunctionLevel, pid)
         public long ActivateIrsensorWithFunctionLevel(ServiceCtx context)
         {

+ 8 - 0
Ryujinx.HLE/HOS/Services/Hid/Irs/IrsError.cs

@@ -0,0 +1,8 @@
+namespace Ryujinx.HLE.HOS.Services.Hid.Irs
+{
+    static class IrsError
+    {
+        public const int HandlePointerIsNull = 212;
+        public const int NpadIdOutOfRange    = 709;
+    }
+}

+ 16 - 0
Ryujinx.HLE/HOS/Services/Hid/NpadIdType.cs

@@ -0,0 +1,16 @@
+namespace Ryujinx.HLE.HOS.Services.Hid
+{
+    public enum NpadIdType
+    {
+        Player1  = 0,
+        Player2  = 1,
+        Player3  = 2,
+        Player4  = 3,
+        Player5  = 4,
+        Player6  = 5,
+        Player7  = 6,
+        Player8  = 7,
+        Unknown  = 16,
+        Handheld = 32
+    }
+}

+ 2 - 2
Ryujinx.HLE/HOS/Services/ServiceFactory.cs

@@ -8,7 +8,7 @@ using Ryujinx.HLE.HOS.Services.Caps;
 using Ryujinx.HLE.HOS.Services.Es;
 using Ryujinx.HLE.HOS.Services.FspSrv;
 using Ryujinx.HLE.HOS.Services.Hid;
-using Ryujinx.HLE.HOS.Services.Irs;
+using Ryujinx.HLE.HOS.Services.Hid.Irs;
 using Ryujinx.HLE.HOS.Services.Ldr;
 using Ryujinx.HLE.HOS.Services.Lm;
 using Ryujinx.HLE.HOS.Services.Mm;
@@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Services
                     return new IHidServer(system);
 
                 case "irs":
-                    return new IIrSensorServer(system.IirsSharedMem);
+                    return new IIrSensorServer();
 
                 case "ldr:ro":
                     return new IRoInterface();