예제 #1
0
파일: DAQ.cs 프로젝트: jingxlim/FictiveVR
        /// <summary>
        /// Stops all acquisition and generation
        /// </summary>
        public void Stop()
        {
            if (!IsRunning)
            {
                return;
            }
            _writeThreadReady.Reset();
            if (_writeThread != null)
            {
                _writeThread.Stop();
                _writeThread.Dispose();
                _writeThread = null;
            }
            if (_readThread != null)
            {
                _readThread.Stop();
                _readThread.Dispose();
                _readThread = null;
            }
            //Reset all writes to 0
            Task resetTask = new Task("ChReset");

            for (int i = 0; i < 3; i++)
            {
                resetTask.AOChannels.CreateVoltageChannel(HardwareSettings.DAQ.DeviceName + "/" + string.Format("AO{0}", i), "", -10, 10, AOVoltageUnits.Volts);
            }
            AnalogMultiChannelWriter resetWriter = new AnalogMultiChannelWriter(resetTask.Stream);

            resetWriter.WriteSingleSample(true, new double[3]);
            resetTask.Dispose();
            pipeCanceller.Cancel();
            IsRunning = false;
        }
예제 #2
0
파일: NIcDAQ.cs 프로젝트: alexdangles/tubes
 /// <summary>
 /// Perform AO task.
 /// </summary>
 /// <param name="volts">Voltage values to write.</param>
 public void AnalogWrite(params double[] volts)
 {
     if (analogOut != null)
     {
         try
         {
             AnalogMultiChannelWriter aw = new AnalogMultiChannelWriter(analogOut.Stream);
             double[] input = new double[analogOut.AOChannels.Count];
             for (int i = 0; i < input.Length; i++)
             {
                 try
                 {
                     input[i] = volts[i];
                 }
                 catch
                 {
                     input[i] = 0;
                 }
             }
             aw.WriteSingleSample(true, input);
         }
         catch (DaqException de)
         {
             log.Write(de.Message);
         }
     }
 }
