diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs')
| -rw-r--r-- | src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs new file mode 100644 index 00000000..bb58ee51 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs @@ -0,0 +1,48 @@ +using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; +using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; +using System; + +namespace Ryujinx.HLE.HOS.Services.Hid +{ + public class TouchDevice : BaseDevice + { + public TouchDevice(Switch device, bool active) : base(device, active) { } + + public void Update(params TouchPoint[] points) + { + ref RingLifo<TouchScreenState> lifo = ref _device.Hid.SharedMemory.TouchScreen; + + ref TouchScreenState previousEntry = ref lifo.GetCurrentEntryRef(); + + TouchScreenState newState = new TouchScreenState + { + SamplingNumber = previousEntry.SamplingNumber + 1 + }; + + if (Active) + { + newState.TouchesCount = points.Length; + + int pointsLength = Math.Min(points.Length, newState.Touches.Length); + + for (int i = 0; i < pointsLength; ++i) + { + TouchPoint pi = points[i]; + newState.Touches[i] = new TouchState + { + DeltaTime = newState.SamplingNumber, + Attribute = pi.Attribute, + X = pi.X, + Y = pi.Y, + FingerId = (uint)i, + DiameterX = pi.DiameterX, + DiameterY = pi.DiameterY, + RotationAngle = pi.Angle + }; + } + } + + lifo.Write(ref newState); + } + } +}
\ No newline at end of file |
