public override enExperimentStatus Run() { curves = new List <Curve>(); experimentData = new Generic2DExperimentData(); experimentData.experimentName = "Fast Amperometry"; //experimentData.axisNames = new string[] {"Potential", "Current", "WE2 Potential", "WE2 Current" }; //experimentData.axisUnits = new string[] {"V", "A", "V", "A" }; //Add events hw.BeginReceiveCurve += HW_BeginReceiveCurve; hw.EndMeasurement += HW_EndMeasurement; resultCurves = new List <Curve>(); string errors = hw.Measure(fastAmpo); if (!String.IsNullOrEmpty(errors)) { log.Add("PS_PalmSens - Error: " + errors); return(enExperimentStatus.Error); } status = enExperimentStatus.Running; return(status); }
public override enExperimentStatus Configure(IExperiment parent, string resultsFilePath) { FBC = new FeedbackController(log); FBC.Settings = Settings.FeedbackController; FBC.FBPositionUpdated += FBC_FBPositionUpdated; if (!FBC.Initialize().HasFlag(enuFeedbackStatusFlags.Ready)) { return(enExperimentStatus.Error); } this.parent = parent; ResultsFilePath = resultsFilePath; string cords = ""; ExperimentContainer container = parent as ExperimentContainer; this.parent = parent; if (container != null) { cords = container.ChildIndexer(); if (cords != "") { cords = " " + cords; } } ResultsFileName = "AutoapproachExperiment - " + Name + cords + ".dat"; TransducerChannel signalChan = FBC.Settings.TransducerChannels[FBC.Settings.Channel]; string headerString = "Experiment: AutoapproachExperiment - " + Name + "\r\n"; string unit = (signalChan.Prefix == enuPrefix.none) ? signalChan.Unit : signalChan.Prefix + signalChan.Unit; string[] dataColumnHeaders = new string[] { "Z-Position [µm]", signalChan.Name + " [" + unit + "]" }; headerString += "Positioner: " + FBC.Settings.Positioner + "\r\n"; headerString += "Sensor: " + FBC.Settings.Channel + "\r\n"; writeHeader(headerString, dataColumnHeaders.ToArray(), settingsObj: Settings, positionColumns: false, timeColumn: true); // Init ResultData experimentData = new Generic2DExperimentData(); experimentData.axisNames.Add(new string[] { "Z-Position", signalChan.Name }); experimentData.axisUnits.Add(new string[] { "µm", unit }); experimentData.data.Add(new double[2][]); signalData = new List <double>(128); positionData = new List <double>(128); experimentData.datasetNames.Add("Autoapproach"); experimentData_PA = new Generic2DExperimentData(); experimentData_PA.axisNames.Add(new string[] { "Time", signalChan.Name }); experimentData_PA.axisUnits.Add(new string[] { "s", unit }); experimentData_PA.data.Add(new double[2][]); signalData_PA = new List <double>(128); timeData_PA = new List <double>(128); experimentData_PA.datasetNames.Add("Post approach"); status = enExperimentStatus.Idle; return(status); }
public override enExperimentStatus Run() { experimentData = new Generic2DExperimentData(); experimentData.experimentName = "Impedance Spectroscopy"; experimentData.axisNames.Add(new string[] { "Z'", "Z''" }); experimentData.axisNames.Add(new string[] { "Z'", "Z''" }); experimentData.axisUnits.Add(new string[] { "Ω", "Ω" }); experimentData.axisUnits.Add(new string[] { "Ω", "Ω" }); //Add events hw.EndMeasurement += HW_EndMeasurement; hw.BeginReceiveEISData += HW_BeginReceiveEISData; resultEISData = new List <EISData>(); string errors = hw.Measure(imp); if (!String.IsNullOrEmpty(errors)) { log.Add("PS_PalmSens: " + errors, "Error"); NotifyExperimentEndedNow(new ExperimentEndedEventArgs(enExperimentStatus.Error, null)); return(enExperimentStatus.Error); } status = enExperimentStatus.Running; return(status); }
public override enExperimentStatus Run() { experimentData = new Generic2DExperimentData(); experimentData.experimentName = "Chronoamperometry"; //Add events hw.BeginReceiveCurve += HW_BeginReceiveCurve; hw.EndMeasurement += HW_EndMeasurement; resultCurves = new List <Curve>(); string errors = hw.Measure(ampoD); if (!String.IsNullOrEmpty(errors)) { log.Add("PS_PalmSens - Error: " + errors); return(enExperimentStatus.Error); } status = enExperimentStatus.Running; return(status); }
private void ParallelChildExperimentRunner() { childExperimentsCompleted = new TaskCompletionSource <bool> [this.Count]; int i = 0; enExperimentStatus expStatus = enExperimentStatus.OK; foreach (IExperiment exp in this) { childExperimentsCompleted[i] = new TaskCompletionSource <bool>(); log.Add("Configuring " + ((ParametrizableObject)exp).Name + "..."); expStatus = exp.Configure(this, Path.Combine(ResultsFilePath, (exp as ParametrizableObject).Name)); if ((expStatus != enExperimentStatus.OK) && (expStatus != enExperimentStatus.Idle)) { log.Warning("Experiment Sequence Aborted due to exp.Configure() returning: " + expStatus); status = enExperimentStatus.Error; return; } exp.NotifyExperimentDataUpdated -= Child_ParallelExperimentDataUpdated; exp.NotifyExperimentDataUpdated += Child_ParallelExperimentDataUpdated; exp.NotifyExperimentEnded -= Child_ParallelExperimentEnded; exp.NotifyExperimentEnded += Child_ParallelExperimentEnded; i++; } experimentData = new Generic2DExperimentData(); experimentData.experimentName = "Linear Sweep Voltammetry"; firstExperimentData = false; // fill Experiment Data with dummies for (i = 0; i < this.Count; i++) { // Add a dummy experimentData.datasetNames.Add(""); experimentData.axisNames.Add(new string[] { "", "" }); experimentData.axisUnits.Add(new string[] { "", "" }); experimentData.data.Add(new double[2][] { new double[] { double.NaN }, new double[] { double.NaN } }); } i = 0; foreach (IExperiment exp in this) { enExperimentStatus childStatus = exp.Run(); if ((childStatus != enExperimentStatus.OK) && (childStatus != enExperimentStatus.Running)) { expStatus = enExperimentStatus.Error; } } if (expStatus == enExperimentStatus.Error) { foreach (IExperiment exp in this) { exp.NotifyExperimentDataUpdated -= Child_ParallelExperimentDataUpdated; exp.NotifyExperimentEnded -= Child_ParallelExperimentEnded; exp.Abort(); } log.Warning("Parallel experiment execution error during exp.Run() - all experiments aborted"); status = enExperimentStatus.Error; return; } Task.WaitAll(childExperimentsCompleted.Select(x => x.Task).ToArray()); // Check if all Children completed normaly (Task.Result == true) if (childExperimentsCompleted.Count(x => x.Task.Result == true) == this.Count) { status = enExperimentStatus.Completed; } childExperimentsCompleted = null; }
private void ExecuteTimeTraceMeasurement() { double samplingRate = Settings.SamplingRate; long samplingDelayMS = (long)Math.Floor((1 / Settings.SamplingRate) * 1000); double duration = Settings.Duration; data = new Generic2DExperimentData(); foreach (TransducerChannel channel in activeChannels) { data.datasetNames.Add(transducerChannels.FirstOrDefault(x => x.Value == channel).Key); data.axisNames.Add(new string[] { "Time", channel.Name }); data.axisUnits.Add(new string[] { "ms", (channel.Prefix == enuPrefix.none) ? channel.Unit : channel.Prefix + channel.Unit }); double[][] dataBuffer = new double[2][] { new double[BUFFER_LENGTH], new double[BUFFER_LENGTH] }; // initialize the arrays for (int i = 0; i < BUFFER_LENGTH; i++) { dataBuffer[0][i] = double.NaN; dataBuffer[1][i] = double.NaN; } data.data.Add(dataBuffer); } Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); long lastLoopTime = stopWatch.ElapsedMilliseconds; long lastDataUdate = lastLoopTime - 1000; bool bFirstData = true; int currentBufferIdx = 0; while ((lastLoopTime < (duration * 1000)) && (!abortExperiment)) { ExecuteSingleValueMeasurement(stopWatch.ElapsedMilliseconds, ref currentBufferIdx); // Check if we need to send a data update if ((stopWatch.ElapsedMilliseconds > (lastDataUdate + 250)) || (currentBufferIdx == 1)) { NotifyExperimentDataUpdatedNow(new ExperimentDataEventArgs(data, !bFirstData)); lastDataUdate = stopWatch.ElapsedMilliseconds; bFirstData = false; } // calculate required delay long targetDelay = (lastLoopTime + samplingDelayMS) - stopWatch.ElapsedMilliseconds; // sleep everything > 15 ms if (targetDelay > 15) { Thread.Sleep((int)(targetDelay - 15)); } // now idle around until the time is elapsed for acurate timing while (stopWatch.ElapsedMilliseconds < (lastLoopTime + samplingDelayMS)) { Thread.SpinWait(1); } if (targetDelay > 0) { // there was some time to burn up so we calculate lastLoopTime += samplingDelayMS; } else { // runnning as fast as we can, this is just for reference lastLoopTime = stopWatch.ElapsedMilliseconds; } } status = enExperimentStatus.Idle; NotifyExperimentEndedNow(new ExperimentEndedEventArgs(enExperimentStatus.Completed, data)); }