mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:18:58 -06:00 
			
		
		
		
	ts: Migrate service to Horizon project (#6514)
* ts: Migrate service to Horizon project This PR migrate the `ts` service (stored in `ptm`) to the Horizon project: - It stubs all known IPCs. - IpcServer consts are checked by RE. Closes #6480 * Fix args
This commit is contained in:
		@@ -1,39 +0,0 @@
 | 
			
		||||
using Ryujinx.Common.Logging;
 | 
			
		||||
using Ryujinx.HLE.HOS.Services.Ptm.Ts.Types;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.HLE.HOS.Services.Ptm.Ts
 | 
			
		||||
{
 | 
			
		||||
    [Service("ts")]
 | 
			
		||||
    class IMeasurementServer : IpcService
 | 
			
		||||
    {
 | 
			
		||||
        private const uint DefaultTemperature = 42u;
 | 
			
		||||
 | 
			
		||||
        public IMeasurementServer(ServiceCtx context) { }
 | 
			
		||||
 | 
			
		||||
        [CommandCmif(1)]
 | 
			
		||||
        // GetTemperature(Location location) -> u32
 | 
			
		||||
        public ResultCode GetTemperature(ServiceCtx context)
 | 
			
		||||
        {
 | 
			
		||||
            Location location = (Location)context.RequestData.ReadByte();
 | 
			
		||||
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
 | 
			
		||||
 | 
			
		||||
            context.ResponseData.Write(DefaultTemperature);
 | 
			
		||||
 | 
			
		||||
            return ResultCode.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CommandCmif(3)]
 | 
			
		||||
        // GetTemperatureMilliC(Location location) -> u32
 | 
			
		||||
        public ResultCode GetTemperatureMilliC(ServiceCtx context)
 | 
			
		||||
        {
 | 
			
		||||
            Location location = (Location)context.RequestData.ReadByte();
 | 
			
		||||
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
 | 
			
		||||
 | 
			
		||||
            context.ResponseData.Write(DefaultTemperature * 1000);
 | 
			
		||||
 | 
			
		||||
            return ResultCode.Success;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								src/Ryujinx.Horizon/Ptm/Ipc/MeasurementServer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/Ryujinx.Horizon/Ptm/Ipc/MeasurementServer.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
using Ryujinx.Common.Logging;
 | 
			
		||||
using Ryujinx.Horizon.Common;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Sf;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Ts;
 | 
			
		||||
using Ryujinx.Horizon.Ts.Ipc;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.Horizon.Ptm.Ipc
 | 
			
		||||
{
 | 
			
		||||
    partial class MeasurementServer : IMeasurementServer
 | 
			
		||||
    {
 | 
			
		||||
        // NOTE: Values are randomly choosen.
 | 
			
		||||
        public const int DefaultTemperature = 42;
 | 
			
		||||
        public const int MinimumTemperature = 0;
 | 
			
		||||
        public const int MaximumTemperature = 100;
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(0)] // 1.0.0-16.1.0
 | 
			
		||||
        public Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature, Location location)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
 | 
			
		||||
 | 
			
		||||
            minimumTemperature = MinimumTemperature;
 | 
			
		||||
            maximumTemperature = MaximumTemperature;
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(1)] // 1.0.0-16.1.0
 | 
			
		||||
        public Result GetTemperature(out int temperature, Location location)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
 | 
			
		||||
 | 
			
		||||
            temperature = DefaultTemperature;
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(2)] // 1.0.0-13.2.1
 | 
			
		||||
        public Result SetMeasurementMode(Location location, byte measurementMode)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location, measurementMode });
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(3)] // 1.0.0-13.2.1
 | 
			
		||||
        public Result GetTemperatureMilliC(out int temperatureMilliC, Location location)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
 | 
			
		||||
 | 
			
		||||
            temperatureMilliC = DefaultTemperature * 1000;
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(4)] // 8.0.0+
 | 
			
		||||
        public Result OpenSession(out ISession session, DeviceCode deviceCode)
 | 
			
		||||
        {
 | 
			
		||||
            session = new Session(deviceCode);
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										47
									
								
								src/Ryujinx.Horizon/Ptm/Ipc/Session.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/Ryujinx.Horizon/Ptm/Ipc/Session.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
using Ryujinx.Common.Logging;
 | 
			
		||||
using Ryujinx.Horizon.Common;
 | 
			
		||||
using Ryujinx.Horizon.Ptm.Ipc;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Sf;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Ts;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.Horizon.Ts.Ipc
 | 
			
		||||
{
 | 
			
		||||
    partial class Session : ISession
 | 
			
		||||
    {
 | 
			
		||||
        private readonly DeviceCode _deviceCode;
 | 
			
		||||
 | 
			
		||||
        public Session(DeviceCode deviceCode)
 | 
			
		||||
        {
 | 
			
		||||
            _deviceCode = deviceCode;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(0)]
 | 
			
		||||
        public Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { _deviceCode });
 | 
			
		||||
 | 
			
		||||
            minimumTemperature = MeasurementServer.MinimumTemperature;
 | 
			
		||||
            maximumTemperature = MeasurementServer.MaximumTemperature;
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(2)]
 | 
			
		||||
        public Result SetMeasurementMode(byte measurementMode)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { _deviceCode, measurementMode });
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [CmifCommand(4)]
 | 
			
		||||
        public Result GetTemperature(out int temperature)
 | 
			
		||||
        {
 | 
			
		||||
            Logger.Stub?.PrintStub(LogClass.ServicePtm, new { _deviceCode });
 | 
			
		||||
 | 
			
		||||
            temperature = MeasurementServer.DefaultTemperature;
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								src/Ryujinx.Horizon/Ptm/TsIpcServer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/Ryujinx.Horizon/Ptm/TsIpcServer.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
using Ryujinx.Horizon.Ptm.Ipc;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Sf.Hipc;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Sm;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.Horizon.Ptm
 | 
			
		||||
{
 | 
			
		||||
    class TsIpcServer
 | 
			
		||||
    {
 | 
			
		||||
        private const int MaxSessionsCount = 4;
 | 
			
		||||
 | 
			
		||||
        private const int PointerBufferSize = 0;
 | 
			
		||||
        private const int MaxDomains = 0;
 | 
			
		||||
        private const int MaxDomainObjects = 0;
 | 
			
		||||
        private const int MaxPortsCount = 1;
 | 
			
		||||
 | 
			
		||||
        private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false);
 | 
			
		||||
 | 
			
		||||
        private SmApi _sm;
 | 
			
		||||
        private ServerManager _serverManager;
 | 
			
		||||
 | 
			
		||||
        public void Initialize()
 | 
			
		||||
        {
 | 
			
		||||
            HeapAllocator allocator = new();
 | 
			
		||||
 | 
			
		||||
            _sm = new SmApi();
 | 
			
		||||
            _sm.Initialize().AbortOnFailure();
 | 
			
		||||
 | 
			
		||||
            _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _managerOptions, MaxSessionsCount);
 | 
			
		||||
 | 
			
		||||
            _serverManager.RegisterObjectForServer(new MeasurementServer(), ServiceName.Encode("ts"), MaxSessionsCount);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void ServiceRequests()
 | 
			
		||||
        {
 | 
			
		||||
            _serverManager.ServiceRequests();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Shutdown()
 | 
			
		||||
        {
 | 
			
		||||
            _serverManager.Dispose();
 | 
			
		||||
            _sm.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								src/Ryujinx.Horizon/Ptm/TsMain.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/Ryujinx.Horizon/Ptm/TsMain.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
namespace Ryujinx.Horizon.Ptm
 | 
			
		||||
{
 | 
			
		||||
    class TsMain : IService
 | 
			
		||||
    {
 | 
			
		||||
        public static void Main(ServiceTable serviceTable)
 | 
			
		||||
        {
 | 
			
		||||
            TsIpcServer ipcServer = new();
 | 
			
		||||
 | 
			
		||||
            ipcServer.Initialize();
 | 
			
		||||
 | 
			
		||||
            serviceTable.SignalServiceReady();
 | 
			
		||||
 | 
			
		||||
            ipcServer.ServiceRequests();
 | 
			
		||||
            ipcServer.Shutdown();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								src/Ryujinx.Horizon/Sdk/Ts/DeviceCode.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Ryujinx.Horizon/Sdk/Ts/DeviceCode.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
namespace Ryujinx.Horizon.Sdk.Ts
 | 
			
		||||
{
 | 
			
		||||
    enum DeviceCode : uint
 | 
			
		||||
    {
 | 
			
		||||
        Internal = 0x41000001,
 | 
			
		||||
        External = 0x41000002,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								src/Ryujinx.Horizon/Sdk/Ts/IMeasurementServer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/Ryujinx.Horizon/Sdk/Ts/IMeasurementServer.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
using Ryujinx.Horizon.Common;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Sf;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.Horizon.Sdk.Ts
 | 
			
		||||
{
 | 
			
		||||
    interface IMeasurementServer : IServiceObject
 | 
			
		||||
    {
 | 
			
		||||
        Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature, Location location);
 | 
			
		||||
        Result GetTemperature(out int temperature, Location location);
 | 
			
		||||
        Result SetMeasurementMode(Location location, byte measurementMode);
 | 
			
		||||
        Result GetTemperatureMilliC(out int temperatureMilliC, Location location);
 | 
			
		||||
        Result OpenSession(out ISession session, DeviceCode deviceCode);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								src/Ryujinx.Horizon/Sdk/Ts/ISession.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/Ryujinx.Horizon/Sdk/Ts/ISession.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
using Ryujinx.Horizon.Common;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Sf;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.Horizon.Sdk.Ts
 | 
			
		||||
{
 | 
			
		||||
    interface ISession : IServiceObject
 | 
			
		||||
    {
 | 
			
		||||
        Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature);
 | 
			
		||||
        Result GetTemperature(out int temperature);
 | 
			
		||||
        Result SetMeasurementMode(byte measurementMode);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
namespace Ryujinx.HLE.HOS.Services.Ptm.Ts.Types
 | 
			
		||||
namespace Ryujinx.Horizon.Sdk.Ts
 | 
			
		||||
{
 | 
			
		||||
    enum Location : byte
 | 
			
		||||
    {
 | 
			
		||||
@@ -11,6 +11,7 @@ using Ryujinx.Horizon.Ngc;
 | 
			
		||||
using Ryujinx.Horizon.Ovln;
 | 
			
		||||
using Ryujinx.Horizon.Prepo;
 | 
			
		||||
using Ryujinx.Horizon.Psc;
 | 
			
		||||
using Ryujinx.Horizon.Ptm;
 | 
			
		||||
using Ryujinx.Horizon.Sdk.Arp;
 | 
			
		||||
using Ryujinx.Horizon.Srepo;
 | 
			
		||||
using Ryujinx.Horizon.Usb;
 | 
			
		||||
@@ -54,6 +55,7 @@ namespace Ryujinx.Horizon
 | 
			
		||||
            RegisterService<PrepoMain>();
 | 
			
		||||
            RegisterService<PscMain>();
 | 
			
		||||
            RegisterService<SrepoMain>();
 | 
			
		||||
            RegisterService<TsMain>();
 | 
			
		||||
            RegisterService<UsbMain>();
 | 
			
		||||
            RegisterService<WlanMain>();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user