Newer
Older
Correlator / Correlator / Dialog / CheckResponseDialog.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;
using Correlator.DataService;
using Correlator.Events;
using Correlator.Model;
using Correlator.SensorHubTag;
using Correlator.Util;
using Prism.Events;
using Prism.Services.Dialogs;

namespace Correlator.Dialog
{
    /// <summary>
    /// CheckResponseDialog.xaml 的交互逻辑
    /// </summary>
    public partial class CheckResponseDialog : UserControl
    {
        private readonly DispatcherTimer _redResponseTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromSeconds(1)
        };

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

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

        private static readonly Lazy<DataBaseManager> LazyDataBase = new Lazy<DataBaseManager>(
            () => new DataBaseManager()
        );

        private bool _isCheckRedSensor;
        private bool _isCheckBlueSensor;
        private readonly IEventAggregator _eventAggregator;
        private readonly ISerialPortService _serialPortService;

        public CheckResponseDialog(IEventAggregator eventAggregator, ISerialPortService serialPortService)
        {
            InitializeComponent();

            _eventAggregator = eventAggregator;
            _serialPortService = serialPortService;

            var today = DateTime.Now.ToString("yyyyMMdd");
            var configModel = LazyDataBase.Value.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;
            var locateDataDir = DirectoryManager.GetLocateDataDir(pipeIndex);

            InitDot();

            InitEvent(locateDataDir);

            _redResponseTimer.Tick += delegate
            {
                for (var i = 1; i <= 60; i++)
                {
                    if (FlowStatus.SeqCaches.Contains(i))
                    {
                        if (RedResponsePanel.Children[i - 1] is Ellipse child)
                        {
                            child.Fill = new SolidColorBrush(Colors.LimeGreen);
                        }
                    }
                }
            };

            _blueResponseTimer.Tick += delegate
            {
                for (var i = 1; i <= 60; i++)
                {
                    if (FlowStatus.SeqCaches.Contains(i))
                    {
                        if (BlueResponsePanel.Children[i - 1] is Ellipse child)
                        {
                            child.Fill = new SolidColorBrush(Colors.LimeGreen);
                        }
                    }
                }
            };

            _checkResponseTimer.Start();
            _checkResponseTimer.Tick += delegate
            {
                if (_isCheckRedSensor)
                {
                    for (var i = 1; i <= 60; i++)
                    {
                        if (FlowStatus.SeqCaches.Contains(i))
                        {
                            if (RedResponsePanel.Children[i - 1] is Ellipse child)
                            {
                                child.Fill = new SolidColorBrush(Colors.LimeGreen);
                            }
                        }
                    }
                }
                else if (_isCheckBlueSensor)
                {
                    for (var i = 1; i <= 60; i++)
                    {
                        if (FlowStatus.SeqCaches.Contains(i))
                        {
                            if (BlueResponsePanel.Children[i - 1] is Ellipse child)
                            {
                                child.Fill = new SolidColorBrush(Colors.LimeGreen);
                            }
                        }
                    }
                }
            };
        }

        private void InitDot()
        {
            for (var i = 0; i < 60; i++)
            {
                var ellipse = new Ellipse
                {
                    Width = 25,
                    Height = 25,
                    Margin = new Thickness(8),
                    Fill = new SolidColorBrush(Colors.LightGray)
                };
                RedResponsePanel.Children.Add(ellipse);
            }

            for (var i = 0; i < 60; i++)
            {
                var ellipse = new Ellipse
                {
                    Width = 25,
                    Height = 25,
                    Margin = new Thickness(8),
                    Fill = new SolidColorBrush(Colors.LightGray)
                };
                BlueResponsePanel.Children.Add(ellipse);
            }
        }

