/// <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); }