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); }
/// <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); } } }
//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"); }
//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"); }