Example #1
0
        public bool LaserLockBlocked(string laser)
        {
            bool lockBlocked = false;

            if (DIChannelsLookup.ContainsKey(laser))
            {
                int             index    = DIChannelsLookup[laser];
                DigitalWaveform waveform = DIData[index];
                lockBlocked = waveform.Signals[0].States.Any(x => x == DigitalState.ForceUp);
            }

            return(lockBlocked);
        }
Example #2
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);
        }
        // Start all the tasks having to do with recording
        private void NRStartRecording()
        {
            lock (this)
            {
                try
                {
                    // Take care of buttons
                    buttonStop.Enabled = true;
                    buttonStart.Enabled = false;

                    // integers tracking the number of reads performed
                    trackingReads = new int[2];
                    trackingProc = new int[2];
                    trackingDigReads = new int();

                    //Start tasks (start LFP first, since it's triggered off spikeTask) and timer (for file writing)
                    if (checkBox_video.Checked)
                    {
                        byte[] b_array = new byte[3] { 255, 255, 255 };
                        DigitalWaveform wfm = new DigitalWaveform(3, 8, DigitalState.ForceDown);
                        wfm = NationalInstruments.DigitalWaveform.FromPort(b_array);
                        triggerWriter.BeginWriteWaveform(true, wfm, null, null);
                    }

                    if (Properties.Settings.Default.useAuxDigitalInput)
                        auxDigInTask.Start();
                    if (Properties.Settings.Default.UseStimulator && Properties.Settings.Default.RecordStimTimes)
                        stimTimeTask.Start();
                    if (Properties.Settings.Default.useAuxAnalogInput && !twoAITasksOnSingleBoard)
                        auxAnInTask.Start();
                    if (Properties.Settings.Default.SeparateLFPBoard && Properties.Settings.Default.UseLFPs)
                        lfpTask.Start();
                    if (Properties.Settings.Default.UseEEG)
                        eegTask.Start();
                    for (int i = spikeTask.Count - 1; i >= 0; --i)
                        spikeTask[i].Start(); //Start first task last, since it has master clock

                    // Start data collection
                    if (Properties.Settings.Default.useAuxAnalogInput && !twoAITasksOnSingleBoard)
                        auxAnReader.BeginMemoryOptimizedReadMultiSample(spikeBufferLength, auxAnCallback,null, auxAnData);
                    if (Properties.Settings.Default.useAuxDigitalInput)
                        auxDigReader.BeginReadMultiSamplePortUInt32(spikeBufferLength, auxDigCallback, auxDigReader);
                    if (Properties.Settings.Default.SeparateLFPBoard && Properties.Settings.Default.UseLFPs)
                        lfpReader.BeginReadInt16(lfpBufferLength, lfpCallback, lfpReader);
                    if (Properties.Settings.Default.UseEEG)
                        eegReader.BeginReadInt16(eegBufferLength, eegCallback, eegReader);
                    for (int i = 0; i < spikeReader.Count; ++i)
                        spikeReader[i].BeginMemoryOptimizedReadWaveform(spikeBufferLength, spikeCallback, i,
                            spikeData[i]);

                    //Set start time
                    experimentStartTime = DateTime.Now;
                    double sec2add = 60 * Convert.ToDouble(numericUpDown_timedRecordingDuration.Value) + Convert.ToDouble(numericUpDown_timedRecordingDurationSeconds.Value);
                    timedRecordingStopTime = DateTime.Now.AddSeconds(sec2add);
                    timer_timeElapsed.Enabled = true;

                    if (checkBox_video.Checked)
                    {
                        triggerTask.WaitUntilDone();
                        triggerTask.Dispose();
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }

            }
        }
Example #4
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");
        }
Example #5
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");
        }