From 86b73001a2c8ad6a2151da96d43d3653c4ee4054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Thu, 8 Dec 2022 21:09:31 +0100 Subject: [PATCH] Add minimum pressed time to X360Controller --- SteamController/Devices/Xbox360Controller.cs | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/SteamController/Devices/Xbox360Controller.cs b/SteamController/Devices/Xbox360Controller.cs index 8b95a1d..e95d24f 100644 --- a/SteamController/Devices/Xbox360Controller.cs +++ b/SteamController/Devices/Xbox360Controller.cs @@ -17,6 +17,8 @@ namespace SteamController.Devices private IXbox360Controller? device; private bool isConnected; private bool submitReport; + private Dictionary lastPressed = new Dictionary(); + private Dictionary pressed = new Dictionary(); public Xbox360Controller() { @@ -72,6 +74,8 @@ namespace SteamController.Devices LedNumber = 0; } + lastPressed = pressed; + pressed = new Dictionary(); submitReport = false; Connected = SettingsDebug.Default.KeepX360AlwaysConnected; } @@ -138,6 +142,8 @@ namespace SteamController.Devices } } + UpdateMinimumPressedTime(); + if (isConnected && submitReport) { try @@ -159,6 +165,25 @@ namespace SteamController.Devices } } + private void UpdateMinimumPressedTime() + { + var now = DateTime.Now; + + foreach (var key in lastPressed) + { + if (pressed.ContainsKey(key.Key)) + continue; + + // until time elapsed, keep setting button state + if (key.Value < DateTime.Now) + continue; + + device?.SetButtonState(key.Key, true); + pressed.Add(key.Key, key.Value); + submitReport = true; + } + } + public bool Valid { get { return device is not null; } @@ -200,6 +225,19 @@ namespace SteamController.Devices } } + public void Overwrite(Xbox360Button button, bool value, int minPresTimeMs = 0) + { + device?.SetButtonState(button, value); + submitReport = true; + + if (value && minPresTimeMs > 0) + { + if (!lastPressed.TryGetValue(button, out var firstPressed)) + firstPressed = DateTime.Now.AddMilliseconds(minPresTimeMs); + pressed.Add(button, firstPressed); + } + } + public void ResetFeedback() { FeedbackReceived = null;