From 526019f244c1fc6f08361cd15cfce47927048823 Mon Sep 17 00:00:00 2001 From: Victoria Plitt Date: Sun, 13 Sep 2020 11:55:25 +0300 Subject: Dispenser Analyzer. A new analyzer was added - Process. Added additional level of Generic interfaces and implementation. --- .../Analysis/AnalyserResultChartData.cs | 74 +++++++ .../Analysis/AnalysisService.cs | 27 ++- .../Analysis/AnalyzerResultBase.cs | 17 +- .../Analysis/DispenserReader.cs | 71 ++++++ .../Analysis/IAnalyzer.cs | 19 +- .../Analysis/IAnalyzerResult.cs | 53 +---- .../Tango.DispenserAnalyzer.UI/Analysis/IReader.cs | 17 ++ .../Analysis/ProcessReader.cs | 116 ++++++++++ .../Analyzers/DynamicSealingAnalyzer.cs | 23 +- .../Analyzers/FlowAnalyser.cs | 27 ++- .../Analyzers/PressureBuildUpAnalyser.cs | 22 +- .../Analyzers/PrimingAnalyzer.cs | 22 +- .../Analyzers/ProcessAnalyser.cs | 137 ++++++++++++ .../Analyzers/SealingAnalyzer.cs | 22 +- .../Tango.DispenserAnalyzer.UI/MainWindow.xaml | 69 ++++-- .../Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs | 4 + .../Models/DispenserSample.cs | 2 +- .../Tango.DispenserAnalyzer.UI/Models/ISample.cs | 12 + .../Models/ProcessCsvRow.cs | 17 ++ .../Models/ProcessSample.cs | 25 +++ .../Tango.DispenserAnalyzer.UI/Settings.cs | 29 ++- .../Tango.DispenserAnalyzer.UI.csproj | 14 +- .../View/SettingsWnd.xaml | 245 +++++++++++---------- .../ViewModels/MainWindowVM.cs | 143 +++++------- .../ViewModels/SettingsVM.cs | 115 +++++++--- 25 files changed, 973 insertions(+), 349 deletions(-) create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyserResultChartData.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/DispenserReader.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IReader.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/ProcessReader.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/ProcessAnalyser.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ISample.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessCsvRow.cs create mode 100644 Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessSample.cs (limited to 'Software/Visual_Studio/Utilities') diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyserResultChartData.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyserResultChartData.cs new file mode 100644 index 000000000..54431968f --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyserResultChartData.cs @@ -0,0 +1,74 @@ +using OxyPlot; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.DispenserAnalyzer.UI.Analysis +{ + public class AnalyzerResultChartData : ExtendedObject + { + public ObservableCollection Points { get; set; } + + public string Title { get; set; } + + private int _step; + public int XStep + { + get { return _step; } + set { _step = value; RaisePropertyChangedAuto(); } + } + + private double _fromXAxis; + public double FromXAxis + { + get { return _fromXAxis; } + set { _fromXAxis = value; RaisePropertyChangedAuto(); } + } + + private double _toXAxis; + public double ToXAxis + { + get { return _toXAxis; } + set { _toXAxis = value; RaisePropertyChangedAuto(); } + } + + private double _fromYAxis; + public double FromYAxis + { + get { return _fromYAxis; } + set { _fromYAxis = value; RaisePropertyChangedAuto(); } + } + + private double _toYAxis; + public double ToYAxis + { + get { return _toYAxis; } + set { _toYAxis = value; RaisePropertyChangedAuto(); } + } + + public void UpdateData() + { + _toYAxis = Points.Max(x => x.Y) + 2; + _fromYAxis = Points.Min(x => x.Y) - 1; + _toXAxis = Points.Max(x => x.X); + _fromXAxis = Points.Min(x => x.X); + + RaisePropertyChanged("Title"); + RaisePropertyChanged("Points"); + } + + public AnalyzerResultChartData() + { + Points = new ObservableCollection(); + _fromYAxis = 0; + _fromXAxis = 0; + _toYAxis = 1; + _toXAxis = 1; + XStep = 1; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs index 0bebb4f11..0dbf9a83e 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs @@ -4,24 +4,37 @@ using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; +using Tango.CSV; +using Tango.DispenserAnalyzer.UI.Models; +using System.Windows.Controls; +using System.Windows.Media; +using System.IO; namespace Tango.DispenserAnalyzer.UI.Analysis { public class AnalysisService { - public static IAnalyzer GetAnalyzer(String fileName) + public static dynamic GetAnalyzer(String fileName) { - var analyzerTypes = typeof(AnalysisService).Assembly.GetTypes().Where(x => typeof(IAnalyzer).IsAssignableFrom(x)).ToList(); - // var words = fileName.Split().Select(x => x.Trim(' ')); - var analyzerType = analyzerTypes.FirstOrDefault(x => fileName.IndexOf(x.GetCustomAttribute().Name, StringComparison.OrdinalIgnoreCase) >= 0); - return (analyzerType != null) ? Activator.CreateInstance(analyzerType) as IAnalyzer : null; + string filename = Path.GetFileNameWithoutExtension(fileName); + + var analyzerTypes = typeof(AnalysisService).Assembly.GetTypes().Where(x => typeof(IBaseAnalyzer).IsAssignableFrom(x)).ToList(); + var analyzerType = analyzerTypes.FirstOrDefault(x => filename.StartsWith(x.GetCustomAttribute().Name, StringComparison.OrdinalIgnoreCase) ); + if(analyzerType == null) + {//in case name of test is not first word + analyzerType = analyzerTypes.FirstOrDefault(x => filename.IndexOf(x.GetCustomAttribute().Name, StringComparison.OrdinalIgnoreCase) >= 0); + } + + return (analyzerType != null) ? Activator.CreateInstance(analyzerType) : null; } public static string GetTestName(String fileName) { - var analyzerTypes = typeof(AnalysisService).Assembly.GetTypes().Where(x => typeof(IAnalyzer).IsAssignableFrom(x)).ToList(); - var analyzerType = analyzerTypes.SingleOrDefault(x => fileName.Contains(x.GetCustomAttribute().Name)); + var analyzerTypes = typeof(AnalysisService).Assembly.GetTypes().Where(x => typeof(IBaseAnalyzer).IsAssignableFrom(x)).ToList(); + var analyzerType = analyzerTypes.FirstOrDefault(x => fileName.IndexOf(x.GetCustomAttribute().Name, StringComparison.OrdinalIgnoreCase) >= 0); + return analyzerType.GetCustomAttribute().Name; } } + } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs index d3d217409..bc82d2215 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs @@ -15,7 +15,7 @@ namespace Tango.DispenserAnalyzer.UI.Analysis public class AnalyzerResultBase : ExtendedObject, IAnalyzerResult { public AnalyzerResultValue Result { get; set; } - public List PlotValues { get; set; } + // public List PlotValues { get; set; } //public ObservableCollection Points { get; set; } public List Properties @@ -53,17 +53,22 @@ namespace Tango.DispenserAnalyzer.UI.Analysis } public bool IsShowPlotResult { get; set; } - public AnalyzerResultPlotData RangeToCountChart { get; set; } - public AnalyzerResultPlotData RangeToTimeChart { get; set; } + public bool IsShowLineChartResult { get; set; } + public AnalyzerResultChartData RangeToCountChart { get; set; } + public AnalyzerResultChartData RangeToTimeChart { get; set; } + public AnalyzerResultChartData LineChart { get; set; } public bool BackgroundMode { get; set; } + public AnalyzerResultBase() { - PlotValues = new List(); + //PlotValues = new List(); Result = AnalyzerResultValue.Undetermined; IsShowPlotResult = false; - RangeToCountChart = new AnalyzerResultPlotData(); - RangeToTimeChart = new AnalyzerResultPlotData(); + IsShowLineChartResult = false; + RangeToCountChart = new AnalyzerResultChartData(); + RangeToTimeChart = new AnalyzerResultChartData(); + LineChart = new AnalyzerResultChartData(); BackgroundMode = false; } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/DispenserReader.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/DispenserReader.cs new file mode 100644 index 000000000..8bb519425 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/DispenserReader.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.CSV; +using Tango.DispenserAnalyzer.UI.Models; +using OxyPlot.Annotations; +using System.Windows.Media; +using System.Diagnostics; + +namespace Tango.DispenserAnalyzer.UI.Analysis +{ + public class DispenserReader: IReader + { + public List ReadScvFile(String filePath, List annotations) + { + List data = CsvFile.Read(new CsvSource(filePath)).ToList(); + List samples = new List(); + int index = 0; + int last_labelIndex = 0; + foreach (var item in data) + { + double pressure = 0; + if (item.Label == "Label") + { + item.Pressure = "0"; + item.Command = "Label"; + if (last_labelIndex == 0 || last_labelIndex < (index + 5)) + { + last_labelIndex = index; + + OxyPlot.Wpf.LineAnnotation _line = new OxyPlot.Wpf.LineAnnotation() + { + StrokeThickness = 1, + Color = Color.FromRgb(255, 5, 5), + Type = LineAnnotationType.Vertical, + Text = index.ToString(), + X = index, + }; + annotations.Add(_line); + + } + } + if (double.TryParse(item.Pressure, out pressure) || !String.IsNullOrWhiteSpace(item.Command)) + { + samples.Add(new DispenserSample() + { + Pressure = pressure, + Command = String.IsNullOrWhiteSpace(item.Command) ? null : item.Command, + Index = index + }); + index++; + } + } + return samples; + } + + public List GetTitles(String filePath) + { + string xAxistitle = "Time[msec]"; + string yAxistitle = "Pressure [mbar]"; + return new List() { xAxistitle, yAxistitle }; + } + + public bool PrintResultsToPDFFile() + { + return true ; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs index 6d522da82..fd3b3c267 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs @@ -7,9 +7,24 @@ using Tango.DispenserAnalyzer.UI.Models; namespace Tango.DispenserAnalyzer.UI.Analysis { + [Analyzer("BaseInterface")] + public interface IBaseAnalyzer + { + + } [Analyzer("INTERFACE")] - public interface IAnalyzer + public interface IAnalyzer: IBaseAnalyzer + { + IReader Reader { get; set; } + Task> Process(List csvRows, bool backgroundMode); + void GetPoints(List samples, IList points); + } + [Analyzer("DISPENSERINTERFACE")] + public interface IDispenserDispenserAnalyser : IAnalyzer + { + } + [Analyzer("PROCESSINTERFACE")] + public interface IProcessAnalyzer : IAnalyzer { - Task> Process(List csvRows, bool backgroundMode); } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs index 60f7fcb36..5203828e5 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzerResult.cs @@ -5,62 +5,17 @@ using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; -using Tango.Core; namespace Tango.DispenserAnalyzer.UI.Analysis { - public class AnalyzerResultPlotData: ExtendedObject - { - public ObservableCollection Points { get; set; } - - public string Title { get; set; } - - private int _step; - public int XStep - { - get { return _step; } - set { _step = value; RaisePropertyChangedAuto(); } - } - - private double _from; - public double From - { - get { return _from; } - set { _from = value; RaisePropertyChangedAuto(); } - } - - private double _to; - public double To - { - get { return _to; } - set { _to = value; RaisePropertyChangedAuto(); } - } - - public void UpdateData() - { - _to = Points.Max(x => x.Y) + 2; - _from = Points.Min(x => x.Y)-1; - RaisePropertyChanged("Title"); - RaisePropertyChanged("Points"); - } - - public AnalyzerResultPlotData() - { - Points = new ObservableCollection(); - _from = 0; - _to = 1; - XStep = 1; - } - - } public interface IAnalyzerResult { AnalyzerResultValue Result { get; set; } bool BackgroundMode { get; set; } - List PlotValues { get; set; } - - AnalyzerResultPlotData RangeToCountChart { get; set; } - AnalyzerResultPlotData RangeToTimeChart { get; set; } + //List PlotValues { get; set; } + + //AnalyzerResultChartData RangeToCountChart { get; set; } + //AnalyzerResultChartData RangeToTimeChart { get; set; } } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IReader.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IReader.cs new file mode 100644 index 000000000..35c7f8f76 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IReader.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DispenserAnalyzer.UI.Analysis +{ + public interface IReader + { + List ReadScvFile(String filePath, List annotations); + + List GetTitles(String filePath); + + bool PrintResultsToPDFFile(); + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/ProcessReader.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/ProcessReader.cs new file mode 100644 index 000000000..b2e6f0388 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/ProcessReader.cs @@ -0,0 +1,116 @@ +using OxyPlot; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.CSV; +using Tango.DispenserAnalyzer.UI.Models; +using OxyPlot.Annotations; +using System.Windows.Media; + + +namespace Tango.DispenserAnalyzer.UI.Analysis +{ + public class ProcessReader: IReader + { + public List ReadScvFile(String filePath, List annotations) + { + List samples = new List(); + try + { + List data = CsvFile.Read(new CsvSource(filePath)).ToList(); + + double index = 0; + double delta = 0; + if (data.Count > 2) + { + DateTime time1; + DateTime time2; + if (DateTime.TryParse(data[0].Time, out time1) && DateTime.TryParse(data[1].Time, out time2)) + { + int m1 = time1.Millisecond; + int m2 = time2.Millisecond; + delta = (time2 - time1).Milliseconds / 100; + } + } + delta = Settings.GetValueByName(AnalyzerSettingsEnum.TimeInterval); + if(delta == 0) + return samples; + + int endPoint = (int)(Settings.GetValueByName(AnalyzerSettingsEnum.EndCalculation) / delta); + foreach (var item in data) + { + double dValue = 0; + + if (double.TryParse(item.Value, out dValue)) + { + DateTime time; + DateTime.TryParse(item.Time, out time); + int mil = time.Millisecond; + samples.Add(new ProcessSample() + { + Time = time, + Value = dValue, + TimeIntervalSec = index, + }); + index += delta; + } + } + OxyPlot.Wpf.LineAnnotation _line1 = new OxyPlot.Wpf.LineAnnotation() + { + StrokeThickness = 1, + Color = Color.FromRgb(255, 5, 5), + Type = LineAnnotationType.Vertical, + Text = index.ToString(), + X = Settings.GetValueByName(AnalyzerSettingsEnum.StartCalculation) + }; + annotations.Add(_line1); + OxyPlot.Wpf.LineAnnotation _line2 = new OxyPlot.Wpf.LineAnnotation() + { + StrokeThickness = 1, + Color = Color.FromRgb(255, 5, 5), + Type = LineAnnotationType.Vertical, + Text = index.ToString(), + X = Settings.GetValueByName(AnalyzerSettingsEnum.EndCalculation) + }; + annotations.Add(_line2); + + + return samples; + } + catch (Exception ex) + { + Debug.Write("Exception in ProcessReader ReadScvFile" + ex.Message); + return samples; + } + } + + public List GetScvColumns(String filePath) + { + try + { + return CsvFile.GetColumns(new CsvSource(filePath)).ToList(); + } + catch (Exception ex) + { + Debug.Write("Exception in ProcessReader ReadScvFile" + ex.Message); + return null; + } + } + + public List GetTitles(String filePath) + { + List columns = GetScvColumns(filePath); + string xAxistitle = "Time [sec]"; + string yAxistitle = columns!= null && columns.Count > 1 ? columns[1] : "Values"; + return new List() { xAxistitle, yAxistitle }; + } + + public bool PrintResultsToPDFFile() + { + return false; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs index 8acd1651c..d440f42c3 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs @@ -10,8 +10,19 @@ using Tango.DispenserAnalyzer.UI.Models; namespace Tango.DispenserAnalyzer.UI.Analyzers { [Analyzer("dynamic")] - public class DynamicSealingAnalzyer : IAnalyzer + public class DynamicSealingAnalzyer : IDispenserDispenserAnalyser { + private IReader _reader; + public IReader Reader + { + get { return _reader; } + set { _reader = value; } + } + public DynamicSealingAnalzyer() + { + Reader = new DispenserReader(); + } + public Task> Process(List csvRows, bool backgroundMode) { return Task.Factory.StartNew>(() => @@ -61,6 +72,16 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers return results; }); } + + public void GetPoints(List samples, IList points) + { + samples.ForEach(x => + { + if (x.Pressure != 0.0) + { points.Add(new OxyPlot.DataPoint(x.Index, x.Pressure)); } + }); + } + public class DynamicSealingAnalyzerResult : AnalyzerResultBase { [Description("Dynamic sealing result")] diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs index 492fb3e6a..81c578e5c 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs @@ -19,15 +19,28 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers { [Analyzer("flow")] - public class FlowAnalyser : IAnalyzer + public class FlowAnalyser : IDispenserDispenserAnalyser { + private IReader _reader; + public IReader Reader + { + get { return _reader; } + set { _reader = value; } + } + + + public FlowAnalyser() + { + Reader = new DispenserReader(); + } + public Task> Process(List csvRows, bool backgroundMode) { return Task.Factory.StartNew>(() => { List results = new List(); List commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList(); - var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList(); + var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index/2 ).Select(x => x.Select(v => v.Value).ToList()).ToList(); MovingAverageFilter filter = new MovingAverageFilter(); int flowtestNumber = 0; for (int index = 0; index < pairs.Count(); index++) @@ -101,6 +114,16 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers return results; }); } + + public void GetPoints(List samples, IList points) + { + samples.ForEach(x => + { + if (x.Pressure != 0.0) + { points.Add(new OxyPlot.DataPoint(x.Index, x.Pressure)); } + }); + } + public class FlowAverageAnalyzerResult : AnalyzerResultBase { [Description("Average Value")] diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs index 79b643294..9288eb2ad 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PressureBuildUpAnalyser.cs @@ -9,8 +9,19 @@ using Tango.DispenserAnalyzer.UI.Models; namespace Tango.DispenserAnalyzer.UI.Analyzers { [Analyzer("pressure build up")] - public class PressureBuildUpAnalyser : IAnalyzer + public class PressureBuildUpAnalyser : IDispenserDispenserAnalyser { + private IReader _reader; + public IReader Reader + { + get { return _reader; } + set { _reader = value; } + } + + public PressureBuildUpAnalyser() + { + Reader = new DispenserReader(); + } public Task> Process(List csvRows, bool backgroundMode) { return Task.Factory.StartNew>(() => @@ -36,6 +47,15 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers return results; }); } + + public void GetPoints(List samples, IList points) + { + samples.ForEach(x => + { + if (x.Pressure != 0.0) + { points.Add(new OxyPlot.DataPoint(x.Index, x.Pressure)); } + }); + } } } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs index cfd4a7b55..315c384d6 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs @@ -11,8 +11,19 @@ using Tango.DispenserAnalyzer.UI.Models; namespace Tango.DispenserAnalyzer.UI.Analyzers { [Analyzer("priming")] - public class PrimingAnalyzer : IAnalyzer + public class PrimingAnalyzer : IDispenserDispenserAnalyser { + private IReader _reader; + public IReader Reader + { + get { return _reader; } + set { _reader = value; } + } + + public PrimingAnalyzer() + { + Reader = new DispenserReader(); + } public Task> Process(List csvRows, bool backgroundMode) { return Task.Factory.StartNew>(() => @@ -35,6 +46,15 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers return results; }); } + + public void GetPoints(List samples, IList points) + { + samples.ForEach(x => + { + if (x.Pressure != 0.0) + { points.Add(new OxyPlot.DataPoint(x.Index, x.Pressure)); } + }); + } } public class PrimingAnalyzerResult : AnalyzerResultBase { diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/ProcessAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/ProcessAnalyser.cs new file mode 100644 index 000000000..65fe9c85d --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/ProcessAnalyser.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.CSV; +using Tango.DispenserAnalyzer.UI.Analysis; +using Tango.DispenserAnalyzer.UI.Models; + +namespace Tango.DispenserAnalyzer.UI.Analyzers +{ + [Analyzer("process")] + public class ProcessAnalyser : IProcessAnalyzer + { + private IReader _reader; + public IReader Reader { + get { return _reader; } + set { _reader = value; } + } + + public ProcessAnalyser() + { + Reader = new ProcessReader(); + } + + public Task> Process(List csvRows, bool backgroundMode) + { + return Task.Factory.StartNew>(() => + { + List results = new List(); + ProcessAnalyzerResult result = new ProcessAnalyzerResult(); + result.BackgroundMode = backgroundMode; + double delta = Settings.GetValueByName(AnalyzerSettingsEnum.TimeInterval); + int startPoint = delta == 0? 0 : (int)(Settings.GetValueByName(AnalyzerSettingsEnum.StartCalculation) / delta); + int endPoint = delta == 0 ? (csvRows.Count -1) : (int)(Settings.GetValueByName(AnalyzerSettingsEnum.EndCalculation) / delta); + List rangeValues = csvRows.Skip(startPoint).Take(endPoint).ToList(); + + result.MinValue = rangeValues.Min(x => x.Value); + result.MaxValue = rangeValues.Max(x => x.Value); + result.AverageValue = rangeValues.Average(x => x.Value); + result.StandardDeviation = ProcessAnalyser.StdDev(rangeValues.Select(x => x.Value)); + + result.Result = AnalyzerResultValue.Passed; + + //Move Average data + List tasks = new List(); + int calc_count = (int)csvRows.Count() / 4; + int start_index = 0; + while (start_index < csvRows.Count()) + { + int calc_amount = (start_index + calc_count) >= (csvRows.Count() - 4) ? csvRows.Count() - start_index : calc_count; + var source_filter = csvRows.Skip(start_index).Take(calc_amount).ToList(); + tasks.Add(Task.Run(() => + { + ProcessAnalyser.Filtering(source_filter); + })); + start_index += calc_amount; + } + Task.WaitAll(tasks.ToArray()); + + result.CreateMovingAvgGraph(csvRows); + results.Add(result); + return results; + }); + } + + public static double StdDev(IEnumerable values) + { + double avg = values.Average(); + double sum = values.Sum(v => (v - avg) * (v - avg)); + double denominator = values.Count() - 1; + return denominator > 0.0 ? Math.Sqrt(sum / denominator) : -1; + } + public static void Filtering(List source) + { + int periodAverage = (int)Settings.GetValueByName(AnalyzerSettingsEnum.MovingAvg); + int count = (source.Count < periodAverage) ? source.Count : source.Count - periodAverage; + for (int i = 0; i < count; i++) + { + source[i].Value = source.Skip(i).Take(periodAverage).Average(x => x.Value); + } + } + + public void GetPoints(List samples, IList points) + { + samples.ForEach(x => + { + points.Add(new OxyPlot.DataPoint(x.TimeIntervalSec, x.Value)); + }); + } + + } + + public class ProcessAnalyzerResult : AnalyzerResultBase + { + [Description("Selected Area")] + public string Header { get; set; } + + [Description("Average Value")] + public double AverageValue { get; set; } + [Description("Max value")] + public double MaxValue { get; set; } + [Description("Min value")] + public double MinValue { get; set; } + [Description("Standard deviation value")] + public double StandardDeviation { get; set; } + + + public ProcessAnalyzerResult() + { + double from = Settings.GetValueByName(AnalyzerSettingsEnum.StartCalculation); + double to = Settings.GetValueByName(AnalyzerSettingsEnum.EndCalculation); + Header = $"from {from} to {to} seconds"; + AverageValue = MaxValue = MinValue = 0.0; + Result = AnalyzerResultValue.Undetermined; + IsShowLineChartResult = true; + } + + public void CreateMovingAvgGraph(List avgValues) + { + if (!BackgroundMode) + { + var points = LineChart.Points; + points.Clear(); + avgValues.ForEach(x => + { + points.Add(new OxyPlot.DataPoint(x.TimeIntervalSec, x.Value)); + }); + + LineChart.Title = $"Moving Average Values"; + LineChart.UpdateData(); + } + } + + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs index e1fe232c3..841101b10 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs @@ -10,8 +10,19 @@ using Tango.DispenserAnalyzer.UI.Models; namespace Tango.DispenserAnalyzer.UI.Analyzers { [Analyzer("sealtest")] - public class SealingAnalyzer : IAnalyzer + public class SealingAnalyzer : IDispenserDispenserAnalyser { + private IReader _reader; + public IReader Reader + { + get { return _reader; } + set { _reader = value; } + } + + public SealingAnalyzer() + { + Reader = new DispenserReader(); + } public Task> Process(List csvRows, bool backgroundMode) { return Task.Factory.StartNew>(() => @@ -38,6 +49,15 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers return results; }); } + + public void GetPoints(List samples, IList points) + { + samples.ForEach(x => + { + if (x.Pressure != 0.0) + { points.Add(new OxyPlot.DataPoint(x.Index, x.Pressure)); } + }); + } } public class SealingAnalyzerResult : AnalyzerResultBase diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml index e56ae6639..595d74e3d 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml @@ -48,33 +48,34 @@ - - - + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -130,7 +131,27 @@ - + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs index d328ea8a5..e7d263a1c 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs @@ -43,6 +43,10 @@ namespace Tango.DispenserAnalyzer.UI for (int index = 0; index < filePathArr.Length; index++) { await _vm.GenerateInBackground(filePathArr[index]); + if(index < filePathArr.Length) + { + await Task.Delay(500); + } } } await Task.Delay(500); diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/DispenserSample.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/DispenserSample.cs index d1d37955d..899aaa600 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/DispenserSample.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/DispenserSample.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Tango.DispenserAnalyzer.UI.Models { - public class DispenserSample + public class DispenserSample: ISample { public double Pressure { get; set; } public String Command { get; set; } diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ISample.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ISample.cs new file mode 100644 index 000000000..ea374a846 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ISample.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DispenserAnalyzer.UI.Models +{ + public interface ISample + { + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessCsvRow.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessCsvRow.cs new file mode 100644 index 000000000..33e85d5b5 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessCsvRow.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.CSV; + +namespace Tango.DispenserAnalyzer.UI.Models +{ + public class ProcessCsvRow + { + [CsvOrder(0)] + public String Time { get; set; } + [CsvOrder(1)] + public String Value { get; set; } + } +} \ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessSample.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessSample.cs new file mode 100644 index 000000000..3f02ea35d --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Models/ProcessSample.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DispenserAnalyzer.UI.Models +{ + public class ProcessSample : ISample + { + public double TimeIntervalSec { get; set; } + public DateTime Time { get; set; } + public double Value { get; set; } + + public ProcessSample() + { + Value = 0.0; + } + + public override string ToString() + { + return $"{TimeIntervalSec}, {Value}"; + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs index 9a1f10aed..b8084b2d3 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Settings.cs @@ -9,7 +9,8 @@ namespace Tango.DispenserAnalyzer.UI { public enum AnalyzerSettingsEnum { - //Undetermined + [Description("Print Results to PDF file")] + PrintResultsToPDF, [Description("PBU Pass fail")] PBUPassFail, [Description("PBU Pass fail")] @@ -28,6 +29,15 @@ namespace Tango.DispenserAnalyzer.UI MaxError, [Description("Take off 'Max-min' values(out of highest results)")] TakeOffMaxMin, + [Description("Time gap between data point [sec]")] + TimeInterval, + [Description("Time point to start calculation [sec]")] + StartCalculation, + [Description("Time point to end calculation [sec]")] + EndCalculation, + [Description("How many points to use for moving average")] + MovingAvg + } @@ -39,7 +49,6 @@ namespace Tango.DispenserAnalyzer.UI static Settings() { DefaultValues = new Dictionary(); - DefaultValues[AnalyzerSettingsEnum.PBUPassFail] = 4.5; DefaultValues[AnalyzerSettingsEnum.FlowPBUPassFail] = 4.5; DefaultValues[AnalyzerSettingsEnum.ExcludeAnalysis] = 1800; @@ -49,17 +58,13 @@ namespace Tango.DispenserAnalyzer.UI DefaultValues[AnalyzerSettingsEnum.MaxMinIntervals] = 300; DefaultValues[AnalyzerSettingsEnum.MaxError] = 1.5; DefaultValues[AnalyzerSettingsEnum.TakeOffMaxMin] = 3; + DefaultValues[AnalyzerSettingsEnum.TimeInterval] = 0.1; + DefaultValues[AnalyzerSettingsEnum.StartCalculation] = 600; + DefaultValues[AnalyzerSettingsEnum.EndCalculation] = 900; + DefaultValues[AnalyzerSettingsEnum.MovingAvg] = 50; - CurrentValues = new Dictionary(); - CurrentValues[AnalyzerSettingsEnum.PBUPassFail] = 4.5; - CurrentValues[AnalyzerSettingsEnum.FlowPBUPassFail] = 4.5; - CurrentValues[AnalyzerSettingsEnum.ExcludeAnalysis] = 1800; - CurrentValues[AnalyzerSettingsEnum.AvgMinValue] = 1400; - CurrentValues[AnalyzerSettingsEnum.AvgMaxValue] = 1850; - CurrentValues[AnalyzerSettingsEnum.MaxMinRange] = 500; - CurrentValues[AnalyzerSettingsEnum.MaxMinIntervals] = 300; - CurrentValues[AnalyzerSettingsEnum.MaxError] = 1.5; - CurrentValues[AnalyzerSettingsEnum.TakeOffMaxMin] = 3; + CurrentValues = new Dictionary(DefaultValues); + } public static double GetValueByName(AnalyzerSettingsEnum name) { diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj index b7db85ef8..5a261fb85 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj @@ -15,7 +15,7 @@ true true false - P:\Users - Public\Ori\Dispenser Analyzer\ + P:\Dispenser Analyzer Installer\ true Disk false @@ -29,8 +29,8 @@ Dispenser Analyser Twine false - 4 - 2.1.1.%2a + 2 + 3.1.1.%2a true true true @@ -126,17 +126,22 @@ MSBuild:Compile Designer + + + + + @@ -144,6 +149,9 @@ + + + diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml index 2bfa2bba1..d8d4594b8 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/View/SettingsWnd.xaml @@ -6,7 +6,7 @@ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:local="clr-namespace:Tango.DispenserAnalyzer.UI.View" mc:Ignorable="d" - Title="Settings" Height="630" Width="800" FontSize="22" ResizeMode="NoResize" WindowStyle="ToolWindow" Closing="Window_Closing"> + Title="Settings" Height="690" Width="800" FontSize="22" ResizeMode="NoResize" WindowStyle="ToolWindow" Closing="Window_Closing"> @@ -64,138 +64,149 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + - + - - - - - - - - - - - - - - Pressure build up test - - - - - - - - - - - - - - - - - - - Flow test - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs index 38f8dee81..48d426d23 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs @@ -126,7 +126,24 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels } } - + private string _titleAxisBottom; + + public string TitleAxisBottom + { + get { return _titleAxisBottom; } + set { _titleAxisBottom = value; RaisePropertyChangedAuto(); } + } + + private string _titleAxisLeft; + + public string TitleAxisLeft + { + get { return _titleAxisLeft; } + set { _titleAxisLeft = value; RaisePropertyChangedAuto(); } + } + + + private bool _isRunning; /// /// Gets or sets a value indicating whether this instance is running. @@ -162,7 +179,8 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels XStep = 1; AnalyzerResults = new ObservableCollection(); _isRunning = false; - + TitleAxisBottom = ""; + TitleAxisLeft = ""; this.Points = new List(); } @@ -251,69 +269,38 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels return; ResetSettings(); - IAnalyzer analyzer = AnalysisService.GetAnalyzer(OpenFilePath); + var analyzer = AnalysisService.GetAnalyzer(OpenFilePath); if (analyzer == null) return; IsRunning = true; - AnalyzerAttribute attribute = (AnalyzerAttribute)analyzer.GetType().GetCustomAttributes(typeof(AnalyzerAttribute), true).FirstOrDefault(); - - TestName = attribute.Name; - List data = CsvFile.Read(new CsvSource(OpenFilePath)).ToList(); - List samples = new List(); - - To = 0; - From = 0; - int index = 0; - int last_labelIndex = 0; - - - foreach (var item in data) + AnalyzerAttribute[] attr = analyzer.GetType().GetCustomAttributes(typeof(AnalyzerAttribute), true); + if (attr != null && attr.Count() > 0) { - double pressure = 0; - if(item.Label == "Label") - { - item.Pressure = "0"; - item.Command = "Label"; - if (last_labelIndex == 0 || last_labelIndex < (index + 5)) - { - last_labelIndex = index; - - OxyPlot.Wpf.LineAnnotation _line = new OxyPlot.Wpf.LineAnnotation() - { - StrokeThickness = 1, - Color = Color.FromRgb(255, 5, 5), - Type = LineAnnotationType.Vertical, - Text = index.ToString(), - X = index, - }; - PlotControl.Annotations.Add(_line); - - } - } - if (double.TryParse(item.Pressure, out pressure) || !String.IsNullOrWhiteSpace(item.Command)) - { - samples.Add(new DispenserSample() - { - Pressure = pressure, - Command = String.IsNullOrWhiteSpace(item.Command) ? null : item.Command, - Index = index - }); - index++; - } + TestName = attr[0].Name; + } + List annotations = new List(); + var samples = analyzer.Reader.ReadScvFile(OpenFilePath, annotations); + analyzer.GetPoints(samples, Points); + if (Points.Count == 0) + { + IsRunning = false; + return; } + annotations.ForEach(x => PlotControl.Annotations.Add(x)); + To = 0; + From = 0; + List res = await analyzer.Process(samples, false); AnalyzerResults = new ObservableCollection(res); - samples.ForEach(x => - { - if (x.Pressure != 0.0) - { Points.Add(new DataPoint(x.Index, x.Pressure)); } - }); _to = Points.Max(x => x.Y); _from = TestName.Contains("sealtest") ? Points.FirstOrDefault(x => x.X == 0).Y : Points.Min(x => x.Y); + List titles = analyzer.Reader.GetTitles(OpenFilePath); + TitleAxisBottom = titles[0]; + TitleAxisLeft = titles[1]; - data.Clear(); + // data.Clear(); _to += 100; RaisePropertyChanged("To"); if (_from != 0) @@ -324,8 +311,10 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels IsRunning = false; PlotControl.InvalidatePlot(true); - await PrintToXpsFile(); - + if(analyzer.Reader.PrintResultsToPDFFile()) + { + await PrintToXpsFile(); + } } /// @@ -338,44 +327,24 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels if (false == File.Exists(OpenFilePath) || IsFileLocked(OpenFilePath)) return; - IAnalyzer analyzer = AnalysisService.GetAnalyzer(OpenFilePath); + var analyzer = AnalysisService.GetAnalyzer(OpenFilePath); if (analyzer == null) return; - - AnalyzerAttribute attribute = (AnalyzerAttribute)analyzer.GetType().GetCustomAttributes(typeof(AnalyzerAttribute), true).FirstOrDefault(); - - TestName = attribute.Name; - List data = CsvFile.Read(new CsvSource(OpenFilePath)).ToList(); - List samples = new List(); - - int index = 0; - int last_labelIndex = 0; + AnalyzerAttribute[] attr = analyzer.GetType().GetCustomAttributes(typeof(AnalyzerAttribute), true); + if (attr != null && attr.Count() > 0) + { + TestName = attr[0].Name; + } - foreach (var item in data) + List annotations = new List(); + var samples = analyzer.Reader.ReadScvFile(OpenFilePath, annotations); + analyzer.GetPoints(samples, Points); + if (Points.Count == 0) { - double pressure = 0; - if (item.Label == "Label") - { - item.Pressure = "0"; - item.Command = "Label"; - if (last_labelIndex == 0 || last_labelIndex < (index + 5)) - { - last_labelIndex = index; - } - } - if (double.TryParse(item.Pressure, out pressure) || !String.IsNullOrWhiteSpace(item.Command)) - { - samples.Add(new DispenserSample() - { - Pressure = pressure, - Command = String.IsNullOrWhiteSpace(item.Command) ? null : item.Command, - Index = index - }); - index++; - } + return; } - + List res = await analyzer.Process(samples, true); AnalyzerResults = new ObservableCollection(res); diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs index d5c54ab08..0f2b5a457 100644 --- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/SettingsVM.cs @@ -9,79 +9,124 @@ using Tango.SharedUI; namespace Tango.DispenserAnalyzer.UI.ViewModels { - public class SettingsVM : ViewModel, IDisposable + public class SettingVM: ViewModel { - private ObservableCollection _PBUSettings; + private string _name; - public ObservableCollection PBUTestSettings + public string Name { - get { return _PBUSettings; } - set { _PBUSettings = value; RaisePropertyChangedAuto(); } + get { return _name; } + set { _name = value; } } - private ObservableCollection _flowTestSettings; + private ObservableCollection _settings; + + public ObservableCollection Settings + { + get { return _settings; } + set { _settings = value; RaisePropertyChangedAuto(); } + } - public ObservableCollection FlowTestSettings + public SettingVM(string name) { - get { return _flowTestSettings; } - set { _flowTestSettings = value; RaisePropertyChangedAuto(); } + _settings = new ObservableCollection(); + Name = name; } - private Dictionary changedValues; + public void AddSettings(List settings) + { + settings.ForEach(x => Settings.Add(x)); + } + + + } + public class SettingsVM : ViewModel, IDisposable + { + public Dictionary ChangedValues { get; set; } + + private ObservableCollection _settings; + public ObservableCollection Settings + { + get { return _settings; } + set { _settings = value; RaisePropertyChangedAuto(); } + } + public SettingsVM() { - _PBUSettings = new ObservableCollection(); + _settings = new ObservableCollection(); + ChangedValues = new Dictionary(); InitPBUTestSettings(); - _flowTestSettings = new ObservableCollection(); - changedValues = new Dictionary(); + InitProcessSettings(); InitFlowTestSettings(); + } private void InitPBUTestSettings() { - var setting = new SettingsModel(AnalyzerSettingsEnum.PBUPassFail, "4.5 sec"); - setting.SettingValueEvent += new EventHandler(OnSettingValueChanged); - _PBUSettings.Add(setting); + SettingVM model = new SettingVM("Pressure build up"); + List list = new List(); + list.Add(new SettingsModel(AnalyzerSettingsEnum.PBUPassFail, "4.5 sec")); + model.AddSettings(list); + list.ForEach(x => x.SettingValueEvent += new EventHandler(OnSettingValueChanged)); + Settings.Add(model); } private void InitFlowTestSettings() { - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.FlowPBUPassFail, "4.5 sec")); - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.ExcludeAnalysis, "1800 reads")); - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.AvgMinValue, "1400-1850 [mbar]", true)); - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.MaxMinRange, "500 reads")); - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.MaxMinIntervals, "300 reads")); - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.MaxError, "1.5%")); - _flowTestSettings.Add(new SettingsModel(AnalyzerSettingsEnum.TakeOffMaxMin, "3")); - - _flowTestSettings.ToList().ForEach(x => x.SettingValueEvent += new EventHandler(OnSettingValueChanged)); + SettingVM model = new SettingVM("Flow test"); + List list = new List(); + + list.Add(new SettingsModel(AnalyzerSettingsEnum.FlowPBUPassFail, "4.5 sec")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.ExcludeAnalysis, "1800 reads")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.AvgMinValue, "1400-1850 [mbar]", true)); + list.Add(new SettingsModel(AnalyzerSettingsEnum.MaxMinRange, "500 reads")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.MaxMinIntervals, "300 reads")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.MaxError, "1.5%")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.TakeOffMaxMin, "3")); + list.ForEach(x => x.SettingValueEvent += new EventHandler(OnSettingValueChanged)); + model.AddSettings(list); + Settings.Add(model); + } + + private void InitProcessSettings() + { + SettingVM model = new SettingVM("Process"); + List list = new List(); + list.Add(new SettingsModel(AnalyzerSettingsEnum.TimeInterval, "0.1 sec")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.StartCalculation, "600 sec")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.EndCalculation, "900 sec")); + list.Add(new SettingsModel(AnalyzerSettingsEnum.MovingAvg, "50 points")); + list.ForEach(x => x.SettingValueEvent += new EventHandler(OnSettingValueChanged)); + model.AddSettings(list); + Settings.Add(model); } private void OnSettingValueChanged(object sender, EventArgs e) { - if(sender is SettingsModel) + if (sender is SettingsModel) { SettingsModel settingModel = sender as SettingsModel; - if(settingModel.IsRangeVisible) + if (settingModel.IsRangeVisible) { - changedValues[AnalyzerSettingsEnum.AvgMinValue] = settingModel.MinRangeValue; - changedValues[AnalyzerSettingsEnum.AvgMaxValue] = settingModel.MaxRangeValue; + ChangedValues[AnalyzerSettingsEnum.AvgMinValue] = settingModel.MinRangeValue; + ChangedValues[AnalyzerSettingsEnum.AvgMaxValue] = settingModel.MaxRangeValue; } else - changedValues[settingModel._enumName] = settingModel.PropertyValue; + ChangedValues[settingModel._enumName] = settingModel.PropertyValue; } } - + public Dictionary GetChanges() { - return changedValues; + return ChangedValues; } - + public void Dispose() { - _PBUSettings.ToList().ForEach(x => x.SettingValueEvent -= OnSettingValueChanged); - _flowTestSettings.ToList().ForEach(x => x.SettingValueEvent -= OnSettingValueChanged); + Settings.ToList().ForEach(x => { + x.Settings.ToList().ForEach(k => k.SettingValueEvent -= OnSettingValueChanged); + }); } } } -- cgit v1.3.1