diff options
| author | JacobPalecki <[email protected]> | 2020-09-21 14:20:18 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-09-21 14:20:18 -0700 |
| commit | 4ec16a2ff35e0e910a13f92713d56d317b24e790 (patch) | |
| tree | c4aead24d52e3002cfd3282ddd697a3766de405a /grapher/Models/Calculations/AccelCalculator.cs | |
| parent | Merge pull request #20 from JacobPalecki/GUI (diff) | |
| parent | x/y diff sens works (diff) | |
| download | rawaccel-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.cs | 121 |
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(); |