2022-11-28 10:14:05 +01:00
|
|
|
using System.Diagnostics;
|
2022-11-25 10:56:17 +01:00
|
|
|
using CommonHelpers;
|
2022-11-24 22:37:24 +01:00
|
|
|
using hidapi;
|
|
|
|
|
using PowerControl.External;
|
|
|
|
|
using static CommonHelpers.Log;
|
|
|
|
|
|
|
|
|
|
namespace SteamController.Devices
|
|
|
|
|
{
|
|
|
|
|
public partial class SteamController : IDisposable
|
|
|
|
|
{
|
2022-11-27 13:41:28 +01:00
|
|
|
public const ushort VendorID = 0x28DE;
|
|
|
|
|
public const ushort ProductID = 0x1205;
|
2022-11-27 09:19:34 +01:00
|
|
|
private const int ReadTimeout = 50;
|
2022-11-24 22:37:24 +01:00
|
|
|
|
|
|
|
|
private hidapi.HidDevice neptuneDevice;
|
2022-11-28 10:14:05 +01:00
|
|
|
private Stopwatch stopwatch = new Stopwatch();
|
|
|
|
|
private TimeSpan? lastUpdate;
|
|
|
|
|
public double DeltaTime { get; private set; }
|
2022-11-24 22:37:24 +01:00
|
|
|
|
2022-11-27 09:19:34 +01:00
|
|
|
internal SteamController()
|
2022-11-24 22:37:24 +01:00
|
|
|
{
|
|
|
|
|
InitializeButtons();
|
|
|
|
|
InitializeActions();
|
|
|
|
|
|
2022-11-27 13:41:28 +01:00
|
|
|
neptuneDevice = new hidapi.HidDevice(VendorID, ProductID, 64);
|
2022-11-24 22:37:24 +01:00
|
|
|
neptuneDevice.OpenDevice();
|
2022-11-28 10:14:05 +01:00
|
|
|
|
|
|
|
|
stopwatch.Start();
|
2022-11-24 22:37:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Updated { get; private set; }
|
|
|
|
|
|
|
|
|
|
internal void Reset()
|
|
|
|
|
{
|
|
|
|
|
foreach (var action in AllActions)
|
|
|
|
|
action.Reset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void BeforeUpdate(byte[] buffer)
|
|
|
|
|
{
|
|
|
|
|
foreach (var action in AllActions)
|
2022-11-25 10:56:17 +01:00
|
|
|
action.BeforeUpdate(buffer);
|
2022-11-24 22:37:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal void BeforeUpdate()
|
|
|
|
|
{
|
2022-11-28 10:14:05 +01:00
|
|
|
var ts = stopwatch.Elapsed;
|
|
|
|
|
DeltaTime = lastUpdate is not null ? (ts - lastUpdate.Value).TotalSeconds : 0.0;
|
|
|
|
|
DeltaTime = Math.Min(DeltaTime, 0.1); // max update is 100ms
|
|
|
|
|
lastUpdate = ts;
|
|
|
|
|
|
2022-11-25 10:56:17 +01:00
|
|
|
LizardButtons = true;
|
|
|
|
|
LizardMouse = true;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
byte[] data = neptuneDevice.Read(ReadTimeout);
|
|
|
|
|
if (data == null)
|
|
|
|
|
{
|
|
|
|
|
Reset();
|
|
|
|
|
Updated = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BeforeUpdate(data);
|
|
|
|
|
Updated = true;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
2022-11-24 22:37:24 +01:00
|
|
|
{
|
2022-11-25 10:56:17 +01:00
|
|
|
Log.TraceLine("STEAM: Exception: {0}", e);
|
2022-11-24 22:37:24 +01:00
|
|
|
Reset();
|
|
|
|
|
Updated = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal void Update()
|
|
|
|
|
{
|
|
|
|
|
foreach (var action in AllActions)
|
|
|
|
|
action.Update();
|
|
|
|
|
|
2022-11-25 10:56:17 +01:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
UpdateLizardButtons();
|
|
|
|
|
UpdateLizardMouse();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Log.TraceLine("STEAM: Exception: {0}", e);
|
|
|
|
|
Reset();
|
|
|
|
|
Updated = false;
|
|
|
|
|
}
|
2022-11-24 22:37:24 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|