public PulsePalDisposable(PulsePal pulsePal, IDisposable disposable) { if (pulsePal == null) { throw new ArgumentNullException("pulsePal"); } if (disposable == null) { throw new ArgumentNullException("disposable"); } PulsePal = pulsePal; resource = disposable; }
internal static PulsePalDisposable ReserveConnection(string portName) { if (string.IsNullOrEmpty(portName)) { throw new ArgumentException("A serial port name must be specified.", "portName"); } Tuple <PulsePal, RefCountDisposable> connection; lock (openConnectionsLock) { if (!openConnections.TryGetValue(portName, out connection)) { var pulsePal = new PulsePal(portName); pulsePal.Open(); pulsePal.SetClientId("Bonsai"); var configuration = LoadConfiguration(); if (configuration.Contains(portName)) { var pulsePalConfiguration = configuration[portName]; foreach (var parameter in pulsePalConfiguration.ChannelParameters) { pulsePal.ProgramParameter(parameter.Channel, parameter.ParameterCode, parameter.Value); } } var dispose = Disposable.Create(() => { pulsePal.Close(); openConnections.Remove(portName); }); var refCount = new RefCountDisposable(dispose); connection = Tuple.Create(pulsePal, refCount); openConnections.Add(portName, connection); return(new PulsePalDisposable(pulsePal, refCount)); } } return(new PulsePalDisposable(connection.Item1, connection.Item2.GetDisposable())); }