Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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;
        }
Esempio n. 6
0
        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));
        }