Implement a rudimentary applets system (#804)

* Implement Player Select applet

* Initialize the Horizon system reference

* Tidy up namespaces

* Resolve nits

* Resolve nits

* Rename stack to queue

* Implement an applet FIFO

* Remove debugging log

* Log applet creation events

* Reorganise AppletFifo

* More reorganisation

* Final changes
This commit is contained in:
jduncanator 2019-11-14 16:18:44 +11:00 committed by Ac_K
parent 7c111a3567
commit 35e5612766
8 changed files with 245 additions and 14 deletions

View file

@ -0,0 +1,29 @@
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
using System;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Applets
{
static class AppletManager
{
private static Dictionary<AppletId, Type> _appletMapping;
static AppletManager()
{
_appletMapping = new Dictionary<AppletId, Type>
{
{ AppletId.PlayerSelect, typeof(PlayerSelectApplet) }
};
}
public static IApplet Create(AppletId applet, Horizon system)
{
if (_appletMapping.TryGetValue(applet, out Type appletClass))
{
return (IApplet)Activator.CreateInstance(appletClass, system);
}
throw new NotImplementedException($"{applet} applet is not implemented.");
}
}
}

View file

@ -0,0 +1,13 @@
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
using System;
namespace Ryujinx.HLE.HOS.Applets
{
interface IApplet
{
event EventHandler AppletStateChanged;
ResultCode Start(AppletFifo<byte[]> inData, AppletFifo<byte[]> outData);
ResultCode GetResult();
}
}

View file

@ -0,0 +1,55 @@
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
using System;
using System.IO;
namespace Ryujinx.HLE.HOS.Applets
{
internal class PlayerSelectApplet : IApplet
{
private Horizon _system;
private AppletFifo<byte[]> _inputData;
private AppletFifo<byte[]> _outputData;
public event EventHandler AppletStateChanged;
public PlayerSelectApplet(Horizon system)
{
_system = system;
}
public ResultCode Start(AppletFifo<byte[]> inData, AppletFifo<byte[]> outData)
{
_inputData = inData;
_outputData = outData;
// TODO(jduncanator): Parse PlayerSelectConfig from input data
_outputData.Push(BuildResponse());
AppletStateChanged?.Invoke(this, null);
return ResultCode.Success;
}
public ResultCode GetResult()
{
return ResultCode.Success;
}
private byte[] BuildResponse()
{
UserProfile currentUser = _system.State.Account.LastOpenedUser;
using (MemoryStream stream = new MemoryStream())
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write((ulong)PlayerSelectResult.Success);
currentUser.UserId.Write(writer);
return stream.ToArray();
}
}
}
}

View file

@ -0,0 +1,8 @@
namespace Ryujinx.HLE.HOS.Applets
{
enum PlayerSelectResult : ulong
{
Success = 0,
Failure = 2
}
}