diff options
| author | emmauss <emmausssss@gmail.com> | 2018-02-22 15:28:27 +0200 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-02-22 10:28:27 -0300 |
| commit | 1b33e2f1d4b190017b4aed26cfb2f6878f0b2e4c (patch) | |
| tree | d2dab0436d9c305a32765a8b251943cf82df77b8 /Ryujinx.Core | |
| parent | 224211367f52cf514f0608d69056e84a3ef37ff5 (diff) | |
implement single tap touchscreen (#34)
Diffstat (limited to 'Ryujinx.Core')
| -rw-r--r-- | Ryujinx.Core/Hid.cs | 60 | ||||
| -rw-r--r-- | Ryujinx.Core/Hid/HidTouchScreen.cs | 5 | ||||
| -rw-r--r-- | Ryujinx.Core/Switch.cs | 5 |
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) { |
