From 0e42ead19cbebdd9bdded8054627c1f282caa02d Mon Sep 17 00:00:00 2001 From: Ac_K Date: Sun, 21 Oct 2018 01:46:31 +0200 Subject: [PATCH] Add IPsmSession - Add `IPsmSession` by Thog - Implement `OpenSession` --- Ryujinx.HLE/HOS/Services/Psm/IPsmServer.cs | 11 ++- Ryujinx.HLE/HOS/Services/Psm/IPsmSession.cs | 96 +++++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 Ryujinx.HLE/HOS/Services/Psm/IPsmSession.cs diff --git a/Ryujinx.HLE/HOS/Services/Psm/IPsmServer.cs b/Ryujinx.HLE/HOS/Services/Psm/IPsmServer.cs index 99df636c88..0b45e3c9df 100644 --- a/Ryujinx.HLE/HOS/Services/Psm/IPsmServer.cs +++ b/Ryujinx.HLE/HOS/Services/Psm/IPsmServer.cs @@ -22,7 +22,8 @@ namespace Ryujinx.HLE.HOS.Services.Psm m_Commands = new Dictionary() { { 0, GetBatteryChargePercentage }, - { 1, GetChargerType } + { 1, GetChargerType }, + { 7, OpenSession } }; } @@ -47,5 +48,13 @@ namespace Ryujinx.HLE.HOS.Services.Psm return 0; } + + // OpenSession() -> IPsmSession + public long OpenSession(ServiceCtx Context) + { + MakeObject(Context, new IPsmSession(Context.Device.System)); + + return 0; + } } } \ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Psm/IPsmSession.cs b/Ryujinx.HLE/HOS/Services/Psm/IPsmSession.cs new file mode 100644 index 0000000000..30e5d53220 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Psm/IPsmSession.cs @@ -0,0 +1,96 @@ +using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Ipc; +using Ryujinx.HLE.HOS.Kernel; +using System.Collections.Generic; + +namespace Ryujinx.HLE.HOS.Services.Psm +{ + class IPsmSession : IpcService + { + private Dictionary m_Commands; + + public override IReadOnlyDictionary Commands => m_Commands; + + private KEvent StateChangeEvent; + private int StateChangeEventHandle; + + public IPsmSession(Horizon System) + { + m_Commands = new Dictionary() + { + { 0, BindStateChangeEvent }, + { 1, UnbindStateChangeEvent }, + { 2, SetChargerTypeChangeEventEnabled }, + { 3, SetPowerSupplyChangeEventEnabled }, + { 4, SetBatteryVoltageStateChangeEventEnabled } + }; + + StateChangeEvent = new KEvent(System); + StateChangeEventHandle = -1; + } + + // BindStateChangeEvent() -> KObject + public long BindStateChangeEvent(ServiceCtx Context) + { + if (StateChangeEventHandle == -1) + { + KernelResult ResultCode = Context.Process.HandleTable.GenerateHandle(StateChangeEvent, out int StateChangeEventHandle); + + if (ResultCode != KernelResult.Success) + { + return (long)ResultCode; + } + } + + Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(StateChangeEventHandle); + + Logger.PrintStub(LogClass.ServicePsm, "Stubbed."); + + return 0; + } + + // UnbindStateChangeEvent() + public long UnbindStateChangeEvent(ServiceCtx Context) + { + if (StateChangeEventHandle != -1) + { + Context.Process.HandleTable.CloseHandle(StateChangeEventHandle); + StateChangeEventHandle = -1; + } + + Logger.PrintStub(LogClass.ServicePsm, "Stubbed."); + + return 0; + } + + // SetChargerTypeChangeEventEnabled(u8) + public long SetChargerTypeChangeEventEnabled(ServiceCtx Context) + { + bool ChargerTypeChangeEventEnabled = Context.RequestData.ReadBoolean(); + + Logger.PrintStub(LogClass.ServicePsm, $"Stubbed. ChargerTypeChangeEventEnabled: {ChargerTypeChangeEventEnabled}"); + + return 0; + } + + // SetPowerSupplyChangeEventEnabled(u8) + public long SetPowerSupplyChangeEventEnabled(ServiceCtx Context) + { + bool PowerSupplyChangeEventEnabled = Context.RequestData.ReadBoolean(); + + Logger.PrintStub(LogClass.ServicePsm, $"Stubbed. PowerSupplyChangeEventEnabled: {PowerSupplyChangeEventEnabled}"); + + return 0; + } + + // SetBatteryVoltageStateChangeEventEnabled(u8) + public long SetBatteryVoltageStateChangeEventEnabled(ServiceCtx Context) + { + bool BatteryVoltageStateChangeEventEnabled = Context.RequestData.ReadBoolean(); + + Logger.PrintStub(LogClass.ServicePsm, $"Stubbed. BatteryVoltageStateChangeEventEnabled: {BatteryVoltageStateChangeEventEnabled}"); + + return 0; + } + } +} \ No newline at end of file