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)
{