Newer
Older
Correlator / Correlator / ViewModels / MainWindowViewModel.cs
using System;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Threading;
using Correlator.DataService;
using Correlator.Events;
using Correlator.Model;
using Correlator.SensorHubTag;
using Correlator.Util;
using Correlator.Views;
using HandyControl.Controls;
using MathWorks.MATLAB.NET.Arrays;
using Newtonsoft.Json;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using ComboBox = System.Windows.Controls.ComboBox;

namespace Correlator.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        #region 变量

        private readonly DispatcherTimer _checkSerialPortTimer = new DispatcherTimer
        {
            Interval = new TimeSpan(0, 0, 7)
        };

        private readonly DispatcherTimer _timer = new DispatcherTimer
        {
            Interval = TimeSpan.FromSeconds(1)
        };

        private readonly DispatcherTimer _batteryTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromMinutes(5)
        };

        //计算时间
        private int _runningSeconds;

        //运行时间Timer
        private readonly DispatcherTimer _runningTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromSeconds(1)
        };

        private bool _isResetParam;

        private readonly IEventAggregator _eventAggregator;
        private readonly IApplicationDataService _soundSpeedDataService;
        private readonly IDialogService _dialogService;
        private readonly ISerialPortService _serialPortService;

        //加速度计下发指令Timer
        private readonly DispatcherTimer _accelerometerCommandTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromSeconds(10)
        };

        private MainWindow _mainWindow;
        private byte _devId = 0x02;
        private string _locateDataDir;
        private int _locateTimes;
        private string _snapShotPath = string.Empty;
        private ParamConfigModel _paramConfig;

        //自动截屏倒计时
        private readonly DispatcherTimer _snapShotTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromSeconds(3)
        };

        //Matlab算法
        private static readonly Lazy<CorrelatorSingle.Correlator> LazyCorrelator =
            new Lazy<CorrelatorSingle.Correlator>(() => new CorrelatorSingle.Correlator());

        #endregion

        #region VM属性

        private string _currentTime;

        public string CurrentTime
        {
            get => _currentTime;
            private set
            {
                _currentTime = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 红色发射机信号强度0-5
        /// </summary>
        private int _redTransmitterSignal;

        public int RedTransmitterSignal
        {
            get => _redTransmitterSignal;
            private set
            {
                _redTransmitterSignal = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 蓝色发射机信号强度0-5
        /// </summary>
        private int _blueTransmitterSignal;

        public int BlueTransmitterSignal
        {
            get => _blueTransmitterSignal;
            private set
            {
                _blueTransmitterSignal = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 绑定干扰频段值
        /// </summary>
        private string _interferenceFrequency = "无";

        public string InterferenceFrequency
        {
            get => _interferenceFrequency;
            private set
            {
                _interferenceFrequency = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 绑定过信噪比
        /// </summary>
        private string _snr = "无";

        public string Snr
        {
            get => _snr;
            private set
            {
                _snr = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 绑定过滤器值
        /// </summary>
        private string _filterValue = " ~ Hz";

        public string FilterValue
        {
            get => _filterValue;
            private set
            {
                _filterValue = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 绑定声速值
        /// </summary>
        private string _soundSpeed = "0";

        public string SoundSpeed
        {
            get => _soundSpeed;
            private set
            {
                _soundSpeed = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 红色发射机是否故障
        /// </summary>
        private bool _redTransmitterState;

        public bool RedTransmitterState
        {
            get => _redTransmitterState;
            set
            {
                _redTransmitterState = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 蓝色发射机是否故障
        /// </summary>
        private bool _blueTransmitterState;

        public bool BlueTransmitterState
        {
            get => _blueTransmitterState;
            private set
            {
                _blueTransmitterState = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 红色发射机距离 
        /// </summary>
        private double _redTransmitterDistance;

        public double RedTransmitterDistance
        {
            get => _redTransmitterDistance;
            private set
            {
                _redTransmitterDistance = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 蓝色发射机距离
        /// </summary>
        private double _blueTransmitterDistance;

        public double BlueTransmitterDistance
        {
            get => _blueTransmitterDistance;
            private set
            {
                _blueTransmitterDistance = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 红色发射机电量 0-100
        /// </summary>
        private int _redTransmitterBattery;

        public int RedTransmitterBattery
        {
            get => _redTransmitterBattery;
            set
            {
                _redTransmitterBattery = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 蓝色发射机电量 0-100
        /// </summary>
        private int _blueTransmitterBattery;

        public int BlueTransmitterBattery
        {
            get => _blueTransmitterBattery;
            set
            {
                _blueTransmitterBattery = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 电脑电量 0-100
        /// </summary>
        private int _computerBattery;

        public int ComputerBattery
        {
            get => _computerBattery;
            set
            {
                _computerBattery = value;
                RaisePropertyChanged();
            }
        }

        /// <summary>
        /// 绑定经过了值
        /// </summary>
        private string _elapseTime = "0";

        public string ElapseTime
        {
            get => _elapseTime;
            private set
            {
                _elapseTime = value;
                RaisePropertyChanged();
            }
        }

        private string _connectColorBrush = "LightGray";

        public string ConnectColorBrush
        {
            get => _connectColorBrush;
            private set
            {
                _connectColorBrush = value;
                RaisePropertyChanged();
            }
        }

        private ObservableCollection<string> _pipeMaterialsArray;

        public ObservableCollection<string> PipeMaterialsArray
        {
            get => _pipeMaterialsArray;
            set
            {
                _pipeMaterialsArray = value;
                RaisePropertyChanged();
            }
        }

        private string _materialName = string.Empty;

        public string MaterialName
        {
            get => _materialName;
            set
            {
                _materialName = value;
                RaisePropertyChanged();
            }
        }

        private string _pipeDiameter = string.Empty;

        public string PipeDiameter
        {
            get => _pipeDiameter;
            set
            {
                _pipeDiameter = value;
                RaisePropertyChanged();
            }
        }

        private string _pipeLength = string.Empty;

        public string PipeLength
        {
            get => _pipeLength;
            set
            {
                _pipeLength = value;
                RaisePropertyChanged();
            }
        }

        private string _frequencyInterval = "100 ~ 3000Hz";

        public string FrequencyInterval
        {
            get => _frequencyInterval;
            private set
            {
                _frequencyInterval = value;
                RaisePropertyChanged();
            }
        }

        private string _lowFrequency = string.Empty;

        public string LowFrequency
        {
            get => _lowFrequency;
            set
            {
                _lowFrequency = value;
                RaisePropertyChanged();
            }
        }

        private string _highFrequency = string.Empty;

        public string HighFrequency
        {
            get => _highFrequency;
            set
            {
                _highFrequency = value;
                RaisePropertyChanged();
            }
        }

        //是否已开始采集或者计算数据
        private bool _startButtonIsEnabled = true;

        public bool StartButtonEnabled
        {
            get => _startButtonIsEnabled;
            private set
            {
                _startButtonIsEnabled = value;
                RaisePropertyChanged();
            }
        }

        private CorrelatorDataModel _correlatorData = new CorrelatorDataModel();

        public CorrelatorDataModel CorrelatorData
        {
            get => _correlatorData;
            set
            {
                _correlatorData = value;
                RaisePropertyChanged();
            }
        }

        #endregion

        #region PC电量状态

        [DllImport("kernel32.dll", EntryPoint = "GetSystemPowerStatus")]
        private static extern void GetSystemPowerStatus(ref SystemConfig.SystemPowerStatus lpSystemPowerStatus);

        #endregion

        #region DelegateCommand

        public DelegateCommand<MainWindow> WindowLoadedCommand { set; get; }
        public DelegateCommand CloseWindowCommand { private set; get; }
        public DelegateCommand<Popup> OpenFolderCommand { private set; get; }
        public DelegateCommand<Popup> OpenImageFileCommand { private set; get; }
        public DelegateCommand<Popup> OpenAudioFileCommand { private set; get; }
        public DelegateCommand OpenListenAudioCommand { private set; get; }
        public DelegateCommand ShowWaveCommand { private set; get; }
        public DelegateCommand OpenNumericKeypadCommand { private set; get; }
        public DelegateCommand<ComboBox> PipeItemSelectedCommand { set; get; }
        public DelegateCommand DetectNoiseCommand { private set; get; }
        public DelegateCommand<Popup> SettingsCommand { private set; get; }
        public DelegateCommand<Popup> SoundSpeedCommand { private set; get; }
        public DelegateCommand<Popup> ShowApplicationInfoCommand { private set; get; }
        public DelegateCommand ImportDataCommand { private set; get; }
        public DelegateCommand SaveAudioCommand { private set; get; }
        public DelegateCommand ResetParamCommand { private set; get; }
        public DelegateCommand SnapShotCommand { private set; get; }
        public DelegateCommand StartCollectDataCommand { private set; get; }

        #endregion

        public MainWindowViewModel(IEventAggregator eventAggregator, IApplicationDataService dataService,
            IDialogService dialogService, ISerialPortService serialPortService)
        {
            _eventAggregator = eventAggregator;
            _soundSpeedDataService = dataService;
            _dialogService = dialogService;
            _serialPortService = serialPortService;

            RegisterMessage();

            TimerTick();

            _pipeMaterialsArray = new ObservableCollection<string>();
            var pipeMaterials = dataService.GetPipeMaterial();
            foreach (var material in pipeMaterials)
            {
                PipeMaterialsArray.Add(material.ChineseMaterial);
            }

            InitDelegateCommand();
        }

        /// <summary>
        /// 消息监听注册
        /// </summary>
        private void RegisterMessage()
        {
            _eventAggregator.GetEvent<RedSensorEvent>().Subscribe(delegate(DevStatus dev)
            {
                "MainWindowViewModel".WriteLog("Red Sensor收到消息:" + JsonConvert.SerializeObject(dev));

                //新协议不计算实际信号
                RedTransmitterBattery = Convert.ToInt32(dev.Cell);
                RedTransmitterSignal = 5;
                RedTransmitterState = true;
                RuntimeCache.RedSensorIsEnable = true;
            });

            _eventAggregator.GetEvent<BlueSensorEvent>().Subscribe(delegate(DevStatus dev)
            {
                "MainWindowViewModel".WriteLog("Blue Sensor收到消息:" + JsonConvert.SerializeObject(dev));

                //新协议不计算实际信号
                BlueTransmitterBattery = Convert.ToInt32(dev.Cell);
                BlueTransmitterSignal = 5;
                BlueTransmitterState = true;
                RuntimeCache.BlueSensorIsEnable = true;
            });

            //加速度计
            _eventAggregator.GetEvent<StartCalculateEvent>().Subscribe(StartCalculateData);

            //水听器
            _eventAggregator.GetEvent<ShowCheckResponseEvent>().Subscribe(delegate
            {
                _dialogService.Show("CheckResponseDialog", null, delegate(IDialogResult result)
                {
                    if (result.Result == ButtonResult.Cancel)
                    {
                        ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "数据未校验,无法进行计算");
                        return;
                    }

                    if (result.Result == ButtonResult.Abort)
                    {
                        ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "数据校验被终止,无法进行计算");
                        return;
                    }

                    if (result.Result == ButtonResult.OK)
                    {
                        //水听器数据采集完毕,开始计算
                        StartCalculateData();
                    }
                });
            });

            //数字键盘
            _eventAggregator.GetEvent<NumericKeypadEvent>().Subscribe(delegate(NumberStruct number)
            {
                if (number.TextBoxName.Equals(_mainWindow.PipeDiameterTextBox.Name))
                {
                    PipeDiameter = number.NumberValue;
                }
                else if (number.TextBoxName.Equals(_mainWindow.PipeLengthTextBox.Name))
                {
                    PipeLength = number.NumberValue;
                }
                else if (number.TextBoxName.Equals(_mainWindow.LowFrequencyTextBox.Name))
                {
                    LowFrequency = number.NumberValue;
                }
                else if (number.TextBoxName.Equals(_mainWindow.HighFrequencyTextBox.Name))
                {
                    HighFrequency = number.NumberValue;
                }
            });
        }

        private void StartCalculateData()
        {
            DialogHub.Get.ShowLoadingDialog(_mainWindow, "数据计算中,请稍后...");
            //开始计算就不收集收据了且不能点击开始按钮
            StartButtonEnabled = false;
            RuntimeCache.CanCollectData = false;
            if (!RuntimeCache.IsHydrophone)
            {
                //开始计算停止收集指令
                _accelerometerCommandTimer.Stop();
            }

            using (var manager = new DataBaseManager())
            {
                var today = DateTime.Now.ToString("yyyyMMdd");
                var configModel = manager.Table<CorrelatorConfigModel>()
                    .Where(x => x.Date == today)
                    .OrderBy(x => x.Date)
                    .LastOrDefault() ?? new CorrelatorConfigModel
                    { Date = today, Pipe = 1, LocateTimes = 1, ListenTimes = 1 };

                //如果配置里面的日期相同,则取配置里面的Pipe作为index,如果配置里面的日期不相同,则默认index=1
                var pipeIndex = configModel.Date.Equals(today) ? configModel.Pipe : 1;
                _locateDataDir = DirectoryManager.GetLocateDataDir(pipeIndex);
                _locateTimes = configModel.LocateTimes;
                //插入新纪录
                configModel.Pipe++;
                configModel.LocateTimes++;
                manager.Insert(configModel);
            }

            //计算
            new Thread(CalculateData).Start();
        }

        /// <summary>
        /// 算法计算
        /// </summary>
        private void CalculateData()
        {
            var dataModel = RuntimeCache.CorrelatorData;
            if (dataModel.LeftDeviceDataArray != null && dataModel.RightDeviceDataArray != null)
            {
                Console.WriteLine(@"MainWindowViewModel => 开始计算");
                var array = LazyCorrelator.Value.locating(
                    11,
                    (MWNumericArray)dataModel.LeftDeviceDataArray, (MWNumericArray)dataModel.RightDeviceDataArray,
                    RuntimeCache.AudioSampleRate,
                    int.Parse(_pipeLength), int.Parse(_soundSpeed),
                    0, 0,
                    0, 0,
                    _materialName,
                    int.Parse(_pipeDiameter), int.Parse(_pipeDiameter),
                    1, -1,
                    -1, -1,
                    int.Parse(_lowFrequency), int.Parse(_highFrequency)
                );
                Console.WriteLine(@"MainWindowViewModel => 计算结束");

                //数据绑定
                var snr = Convert.ToDouble(array[0].ToString()); //信噪比
                Snr = snr.ToString("0.0") + ":1";
                RedTransmitterDistance = Convert.ToDouble(array[1].ToString()); //距离A
                BlueTransmitterDistance = Convert.ToDouble(array[2].ToString()); //距离B

                var maxFreLowOut = Convert.ToInt32(array[6].ToString()); //低频
                var maxFreHighOut = Convert.ToInt32(array[7].ToString()); //高频

                FilterValue = maxFreLowOut + " ~ " + maxFreHighOut + "Hz";

                //设置噪声值
                CorrelatorData = dataModel;

                _eventAggregator.GetEvent<RenderOscillogramEvent>().Publish(array);

                var time = DateTime.Now.ToString("HHmmss");
                if (RuntimeCache.IsHydrophone)
                {
                    //保存参数
                    var paramConfigFile = $"{_locateDataDir}\\参数配置.{_locateTimes}.{time}.json";
                    File.AppendAllText(paramConfigFile, JsonConvert.SerializeObject(_paramConfig));
                }

                //保存数据
                var fileName = $"{_locateDataDir}\\测试数据.{_locateTimes}.{time}.txt";
                fileName.SaveLocateData(dataModel);
                "MainWindowViewModel".WriteLog("定位数据路径:" + fileName);

                //保存了数据之后3s再截图
                _snapShotPath = $"{_locateDataDir}\\快照.{_locateTimes}.{time}.png";
                _snapShotTimer.Start();

                _runningTimer.Stop();
                StartButtonEnabled = true;
                //清空缓存
                RuntimeCache.RedSensorOriginalResp.Clear();
                RuntimeCache.BlueSensorOriginalResp.Clear();
                RuntimeCache.RedSensorResponseTags.Clear();
                RuntimeCache.BlueSensorResponseTags.Clear();
                RuntimeCache.RedSensorIsEnable = false;
                RuntimeCache.BlueSensorIsEnable = false;

                DialogHub.Get.DismissLoadingDialog();
            }
        }

        /// <summary>
        /// 各种定时器
        /// </summary>
        private void TimerTick()
        {
            _checkSerialPortTimer.Tick += delegate
            {
                var ports = SerialPort.GetPortNames();
                foreach (var portName in ports)
                {
                    if (portName != "COM3" || _serialPortService.Sp.IsOpen) continue;
                    _serialPortService.Sp.PortName = portName; //串口名称
                    _serialPortService.Sp.BaudRate = 230400; //波特率57600和230400
                    _serialPortService.Sp.DataBits = 8; //数据位
                    _serialPortService.Sp.StopBits = (StopBits)1; //停止位
                    _serialPortService.Sp.Open(); //打开串口
                    Console.WriteLine(@"MainWindowViewModel => 打开串口");

                    break;
                }

                if (_serialPortService.Sp.IsOpen)
                {
                    //实时显示信号电量
                    if (!RuntimeCache.RedSensorIsEnable && !RuntimeCache.BlueSensorIsEnable)
                    {
                        _devId = (byte)(_devId == 0x02 ? 0x01 : 0x02);
                        _serialPortService.ShowSignal(_devId);
                    }
                    else
                    {
                        if (!RuntimeCache.RedSensorIsEnable)
                        {
                            _serialPortService.ShowSignal(0x01);
                        }

                        if (!RuntimeCache.BlueSensorIsEnable)
                        {
                            _serialPortService.ShowSignal(0x02);
                        }
                    }
                }
            };
            _checkSerialPortTimer.Start();

            //实时显示时间
            _timer.Tick += RealTime;
            _timer.Start();

            //获取电池电量
            var sysPower = new SystemConfig.SystemPowerStatus();
            GetSystemPowerStatus(ref sysPower);
            ComputerBattery = sysPower.BatteryPercent == 255 ? 100 : sysPower.BatteryPercent;

            _batteryTimer.Tick += delegate
            {
                GetSystemPowerStatus(ref sysPower);
                ComputerBattery = sysPower.BatteryPercent == 255 ? 100 : sysPower.BatteryPercent;
            };
            _batteryTimer.Start();

            //计算时间Timer
            _runningTimer.Tick += delegate
            {
                _runningSeconds++;
                ElapseTime = _runningSeconds.ToString();
            };

            //加速度计下发指令Timer
            _accelerometerCommandTimer.Tick += delegate
            {
                if (RuntimeCache.CanCollectData)
                {
                    RuntimeCache.IsDetectNoise = false;
                    CommandSender.SendCorrelatorWakeUpCmd(_serialPortService.Sp);
                }
            };

            //自动截屏Timer
            _snapShotTimer.Tick += delegate
            {
                _snapShotTimer.Stop();
                if (!string.IsNullOrEmpty(_snapShotPath))
                {
                    _snapShotPath.SnapShot();
                    "MainWindowViewModel".WriteLog("截屏路径:" + _snapShotPath);
                }
            };
        }

        /// <summary>
        /// 事件指令
        /// </summary>
        private void InitDelegateCommand()
        {
            //界面加载完成
            WindowLoadedCommand = new DelegateCommand<MainWindow>(it =>
            {
                _mainWindow = it;
                Console.WriteLine(@"MainWindowViewModel => 加载");
                it.AccelerationRadioButton.Checked += delegate
                {
                    RuntimeCache.IsHydrophone = false;
                    FrequencyInterval = "100 ~ 3000Hz";
                };

                it.HydrophonesRadioButton.Checked += delegate
                {
                    RuntimeCache.IsHydrophone = true;
                    FrequencyInterval = "10 ~ 300Hz";
                };
            });

            //退出应用
            CloseWindowCommand = new DelegateCommand(delegate
            {
                _dialogService.ShowDialog(
                    "AlertControlDialog",
                    new DialogParameters
                    {
                        { "AlertType", AlertType.Question }, { "Title", "温馨提示" }, { "Message", "是否确定退出应用?" }
                    },
                    delegate(IDialogResult dialogResult)
                    {
                        if (dialogResult.Result == ButtonResult.Cancel)
                        {
                            return;
                        }

                        //删除小于50K的音频
                        foreach (var file in RuntimeCache.SmallAudioFiles)
                        {
                            File.Delete(file);
                        }

                        RuntimeCache.SmallAudioFiles.Clear();
                        _mainWindow.Close();
                    }
                );
            });

            //打开图片、音频菜单
            OpenFolderCommand = new DelegateCommand<Popup>(delegate(Popup popup) { popup.IsOpen = true; });

            //查看图片列表
            OpenImageFileCommand = new DelegateCommand<Popup>(delegate(Popup popup)
            {
                _dialogService.Show("PictureFileView", null, delegate { });
                popup.IsOpen = false;
            });

            //查看音频列表
            OpenAudioFileCommand = new DelegateCommand<Popup>(delegate(Popup popup)
            {
                _dialogService.Show("AudioFileView", null, delegate { });
                popup.IsOpen = false;
            });

            //打开听音
            OpenListenAudioCommand = new DelegateCommand(delegate
            {
                if (!_serialPortService.Sp.IsOpen)
                {
                    ShowAlertMessageDialog(AlertType.Error, "操作错误", "串口状态异常,无法打开听音功能");
                    return;
                }

                _dialogService.Show("SimplyAuditionDialog", null, delegate { });
            });

            //噪声探测
            DetectNoiseCommand = new DelegateCommand(delegate
            {
                if (!_serialPortService.Sp.IsOpen)
                {
                    ShowAlertMessageDialog(AlertType.Error, "操作错误", "串口状态异常,无法打开探测功能");
                    return;
                }

                _dialogService.Show("DetectNoiseDialog", null, delegate { });
            });

            //设置
            SettingsCommand = new DelegateCommand<Popup>(delegate(Popup popup) { popup.IsOpen = true; });

            //声速
            SoundSpeedCommand = new DelegateCommand<Popup>(delegate(Popup popup)
            {
                if (string.IsNullOrEmpty(_materialName))
                {
                    ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "请选择管道材料");
                    return;
                }

                _dialogService.Show("SoundSpeedDialog", new DialogParameters
                    {
                        { "MaterialName", _materialName }
                    },
                    delegate { }
                );
                popup.IsOpen = false;
            });

            //查看软件、协议版本
            ShowApplicationInfoCommand = new DelegateCommand<Popup>(delegate(Popup popup)
            {
                _dialogService.Show("ApplicationInfoDialog", null, delegate { });
                popup.IsOpen = false;
            });

            //导入数据
            ImportDataCommand = new DelegateCommand(delegate
            {
                if (RuntimeCache.IsHydrophone)
                {
                    _dialogService.Show("ImportResponseDialog", null, delegate(IDialogResult result)
                    {
                        if (result.Result == ButtonResult.Cancel)
                        {
                            ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "用户取消导入数据");
                            return;
                        }

                        if (result.Result == ButtonResult.OK)
                        {
                            var configModel = result.Parameters.GetValue<ParamConfigModel>("ParamConfigModel");

                            MaterialName = configModel.PipeMaterial;
                            PipeDiameter = configModel.PipeDiameter;
                            PipeLength = configModel.PipeLength;
                            LowFrequency = configModel.MinFrequency;
                            HighFrequency = configModel.MaxFrequency;

                            //计算声速
                            var soundVelocity = _soundSpeedDataService.GetSoundVelocity(
                                _materialName, Convert.ToInt32(_pipeDiameter)
                            );
                            SoundSpeed = soundVelocity.ToString();
                        }

                        //导入数据完成,可以计算数据
                        StartCalculateData();
                    });
                }
                else
                {
                    ShowAlertMessageDialog(AlertType.Error, "操作错误", "仅支持水听器模式导入数据");
                }
            });

            //打开Matlab波形
            ShowWaveCommand = new DelegateCommand(delegate
            {
                if (RuntimeCache.CorrelatorData == null)
                {
                    ShowAlertMessageDialog(AlertType.Error, "温馨提示", "请先采集数据");
                    return;
                }

                _dialogService.ShowDialog("NoiseWaveView", null, delegate { });
            });

            //打开数字键盘
            OpenNumericKeypadCommand = new DelegateCommand(delegate
            {
                _dialogService.ShowDialog("NumericKeypadDialog", null, delegate { });
            });

            //管道材料选择
            PipeItemSelectedCommand = new DelegateCommand<ComboBox>(delegate(ComboBox box)
            {
                MaterialName = box.SelectedItem.ToString();
            });

            //将采集的数据转为音频并保存
            SaveAudioCommand = new DelegateCommand(delegate
            {
                if (RuntimeCache.CorrelatorData != null)
                {
                    var filePath = $"{DirectoryManager.GetAudioDir()}\\音频_{DateTime.Now:yyyyMMdd_HHmmss}.wav";
                    filePath.SaveWavFile(
                        RuntimeCache.CorrelatorData.LeftDeviceDataArray,
                        RuntimeCache.CorrelatorData.RightDeviceDataArray
                    );

                    Growl.Success("音频已保存");
                    //清空上次的缓存
                    RuntimeCache.CorrelatorData = null;
                }
                else
                {
                    ShowAlertMessageDialog(AlertType.Error, "操作错误", "还未开始采集数据,无法保存音频");
                }
            });

            //复位
            ResetParamCommand = new DelegateCommand(delegate
            {
                _isResetParam = true;
                ResetParam();
            });

            //截屏
            SnapShotCommand = new DelegateCommand(delegate
            {
                var filePath = $"{DirectoryManager.GetPictureDir()}\\快照_{DateTime.Now:yyyyMMddHHmmss}.png";
                filePath.SnapShot();
            });

            //开始采集数据
            StartCollectDataCommand = new DelegateCommand(delegate
            {
                if (!_serialPortService.Sp.IsOpen)
                {
                    ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "串口状态异常,无法操作");
                    return;
                }

                if (CheckParamLegitimacy())
                {
                    _isResetParam = false;

                    //每次计算之前都需要判断是否已经完成之前的计算,然后清空上一次的计算数据
                    ResetParam();

                    RuntimeCache.CanCollectData = true;
                    //开始数据采集
                    if (RuntimeCache.IsHydrophone)
                    {
                        CommandSender.SendHydrophoneWakeUpCmd(_serialPortService.Sp);
                    }
                    else
                    {
                        _accelerometerCommandTimer.Start();
                    }

                    //记录计算时间
                    _runningTimer.Start();
                }
            });
        }

        /// <summary>
        /// 重置参数
        /// </summary>
        private void ResetParam()
        {
            if (_isResetParam)
            {
                PipeDiameter = string.Empty;
                PipeLength = string.Empty;
                LowFrequency = string.Empty;

                HighFrequency = string.Empty;
                SoundSpeed = "0";

                //复位之后可以再次开始
                StartButtonEnabled = true;
            }

            InterferenceFrequency = "无";
            Snr = "无";
            FilterValue = " ~ Hz";
            RedTransmitterDistance = 0;
            ElapseTime = "0";
            BlueTransmitterDistance = 0;
            CorrelatorData = new CorrelatorDataModel();

            _runningSeconds = 0;
            _runningTimer.Stop();

            _eventAggregator.GetEvent<ClearOscillogramEvent>().Publish();

            if (!RuntimeCache.IsHydrophone)
            {
                _accelerometerCommandTimer.Stop();
            }

            RuntimeCache.CanCollectData = false;
        }

        /// <summary>
        /// 参数检查
        /// </summary>
        /// <returns></returns>
        private bool CheckParamLegitimacy()
        {
            if (string.IsNullOrEmpty(_materialName))
            {
                ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "请选择管道材料");
                return false;
            }

            if (string.IsNullOrEmpty(_pipeDiameter))
            {
                ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "请输入管道直径");
                return false;
            }

            if (string.IsNullOrEmpty(_pipeLength))
            {
                ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "请输入管道长度");
                return false;
            }

            if (string.IsNullOrEmpty(_lowFrequency) || string.IsNullOrEmpty(_highFrequency))
            {
                ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "请输入完整的计算频段");
                return false;
            }

            var low = Convert.ToInt32(_lowFrequency);
            var high = Convert.ToInt32(_highFrequency);

            if (RuntimeCache.IsHydrophone)
            {
                if (low < 10 || low > 300 || high < 10 || high > 300 || low >= high)
                {
                    ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "频段范围10 ~ 300Hz,请重新输入");
                    return false;
                }

                //缓存计算参数
                _paramConfig = new ParamConfigModel
                {
                    PipeMaterial = _materialName,
                    PipeDiameter = _pipeDiameter,
                    PipeLength = _pipeLength,
                    MinFrequency = _lowFrequency,
                    MaxFrequency = _highFrequency
                };
            }
            else
            {
                if (low < 100 || low > 3000 || high < 100 || high > 3000 || low >= high)
                {
                    ShowAlertMessageDialog(AlertType.Warning, "温馨提示", "频段范围100 ~ 3000Hz,请重新输入");
                    return false;
                }
            }


            //声速
            var soundVelocity = _soundSpeedDataService.GetSoundVelocity(_materialName, Convert.ToInt32(_pipeDiameter));
            SoundSpeed = soundVelocity.ToString();
            return true;
        }

        /// <summary>
        /// 实时显示时间,并监听串口状态
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void RealTime(object sender, EventArgs args)
        {
            var dateTime = DateTime.Now;
            var strDateTime = dateTime.ToString("yyyy年MM月dd日") +
                              dateTime.ToString("\0 \0 \0 dddd \0 \0 \0", new CultureInfo("zh-cn")) +
                              dateTime.ToString("HH:mm:ss");
            Application.Current.Dispatcher.Invoke(delegate
            {
                CurrentTime = strDateTime;

                //同时监听串口状态
                if (_serialPortService.Sp.IsOpen)
                {
                    ConnectColorBrush = "LimeGreen";
                }
                else
                {
                    ConnectColorBrush = "LightGray";

                    RedTransmitterBattery = 0;
                    RedTransmitterSignal = 0;
                    RedTransmitterState = false;

                    BlueTransmitterBattery = 0;
                    BlueTransmitterSignal = 0;
                    BlueTransmitterState = false;

                    RuntimeCache.RedSensorIsEnable = false;
                    RuntimeCache.BlueSensorIsEnable = false;
                }
            });
        }

        /// <summary>
        /// 显示普通提示对话框
        /// </summary>
        private void ShowAlertMessageDialog(AlertType type, string title, string message)
        {
            _dialogService.ShowDialog("AlertMessageDialog", new DialogParameters
                {
                    { "AlertType", type }, { "Title", title }, { "Message", message }
                },
                delegate { }
            );
        }
    }
}