/// <summary>
        /// 删除测试数据
        /// </summary>
        public void DeleteTableItem()
        {
            lock (lockObject)
            {
                if (IsMeasuring)
                {
                    return;
                }
            }

            if (TalbleIndex < 0)
            {
                return;
            }

            VoltageTable.RemoveAt(TalbleIndex);

            SystemParamManager.SystemParam.InputOutputMeasureParams.VoltageTable = new ObservableCollection <VoltageTable>(VoltageTable);
            SystemParamManager.SaveParams();
        }
        /// <summary>
        /// 插入测试数据
        /// </summary>
        public void InsertTableItem()
        {
            lock (lockObject)
            {
                if (IsMeasuring)
                {
                    return;
                }
            }

            if (TalbleIndex < 0)
            {
                return;
            }

            VoltageTable.Insert(TalbleIndex, new AnalogSignalAnalysisWpf.VoltageTable());

            SystemParamManager.SystemParam.InputOutputMeasureParams.VoltageTable = new ObservableCollection <VoltageTable>(VoltageTable);
            SystemParamManager.SaveParams();
        }
        /// <summary>
        /// 启动
        /// </summary>
        public void Start()
        {
            lock (lockObject)
            {
                if (IsMeasuring)
                {
                    return;
                }
            }

            if ((TestDatas == null) || (TestDatas.Count == 0))
            {
                RunningStatus = "运行数据无效";
                return;
            }

            if (!IsHardwareValid)
            {
                RunningStatus = "硬件无效";
                return;
            }

            RunningStatus = "运行中";

            SystemParamManager.SystemParam.FrequencyMeasureParams.TestDatas = TestDatas;
            SystemParamManager.SaveParams();

            //复位示波器设置
            Scope.Disconnect();
            Scope.Connect();
            Scope.CHAScale      = SystemParamManager.SystemParam.GlobalParam.Scale;
            Scope.SampleRate    = SystemParamManager.SystemParam.GlobalParam.SampleRate;
            Scope.CHAVoltageDIV = SystemParamManager.SystemParam.GlobalParam.VoltageDIV;

            PLC.PWMSwitch  = true;
            PLC.FlowSwitch = false;
            Thread.Sleep(SystemParamManager.SystemParam.GlobalParam.PowerCommonDelay);
            MeasurementInfos = new ObservableCollection <FrequencyMeasurementInfo>();

            OnMeasurementStarted();

            measureThread = new Thread(() =>
            {
                lock (lockObject)
                {
                    IsMeasuring = true;
                }

                MaxFrequency      = -1;
                int lastFrequency = -1;

                //设置频率
                PWM.Frequency = 0;
                PWM.DutyRatio = DutyRatio;

                //使能Power输出
                Power.Voltage        = OutputVoltage;
                Power.IsEnableOutput = true;

                foreach (var item in TestDatas)
                {
                    //设置PWM频率
                    PWM.Frequency = item.Frequency;
                    Thread.Sleep(SystemParamManager.SystemParam.GlobalParam.PowerCommonDelay);

                    //设置Scope采集时长
                    Scope.SampleTime = item.SampleTime;

                    //读取Scope数据
                    double[] originalData;
                    Scope.ReadDataBlock(0, out originalData);

                    if ((originalData == null) || (originalData.Length == 0))
                    {
                        //测试失败
                        OnMessageRaised(MessageLevel.Warning, $"F: ReadDataBlock Fail");
                        OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(false));
                        return;
                    }

                    //数据滤波
                    double[] filterData;
                    Analysis.MeanFilter(originalData, VoltageFilterCount, out filterData);

                    //电压转气压
                    double[] pressureData = filterData.ToList().ConvertAll(x => VoltageToPressure(x)).ToArray();

                    //阈值查找边沿
                    List <int> edgeIndexs;
                    DigitEdgeType digitEdgeType;
                    Analysis.FindEdgeByThreshold(pressureData, MinPressure, MaxPressure, out edgeIndexs, out digitEdgeType);

                    //显示波形
                    ShowEdgeData(pressureData, edgeIndexs, digitEdgeType);

                    //分析脉冲数据
                    List <double> pulseFrequencies;
                    List <double> dutyRatios;
                    Analysis.AnalysePulseData(edgeIndexs, digitEdgeType, (int)Scope.SampleRate, out pulseFrequencies, out dutyRatios);

                    //显示分析结果
                    CurrentInputFrequency = item.Frequency;
                    CurrentSampleTime     = item.SampleTime;

                    //显示测量信息
                    ShowMeasureInfos(CurrentInputFrequency, CurrentSampleTime, pulseFrequencies, ScopeCHACollection, ScopeCHAEdgeCollection);

                    if (pulseFrequencies.Count > 0)
                    {
                        //检测脉冲是否异常
                        double minFrequency = item.Frequency * (1 - FrequencyErrLimit);
                        double maxFrequency = item.Frequency * (1 + FrequencyErrLimit);
                        if (!Analysis.CheckFrequency(pulseFrequencies, minFrequency, maxFrequency, 0))
                        {
                            if (lastFrequency != -1)
                            {
                                //测试完成
                                OnMessageRaised(MessageLevel.Message, $"F: Success, max = {lastFrequency}");
                                OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(true, lastFrequency));
                            }
                            else
                            {
                                //测试失败
                                OnMessageRaised(MessageLevel.Warning, $"F: Fail");
                                OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(false));
                            }
                            return;
                        }
                        else
                        {
                            lastFrequency = item.Frequency;
                        }
                    }
                    else
                    {
                        if (lastFrequency != -1)
                        {
                            //测试完成
                            OnMessageRaised(MessageLevel.Message, $"F: Success, max = {lastFrequency}");
                            OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(true, lastFrequency));
                        }
                        else
                        {
                            //测试失败
                            OnMessageRaised(MessageLevel.Warning, $"F: Fail");
                            OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(false));
                        }
                        return;
                    }
                }

                if (lastFrequency != -1)
                {
                    //测试完成
                    OnMessageRaised(MessageLevel.Message, $"F: Success, max = {lastFrequency}");
                    OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(true, lastFrequency));
                }
                else
                {
                    //测试失败
                    OnMessageRaised(MessageLevel.Warning, $"F: Fail");
                    OnMeasurementCompleted(new FrequencyMeasurementCompletedEventArgs(false));
                }
            });

            measureThread.Start();
        }
 /// <summary>
 /// 保存测试数据
 /// </summary>
 public void SaveTestDatas()
 {
     SystemParamManager.SystemParam.FrequencyMeasureParams.TestDatas = TestDatas;
     SystemParamManager.SaveParams();
 }
 /// <summary>
 /// 保存测试数据
 /// </summary>
 public void SaveTable()
 {
     SystemParamManager.SystemParam.InputOutputMeasureParams.VoltageTable = new ObservableCollection <VoltageTable>(VoltageTable);
     SystemParamManager.SaveParams();
 }