aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE
diff options
context:
space:
mode:
authorThomas Guillemard <me@thog.eu>2019-05-03 01:29:01 +0200
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-05-03 09:29:01 +1000
commit12badfffb94cc2dda128df4895668d1e2716de24 (patch)
treecabf42d91e9662656cb415574acf73814ef124be /Ryujinx.HLE
parent3079c6a6590a8a7e0d788b9d3f894dab998ba734 (diff)
hid: Initial Keyboard Support (#684)
* hid: Initial Keyboard Support This adds basic hid keyboard support. Because of OpenTK.Input limitations, some specials keys aren't mapped. * Fix code style * Fix for loops code style * Make hid keyboard feature toggleable * Address comments * Fix 2 other nits * Apply jd's suggestion
Diffstat (limited to 'Ryujinx.HLE')
-rw-r--r--Ryujinx.HLE/Input/Hid.cs32
-rw-r--r--Ryujinx.HLE/Input/HidKeyboard.cs8
-rw-r--r--Ryujinx.HLE/Input/HidValues.cs3
3 files changed, 43 insertions, 0 deletions
diff --git a/Ryujinx.HLE/Input/Hid.cs b/Ryujinx.HLE/Input/Hid.cs
index 0154fc63..83c4ddea 100644
--- a/Ryujinx.HLE/Input/Hid.cs
+++ b/Ryujinx.HLE/Input/Hid.cs
@@ -39,6 +39,11 @@ namespace Ryujinx.HLE.Input
PrimaryController.Connect(controllerId);
}
+ public void InitilizeKeyboard()
+ {
+ _device.Memory.FillWithZeros(HidPosition + HidKeyboardOffset, HidKeyboardSize);
+ }
+
public HidControllerButtons UpdateStickButtons(
HidJoystickPosition leftStick,
HidJoystickPosition rightStick)
@@ -132,6 +137,33 @@ namespace Ryujinx.HLE.Input
}
}
+ public void WriteKeyboard(HidKeyboard keyboard)
+ {
+ long keyboardOffset = HidPosition + HidKeyboardOffset;
+ long lastEntry = _device.Memory.ReadInt64(keyboardOffset + 0x10);
+ long currEntry = (lastEntry + 1) % HidEntryCount;
+ long timestamp = GetTimestamp();
+
+ _device.Memory.WriteInt64(keyboardOffset + 0x00, timestamp);
+ _device.Memory.WriteInt64(keyboardOffset + 0x08, HidEntryCount);
+ _device.Memory.WriteInt64(keyboardOffset + 0x10, currEntry);
+ _device.Memory.WriteInt64(keyboardOffset + 0x18, HidEntryCount - 1);
+
+ long keyboardEntryOffset = keyboardOffset + HidKeyboardHeaderSize;
+ long lastEntryOffset = keyboardEntryOffset + lastEntry * HidKeyboardEntrySize;
+ long sampleCounter = _device.Memory.ReadInt64(lastEntryOffset);
+
+ keyboardEntryOffset += currEntry * HidKeyboardEntrySize;
+ _device.Memory.WriteInt64(keyboardEntryOffset + 0x00, sampleCounter + 1);
+ _device.Memory.WriteInt64(keyboardEntryOffset + 0x08, sampleCounter);
+ _device.Memory.WriteInt64(keyboardEntryOffset + 0x10, keyboard.Modifier);
+
+ for (int i = 0; i < keyboard.Keys.Length; i++)
+ {
+ _device.Memory.WriteInt32(keyboardEntryOffset + 0x18 + (i * 4), keyboard.Keys[i]);
+ }
+ }
+
internal static long GetTimestamp()
{
return PerformanceCounter.ElapsedMilliseconds * 19200;
diff --git a/Ryujinx.HLE/Input/HidKeyboard.cs b/Ryujinx.HLE/Input/HidKeyboard.cs
new file mode 100644
index 00000000..a5b042a5
--- /dev/null
+++ b/Ryujinx.HLE/Input/HidKeyboard.cs
@@ -0,0 +1,8 @@
+namespace Ryujinx.HLE.Input
+{
+ public struct HidKeyboard
+ {
+ public int Modifier;
+ public int[] Keys;
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/Input/HidValues.cs b/Ryujinx.HLE/Input/HidValues.cs
index ae02bb42..06fe8fc0 100644
--- a/Ryujinx.HLE/Input/HidValues.cs
+++ b/Ryujinx.HLE/Input/HidValues.cs
@@ -26,6 +26,9 @@
internal const int HidControllersSize = 0x32000;
internal const int HidUnkSection9Size = 0x800;
+ internal const int HidKeyboardHeaderSize = 0x20;
+ internal const int HidKeyboardEntrySize = 0x38;
+
internal const int HidTouchHeaderSize = 0x28;
internal const int HidTouchEntrySize = 0x298;