ICommonStateGetter.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.Ipc;
  3. using Ryujinx.HLE.HOS.Kernel.Common;
  4. using Ryujinx.HLE.HOS.Kernel.Threading;
  5. using System;
  6. namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
  7. {
  8. class ICommonStateGetter : IpcService
  9. {
  10. private Apm.ManagerServer _apmManagerServer;
  11. private Apm.SystemManagerServer _apmSystemManagerServer;
  12. private Lbl.LblControllerServer _lblControllerServer;
  13. private bool _vrModeEnabled = false;
  14. public ICommonStateGetter(ServiceCtx context)
  15. {
  16. _apmManagerServer = new Apm.ManagerServer(context);
  17. _apmSystemManagerServer = new Apm.SystemManagerServer(context);
  18. _lblControllerServer = new Lbl.LblControllerServer(context);
  19. }
  20. [Command(0)]
  21. // GetEventHandle() -> handle<copy>
  22. public ResultCode GetEventHandle(ServiceCtx context)
  23. {
  24. KEvent Event = context.Device.System.AppletState.MessageEvent;
  25. if (context.Process.HandleTable.GenerateHandle(Event.ReadableEvent, out int handle) != KernelResult.Success)
  26. {
  27. throw new InvalidOperationException("Out of handles!");
  28. }
  29. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  30. return ResultCode.Success;
  31. }
  32. [Command(1)]
  33. // ReceiveMessage() -> nn::am::AppletMessage
  34. public ResultCode ReceiveMessage(ServiceCtx context)
  35. {
  36. if (!context.Device.System.AppletState.TryDequeueMessage(out MessageInfo message))
  37. {
  38. return ResultCode.NoMessages;
  39. }
  40. context.ResponseData.Write((int)message);
  41. return ResultCode.Success;
  42. }
  43. [Command(5)]
  44. // GetOperationMode() -> u8
  45. public ResultCode GetOperationMode(ServiceCtx context)
  46. {
  47. OperationMode mode = context.Device.System.State.DockedMode
  48. ? OperationMode.Docked
  49. : OperationMode.Handheld;
  50. context.ResponseData.Write((byte)mode);
  51. return ResultCode.Success;
  52. }
  53. [Command(6)]
  54. // GetPerformanceMode() -> nn::apm::PerformanceMode
  55. public ResultCode GetPerformanceMode(ServiceCtx context)
  56. {
  57. return (ResultCode)_apmManagerServer.GetPerformanceMode(context);
  58. }
  59. [Command(8)]
  60. // GetBootMode() -> u8
  61. public ResultCode GetBootMode(ServiceCtx context)
  62. {
  63. context.ResponseData.Write((byte)0); //Unknown value.
  64. Logger.Stub?.PrintStub(LogClass.ServiceAm);
  65. return ResultCode.Success;
  66. }
  67. [Command(9)]
  68. // GetCurrentFocusState() -> u8
  69. public ResultCode GetCurrentFocusState(ServiceCtx context)
  70. {
  71. context.ResponseData.Write((byte)context.Device.System.AppletState.FocusState);
  72. return ResultCode.Success;
  73. }
  74. [Command(50)] // 3.0.0+
  75. // IsVrModeEnabled() -> b8
  76. public ResultCode IsVrModeEnabled(ServiceCtx context)
  77. {
  78. context.ResponseData.Write(_vrModeEnabled);
  79. return ResultCode.Success;
  80. }
  81. [Command(51)] // 3.0.0+
  82. // SetVrModeEnabled(b8)
  83. public ResultCode SetVrModeEnabled(ServiceCtx context)
  84. {
  85. bool vrModeEnabled = context.RequestData.ReadBoolean();
  86. UpdateVrMode(vrModeEnabled);
  87. return ResultCode.Success;
  88. }
  89. [Command(53)] // 7.0.0+
  90. // BeginVrModeEx()
  91. public ResultCode BeginVrModeEx(ServiceCtx context)
  92. {
  93. UpdateVrMode(true);
  94. return ResultCode.Success;
  95. }
  96. [Command(54)] // 7.0.0+
  97. // EndVrModeEx()
  98. public ResultCode EndVrModeEx(ServiceCtx context)
  99. {
  100. UpdateVrMode(false);
  101. return ResultCode.Success;
  102. }
  103. private void UpdateVrMode(bool vrModeEnabled)
  104. {
  105. if (_vrModeEnabled == vrModeEnabled)
  106. {
  107. return;
  108. }
  109. _vrModeEnabled = vrModeEnabled;
  110. if (vrModeEnabled)
  111. {
  112. _lblControllerServer.EnableVrMode();
  113. }
  114. else
  115. {
  116. _lblControllerServer.DisableVrMode();
  117. }
  118. // TODO: It signals an internal event of ICommonStateGetter. We have to determine where this event is used.
  119. }
  120. [Command(60)] // 3.0.0+
  121. // GetDefaultDisplayResolution() -> (u32, u32)
  122. public ResultCode GetDefaultDisplayResolution(ServiceCtx context)
  123. {
  124. context.ResponseData.Write(1280);
  125. context.ResponseData.Write(720);
  126. return ResultCode.Success;
  127. }
  128. [Command(61)] // 3.0.0+
  129. // GetDefaultDisplayResolutionChangeEvent() -> handle<copy>
  130. public ResultCode GetDefaultDisplayResolutionChangeEvent(ServiceCtx context)
  131. {
  132. if (context.Process.HandleTable.GenerateHandle(context.Device.System.DisplayResolutionChangeEvent.ReadableEvent, out int handle) != KernelResult.Success)
  133. {
  134. throw new InvalidOperationException("Out of handles!");
  135. }
  136. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  137. Logger.Stub?.PrintStub(LogClass.ServiceAm);
  138. return ResultCode.Success;
  139. }
  140. [Command(66)] // 6.0.0+
  141. // SetCpuBoostMode(u32 cpu_boost_mode)
  142. public ResultCode SetCpuBoostMode(ServiceCtx context)
  143. {
  144. uint cpuBoostMode = context.RequestData.ReadUInt32();
  145. if (cpuBoostMode > 1)
  146. {
  147. return ResultCode.InvalidParameters;
  148. }
  149. _apmSystemManagerServer.SetCpuBoostMode((Apm.CpuBoostMode)cpuBoostMode);
  150. // TODO: It signals an internal event of ICommonStateGetter. We have to determine where this event is used.
  151. return ResultCode.Success;
  152. }
  153. [Command(91)] // 7.0.0+
  154. // GetCurrentPerformanceConfiguration() -> nn::apm::PerformanceConfiguration
  155. public ResultCode GetCurrentPerformanceConfiguration(ServiceCtx context)
  156. {
  157. return (ResultCode)_apmSystemManagerServer.GetCurrentPerformanceConfiguration(context);
  158. }
  159. }
  160. }