aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core
diff options
context:
space:
mode:
authoremmauss <emmausssss@gmail.com>2018-02-22 15:28:27 +0200
committergdkchan <gab.dark.100@gmail.com>2018-02-22 10:28:27 -0300
commit1b33e2f1d4b190017b4aed26cfb2f6878f0b2e4c (patch)
treed2dab0436d9c305a32765a8b251943cf82df77b8 /Ryujinx.Core
parent224211367f52cf514f0608d69056e84a3ef37ff5 (diff)
implement single tap touchscreen (#34)
Diffstat (limited to 'Ryujinx.Core')
-rw-r--r--Ryujinx.Core/Hid.cs60
-rw-r--r--Ryujinx.Core/Hid/HidTouchScreen.cs5
-rw-r--r--Ryujinx.Core/Switch.cs5
3 files changed, 58 insertions, 12 deletions
diff --git a/Ryujinx.Core/Hid.cs b/Ryujinx.Core/Hid.cs
index 44d3e0fb..bd83e92d 100644
--- a/Ryujinx.Core/Hid.cs
+++ b/Ryujinx.Core/Hid.cs
@@ -33,7 +33,7 @@ namespace Ryujinx.Core
}
*/
- private const int Hid_Num_Entries = 16;
+ private const int Hid_Num_Entries = 17;
private Switch Ns;
private long SharedMemOffset;
@@ -63,9 +63,8 @@ namespace Ryujinx.Core
TouchScreen.Header.LatestEntry = 0;
TouchScreen.Header.MaxEntryIndex = (ulong)Hid_Num_Entries - 1;
TouchScreen.Header.Timestamp = (ulong)Environment.TickCount;
-
- //TODO: Write this structure when the input is implemented
- //Marshal.StructureToPtr(TouchScreen, HidPtr, false);
+
+ Marshal.StructureToPtr(TouchScreen, HidPtr, false);
InnerOffset += (uint)Marshal.SizeOf(typeof(HidTouchScreen));
HidPtr = new IntPtr(Ns.Ram.ToInt64() + (uint)SharedMemOffset + InnerOffset);
@@ -170,16 +169,57 @@ namespace Ryujinx.Core
InnerOffset += (uint)Marshal.SizeOf(typeof(HidControllerLayoutHeader)) + (uint)((uint)(ControllerLayoutHeader.LatestEntry) * Marshal.SizeOf(typeof(HidControllerInputEntry)));
HidPtr = new IntPtr(Ns.Ram.ToInt64() + (uint)SharedMemOffset + InnerOffset);
- HidControllerInputEntry ControllerInputEntry = new HidControllerInputEntry();
- ControllerInputEntry.Timestamp = (ulong)Environment.TickCount;
- ControllerInputEntry.Timestamp_2 = (ulong)Environment.TickCount;
- ControllerInputEntry.Buttons = (ulong)Buttons;
- ControllerInputEntry.Joysticks = new JoystickPosition[(int)HidControllerJoystick.Joystick_Num_Sticks];
+ HidControllerInputEntry ControllerInputEntry = new HidControllerInputEntry
+ {
+ Timestamp = (ulong)Environment.TickCount,
+ Timestamp_2 = (ulong)Environment.TickCount,
+ Buttons = (ulong)Buttons,
+ Joysticks = new JoystickPosition[(int)HidControllerJoystick.Joystick_Num_Sticks]
+ };
ControllerInputEntry.Joysticks[(int)HidControllerJoystick.Joystick_Left] = LeftJoystick;
ControllerInputEntry.Joysticks[(int)HidControllerJoystick.Joystick_Right] = RightJoystick;
ControllerInputEntry.ConnectionState = (ulong)(HidControllerConnectionState.Controller_State_Connected | HidControllerConnectionState.Controller_State_Wired);
Marshal.StructureToPtr(ControllerInputEntry, HidPtr, false);
}
+
+ public void SendTouchPoint(HidTouchScreenEntryTouch TouchPoint)
+ {
+ uint InnerOffset = (uint)Marshal.SizeOf(typeof(HidSharedMemHeader));
+
+ IntPtr HidPtr = new IntPtr(Ns.Ram.ToInt64() + (uint)SharedMemOffset + InnerOffset);
+
+ HidTouchScreenHeader OldTouchScreenHeader = (HidTouchScreenHeader)Marshal.PtrToStructure(HidPtr,typeof(HidTouchScreenHeader));
+
+ HidTouchScreenHeader TouchScreenHeader = new HidTouchScreenHeader()
+ {
+ TimestampTicks = (ulong)Environment.TickCount,
+ NumEntries = (ulong)Hid_Num_Entries,
+ MaxEntryIndex = (ulong)Hid_Num_Entries - 1,
+ Timestamp = (ulong)Environment.TickCount,
+ LatestEntry = OldTouchScreenHeader.LatestEntry < Hid_Num_Entries-1 ? OldTouchScreenHeader.LatestEntry + 1 : 0
+ };
+
+ Marshal.StructureToPtr(TouchScreenHeader, HidPtr, false);
+
+ InnerOffset += (uint)Marshal.SizeOf(typeof(HidTouchScreenHeader))
+ + (uint)((uint)(OldTouchScreenHeader.LatestEntry) * Marshal.SizeOf(typeof(HidTouchScreenEntry)));
+ HidPtr = new IntPtr(Ns.Ram.ToInt64() + (uint)SharedMemOffset + InnerOffset);
+
+ HidTouchScreenEntry hidTouchScreenEntry = new HidTouchScreenEntry()
+ {
+ Header = new HidTouchScreenEntryHeader()
+ {
+ Timestamp = (ulong)Environment.TickCount,
+ NumTouches = 1
+ },
+ Touches = new HidTouchScreenEntryTouch[16]
+ };
+
+ //Only supports single touch
+ hidTouchScreenEntry.Touches[0] = TouchPoint;
+
+ Marshal.StructureToPtr(hidTouchScreenEntry, HidPtr, false);
+ }
}
-}
+} \ No newline at end of file
diff --git a/Ryujinx.Core/Hid/HidTouchScreen.cs b/Ryujinx.Core/Hid/HidTouchScreen.cs
index b755cb95..755ebadc 100644
--- a/Ryujinx.Core/Hid/HidTouchScreen.cs
+++ b/Ryujinx.Core/Hid/HidTouchScreen.cs
@@ -38,7 +38,7 @@ namespace Ryujinx.Core
{
public HidTouchScreenEntryHeader Header;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
- public HidTouchScreenEntryTouch[] Touches;
+ public HidTouchScreenEntryTouch[] Touches;
public ulong Unknown;
}
@@ -51,4 +51,5 @@ namespace Ryujinx.Core
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x3C0)]
public byte[] Padding;
}
-}
+
+} \ No newline at end of file
diff --git a/Ryujinx.Core/Switch.cs b/Ryujinx.Core/Switch.cs
index 2b6a9045..8fd7979e 100644
--- a/Ryujinx.Core/Switch.cs
+++ b/Ryujinx.Core/Switch.cs
@@ -51,6 +51,11 @@ namespace Ryujinx.Core
{
Hid.SendControllerButtons(ControllerId, Layout, Buttons, LeftJoystick, RightJoystick);
}
+
+ public void SendTouchScreenEntry(HidTouchScreenEntryTouch TouchPoint)
+ {
+ Hid.SendTouchPoint(TouchPoint);
+ }
internal virtual void OnFinish(EventArgs e)
{