public PulsePalDisposable(PulsePal pulsePal, IDisposable disposable)
        {
            if (pulsePal == null)
            {
                throw new ArgumentNullException("pulsePal");
            }

            if (disposable == null)
            {
                throw new ArgumentNullException("disposable");
            }

            PulsePal = pulsePal;
            resource = disposable;
        }
Exemple #2
0
        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()));
        }