summaryrefslogtreecommitdiff
path: root/grapher/Models/Calculations/AccelCalculator.cs
diff options
context:
space:
mode:
authorJacobPalecki <[email protected]>2020-09-21 14:20:18 -0700
committerGitHub <[email protected]>2020-09-21 14:20:18 -0700
commit4ec16a2ff35e0e910a13f92713d56d317b24e790 (patch)
treec4aead24d52e3002cfd3282ddd697a3766de405a /grapher/Models/Calculations/AccelCalculator.cs
parentMerge pull request #20 from JacobPalecki/GUI (diff)
parentx/y diff sens works (diff)
downloadrawaccel-4ec16a2ff35e0e910a13f92713d56d317b24e790.tar.xz
rawaccel-4ec16a2ff35e0e910a13f92713d56d317b24e790.zip
Merge pull request #21 from JacobPalecki/GUI
GUI: Icon, Separate X/Y sens mode, some fixes
Diffstat (limited to 'grapher/Models/Calculations/AccelCalculator.cs')
-rw-r--r--grapher/Models/Calculations/AccelCalculator.cs121
1 files changed, 106 insertions, 15 deletions
diff --git a/grapher/Models/Calculations/AccelCalculator.cs b/grapher/Models/Calculations/AccelCalculator.cs
index 092a7aa..a140c90 100644
--- a/grapher/Models/Calculations/AccelCalculator.cs
+++ b/grapher/Models/Calculations/AccelCalculator.cs
@@ -46,31 +46,25 @@ namespace grapher.Models.Calculations
private double XYMaxVelocity { get; set; }
private int Increment { get; set; }
+
+ private double MeasurementTime { get; set; }
- #endregion Fields
-
- #region Methods
+ private (double, double) RotationVector { get; set; }
- public void Calculate(AccelData data, ManagedAccel accel, DriverSettings settings)
- {
- ScaleByMouseSettings();
+ private (double, double) Sensitivity { get; set; }
- data.Clear();
+ #endregion Fields
- Calculate(data.Combined, accel, settings.sensitivity.x, MagnitudesCombined);
- Calculate(data.X, accel, settings.sensitivity.x, MagnitudesX);
- Calculate(data.Y, accel, settings.sensitivity.y, MagnitudesY);
- }
+ #region Methods
- public static void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection<MagnitudeData> magnitudeData)
+ public void Calculate(AccelChartData data, ManagedAccel accel, double starter, ICollection<MagnitudeData> magnitudeData)
{
double lastInputMagnitude = 0;
double lastOutputMagnitude = 0;
foreach (var magnitudeDatum in magnitudeData)
{
- var output = accel.Accelerate(magnitudeDatum.x, magnitudeDatum.y, 1);
-
+ var output = accel.Accelerate(magnitudeDatum.x, magnitudeDatum.y, MeasurementTime);
var outMagnitude = Magnitude(output.Item1, output.Item2);
var ratio = magnitudeDatum.magnitude > 0 ? outMagnitude / magnitudeDatum.magnitude : starter;
@@ -100,6 +94,77 @@ namespace grapher.Models.Calculations
data.OrderedVelocityPointsList.AddRange(data.VelocityPoints.Values.ToList());
}
+ public void CalculateCombinedDiffSens(AccelData data, ManagedAccel accel, DriverSettings settings, ICollection<MagnitudeData> magnitudeData)
+ {
+ double lastInputMagnitude = 0;
+ double lastOutputMagnitudeX = 0;
+ double lastOutputMagnitudeY = 0;
+
+ Sensitivity = GetSens(ref settings);
+
+ foreach (var magnitudeDatum in magnitudeData)
+ {
+ var output = accel.Accelerate(magnitudeDatum.x, magnitudeDatum.y, MeasurementTime);
+ var outputWithoutSens = StripThisSens(output.Item1, output.Item2);
+ var magnitudeWithoutSens = Magnitude(outputWithoutSens.Item1, outputWithoutSens.Item2);
+
+ var ratio = magnitudeDatum.magnitude > 0 ? magnitudeWithoutSens / magnitudeDatum.magnitude : 1;
+
+ if (!data.Combined.VelocityPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.Combined.VelocityPoints.Add(magnitudeDatum.magnitude, magnitudeWithoutSens);
+ }
+
+ var xRatio = settings.sensitivity.x * ratio;
+ var yRatio = settings.sensitivity.y * ratio;
+
+ if (!data.X.AccelPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.X.AccelPoints.Add(magnitudeDatum.magnitude, xRatio);
+ }
+
+ if (!data.Y.AccelPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.Y.AccelPoints.Add(magnitudeDatum.magnitude, yRatio);
+ }
+
+ var xOut = xRatio * magnitudeDatum.magnitude;
+ var yOut = yRatio * magnitudeDatum.magnitude;
+
+ var inDiff = magnitudeDatum.magnitude - lastInputMagnitude;
+ var xOutDiff = xOut - lastOutputMagnitudeX;
+ var yOutDiff = yOut - lastOutputMagnitudeY;
+ var xSlope = inDiff > 0 ? xOutDiff / inDiff : settings.sensitivity.x;
+ var ySlope = inDiff > 0 ? yOutDiff / inDiff : settings.sensitivity.y;
+
+ if (!data.X.VelocityPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.X.VelocityPoints.Add(magnitudeDatum.magnitude, xOut);
+ }
+
+ if (!data.Y.VelocityPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.Y.VelocityPoints.Add(magnitudeDatum.magnitude, yOut);
+ }
+
+ if (!data.X.GainPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.X.GainPoints.Add(magnitudeDatum.magnitude, xSlope);
+ }
+
+ if (!data.Y.GainPoints.ContainsKey(magnitudeDatum.magnitude))
+ {
+ data.Y.GainPoints.Add(magnitudeDatum.magnitude, ySlope);
+ }
+
+ lastInputMagnitude = magnitudeDatum.magnitude;
+ lastOutputMagnitudeX = xOut;
+ lastOutputMagnitudeY = yOut;
+ }
+
+ data.Combined.OrderedVelocityPointsList.AddRange(data.Combined.VelocityPoints.Values.ToList());
+ }
+
public ReadOnlyCollection<MagnitudeData> GetMagnitudes()
{
var magnitudes = new List<MagnitudeData>();
@@ -172,11 +237,37 @@ namespace grapher.Models.Calculations
return Magnitude(x, y) / time;
}
+ public static bool ShouldStripSens(ref DriverSettings settings) =>
+ settings.sensitivity.x != settings.sensitivity.y;
+
+ public static bool ShouldStripRot(ref DriverSettings settings) =>
+ settings.rotation > 0;
+
+ public static (double, double) GetSens(ref DriverSettings settings) =>
+ (settings.sensitivity.x, settings.sensitivity.y);
+
+ public static (double, double) GetRotVector(ref DriverSettings settings) =>
+ (Math.Cos(settings.rotation), Math.Sin(settings.rotation));
+
+ public static (double, double) StripSens(double outputX, double outputY, double sensitivityX, double sensitivityY) =>
+ (outputX / sensitivityX, outputY / sensitivityY);
+
+ public (double, double) StripRot(double outputX, double outputY, double rotX, double rotY) =>
+ (outputX * rotX + outputY * rotY, outputX * rotY - outputY * rotX);
+
+ public (double, double) StripThisSens(double outputX, double outputY) =>
+ StripSens(outputX, outputY, Sensitivity.Item1, Sensitivity.Item2);
+
+ public (double, double) StripThisRot(double outputX, double outputY) =>
+ StripRot(outputX, outputY, RotationVector.Item1, RotationVector.Item2);
+
public void ScaleByMouseSettings()
{
var dpiPollFactor = DPI.Data / PollRate.Data;
CombinedMaxVelocity = dpiPollFactor * Constants.MaxMultiplier;
- Increment = (int)Math.Floor(CombinedMaxVelocity / Constants.Resolution);
+ var ratio = CombinedMaxVelocity / Constants.Resolution;
+ Increment = ratio > 1 ? (int) Math.Floor(ratio) : 1;
+ MeasurementTime = Increment == 1 ? 1 / ratio : 1;
XYMaxVelocity = CombinedMaxVelocity * Constants.XYToCombinedRatio;
MagnitudesCombined = GetMagnitudes();
MagnitudesX = GetMagnitudesX();