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