summaryrefslogtreecommitdiff
path: root/grapher/Models/Calculations/Data/AccelDataXYDirectional.cs
blob: b139719f0abb4d0ee0567ae4ea151c9299170437 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using grapher.Models.Charts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace grapher.Models.Calculations.Data
{
    public class AccelDataXYDirectional : IAccelData
    {
        public AccelDataXYDirectional(
            EstimatedPoints xPoints,
            EstimatedPoints yPoints,
            AccelCalculator calculator)
        {
            XPoints = xPoints;
            YPoints = yPoints;
            Calculator = calculator;
            AngleToData = new AccelChartData[Constants.AngleDivisions];
            FillAngleData();
        }

        public AccelChartData X { get => AngleToData[0]; }

        public AccelChartData Y { get => AngleToData[Constants.AngleDivisions-1]; }

        public double SensitivityMax { get => X.MaxAccel; }

        public double SensitivityMin { get => X.MinAccel; }

        public double GainMax { get => X.MaxGain; }

        public double GainMin { get => X.MinGain; }

        private AccelChartData[] AngleToData { get; }

        private EstimatedPoints XPoints { get; }

        private EstimatedPoints YPoints { get; }

        private AccelCalculator Calculator { get; }

        public void CalculateDots(double x, double y, double timeInMs)
        {
            var outVelocity = AccelCalculator.Velocity(x, y, timeInMs);
            var outAngle = Math.Atan2(Math.Abs(y),Math.Abs(x));
            var nearestAngleDivision = AccelCalculator.NearestAngleDivision(outAngle);
            var data = AngleToData[nearestAngleDivision];
            var index = data.GetVelocityIndex(outVelocity);
            var inVelocity = data.VelocityPoints.ElementAt(index).Key;
            var xPoints = X.ValuesAtIndex(index);
            var yPoints = Y.ValuesAtIndex(index);
            XPoints.Sensitivity.Set(inVelocity, xPoints.Item1);
            XPoints.Velocity.Set(inVelocity, xPoints.Item2);
            XPoints.Gain.Set(inVelocity, xPoints.Item3);
            YPoints.Sensitivity.Set(inVelocity, yPoints.Item1);
            YPoints.Velocity.Set(inVelocity, yPoints.Item2);
            YPoints.Gain.Set(inVelocity, yPoints.Item3);
        }

        public void Clear()
        {
            foreach (var data in AngleToData)
            {
                data.Clear();
            }
        }

        public void CreateGraphData(ManagedAccel accel, Profile settings)
        {
            Clear();
            Calculator.CalculateDirectional(AngleToData, accel, settings, Calculator.SimulatedDirectionalInput);
        }

        private void FillAngleData()
        {
            for(int i=0; i < Constants.AngleDivisions; i++)
            {
                AngleToData[i] = new AccelChartData();
            }
        }
    }
}