Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
 private void OnStimulusOutput(DateTimeOffset time, IDAQOutputStream stream, IIOData data)
 {
     lock (eventLock)
     {
         var evt = StimulusOutput;
         if (evt != null)
         {
             evt(this, new TimeStampedStimulusOutputEventArgs(time, stream, data));
         }
     }
 }
Exemplo n.º 6
0
 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));
     }
 }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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));
        }
Exemplo n.º 10
0
 public TimeStampedStimulusOutputEventArgs(IClock clock, IDAQOutputStream stream, IIOData data)
     : base(clock)
 {
     Stream = stream;
     Data = data;
 }
Exemplo n.º 11
0
        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;
            }
        }
Exemplo n.º 12
0
 public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable<IPipelineNodeConfiguration> configuration)
 {
     Controller.DidOutputData(this, outputTime, duration, configuration);
 }
Exemplo n.º 13
0
        /// <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);
        }
Exemplo n.º 14
0
 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);
     }
 }
Exemplo n.º 15
0
 public void RemoveStreamMapping(IDAQOutputStream outStream)
 {
     StreamMapping.Remove(outStream);
 }
Exemplo n.º 16
0
 public void AddStreamMapping(IDAQOutputStream outStream, IDAQInputStream inStream)
 {
     StreamMapping[outStream] = inStream;
 }
Exemplo n.º 17
0
 protected IOutputData NextOutputDataForStream(IDAQOutputStream os)
 {
     return(os.PullOutputData(ProcessInterval));
 }
Exemplo n.º 18
0
 public abstract void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background);
Exemplo n.º 19
0
        /// <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 TimeStampedStimulusOutputEventArgs(IClock clock, IDAQOutputStream stream, IIOData data)
     : base(clock)
 {
     Stream = stream;
     Data   = data;
 }
Exemplo n.º 21
0
 public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 22
0
        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);
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
0
        /// <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));
        }
Exemplo n.º 26
0
        /// <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;
        }
Exemplo n.º 27
0
        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);
        }
Exemplo n.º 28
0
 // 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);
Exemplo n.º 29
0
 public ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 30
0
 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;
 }
Exemplo n.º 32
0
 public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable <IPipelineNodeConfiguration> configuration)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 33
0
 // 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);
Exemplo n.º 34
0
 public IOutputData PullOutputData(IDAQOutputStream stream, TimeSpan duration)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 35
0
 public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable <IPipelineNodeConfiguration> configuration)
 {
     Controller.DidOutputData(this, outputTime, duration, configuration);
 }
Exemplo n.º 36
0
 public TimeStampedStimulusOutputEventArgs(DateTimeOffset time, IDAQOutputStream stream, IIOData data)
     : base(time)
 {
     Stream = stream;
     Data = data;
 }
Exemplo n.º 37
0
 public void AddStreamMapping(IDAQOutputStream outStream, IDAQInputStream inStream)
 {
     StreamMapping[outStream] = inStream;
 }
Exemplo n.º 38
0
 public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background)
 {
     AsyncBackground = background;
 }
Exemplo n.º 39
0
 public void RemoveStreamMapping(IDAQOutputStream outStream)
 {
     StreamMapping.Remove(outStream);
 }
Exemplo n.º 40
0
 public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 41
0
 public ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 42
0
 public override void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable<IPipelineNodeConfiguration> configuration)
 {
     if (Controller != null)
     {
         base.DidOutputData(stream, outputTime, duration, configuration);
     }
 }
Exemplo n.º 43
0
 public void DidOutputData(IDAQOutputStream stream, DateTimeOffset outputTime, TimeSpan duration, IEnumerable<IPipelineNodeConfiguration> configuration)
 {
     throw new NotImplementedException();
 }
 public override void ApplyStreamBackgroundAsync(IDAQOutputStream s, IMeasurement background)
 {
 }
Exemplo n.º 45
0
 public override ExternalDeviceBase BindStream(string name, IDAQOutputStream outputStream)
 {
     lock(_bindLock) base.BindStream(name, outputStream);
     Commander.RequestTelegraphValue();
     return this;
 }