7
7
using System . Xml . Serialization ;
8
8
using System . Threading . Tasks ;
9
9
using System . Threading ;
10
+ using System . IO ;
10
11
11
12
namespace Bonsai . Harp
12
13
{
@@ -255,6 +256,26 @@ static IObservable<string> GetDeviceName(string portName, LedState ledState, Led
255
256
. FirstAsync ( ) ;
256
257
}
257
258
259
+ private void CloseTransport ( SerialTransport transport )
260
+ {
261
+ try
262
+ {
263
+ var writeOpCtrl = OperationControl . FromPayload ( MessageType . Write , new OperationControlPayload (
264
+ OperationMode . Standby ,
265
+ dumpRegisters : false ,
266
+ MuteReplies ,
267
+ VisualIndicators ,
268
+ OperationLed ,
269
+ Heartbeat ) ) ;
270
+ transport . Write ( writeOpCtrl ) ;
271
+ }
272
+ catch ( Exception ex ) when ( ex is IOException || ex is InvalidOperationException || ex is ObjectDisposedException )
273
+ {
274
+ // ignore port IO errors
275
+ }
276
+ finally { transport . Close ( ) ; }
277
+ }
278
+
258
279
/// <summary>
259
280
/// Connects to the specified serial port and returns an observable sequence of Harp messages
260
281
/// coming from the device.
@@ -265,18 +286,7 @@ public override IObservable<HarpMessage> Generate()
265
286
return Observable . Create < HarpMessage > ( async ( observer , cancellationToken ) =>
266
287
{
267
288
var transport = await CreateTransportAsync ( observer , cancellationToken ) ;
268
- return Disposable . Create ( ( ) =>
269
- {
270
- var writeOpCtrl = OperationControl . FromPayload ( MessageType . Write , new OperationControlPayload (
271
- OperationMode . Standby ,
272
- dumpRegisters : false ,
273
- MuteReplies ,
274
- VisualIndicators ,
275
- OperationLed ,
276
- Heartbeat ) ) ;
277
- transport . Write ( writeOpCtrl ) ;
278
- transport . Close ( ) ;
279
- } ) ;
289
+ return Disposable . Create ( ( ) => CloseTransport ( transport ) ) ;
280
290
} ) ;
281
291
}
282
292
@@ -299,16 +309,8 @@ public IObservable<HarpMessage> Generate(IObservable<HarpMessage> source)
299
309
300
310
return Disposable . Create ( ( ) =>
301
311
{
302
- var writeOpCtrl = OperationControl . FromPayload ( MessageType . Write , new OperationControlPayload (
303
- OperationMode . Standby ,
304
- dumpRegisters : false ,
305
- MuteReplies ,
306
- VisualIndicators ,
307
- OperationLed ,
308
- Heartbeat ) ) ;
309
- transport . Write ( writeOpCtrl ) ;
310
312
sourceDisposable . Dispose ( ) ;
311
- transport . Close ( ) ;
313
+ CloseTransport ( transport ) ;
312
314
} ) ;
313
315
} ) ;
314
316
}
0 commit comments