/// <summary> /// Get the task for the data aquisition /// </summary> /// <param name="settings"></param> /// <param name="worker"></param> /// <param name="e"></param> /// <returns></returns> private Task GetMultipleChannelsTriggeredTask(SBJControllerSettings settings, string taskName, RunDirection runDirection, AnalogEdgeReferenceTriggerSlope triggerSlope, double triggerVoltage, BackgroundWorker worker, DoWorkEventArgs e) { AnalogEdgeReferenceTriggerSlope localTriggerSlope; double localTriggerVoltage; // // Determine the trigger slope direction and voltage according to sign of the measured signal. // if (triggerSlope > 0) { localTriggerSlope = triggerSlope; localTriggerVoltage = triggerVoltage; } else { // // Reach to contact in order to retrieve the signal. // if (settings.ElectromagnetSettings.IsEMEnable) { EMTryObtainShortCircuit(settings.ElectromagnetSettings.EMShortCircuitDelayTime, settings.GeneralSettings.ShortCircuitVoltage, worker, e); } else { TryObtainShortCircuit(settings.GeneralSettings.ShortCircuitVoltage, settings.GeneralSettings.UseShortCircuitDelayTime, settings.GeneralSettings.ShortCircuitDelayTime, worker, e); } // // Determines the direction of the current - // Either positive (then voltage is negative) or negative (then voltage is positive number) // bool isPositiveVoltage = AnalogIn(0) > 0; // // Trigger's slope depends both on voltage sign and also on the direction of measurement - break or make junction. // if (isPositiveVoltage) { localTriggerSlope = (runDirection == RunDirection.Break) ? AnalogEdgeReferenceTriggerSlope.Falling : AnalogEdgeReferenceTriggerSlope.Rising; } else { localTriggerSlope = (runDirection == RunDirection.Break) ? AnalogEdgeReferenceTriggerSlope.Rising : AnalogEdgeReferenceTriggerSlope.Falling; } localTriggerVoltage = isPositiveVoltage ? settings.GeneralSettings.TriggerVoltage * (-1) : settings.GeneralSettings.TriggerVoltage; // // Before re-openning the junction set auto range off // so we can stay at high range suitable to E5 gain. // if (settings.GeneralSettings.UseKeithley) { m_sourceMeter.SetAutoRange(false); } // // Open the junction once again as if we didn't do anything. // if (settings.ElectromagnetSettings.IsEMEnable) { EMTryObtainOpenCircuit(settings.ElectromagnetSettings.EMShortCircuitDelayTime, settings.GeneralSettings.OpenCircuitVoltage, worker, e); } else { TryObtainOpenCircuit(settings.GeneralSettings.OpenCircuitVoltage, worker, e); } } // // Create the task with its propertites // TriggeredTaskProperties taskProperties = new TriggeredTaskProperties(taskName, settings.ChannelsSettings.ActiveChannels, settings.GeneralSettings.SampleRate, settings.GeneralSettings.TotalSamples, localTriggerVoltage, settings.GeneralSettings.PretriggerSamples, localTriggerSlope); return m_daqController.CreateMultipleChannelsTriggeredTask(taskProperties); }
public TriggeredTaskProperties(string taskName, IList<IDataChannel> activeChannels, double sampleRate, int samplesPerChannel, double triggerLevel, long preTriggerSamples, AnalogEdgeReferenceTriggerSlope triggerSlope) : base(sampleRate, samplesPerChannel, activeChannels, taskName) { TriggerLevel = triggerLevel; PreTriggerSamples = preTriggerSamples; TriggerSlope = triggerSlope; }
/// <summary> /// Reach to position specified by conductance value and then stop and aqcuire data until asked to stop. /// </summary> /// <param name="settings"></param> /// <param name="worker"></param> /// <param name="e"></param> /// <returns></returns> private bool ReachToPositionByMovingUp(SBJControllerSettings settings, BackgroundWorker worker, DoWorkEventArgs e) { double[,] dataAcquired = new double[1000, 1000]; int finalFileNumber = settings.GeneralSettings.CurrentFileNumber; List<IDataChannel> physicalChannels = new List<IDataChannel>(); for (int i = 0; i < settings.GeneralSettings.TotalNumberOfCycles; i++) { // // Cancel the operatin if user asked for // if (worker.CancellationPending == true) { e.Cancel = true; break; } // // This flag is used to signal us when the user asked to stop the real time data acquisition // m_quitRealTimeOperation = false; m_activeTriggeredTask = GetMultipleChannelsTriggeredTask(settings, null, RunDirection.Break, m_triggerSlope, m_triggerVoltage, worker, e); m_activeTriggeredTask.EveryNSamplesReadEventInterval = settings.GeneralSettings.TotalSamples; m_activeTriggeredTask.Done += new TaskDoneEventHandler(OnTaskDoneOpenning); m_activeTriggeredTask.Control(TaskAction.Verify); m_triggerSlope = m_activeTriggeredTask.Triggers.ReferenceTrigger.AnalogEdge.Slope; m_triggerVoltage = m_activeTriggeredTask.Triggers.ReferenceTrigger.AnalogEdge.Level; // // physical channel will include both simple and complex channels. // physicalChannels = GetChannelsForDisplay(settings.ChannelsSettings.ActiveChannels); // // Assign the aquired data for each channel. // First clear all data from previous interation. // ClearRawData(settings.ChannelsSettings.ActiveChannels); // // Create the tasks: One for triggering us to stop and the other for start monitoring the data // m_realTimeTask = GetContinuousAITask(settings.GeneralSettings.SampleRate, settings.ChannelsSettings.ActiveChannels, null); AnalogMultiChannelReader realTimeReader = new AnalogMultiChannelReader(m_realTimeTask.Stream); // // Start closing the junction. // If EM is enabled use the EM. // if (settings.ElectromagnetSettings.IsEMEnable) { EMTryObtainShortCircuit(settings.ElectromagnetSettings.EMShortCircuitDelayTime, settings.GeneralSettings.ShortCircuitVoltage, worker, e); } else { TryObtainShortCircuit(settings.GeneralSettings.ShortCircuitVoltage, settings.GeneralSettings.UseShortCircuitDelayTime,settings.GeneralSettings.ShortCircuitDelayTime, worker, e); } // // Start openning the junction. ASync operation. // If EM is enabled use the EM. // if (settings.ElectromagnetSettings.IsEMEnable) { EMBeginOpenJunction(settings, worker, e); } else { BeginOpenJunction(settings, worker, e); } // // Cancel the operatin if user asked for // if (worker.CancellationPending == true) { e.Cancel = true; break; } // // Start the triggered task. // m_activeTriggeredTask.Start(); // // If the user asked to stop the operation on the external thread then // WaitUntilDone will throw an expection. We can ignore that and return. // try { m_activeTriggeredTask.WaitUntilDone(); } catch (DaqException) { // // We got here if the user asked to stop the operation // break; } // // We reach this point only after we reached the desired conductance value. // As long as the user didn't ask to stop the operation continue recording the data. // while (!m_quitRealTimeOperation) { // // Read operation implicity start the task without the need to call Start() method. // try { dataAcquired = realTimeReader.ReadMultiSample(-1); } catch (DaqException) { continue; } if (dataAcquired.Length == 0) { continue; } // // Assign the aquired data for each channel. // AssignRawDataToChannels(settings.ChannelsSettings.ActiveChannels, dataAcquired); // // calculate the physical data for each channel // GetPhysicalData(physicalChannels); // // Signal UI we have the data // if (DataAquired != null) { DataAquired(this, new DataAquiredEventArgs(physicalChannels, finalFileNumber)); } } if (DoneReadingData != null) { DoneReadingData(this, null); } m_realTimeTask.Stop(); m_realTimeTask.Dispose(); // // Increase file number by one // Save data if needed // finalFileNumber++; if (settings.GeneralSettings.IsFileSavingRequired) { finalFileNumber = SaveData(settings.GeneralSettings.Path, settings.ChannelsSettings.ActiveChannels, physicalChannels, finalFileNumber); } } m_activeTriggeredTask.Dispose(); m_realTimeTask.Dispose(); m_triggerSlope = 0; m_triggerVoltage = 0; return e.Cancel; }