예제 #3
0
 /// <summary>
 /// Tries to target a given coordinate
 /// </summary>
 /// <param name="coordinate">The 2D point coordinate which should be targeted</param>
 /// <returns>The status code of the targeting attempt</returns>
 public HitStatus Hit(IppiPoint coordinate)
 {
     if (CoordinateConverter == null)
     {
         //No lookup table present. Try to interpret coordinates as raw voltages
         if (coordinate.x < VMin || coordinate.y < VMin || coordinate.x > VMax || coordinate.y > VMax)
         {
             return(HitStatus.OutOfRange);
         }
         //_xWriter.WriteSingleSample(true, coordinate.x);
         //_yWriter.WriteSingleSample(true, coordinate.y);
         double[] voltages = new double[2];
         voltages[0] = coordinate.x;
         voltages[1] = coordinate.y;
         _multiWriter.WriteSingleSample(true, voltages);
         return(HitStatus.NoConversion);
     }
     return(Hit(CoordinateConverter[coordinate]));
 }
        /*
        /// <summary>
        /// This class contains both the analog and the digital tasks returned from a specific device.
        /// The reason for its existence is that if a device is to have both its analog and its digital outputs used,
        /// then they must exist in separate tasks.
        /// </summary>
        ///
        public class TaskCollection
        {
            public Task analogTask;
            public Task digitalTask;
        }
        */
        /*
        public static Task createVariableTimebaseTask(string digitalTimebaseOutLine, string analogTimebaseOutLine)
        {

        }*/
        ///
        /// This method creates a daqMX task for an "output now" command, and starts the output.
        /// </summary>
        /// <param name="deviceName"></param>
        /// <param name="settings"></param>
        /// <param name="output"></param>
        /// <returns></returns>
        public static Task createDaqMxTaskAndOutputNow(string deviceName, DeviceSettings deviceSettings, SingleOutputFrame output, 
            SettingsData settings, Dictionary<int, HardwareChannel> usedDigitalChannels, Dictionary<int, HardwareChannel> usedAnalogChannels)
        {
            Task task = new Task(deviceName + " output task");

            List<int> analogIDs;
            List<HardwareChannel> analogs;
            Dictionary<int, int[]> port_digital_IDs;
            List<int> usedPortNumbers;

            // Parse and create channels.
            parseAndCreateChannels(deviceName,deviceSettings, usedDigitalChannels, usedAnalogChannels, task, out analogIDs, out analogs, out port_digital_IDs, out usedPortNumbers);

            // now create buffer.

            task.Timing.SampleTimingType = SampleTimingType.OnDemand;

            // analog output
            if (analogIDs.Count != 0)
            {

                // extract a list of analog values corresponding to the list analodIDs. This is
                // sorted in the same way as the channels were created in parseAndCreateChannels
                List<double> outputValues = new List<double>();
                foreach (int analogID in analogIDs)
                {
                    double val;
                    if (output.analogValues.ContainsKey(analogID))
                        val = output.analogValues[analogID];
                    else
                        val = 0;
                    outputValues.Add(val);
                }

                AnalogMultiChannelWriter writer = new AnalogMultiChannelWriter(task.Stream);
                writer.WriteSingleSample(true, outputValues.ToArray());
            }

            // digital output
            if (usedPortNumbers.Count != 0)
            {
                List<byte> outputValues = new List<byte>();

                foreach (int portNumber in usedPortNumbers)
                {
                    byte digitalMask = 1;
                    byte value=0;
                    for (int lineNum = 0; lineNum < 8; lineNum++)
                    {
                        int digitalID = port_digital_IDs[portNumber][lineNum];
                        if (digitalID != -1)
                        {
                            bool val = false;
                            if (output.digitalValues.ContainsKey(digitalID))
                                val = output.digitalValues[digitalID];

                            if (val)
                                value |= digitalMask;
                        }
                        digitalMask = (byte) (digitalMask << 1);
                    }

                    outputValues.Add(value);
                }

                DigitalMultiChannelWriter writer = new DigitalMultiChannelWriter(task.Stream);
                writer.WriteSingleSamplePort(true, outputValues.ToArray());
            }

            return task;
        }
        /*
         * /// <summary>
         * /// This class contains both the analog and the digital tasks returned from a specific device.
         * /// The reason for its existence is that if a device is to have both its analog and its digital outputs used,
         * /// then they must exist in separate tasks.
         * /// </summary>
         * ///
         * public class TaskCollection
         * {
         *  public Task analogTask;
         *  public Task digitalTask;
         * }
         */

        /*
         * public static Task createVariableTimebaseTask(string digitalTimebaseOutLine, string analogTimebaseOutLine)
         * {
         *
         * }*/

        ///
        /// This method creates a daqMX task for an "output now" command, and starts the output.
        /// </summary>
        /// <param name="deviceName"></param>
        /// <param name="settings"></param>
        /// <param name="output"></param>
        /// <returns></returns>


        public static Task createDaqMxTaskAndOutputNow(string deviceName, DeviceSettings deviceSettings, SingleOutputFrame output,
                                                       SettingsData settings, Dictionary <int, HardwareChannel> usedDigitalChannels, Dictionary <int, HardwareChannel> usedAnalogChannels)
        {
            Task task = new Task(deviceName + " output task");

            List <int>              analogIDs;
            List <HardwareChannel>  analogs;
            Dictionary <int, int[]> port_digital_IDs;
            List <int>              usedPortNumbers;

            // Parse and create channels.
            parseAndCreateChannels(deviceName, deviceSettings, usedDigitalChannels, usedAnalogChannels, task, out analogIDs, out analogs, out port_digital_IDs, out usedPortNumbers);


            // now create buffer.

            task.Timing.SampleTimingType = SampleTimingType.OnDemand;

            // analog output
            if (analogIDs.Count != 0)
            {
                // extract a list of analog values corresponding to the list analodIDs. This is
                // sorted in the same way as the channels were created in parseAndCreateChannels
                List <double> outputValues = new List <double>();
                foreach (int analogID in analogIDs)
                {
                    double val;
                    if (output.analogValues.ContainsKey(analogID))
                    {
                        val = output.analogValues[analogID];
                    }
                    else
                    {
                        val = 0;
                    }
                    outputValues.Add(val);
                }

                AnalogMultiChannelWriter writer = new AnalogMultiChannelWriter(task.Stream);
                writer.WriteSingleSample(true, outputValues.ToArray());
            }

            // digital output
            if (usedPortNumbers.Count != 0)
            {
                List <byte> outputValues = new List <byte>();

                foreach (int portNumber in usedPortNumbers)
                {
                    byte digitalMask = 1;
                    byte value       = 0;
                    for (int lineNum = 0; lineNum < 8; lineNum++)
                    {
                        int digitalID = port_digital_IDs[portNumber][lineNum];
                        if (digitalID != -1)
                        {
                            bool val = false;
                            if (output.digitalValues.ContainsKey(digitalID))
                            {
                                val = output.digitalValues[digitalID];
                            }

                            if (val)
                            {
                                value |= digitalMask;
                            }
                        }
                        digitalMask = (byte)(digitalMask << 1);
                    }

                    outputValues.Add(value);
                }

                DigitalMultiChannelWriter writer = new DigitalMultiChannelWriter(task.Stream);
                writer.WriteSingleSamplePort(true, outputValues.ToArray());
            }

            return(task);
        }