/* /// <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; }
public SingleOutputFrame getSingleOutputFrameAtEndOfTimestep(TimeStep step, SettingsData settings, bool outputAnalogDwellValues) { int analogStepID; if (outputAnalogDwellValues) { analogStepID = TimeSteps.IndexOf(dwellWord()); } else { analogStepID = TimeSteps.IndexOf(step); } TimeStep analogStep = TimeSteps[analogStepID]; int timeStepID = TimeSteps.IndexOf(step); SingleOutputFrame ans = new SingleOutputFrame(); foreach (int analogID in settings.logicalChannelManager.Analogs.Keys) { if (settings.logicalChannelManager.Analogs[analogID].TogglingChannel) { ans.analogValues.Add(analogID, 0); } else if (settings.logicalChannelManager.Analogs[analogID].overridden) { ans.analogValues.Add(analogID, settings.logicalChannelManager.Analogs[analogID].analogOverrideValue); } else { if (settings.logicalChannelManager.Analogs[analogID].AnalogChannelOutputNowUsesDwellWord) { ans.analogValues.Add(analogID, getAnalogValueAtEndOfTimestep(TimeSteps.IndexOf(dwellWord()), analogID, Variables)); } else { ans.analogValues.Add(analogID, getAnalogValueAtEndOfTimestep(analogStepID, analogID, Variables)); } } } foreach (int digitalID in settings.logicalChannelManager.Digitals.Keys) { bool val = false; if (settings.logicalChannelManager.Digitals[digitalID].TogglingChannel) { val = false; } else if (settings.logicalChannelManager.Digitals[digitalID].overridden) { val = settings.logicalChannelManager.Digitals[digitalID].digitalOverrideValue; } else { if (step.DigitalData.ContainsKey(digitalID)) { DigitalDataPoint dp = step.DigitalData[digitalID]; if (!dp.DigitalContinue) { val = step.DigitalData[digitalID].getValue(); } else // this digital value is a "continue" value, so, we have to go backwards in time until we find // what value to continue from { int checkStep = timeStepID - 1; val = false; // if we hunt all the way to the first timestep with no answer, the default answer is false while (checkStep >= 0) { if (TimeSteps[checkStep].StepEnabled) { if (TimeSteps[checkStep].DigitalData.ContainsKey(digitalID)) { if (TimeSteps[checkStep].DigitalData[digitalID].DigitalContinue) { checkStep--; // timestep had another continue keep hunting backwards... } else { val = TimeSteps[checkStep].DigitalData[digitalID].getValue(); break; } } else { break; } } else { checkStep--; // timestep was disabled, keep looking } } } } } ans.digitalValues.Add(digitalID, val); } return ans; }
/// <summary> /// Outputs a single output frame to analog and digital cards. All other cards / outputs are unaffected. /// </summary> /// <param name="settings"></param> /// <param name="output"></param> /// <returns></returns> public override bool outputSingleTimestep(SettingsData settings, SingleOutputFrame output) { lock (remoteLockObj) { try { messageLog(this, new MessageEvent("Received an output single timestep request.")); if (output == null) { messageLog(this, new MessageEvent("Received a null output object. Unable to comply.")); return false; } if (!stopAndCleanupTasks()) return false; if (!setSettings(settings)) return false; foreach (string dev in usedDaqMxDevices) { DeviceSettings deviceSettings = myServerSettings.myDevicesSettings[dev]; if (deviceSettings.DeviceEnabled) { messageLog(this, new MessageEvent("Generating single output for " + dev)); Task task = DaqMxTaskGenerator.createDaqMxTaskAndOutputNow(dev, deviceSettings, output, settings, usedDigitalChannels, usedAnalogChannels); daqMxTasks.Add(dev, task); messageLog(this, new MessageEvent("Success.")); } else { messageLog(this, new MessageEvent("Skipped buffer generation for disabled device " + dev)); } } return true; } catch (Exception e) { messageLog(this, new MessageEvent("Caught exception when attempting output of single timestep: " + e.Message + e.StackTrace)); displayError(); return false; } } }
public ServerActionStatus outputSingleTimestepOnConnectedServers(SettingsData settings, SingleOutputFrame output, EventHandler<MessageEvent> messageLog) { return runNamedMethodOnConnectedServers("outputSingleTimestep", new object[] { settings, output }, 5000, messageLog); }
/// <summary> /// Outputs a single timestep. /// </summary> /// <param name="settings"></param> /// <param name="output"></param> /// <returns></returns> public abstract bool outputSingleTimestep(SettingsData settings, SingleOutputFrame output);
public ServerActionStatus outputSingleTimestepOnConnectedServers(SettingsData settings, SingleOutputFrame output, EventHandler <MessageEvent> messageLog) { return(runNamedMethodOnConnectedServers("outputSingleTimestep", new object[] { settings, output }, 5000, messageLog)); }
public override bool outputSingleTimestep(SettingsData settings, SingleOutputFrame output) { return true; }