From f3740b21ad9c08d23368826d1de9eed9a89d9a11 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Sun, 2 Aug 2020 14:03:55 -0700 Subject: Move logic out of forms class into accelgui class --- grapher/AccelGUI.cs | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 grapher/AccelGUI.cs (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs new file mode 100644 index 0000000..d372869 --- /dev/null +++ b/grapher/AccelGUI.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace grapher +{ + public class AccelGUI + { + public struct MagnitudeData + { + public double magnitude; + public int x; + public int y; + } + + public static ReadOnlyCollection Magnitudes = GetMagnitudes(); + + #region constructors + + public AccelGUI( + RawAcceleration accelForm, + Chart accelerationChart, + ManagedAccel managedAccel, + AccelOptions accelOptions, + OptionXY sensitivity, + Option rotation, + OptionXY weight, + OptionXY cap, + Option offset, + Option acceleration, + Option limtOrExp, + Option midpoint) + { + AccelForm = accelForm; + AccelChart = accelerationChart; + ManagedAcceleration = managedAccel; + AccelerationOptions = accelOptions; + Sensitivity = sensitivity; + Rotation = rotation; + Weight = weight; + Cap = cap; + Offset = offset; + Acceleration = acceleration; + LimitOrExponent = limtOrExp; + Midpoint = midpoint; + + UpdateGraph(); + } + + #endregion constructors + + #region properties + + public RawAcceleration AccelForm { get; } + + public Chart AccelChart { get; } + + public ManagedAccel ManagedAcceleration { get; } + + public AccelOptions AccelerationOptions { get; } + + public OptionXY Sensitivity { get; } + + public Option Rotation { get; } + + public OptionXY Weight { get; } + + public OptionXY Cap { get; } + + public Option Offset { get; } + + public Option Acceleration { get; } + + public Option LimitOrExponent { get; } + + public Option Midpoint { get; } + + public Button WriteButton { get; } + + #endregion properties + + #region methods + + public static ReadOnlyCollection GetMagnitudes() + { + var magnitudes = new List(); + for (int i = 0; i < 100; i++) + { + for (int j = 0; j <= i; j++) + { + MagnitudeData magnitudeData; + magnitudeData.magnitude = Magnitude(i, j); + magnitudeData.x = i; + magnitudeData.y = j; + magnitudes.Add(magnitudeData); + } + } + + magnitudes.Sort((m1, m2) => m1.magnitude.CompareTo(m2.magnitude)); + + return magnitudes.AsReadOnly(); + } + + public static double Magnitude(int x, int y) + { + return Math.Sqrt(x * x + y * y); + } + + public static double Magnitude(double x, double y) + { + return Math.Sqrt(x * x + y * y); + } + + public void UpdateGraph() + { + var orderedPoints = new SortedDictionary(); + + foreach (var magnitudeData in Magnitudes) + { + var output = ManagedAcceleration.Accelerate(magnitudeData.x, magnitudeData.y, 1); + + var outMagnitude = Magnitude(output.Item1, output.Item2); + var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : Sensitivity.Fields.X; + + if (!orderedPoints.ContainsKey(magnitudeData.magnitude)) + { + orderedPoints.Add(magnitudeData.magnitude, ratio); + } + } + + var series = AccelChart.Series.FirstOrDefault(); + series.Points.Clear(); + + foreach (var point in orderedPoints) + { + series.Points.AddXY(point.Key, point.Value); + } + + } + + + #endregion methods + + } + +} -- cgit v1.2.3 From 529f18bd6ddbcd182fd03a13e3c07dc10162f036 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Sun, 2 Aug 2020 15:54:47 -0700 Subject: Add velocity graph --- grapher/AccelGUI.cs | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index d372869..9acb38e 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -25,6 +25,7 @@ namespace grapher public AccelGUI( RawAcceleration accelForm, Chart accelerationChart, + Chart velocityChart, ManagedAccel managedAccel, AccelOptions accelOptions, OptionXY sensitivity, @@ -38,6 +39,7 @@ namespace grapher { AccelForm = accelForm; AccelChart = accelerationChart; + VelocityChart = velocityChart; ManagedAcceleration = managedAccel; AccelerationOptions = accelOptions; Sensitivity = sensitivity; @@ -60,6 +62,8 @@ namespace grapher public Chart AccelChart { get; } + public Chart VelocityChart { get; } + public ManagedAccel ManagedAcceleration { get; } public AccelOptions AccelerationOptions { get; } @@ -118,7 +122,8 @@ namespace grapher public void UpdateGraph() { - var orderedPoints = new SortedDictionary(); + var orderedAccelPoints = new SortedDictionary(); + var orderedVelocityPoints = new SortedDictionary(); foreach (var magnitudeData in Magnitudes) { @@ -127,20 +132,32 @@ namespace grapher var outMagnitude = Magnitude(output.Item1, output.Item2); var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : Sensitivity.Fields.X; - if (!orderedPoints.ContainsKey(magnitudeData.magnitude)) + if (!orderedAccelPoints.ContainsKey(magnitudeData.magnitude)) + { + orderedAccelPoints.Add(magnitudeData.magnitude, ratio); + } + + if (!orderedVelocityPoints.ContainsKey(magnitudeData.magnitude)) { - orderedPoints.Add(magnitudeData.magnitude, ratio); + orderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude); } } - var series = AccelChart.Series.FirstOrDefault(); - series.Points.Clear(); + var accelSeries = AccelChart.Series.FirstOrDefault(); + accelSeries.Points.Clear(); - foreach (var point in orderedPoints) + foreach (var point in orderedAccelPoints) { - series.Points.AddXY(point.Key, point.Value); + accelSeries.Points.AddXY(point.Key, point.Value); } + var velSeries = VelocityChart.Series.FirstOrDefault(); + velSeries.Points.Clear(); + + foreach (var point in orderedVelocityPoints) + { + velSeries.Points.AddXY(point.Key, point.Value); + } } -- cgit v1.2.3 From 26b8727a8de23f829dbd95d9ec5a7f2713da7eb7 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Sun, 2 Aug 2020 18:20:29 -0700 Subject: Add gain and velocity graphs --- grapher/AccelGUI.cs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index 9acb38e..48fad7e 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -26,6 +26,7 @@ namespace grapher RawAcceleration accelForm, Chart accelerationChart, Chart velocityChart, + Chart gainChart, ManagedAccel managedAccel, AccelOptions accelOptions, OptionXY sensitivity, @@ -40,6 +41,7 @@ namespace grapher AccelForm = accelForm; AccelChart = accelerationChart; VelocityChart = velocityChart; + GainChart = gainChart; ManagedAcceleration = managedAccel; AccelerationOptions = accelOptions; Sensitivity = sensitivity; @@ -64,6 +66,8 @@ namespace grapher public Chart VelocityChart { get; } + public Chart GainChart { get; } + public ManagedAccel ManagedAcceleration { get; } public AccelOptions AccelerationOptions { get; } @@ -122,8 +126,12 @@ namespace grapher public void UpdateGraph() { - var orderedAccelPoints = new SortedDictionary(); - var orderedVelocityPoints = new SortedDictionary(); + var orderedAccelPoints = new SortedDictionary(); + var orderedVelocityPoints = new SortedDictionary(); + var orderedGainPoints = new SortedDictionary(); + + double lastInputMagnitude = 0; + double lastOutputMagnitude = 0; foreach (var magnitudeData in Magnitudes) { @@ -132,6 +140,12 @@ namespace grapher var outMagnitude = Magnitude(output.Item1, output.Item2); var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : Sensitivity.Fields.X; + var inDiff = magnitudeData.magnitude - lastInputMagnitude; + var outDiff = outMagnitude - lastOutputMagnitude; + var slope = inDiff > 0 ? outDiff / inDiff : Sensitivity.Fields.X; + lastInputMagnitude = magnitudeData.magnitude; + lastOutputMagnitude = outMagnitude; + if (!orderedAccelPoints.ContainsKey(magnitudeData.magnitude)) { orderedAccelPoints.Add(magnitudeData.magnitude, ratio); @@ -141,6 +155,11 @@ namespace grapher { orderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude); } + + if (!orderedGainPoints.ContainsKey(magnitudeData.magnitude)) + { + orderedGainPoints.Add(magnitudeData.magnitude, slope); + } } var accelSeries = AccelChart.Series.FirstOrDefault(); @@ -158,6 +177,14 @@ namespace grapher { velSeries.Points.AddXY(point.Key, point.Value); } + + var gainSeries = GainChart.Series.FirstOrDefault(); + gainSeries.Points.Clear(); + + foreach (var point in orderedGainPoints) + { + gainSeries.Points.AddXY(point.Key, point.Value); + } } -- cgit v1.2.3 From dba84307479550135db0bccce9554da09c74aa74 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Mon, 3 Aug 2020 13:20:17 -0700 Subject: Add tool menu to enable\disable charts --- grapher/AccelGUI.cs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index 48fad7e..b8f1bed 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -24,9 +24,7 @@ namespace grapher public AccelGUI( RawAcceleration accelForm, - Chart accelerationChart, - Chart velocityChart, - Chart gainChart, + AccelCharts accelCharts, ManagedAccel managedAccel, AccelOptions accelOptions, OptionXY sensitivity, @@ -39,9 +37,7 @@ namespace grapher Option midpoint) { AccelForm = accelForm; - AccelChart = accelerationChart; - VelocityChart = velocityChart; - GainChart = gainChart; + AccelCharts = accelCharts; ManagedAcceleration = managedAccel; AccelerationOptions = accelOptions; Sensitivity = sensitivity; @@ -62,11 +58,7 @@ namespace grapher public RawAcceleration AccelForm { get; } - public Chart AccelChart { get; } - - public Chart VelocityChart { get; } - - public Chart GainChart { get; } + public AccelCharts AccelCharts { get; } public ManagedAccel ManagedAcceleration { get; } @@ -162,7 +154,7 @@ namespace grapher } } - var accelSeries = AccelChart.Series.FirstOrDefault(); + var accelSeries = AccelCharts.SensitivityChart.Series.FirstOrDefault(); accelSeries.Points.Clear(); foreach (var point in orderedAccelPoints) @@ -170,7 +162,7 @@ namespace grapher accelSeries.Points.AddXY(point.Key, point.Value); } - var velSeries = VelocityChart.Series.FirstOrDefault(); + var velSeries = AccelCharts.VelocityChart.Series.FirstOrDefault(); velSeries.Points.Clear(); foreach (var point in orderedVelocityPoints) @@ -178,7 +170,7 @@ namespace grapher velSeries.Points.AddXY(point.Key, point.Value); } - var gainSeries = GainChart.Series.FirstOrDefault(); + var gainSeries = AccelCharts.GainChart.Series.FirstOrDefault(); gainSeries.Points.Clear(); foreach (var point in orderedGainPoints) -- cgit v1.2.3 From 4e63da9daa1a3869caef1ac6c45c598aaf5a4b6e Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Mon, 3 Aug 2020 14:07:21 -0700 Subject: Start work on reading from driver --- grapher/AccelGUI.cs | 1 + 1 file changed, 1 insertion(+) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index b8f1bed..8ef411f 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -49,6 +49,7 @@ namespace grapher LimitOrExponent = limtOrExp; Midpoint = midpoint; + ManagedAcceleration.ReadFromDriver(); UpdateGraph(); } -- cgit v1.2.3 From c0b8b46f84eda91d01ce2eead3777c31be96bd60 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Tue, 4 Aug 2020 15:08:48 -0700 Subject: Data rebind for faster graph update --- grapher/AccelGUI.cs | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index 8ef411f..85d2416 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -34,7 +34,8 @@ namespace grapher Option offset, Option acceleration, Option limtOrExp, - Option midpoint) + Option midpoint, + Button writeButton) { AccelForm = accelForm; AccelCharts = accelCharts; @@ -48,6 +49,12 @@ namespace grapher Acceleration = acceleration; LimitOrExponent = limtOrExp; Midpoint = midpoint; + WriteButton = writeButton; + + OrderedAccelPoints = new SortedDictionary(); + OrderedVelocityPoints = new SortedDictionary(); + OrderedGainPoints = new SortedDictionary(); + ManagedAcceleration.ReadFromDriver(); UpdateGraph(); @@ -83,6 +90,12 @@ namespace grapher public Button WriteButton { get; } + public SortedDictionary OrderedAccelPoints { get; } + + public SortedDictionary OrderedVelocityPoints { get; } + + public SortedDictionary OrderedGainPoints { get; } + #endregion properties #region methods @@ -119,9 +132,9 @@ namespace grapher public void UpdateGraph() { - var orderedAccelPoints = new SortedDictionary(); - var orderedVelocityPoints = new SortedDictionary(); - var orderedGainPoints = new SortedDictionary(); + OrderedAccelPoints.Clear(); + OrderedVelocityPoints.Clear(); + OrderedGainPoints.Clear(); double lastInputMagnitude = 0; double lastOutputMagnitude = 0; @@ -139,50 +152,38 @@ namespace grapher lastInputMagnitude = magnitudeData.magnitude; lastOutputMagnitude = outMagnitude; - if (!orderedAccelPoints.ContainsKey(magnitudeData.magnitude)) + if (!OrderedAccelPoints.ContainsKey(magnitudeData.magnitude)) { - orderedAccelPoints.Add(magnitudeData.magnitude, ratio); + OrderedAccelPoints.Add(magnitudeData.magnitude, ratio); } - if (!orderedVelocityPoints.ContainsKey(magnitudeData.magnitude)) + if (!OrderedVelocityPoints.ContainsKey(magnitudeData.magnitude)) { - orderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude); + OrderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude); } - if (!orderedGainPoints.ContainsKey(magnitudeData.magnitude)) + if (!OrderedGainPoints.ContainsKey(magnitudeData.magnitude)) { - orderedGainPoints.Add(magnitudeData.magnitude, slope); + OrderedGainPoints.Add(magnitudeData.magnitude, slope); } + } var accelSeries = AccelCharts.SensitivityChart.Series.FirstOrDefault(); accelSeries.Points.Clear(); - foreach (var point in orderedAccelPoints) - { - accelSeries.Points.AddXY(point.Key, point.Value); - } - var velSeries = AccelCharts.VelocityChart.Series.FirstOrDefault(); velSeries.Points.Clear(); - foreach (var point in orderedVelocityPoints) - { - velSeries.Points.AddXY(point.Key, point.Value); - } - var gainSeries = AccelCharts.GainChart.Series.FirstOrDefault(); gainSeries.Points.Clear(); - foreach (var point in orderedGainPoints) - { - gainSeries.Points.AddXY(point.Key, point.Value); - } + accelSeries.Points.DataBindXY(OrderedAccelPoints.Keys, OrderedAccelPoints.Values); + velSeries.Points.DataBindXY(OrderedVelocityPoints.Keys, OrderedVelocityPoints.Values); + gainSeries.Points.DataBindXY(OrderedGainPoints.Keys, OrderedGainPoints.Values); } - #endregion methods - } } -- cgit v1.2.3 From 2ada822c137329005a31c7f49f9e4d9aa8eb51b2 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Tue, 4 Aug 2020 15:10:16 -0700 Subject: Remove unnecessary .clear() call --- grapher/AccelGUI.cs | 5 ----- 1 file changed, 5 deletions(-) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index 85d2416..c701054 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -170,13 +170,8 @@ namespace grapher } var accelSeries = AccelCharts.SensitivityChart.Series.FirstOrDefault(); - accelSeries.Points.Clear(); - var velSeries = AccelCharts.VelocityChart.Series.FirstOrDefault(); - velSeries.Points.Clear(); - var gainSeries = AccelCharts.GainChart.Series.FirstOrDefault(); - gainSeries.Points.Clear(); accelSeries.Points.DataBindXY(OrderedAccelPoints.Keys, OrderedAccelPoints.Values); velSeries.Points.DataBindXY(OrderedVelocityPoints.Keys, OrderedVelocityPoints.Values); -- cgit v1.2.3 From f27ee9d9d7f9adad6dc55e964421277a4a2262d8 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Tue, 4 Aug 2020 15:16:45 -0700 Subject: Even nicer --- grapher/AccelGUI.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'grapher/AccelGUI.cs') diff --git a/grapher/AccelGUI.cs b/grapher/AccelGUI.cs index c701054..c660afe 100644 --- a/grapher/AccelGUI.cs +++ b/grapher/AccelGUI.cs @@ -169,13 +169,9 @@ namespace grapher } - var accelSeries = AccelCharts.SensitivityChart.Series.FirstOrDefault(); - var velSeries = AccelCharts.VelocityChart.Series.FirstOrDefault(); - var gainSeries = AccelCharts.GainChart.Series.FirstOrDefault(); - - accelSeries.Points.DataBindXY(OrderedAccelPoints.Keys, OrderedAccelPoints.Values); - velSeries.Points.DataBindXY(OrderedVelocityPoints.Keys, OrderedVelocityPoints.Values); - gainSeries.Points.DataBindXY(OrderedGainPoints.Keys, OrderedGainPoints.Values); + AccelCharts.SensitivityChart.Series[0].Points.DataBindXY(OrderedAccelPoints.Keys, OrderedAccelPoints.Values); + AccelCharts.VelocityChart.Series[0].Points.DataBindXY(OrderedVelocityPoints.Keys, OrderedVelocityPoints.Values); + AccelCharts.GainChart.Series[0].Points.DataBindXY(OrderedGainPoints.Keys, OrderedGainPoints.Values); } #endregion methods -- cgit v1.2.3