/*
        /// <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);
示例#6
0
 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 override bool outputSingleTimestep(SettingsData settings, SingleOutputFrame output)
 {
     return true;
 }