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)); } } }