aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI
diff options
context:
space:
mode:
authorVictoria Plitt <Victoria.Plitt@twine-s.com>2019-12-18 13:23:37 +0200
committerVictoria Plitt <Victoria.Plitt@twine-s.com>2019-12-18 13:23:37 +0200
commit70e3f2699a500666d1ca4e4d5db2dbaafb339e80 (patch)
treedbf37c58cdc4586f5e3462fb6d9e0d7efde26171 /Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI
parentf8fc1e8e52e9758c23607b5e9e2dd1c379a37117 (diff)
downloadTango-70e3f2699a500666d1ca4e4d5db2dbaafb339e80.tar.gz
Tango-70e3f2699a500666d1ca4e4d5db2dbaafb339e80.zip
DispenserAnalyser. Added dynamic and flow test.
Diffstat (limited to 'Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI')
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs3
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs5
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs2
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs2
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs76
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs166
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs51
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs (renamed from Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyer.cs)17
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config50
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml132
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs29
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Tango.DispenserAnalyzer.UI.csproj19
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs150
-rw-r--r--Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config6
14 files changed, 600 insertions, 108 deletions
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 5aecc4e99..d929c5825 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalysisService.cs
@@ -12,7 +12,8 @@ namespace Tango.DispenserAnalyzer.UI.Analysis
public static IAnalyzer GetAnalyzer(String fileName)
{
var analyzerTypes = typeof(AnalysisService).Assembly.GetTypes().Where(x => typeof(IAnalyzer).IsAssignableFrom(x)).ToList();
- var analyzerType = analyzerTypes.SingleOrDefault(x => fileName.ToLower().Contains(x.GetCustomAttribute<AnalyzerAttribute>().Name));
+ var words = fileName.Split().Select(x => x.Trim(' '));
+ var analyzerType = analyzerTypes.FirstOrDefault(x => words.Contains(x.GetCustomAttribute<AnalyzerAttribute>().Name, StringComparer.OrdinalIgnoreCase));
return (analyzerType != null) ? Activator.CreateInstance(analyzerType) as IAnalyzer : null;
}
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 0abf97117..0ff67c748 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultBase.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
@@ -33,8 +34,8 @@ namespace Tango.DispenserAnalyzer.UI.Analysis
{
aProp.Name = prop.Name;
}
-
- aProp.Value = prop.GetValue(this).ToString();
+ object val = prop.GetValue(this);
+ aProp.Value = (val is double) ? ((double)val).ToString("F") : val.ToString();
props.Add(aProp);
}
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs
index ee0e5673d..a0cc2c2c7 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/AnalyzerResultValue.cs
@@ -10,7 +10,7 @@ namespace Tango.DispenserAnalyzer.UI.Analysis
public enum AnalyzerResultValue
{
//Undetermined
- [Description("test-tube-empty")]
+ [Description("Information")]
Undetermined,
[Description("Check")]
Passed,
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 9ca05ec1e..6a07e3a42 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analysis/IAnalyzer.cs
@@ -10,6 +10,6 @@ namespace Tango.DispenserAnalyzer.UI.Analysis
[Analyzer("INTERFACE")]
public interface IAnalyzer
{
- Task<IAnalyzerResult> Process(List<DispenserSample> csvRows);
+ Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows);
}
}
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs
new file mode 100644
index 000000000..2cf38fdd6
--- /dev/null
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/DynamicSealingAnalyzer.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DispenserAnalyzer.UI.Analysis;
+using Tango.DispenserAnalyzer.UI.Models;
+
+namespace Tango.DispenserAnalyzer.UI.Analyzers
+{
+ [Analyzer("dynamic")]
+ public class DynamicSealingAnalzyer : IAnalyzer
+ {
+ public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows)
+ {
+ return Task.Factory.StartNew<List<IAnalyzerResult>>(() =>
+ {
+ List<IAnalyzerResult> results = new List<IAnalyzerResult>();
+ List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>();
+
+ 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();
+
+ //dynamic test
+ if (pairs.Count > 0 && pairs[0].Count > 1)
+ {
+ DynamicSealingAnalyzerResult result = new DynamicSealingAnalyzerResult();
+ List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pairs[0][0].Index && x.Index < pairs[0][1].Index).ToList();
+ int period = 10;
+ result.Result = AnalyzerResultValue.Passed;
+ //var sum_average = Enumerable.Range(0, rangeTestValues.Count - period).Select(n => rangeTestValues.Select(x=>x.Pressure).Skip(n).Take(periodLength).Average()).ToList();
+ for (int counter = 0; counter <= rangeTestValues.Count - period; )
+ {
+ var sum1 = rangeTestValues.Skip(counter++).Take(period).Average(t => t.Pressure);
+ var sum2 = rangeTestValues.Skip(counter++).Take(period).Average(t => t.Pressure);
+ if(sum1 > sum2 && sum1 - sum2 > 8)
+ {
+ result.DynamicSealingResult = "test failed";
+ result.Result = AnalyzerResultValue.Failed;
+ break;
+ }
+ }
+ results.Add(result);
+ }
+ SealingAnalyzerResult sealingAnalyzerResult = new SealingAnalyzerResult();
+ //start sealing test
+ if (pairs.Count > 1 && pairs[1].Count > 1)
+ {
+ List<DispenserSample> rangeStartTestValues = csvRows.Where(x => x.Index > pairs[1][0].Index && x.Index < pairs[1][1].Index).ToList();
+ sealingAnalyzerResult.AverageStartTestValue = rangeStartTestValues.Average(t => t.Pressure);
+ }
+ //end sealing of test
+ if (pairs.Count > 2 && pairs[2].Count > 1)
+ {
+ List<DispenserSample> rangeEndTestValues = csvRows.Where(x => x.Index > pairs[2][0].Index && x.Index < pairs[2][1].Index).ToList();
+ sealingAnalyzerResult.AverageEndTestValue = rangeEndTestValues.Average(t => t.Pressure);
+ }
+ sealingAnalyzerResult.AbsoluteTestValue = Math.Abs(sealingAnalyzerResult.AverageEndTestValue - sealingAnalyzerResult.AverageStartTestValue);
+ sealingAnalyzerResult.Result = sealingAnalyzerResult.AbsoluteTestValue < 8 ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
+ results.Add(sealingAnalyzerResult);
+ return results;
+ });
+ }
+ public class DynamicSealingAnalyzerResult : AnalyzerResultBase
+ {
+ [Description("Dynamic sealing result")]
+ public string DynamicSealingResult { get; set; }
+
+ public DynamicSealingAnalyzerResult()
+ {
+ DynamicSealingResult = "test succeed";
+ Result = AnalyzerResultValue.Undetermined;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs
new file mode 100644
index 000000000..15ab21575
--- /dev/null
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/FlowAnalyser.cs
@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DispenserAnalyzer.UI.Analysis;
+using Tango.DispenserAnalyzer.UI.Models;
+using MathNet.Numerics.LinearAlgebra;
+
+namespace Tango.DispenserAnalyzer.UI.Analyzers
+{
+ [Analyzer("flow")]
+ public class FlowAnalyser : IAnalyzer
+ {
+ public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows)
+ {
+ return Task.Factory.StartNew<List<IAnalyzerResult>>(() =>
+ {
+ List <IAnalyzerResult> results = new List<IAnalyzerResult>();
+ List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>();
+ 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();
+
+ for ( int index = 0; index < pairs.Count(); index++)
+ {
+ var pair = pairs[index];
+ if (pair.Count != 2)
+ continue;
+ //testing PBU
+ List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pair[0].Index && x.Index < pair[1].Index).ToList();
+ if (index%2 == 1)//testing Flow-error
+ {
+ int count_before = rangeTestValues.Count;
+ ProcessOutliers processOutliers = new ProcessOutliers();
+ List<DispenserSample> peaks = new List<DispenserSample>();
+ // processOutliers.RemoveOutliers(rangeTestValues, peaks);
+ int count_after = rangeTestValues.Count;
+
+ FlowAnalyzerResult result = new FlowAnalyzerResult();
+ result.AverageValue = rangeTestValues.Average(t => t.Pressure);
+ result.MinValue = rangeTestValues.Min(t => t.Pressure);
+ result.MaxValue = rangeTestValues.Max(t => t.Pressure);
+ result.TotalValue = result.AverageValue == 0 ? 0 : (result.MaxValue - result.MinValue) * 100 / result.AverageValue;
+ int startIndex = rangeTestValues.Count > 0 ? rangeTestValues[0].Index :0;
+ int lastIndex = rangeTestValues.Count > 0 ? rangeTestValues[rangeTestValues.Count-1].Index : 0;
+ int delayIndex = (startIndex + 10000) < lastIndex ? startIndex + 10000 : lastIndex;
+ int deltaIndex = (delayIndex + 1000) < lastIndex ? delayIndex + 1000 : lastIndex;
+ List<DispenserSample> filterTestValues = rangeTestValues.Where(x => x.Index >= delayIndex && x.Index < deltaIndex).ToList();
+ result.FilterAverageValue = filterTestValues.Average(t => t.Pressure);
+ result.FilterMinValue = filterTestValues.Min(t => t.Pressure);
+ result.FilterMaxValue = filterTestValues.Max(t => t.Pressure);
+ result.FilterTotalValue = result.FilterAverageValue == 0 ? 0 : (result.FilterMaxValue - result.FilterMinValue) * 100 / result.FilterAverageValue;
+ result.Result = (result.FilterTotalValue <= 1.5 && result.TotalValue <= 3) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
+ results.Add(result);
+ }
+ else//testing PBU
+ {
+ PrimingAnalyzerResult result = new PrimingAnalyzerResult();
+ int avgMinIndex = rangeTestValues.Select(x => x.Index).Min();
+ int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max();
+ double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds;
+ result.Time = totalsec.ToString() + " sec";
+ result.Result = (totalsec <= 11 && totalsec >= 8) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
+ results.Add(result);
+ }
+ }
+ return results;
+ });
+ }
+
+ public class FlowAnalyzerResult : AnalyzerResultBase
+ {
+ [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("Total Value Peak to peak")]
+ public double TotalValue { get; set; }
+
+ [Description("Local Average Value")]
+ public double FilterAverageValue { get; set; }
+
+ [Description("Local Max Value")]
+ public double FilterMaxValue { get; set; }
+
+ [Description("Local Min Value")]
+ public double FilterMinValue { get; set; }
+
+ [Description("Local Total Value Peak to peak")]
+ public double FilterTotalValue { get; set; }
+
+ public FlowAnalyzerResult()
+ {
+ AverageValue = MaxValue = MinValue = TotalValue = FilterAverageValue = FilterMaxValue = FilterMinValue = FilterTotalValue = 0.0;
+ Result = AnalyzerResultValue.Undetermined;
+ }
+ }
+
+
+ public class ProcessOutliers
+ {
+ private decimal _IQR;
+
+ public decimal IQR
+ {
+ get { return _IQR; }
+ set { _IQR = value; }
+ }
+
+ public ProcessOutliers()
+ {
+ IQR = 0.0m;
+ }
+
+ /// <summary>
+ /// Creates the iqr - The interquartile range is defined as the difference between the upper quartile (the highest 25%) and the lower quartile (the lowest 25%) of a data set..
+ /// </summary>
+ public void CreateIQR(List<DispenserSample> source)
+ {
+ int count = source.Count();
+ if (count < 4)
+ return;
+ List<DispenserSample> data = source.OrderBy(t => t.Pressure).ToList();
+ var LeftList = data.Take(count / 2).ToList();
+ var RightList = data.Skip(LeftList.Count).ToList();
+
+ decimal Q1 = (decimal)LeftList[LeftList.Count/2 + LeftList.Count % 2].Pressure;
+ decimal Q3 = (decimal)RightList[RightList.Count / 2 + RightList.Count % 2].Pressure;
+ IQR = Q3 - Q1;
+ }
+ public void RemoveOutliers(List<DispenserSample> source, List<DispenserSample> peaks)
+ {
+ if (source.Count == 0){
+ return;
+ }
+ // Calculate Mean value of the set.
+ double meanValue = source.Average(t => t.Pressure);
+
+ // Find a value is farthest from the Mean.
+ DispenserSample farthestFromMean = source.OrderByDescending(x => Math.Abs(x.Pressure - meanValue)).First();
+ CreateIQR(source);
+
+ // Remove Object if its value is more than 1.5*IQR from the Mean.
+ decimal maxRange = (1.1m * IQR);
+
+ //if ((farthestFromMean < minValue) || (farthestFromMean > maxValue))
+ if ((decimal)Math.Abs(farthestFromMean.Pressure - meanValue) > maxRange)
+ {
+ peaks.Add(farthestFromMean);
+ source.Remove(farthestFromMean);
+ RemoveOutliers(source, peaks);
+ return;
+ }
+ // No outlier found, we're finished.
+ return;
+ }
+ }
+
+
+ }
+}
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs
new file mode 100644
index 000000000..0756d8ccf
--- /dev/null
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/PrimingAnalyzer.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DispenserAnalyzer.UI.Analysis;
+using Tango.DispenserAnalyzer.UI.Models;
+
+
+namespace Tango.DispenserAnalyzer.UI.Analyzers
+{
+ [Analyzer("priming")]
+ public class PrimingAnalyzer : IAnalyzer
+ {
+ public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows)
+ {
+ return Task.Factory.StartNew<List<IAnalyzerResult>>(() =>
+ {
+ List<IAnalyzerResult> results = new List<IAnalyzerResult>();
+ List<DispenserSample> commands = csvRows.Where(x => x.Command == "Label").ToList<DispenserSample>();
+ PrimingAnalyzerResult result = new PrimingAnalyzerResult();
+ 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();
+ //start range of test
+ if (pairs.Count > 0 && pairs[0].Count > 1)
+ {
+ List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pairs[0][0].Index && x.Index < pairs[0][1].Index).ToList();
+ int avgMinIndex = rangeTestValues.Select(x => x.Index).Min();
+ int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max();
+ double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds;
+ result.Time = totalsec.ToString() + " sec";
+ result.Result = (totalsec <= 11 && totalsec >= 8) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
+ }
+ results.Add(result);
+ return results;
+ });
+ }
+ }
+ public class PrimingAnalyzerResult : AnalyzerResultBase
+ {
+ [Description("PBU Time")]
+ public String Time { get; set; }
+
+
+ public PrimingAnalyzerResult()
+ {
+ Time = "";
+ Result = AnalyzerResultValue.Undetermined;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyer.cs b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs
index 911976821..144e4a4c8 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyer.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/Analyzers/SealingAnalyzer.cs
@@ -10,13 +10,14 @@ using Tango.DispenserAnalyzer.UI.Models;
namespace Tango.DispenserAnalyzer.UI.Analyzers
{
[Analyzer("seal")]
- public class SealingAnalyer : IAnalyzer
+ public class SealingAnalyzer : IAnalyzer
{
- public Task<IAnalyzerResult> Process(List<DispenserSample> csvRows)
+ public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows)
{
- return Task.Factory.StartNew<IAnalyzerResult>(() =>
+ return Task.Factory.StartNew<List<IAnalyzerResult>>(() =>
{
- List<DispenserSample> commands = csvRows.Where(x => x.Command != null).ToList< DispenserSample>();
+ List<IAnalyzerResult> results = new List<IAnalyzerResult>();
+ List<DispenserSample> commands = csvRows.Where(x => x.Command!= null && x.Command.ToLower().Contains("label")).ToList< DispenserSample>();
SealingAnalyzerResult result = new SealingAnalyzerResult();
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();
//start range of test
@@ -24,9 +25,6 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers
{
List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pairs[0][0].Index && x.Index < pairs[0][1].Index).ToList();
result.AverageStartTestValue = rangeTestValues.Average(t => t.Pressure);
- //int avgMinIndex = rangeTestValues.Select(x => x.Index).Min();
- //int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max();
- //result.Time = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 10).TotalSeconds.ToString() + " sec";
}
//end range of test
if (pairs.Count > 1 && pairs[1].Count > 1)
@@ -36,7 +34,8 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers
}
result.AbsoluteTestValue = Math.Abs(result.AverageEndTestValue - result.AverageStartTestValue);
result.Result = result.AbsoluteTestValue < 8 ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
- return result;
+ results.Add(result);
+ return results;
});
}
}
@@ -47,8 +46,6 @@ namespace Tango.DispenserAnalyzer.UI.Analyzers
public double AverageStartTestValue { get; set; }
[Description("Average End Test Value")]
public double AverageEndTestValue { get; set; }
- //[Description("Average Duration Time")]
- //public String Time { get; set; }
[Description("Absolute Value")]
public double AbsoluteTestValue { get; set; }
public SealingAnalyzerResult()
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config
index 731f6de6c..f9370449f 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/App.config
@@ -1,6 +1,54 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="5.0.5.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-1.2.2.0" newVersion="1.2.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-1.4.2.0" newVersion="1.4.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml
index 1d4b2e431..5d6f3ad92 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml
@@ -3,42 +3,51 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
+ xmlns:oxy="http://oxyplot.org/wpf"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:local="clr-namespace:Tango.DispenserAnalyzer.UI"
xmlns:vm ="clr-namespace:Tango.DispenserAnalyzer.UI.ViewModels"
mc:Ignorable="d"
- Title="Dispenser Analyser" Height="1000" Width="800" WindowStartupLocation="CenterScreen" WindowStyle="SingleBorderWindow" ResizeMode="NoResize" Foreground="#202020"
+ Title="Dispenser Analyser" Height="1000" Width="800" WindowStartupLocation="CenterScreen" WindowStyle="SingleBorderWindow" ResizeMode="CanResize" Foreground="#202020"
d:DataContext="{d:DesignInstance Type=vm:MainWindowVM, IsDesignTimeCreatable=False}">
<Window.Resources>
<converters:EnumToDescriptionConverter x:Key="EnumToDescriptionConverter" />
<converters:IsNullToVisibilityConverter x:Key="IsNullToVisibilityConverter"/>
+ <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
+ <converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" />
+ <Style TargetType="ScrollBar">
+ <Setter Property="Background" Value="#B9E7E9E9"/>
+ </Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="60"/>
- <RowDefinition Height="2*"/>
<RowDefinition Height="1*"/>
+ <RowDefinition Height="400"/>
</Grid.RowDefinitions>
- <Grid Grid.Row="0" Margin="20 20 20 20">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*" />
+ </Grid.ColumnDefinitions>
+ <Grid Grid.Row="0" Margin="10 20 10 20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="100"></ColumnDefinition>
</Grid.ColumnDefinitions>
- <TextBox x:Name="tbPath" BorderThickness="1" FontSize="16" VerticalContentAlignment="Center" IsReadOnly="False" Grid.Column="0" Margin="0 0 20 0" Text="{Binding OpenFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AllowDrop="True" PreviewDrop="TextBlock_PreviewDrop" PreviewDragOver="TextBox_PreviewDragOver" BorderBrush="Silver"></TextBox>
+ <TextBox x:Name="tbPath" BorderThickness="1" FontSize="16" VerticalContentAlignment="Center" IsReadOnly="False" Grid.Column="0" Margin="0 0 20 0" Text="{Binding OpenFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AllowDrop="True" PreviewDrop="TextBlock_PreviewDrop" PreviewDragOver="TextBox_PreviewDragOver" BorderBrush="Silver" Padding="5 0 0 0 "></TextBox>
<Button Grid.Column="1" Command="{Binding OpenCSVFileCommand}">Browse</Button>
</Grid>
- <Button Grid.Row="1" Margin="20 0 20 20" Command="{Binding GenerateCommand}">GENERATE</Button>
+ <Button Grid.Row="1" Margin="10 0 10 20" Command="{Binding GenerateCommand}">GENERATE</Button>
<Grid Grid.Row="2">
- <Border BorderBrush="Silver" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10" Background="#202020">
- <DockPanel>
- <TextBlock DockPanel.Dock="Top" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" Padding="10" Foreground="Silver" Text="{Binding TestName}"></TextBlock>
- <lvc:CartesianChart Series="{Binding PressedValuesCollection}" LegendLocation="Bottom" DisableAnimations="True" DataTooltip="{x:Null}" Hoverable="False" >
- <!--<lvc:CartesianChart.DataTooltip>
- <lvc:DefaultTooltip BulletSize="20" Background="#7EFFFFFF" Foreground="green"/>
- </lvc:CartesianChart.DataTooltip>-->
+ <Border BorderBrush="Silver" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10">
+ <!--<lvc:CartesianChart LegendLocation="Bottom" DisableAnimations="True" DataTooltip="{x:Null}" Hoverable="False" >
+ <lvc:CartesianChart.Series>
+ <lvc:LineSeries Values="{Binding Values}" PointGeometry="{x:Null}" Title="{Binding TestName}"/>
+ </lvc:CartesianChart.Series>
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="TIME" Foreground="Silver" Labels="{Binding Labels}">
<lvc:Axis.Separator>
@@ -53,38 +62,89 @@
</lvc:Axis.Separator>
</lvc:Axis>
</lvc:CartesianChart.AxisY>
- </lvc:CartesianChart>
- </DockPanel>
+ </lvc:CartesianChart>-->
+ <oxy:Plot
+ Title="{Binding TestName}" x:Name="PressurePlot" >
+ <oxy:Plot.Series >
+ <oxy:LineSeries ItemsSource="{Binding Points}" Color="#73B6EC"/>
+ </oxy:Plot.Series>
+ <oxy:Plot.Axes>
+ <oxy:LinearAxis Position="Bottom" Title = "Time" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True"/>
+ <oxy:LinearAxis Position="Left" Title = "Pressure" MajorGridlineStyle="Solid" MinorGridlineStyle="Dot" IsZoomEnabled="True" Minimum="{Binding From}" Maximum="{Binding To}"/>
+ </oxy:Plot.Axes>
+ </oxy:Plot>
</Border>
</Grid>
- <Grid Grid.Row="3">
- <Border Visibility="Visible" BorderThickness="1" BorderBrush="Silver" CornerRadius="5" Margin="10">
- <StackPanel Margin="3">
- <Label Height="30" Content="RESULT" Background="LightSkyBlue" />
- <Separator Height="5"/>
- <!--<Border BorderThickness="1" BorderBrush="Silver" VerticalAlignment="Stretch">-->
- <Grid Margin="10 0 20 0">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="1*"></ColumnDefinition>
- <ColumnDefinition Width="200"></ColumnDefinition>
- </Grid.ColumnDefinitions>
- <ItemsControl Grid.Column="0" ItemsSource="{Binding AnalyzerResult.Properties}">
+
+ <Border Visibility="Visible" BorderThickness="1" BorderBrush="Silver" CornerRadius="5" Margin="10" Grid.Row="3">
+ <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+ <Label Height="30" Content="RESULT" Background="LightSkyBlue" Grid.Row="0" DockPanel.Dock="Top" />
+
+ <ScrollViewer VerticalScrollBarVisibility="Auto" Visibility="Visible" Focusable="True" Foreground="Black" Margin="5"
+ Style="{StaticResource {x:Type ScrollViewer}}">
+ <ScrollViewer.Resources>
+ <sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">15</sys:Double>
+ </ScrollViewer.Resources>
+ <ItemsControl ItemsSource="{Binding AnalyzerResults}" Margin="0 0 10 10 ">
+ <!--<ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel Orientation="Vertical"/>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>-->
<ItemsControl.ItemTemplate>
<DataTemplate>
- <StackPanel Orientation="Horizontal" Margin="5">
- <TextBlock Margin="5 0 0 0" FontSize="16"><Run Text="{Binding Name}"></Run> <Run Text=" : "></Run><Run Text="{Binding Value,StringFormat=0}"></Run></TextBlock>
- </StackPanel>
+ <Border HorizontalAlignment="Stretch" Margin="10 10 0 0" VerticalAlignment="Stretch" BorderThickness="1" BorderBrush="Silver">
+ <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="1*"/>
+ <ColumnDefinition Width="300"/>
+ </Grid.ColumnDefinitions>
+ <ItemsControl ItemsSource="{Binding Properties}" Grid.Column="0" >
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal" Margin="5">
+ <TextBlock Margin="5 0 0 0" FontSize="12"><Run Text="{Binding Name}"></Run> <Run Text=" : "></Run><Run Text="{Binding Value,StringFormat=0}"></Run></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ <Border Grid.Column="1" HorizontalAlignment="Center" Margin="10 0 0 0" VerticalAlignment="Center">
+ <materialDesign:PackIcon Kind="{Binding Result, Converter= {StaticResource EnumToDescriptionConverter}}" Width="60" Height="60" HorizontalContentAlignment="Center" VerticalAlignment="Center" >
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Foreground" Value="Orange"></Setter>
+ <Style.Triggers>
+ <Trigger Property="Kind" Value="Check">
+ <Setter Property="Foreground" Value="green"></Setter>
+ </Trigger>
+ <Trigger Property="Kind" Value="CloseCircle">
+ <Setter Property="Foreground" Value="Red"></Setter>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </Border>
+ </Grid>
+ </Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
- <Border Grid.Column="1" HorizontalAlignment="Stretch" Margin="10 0 0 0" VerticalAlignment="Stretch" Visibility="{Binding AnalyzerResult, Converter={StaticResource IsNullToVisibilityConverter}}">
- <materialDesign:PackIcon Kind="{Binding AnalyzerResult.Result, Converter= {StaticResource EnumToDescriptionConverter}}" Width="Auto" Height="Auto" Foreground="Green" HorizontalContentAlignment="Center" />
- </Border>
- </Grid>
- <!--</Border>-->
- </StackPanel>
+ </ScrollViewer>
+
+ </DockPanel>
</Border>
- </Grid>
+
+ <Grid Grid.Row="1" Grid.RowSpan="3"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ Visibility="{Binding IsRunning,Converter={StaticResource BooleanToVisibilityConverter}}"
+ Background="#8BFFFFFF">
+ <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
+ <!--<mahapps:ProgressRing Foreground="#007ACC" Width="80" Height="80"></mahapps:ProgressRing>-->
+ <TextBlock Text="Loading..." FontStyle="Italic" FontSize="30" VerticalAlignment="Center"></TextBlock>
+ </StackPanel>
+ </Grid>
</Grid>
</Window>
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 c343e9919..18551cbb3 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/MainWindow.xaml.cs
@@ -1,4 +1,6 @@
-using System;
+using OxyPlot;
+using OxyPlot.Axes;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -22,10 +24,20 @@ namespace Tango.DispenserAnalyzer.UI
/// </summary>
public partial class MainWindow : Window
{
+ MainWindowVM _vm;
+ OxyPlot.Wpf.Axis xAxisValues;
+ OxyPlot.Wpf.Axis yAxisValues;
public MainWindow()
{
InitializeComponent();
- DataContext = new MainWindowVM();
+ _vm = new MainWindowVM();
+ DataContext = _vm;
+ CompositionTarget.Rendering += CompositionTargetRendering;
+
+ foreach (var ax in PressurePlot.Axes)
+ ax.Maximum = ax.Minimum = Double.NaN;
+
+
}
private void TextBlock_PreviewDrop(object sender, DragEventArgs e)
@@ -52,5 +64,18 @@ namespace Tango.DispenserAnalyzer.UI
e.Handled = true;
}
}
+
+ private void CompositionTargetRendering(object sender, EventArgs e)
+ {
+ //_vm.UpdateModel();
+ if(_vm.ResetAllAxes)
+ {
+ _vm.ResetAllAxes = false;
+ foreach (var ax in PressurePlot.Axes)
+ ax.Maximum = ax.Minimum = Double.NaN;
+ PressurePlot.ResetAllAxes();
+ }
+ PressurePlot.InvalidatePlot(true);
+ }
}
}
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 75fcf9956..a5654125d 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
@@ -50,8 +50,21 @@
<Reference Include="MaterialDesignThemes.Wpf">
<HintPath>..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
+ <Reference Include="MathNet.Numerics, Version=4.9.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\MathNet.Numerics.4.9.0\lib\net461\MathNet.Numerics.dll</HintPath>
+ </Reference>
+ <Reference Include="OxyPlot, Version=2.0.0.0, Culture=neutral, PublicKeyToken=638079a8f0bd61e9, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\OxyPlot.Core.2.0.0\lib\net45\OxyPlot.dll</HintPath>
+ </Reference>
+ <Reference Include="OxyPlot.Wpf, Version=2.0.0.0, Culture=neutral, PublicKeyToken=75e952ba404cdbb0, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\OxyPlot.Wpf.2.0.0\lib\net45\OxyPlot.Wpf.dll</HintPath>
+ </Reference>
+ <Reference Include="ReachFramework" />
<Reference Include="System" />
<Reference Include="System.Data" />
+ <Reference Include="System.Numerics" />
+ <Reference Include="System.Printing" />
+ <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
@@ -77,7 +90,10 @@
<Compile Include="Analysis\AnalysisService.cs" />
<Compile Include="Analysis\IAnalyzerResult.cs" />
<Compile Include="Analysis\IAnalyzer.cs" />
- <Compile Include="Analyzers\SealingAnalyer.cs" />
+ <Compile Include="Analyzers\DynamicSealingAnalyzer.cs" />
+ <Compile Include="Analyzers\FlowAnalyser.cs" />
+ <Compile Include="Analyzers\PrimingAnalyzer.cs" />
+ <Compile Include="Analyzers\SealingAnalyzer.cs" />
<Compile Include="Analysis\AnalyzerAttribute.cs" />
<Compile Include="Models\DispenserCsvRow.cs" />
<Compile Include="Models\DispenserSample.cs" />
@@ -114,6 +130,7 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
+ <None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
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 d14587fd8..25e1bfbd0 100644
--- a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/ViewModels/MainWindowVM.cs
@@ -16,6 +16,9 @@ using System.Windows.Input;
using Tango.DispenserAnalyzer.UI.Analysis;
using System.Reflection;
using Tango.DispenserAnalyzer.UI.Analyzers;
+using System.Windows;
+using System.Windows.Threading;
+using OxyPlot;
namespace Tango.DispenserAnalyzer.UI.ViewModels
{
@@ -29,29 +32,31 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels
{
if(value != null && _openFilePath != value)
{
- PressedValuesCollection.Clear();
- AnalyzerResult = null;
_openFilePath = value;
+ ResetSettings();
RaisePropertyChangedAuto();
GenerateCommand.RaiseCanExecuteChanged();
}
}
}
- private string _testName;
+ private string _testName = "";
public string TestName
{
- get { return _testName; }
+ get { return _testName.ToUpper() + " TEST"; }
set { _testName = value; RaisePropertyChangedAuto(); }
}
-
- private ObservableCollection<String> _labels;
- public ObservableCollection<String> Labels
+
+ private IList<DataPoint> _points;
+ public IList<DataPoint> Points
{
- get { return _labels; }
- set { _labels = value; RaisePropertyChangedAuto(); }
+ get { return _points; }
+ set
+ {
+ _points = value;
+ RaisePropertyChangedAuto();
+ }
}
-
private int _step;
public int XStep
{
@@ -59,17 +64,6 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels
set { _step = value; RaisePropertyChangedAuto(); }
}
- private SeriesCollection _pressedValuesCollection;
- public SeriesCollection PressedValuesCollection
- {
- get { return _pressedValuesCollection; }
- set
- {
- _pressedValuesCollection = value;
- RaisePropertyChangedAuto();
- }
- }
-
private double _from;
public double From
{
@@ -89,12 +83,22 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels
_to = value; RaisePropertyChangedAuto();
}
}
+ public bool ResetAllAxes { get; set; }
- private IAnalyzerResult analyzerResult;
- public IAnalyzerResult AnalyzerResult
+ private bool _isRunning;
+ /// <summary>
+ /// Gets or sets a value indicating whether this instance is running.
+ /// </summary>
+ public bool IsRunning
+ {
+ get { return _isRunning; }
+ set { _isRunning = value; RaisePropertyChangedAuto(); }
+ }
+ private ObservableCollection<IAnalyzerResult> _analyzerResults;
+ public ObservableCollection<IAnalyzerResult> AnalyzerResults
{
- get { return analyzerResult; }
- set { analyzerResult = value; RaisePropertyChangedAuto(); }
+ get { return _analyzerResults; }
+ set { _analyzerResults = value; RaisePropertyChangedAuto(); }
}
public Func<double, string> YFormatter { get; set; }
@@ -106,16 +110,19 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels
{
OpenCSVFileCommand = new RelayCommand(OpenCSVFile);
GenerateCommand = new RelayCommand(Generate, CanGenerate);
- PressedValuesCollection = new SeriesCollection();
- Labels = new ObservableCollection<string>() {};
YFormatter = value => value.ToString();
_from = 0;
_to = 1;
XStep = 1;
- AnalyzerResult = null;
- }
+ AnalyzerResults = new ObservableCollection<IAnalyzerResult>();
+ _isRunning = false;
+ ResetAllAxes = false;
+
+ this.Points = new List<DataPoint>();
+ }
+ #region Read File
private void OpenCSVFile()
{
OpenFileDialog dlg = new OpenFileDialog();
@@ -128,42 +135,68 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels
}
catch (Exception ex)
{
- //_notification.ShowError($"An error occurred while trying to import the benchmark file.\n{ex.FlattenMessage()}");
+ MessageBox.Show("An error occurred while trying to import the CSV file. " + ex.Message,
+ "Warning",
+ MessageBoxButton.OK,
+ MessageBoxImage.Warning);
}
}
}
+ protected virtual bool IsFileLocked(string filePath)
+ {
+ FileStream stream = null;
+ try
+ {
+ stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None);
+ }
+ catch (IOException ex)
+ {
+ MessageBox.Show("Warning: " + ex.Message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
+ return true;
+ }
+ finally
+ {
+ if (stream != null)
+ stream.Close();
+ }
+ return false;
+ }
+ #endregion
+ #region Generate
public bool CanGenerate()
{
return (OpenFilePath!= null && OpenFilePath.Length != 0 && File.Exists(OpenFilePath));
}
private async void Generate()
{
+ if (IsFileLocked(OpenFilePath))
+ return;
+ ResetSettings();
+
IAnalyzer analyzer = AnalysisService.GetAnalyzer(OpenFilePath);
if (analyzer == null)
return;
+ IsRunning = true;
AnalyzerAttribute attribute = (AnalyzerAttribute)analyzer.GetType().GetCustomAttributes(typeof(AnalyzerAttribute),true).FirstOrDefault();
- Series pressed_values = new LineSeries()
- {
- Title = attribute.Name,
- Values = new ChartValues<double>(),
- PointGeometry = null,
- };
+
TestName = attribute.Name;
- Labels = new ObservableCollection<string>();
List<DispenserCsvRow> data = CsvFile.Read<DispenserCsvRow>(new CsvSource(OpenFilePath)).ToList();
List<DispenserSample> samples = new List<DispenserSample>();
To = 0;
From = 0;
int index = 0;
- List<object> listValues = new List<object>();
- List<string> listLabel = new List<string>();
bool in_test_range = false;
foreach (var item in data)
{
double pressure = 0;
+ if(item.Label == "Label")
+ {
+ item.Pressure = "0";
+ item.Command = "Label";
+ }
if (double.TryParse(item.Pressure, out pressure) || !String.IsNullOrWhiteSpace(item.Command))
{
samples.Add(new DispenserSample(){
@@ -176,31 +209,42 @@ namespace Tango.DispenserAnalyzer.UI.ViewModels
{
in_test_range = !in_test_range;
}
- if( pressure != 0 )//&& listValues.Count< 10000)
+ if( pressure != 0 )
{
- if (listValues.Count == 0)
+ if (TestName.Contains( "SEAL") && Points.Count ==0)
{
- From = pressure - 100;//????
+ _from = pressure;
}
- listLabel.Add(index.ToString());
- listValues.Add(pressure);
+ else
+ _from = Math.Min(pressure, _from);
_to = Math.Max(pressure, _to);
+ Points.Add(new DataPoint(index, pressure));
}
index++;
}
}
-
+ data.Clear();
_to += 100;
RaisePropertyChanged("To");
+ if(_from != 0)
+ _from -= 100;
+ RaisePropertyChanged("From");
+ XStep = (int)(Points.Count / 5);
+
+ List<IAnalyzerResult> res = await analyzer.Process(samples);
+ AnalyzerResults = new ObservableCollection<IAnalyzerResult>(res);
+
+ IsRunning = false;
+ }
+ #endregion
- Labels = listLabel.ToObservableCollection<string>();
- XStep = (int)(Labels.Count / 5);
-
- pressed_values.Values.AddRange(listValues.AsEnumerable());
- PressedValuesCollection.Clear();
- PressedValuesCollection.Add(pressed_values);
-
- AnalyzerResult = await analyzer.Process(samples);
+ private void ResetSettings()
+ {
+ Points.Clear();
+ ResetAllAxes = true;
+ AnalyzerResults.Clear();
+ TestName = "";
}
+
}
}
diff --git a/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config
new file mode 100644
index 000000000..910d0953f
--- /dev/null
+++ b/Software/Visual_Studio/Utilities/Tango.DispenserAnalyzer.UI/packages.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="MathNet.Numerics" version="4.9.0" targetFramework="net461" />
+ <package id="OxyPlot.Core" version="2.0.0" targetFramework="net461" />
+ <package id="OxyPlot.Wpf" version="2.0.0" targetFramework="net461" />
+</packages> \ No newline at end of file