From 15c056f11b0bfb386a722674ed213416f5697a68 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Sat, 5 Nov 2022 21:07:11 +0100 Subject: [PATCH] Addded heartbeats to dmx devices --- RGB.NET.Devices.DMX/DMXDeviceProvider.cs | 14 ++++++++++++-- .../E131/E131DMXDeviceDefinition.cs | 6 ++++++ RGB.NET.Devices.DMX/E131/E131UpdateQueue.cs | 8 ++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/RGB.NET.Devices.DMX/DMXDeviceProvider.cs b/RGB.NET.Devices.DMX/DMXDeviceProvider.cs index ee12196..55e8e3f 100644 --- a/RGB.NET.Devices.DMX/DMXDeviceProvider.cs +++ b/RGB.NET.Devices.DMX/DMXDeviceProvider.cs @@ -57,14 +57,15 @@ public class DMXDeviceProvider : AbstractRGBDeviceProvider /// protected override IEnumerable LoadDevices() { - foreach (IDMXDeviceDefinition dmxDeviceDefinition in DeviceDefinitions) + for (int i = 0; i < DeviceDefinitions.Count; i++) { + IDMXDeviceDefinition dmxDeviceDefinition = DeviceDefinitions[i]; IRGBDevice? device = null; try { if (dmxDeviceDefinition is E131DMXDeviceDefinition e131DMXDeviceDefinition) if (e131DMXDeviceDefinition.Leds.Count > 0) - device = new E131Device(new E131DeviceInfo(e131DMXDeviceDefinition), e131DMXDeviceDefinition.Leds, GetUpdateTrigger(0)); + device = new E131Device(new E131DeviceInfo(e131DMXDeviceDefinition), e131DMXDeviceDefinition.Leds, GetUpdateTrigger(i)); } catch (Exception ex) { @@ -76,5 +77,14 @@ public class DMXDeviceProvider : AbstractRGBDeviceProvider } } + protected override IDeviceUpdateTrigger CreateUpdateTrigger(int id, double updateRateHardLimit) + { + DeviceUpdateTrigger updateTrigger = new(updateRateHardLimit); + if ((DeviceDefinitions[id] is E131DMXDeviceDefinition e131DMXDeviceDefinition)) + updateTrigger.HeartbeatTimer = e131DMXDeviceDefinition.HeartbeatTimer; + + return updateTrigger; + } + #endregion } \ No newline at end of file diff --git a/RGB.NET.Devices.DMX/E131/E131DMXDeviceDefinition.cs b/RGB.NET.Devices.DMX/E131/E131DMXDeviceDefinition.cs index 12f0cb1..37db5ea 100644 --- a/RGB.NET.Devices.DMX/E131/E131DMXDeviceDefinition.cs +++ b/RGB.NET.Devices.DMX/E131/E131DMXDeviceDefinition.cs @@ -57,6 +57,12 @@ public class E131DMXDeviceDefinition : IDMXDeviceDefinition /// public Dictionary getValueFunc)>> Leds { get; } = new(); + /// + /// The time in ms after which the device is updated even if no changes are made in the meantime to prevent the target from timing out or similar problems. + /// To disable heartbeats leave it at 0. + /// + public int HeartbeatTimer { get; set; } = 0; + #endregion #region Constructors diff --git a/RGB.NET.Devices.DMX/E131/E131UpdateQueue.cs b/RGB.NET.Devices.DMX/E131/E131UpdateQueue.cs index e6c108f..850e4d2 100644 --- a/RGB.NET.Devices.DMX/E131/E131UpdateQueue.cs +++ b/RGB.NET.Devices.DMX/E131/E131UpdateQueue.cs @@ -50,6 +50,14 @@ public class E131UpdateQueue : UpdateQueue #region Methods + protected override void OnUpdate(object? sender, CustomUpdateData customData) + { + if (customData[CustomUpdateDataIndex.HEARTBEAT] as bool? == true) + Update(Array.Empty<(object key, Color color)>()); + else + base.OnUpdate(sender, customData); + } + /// protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet) {