diff options
Diffstat (limited to 'grapher/Form1.cs')
| -rw-r--r-- | grapher/Form1.cs | 167 |
1 files changed, 146 insertions, 21 deletions
diff --git a/grapher/Form1.cs b/grapher/Form1.cs index 47ef1d9..3807d2a 100644 --- a/grapher/Form1.cs +++ b/grapher/Form1.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Drawing; @@ -54,10 +55,20 @@ namespace grapher public partial class RawAcceleration : Form { + public struct MagnitudeData + { + public double magnitude; + public int x; + public int y; + } + + #region Constructor + + public static ReadOnlyCollection<MagnitudeData> Magnitudes = GetMagnitudes(); + public RawAcceleration() { InitializeComponent(); - modifier_args args; args.degrees = 0; @@ -79,38 +90,105 @@ namespace grapher IntPtr args_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(args)); Marshal.StructureToPtr(args, args_ptr, false); - var managedAccel = new ManagedAccel(args_ptr); + ManagedAcceleration = new ManagedAccel(args_ptr); Marshal.FreeHGlobal(args_ptr); - var orderedPoints = new SortedDictionary<double, double>(); + Sensitivity = new OptionXY(sensitivityBoxX, sensitivityBoxY, sensXYLock, this, 1, sensitivityLabel, "Sensitivity"); + Rotation = new Option(rotationBox, this, 0, rotationLabel, "Rotation"); + Weight = new OptionXY(weightBoxFirst, weightBoxSecond, weightXYLock, this, 1, weightLabel, "Weight"); + Cap = new OptionXY(capBoxX, capBoxY, capXYLock, this, 0, capLabel, "Cap"); + Offset = new Option(offsetBox, this, 0, offsetLabel, "Offset"); - for (int i = 0; i < 100; i++) - { - for (int j = 0; j <= i; j++) + // The name and layout of these options is handled by AccelerationOptions object. + Acceleration = new Option(new Field(accelerationBox, this, 0), constantOneLabel); + LimitOrExponent = new Option(new Field(limitBox, this, 2), constantTwoLabel); + Midpoint = new Option(new Field(midpointBox, this, 0), constantThreeLabel); + + AccelerationOptions = new AccelOptions( + accelTypeDrop, + new Option[] + { + Offset, + Acceleration, + LimitOrExponent, + Midpoint, + }, + new OptionXY[] { - var output = managedAccel.Accelerate(i, j, 1); + Weight, + Cap, + }, + writeButton); - var inMagnitude = Magnitude(i,j); - var outMagnitude = Magnitude(output.Item1, output.Item2); - var ratio = inMagnitude > 0 ? outMagnitude / inMagnitude : 0; + UpdateGraph(); + + this.AccelerationChart.ChartAreas[0].AxisX.RoundAxisValues(); - if (!orderedPoints.ContainsKey(inMagnitude)) - { - orderedPoints.Add(inMagnitude, ratio); - } - } - } + this.AccelerationChart.ChartAreas[0].AxisX.ScaleView.Zoomable = true; + this.AccelerationChart.ChartAreas[0].AxisY.ScaleView.Zoomable = true; - var series = this.AccelerationChart.Series.FirstOrDefault(); - series.Points.Clear(); + this.AccelerationChart.ChartAreas[0].AxisY.ScaleView.MinSize = 0.01; + this.AccelerationChart.ChartAreas[0].AxisY.ScaleView.SmallScrollSize = 0.001; - foreach (var point in orderedPoints) + this.AccelerationChart.ChartAreas[0].CursorY.Interval = 0.001; + + this.AccelerationChart.ChartAreas[0].CursorX.AutoScroll = true; + this.AccelerationChart.ChartAreas[0].CursorY.AutoScroll = true; + + this.AccelerationChart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + this.AccelerationChart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true; + + this.AccelerationChart.ChartAreas[0].CursorX.IsUserEnabled = true; + this.AccelerationChart.ChartAreas[0].CursorY.IsUserEnabled = true; + } + + #endregion Constructor + + #region Properties + + public ManagedAccel ManagedAcceleration { get; set; } + + private AccelOptions AccelerationOptions { get; set; } + + private OptionXY Sensitivity { get; set; } + + private Option Rotation { get; set; } + + private OptionXY Weight { get; set; } + + private OptionXY Cap { get; set; } + + private Option Offset { get; set; } + + private Option Acceleration { get; set; } + + private Option LimitOrExponent { get; set; } + + private Option Midpoint { get; set; } + + #endregion Properties + + #region Methods + + public static ReadOnlyCollection<MagnitudeData> GetMagnitudes() + { + var magnitudes = new List<MagnitudeData>(); + for (int i = 0; i < 100; i++) { - series.Points.AddXY(point.Key, point.Value); + for (int j = 0; j <= i; j++) + { + MagnitudeData magnitudeData; + magnitudeData.magnitude = Magnitude(i, j); + magnitudeData.x = i; + magnitudeData.y = j; + magnitudes.Add(magnitudeData); + } } - this.AccelerationChart.ChartAreas[0].AxisX.RoundAxisValues(); + magnitudes.Sort((m1, m2) => m1.magnitude.CompareTo(m2.magnitude)); + + return magnitudes.AsReadOnly(); } public static double Magnitude(int x, int y) @@ -127,5 +205,52 @@ namespace grapher { } + + private void UpdateGraph() + { + var orderedPoints = new SortedDictionary<double, double>(); + + 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 = this.AccelerationChart.Series.FirstOrDefault(); + series.Points.Clear(); + + foreach (var point in orderedPoints) + { + series.Points.AddXY(point.Key, point.Value); + } + } + + private void writeButton_Click(object sender, EventArgs e) + { + ManagedAcceleration.UpdateAccel( + AccelerationOptions.AccelerationIndex, + Rotation.Field.Data, + Sensitivity.Fields.X, + Sensitivity.Fields.Y, + Weight.Fields.X, + Weight.Fields.Y, + Cap.Fields.X, + Cap.Fields.Y, + Offset.Field.Data, + Acceleration.Field.Data, + LimitOrExponent.Field.Data, + Midpoint.Field.Data); + ManagedAcceleration.WriteToDriver(); + UpdateGraph(); + } + + #endregion Methods } } |