summaryrefslogtreecommitdiff
path: root/grapher/Form1.cs
diff options
context:
space:
mode:
Diffstat (limited to 'grapher/Form1.cs')
-rw-r--r--grapher/Form1.cs167
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
}
}