From c1d653d78d08948a4744c5fea6b39d10be3028ce Mon Sep 17 00:00:00 2001 From: Tyler Kron Date: Fri, 3 Apr 2026 22:37:55 -0600 Subject: [PATCH] fix: prevent spurious Lost status during intentional disconnect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Disconnect() is called, the transport fires StatusChanged(false) before Disconnect() sets Status = Disconnected, causing an unwanted Connected → Lost → Disconnected transition. Add an _isDisconnecting flag so OnTransportStatusChanged() skips the Lost state during intentional disconnects while still reporting it for unexpected drops. Closes #161 Co-Authored-By: Claude Opus 4.6 --- .../Device/DaqifiDeviceWithTransportTests.cs | 24 ++++++++++++++++++- src/Daqifi.Core/Device/DaqifiDevice.cs | 8 +++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Daqifi.Core.Tests/Device/DaqifiDeviceWithTransportTests.cs b/src/Daqifi.Core.Tests/Device/DaqifiDeviceWithTransportTests.cs index 60752d5..fc2c499 100644 --- a/src/Daqifi.Core.Tests/Device/DaqifiDeviceWithTransportTests.cs +++ b/src/Daqifi.Core.Tests/Device/DaqifiDeviceWithTransportTests.cs @@ -189,7 +189,29 @@ public void DaqifiDevice_WithMockTransport_ShouldConnectAndSendMessages() Assert.Contains("SYSTem:SYSInfoPB?", streamContent); } - [Fact] + [Fact] + public void DaqifiDevice_Disconnect_ShouldNotReportLostStatus() + { + // Arrange + using var transport = new MockStreamTransport(); + using var device = new DaqifiDevice("Mock Device", transport); + + device.Connect(); + Assert.Equal(ConnectionStatus.Connected, device.Status); + + var statusChanges = new List(); + device.StatusChanged += (sender, args) => statusChanges.Add(args.Status); + + // Act - Intentional disconnect + device.Disconnect(); + + // Assert - Should go straight to Disconnected, never Lost + Assert.DoesNotContain(ConnectionStatus.Lost, statusChanges); + Assert.Contains(ConnectionStatus.Disconnected, statusChanges); + Assert.Equal(ConnectionStatus.Disconnected, device.Status); + } + + [Fact] public void DaqifiDevice_TransportConnectionLost_ShouldUpdateStatus() { // Arrange diff --git a/src/Daqifi.Core/Device/DaqifiDevice.cs b/src/Daqifi.Core/Device/DaqifiDevice.cs index 0661fea..d19402f 100644 --- a/src/Daqifi.Core/Device/DaqifiDevice.cs +++ b/src/Daqifi.Core/Device/DaqifiDevice.cs @@ -76,6 +76,7 @@ public class DaqifiDevice : IDevice, IDisposable private IProtocolHandler? _protocolHandler; private bool _disposed; + private bool _isDisconnecting; private bool _isInitialized; private readonly List _channels = new(); @@ -198,6 +199,7 @@ public void Connect() /// public void Disconnect() { + _isDisconnecting = true; try { // Unsubscribe from message consumer events @@ -218,6 +220,7 @@ public void Disconnect() Status = ConnectionStatus.Disconnected; State = DeviceState.Disconnected; _isInitialized = false; + _isDisconnecting = false; } } @@ -489,8 +492,9 @@ private void OnTransportStatusChanged(object? sender, TransportStatusEventArgs e } else { - // Transport disconnected, update device status - if (Status == ConnectionStatus.Connected) + // Transport disconnected — only report Lost for unexpected drops, + // not during an intentional Disconnect() call + if (Status == ConnectionStatus.Connected && !_isDisconnecting) { Status = ConnectionStatus.Lost; }