summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Palecki <[email protected]>2020-08-12 19:51:38 -0700
committerJacob Palecki <[email protected]>2020-08-12 19:51:38 -0700
commitb6254f32a6cfbd40bd1919950b344160f38bf1e4 (patch)
tree82a2a514f90b9781062b2919e2b17c4cc6f852bc
parentReorganized solution into directories (diff)
downloadrawaccel-b6254f32a6cfbd40bd1919950b344160f38bf1e4.tar.xz
rawaccel-b6254f32a6cfbd40bd1919950b344160f38bf1e4.zip
Factor accel calculations into calculation classes
-rw-r--r--grapher/Models/AccelGUI.cs94
-rw-r--r--grapher/Models/Calculations/AccelCalculator.cs91
-rw-r--r--grapher/Models/Calculations/AccelData.cs32
-rw-r--r--grapher/Models/Charts/AccelCharts.cs14
-rw-r--r--grapher/Models/Charts/ChartXY.cs6
-rw-r--r--grapher/grapher.csproj2
6 files changed, 150 insertions, 89 deletions
diff --git a/grapher/Models/AccelGUI.cs b/grapher/Models/AccelGUI.cs
index 54564b3..5a46a73 100644
--- a/grapher/Models/AccelGUI.cs
+++ b/grapher/Models/AccelGUI.cs
@@ -1,4 +1,5 @@
-using System;
+using grapher.Models.Calculations;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
@@ -11,14 +12,6 @@ namespace grapher
{
public class AccelGUI
{
- public struct MagnitudeData
- {
- public double magnitude;
- public int x;
- public int y;
- }
-
- public static ReadOnlyCollection<MagnitudeData> Magnitudes = GetMagnitudes();
#region constructors
@@ -50,11 +43,7 @@ namespace grapher
LimitOrExponent = limtOrExp;
Midpoint = midpoint;
WriteButton = writeButton;
-
- OrderedAccelPoints = new SortedDictionary<double, double>();
- OrderedVelocityPoints = new SortedDictionary<double, double>();
- OrderedGainPoints = new SortedDictionary<double, double>();
-
+ AccelData = new AccelData();
ManagedAcceleration.ReadFromDriver();
UpdateGraph();
@@ -90,88 +79,17 @@ namespace grapher
public Button WriteButton { get; }
- public SortedDictionary<double, double> OrderedAccelPoints { get; }
-
- public SortedDictionary<double, double> OrderedVelocityPoints { get; }
-
- public SortedDictionary<double, double> OrderedGainPoints { get; }
+ public AccelData AccelData { get; }
#endregion properties
#region methods
- public static ReadOnlyCollection<MagnitudeData> GetMagnitudes()
- {
- var magnitudes = new List<MagnitudeData>();
- 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()
{
- OrderedAccelPoints.Clear();
- OrderedVelocityPoints.Clear();
- OrderedGainPoints.Clear();
-
- double lastInputMagnitude = 0;
- double lastOutputMagnitude = 0;
-
- 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;
-
- var inDiff = magnitudeData.magnitude - lastInputMagnitude;
- var outDiff = outMagnitude - lastOutputMagnitude;
- var slope = inDiff > 0 ? outDiff / inDiff : Sensitivity.Fields.X;
-
- if (!OrderedAccelPoints.ContainsKey(magnitudeData.magnitude))
- {
- OrderedAccelPoints.Add(magnitudeData.magnitude, ratio);
- }
-
- if (!OrderedVelocityPoints.ContainsKey(magnitudeData.magnitude))
- {
- OrderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude);
- }
-
- if (!OrderedGainPoints.ContainsKey(magnitudeData.magnitude))
- {
- OrderedGainPoints.Add(magnitudeData.magnitude, slope);
- }
-
- lastInputMagnitude = magnitudeData.magnitude;
- lastOutputMagnitude = outMagnitude;
- }
-
- AccelCharts.SensitivityChart.ChartX.Series[0].Points.DataBindXY(OrderedAccelPoints.Keys, OrderedAccelPoints.Values);
- AccelCharts.VelocityChart.ChartX.Series[0].Points.DataBindXY(OrderedVelocityPoints.Keys, OrderedVelocityPoints.Values);
- AccelCharts.GainChart.ChartX.Series[0].Points.DataBindXY(OrderedGainPoints.Keys, OrderedGainPoints.Values);
+ AccelCalculator.Calculate(AccelData, ManagedAcceleration, Sensitivity.Fields.X);
+ AccelCharts.Bind(AccelData);
}
#endregion methods
diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs
new file mode 100644
index 0000000..2d8d892
--- /dev/null
+++ b/grapher/Models/Calculations/AccelCalculator.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace grapher.Models.Calculations
+{
+ public static class AccelCalculator
+ {
+ public struct MagnitudeData
+ {
+ public double magnitude;
+ public int x;
+ public int y;
+ }
+
+ public static ReadOnlyCollection<MagnitudeData> Magnitudes = GetMagnitudes();
+
+ public static void Calculate(AccelData data, ManagedAccel accel, double starter)
+ {
+ data.Clear();
+
+ double lastInputMagnitude = 0;
+ double lastOutputMagnitude = 0;
+
+ foreach (var magnitudeData in Magnitudes)
+ {
+ var output = accel.Accelerate(magnitudeData.x, magnitudeData.y, 1);
+
+ var outMagnitude = Magnitude(output.Item1, output.Item2);
+ var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : starter;
+
+ var inDiff = magnitudeData.magnitude - lastInputMagnitude;
+ var outDiff = outMagnitude - lastOutputMagnitude;
+ var slope = inDiff > 0 ? outDiff / inDiff : starter;
+
+ if (!data.OrderedAccelPoints.ContainsKey(magnitudeData.magnitude))
+ {
+ data.OrderedAccelPoints.Add(magnitudeData.magnitude, ratio);
+ }
+
+ if (!data.OrderedVelocityPoints.ContainsKey(magnitudeData.magnitude))
+ {
+ data.OrderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude);
+ }
+
+ if (!data.OrderedGainPoints.ContainsKey(magnitudeData.magnitude))
+ {
+ data.OrderedGainPoints.Add(magnitudeData.magnitude, slope);
+ }
+
+ lastInputMagnitude = magnitudeData.magnitude;
+ lastOutputMagnitude = outMagnitude;
+ }
+
+ }
+
+ public static ReadOnlyCollection<MagnitudeData> GetMagnitudes()
+ {
+ var magnitudes = new List<MagnitudeData>();
+ 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);
+ }
+
+ }
+}
diff --git a/grapher/Models/Calculations/AccelData.cs b/grapher/Models/Calculations/AccelData.cs
new file mode 100644
index 0000000..d304660
--- /dev/null
+++ b/grapher/Models/Calculations/AccelData.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace grapher.Models.Calculations
+{
+ public class AccelData
+ {
+ public AccelData()
+ {
+ OrderedAccelPoints = new SortedDictionary<double, double>();
+ OrderedVelocityPoints = new SortedDictionary<double, double>();
+ OrderedGainPoints = new SortedDictionary<double, double>();
+ }
+
+ public SortedDictionary<double, double> OrderedAccelPoints { get; }
+
+ public SortedDictionary<double, double> OrderedVelocityPoints { get; }
+
+ public SortedDictionary<double, double> OrderedGainPoints { get; }
+
+ public void Clear()
+ {
+ OrderedAccelPoints.Clear();
+ OrderedVelocityPoints.Clear();
+ OrderedGainPoints.Clear();
+ }
+
+ }
+}
diff --git a/grapher/Models/Charts/AccelCharts.cs b/grapher/Models/Charts/AccelCharts.cs
index 9952016..4ed44c7 100644
--- a/grapher/Models/Charts/AccelCharts.cs
+++ b/grapher/Models/Charts/AccelCharts.cs
@@ -1,4 +1,5 @@
-using System;
+using grapher.Models.Calculations;
+using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
@@ -55,8 +56,17 @@ namespace grapher
public ToolStripMenuItem EnableVelocityAndGain { get; }
+ private bool Combined { get; set; }
+
private int FormBorderHeight { get; }
+ public void Bind(AccelData data)
+ {
+ SensitivityChart.Bind(data.OrderedAccelPoints);
+ VelocityChart.Bind(data.OrderedVelocityPoints);
+ GainChart.Bind(data.OrderedGainPoints);
+ }
+
private void OnEnableClick(object sender, EventArgs e)
{
EnableVelocityAndGain.Checked = !EnableVelocityAndGain.Checked;
@@ -99,6 +109,7 @@ namespace grapher
VelocityChart.SetSeparate();
GainChart.SetSeparate();
UpdateFormWidth();
+ Combined = false;
}
private void ShowCombined()
@@ -107,6 +118,7 @@ namespace grapher
VelocityChart.SetCombined();
GainChart.SetCombined();
UpdateFormWidth();
+ Combined = true;
}
private void UpdateFormWidth()
diff --git a/grapher/Models/Charts/ChartXY.cs b/grapher/Models/Charts/ChartXY.cs
index 4bb1bd5..a57801e 100644
--- a/grapher/Models/Charts/ChartXY.cs
+++ b/grapher/Models/Charts/ChartXY.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -89,6 +90,11 @@ namespace grapher
public bool Combined { get; private set; }
+ public void Bind(IDictionary data)
+ {
+ ChartX.Series[0].Points.DataBindXY(data.Keys, data.Values);
+ }
+
public void SetCombined()
{
if (!Combined)
diff --git a/grapher/grapher.csproj b/grapher/grapher.csproj
index fe29bfd..cc36a5e 100644
--- a/grapher/grapher.csproj
+++ b/grapher/grapher.csproj
@@ -47,6 +47,8 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Models\Calculations\AccelCalculator.cs" />
+ <Compile Include="Models\Calculations\AccelData.cs" />
<Compile Include="Models\Charts\AccelCharts.cs" />
<Compile Include="Models\AccelGUI.cs" />
<Compile Include="Models\Options\AccelOptions.cs" />