public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { /* * IOuputData will be directed to a device (not an DAQStream) by the controller. * Controller should get mapping (device=>data) from the current Epoch instance. * * Thus the standard PullOuputData will pull from the controller's queue for this * device. */ if (duration.Samples(stream.SampleRate) <= 1) { throw new ExternalDeviceException("Cannot pull less than one sample."); } try { IOutputData data = this.Controller.PullOutputData(this, duration); return(data.DataWithUnits(MeasurementConversionTarget) .DataWithExternalDeviceConfiguration(this, Configuration)); } catch (Exception ex) { log.DebugFormat("Error pulling data from controller: " + ex.Message); throw; } }
/// <summary> /// Pulls data for output to the given IDAQStream. Default implementation pulls data from /// this Device's Controller. /// </summary> /// <remarks>Appends this Device's Configuration to the IOutputData</remarks> /// <param name="stream">Stream for output</param> /// <param name="duration">Requested duration</param> /// <returns>IOutputData of duration less than or equal to duration</returns> /// <exception cref="ExternalDeviceException">Requested duration is less than one sample</exception> public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { /* * IOuputData will be directed to a device (not an DAQStream) by the controller. * Controller should get mapping (device=>data) from the current Epoch instance. * * Thus the standard PullOuputData will pull from the controller's queue for this * device. */ try { //TODO should raise exception if duration is less than one sample IOutputData data = this.Controller.PullOutputData(this, duration); var deviceParameters = DeviceParametersForOutput(DateTimeOffset.Now.UtcDateTime).Data; var config = MergeDeviceParametersIntoConfiguration(Configuration, deviceParameters); log.DebugFormat("Pulling OutputData with parameters {0} (units {1})", config, UnitsForScaleFactorUnits(deviceParameters.ScaleFactorUnits)); return(data.DataWithConversion(m => ConvertOutput(m, deviceParameters)) .DataWithExternalDeviceConfiguration(this, config)); } catch (Exception ex) { log.DebugFormat("Error pulling data from controller: {0} ({1})", ex.Message, ex); throw; } }
/// <summary> /// Associate an IDAQOutputStream with this device using the given association name. Sets this device as the stream's /// output Device. /// </summary> /// <param name="name">Association name</param> /// <param name="outputStream">Stream to bind</param> public ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream) { Contract.Assert(outputStream != null, "outputStream is null"); Contract.Assert(name != null && name.Length > 0, "name is null or empty"); outputStream.Device = this; this.Streams[name] = outputStream; return(this); }
public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background) { if (Running && !StopRequested) { throw new HekaDAQException("Cannot set stream background while running"); } log.DebugFormat("Setting stream background: {0}", s.Background); Device.SetStreamBackgroundAsyncIO(s as HekaDAQOutputStream); }
private void OnStimulusOutput(DateTimeOffset time, IDAQOutputStream stream, IIOData data) { lock (eventLock) { var evt = StimulusOutput; if (evt != null) { evt(this, new TimeStampedStimulusOutputEventArgs(time, stream, data)); } } }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { if (this.OutputData[stream].Count > 0) { return(OutputData[stream].Dequeue().SplitData(duration).Head); } else { return(new OutputData(new List <IMeasurement>(), stream.SampleRate, true)); } }
private void FixtureForController(HekaDAQController controller, double durationSeconds = 10) { controller.Clock = controller; controller.SampleRate = new Measurement(10000, "Hz"); controller.InitHardware(); OutStream = controller.OutputStreams .OfType <HekaDAQOutputStream>() .Where(str => str.ChannelNumber == 0) .First(); InputStream = controller.InputStreams .OfType <HekaDAQInputStream>() .Where(str => str.ChannelNumber == 0) .First(); InputStream.Configuration["SampleRate"] = InputStream.SampleRate; OutStream.Configuration["SampleRate"] = OutStream.SampleRate; IDAQOutputStream s = OutStream; var dataQueue = new Dictionary <IDAQOutputStream, Queue <IOutputData> >(); dataQueue[s] = new Queue <IOutputData>(); Data = new OutputData( Enumerable.Range(0, (int)(TimeSpan.FromSeconds(durationSeconds).Samples(controller.SampleRate))) .Select(i => new Measurement(i % 10, "V")).ToList(), s.SampleRate, false); TimeSpan d = new TimeSpan(controller.ProcessInterval.Ticks / 2); var outData = (IOutputData)Data.Clone(); while (outData.Duration > TimeSpan.Zero) { var split = outData.SplitData(d); dataQueue[s].Enqueue(new OutputData(split.Head, split.Rest.Duration == TimeSpan.Zero)); outData = split.Rest; } OutDevice = new TestDevice("Output", dataQueue); InputDevice = new TestDevice("Intput", null); OutDevice.MeasurementConversionTarget = "V"; InputDevice.MeasurementConversionTarget = "V"; BindStreams(controller, OutDevice, InputDevice); }
public void ApplyStreamBackground(IDAQOutputStream s) { if (s.DAQ != this) { throw new DAQException("Output stream does not use this DAQ controller."); } if (Running && !StopRequested) { throw new DAQException("Attempted to set background on running stream"); } ApplyStreamBackgroundAsync(s, s.Background); }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { /* * IOuputData will be directed to a device (not an DAQStream) by the controller. * Controller should get mapping (device=>data) from the current Epoch instance. * * Thus the standard PullOuputData will pull from the controller's queue for this * device. */ //TODO should raise exception if duration is less than one sample IOutputData data = this.Controller.PullOutputData(this, duration); //TODO return(new OutputData(data, data.DataWithUnits(MeasurementConversionTarget).Data).DataWithExternalDeviceConfiguration(Configuration)); }
public TimeStampedStimulusOutputEventArgs(IClock clock, IDAQOutputStream stream, IIOData data) : base(clock) { Stream = stream; Data = data; }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { /* * IOuputData will be directed to a device (not an DAQStream) by the controller. * Controller should get mapping (device=>data) from the current Epoch instance. * * Thus the standard PullOuputData will pull from the controller's queue for this * device. */ if (duration.Samples(stream.SampleRate) <= 1) throw new ExternalDeviceException("Cannot pull less than one sample."); try { IOutputData data = this.Controller.PullOutputData(this, duration); return data.DataWithUnits(MeasurementConversionTarget) .DataWithExternalDeviceConfiguration(this, Configuration); } catch (Exception ex) { log.DebugFormat("Error pulling data from controller: " + ex.Message); throw; } }
public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable<IPipelineNodeConfiguration> configuration) { Controller.DidOutputData(this, outputTime, duration, configuration); }
/// <summary> /// Associate an IDAQOutputStream with this ExternalDevice. Sets this device as the stream's /// output Device. /// </summary> /// <param name="outputStream">Stream to bind</param> public ExternalDeviceBase BindStream(IDAQOutputStream outputStream) { Contract.Assert(outputStream != null, "outputStream is null"); return BindStream(outputStream.Name, outputStream); }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { if (this.OutputData[stream].Count > 0) { return OutputData[stream].Dequeue().SplitData(duration).Head; } else { return new OutputData(new List<IMeasurement>(), stream.SampleRate, true); } }
public void RemoveStreamMapping(IDAQOutputStream outStream) { StreamMapping.Remove(outStream); }
public void AddStreamMapping(IDAQOutputStream outStream, IDAQInputStream inStream) { StreamMapping[outStream] = inStream; }
protected IOutputData NextOutputDataForStream(IDAQOutputStream os) { return(os.PullOutputData(ProcessInterval)); }
public abstract void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background);
/// <summary> /// Pulls data for output to the given IDAQStream. Default implementation pulls data from /// this Device's Controller. /// </summary> /// <remarks>Appends this Device's Configuration to the IOutputData</remarks> /// <param name="stream">Stream for output</param> /// <param name="duration">Requested duration</param> /// <returns>IOutputData of duration less than or equal to duration</returns> /// <exception cref="ExternalDeviceException">Requested duration is less than one sample</exception> public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { /* * IOuputData will be directed to a device (not an DAQStream) by the controller. * Controller should get mapping (device=>data) from the current Epoch instance. * * Thus the standard PullOuputData will pull from the controller's queue for this * device. */ try { //TODO should raise exception if duration is less than one sample IOutputData data = this.Controller.PullOutputData(this, duration); var deviceParameters = DeviceParametersForOutput(DateTimeOffset.Now.UtcDateTime).Data; var config = MergeDeviceParametersIntoConfiguration(Configuration, deviceParameters); log.DebugFormat("Pulling OutputData with parameters {0} (units {1})", config, UnitsForScaleFactorUnits(deviceParameters.ScaleFactorUnits)); return data.DataWithConversion(m => ConvertOutput(m, deviceParameters)) .DataWithExternalDeviceConfiguration(this, config); } catch (Exception ex) { log.DebugFormat("Error pulling data from controller: {0} ({1})", ex.Message, ex); throw; } }
public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background) { throw new NotImplementedException(); }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { try { var deviceParameters = CurrentDeviceParameters; var config = MergeDeviceParametersIntoConfiguration(Configuration, deviceParameters); IOutputData data = this.Controller.PullOutputData(this, duration); return data.DataWithConversion(m => ConvertOutput(m, deviceParameters)) .DataWithExternalDeviceConfiguration(this, config); } catch (Exception ex) { log.DebugFormat("Error pulling data from controller: {0} ({1})", ex.Message, ex); throw; } }
private void FixtureForController(NIDAQController controller, double durationSeconds = 10) { controller.SampleRate = new Measurement(10000, "Hz"); controller.InitHardware(); OutStream = controller.OutputStreams .OfType<NIDAQOutputStream>().First(str => str.Name == "ao0"); InputStream = controller.InputStreams .OfType<NIDAQInputStream>().First(str => str.Name == "ai0"); InputStream.Configuration["SampleRate"] = InputStream.SampleRate; OutStream.Configuration["SampleRate"] = OutStream.SampleRate; IDAQOutputStream s = OutStream; var dataQueue = new Dictionary<IDAQOutputStream, Queue<IOutputData>>(); dataQueue[s] = new Queue<IOutputData>(); Data = new OutputData( Enumerable.Range(0, (int)(TimeSpan.FromSeconds(durationSeconds).Samples(controller.SampleRate))) .Select(i => new Measurement(i % 10, "V")).ToList(), s.SampleRate, false); TimeSpan d = new TimeSpan(controller.ProcessInterval.Ticks / 2); var outData = (IOutputData)Data.Clone(); while (outData.Duration > TimeSpan.Zero) { var split = outData.SplitData(d); dataQueue[s].Enqueue(new OutputData(split.Head, split.Rest.Duration == TimeSpan.Zero)); outData = split.Rest; } OutDevice = new TestDevice("Output", dataQueue); InputDevice = new TestDevice("Input", null); OutDevice.MeasurementConversionTarget = "V"; InputDevice.MeasurementConversionTarget = "V"; BindStreams(controller, OutDevice, InputDevice); }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { /* * IOuputData will be directed to a device (not an DAQStream) by the controller. * Controller should get mapping (device=>data) from the current Epoch instance. * * Thus the standard PullOuputData will pull from the controller's queue for this * device. */ //TODO should raise exception if duration is less than one sample IOutputData data = this.Controller.PullOutputData(this, duration); //TODO return new OutputData(data, data.DataWithUnits(MeasurementConversionTarget).Data).DataWithExternalDeviceConfiguration(Configuration); }
/// <summary> /// Associate an IDAQOutputStream with this ExternalDevice. Sets this device as the stream's /// output Device. /// </summary> /// <param name="outputStream">Stream to bind</param> public ExternalDeviceBase BindStream(IDAQOutputStream outputStream) { Contract.Assert(outputStream != null, "outputStream is null"); return(BindStream(outputStream.Name, outputStream)); }
/// <summary> /// Associate an IDAQOutputStream with this device using the given association name. Sets this device as the stream's /// output Device. /// </summary> /// <param name="name">Association name</param> /// <param name="outputStream">Stream to bind</param> public ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream) { Contract.Assert(outputStream != null, "outputStream is null"); Contract.Assert(name != null && name.Length > 0, "name is null or empty"); outputStream.Device = this; this.Streams[name] = outputStream; return this; }
public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background) { if(Running && !StopRequested) { throw new HekaDAQException("Cannot set stream background while running"); } log.DebugFormat("Setting stream background: {0}", s.Background); Device.SetStreamBackgroundAsyncIO(s as HekaDAQOutputStream); }
// needs a shot at processing the OutputData on its way out to the board /// <summary> /// Pulls data for output to the given IDAQStream. Default implementation pulls data from /// this Device's Controller. /// </summary> /// <remarks>Appends this Device's Configuration to the IOutputData</remarks> /// <param name="stream">Stream for output</param> /// <param name="duration">Requested duration</param> /// <returns>IOutputData of duration less than or equal to duration</returns> /// <exception cref="ExternalDeviceException">Requested duration is less than one sample</exception> public abstract IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration);
public ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream) { throw new NotImplementedException(); }
public override IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { throw new NotImplementedException(); }
public TimeStampedStimulusOutputEventArgs(DateTimeOffset time, IDAQOutputStream stream, IIOData data) : base(time) { Stream = stream; Data = data; }
public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable <IPipelineNodeConfiguration> configuration) { throw new NotImplementedException(); }
public IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration) { throw new NotImplementedException(); }
public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable <IPipelineNodeConfiguration> configuration) { Controller.DidOutputData(this, outputTime, duration, configuration); }
public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background) { AsyncBackground = background; }
public override void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable<IPipelineNodeConfiguration> configuration) { if (Controller != null) { base.DidOutputData(stream, outputTime, duration, configuration); } }
public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable<IPipelineNodeConfiguration> configuration) { throw new NotImplementedException(); }
public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background) { }
public override ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream) { lock(_bindLock) base.BindStream(name, outputStream); Commander.RequestTelegraphValue(); return this; }