using System; using System.Collections.Generic; using System.Linq; namespace RGB.NET.Core { public abstract class UpdateQueue { #region Properties & Fields private readonly object _dataLock = new object(); private readonly IUpdateTrigger _updateTrigger; private Dictionary _currentDataSet; #endregion #region Constructors public UpdateQueue(IUpdateTrigger updateTrigger) { this._updateTrigger = updateTrigger; _updateTrigger.Starting += (sender, args) => OnStartup(); _updateTrigger.Update += OnUpdate; } #endregion #region Methods protected virtual void OnUpdate(object sender, EventArgs e) { Dictionary dataSet; lock (_dataLock) { dataSet = _currentDataSet; _currentDataSet = null; } if ((dataSet != null) && (dataSet.Count != 0)) Update(dataSet); } protected virtual void OnStartup() { } protected abstract void Update(Dictionary dataSet); public virtual void SetData(Dictionary dataSet) { if ((dataSet == null) || (dataSet.Count == 0)) return; lock (_dataLock) { if (_currentDataSet == null) _currentDataSet = dataSet; else { foreach (KeyValuePair command in dataSet) _currentDataSet[command.Key] = command.Value; } } _updateTrigger.TriggerHasData(); } public virtual void Reset() { lock (_dataLock) _currentDataSet = null; } #endregion } public abstract class UpdateQueue : UpdateQueue { #region Constructors /// protected UpdateQueue(IUpdateTrigger updateTrigger) : base(updateTrigger) { } #endregion #region Methods public void SetData(IEnumerable leds) => SetData(leds?.ToDictionary(x => x.CustomData ?? x.Id, x => x.Color)); #endregion } }