IIrSensorServer.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using Ryujinx.Common;
  2. using Ryujinx.Common.Logging;
  3. using Ryujinx.HLE.HOS.Ipc;
  4. using Ryujinx.HLE.HOS.Kernel.Common;
  5. using Ryujinx.HLE.HOS.Services.Hid.HidServer;
  6. using Ryujinx.HLE.HOS.Services.Hid.Irs.Types;
  7. using System;
  8. namespace Ryujinx.HLE.HOS.Services.Hid.Irs
  9. {
  10. [Service("irs")]
  11. class IIrSensorServer : IpcService
  12. {
  13. private int _irsensorSharedMemoryHandle = 0;
  14. public IIrSensorServer(ServiceCtx context) { }
  15. [CommandHipc(302)]
  16. // ActivateIrsensor(nn::applet::AppletResourceUserId, pid)
  17. public ResultCode ActivateIrsensor(ServiceCtx context)
  18. {
  19. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  20. // NOTE: This seems to initialize the shared memory for irs service.
  21. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId });
  22. return ResultCode.Success;
  23. }
  24. [CommandHipc(303)]
  25. // DeactivateIrsensor(nn::applet::AppletResourceUserId, pid)
  26. public ResultCode DeactivateIrsensor(ServiceCtx context)
  27. {
  28. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  29. // NOTE: This seems to deinitialize the shared memory for irs service.
  30. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId });
  31. return ResultCode.Success;
  32. }
  33. [CommandHipc(304)]
  34. // GetIrsensorSharedMemoryHandle(nn::applet::AppletResourceUserId, pid) -> handle<copy>
  35. public ResultCode GetIrsensorSharedMemoryHandle(ServiceCtx context)
  36. {
  37. // NOTE: Shared memory should use the appletResourceUserId.
  38. // ulong appletResourceUserId = context.RequestData.ReadUInt64();
  39. if (_irsensorSharedMemoryHandle == 0)
  40. {
  41. if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _irsensorSharedMemoryHandle) != KernelResult.Success)
  42. {
  43. throw new InvalidOperationException("Out of handles!");
  44. }
  45. }
  46. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_irsensorSharedMemoryHandle);
  47. return ResultCode.Success;
  48. }
  49. [CommandHipc(305)]
  50. // StopImageProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId)
  51. public ResultCode StopImageProcessor(ServiceCtx context)
  52. {
  53. IrCameraHandle irCameraHandle = context.RequestData.ReadStruct<IrCameraHandle>();
  54. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  55. CheckCameraHandle(irCameraHandle);
  56. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType });
  57. return ResultCode.Success;
  58. }
  59. [CommandHipc(306)]
  60. // RunMomentProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedMomentProcessorConfig)
  61. public ResultCode RunMomentProcessor(ServiceCtx context)
  62. {
  63. IrCameraHandle irCameraHandle = context.RequestData.ReadStruct<IrCameraHandle>();
  64. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  65. var packedMomentProcessorConfig = context.RequestData.ReadStruct<PackedMomentProcessorConfig>();
  66. CheckCameraHandle(irCameraHandle);
  67. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedMomentProcessorConfig.ExposureTime });
  68. return ResultCode.Success;
  69. }
  70. [CommandHipc(307)]
  71. // RunClusteringProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedClusteringProcessorConfig)
  72. public ResultCode RunClusteringProcessor(ServiceCtx context)
  73. {
  74. IrCameraHandle irCameraHandle = context.RequestData.ReadStruct<IrCameraHandle>();
  75. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  76. var packedClusteringProcessorConfig = context.RequestData.ReadStruct<PackedClusteringProcessorConfig>();
  77. CheckCameraHandle(irCameraHandle);
  78. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedClusteringProcessorConfig.ExposureTime });
  79. return ResultCode.Success;
  80. }
  81. [CommandHipc(308)]
  82. // RunImageTransferProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedImageTransferProcessorConfig, u64 TransferMemorySize, TransferMemoryHandle)
  83. public ResultCode RunImageTransferProcessor(ServiceCtx context)
  84. {
  85. IrCameraHandle irCameraHandle = context.RequestData.ReadStruct<IrCameraHandle>();
  86. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  87. var packedImageTransferProcessorConfig = context.RequestData.ReadStruct<PackedImageTransferProcessorConfig>();
  88. CheckCameraHandle(irCameraHandle);
  89. // TODO: Handle the Transfer Memory.
  90. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedImageTransferProcessorConfig.ExposureTime });
  91. return ResultCode.Success;
  92. }
  93. [CommandHipc(309)]
  94. // GetImageTransferProcessorState(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId)
  95. public ResultCode GetImageTransferProcessorState(ServiceCtx context)
  96. {
  97. IrCameraHandle irCameraHandle = context.RequestData.ReadStruct<IrCameraHandle>();
  98. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  99. // ulong imageTransferBufferAddress = context.Request.ReceiveBuff[0].Position;
  100. ulong imageTransferBufferSize = context.Request.ReceiveBuff[0].Size;
  101. if (imageTransferBufferSize == 0)
  102. {
  103. return ResultCode.InvalidBufferSize;
  104. }
  105. CheckCameraHandle(irCameraHandle);
  106. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType });
  107. // TODO: Uses the buffer to copy the JoyCon IR data (by using a JoyCon driver) and update the following struct.
  108. context.ResponseData.WriteStruct(new ImageTransferProcessorState()
  109. {
  110. SamplingNumber = 0,
  111. AmbientNoiseLevel = 0
  112. });
  113. return ResultCode.Success;
  114. }
  115. [CommandHipc(310)]
  116. // RunTeraPluginProcessor(pid, nn::irsensor::IrCameraHandle, nn::applet::AppletResourceUserId, PackedTeraPluginProcessorConfig)
  117. public ResultCode RunTeraPluginProcessor(ServiceCtx context)
  118. {
  119. IrCameraHandle irCameraHandle = context.RequestData.ReadStruct<IrCameraHandle>();
  120. ulong appletResourceUserId = context.RequestData.ReadUInt64();
  121. var packedTeraPluginProcessorConfig = context.RequestData.ReadStruct<PackedTeraPluginProcessorConfig>();
  122. CheckCameraHandle(irCameraHandle);
  123. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle.PlayerNumber, irCameraHandle.DeviceType, packedTeraPluginProcessorConfig.RequiredMcuVersion });
  124. return ResultCode.Success;
  125. }
  126. [CommandHipc(311)]
  127. // GetNpadIrCameraHandle(u32) -> nn::irsensor::IrCameraHandle
  128. public ResultCode GetNpadIrCameraHandle(ServiceCtx context)
  129. {
  130. NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadUInt32();
  131. if (npadIdType > NpadIdType.Player8 &&
  132. npadIdType != NpadIdType.Unknown &&
  133. npadIdType != NpadIdType.Handheld)
  134. {
  135. return ResultCode.NpadIdOutOfRange;
  136. }
  137. PlayerIndex irCameraHandle = HidUtils.GetIndexFromNpadIdType(npadIdType);
  138. context.ResponseData.Write((int)irCameraHandle);
  139. // NOTE: If the irCameraHandle pointer is null this error is returned, Doesn't occur in our case.
  140. // return ResultCode.HandlePointerIsNull;
  141. return ResultCode.Success;
  142. }
  143. [CommandHipc(314)] // 3.0.0+
  144. // CheckFirmwareVersion(nn::irsensor::IrCameraHandle, nn::irsensor::PackedMcuVersion, nn::applet::AppletResourceUserId, pid)
  145. public ResultCode CheckFirmwareVersion(ServiceCtx context)
  146. {
  147. int irCameraHandle = context.RequestData.ReadInt32();
  148. short packedMcuVersionMajor = context.RequestData.ReadInt16();
  149. short packedMcuVersionMinor = context.RequestData.ReadInt16();
  150. long appletResourceUserId = context.RequestData.ReadInt64();
  151. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, irCameraHandle, packedMcuVersionMajor, packedMcuVersionMinor });
  152. return ResultCode.Success;
  153. }
  154. [CommandHipc(319)] // 4.0.0+
  155. // ActivateIrsensorWithFunctionLevel(nn::applet::AppletResourceUserId, nn::irsensor::PackedFunctionLevel, pid)
  156. public ResultCode ActivateIrsensorWithFunctionLevel(ServiceCtx context)
  157. {
  158. long appletResourceUserId = context.RequestData.ReadInt64();
  159. long packedFunctionLevel = context.RequestData.ReadInt64();
  160. Logger.Stub?.PrintStub(LogClass.ServiceIrs, new { appletResourceUserId, packedFunctionLevel });
  161. return ResultCode.Success;
  162. }
  163. private ResultCode CheckCameraHandle(IrCameraHandle irCameraHandle)
  164. {
  165. if (irCameraHandle.DeviceType == 1 || (PlayerIndex)irCameraHandle.PlayerNumber >= PlayerIndex.Unknown)
  166. {
  167. return ResultCode.InvalidCameraHandle;
  168. }
  169. return ResultCode.Success;
  170. }
  171. }
  172. }