Example #1
0
        /// <summary>
        /// Constructs a new MultiClampDevice
        /// </summary>
        /// <param name="commander">MultiClampCommander instance</param>
        /// <param name="c">Symphony Controller instance</param>
        /// <param name="background">Dictionary of background Measurements for each MultiClamp operating mode</param>
        public MultiClampDevice(IMultiClampCommander commander, Controller c, IDictionary <MultiClampInterop.OperatingMode, IMeasurement> background)
            : base("Multiclamp-" + commander.SerialNumber + "-" + commander.Channel, "Molecular Devices", c)
        {
            InputParameters  = new ConcurrentDictionary <DateTimeOffset, MultiClampParametersChangedArgs>();
            OutputParameters = new ConcurrentDictionary <DateTimeOffset, MultiClampParametersChangedArgs>();

            Commander = commander;
            Commander.ParametersChanged += (sender, mdArgs) =>
            {
                log.DebugFormat("MultiClamp parameters changed. Mode = {0}, External Command Sensistivity Units = {1} Timestamp = {2}",
                                mdArgs.Data.OperatingMode,
                                mdArgs.Data.ExternalCommandSensitivityUnits,
                                mdArgs.TimeStamp);

                if (HasBoundInputStream)
                {
                    InputParameters[mdArgs.TimeStamp.ToUniversalTime()] = mdArgs;
                }

                if (HasBoundOutputStream)
                {
                    OutputParameters[mdArgs.TimeStamp.ToUniversalTime()] = mdArgs;

                    foreach (var outputStream in Streams.Values.OfType <IDAQOutputStream>().Where(s => s.DAQ != null && s.DAQ.Running == false))
                    {
                        log.DebugFormat("Setting new background for stream {0}", outputStream.Name);
                        outputStream.ApplyBackground();
                    }
                }
            };

            Backgrounds = background;
        }
        /// <summary>
        /// Constructs a new MultiClampDevice
        /// </summary>
        /// <param name="commander">MultiClampCommander instance</param>
        /// <param name="c">Symphony Controller instance</param>
        /// <param name="background">Dictionary of background Measurements for each MultiClamp operating mode</param>
        public MultiClampDevice(IMultiClampCommander commander, Controller c, IDictionary<MultiClampInterop.OperatingMode, IMeasurement> background)
            : base("Multiclamp-" + commander.SerialNumber + "-" + commander.Channel, "Molecular Devices", c)
        {
            InputParameters = new ConcurrentDictionary<DateTimeOffset, MultiClampParametersChangedArgs>();
            OutputParameters = new ConcurrentDictionary<DateTimeOffset, MultiClampParametersChangedArgs>();

            Commander = commander;
            Commander.ParametersChanged += (sender, mdArgs) =>
                                               {
                                                   log.DebugFormat("MultiClamp parameters changed. Mode = {0}, External Command Sensistivity Units = {1} Timestamp = {2}",
                                                       mdArgs.Data.OperatingMode,
                                                       mdArgs.Data.ExternalCommandSensitivityUnits,
                                                       mdArgs.TimeStamp);

                                                   if (HasBoundInputStream)
                                                       InputParameters[mdArgs.TimeStamp.ToUniversalTime()] = mdArgs;

                                                   if (HasBoundOutputStream)
                                                   {
                                                       OutputParameters[mdArgs.TimeStamp.ToUniversalTime()] = mdArgs;

                                                       foreach (var outputStream in Streams.Values.OfType<IDAQOutputStream>().Where(s => s.DAQ != null && s.DAQ.Running == false))
                                                       {
                                                           log.DebugFormat("Setting new background for stream {0}", outputStream.Name);
                                                           outputStream.ApplyBackground();
                                                       }
                                                   }
                                               };

            Backgrounds = background;
        }
        /// <summary>
        /// ExternalDevice implementation for MultiClamp 700[A,B] device.
        ///
        /// Spec:
        /// Should register a unit conversion proc that uses device parameters to convert incoming/outgoing units
        /// Given a queue of parameters updates
        ///     Should use the most recent parameter update to calculate unit conversion for IOutputData
        /// Given a queue of paramteter updates
        ///     Should use the parameter update most recent but preceeding (in time) the input data InputTime to calculate unit conversion of IInputData
        ///     Should discard parameter updates older than the used parameter update
        /// </summary>
        /// <param name="serialNumber"></param>
        /// <param name="channel"></param>
        /// <param name="background"></param>
        public MulticlampDevice(uint serialNumber, uint channel, IMultiClampCommander commander, Controller c, Measurement background)
            : base("Multiclamp-" + serialNumber + "-" + channel, c, background)
        {
            DeviceParameters = new ConcurrentQueue <MulticlampParametersChangedArgs>();

            Commander = commander;
            Commander.ParametersChanged += (sender, mdArgs) => DeviceParameters.Enqueue(mdArgs);
        }
        /// <summary>
        /// Constructs a new MultiClampDevice
        /// </summary>
        /// <param name="commander">MultiClampCommander instance</param>
        /// <param name="c">Symphony Controller instance</param>
        /// <param name="background">Dictionary of background Measurements for each MultiClamp operating mode</param>
        public MultiClampDevice(IMultiClampCommander commander, Controller c, IDictionary<MultiClampInterop.OperatingMode, IMeasurement> background)
            : base("Multiclamp-" + commander.SerialNumber + "-" + commander.Channel, "Molecular Devices", c)
        {
            InputParameters = new ConcurrentDictionary<DateTimeOffset, MultiClampParametersChangedArgs>();
            OutputParameters = new ConcurrentDictionary<DateTimeOffset, MultiClampParametersChangedArgs>();

            Commander = commander;
            Commander.ParametersChanged += (sender, mdArgs) =>
                {
                    lock (_bindLock)
                    {
                        log.DebugFormat(
                            "MultiClamp parameters changed. Mode = {0}, External Command Sensistivity Units = {1} Timestamp = {2}",
                            mdArgs.Data.OperatingMode,
                            mdArgs.Data.ExternalCommandSensitivityUnits,
                            mdArgs.TimeStamp);

                        if (!HasBoundInputStream)
                            InputParameters.Clear();

                        InputParameters[mdArgs.TimeStamp.ToUniversalTime()] = mdArgs;

                        if (!HasBoundOutputStream)
                            OutputParameters.Clear();

                        OutputParameters[mdArgs.TimeStamp.ToUniversalTime()] = mdArgs;

                        foreach (var outputStream in OutputStreams.Where(s => s.DAQ != null && s.DAQ.IsHardwareReady && !s.DAQ.IsRunning))
                        {
                            log.DebugFormat("Setting new background for stream {0}", outputStream.Name);
                            try
                            {
                                outputStream.ApplyBackground();
                            }
                            catch (Exception x)
                            {
                                log.ErrorFormat("Error applying new background: {0}", x);
                                throw;
                            }

                        }
                    }
                };
            Commander.RequestTelegraphValue();

            Backgrounds = background;
        }
        /// <summary>
        /// ExternalDevice implementation for MultiClamp 700[A,B] device.
        /// 
        /// Spec:
        /// Should register a unit conversion proc that uses device parameters to convert incoming/outgoing units
        /// Given a queue of parameters updates
        ///     Should use the most recent parameter update to calculate unit conversion for IOutputData
        /// Given a queue of paramteter updates
        ///     Should use the parameter update most recent but preceeding (in time) the input data InputTime to calculate unit conversion of IInputData
        ///     Should discard parameter updates older than the used parameter update
        /// </summary>
        /// <param name="serialNumber"></param>
        /// <param name="channel"></param>
        /// <param name="background"></param>
        public MulticlampDevice(uint serialNumber, uint channel, IMultiClampCommander commander, Controller c, Measurement background)
            : base("Multiclamp-" + serialNumber + "-" + channel, c, background)
        {
            DeviceParameters = new ConcurrentQueue<MulticlampParametersChangedArgs>();

            Commander = commander;
            Commander.ParametersChanged += (sender, mdArgs) => DeviceParameters.Enqueue(mdArgs);
        }