diff options
| author | Thomas Guillemard <me@thog.eu> | 2019-05-03 01:29:01 +0200 |
|---|---|---|
| committer | jduncanator <1518948+jduncanator@users.noreply.github.com> | 2019-05-03 09:29:01 +1000 |
| commit | 12badfffb94cc2dda128df4895668d1e2716de24 (patch) | |
| tree | cabf42d91e9662656cb415574acf73814ef124be /Ryujinx.HLE | |
| parent | 3079c6a6590a8a7e0d788b9d3f894dab998ba734 (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.cs | 32 | ||||
| -rw-r--r-- | Ryujinx.HLE/Input/HidKeyboard.cs | 8 | ||||
| -rw-r--r-- | Ryujinx.HLE/Input/HidValues.cs | 3 |
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; |
