diff --git a/Bonsai.Harp/Bonsai.Harp.csproj b/Bonsai.Harp/Bonsai.Harp.csproj index 1cec944..7919e01 100644 --- a/Bonsai.Harp/Bonsai.Harp.csproj +++ b/Bonsai.Harp/Bonsai.Harp.csproj @@ -7,7 +7,8 @@ true net462;netstandard2.0 true - 3.5.1 + 3.5.2 + diff --git a/Bonsai.Harp/Device.cs b/Bonsai.Harp/Device.cs index 4d0253f..72eca9b 100644 --- a/Bonsai.Harp/Device.cs +++ b/Bonsai.Harp/Device.cs @@ -7,6 +7,7 @@ using System.Xml.Serialization; using System.Threading.Tasks; using System.Threading; +using System.IO; namespace Bonsai.Harp { @@ -255,6 +256,26 @@ static IObservable GetDeviceName(string portName, LedState ledState, Led .FirstAsync(); } + private void CloseTransport(SerialTransport transport) + { + try + { + var writeOpCtrl = OperationControl.FromPayload(MessageType.Write, new OperationControlPayload( + OperationMode.Standby, + dumpRegisters: false, + MuteReplies, + VisualIndicators, + OperationLed, + Heartbeat)); + transport.Write(writeOpCtrl); + } + catch (Exception ex) when (ex is IOException || ex is InvalidOperationException || ex is ObjectDisposedException) + { + // ignore port IO errors + } + finally { transport.Close(); } + } + /// /// Connects to the specified serial port and returns an observable sequence of Harp messages /// coming from the device. @@ -265,18 +286,7 @@ public override IObservable Generate() return Observable.Create(async (observer, cancellationToken) => { var transport = await CreateTransportAsync(observer, cancellationToken); - return Disposable.Create(() => - { - var writeOpCtrl = OperationControl.FromPayload(MessageType.Write, new OperationControlPayload( - OperationMode.Standby, - dumpRegisters: false, - MuteReplies, - VisualIndicators, - OperationLed, - Heartbeat)); - transport.Write(writeOpCtrl); - transport.Close(); - }); + return Disposable.Create(() => CloseTransport(transport)); }); } @@ -299,16 +309,8 @@ public IObservable Generate(IObservable source) return Disposable.Create(() => { - var writeOpCtrl = OperationControl.FromPayload(MessageType.Write, new OperationControlPayload( - OperationMode.Standby, - dumpRegisters: false, - MuteReplies, - VisualIndicators, - OperationLed, - Heartbeat)); - transport.Write(writeOpCtrl); sourceDisposable.Dispose(); - transport.Close(); + CloseTransport(transport); }); }); }