/// <summary>
        /// Start a constant output by the DAQ device. This function starts a task named "OutputTask",
        /// Don't forget to stop it when it's no longer needed.
        /// </summary>
        /// <param name="voltage">the requested voltage to apply</param>
        public void StartConstantOutputTask(double voltage)
        {
            int samplesPerChannel = 2500;
            int sampleRate = 2500;

            //
            // generate output array 
            //
            m_functionGenerator = new FunctionGenerator(samplesPerChannel, voltage, voltage);
            
            //
            // get the properties required for the output task
            //
            ContinuousAOTaskProperties outputProperties = new ContinuousAOTaskProperties(null, sampleRate, samplesPerChannel, voltage);
            
            //
            // create the output task
            //
            m_outputTask = m_daqController.CreateContinuousAOTask(outputProperties);

            //
            // create the writer of the output task
            //
            writer = new AnalogSingleChannelWriter(m_outputTask.Stream);

            //
            // write static voltage
            //
            writer.WriteMultiSample(true, m_functionGenerator.ConstWave);
        }
        /// <summary>
        /// Create continuous Analog Out Task
        /// </summary>
        /// <param name="properties">The properties of the task</param>
        /// <returns>The task to be activated</returns>
        public Task CreateContinuousAOTask(ContinuousAOTaskProperties properties)
        {
            //
            // Create analog output task with the specified name
            //
            Task analogOutputTask = new Task(c_refContAOTask);

            //
            // Define a voltage channel
            //
            AOChannel analogChannel = analogOutputTask.AOChannels.CreateVoltageChannel(Settings.Default.DAQPhysicalChannelName_IVOutput, 
                string.Empty, -properties.Amplitude, properties.Amplitude, AOVoltageUnits.Volts);

            //
            // Configure sampling clock, rate, number of samples
            //
            analogOutputTask.Timing.ConfigureSampleClock(string.Empty, properties.SampleRate, SampleClockActiveEdge.Rising,
                SampleQuantityMode.ContinuousSamples, properties.SamplesPerChannel);
 
            //
            // allow regeneration of the writing process - that means the output will keep working until we stop or change it. 
            //
            analogOutputTask.Stream.WriteRegenerationMode = WriteRegenerationMode.AllowRegeneration;

            //
            // verify task
            //
            analogOutputTask.Control(TaskAction.Verify);

            return analogOutputTask;
        }
 /// <summary>
 /// Get Continuous Analog Output Task
 /// </summary>
 /// <param name="settings"></param>
 /// <returns></returns>
 private Task GetContinuousAOTask(IVSettings settings)
 {
     //
     // get the properties required for the output task
     //
     ContinuousAOTaskProperties outputProperties = new ContinuousAOTaskProperties(null, settings.IVGeneralSettings.OutputUpdateRate,
                                                                                  settings.IVGeneralSettings.SamplesPerCycle,
                                                                                  settings.IVGeneralSettings.VoltageAmplitude);
     //
     // return the output task
     //
     return m_daqController.CreateContinuousAOTask(outputProperties);
 }