public double Process(double rpm, double boost)
        {
            double input;

            switch (Input)
            {
            case ControllerInput.Rpms:
                input = rpm;
                break;

            case ControllerInput.Gear:
                input = 1;
                break;

            case ControllerInput.Gas:
                input = 1;
                break;

            case ControllerInput.Brake:
                input = 0;
                break;

            case ControllerInput.SpeedKmh:
                input = 60d;
                break;

            default:
                input = 0d;
                break;
            }

            var    inputValue = Lut?.InterpolateLinear(input) ?? 0d;
            double resultValue;

            switch (Combinator)
            {
            case Combinator.Add:
                resultValue = boost + inputValue;
                break;

            case Combinator.Mult:
                resultValue = boost * inputValue;
                break;

            default:
                return(boost);
            }

            if (!double.IsNaN(UpLimit) && UpLimit < resultValue)
            {
                resultValue = UpLimit;
            }

            if (!double.IsNaN(DownLimit) && DownLimit > resultValue)
            {
                resultValue = DownLimit;
            }

            return(resultValue);
        }
Example #2
0
        public double Process(double rpm, double boost)
        {
            double input;

            switch (Input)
            {
            case ControllerInput.Rpms:
                input = rpm;
                break;

            default:
                input = 0d;
                break;
            }

            if (!double.IsNaN(UpLimit) && UpLimit < input)
            {
                input = UpLimit;
            }

            if (!double.IsNaN(DownLimit) && DownLimit > input)
            {
                input = DownLimit;
            }


            var value = Lut?.InterpolateLinear(input) ?? 0d;

            switch (Combinator)
            {
            case Combinator.Add:
                return(boost + value);

            case Combinator.Mult:
                return(boost * value);

            default:
                return(boost);
            }
        }
Example #3
0
        public static Lut PowerToTorque(Lut torque, int detalization = 100)
        {
            torque.UpdateBoundingBox();

            var startFrom = torque.MinX;
            var limit     = torque.MaxX;

            var result = new Lut();

            var previousTorquePoint = 0;
            var previousRpm         = 0d;

            for (var i = 0; i <= detalization; i++)
            {
                var rpm = detalization == 0 ? limit : (limit - startFrom) * i / detalization + startFrom;

                for (var j = previousTorquePoint; j < torque.Count; j++)
                {
                    var p = torque[j];

                    if (p.X > rpm)
                    {
                        previousTorquePoint = j > 0 ? j - 1 : 0;
                        break;
                    }

                    if ((i == 0 || p.X > previousRpm) && p.X < rpm)
                    {
                        result.Add(new LutPoint(p.X, PowerToTorque(p.Y, p.X)));
                    }
                }

                result.Add(new LutPoint(rpm, PowerToTorque(torque.InterpolateLinear(rpm), rpm)));
                previousRpm = rpm;
            }

            return(Result(result));
        }