Esempio n. 1
0
        /// <summary>
        /// 配置Do输出任务
        /// </summary>
        /// <returns></returns>
        private API_RETURN_CODE ConfigDoTask()
        {
            API_RETURN_CODE code = API_RETURN_CODE.API_SUCCESS;

            try
            {
                m_doTask = new Task();

                m_doTask.DOChannels.CreateChannel(GetDoPhysicalChannelName(), "", ChannelLineGrouping.OneChannelForEachLine);
                m_doTask.Control(TaskAction.Verify);

                m_doTask.Timing.SampleClockRate = m_params.DoSampleRate;
                m_doTask.Timing.ConfigureSampleClock("",
                                                     m_doTask.Timing.SampleClockRate,
                                                     SampleClockActiveEdge.Rising,
                                                     SampleQuantityMode.ContinuousSamples,
                                                     m_params.AoSampleCountPerFrame);

                // 设置Do Start Trigger源为Ao Start Trigger[默认],实现启动同步
                string source = m_sysConfig.GetStartSyncSignal();
                m_doTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger(source, DigitalEdgeStartTriggerEdge.Rising);

                // 路由Do Sample Clcok到PFI1
                //if (m_config.Debugging)
                //{
                //    Logger.Info(string.Format("route do sample clock to PFI1."));
                //    m_doTask.ExportSignals.SampleClockOutputTerminal = string.Concat("/" + NI_CARD_NAME_DEFAULT + "/PFI1");
                //}

                m_doTask.Stream.WriteRegenerationMode = WriteRegenerationMode.AllowRegeneration;

                DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(m_doTask.Stream);
                DigitalWaveform            wave   = DigitalWaveform.FromPort(m_params.DigitalTriggerSamplesPerLine, 0x01);
                writer.WriteWaveform(false, wave);
            }
            catch (Exception e)
            {
                Logger.Error(string.Format("config do task exception: [{0}].", e));
                code = API_RETURN_CODE.API_FAILED_NI_CONFIG_DO_TASK_EXCEPTION;
            }
            return(code);
        }
