Skip to content

Commit 0829573

Browse files
tylerkronclaude
andauthored
fix: prevent spurious Lost status during intentional disconnect (#162)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3dfe93f commit 0829573

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/Daqifi.Core.Tests/Device/DaqifiDeviceWithTransportTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,29 @@ public void DaqifiDevice_WithMockTransport_ShouldConnectAndSendMessages()
189189
Assert.Contains("SYSTem:SYSInfoPB?", streamContent);
190190
}
191191

192-
[Fact]
192+
[Fact]
193+
public void DaqifiDevice_Disconnect_ShouldNotReportLostStatus()
194+
{
195+
// Arrange
196+
using var transport = new MockStreamTransport();
197+
using var device = new DaqifiDevice("Mock Device", transport);
198+
199+
device.Connect();
200+
Assert.Equal(ConnectionStatus.Connected, device.Status);
201+
202+
var statusChanges = new List<ConnectionStatus>();
203+
device.StatusChanged += (sender, args) => statusChanges.Add(args.Status);
204+
205+
// Act - Intentional disconnect
206+
device.Disconnect();
207+
208+
// Assert - Should go straight to Disconnected, never Lost
209+
Assert.DoesNotContain(ConnectionStatus.Lost, statusChanges);
210+
Assert.Contains(ConnectionStatus.Disconnected, statusChanges);
211+
Assert.Equal(ConnectionStatus.Disconnected, device.Status);
212+
}
213+
214+
[Fact]
193215
public void DaqifiDevice_TransportConnectionLost_ShouldUpdateStatus()
194216
{
195217
// Arrange

src/Daqifi.Core/Device/DaqifiDevice.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public class DaqifiDevice : IDevice, IDisposable
7676

7777
private IProtocolHandler? _protocolHandler;
7878
private bool _disposed;
79+
private bool _isDisconnecting;
7980
private bool _isInitialized;
8081
private readonly List<IChannel> _channels = new();
8182

@@ -198,6 +199,7 @@ public void Connect()
198199
/// </summary>
199200
public void Disconnect()
200201
{
202+
_isDisconnecting = true;
201203
try
202204
{
203205
// Unsubscribe from message consumer events
@@ -218,6 +220,7 @@ public void Disconnect()
218220
Status = ConnectionStatus.Disconnected;
219221
State = DeviceState.Disconnected;
220222
_isInitialized = false;
223+
_isDisconnecting = false;
221224
}
222225
}
223226

@@ -489,8 +492,9 @@ private void OnTransportStatusChanged(object? sender, TransportStatusEventArgs e
489492
}
490493
else
491494
{
492-
// Transport disconnected, update device status
493-
if (Status == ConnectionStatus.Connected)
495+
// Transport disconnected — only report Lost for unexpected drops,
496+
// not during an intentional Disconnect() call
497+
if (Status == ConnectionStatus.Connected && !_isDisconnecting)
494498
{
495499
Status = ConnectionStatus.Lost;
496500
}

0 commit comments

Comments
 (0)