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; }