Esempio n. 1
0
 /// <summary>
 /// Set the trigger by writing a high on the trigger line
 /// </summary>
 public static void TriggerAll()
 {
     if (!TriggerInititalized)
     {
         throw new ApplicationException("Trigger not initialized. Create PWMTask object first or call InitializeTrigger.");
     }
     System.Diagnostics.Debug.WriteLineIf(_refcount < 1, "Triggering but no PWMTaskobject was created!");
     lock (_triggerTaskLock)
         _triggerWriter.WriteSingleSamplePort(true, 1);
 }
Esempio n. 2
0
        public void SetScopeAddr(int addr)
        {
            byte addrOut = (byte)(~addr & 0xFF);

            //Ignore any invalid addresses and set to 0
            if (addr > MaxAddr)
            {
                addrOut = 0;
            }

            //Set address using a single port write
            try
            {
                using (NationalInstruments.DAQmx.Task digitalWriteTask = new NationalInstruments.DAQmx.Task())
                {
                    string addressCh = outputs[(int)OutputSignals.ScopeAddr0].slot;
                    addressCh += "/port" + outputs[(int)OutputSignals.ScopeAddr0].port.ToString();
                    //addressCh += "/line0:7";
                    digitalWriteTask.DOChannels.CreateChannel(addressCh, "", ChannelLineGrouping.OneChannelForAllLines);
                    DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(digitalWriteTask.Stream);
                    writer.WriteSingleSamplePort(true, addrOut);
                }
            }
            catch
            {
            }

            //Wait for relays to switch
            Thread.Sleep(RelayWaitMs);
        }
Esempio n. 3
0
 public void WriteData(int length)
 {
     // Sends data down an open channel to the NI ELVIS device.
     if (writer != null)
     {
         writer.WriteSingleSamplePort(true, (UInt32)length);
     }
 }
Esempio n. 4
0
 public void WriteData(int length)
 {
     //call WriteSignleSamplePort method to write the data to the channel
     if (writer != null)
     {
         writer.WriteSingleSamplePort(true, (UInt32)length);
     }
 }
