diff --git a/RGB.NET.Core/Update/Devices/DeviceUpdateTrigger.cs b/RGB.NET.Core/Update/Devices/DeviceUpdateTrigger.cs index 03410fb..04cfb92 100644 --- a/RGB.NET.Core/Update/Devices/DeviceUpdateTrigger.cs +++ b/RGB.NET.Core/Update/Devices/DeviceUpdateTrigger.cs @@ -53,12 +53,12 @@ namespace RGB.NET.Core } } - private AutoResetEvent _hasDataEvent = new AutoResetEvent(false); + protected AutoResetEvent HasDataEvent = new AutoResetEvent(false); - private bool _isRunning; - private Task _updateTask; - private CancellationTokenSource _updateTokenSource; - private CancellationToken _updateToken; + protected bool IsRunning; + protected Task UpdateTask; + protected CancellationTokenSource UpdateTokenSource; + protected CancellationToken UpdateToken; #endregion @@ -88,13 +88,13 @@ namespace RGB.NET.Core /// public void Start() { - if (_isRunning) return; + if (IsRunning) return; - _isRunning = true; + IsRunning = true; - _updateTokenSource?.Dispose(); - _updateTokenSource = new CancellationTokenSource(); - _updateTask = Task.Factory.StartNew(UpdateLoop, (_updateToken = _updateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default); + UpdateTokenSource?.Dispose(); + UpdateTokenSource = new CancellationTokenSource(); + UpdateTask = Task.Factory.StartNew(UpdateLoop, (UpdateToken = UpdateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default); } /// @@ -102,22 +102,22 @@ namespace RGB.NET.Core /// public async void Stop() { - if (!_isRunning) return; + if (!IsRunning) return; - _isRunning = false; + IsRunning = false; - _updateTokenSource.Cancel(); - await _updateTask; - _updateTask.Dispose(); - _updateTask = null; + UpdateTokenSource.Cancel(); + await UpdateTask; + UpdateTask.Dispose(); + UpdateTask = null; } - private void UpdateLoop() + protected virtual void UpdateLoop() { OnStartup(); - while (!_updateToken.IsCancellationRequested) + while (!UpdateToken.IsCancellationRequested) { - if (_hasDataEvent.WaitOne(Timeout)) + if (HasDataEvent.WaitOne(Timeout)) { long preUpdateTicks = Stopwatch.GetTimestamp(); @@ -135,7 +135,7 @@ namespace RGB.NET.Core } /// - public void TriggerHasData() => _hasDataEvent.Set(); + public void TriggerHasData() => HasDataEvent.Set(); private void UpdateUpdateFrequency() { diff --git a/RGB.NET.Devices.SteelSeries/Generic/SteelSeriesDeviceUpdateTrigger.cs b/RGB.NET.Devices.SteelSeries/Generic/SteelSeriesDeviceUpdateTrigger.cs index 2d5ac46..88c04ac 100644 --- a/RGB.NET.Devices.SteelSeries/Generic/SteelSeriesDeviceUpdateTrigger.cs +++ b/RGB.NET.Devices.SteelSeries/Generic/SteelSeriesDeviceUpdateTrigger.cs @@ -3,71 +3,24 @@ using System; using System.Diagnostics; using System.Threading; -using System.Threading.Tasks; using RGB.NET.Core; namespace RGB.NET.Devices.SteelSeries { /// - /// Represents an update-trigger used to update devices with a maximum update-rate. + /// Represents an update-trigger used to update SteelSeries devices /// - public class SteelSeriesDeviceUpdateTrigger : AbstractUpdateTrigger, IDeviceUpdateTrigger + public class SteelSeriesDeviceUpdateTrigger : DeviceUpdateTrigger { #region Constants - private const long FLUSH_TIMER = 5 * 1000 * TimeSpan.TicksPerMillisecond; // every 5 seconds flush the device to prevent timeouts + private const long FLUSH_TIMER = 5 * 1000 * TimeSpan.TicksPerMillisecond; // flush the device every 5 seconds to prevent timeouts #endregion #region Properties & Fields - /// - /// Gets or sets the timeout used by the blocking wait for data availability. - /// - public int Timeout { get; set; } = 100; - - /// - /// Gets the update frequency used by the trigger if not limited by data shortage. - /// - public double UpdateFrequency { get; private set; } - - private double _maxUpdateRate; - /// - /// Gets or sets the maximum update rate of this trigger (is overwriten if the is smaller). - /// <= 0 removes the limit. - /// - public double MaxUpdateRate - { - get => _maxUpdateRate; - set - { - _maxUpdateRate = value; - UpdateUpdateFrequency(); - } - } - - private double _updateRateHardLimit; - /// - /// Gets the hard limit of the update rate of this trigger. Updates will never perform faster then then this value if it's set. - /// <= 0 removes the limit. - /// - public double UpdateRateHardLimit - { - get => _updateRateHardLimit; - protected set - { - _updateRateHardLimit = value; - UpdateUpdateFrequency(); - } - } - - private AutoResetEvent _hasDataEvent = new AutoResetEvent(false); - private long _lastUpdateTimestamp; - private bool _isRunning; - private Task _updateTask; - private CancellationTokenSource _updateTokenSource; - private CancellationToken _updateToken; #endregion @@ -76,6 +29,7 @@ namespace RGB.NET.Devices.SteelSeries /// /// Initializes a new instance of the class. /// + /// The hard limit of the update rate of this trigger. public SteelSeriesDeviceUpdateTrigger() { } @@ -84,49 +38,19 @@ namespace RGB.NET.Devices.SteelSeries /// /// The hard limit of the update rate of this trigger. public SteelSeriesDeviceUpdateTrigger(double updateRateHardLimit) - { - this.UpdateRateHardLimit = updateRateHardLimit; - } + : base(updateRateHardLimit) + { } #endregion #region Methods - /// - /// Starts the trigger. - /// - public void Start() - { - if (_isRunning) return; - - _isRunning = true; - - _updateTokenSource?.Dispose(); - _updateTokenSource = new CancellationTokenSource(); - _updateTask = Task.Factory.StartNew(UpdateLoop, (_updateToken = _updateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default); - } - - /// - /// Stops the trigger. - /// - public async void Stop() - { - if (!_isRunning) return; - - _isRunning = false; - - _updateTokenSource.Cancel(); - await _updateTask; - _updateTask.Dispose(); - _updateTask = null; - } - - private void UpdateLoop() + protected override void UpdateLoop() { OnStartup(); - while (!_updateToken.IsCancellationRequested) + while (!UpdateToken.IsCancellationRequested) { - if (_hasDataEvent.WaitOne(Timeout)) + if (HasDataEvent.WaitOne(Timeout)) { long preUpdateTicks = Stopwatch.GetTimestamp(); @@ -146,16 +70,6 @@ namespace RGB.NET.Devices.SteelSeries } } - /// - public void TriggerHasData() => _hasDataEvent.Set(); - - private void UpdateUpdateFrequency() - { - UpdateFrequency = MaxUpdateRate; - if ((UpdateFrequency <= 0) || ((UpdateRateHardLimit > 0) && (UpdateRateHardLimit < UpdateFrequency))) - UpdateFrequency = UpdateRateHardLimit; - } - #endregion } }