namespace ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Proxy.Supervisor; /// /// Tracks missed heartbeats on the dedicated heartbeat pipe per /// driver-stability.md ยง"Heartbeat between proxy and host": 2s cadence, 3 consecutive /// misses = host declared dead (~6s detection). /// public sealed class HeartbeatMonitor { public int MissesUntilDead { get; init; } = 3; public TimeSpan Cadence { get; init; } = TimeSpan.FromSeconds(2); public int ConsecutiveMisses { get; private set; } public DateTime? LastAckUtc { get; private set; } public void RecordAck(DateTime utcNow) { ConsecutiveMisses = 0; LastAckUtc = utcNow; } public bool RecordMiss() { ConsecutiveMisses++; return ConsecutiveMisses >= MissesUntilDead; } }