Esempio n. 2
0
        //Called after data acq. is complete, resets buttons and stops tasks.
        private void reset()
        {
            // Disable asychronous activity
            taskRunning = false;

            // Start by resetting the hardware settings
            UpdateRecordingSettings();

            //Grab display gains for later use
            if (spikePlotData != null)
            {
                if (spikePlotData.getGain() != null)
                {
                    Properties.Settings.Default.SpikeDisplayGain = spikePlotData.getGain();
                }
            }
            if (Properties.Settings.Default.UseLFPs & (lfpPlotData != null))
            {
                Properties.Settings.Default.LFPDisplayGain = lfpPlotData.getGain();
            }
            if (waveformPlotData != null)
            {
                if (waveformPlotData.getGain() != null)
                {
                    Properties.Settings.Default.SpkWfmDisplayGain = waveformPlotData.getGain();
                }
            }
            Console.WriteLine("reset: gains saved");

            if (triggerWriter != null)
            {
                byte[] b_array = new byte[3] {
                    0, 0, 0
                };
                DigitalWaveform wfm = new DigitalWaveform(3, 8, DigitalState.ForceDown);
                wfm         = NationalInstruments.DigitalWaveform.FromPort(b_array);
                triggerTask = new Task("TriggerTask");
                triggerTask.DOChannels.CreateChannel(Properties.Settings.Default.CineplexDevice + "/Port0/line0:7", "",
                                                     ChannelLineGrouping.OneChannelForAllLines);
                triggerWriter = new DigitalSingleChannelWriter(triggerTask.Stream);
                triggerWriter.WriteWaveform(true, wfm);
                triggerTask.WaitUntilDone();
            }
            Console.WriteLine("reset: trigger cleared");
            // Kill the background workers
            lock (this)
            {
                Console.WriteLine("reset: entered lock");
                if (bwSpikes != null)
                {
                    try
                    {
                        for (int i = 0; i < bwSpikes.Count; ++i)
                        {
                            //block while bw finishes
                            if (bwSpikes[i] != null)
                            {
                                Console.WriteLine("reset: " + bwSpikes[i].ToString() + " " + i.ToString() + "is busy");
                                while (bwSpikes[i].IsBusy)
                                {
                                    Application.DoEvents();
                                }
                                Console.WriteLine("reset: " + bwSpikes[i].ToString() + " " + i.ToString() + "finished");
                            }
                        }
                    }
                    catch
                    {
                        Console.WriteLine("reset: error while clearing spike tasks");
                        //All the bw workers are done, so we'll kill them
                        for (int i = 0; i < bwSpikes.Count; ++i)
                        {
                            bwSpikes[i].Dispose();
                        }
                        bwSpikes.Clear();
                        bwSpikes = null;
                    }
                }
                Console.WriteLine("reset: left lock");
            }
            Console.WriteLine("reset: spike tasks cleared");

            if (waveformPlotData != null)
            {
                waveformPlotData.stop();
            }
            if (Properties.Settings.Default.SeparateLFPBoard && lfpTask != null)
            {
                lfpTask.Dispose();
            }
            if (Properties.Settings.Default.UseEEG && eegTask != null)
            {
                eegTask.Dispose();
            }
            if (BNCOutput != null)
            {
                BNCOutput.Dispose(); BNCOutput = null;
            }
            if (stimTimeTask != null)
            {
                stimTimeTask.Dispose();
            }
            if (triggerTask != null)
            {
                triggerTask.Dispose();
            }
            if (auxAnInTask != null)
            {
                auxAnInTask.Dispose();
            }
            if (auxDigInTask != null)
            {
                auxDigInTask.Dispose();
            }
            Console.WriteLine("reset: tasks disposed of");
            buttonStop.Enabled                 = false;
            buttonStart.Enabled                = true;
            spikeDet.numPreSamples.Enabled     = true;
            spikeDet.numPostSamples.Enabled    = true;
            settingsToolStripMenuItem.Enabled  = true;
            button_Train.Enabled               = true;
            button_SetRecordingStreams.Enabled = true;
            switch_record.Enabled              = true;
            //processingSettingsToolStripMenuItem.Enabled = true;
            button_startStimFromFile.Enabled   = true;
            button_startClosedLoopStim.Enabled = true;
            //numericUpDown_NumSnipsDisplayed.Enabled = true;
            button_stopClosedLoopStim.Enabled  = false;
            button_startClosedLoopStim.Enabled = true;
            checkBox_SALPA.Enabled             = true;


            Console.WriteLine("reset: gui updated");
            // Clean up data streams
            recordingSettings.Flush();
            Console.WriteLine("reset: recording streams flushed");
            if (triggerWriter != null)
            {
                triggerWriter = null;
            }
            channelOut.Enabled = Properties.Settings.Default.UseSingleChannelPlayback;

            led_recording.OnColor = Color.Lime;
            if (!button_startStimFromFile.Enabled)
            {
                button_startStimFromFile.Enabled = true;
            }

            //debugger
            if (Debugger != null)
            {
                Debugger.Close();
                Debugger = null;
            }

            timer_timeElapsed.Enabled = false;
            Console.WriteLine("Reset Complete");
        }
