aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Hid/Hid.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Hid/Hid.cs55
1 files changed, 24 insertions, 31 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Hid/Hid.cs b/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
index 18a7ba11..61a12d9e 100644
--- a/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
+++ b/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
@@ -3,6 +3,14 @@ using Ryujinx.HLE.Exceptions;
using Ryujinx.Common.Configuration.Hid;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
+using Ryujinx.Common.Memory;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen;
+using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad;
namespace Ryujinx.HLE.HOS.Services.Hid
{
@@ -12,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
private readonly ulong _hidMemoryAddress;
- internal ref HidSharedMemory SharedMemory => ref _device.Memory.GetRef<HidSharedMemory>(_hidMemoryAddress);
+ internal ref SharedMemory SharedMemory => ref _device.Memory.GetRef<SharedMemory>(_hidMemoryAddress);
internal const int SharedMemEntryCount = 17;
@@ -22,40 +30,30 @@ namespace Ryujinx.HLE.HOS.Services.Hid
public KeyboardDevice Keyboard;
public NpadDevices Npads;
- static Hid()
+ private static void CheckTypeSizeOrThrow<T>(int expectedSize)
{
- if (Unsafe.SizeOf<ShMemDebugPad>() != 0x400)
- {
- throw new InvalidStructLayoutException<ShMemDebugPad>(0x400);
- }
- if (Unsafe.SizeOf<ShMemTouchScreen>() != 0x3000)
- {
- throw new InvalidStructLayoutException<ShMemTouchScreen>(0x3000);
- }
- if (Unsafe.SizeOf<ShMemKeyboard>() != 0x400)
- {
- throw new InvalidStructLayoutException<ShMemKeyboard>(0x400);
- }
- if (Unsafe.SizeOf<ShMemMouse>() != 0x400)
- {
- throw new InvalidStructLayoutException<ShMemMouse>(0x400);
- }
- if (Unsafe.SizeOf<ShMemNpad>() != 0x5000)
+ if (Unsafe.SizeOf<T>() != expectedSize)
{
- throw new InvalidStructLayoutException<ShMemNpad>(0x5000);
- }
- if (Unsafe.SizeOf<HidSharedMemory>() != Horizon.HidSize)
- {
- throw new InvalidStructLayoutException<HidSharedMemory>(Horizon.HidSize);
+ throw new InvalidStructLayoutException<T>(expectedSize);
}
}
+ static Hid()
+ {
+ CheckTypeSizeOrThrow<RingLifo<DebugPadState>>(0x2c8);
+ CheckTypeSizeOrThrow<RingLifo<TouchScreenState>>(0x2C38);
+ CheckTypeSizeOrThrow<RingLifo<MouseState>>(0x350);
+ CheckTypeSizeOrThrow<RingLifo<KeyboardState>>(0x3D8);
+ CheckTypeSizeOrThrow<Array10<NpadState>>(0x32000);
+ CheckTypeSizeOrThrow<SharedMemory>(Horizon.HidSize);
+ }
+
public Hid(in Switch device, ulong sharedHidMemoryAddress)
{
_device = device;
_hidMemoryAddress = sharedHidMemoryAddress;
- device.Memory.ZeroFill(sharedHidMemoryAddress, Horizon.HidSize);
+ SharedMemory = SharedMemory.Create();
}
public void InitDevices()
@@ -67,7 +65,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
Npads = new NpadDevices(_device, true);
}
- internal void RefreshInputConfig(List<InputConfig> inputConfig)
+ public void RefreshInputConfig(List<InputConfig> inputConfig)
{
ControllerConfig[] npadConfig = new ControllerConfig[inputConfig.Count];
@@ -80,11 +78,6 @@ namespace Ryujinx.HLE.HOS.Services.Hid
_device.Hid.Npads.Configure(npadConfig);
}
- internal void RefreshInputConfigEvent(object _, ReactiveEventArgs<List<InputConfig>> args)
- {
- RefreshInputConfig(args.NewValue);
- }
-
public ControllerKeys UpdateStickButtons(JoystickPosition leftStick, JoystickPosition rightStick)
{
const int stickButtonThreshold = short.MaxValue / 2;