Esempio n. 5
0
        private int Init()
        {
            try
            {
                digitalWriteTaskP00 = new Task();
                digitalWriteTaskP01 = new Task();
                digitalWriteTaskP02 = new Task();
                digitalWriteTaskP03 = new Task();
                digitalWriteTaskP04 = new Task();
                digitalWriteTaskP05 = new Task();

                digitalWriteTaskP09 = new Task();

                digitalWriteTaskP00.DOChannels.CreateChannel("DIO/port0", "port0",
                                                             ChannelLineGrouping.OneChannelForAllLines);
                digitalWriteTaskP01.DOChannels.CreateChannel("DIO/port1", "port1",
                                                             ChannelLineGrouping.OneChannelForAllLines);
                digitalWriteTaskP02.DOChannels.CreateChannel("DIO/port2", "port2",
                                                             ChannelLineGrouping.OneChannelForAllLines);
                digitalWriteTaskP03.DOChannels.CreateChannel("DIO/port3", "port3",
                                                             ChannelLineGrouping.OneChannelForAllLines);
                digitalWriteTaskP04.DOChannels.CreateChannel("DIO/port4", "port4",
                                                             ChannelLineGrouping.OneChannelForAllLines);
                digitalWriteTaskP05.DOChannels.CreateChannel("DIO/port5", "port5",
                                                             ChannelLineGrouping.OneChannelForAllLines);

                digitalWriteTaskP09.DOChannels.CreateChannel("DIO/port9", "port9",
                                                             ChannelLineGrouping.OneChannelForAllLines);

                writerP00 = new DigitalSingleChannelWriter(digitalWriteTaskP00.Stream);
                writerP01 = new DigitalSingleChannelWriter(digitalWriteTaskP01.Stream);
                writerP02 = new DigitalSingleChannelWriter(digitalWriteTaskP02.Stream);
                writerP03 = new DigitalSingleChannelWriter(digitalWriteTaskP03.Stream);
                writerP04 = new DigitalSingleChannelWriter(digitalWriteTaskP04.Stream);
                writerP05 = new DigitalSingleChannelWriter(digitalWriteTaskP05.Stream);

                writerP09 = new DigitalSingleChannelWriter(digitalWriteTaskP09.Stream);


                writerP00.WriteSingleSamplePort(true, 0);
                writerP01.WriteSingleSamplePort(true, 0);
                writerP02.WriteSingleSamplePort(true, 0);
                writerP03.WriteSingleSamplePort(true, 0);
                writerP04.WriteSingleSamplePort(true, 0);
                writerP05.WriteSingleSamplePort(true, 0);
                writerP09.WriteSingleSamplePort(true, 0);


                return(0);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "Initialize");
                return(-1);
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Reset all lines/pins to 0 - called by Dispose method
        /// </summary>
        private void ResetPort()
        {
            Task reset = new Task("Reset");

            reset.DOChannels.CreateChannel(_line, "do0", ChannelLineGrouping.OneChannelForAllLines);
            DigitalSingleChannelWriter resetWriter = new DigitalSingleChannelWriter(reset.Stream);

            resetWriter.WriteSingleSamplePort(true, (uint)0);
            reset.Dispose();
        }
        public void SetPath(string val)
        {
            string[] tempdata;
            tempdata = val.Split(';');
            string[] tempdata2;

            try
            {
                for (int i = 0; i < tempdata.Length; i++)
                {
                    tempdata2 = tempdata[i].Split('_');

                    switch (tempdata2[0].ToUpper())
                    {
                    case "P0":
                        _writerP00.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    case "P1":
                        _writerP01.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    case "P2":
                        _writerP02.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    case "P3":
                        _writerP03.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    case "P4":
                        _writerP04.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    case "P5":
                        _writerP05.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    case "P9":
                        _writerP09.WriteSingleSamplePort(true, Convert.ToUInt32(tempdata2[1]));
                        break;

                    default:
                        MessageBox.Show("Port No : " + tempdata2[1].ToUpper(), "Only P0,P1,P2,P3,P4,P5 AND P9 ALLOWED !!!!\n" + "Pls check your switching configuration in Input Folder");
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Agilent3499: SetPath -> " + ex.Message);
            }
        }
        public void Initialize()
        {
            try
            {
                _digitalWriteTaskP00 = new Task();
                _digitalWriteTaskP01 = new Task();
                _digitalWriteTaskP02 = new Task();
                _digitalWriteTaskP03 = new Task();
                _digitalWriteTaskP04 = new Task();
                _digitalWriteTaskP05 = new Task();

                _digitalWriteTaskP09 = new Task();

                _digitalWriteTaskP00.DOChannels.CreateChannel(IoAddress + "/port0", "port0",
                                                              ChannelLineGrouping.OneChannelForAllLines);
                _digitalWriteTaskP01.DOChannels.CreateChannel(IoAddress + "/port1", "port1",
                                                              ChannelLineGrouping.OneChannelForAllLines);
                _digitalWriteTaskP02.DOChannels.CreateChannel(IoAddress + "/port2", "port2",
                                                              ChannelLineGrouping.OneChannelForAllLines);
                _digitalWriteTaskP03.DOChannels.CreateChannel(IoAddress + "/port3", "port3",
                                                              ChannelLineGrouping.OneChannelForAllLines);
                _digitalWriteTaskP04.DOChannels.CreateChannel(IoAddress + "/port4", "port4",
                                                              ChannelLineGrouping.OneChannelForAllLines);
                _digitalWriteTaskP05.DOChannels.CreateChannel(IoAddress + "/port5", "port5",
                                                              ChannelLineGrouping.OneChannelForAllLines);

                _digitalWriteTaskP09.DOChannels.CreateChannel(IoAddress + "/port9", "port9",
                                                              ChannelLineGrouping.OneChannelForAllLines);

                _writerP00 = new DigitalSingleChannelWriter(_digitalWriteTaskP00.Stream);
                _writerP01 = new DigitalSingleChannelWriter(_digitalWriteTaskP01.Stream);
                _writerP02 = new DigitalSingleChannelWriter(_digitalWriteTaskP02.Stream);
                _writerP03 = new DigitalSingleChannelWriter(_digitalWriteTaskP03.Stream);
                _writerP04 = new DigitalSingleChannelWriter(_digitalWriteTaskP04.Stream);
                _writerP05 = new DigitalSingleChannelWriter(_digitalWriteTaskP05.Stream);

                _writerP09 = new DigitalSingleChannelWriter(_digitalWriteTaskP09.Stream);

                _writerP00.WriteSingleSamplePort(true, 0);
                _writerP01.WriteSingleSamplePort(true, 0);
                _writerP02.WriteSingleSamplePort(true, 0);
                _writerP03.WriteSingleSamplePort(true, 0);
                _writerP04.WriteSingleSamplePort(true, 0);
                _writerP05.WriteSingleSamplePort(true, 0);
                _writerP09.WriteSingleSamplePort(true, 0);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "Initialize");
            }
        }
Esempio n. 9
0
        private void digitalOutLow(int selectPort)
        {
            switch (selectPort)
            {
            case 0:
                Task      digitalOutTask0 = new Task();
                DOChannel DOChannel0;
                DOChannel0 = digitalOutTask0.DOChannels.CreateChannel(P_pump, "Port1",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer0 = new DigitalSingleChannelWriter(digitalOutTask0.Stream);
                writer0.WriteSingleSamplePort(true, 0);
                break;

            case 1:
                Task      digitalOutTask1 = new Task();
                DOChannel DOChannel1;
                DOChannel1 = digitalOutTask1.DOChannels.CreateChannel(P_v1, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer1 = new DigitalSingleChannelWriter(digitalOutTask1.Stream);
                writer1.WriteSingleSamplePort(true, 0);
                break;

            case 2:
                Task      digitalOutTask2 = new Task();
                DOChannel DOChannel2;
                DOChannel2 = digitalOutTask2.DOChannels.CreateChannel(P_preH1, "Port1",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer2 = new DigitalSingleChannelWriter(digitalOutTask2.Stream);
                writer2.WriteSingleSamplePort(true, 0);
                break;

            case 3:
                Task      digitalOutTask3 = new Task();
                DOChannel DOChannel3;
                DOChannel3 = digitalOutTask3.DOChannels.CreateChannel(P_preOn1, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer3 = new DigitalSingleChannelWriter(digitalOutTask3.Stream);
                writer3.WriteSingleSamplePort(true, 0);
                break;

            case 4:
                Task      digitalOutTask4 = new Task();
                DOChannel DOChannel4;
                DOChannel4 = digitalOutTask4.DOChannels.CreateChannel(P_column, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer4 = new DigitalSingleChannelWriter(digitalOutTask4.Stream);
                writer4.WriteSingleSamplePort(true, 0);
                break;
            }
        }
Esempio n. 10
0
        //write Digital Out(port0|) - out value decimal value to bin
        //(1 - 0000 0001, 2 - 0000 0010, 3 - 0000 0011, 4 - 0000 0100, 5 - 0000 0101, 8 - 0000 1000)
        //(64 - 0100 0000, 32 - 0010 0000)
        //(255 - 1111 1111)
        public void writing_DO(string device, string port_name, uint val)
        {
            UInt32 dataDO = val;

            Task digitalWriteTask = new Task();

            //  Create an Digital Output channel and name it.
            digitalWriteTask.DOChannels.CreateChannel("dev1/port0", "port0", ChannelLineGrouping.OneChannelForAllLines);
            //  Write digital port data. WriteDigitalSingChanSingSampPort writes a single sample
            //  of digital data on demand, so no timeout is necessary.
            DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(digitalWriteTask.Stream);

            writer.WriteSingleSamplePort(true, (UInt32)dataDO);
        }
Esempio n. 11
0
        public void WriteDigPortLine(string lines, string name, int val)
        {
            //Create a task such that it will be disposed after
            //we are done using it.
            Task      digitalWriteTask = new Task();
            DOChannel ch;

            try
            {
                //Create a Digital Output channel and name it.
                ch = digitalWriteTask.DOChannels.CreateChannel(lines, "line0", ChannelLineGrouping.OneChannelForAllLines);

                //get the states of the lines before we get started
                //Verify the Task
                //m_digitalWriteTask.Control(TaskAction.Verify)
                //Dim st As DOLineStatesStartState
                //st = ch.LineStatesStartState()
                //Dim data As UInt32
                //Dim reader As DigitalSingleChannelReader = New DigitalSingleChannelReader(digitalReadTask.Stream)

                //digitalReadTask.Start()
                //data = reader.ReadSingleSamplePortUInt32()
                //digitalReadTask.Stop()

                //  Write digital port data. WriteDigitalSingChanSingSampPort writes a single sample
                //  of digital data on demand, so no timeout is necessary.
                DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(digitalWriteTask.Stream);

                DaqBuffer buf;
                buf = digitalWriteTask.Stream.Buffer;
                digitalWriteTask.Start();
                //st = ch.LineStatesStartState
                writer.WriteSingleSamplePort(false, val);
                //st = ch.LineStatesStartState
                digitalWriteTask.Stop();
                buf = digitalWriteTask.Stream.Buffer;
                //UpdateDigitalShadows(lines, (int)val);
            }
            catch (System.Exception ex) {
                DaqError(ex.Message);
            }
            finally {
                //dispose task
                digitalWriteTask.Dispose();
            }
        }
Esempio n. 12
0
        public static string TurnSwitch(int line, int value, string sourceDevice = "Dev1")
        {
            try
            {
                NationalInstruments.DAQmx.Task dIOTask = new NationalInstruments.DAQmx.Task();

                dIOTask.DOChannels.CreateChannel(sourceDevice + "/port0/line" + line.ToString(),
                                                 "DigitalOut_0", ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(dIOTask.Stream);
                writer.WriteSingleSamplePort(true, value);
            }
            catch (DaqException)
            {
                return("Fail");
            }

            return("OK");
        }
Esempio n. 13
0
        public int WriteDigChannelGroup(string lines, string name, uint val)
        {
            //Create a task such that it will be disposed after
            //we are done using it.
            int       res = 0;
            Task      digitalWriteTask = new Task();
            DOChannel ch;

            try
            {
                //Create channel
                ch = digitalWriteTask.DOChannels.CreateChannel(lines, "digwrite", ChannelLineGrouping.OneChannelForAllLines);

                //Dim st As DOLineStatesStartState
                DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(digitalWriteTask.Stream);
                DigitalSingleChannelReader reader = new DigitalSingleChannelReader(digitalWriteTask.Stream);

                bool[] data;
                data = reader.ReadSingleSampleMultiLine();

                digitalWriteTask.Start();
                //st = ch.LineStatesStartState
                if (ch.Tristate == true)
                {
                    ch.Tristate = false;
                }
                writer.WriteSingleSamplePort(false, val);
                digitalWriteTask.Stop();
                //UpdateDigitalShadows(lines, CInt(val));
            }
            catch (DaqException ex)
            {
                DaqError(ex.Message);
                res = -1;
            }
            finally
            {
                //dispose task
                digitalWriteTask.Dispose();
            }
            return(res);
        }
Esempio n. 14
0
        private string P1_3 = "dev1/port1/line3"; //precon H1
        /*packed methods*/
        private void digitalOutHigh(int selectPort)
        {
            switch (selectPort)
            {
            case 0:
                Task      digitalOutTask0 = new Task();
                DOChannel DOChannel0;
                DOChannel0 = digitalOutTask0.DOChannels.CreateChannel(P0_0, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer0 = new DigitalSingleChannelWriter(digitalOutTask0.Stream);
                writer0.WriteSingleSamplePort(true, 1);
                break;

            case 1:
                Task      digitalOutTask1 = new Task();
                DOChannel DOChannel1;
                DOChannel1 = digitalOutTask1.DOChannels.CreateChannel(P0_1, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer1 = new DigitalSingleChannelWriter(digitalOutTask1.Stream);
                writer1.WriteSingleSamplePort(true, -1);
                break;

            case 2:
                Task      digitalOutTask2 = new Task();
                DOChannel DOChannel2;
                DOChannel2 = digitalOutTask2.DOChannels.CreateChannel(P0_2, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer2 = new DigitalSingleChannelWriter(digitalOutTask2.Stream);
                writer2.WriteSingleSamplePort(true, -1);
                break;

            case 3:
                Task      digitalOutTask3 = new Task();
                DOChannel DOChannel3;
                DOChannel3 = digitalOutTask3.DOChannels.CreateChannel(P0_3, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer3 = new DigitalSingleChannelWriter(digitalOutTask3.Stream);
                writer3.WriteSingleSamplePort(true, -1);
                break;

            case 4:
                Task      digitalOutTask4 = new Task();
                DOChannel DOChannel4;
                DOChannel4 = digitalOutTask4.DOChannels.CreateChannel(P0_4, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer4 = new DigitalSingleChannelWriter(digitalOutTask4.Stream);
                writer4.WriteSingleSamplePort(true, -1);
                break;

            case 5:
                Task      digitalOutTask5 = new Task();
                DOChannel DOChannel5;
                DOChannel5 = digitalOutTask5.DOChannels.CreateChannel(P0_5, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer5 = new DigitalSingleChannelWriter(digitalOutTask5.Stream);
                writer5.WriteSingleSamplePort(true, -1);
                break;

            case 6:
                Task      digitalOutTask6 = new Task();
                DOChannel DOChannel6;
                DOChannel6 = digitalOutTask6.DOChannels.CreateChannel(P0_6, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer6 = new DigitalSingleChannelWriter(digitalOutTask6.Stream);
                writer6.WriteSingleSamplePort(true, -1);
                break;

            case 7:
                Task      digitalOutTask7 = new Task();
                DOChannel DOChannel7;
                DOChannel7 = digitalOutTask7.DOChannels.CreateChannel(P0_7, "Port0",
                                                                      ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer7 = new DigitalSingleChannelWriter(digitalOutTask7.Stream);
                writer7.WriteSingleSamplePort(true, -1);
                break;

            case 10:
                Task      digitalOutTask10 = new Task();
                DOChannel DOChannel10;
                DOChannel10 = digitalOutTask10.DOChannels.CreateChannel(P1_0, "Port1",
                                                                        ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer10 = new DigitalSingleChannelWriter(digitalOutTask10.Stream);
                writer10.WriteSingleSamplePort(true, -1);
                break;

            case 11:
                Task      digitalOutTask11 = new Task();
                DOChannel DOChannel11;
                DOChannel11 = digitalOutTask11.DOChannels.CreateChannel(P1_1, "Port1",
                                                                        ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer11 = new DigitalSingleChannelWriter(digitalOutTask11.Stream);
                writer11.WriteSingleSamplePort(true, -1);
                break;

            case 12:
                Task      digitalOutTask12 = new Task();
                DOChannel DOChannel12;
                DOChannel12 = digitalOutTask12.DOChannels.CreateChannel(P1_2, "Port1",
                                                                        ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer12 = new DigitalSingleChannelWriter(digitalOutTask12.Stream);
                writer12.WriteSingleSamplePort(true, -1);
                break;

            case 13:
                Task      digitalOutTask13 = new Task();
                DOChannel DOChannel13;
                DOChannel13 = digitalOutTask13.DOChannels.CreateChannel(P1_3, "Port1",
                                                                        ChannelLineGrouping.OneChannelForEachLine);
                DigitalSingleChannelWriter writer13 = new DigitalSingleChannelWriter(digitalOutTask13.Stream);
                writer13.WriteSingleSamplePort(true, -1);
                break;
            }
        }
Esempio n. 15
0
        private void button_computeGain_Click(object sender, EventArgs e)
        {
            double startFreq  = Convert.ToDouble(numericUpDown_startFreq.Value);
            double stopFreq   = Convert.ToDouble(numericUpDown_stopFreq.Value);
            double numPeriods = Convert.ToDouble(numericUpDown_numPeriods.Value);

            double[] freqs = new double[1 + Convert.ToInt32(Math.Floor(Math.Log(stopFreq / startFreq) / Math.Log(Convert.ToDouble(textBox_diagnosticsMult.Text))))]; //This determines the number of frequencies counting by doublings

            radioButton_stimVoltageControlled.Checked = true;
            radioButton_stimVoltageControlled_Click(null, null);

            //Populate freqs vector
            freqs[0] = startFreq;
            for (int i = 1; i < freqs.GetLength(0); ++i)
            {
                freqs[i] = freqs[i - 1] * Convert.ToDouble(textBox_diagnosticsMult.Text);
            }

            spikeSamplingRate          = Properties.Settings.Default.RawSampleFrequency;
            buttonStart.Enabled        = false; //So users can't try to get data from the same card
            button_computeGain.Enabled = false;
            button_computeGain.Refresh();
            buttonStart.Refresh();
            spikeTask          = new List <Task>(Properties.Settings.Default.AnalogInDevice.Count);
            diagnosticsReaders = new List <AnalogMultiChannelReader>(Properties.Settings.Default.AnalogInDevice.Count);
            for (int i = 0; i < Properties.Settings.Default.AnalogInDevice.Count; ++i)
            {
                spikeTask.Add(new Task("spikeTask_Diagnostics_" + i));
                int numChannelsPerDevice = (numChannels < 32 ? numChannels : 32);
                for (int j = 0; j < numChannelsPerDevice; ++j)
                {
                    spikeTask[i].AIChannels.CreateVoltageChannel(Properties.Settings.Default.AnalogInDevice[0] + "/ai" + j.ToString(), "",
                                                                 AITerminalConfiguration.Nrse, -10.0, 10.0, AIVoltageUnits.Volts);
                }

                //Change gain based on comboBox values (1-100)
                setGain(spikeTask[i], Properties.Settings.Default.A2Dgain);

                //Verify the Task
                spikeTask[i].Control(TaskAction.Verify);

                spikeTask[i].Timing.ConfigureSampleClock("", spikeSamplingRate, SampleClockActiveEdge.Rising,
                                                         SampleQuantityMode.FiniteSamples);
                diagnosticsReaders.Add(new AnalogMultiChannelReader(spikeTask[i].Stream));
            }

            spikeTask[0].Timing.ReferenceClockSource = "OnboardClock";
            for (int i = 1; i < spikeTask.Count; ++i)
            {
                spikeTask[i].Timing.ReferenceClockSource = spikeTask[0].Timing.ReferenceClockSource;
                spikeTask[i].Timing.ReferenceClockRate   = spikeTask[0].Timing.ReferenceClockRate;
            }
            stimPulseTask.Timing.ReferenceClockSource = spikeTask[0].Timing.ReferenceClockSource;
            stimPulseTask.Timing.ReferenceClockRate   = spikeTask[0].Timing.ReferenceClockRate;

            stimDigitalTask.Dispose();
            stimDigitalTask = new Task("stimDigitalTask");
            if (Properties.Settings.Default.StimPortBandwidth == 32)
            {
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:31", "",
                                                         ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            }
            else if (Properties.Settings.Default.StimPortBandwidth == 8)
            {
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:7", "",
                                                         ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            }
            stimDigitalWriter = new DigitalSingleChannelWriter(stimDigitalTask.Stream);
            stimPulseTask.Timing.ConfigureSampleClock("/" + Properties.Settings.Default.AnalogInDevice[0] + "/ai/SampleClock",
                                                      spikeSamplingRate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples);
            stimPulseTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("/" +
                                                                            Properties.Settings.Default.AnalogInDevice[0] + "/ai/StartTrigger",
                                                                            DigitalEdgeStartTriggerEdge.Rising);

            stimDigitalTask.Control(TaskAction.Verify);
            stimPulseTask.Control(TaskAction.Verify);

            switch (Properties.Settings.Default.NumChannels)
            {
            case 0:
                numChannels = 16;
                break;

            case 1:
                numChannels = 32;
                break;

            case 2:
                numChannels = 48;
                break;

            case 3:
                numChannels = 64;
                break;
            }
            //gains = new double[numChannels, freqs.GetLength(0)];
            //numChannels = 1;

            gains = new double[numChannels][];
            for (int i = 0; i < numChannels; ++i)
            {
                gains[i] = new double[freqs.GetLength(0)];
            }
            scatterGraph_diagnostics.ClearData();
            scatterGraph_diagnostics.Plots.Clear();

            textBox_diagnosticsResults.Clear();

            if (!checkBox_diagnosticsBulk.Checked)
            {
                //for (int c = 1; c <= numChannels; ++c)
                for (int c = 13; c < 14; ++c)
                {
                    textBox_diagnosticsResults.Text += "Channel " + c.ToString() + "\r\n\tFrequency (Hz)\tGain (dB)\r\n";

                    scatterGraph_diagnostics.Plots.Add(new ScatterPlot());

                    UInt32 data = StimPulse.channel2MUX((double)c); //Get data bits lined up to control MUXes

                    //Setup digital waveform
                    stimDigitalWriter.WriteSingleSamplePort(true, data);
                    stimDigitalTask.WaitUntilDone();
                    stimDigitalTask.Stop();

                    for (int f = 0; f < freqs.GetLength(0); ++f)
                    {
                        double numSeconds = 1 / freqs[f];
                        if (numSeconds * numPeriods < 0.1)
                        {
                            numPeriods = Math.Ceiling(0.1 * freqs[f]);
                        }

                        int        size           = Convert.ToInt32(numSeconds * spikeSamplingRate);
                        SineSignal testWave       = new SineSignal(freqs[f], Convert.ToDouble(numericUpDown_diagnosticsVoltage.Value)); //Generate a 100 mV sine wave at 1000 Hz
                        double[]   testWaveValues = testWave.Generate(spikeSamplingRate, size);

                        double[,] analogPulse = new double[2, size];

                        for (int i = 0; i < size; ++i)
                        {
                            analogPulse[0, i] = testWaveValues[i];
                        }

                        for (int i = 0; i < spikeTask.Count; ++i)
                        {
                            spikeTask[i].Timing.SamplesPerChannel = (long)(numPeriods * size);
                        }

                        stimPulseTask.Timing.SamplesPerChannel = (long)(numPeriods * size); //Do numperiods cycles of sine wave
                        stimPulseWriter.WriteMultiSample(true, analogPulse);

                        double[] stateData = new double[4];
                        stateData[0] = (double)c;
                        stateData[1] = freqs[f];
                        stateData[2] = (double)f;
                        for (int i = diagnosticsReaders.Count - 1; i >= 0; --i)
                        {
                            stateData[3] = (double)i;
                            diagnosticsReaders[i].BeginReadMultiSample((int)(numPeriods * size), analogInCallback_computeGain, (Object)stateData); //Get 5 seconds of "noise"
                        }

                        stimPulseTask.WaitUntilDone();
                        for (int i = 0; i < spikeTask.Count; ++i)
                        {
                            spikeTask[i].WaitUntilDone();
                            spikeTask[i].Stop();
                        }
                        stimPulseTask.Stop();
                    }
                    stimDigitalWriter.WriteSingleSamplePort(true, 0);
                    stimDigitalTask.WaitUntilDone();
                    stimDigitalTask.Stop();
                    //DEBUGGING
                    c = 1;
                    scatterGraph_diagnostics.Plots[c - 1].PlotXY(freqs, gains[c - 1]);
                    for (int f = 0; f < freqs.GetLength(0); ++f)
                    {
                        textBox_diagnosticsResults.Text += "\t" + freqs[f].ToString() + "\t" + gains[c - 1][f] + "\r\n";
                    }
                    textBox_diagnosticsResults.Text += "\r\n";
                    scatterGraph_diagnostics.Refresh();

                    //DEBUGGING
                    c = 100;
                }
            }
            else
            {
                for (int f = 0; f < freqs.GetLength(0); ++f)
                {
                    double numSeconds = 1 / freqs[f];
                    if (numSeconds * numPeriods < 0.1)
                    {
                        numPeriods = Math.Ceiling(0.1 * freqs[f]);
                    }

                    int        size           = Convert.ToInt32(numSeconds * spikeSamplingRate);
                    SineSignal testWave       = new SineSignal(freqs[f], Convert.ToDouble(numericUpDown_diagnosticsVoltage.Value)); //Generate a 100 mV sine wave at 1000 Hz
                    double[]   testWaveValues = testWave.Generate(spikeSamplingRate, size);


                    double[,] analogPulse = new double[2, size];

                    for (int i = 0; i < size; ++i)
                    {
                        analogPulse[0, i] = testWaveValues[i];
                    }

                    for (int i = 0; i < spikeTask.Count; ++i)
                    {
                        spikeTask[i].Timing.SamplesPerChannel = (long)(numPeriods * size);
                    }

                    stimPulseTask.Timing.SamplesPerChannel = (long)(numPeriods * size); //Do numperiods cycles of sine wave
                    stimPulseWriter.WriteMultiSample(true, analogPulse);

                    double[] stateData = new double[4];
                    stateData[0] = -1.0;
                    stateData[1] = freqs[f];
                    stateData[2] = (double)f; //Frequency of interest

                    for (int i = diagnosticsReaders.Count - 1; i >= 0; --i)
                    {
                        stateData[3] = (double)i;                                                                                              //Keeps track of which device called the reader
                        diagnosticsReaders[i].BeginReadMultiSample((int)(numPeriods * size), analogInCallback_computeGain, (Object)stateData); //Get 5 seconds of "noise"
                    }

                    stimPulseTask.WaitUntilDone();
                    for (int i = 0; i < spikeTask.Count; ++i)
                    {
                        spikeTask[i].WaitUntilDone();
                        spikeTask[i].Stop();
                    }
                    stimPulseTask.Stop();
                }
                for (int c = 0; c < numChannels; ++c)
                {
                    scatterGraph_diagnostics.Plots.Add(new ScatterPlot());
                    scatterGraph_diagnostics.Plots[c].PlotXY(freqs, gains[c]);
                    textBox_diagnosticsResults.Text += "Channel " + (c + 1).ToString() + "\r\n\tFrequency (Hz)\tGain (dB)\r\n";
                    for (int f = 0; f < freqs.GetLength(0); ++f)
                    {
                        textBox_diagnosticsResults.Text += "\t" + freqs[f].ToString() + "\t" + gains[c][f].ToString() + "\r\n";
                    }
                    textBox_diagnosticsResults.Text += "\r\n";
                }
                scatterGraph_diagnostics.Refresh();
            }
            buttonStart.Enabled        = true;
            button_computeGain.Enabled = true;

            //Now, destroy the objects we made
            updateSettings();
            gains = null;
            diagnosticsReaders = null;
        }
        /// <summary>
        /// Writes the specified byte to the dev/port
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void writeButton_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                using (Task digitalWriteTask = new Task())
                {

                    //  Create an Digital Output channel and name it.
                    digitalWriteTask.DOChannels.CreateChannel(physicalChannelComboBox.Text, "port0", ChannelLineGrouping.OneChannelForAllLines);

                    //  Write digital port data. WriteDigitalSingChanSingSampPort writes a single sample
                    //  of digital data on demand, so no timeout is necessary.
                    DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(digitalWriteTask.Stream);
                    writer.WriteSingleSamplePort(true, (UInt32)NumericUpDowndataToWrite.Value);
                }

                refreshNumericUpDownValue();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }
Esempio n. 17
0
        private void button_computeGain_Click(object sender, EventArgs e)
        {
            double startFreq = Convert.ToDouble(numericUpDown_startFreq.Value);
            double stopFreq = Convert.ToDouble(numericUpDown_stopFreq.Value);
            double numPeriods = Convert.ToDouble(numericUpDown_numPeriods.Value);
            double[] freqs = new double[1 + Convert.ToInt32(Math.Floor(Math.Log(stopFreq / startFreq) / Math.Log(Convert.ToDouble(textBox_diagnosticsMult.Text))))]; //This determines the number of frequencies counting by doublings

            radioButton_stimVoltageControlled.Checked = true;
            radioButton_stimVoltageControlled_Click(null, null);

            //Populate freqs vector
            freqs[0] = startFreq;
            for (int i = 1; i < freqs.GetLength(0); ++i)
                freqs[i] = freqs[i - 1] * Convert.ToDouble(textBox_diagnosticsMult.Text);

            spikeSamplingRate = Properties.Settings.Default.RawSampleFrequency;
            buttonStart.Enabled = false;  //So users can't try to get data from the same card
            button_computeGain.Enabled = false;
            button_computeGain.Refresh();
            buttonStart.Refresh();
            spikeTask = new List<Task>(Properties.Settings.Default.AnalogInDevice.Count);
            diagnosticsReaders = new List<AnalogMultiChannelReader>(Properties.Settings.Default.AnalogInDevice.Count);
            for (int i = 0; i < Properties.Settings.Default.AnalogInDevice.Count; ++i)
            {
                spikeTask.Add(new Task("spikeTask_Diagnostics_" + i));
                int numChannelsPerDevice = (numChannels < 32 ? numChannels : 32);
                for (int j = 0; j < numChannelsPerDevice; ++j)
                    spikeTask[i].AIChannels.CreateVoltageChannel(Properties.Settings.Default.AnalogInDevice[0] + "/ai" + j.ToString(), "",
                        AITerminalConfiguration.Nrse, -10.0, 10.0, AIVoltageUnits.Volts);

                //Change gain based on comboBox values (1-100)
                setGain(spikeTask[i], Properties.Settings.Default.A2Dgain);

                //Verify the Task
                spikeTask[i].Control(TaskAction.Verify);

                spikeTask[i].Timing.ConfigureSampleClock("", spikeSamplingRate, SampleClockActiveEdge.Rising,
                    SampleQuantityMode.FiniteSamples);
                diagnosticsReaders.Add(new AnalogMultiChannelReader(spikeTask[i].Stream));
            }

            spikeTask[0].Timing.ReferenceClockSource = "OnboardClock";
            for (int i = 1; i < spikeTask.Count; ++i)
            {
                spikeTask[i].Timing.ReferenceClockSource = spikeTask[0].Timing.ReferenceClockSource;
                spikeTask[i].Timing.ReferenceClockRate = spikeTask[0].Timing.ReferenceClockRate;
            }
            stimPulseTask.Timing.ReferenceClockSource = spikeTask[0].Timing.ReferenceClockSource;
            stimPulseTask.Timing.ReferenceClockRate = spikeTask[0].Timing.ReferenceClockRate;

            stimDigitalTask.Dispose();
            stimDigitalTask = new Task("stimDigitalTask");
            if (Properties.Settings.Default.StimPortBandwidth == 32)
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:31", "",
                    ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            else if (Properties.Settings.Default.StimPortBandwidth == 8)
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:7", "",
                    ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            stimDigitalWriter = new DigitalSingleChannelWriter(stimDigitalTask.Stream);
            stimPulseTask.Timing.ConfigureSampleClock("/" + Properties.Settings.Default.AnalogInDevice[0] + "/ai/SampleClock",
                spikeSamplingRate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples);
            stimPulseTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("/" +
                                Properties.Settings.Default.AnalogInDevice[0] + "/ai/StartTrigger",
                                DigitalEdgeStartTriggerEdge.Rising);

            stimDigitalTask.Control(TaskAction.Verify);
            stimPulseTask.Control(TaskAction.Verify);

            switch (Properties.Settings.Default.NumChannels)
            {
                case 0:
                    numChannels = 16;
                    break;
                case 1:
                    numChannels = 32;
                    break;
                case 2:
                    numChannels = 48;
                    break;
                case 3:
                    numChannels = 64;
                    break;
            }
            //gains = new double[numChannels, freqs.GetLength(0)];
            //numChannels = 1;

            gains = new double[numChannels][];
            for (int i = 0; i < numChannels; ++i)
                gains[i] = new double[freqs.GetLength(0)];
            scatterGraph_diagnostics.ClearData();
            scatterGraph_diagnostics.Plots.Clear();

            textBox_diagnosticsResults.Clear();

            if (!checkBox_diagnosticsBulk.Checked)
            {
                //for (int c = 1; c <= numChannels; ++c)
                for (int c = 13; c < 14; ++c)
                {
                    textBox_diagnosticsResults.Text += "Channel " + c.ToString() + "\r\n\tFrequency (Hz)\tGain (dB)\r\n";

                    scatterGraph_diagnostics.Plots.Add(new ScatterPlot());

                    UInt32 data = StimPulse.channel2MUX((double)c); //Get data bits lined up to control MUXes

                    //Setup digital waveform
                    stimDigitalWriter.WriteSingleSamplePort(true, data);
                    stimDigitalTask.WaitUntilDone();
                    stimDigitalTask.Stop();

                    for (int f = 0; f < freqs.GetLength(0); ++f)
                    {
                        double numSeconds = 1 / freqs[f];
                        if (numSeconds * numPeriods < 0.1)
                        {
                            numPeriods = Math.Ceiling(0.1 * freqs[f]);
                        }

                        int size = Convert.ToInt32(numSeconds * spikeSamplingRate);
                        SineSignal testWave = new SineSignal(freqs[f], Convert.ToDouble(numericUpDown_diagnosticsVoltage.Value));  //Generate a 100 mV sine wave at 1000 Hz
                        double[] testWaveValues = testWave.Generate(spikeSamplingRate, size);

                        double[,] analogPulse = new double[2, size];

                        for (int i = 0; i < size; ++i)
                            analogPulse[0, i] = testWaveValues[i];

                        for (int i = 0; i < spikeTask.Count; ++i)
                            spikeTask[i].Timing.SamplesPerChannel = (long)(numPeriods * size);

                        stimPulseTask.Timing.SamplesPerChannel = (long)(numPeriods * size); //Do numperiods cycles of sine wave
                        stimPulseWriter.WriteMultiSample(true, analogPulse);

                        double[] stateData = new double[4];
                        stateData[0] = (double)c;
                        stateData[1] = freqs[f];
                        stateData[2] = (double)f;
                        for (int i = diagnosticsReaders.Count - 1; i >= 0; --i)
                        {
                            stateData[3] = (double)i;
                            diagnosticsReaders[i].BeginReadMultiSample((int)(numPeriods * size), analogInCallback_computeGain, (Object)stateData); //Get 5 seconds of "noise"
                        }

                        stimPulseTask.WaitUntilDone();
                        for (int i = 0; i < spikeTask.Count; ++i)
                        {
                            spikeTask[i].WaitUntilDone();
                            spikeTask[i].Stop();
                        }
                        stimPulseTask.Stop();
                    }
                    stimDigitalWriter.WriteSingleSamplePort(true, 0);
                    stimDigitalTask.WaitUntilDone();
                    stimDigitalTask.Stop();
                    //DEBUGGING
                    c = 1;
                    scatterGraph_diagnostics.Plots[c - 1].PlotXY(freqs, gains[c - 1]);
                    for (int f = 0; f < freqs.GetLength(0); ++f)
                    {
                        textBox_diagnosticsResults.Text += "\t" + freqs[f].ToString() + "\t" + gains[c - 1][f] + "\r\n";
                    }
                    textBox_diagnosticsResults.Text += "\r\n";
                    scatterGraph_diagnostics.Refresh();

                    //DEBUGGING
                    c = 100;
                }
            }
            else
            {
                for (int f = 0; f < freqs.GetLength(0); ++f)
                {
                    double numSeconds = 1 / freqs[f];
                    if (numSeconds * numPeriods < 0.1)
                    {
                        numPeriods = Math.Ceiling(0.1 * freqs[f]);
                    }

                    int size = Convert.ToInt32(numSeconds * spikeSamplingRate);
                    SineSignal testWave = new SineSignal(freqs[f], Convert.ToDouble(numericUpDown_diagnosticsVoltage.Value));  //Generate a 100 mV sine wave at 1000 Hz
                    double[] testWaveValues = testWave.Generate(spikeSamplingRate, size);

                    double[,] analogPulse = new double[2, size];

                    for (int i = 0; i < size; ++i)
                        analogPulse[0, i] = testWaveValues[i];

                    for (int i = 0; i < spikeTask.Count; ++i)
                        spikeTask[i].Timing.SamplesPerChannel = (long)(numPeriods * size);

                    stimPulseTask.Timing.SamplesPerChannel = (long)(numPeriods * size); //Do numperiods cycles of sine wave
                    stimPulseWriter.WriteMultiSample(true, analogPulse);

                    double[] stateData = new double[4];
                    stateData[0] = -1.0;
                    stateData[1] = freqs[f];
                    stateData[2] = (double)f; //Frequency of interest

                    for (int i = diagnosticsReaders.Count - 1; i >= 0; --i)
                    {
                        stateData[3] = (double)i; //Keeps track of which device called the reader
                        diagnosticsReaders[i].BeginReadMultiSample((int)(numPeriods * size), analogInCallback_computeGain, (Object)stateData); //Get 5 seconds of "noise"
                    }

                    stimPulseTask.WaitUntilDone();
                    for (int i = 0; i < spikeTask.Count; ++i)
                    {
                        spikeTask[i].WaitUntilDone();
                        spikeTask[i].Stop();
                    }
                    stimPulseTask.Stop();
                }
                for (int c = 0; c < numChannels; ++c)
                {
                    scatterGraph_diagnostics.Plots.Add(new ScatterPlot());
                    scatterGraph_diagnostics.Plots[c].PlotXY(freqs, gains[c]);
                    textBox_diagnosticsResults.Text += "Channel " + (c + 1).ToString() + "\r\n\tFrequency (Hz)\tGain (dB)\r\n";
                    for (int f = 0; f < freqs.GetLength(0); ++f)
                    {
                        textBox_diagnosticsResults.Text += "\t" + freqs[f].ToString() + "\t" + gains[c][f].ToString() + "\r\n";
                    }
                    textBox_diagnosticsResults.Text += "\r\n";
                }
                scatterGraph_diagnostics.Refresh();
            }
            buttonStart.Enabled = true;
            button_computeGain.Enabled = true;

            //Now, destroy the objects we made
            updateSettings();
            gains = null;
            diagnosticsReaders = null;
        }
 private void WriteSingleDigital(NIDAQOutputStream stream, double value)
 {
     using (var t = new DAQTask())
     {
         t.DOChannels.CreateChannel(stream.PhysicalName, "", ChannelLineGrouping.OneChannelForAllLines);
         var writer = new DigitalSingleChannelWriter(t.Stream);
         writer.WriteSingleSamplePort(true, (UInt32) value);
     }
 }
Esempio n. 19
0
        private int SetPortPath(string PortPath)
        {
            try
            {
                string[] SwitchNoAndStatus = PortPath.Split(' ');

                int   NoOfSwitch   = SwitchNoAndStatus.Length;
                int[] SwitchNo     = new int[NoOfSwitch];
                int[] SwitchStatus = new int[NoOfSwitch];

                string[] tempSwitchNoAndStatus = new string[2];


                // Generate arrays for switch no and switch on/off status
                for (int i = 0; i < NoOfSwitch; i++)
                {
                    tempSwitchNoAndStatus = SwitchNoAndStatus[i].Split(':');
                    SwitchNo[i]           = Convert.ToInt32(tempSwitchNoAndStatus[0]);
                    SwitchStatus[i]       = Convert.ToInt32(tempSwitchNoAndStatus[1]);
                }


                // Clear the channel write need status
                bool[] ChannelWriteNeeded = new bool[12];
                int    PortNo             = 0;
                int    ChNo = 0;

                for (int i = 0; i < NoOfSwitch; i++)
                {
                    if (SwitchNo[i] == 48)
                    {
                        PortNo = 9;
                    }
                    else
                    {
                        PortNo = Convert.ToInt32(Math.Truncate(SwitchNo[i] / 8d));
                    }

                    ChNo = SwitchNo[i] - PortNo * 8;
                    int tempChValue = Convert.ToInt32(Math.Pow(2, ChNo));
                    int tempBitAnd  = (ChannelValue[PortNo] & tempChValue);

                    if ((tempBitAnd == tempChValue) && (SwitchStatus[i] == 1))
                    {
                        // Do nothing
                    }
                    else if ((tempBitAnd == tempChValue) && (SwitchStatus[i] == 0))
                    {
                        ChannelValue[PortNo]      -= tempChValue;
                        ChannelWriteNeeded[PortNo] = true;
                    }
                    else if ((tempBitAnd != tempChValue) && (SwitchStatus[i] == 1))
                    {
                        ChannelValue[PortNo]      += tempChValue;
                        ChannelWriteNeeded[PortNo] = true;
                    }
                    else if ((tempBitAnd != tempChValue) && (SwitchStatus[i] == 0))
                    {
                        // Do nothing
                    }
                    else
                    {
                        MessageBox.Show("Error");
                    }
                }


                // Channel Write
                if (ChannelWriteNeeded[0])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP00.WriteSingleSamplePort(true, ChannelValue[0]);
                }
                if (ChannelWriteNeeded[1])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP01.WriteSingleSamplePort(true, ChannelValue[1]);
                }
                if (ChannelWriteNeeded[2])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP02.WriteSingleSamplePort(true, ChannelValue[2]);
                }
                if (ChannelWriteNeeded[3])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP03.WriteSingleSamplePort(true, ChannelValue[3]);
                }
                if (ChannelWriteNeeded[4])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP04.WriteSingleSamplePort(true, ChannelValue[4]);
                }
                if (ChannelWriteNeeded[5])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP05.WriteSingleSamplePort(true, ChannelValue[5]);
                }
                if (ChannelWriteNeeded[9])
                {
                    // writerP10.WriteSingleSamplePort(true, portValue);
                    writerP09.WriteSingleSamplePort(true, ChannelValue[9]);
                }

                return(0);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "SetPortPath");
                return(-1);
            }
        }
Esempio n. 20
0
        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Measure each channel
            for (int c = 0; c < numChannels && !bgWorker.CancellationPending; ++c)
            {
                UInt32 MuxData = StimPulse.channel2MUX(Convert.ToDouble(startChannel + c));

                //Setup digital waveform, open MUX channel
                stimDigitalWriter.WriteSingleSamplePort(true, MuxData);
                stimDigitalTask.WaitUntilDone();
                stimDigitalTask.Stop();

                double numPeriodsUsed = numPeriods;
                for (int f = 0; f < freqs.GetLength(0) && !bgWorker.CancellationPending; ++f)
                {
                    //Update progress bars
                    bgWorker.ReportProgress(100 * (f + (c * freqs.Length)) / (numChannels * freqs.Length), new double[] { startChannel + c, freqs[f] });

                    //Create test wave
                    double numSeconds = 1 / freqs[f];
                    if (numSeconds * numPeriods < 0.1)
                    {
                        numPeriodsUsed = Math.Ceiling(0.1 * freqs[f]);
                    }
                    SineSignal testWave       = new SineSignal(freqs[f], commandVoltage); //Generate a 100 mV sine wave at 1000 Hz
                    double[]   testWaveValues = testWave.Generate(IMPEDANCE_SAMPLING_RATE, (long)Math.Round(numSeconds * (double)IMPEDANCE_SAMPLING_RATE));

                    int size = Convert.ToInt32(numSeconds * IMPEDANCE_SAMPLING_RATE);
                    double[,] analogPulse = new double[4, size];

                    for (int i = 0; i < size; ++i)
                    {
                        analogPulse[0 + 2, i] = testWaveValues[i];
                    }

                    impedanceRecord.Timing.SamplesPerChannel = (long)(numPeriodsUsed * size);
                    stimAnalogTask.Timing.SamplesPerChannel  = (long)(numPeriodsUsed * size); //Do numperiods cycles of sine wave

                    //Deliver pulse
                    stimAnalogWriter.WriteMultiSample(true, analogPulse);
                    double[] data = impedanceReader.ReadMultiSample((int)(numPeriodsUsed * size));

                    #region Calculate Impedance
                    //Remove DC offset
                    double mData = 0.0;
                    for (int i = 0; i < data.Length; ++i)
                    {
                        mData += data[i];
                    }
                    mData /= data.Length;
                    for (int i = 0; i < data.Length; ++i)
                    {
                        data[i] -= mData;
                    }

                    //Filter data with Butterworth, if checked
                    if (useBandpassFilter)
                    {
                        ButterworthBandpassFilter bwfilt = new ButterworthBandpassFilter(1, IMPEDANCE_SAMPLING_RATE, freqs[f] - freqs[f] / 4, freqs[f] + freqs[f] / 4);
                        data = bwfilt.FilterData(data);
                    }

                    //Use matched filter to reduce noise, if checked (slow)
                    if (useMatchedFilter)
                    {
                        SineSignal wave = new SineSignal(freqs[f], 1.0); //Create a sine wave at test frequency of amplitude 1
                        double[]   h;                                    //filter
                        //If data is very long, subsample by an order of magnitude
                        if (data.Length > 1E6)
                        {
                            double[] dataNew = new double[(int)Math.Floor((double)data.Length / 10)];
                            for (int i = 0; i < dataNew.Length; ++i)
                            {
                                dataNew[i] = data[i * 10];
                            }
                            data    = dataNew;
                            dataNew = null;
                            h       = wave.Generate(IMPEDANCE_SAMPLING_RATE / 10, (long)Math.Round((double)IMPEDANCE_SAMPLING_RATE / (freqs[f] * 10))); //Generate one period
                        }

                        else
                        {
                            h = wave.Generate(IMPEDANCE_SAMPLING_RATE, (long)Math.Round((double)IMPEDANCE_SAMPLING_RATE / freqs[f])); //Generate one period
                        }
                        wave = null;
                        //Compute filter power
                        double phh = 0.0;
                        for (int i = 0; i < h.Length; ++i)
                        {
                            phh += h[i] * h[i];
                        }
                        //Normalize filter so power is 1
                        for (int i = 0; i < h.Length; ++i)
                        {
                            h[i] /= phh;
                        }

                        //sw.Start();
                        double[] x = NationalInstruments.Analysis.Dsp.SignalProcessing.Convolve(data, h);
                        //sw.Stop();
                        //TimeSpan ts = sw.Elapsed;
                        //System.Diagnostics.Debug.WriteLine("ms = " + ts.Milliseconds + "\t s = " + ts.Seconds + "\t min = " + ts.Minutes);

                        int offset = (int)(h.Length * 0.5);
                        for (int i = 0; i < data.Length; ++i)
                        {
                            data[i] = x[i + offset];                                   //Take center values
                        }
                    }

                    double rms = rootMeanSquared(data);

                    if (isCurrentControlled)  //Current-controlled
                    {
                        impedance[c][f] = rms / (0.707106704695506 * commandVoltage / RCurr);
                        //Account for 6.8 MOhm resistor in parallel
                        impedance[c][f] = 1.0 / (1.0 / impedance[c][f] - 1.0 / 6800000.0);
                    }
                    else  //Voltage-controlled
                    {
                        double gain = 1.0 + (49400.0 / RGain); //Based on LT in-amp
                        impedance[c][f] = (0.707106704695506 * commandVoltage) / ((rms / gain) / RMeas);
                    }
                    #endregion

                    //Wait until recording and stim are finished
                    stimAnalogTask.WaitUntilDone();
                    impedanceRecord.WaitUntilDone();
                    stimAnalogTask.Stop();
                    impedanceRecord.Stop();
                }

                //De-select channel on mux
                stimDigitalWriter.WriteSingleSamplePort(true, 0);
                stimDigitalTask.WaitUntilDone();
                stimDigitalTask.Stop();

                //Notify that channel is done
                if (alertChannelFinished != null)
                {
                    alertChannelFinished(this, c, startChannel + c, impedance, freqs);
                }
            }
            //Reset muxes
            bool[] fData = new bool[Properties.Settings.Default.StimPortBandwidth];
            stimDigitalWriter.WriteSingleSampleMultiLine(true, fData);
            stimDigitalTask.WaitUntilDone();
            stimDigitalTask.Stop();
        }
Esempio n. 21
0
        private void button_electrolesioningStart_Click(object sender, EventArgs e)
        {
            //Change mouse cursor to waiting cursor
            this.Cursor = Cursors.WaitCursor;

            //Grab values from UI
            double voltage = Convert.ToDouble(numericUpDown_electrolesioningVoltage.Value);
            double duration = Convert.ToDouble(numericUpDown_electrolesioningDuration.Value);
            List<Int32> chList = new List<int>(listBox_electrolesioningChannels.SelectedIndices.Count);
            for (int i = 0; i < listBox_electrolesioningChannels.SelectedIndices.Count; ++i)
                chList.Add(listBox_electrolesioningChannels.SelectedIndices[i] + 1); //+1 since indices are 0-based but channels are 1-base

            //Disable buttons, so users don't try running two experiments at once
            button_electrolesioningStart.Enabled = false;
            button_electrolesioningSelectAll.Enabled = false;
            button_electrolesioningSelectNone.Enabled = false;
            button_electrolesioningStart.Refresh();

            //Refresh stim task
            stimDigitalTask.Dispose();
            stimDigitalTask = new Task("stimDigitalTask_Electrolesioning");
            if (Properties.Settings.Default.StimPortBandwidth == 32)
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:31", "",
                    ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            else if (Properties.Settings.Default.StimPortBandwidth == 8)
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:7", "",
                    ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            stimDigitalWriter = new DigitalSingleChannelWriter(stimDigitalTask.Stream);

            //Refresh pulse task
            stimPulseTask.Dispose();
            stimPulseTask = new Task("stimPulseTask");
            if (Properties.Settings.Default.StimPortBandwidth == 32)
            {
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao0", "", -10.0, 10.0, AOVoltageUnits.Volts); //Triggers
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao1", "", -10.0, 10.0, AOVoltageUnits.Volts); //Triggers
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao2", "", -10.0, 10.0, AOVoltageUnits.Volts); //Actual Pulse
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao3", "", -10.0, 10.0, AOVoltageUnits.Volts); //Timing
            }
            else if (Properties.Settings.Default.StimPortBandwidth == 8)
            {
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao0", "", -10.0, 10.0, AOVoltageUnits.Volts);
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao1", "", -10.0, 10.0, AOVoltageUnits.Volts);
            }

            stimPulseWriter = new AnalogMultiChannelWriter(stimPulseTask.Stream);

            stimPulseTask.Timing.ConfigureSampleClock("",
                StimPulse.STIM_SAMPLING_FREQ, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples);
            stimPulseTask.Timing.SamplesPerChannel = 2;

            stimDigitalTask.Control(TaskAction.Verify);
            stimPulseTask.Control(TaskAction.Verify);

            //For each channel, deliver lesioning pulse
            for (int i = 0; i < chList.Count; ++i)
            {
                int channel = chList[i];
                UInt32 data = StimPulse.channel2MUX((double)channel);

                //Setup digital waveform, open MUX channel
                stimDigitalWriter.WriteSingleSamplePort(true, data);
                stimDigitalTask.WaitUntilDone();
                stimDigitalTask.Stop();

                //Write voltage to channel, wait duration, stop
                stimPulseWriter.WriteMultiSample(true, new double[,] { { 0, 0 }, { 0, 0 }, { voltage, voltage }, { 0, 0 } });
                stimPulseTask.WaitUntilDone();
                stimPulseTask.Stop();
                Thread.Sleep((int)(Math.Round(duration * 1000))); //Convert to ms
                stimPulseWriter.WriteMultiSample(true, new double[,] { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } });
                stimPulseTask.WaitUntilDone();
                stimPulseTask.Stop();

                //Close MUX
                stimDigitalWriter.WriteSingleSamplePort(true, 0);
                stimDigitalTask.WaitUntilDone();
                stimDigitalTask.Stop();
            }

            bool[] fData = new bool[Properties.Settings.Default.StimPortBandwidth];
            stimDigitalWriter.WriteSingleSampleMultiLine(true, fData);
            stimDigitalTask.WaitUntilDone();
            stimDigitalTask.Stop();

            button_electrolesioningSelectAll.Enabled = true;
            button_electrolesioningSelectNone.Enabled = true;
            button_electrolesioningStart.Enabled = true;

            //Now, destroy the objects we made
            updateSettings();
            this.Cursor = Cursors.Default;
        }
Esempio n. 22
0
        private void button_electrolesioningStart_Click(object sender, EventArgs e)
        {
            //Change mouse cursor to waiting cursor
            this.Cursor = Cursors.WaitCursor;

            //Grab values from UI
            double       voltage  = Convert.ToDouble(numericUpDown_electrolesioningVoltage.Value);
            double       duration = Convert.ToDouble(numericUpDown_electrolesioningDuration.Value);
            List <Int32> chList   = new List <int>(listBox_electrolesioningChannels.SelectedIndices.Count);

            for (int i = 0; i < listBox_electrolesioningChannels.SelectedIndices.Count; ++i)
            {
                chList.Add(listBox_electrolesioningChannels.SelectedIndices[i] + 1); //+1 since indices are 0-based but channels are 1-base
            }
            //Disable buttons, so users don't try running two experiments at once
            button_electrolesioningStart.Enabled      = false;
            button_electrolesioningSelectAll.Enabled  = false;
            button_electrolesioningSelectNone.Enabled = false;
            button_electrolesioningStart.Refresh();

            //Refresh stim task
            stimDigitalTask.Dispose();
            stimDigitalTask = new Task("stimDigitalTask_Electrolesioning");
            if (Properties.Settings.Default.StimPortBandwidth == 32)
            {
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:31", "",
                                                         ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            }
            else if (Properties.Settings.Default.StimPortBandwidth == 8)
            {
                stimDigitalTask.DOChannels.CreateChannel(Properties.Settings.Default.StimulatorDevice + "/Port0/line0:7", "",
                                                         ChannelLineGrouping.OneChannelForAllLines); //To control MUXes
            }
            stimDigitalWriter = new DigitalSingleChannelWriter(stimDigitalTask.Stream);

            //Refresh pulse task
            stimPulseTask.Dispose();
            stimPulseTask = new Task("stimPulseTask");
            if (Properties.Settings.Default.StimPortBandwidth == 32)
            {
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao0", "", -10.0, 10.0, AOVoltageUnits.Volts); //Triggers
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao1", "", -10.0, 10.0, AOVoltageUnits.Volts); //Triggers
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao2", "", -10.0, 10.0, AOVoltageUnits.Volts); //Actual Pulse
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao3", "", -10.0, 10.0, AOVoltageUnits.Volts); //Timing
            }
            else if (Properties.Settings.Default.StimPortBandwidth == 8)
            {
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao0", "", -10.0, 10.0, AOVoltageUnits.Volts);
                stimPulseTask.AOChannels.CreateVoltageChannel(Properties.Settings.Default.StimulatorDevice + "/ao1", "", -10.0, 10.0, AOVoltageUnits.Volts);
            }

            stimPulseWriter = new AnalogMultiChannelWriter(stimPulseTask.Stream);

            stimPulseTask.Timing.ConfigureSampleClock("",
                                                      StimPulse.STIM_SAMPLING_FREQ, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples);
            stimPulseTask.Timing.SamplesPerChannel = 2;


            stimDigitalTask.Control(TaskAction.Verify);
            stimPulseTask.Control(TaskAction.Verify);

            //For each channel, deliver lesioning pulse
            for (int i = 0; i < chList.Count; ++i)
            {
                int    channel = chList[i];
                UInt32 data    = StimPulse.channel2MUX((double)channel);

                //Setup digital waveform, open MUX channel
                stimDigitalWriter.WriteSingleSamplePort(true, data);
                stimDigitalTask.WaitUntilDone();
                stimDigitalTask.Stop();

                //Write voltage to channel, wait duration, stop
                stimPulseWriter.WriteMultiSample(true, new double[, ] {
                    { 0, 0 }, { 0, 0 }, { voltage, voltage }, { 0, 0 }
                });
                stimPulseTask.WaitUntilDone();
                stimPulseTask.Stop();
                Thread.Sleep((int)(Math.Round(duration * 1000))); //Convert to ms
                stimPulseWriter.WriteMultiSample(true, new double[, ] {
                    { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }
                });
                stimPulseTask.WaitUntilDone();
                stimPulseTask.Stop();

                //Close MUX
                stimDigitalWriter.WriteSingleSamplePort(true, 0);
                stimDigitalTask.WaitUntilDone();
                stimDigitalTask.Stop();
            }

            bool[] fData = new bool[Properties.Settings.Default.StimPortBandwidth];
            stimDigitalWriter.WriteSingleSampleMultiLine(true, fData);
            stimDigitalTask.WaitUntilDone();
            stimDigitalTask.Stop();

            button_electrolesioningSelectAll.Enabled  = true;
            button_electrolesioningSelectNone.Enabled = true;
            button_electrolesioningStart.Enabled      = true;

            //Now, destroy the objects we made
            updateSettings();
            this.Cursor = Cursors.Default;
        }
Esempio n. 23
0
        public void resetFlipFlop()
        {
            ResetSignal = new Task("Reset Signal");
            DOChannel myDOChannel;
            myDOChannel = ResetSignal.DOChannels.CreateChannel(
                prevodnikId + "/port0",
                "write0",
                ChannelLineGrouping.OneChannelForAllLines
                );

            writer = new DigitalSingleChannelWriter(ResetSignal.Stream);

            writer.WriteSingleSamplePort(true, 127);//nastavit P0 na 01111111, => reset

            Thread.Sleep(100);
            writer.WriteSingleSamplePort(true, 255);//nastavit P0 na 11111111, => reset resetu

            ResetSignal.Dispose();
        }