diff options
| author | Jacob Palecki <[email protected]> | 2020-08-12 19:51:38 -0700 |
|---|---|---|
| committer | Jacob Palecki <[email protected]> | 2020-08-12 19:51:38 -0700 |
| commit | b6254f32a6cfbd40bd1919950b344160f38bf1e4 (patch) | |
| tree | 82a2a514f90b9781062b2919e2b17c4cc6f852bc | |
| parent | Reorganized solution into directories (diff) | |
| download | rawaccel-b6254f32a6cfbd40bd1919950b344160f38bf1e4.tar.xz rawaccel-b6254f32a6cfbd40bd1919950b344160f38bf1e4.zip | |
Factor accel calculations into calculation classes
| -rw-r--r-- | grapher/Models/AccelGUI.cs | 94 | ||||
| -rw-r--r-- | grapher/Models/Calculations/AccelCalculator.cs | 91 | ||||
| -rw-r--r-- | grapher/Models/Calculations/AccelData.cs | 32 | ||||
| -rw-r--r-- | grapher/Models/Charts/AccelCharts.cs | 14 | ||||
| -rw-r--r-- | grapher/Models/Charts/ChartXY.cs | 6 | ||||
| -rw-r--r-- | grapher/grapher.csproj | 2 |
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" /> |