        private void InitEvent(string locateDataDir)
        {
            GoBackButton.Click += delegate
            {
                if (_redResponseTimer.IsEnabled || _blueResponseTimer.IsEnabled)
                {
                    var boxResult = MessageBox.Show("数据未校验结束,确定要退出吗?", "温馨提示", MessageBoxButton.OKCancel,
                        MessageBoxImage.Error);
                    if (boxResult == MessageBoxResult.OK)
                    {
                        _eventAggregator.GetEvent<CheckResponseEvent>().Publish(new DialogResult(ButtonResult.Abort));
                    }
                }
                else
                {
                    _eventAggregator.GetEvent<CheckResponseEvent>().Publish(new DialogResult(ButtonResult.Cancel));
                }
            };

            RedNextStepButton.Click += delegate
            {
                if (RedSensorStepBar.StepIndex == 1)
                {
                    var result = MessageBox.Show("请确认数据是否已接收完整", "温馨提示", MessageBoxButton.YesNo,
                        MessageBoxImage.Warning);
                    if (result == MessageBoxResult.Yes)
                    {
                        RedSensorStepBar.Next();
                    }
                }
                else
                {
                    RedSensorStepBar.Next();
                }
            };

            RedSensorStepBar.StepChanged += delegate
            {
                if (RedSensorStepBar.StepIndex == 1)
                {
                    FlowStatus.SeqCaches.Clear();
                    CommandSender.StartCheckResponse(_serialPortService.Sp, DevCode.Dev1);

                    _redResponseTimer.Start();
                    ReCheckButton.IsEnabled = true;
                }
                else if (RedSensorStepBar.StepIndex == 2)
                {
                    //下发数据全部正常指令
                    CommandSender.SendDataCheckResultCmd(_serialPortService.Sp, DevCode.Dev1, new List<int>());

                    #region 保存原始数据

                    var fileName = $"{locateDataDir}\\原始数据.{DevCode.Dev1}.txt";
                    //将Dictionary按照index排序
                    var sortResult = from pair in FlowStatus.RedSensorOriginalResp orderby pair.Key select pair;

                    //Dictionary排序结果转List
                    var result = sortResult.Select(valuePair => valuePair.Value).ToList();

                    fileName.SaveSensorResponse(result);

                    #endregion

                    #region 处理数据

                    //将Dictionary按照index排序
                    var tagsSortResult = from pair in FlowStatus.RedSensorResponseTags orderby pair.Key select pair;
                    var tags = new List<Tag>();
                    foreach (var valuePair in tagsSortResult)
                    {
                        //每个List<Tag>均包含[CellTag,TimeTag,UploadTag],所以需要挑选出每个List<Tag>里面的UploadTag
                        var noiseTag = valuePair.Value.GetUploadNoiseTag();
                        tags.Add(noiseTag);
                    }

                    _serialPortService.HandleHydrophoneData(DevCode.Dev1, tags);

                    #endregion
                }
                else if (RedSensorStepBar.StepIndex == 3)
                {
                    _redResponseTimer.Stop();
                    RedNextStepButton.IsEnabled = false;
                    ReCheckButton.IsEnabled = false;
                }
            };

            BlueNextStepButton.Click += delegate
            {
                if (BlueSensorStepBar.StepIndex == 1)
                {
                    var result = MessageBox.Show("请确认数据是否已接收完整", "温馨提示", MessageBoxButton.YesNo,
                        MessageBoxImage.Warning);
                    if (result == MessageBoxResult.Yes)
                    {
                        BlueSensorStepBar.Next();
                    }
                }
                else
                {
                    BlueSensorStepBar.Next();
                }
            };

            BlueSensorStepBar.StepChanged += delegate
            {
                if (BlueSensorStepBar.StepIndex == 1)
                {
                    FlowStatus.SeqCaches.Clear();
                    CommandSender.StartCheckResponse(_serialPortService.Sp, DevCode.Dev2);

                    _blueResponseTimer.Start();
                    ReCheckButton.IsEnabled = true;
                }
                else if (BlueSensorStepBar.StepIndex == 2)
                {
                    CommandSender.SendDataCheckResultCmd(_serialPortService.Sp, DevCode.Dev2, new List<int>());

                    #region 保存原始数据

                    var fileName = $"{locateDataDir}\\原始数据.{DevCode.Dev2}.txt";
                    //将Dictionary按照index排序
                    var sortResult = from pair in FlowStatus.BlueSensorOriginalResp orderby pair.Key select pair;

                    //Dictionary排序结果转List
                    var result = sortResult.Select(valuePair => valuePair.Value).ToList();

                    fileName.SaveSensorResponse(result);

                    #endregion

                    #region 处理数据

                    //将Dictionary按照index排序
                    var tagsSortResult = from pair in FlowStatus.BlueSensorResponseTags orderby pair.Key select pair;
                    var tags = new List<Tag>();
                    foreach (var valuePair in tagsSortResult)
                    {
                        //每个List<Tag>均包含[CellTag,TimeTag,UploadTag],所以需要挑选出每个List<Tag>里面的UploadTag
                        var noiseTag = valuePair.Value.GetUploadNoiseTag();
                        tags.Add(noiseTag);
                    }

                    _serialPortService.HandleHydrophoneData(DevCode.Dev2, tags);

                    #endregion
                }
                else if (BlueSensorStepBar.StepIndex == 3)
                {
                    _blueResponseTimer.Stop();
                    ReCheckButton.IsEnabled = false;

                    //关闭窗口
                    _checkResponseTimer.Stop();
                    //再次检查数据是否收集完整
                    DialogResult dialogResult;
                    if (IsDataCollectedCompleted())
                    {
                        dialogResult = new DialogResult(ButtonResult.OK);
                    }
                    else
                    {
                        dialogResult = new DialogResult(ButtonResult.Abort);
                    }

                    _eventAggregator.GetEvent<CheckResponseEvent>().Publish(dialogResult);
                }
            };

            ReCheckButton.Click += delegate
            {
                if (_redResponseTimer.IsEnabled)
                {
                    _isCheckRedSensor = true;
                    var redIndexArray = new List<int>();
                    //查找ResponsePanel中颜色为浅灰色的index
                    for (var i = 0; i < RedResponsePanel.Children.Count; i++)
                    {
                        var child = RedResponsePanel.Children[i] as Ellipse;
                        var index = i + 1;
                        if (child == null)
                        {
                            redIndexArray.Add(index);
                        }
                        else if (child.Fill.ToString().Equals("#FFD3D3D3"))
                        {
                            redIndexArray.Add(index);
                        }
                    }

                    CommandSender.SendDataCheckResultCmd(_serialPortService.Sp, DevCode.Dev1, redIndexArray);
                }
                else
                {
                    _isCheckBlueSensor = true;
                    var blueIndexArray = new List<int>();
                    //查找ResponsePanel中颜色为浅灰色的index
                    for (var i = 0; i < BlueResponsePanel.Children.Count; i++)
                    {
                        var child = BlueResponsePanel.Children[i] as Ellipse;
                        var index = i + 1;
                        if (child == null)
                        {
                            blueIndexArray.Add(index);
                        }
                        else if (child.Fill.ToString().Equals("#FFD3D3D3"))
                        {
                            blueIndexArray.Add(index);
                        }
                    }

                    CommandSender.SendDataCheckResultCmd(_serialPortService.Sp, DevCode.Dev2, blueIndexArray);
                }
            };
        }

        /// <summary>
        /// 判断数据是否收集完整
        /// </summary>
        /// <returns></returns>
        private bool IsDataCollectedCompleted()
        {
            return RedResponsePanel.Children
                       .Cast<Ellipse>()
                       .All(child => child.Fill != new SolidColorBrush(Colors.LightGray)) &&
                   BlueResponsePanel.Children
                       .Cast<Ellipse>()
                       .All(child => child.Fill != new SolidColorBrush(Colors.LightGray));
        }
    }
}