Esempio n. 3
0
        //Called after data acq. is complete, resets buttons and stops tasks.
        private void reset()
        {
            // Disable asychronous activity
            taskRunning = false;

            // Start by resetting the hardware settings
            UpdateRecordingSettings();

            //Grab display gains for later use
            if (spikePlotData != null)
                if (spikePlotData.getGain() != null)
                    Properties.Settings.Default.SpikeDisplayGain = spikePlotData.getGain();
            if (Properties.Settings.Default.UseLFPs & (lfpPlotData != null))
                Properties.Settings.Default.LFPDisplayGain = lfpPlotData.getGain();
            if (waveformPlotData != null)
                if (waveformPlotData.getGain() != null)
                    Properties.Settings.Default.SpkWfmDisplayGain = waveformPlotData.getGain();
            Console.WriteLine("reset: gains saved");

            if (triggerWriter != null)
            {
                byte[] b_array = new byte[3] { 0, 0, 0 };
                DigitalWaveform wfm = new DigitalWaveform(3, 8, DigitalState.ForceDown);
                wfm = NationalInstruments.DigitalWaveform.FromPort(b_array);
                triggerTask = new Task("TriggerTask");
                triggerTask.DOChannels.CreateChannel(Properties.Settings.Default.CineplexDevice + "/Port0/line0:7", "",
                    ChannelLineGrouping.OneChannelForAllLines);
                triggerWriter = new DigitalSingleChannelWriter(triggerTask.Stream);
                triggerWriter.WriteWaveform(true, wfm);
                triggerTask.WaitUntilDone();
            }
            Console.WriteLine("reset: trigger cleared");
            // Kill the background workers
            lock (this)
            {
                Console.WriteLine("reset: entered lock");
                if (bwSpikes != null)
                {
                    try
                    {
                        for (int i = 0; i < bwSpikes.Count; ++i)
                            //block while bw finishes
                            if (bwSpikes[i] != null)
                            {
                                Console.WriteLine("reset: " + bwSpikes[i].ToString() + " " + i.ToString() + "is busy");
                                while (bwSpikes[i].IsBusy)
                                {
                                    Application.DoEvents();
                                }
                                Console.WriteLine("reset: " + bwSpikes[i].ToString() + " " + i.ToString() + "finished");
                            }

                    }
                    catch
                    {
                        Console.WriteLine("reset: error while clearing spike tasks");
                        //All the bw workers are done, so we'll kill them
                        for (int i = 0; i < bwSpikes.Count; ++i)
                            bwSpikes[i].Dispose();
                        bwSpikes.Clear();
                        bwSpikes = null;
                    }
                }
                Console.WriteLine("reset: left lock");
            }
            Console.WriteLine("reset: spike tasks cleared");

            if (waveformPlotData != null) waveformPlotData.stop();
            if (Properties.Settings.Default.SeparateLFPBoard && lfpTask != null) lfpTask.Dispose();
            if (Properties.Settings.Default.UseEEG && eegTask != null) eegTask.Dispose();
            if (BNCOutput != null) { BNCOutput.Dispose(); BNCOutput = null; }
            if (stimTimeTask != null) stimTimeTask.Dispose();
            if (triggerTask != null) triggerTask.Dispose();
            if (auxAnInTask != null) auxAnInTask.Dispose();
            if (auxDigInTask != null) auxDigInTask.Dispose();
            Console.WriteLine("reset: tasks disposed of");
            buttonStop.Enabled = false;
            buttonStart.Enabled = true;
            spikeDet.numPreSamples.Enabled = true;
            spikeDet.numPostSamples.Enabled = true;
            settingsToolStripMenuItem.Enabled = true;
            button_Train.Enabled = true;
            button_SetRecordingStreams.Enabled = true;
            switch_record.Enabled = true;
            //processingSettingsToolStripMenuItem.Enabled = true;
            button_startStimFromFile.Enabled = true;
            button_startClosedLoopStim.Enabled = true;
            //numericUpDown_NumSnipsDisplayed.Enabled = true;
            button_stopClosedLoopStim.Enabled = false;
            button_startClosedLoopStim.Enabled = true;
            checkBox_SALPA.Enabled = true;

            Console.WriteLine("reset: gui updated");
            // Clean up data streams
            recordingSettings.Flush();
            Console.WriteLine("reset: recording streams flushed");
            if (triggerWriter != null) triggerWriter = null;
            channelOut.Enabled = Properties.Settings.Default.UseSingleChannelPlayback;

            led_recording.OnColor = Color.Lime;
            if (!button_startStimFromFile.Enabled) { button_startStimFromFile.Enabled = true; }

            //debugger
            if (Debugger != null)
            {
                Debugger.Close();
                Debugger = null;
            }

            timer_timeElapsed.Enabled = false;
            Console.WriteLine("Reset Complete");
        }