implement single tap touchscreen (#34)

This commit is contained in:
emmauss 2018-02-22 15:28:27 +02:00 committed by gdkchan
parent 224211367f
commit 1b33e2f1d4
4 changed files with 113 additions and 43 deletions

View file

@ -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;
@ -64,8 +64,7 @@ namespace Ryujinx.Core
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);
}
}
}

View file

@ -51,4 +51,5 @@ namespace Ryujinx.Core
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x3C0)]
public byte[] Padding;
}
}

View file

@ -52,6 +52,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)
{
Finish?.Invoke(this, e);

View file

@ -296,6 +296,7 @@ void main(void) {
JoystickPosition LeftJoystick;
JoystickPosition RightJoystick;
if (Keyboard[OpenTK.Input.Key.Escape]) this.Exit();
//RightJoystick
@ -346,6 +347,29 @@ void main(void) {
DY = RightJoystickDY
};
//Get screen touch position from left mouse click
//Opentk always captures mouse events, even if out of focus, so check if window is focused.
if (Mouse != null && Focused)
if (Mouse.GetState().LeftButton == OpenTK.Input.ButtonState.Pressed)
{
HidTouchScreenEntryTouch CurrentPoint = new HidTouchScreenEntryTouch
{
Timestamp = (uint)Environment.TickCount,
X = (uint)Mouse.X,
Y = (uint)Mouse.Y,
//Placeholder values till more data is acquired
DiameterX = 10,
DiameterY = 10,
Angle = 90,
//Only support single touch
TouchIndex = 0,
};
if (Mouse.X > -1 && Mouse.Y > -1)
Ns.SendTouchScreenEntry(CurrentPoint);
}
//We just need one pair of JoyCon because it's emulate by the keyboard.
Ns.SendControllerButtons(HidControllerID.CONTROLLER_HANDHELD, HidControllerLayouts.Main, CurrentButton, LeftJoystick, RightJoystick);
}