Esempio n. 1
1
 private static void Finish(Lut values, string data, int index, int line, ref double key, ref int started, ref int malformed) {
     if (started != -1) {
         if (double.IsNaN(key)) {
             if (malformed == -1) malformed = line;
         } else {
             double value;
             if (FlexibleParser.TryParseDouble(data.Substring(started, index - started), out value)) {
                 values.Add(new LutPoint(key, value));
             } else {
                 if (malformed == -1) malformed = line;
             }
             key = double.NaN;
         }
         started = -1;
     } else if (!double.IsNaN(key)) {
         key = double.NaN;
     }
 }
Esempio n. 2
0
        public static Lut TorqueToPower(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, TorqueToPower(p.Y, p.X)));
                    }
                }
                
                result.Add(new LutPoint(rpm, TorqueToPower(torque.InterpolateLinear(rpm), rpm)));
                previousRpm = rpm;
            }

            return result.Optimize();
        }
Esempio n. 3
0
 private static void Finish(Lut values, string data, int index, int line, ref double key, ref int started, ref int malformed)
 {
     if (started != -1)
     {
         if (double.IsNaN(key))
         {
             if (malformed == -1)
             {
                 malformed = line;
             }
         }
         else
         {
             double value;
             if (FlexibleParser.TryParseDouble(data.Substring(started, index - started), out value))
             {
                 values.Add(new LutPoint(key, value));
             }
             else
             {
                 if (malformed == -1)
                 {
                     malformed = line;
                 }
             }
             key = double.NaN;
         }
         started = -1;
     }
     else if (!double.IsNaN(key))
     {
         key = double.NaN;
     }
 }
Esempio n. 4
0
 private static void Finish(Lut values, string data, int index, int line, ref double key, ref int started, ref int malformed)
 {
     if (started != -1)
     {
         if (double.IsNaN(key))
         {
             if (malformed == -1)
             {
                 AcToolsLogging.Write($@"Key is NaN at {line}");
                 malformed = line;
             }
         }
         else
         {
             if (FlexibleParser.TryParseDouble(data.Substring(started, index - started), out var value))
             {
                 values.Add(new LutPoint(key, value));
             }
             else
             {
                 if (malformed == -1)
                 {
                     AcToolsLogging.Write($@"Failed to parse key “{data.Substring(started, index - started)}” at {line}");
                     malformed = line;
                 }
             }
             key = double.NaN;
         }
         started = -1;
     }
     else if (!double.IsNaN(key))
     {
         key = double.NaN;
     }
 }
Esempio n. 5
0
        private static Lut ConvertToValues(JArray obj) {
            var values = new Lut();
            if (obj == null) return values;

            foreach (var entry in obj.OfType<JArray>()) {
                double x, y;
                if (FlexibleParser.TryParseDouble(Convert.ToString(entry[0], CultureInfo.InvariantCulture), out x) &&
                        FlexibleParser.TryParseDouble(Convert.ToString(entry[1], CultureInfo.InvariantCulture), out y)) {
                    values.Add(new LutPoint(x, y));
                }
            }

            return values;
        }
Esempio n. 6
0
        public void MinMax()
        {
            var lut = new Lut();

            lut.UpdateBoundingBox();
            Assert.AreEqual(double.NaN, lut.MinX);
            Assert.AreEqual(double.NaN, lut.MinY);
            Assert.AreEqual(double.NaN, lut.MaxX);
            Assert.AreEqual(double.NaN, lut.MaxY);

            lut.Add(new LutPoint(1d, 1d));
            lut.UpdateBoundingBox();
            Assert.AreEqual(1d, lut.MinX);
            Assert.AreEqual(1d, lut.MinY);
            Assert.AreEqual(1d, lut.MaxX);
            Assert.AreEqual(1d, lut.MaxY);

            lut.Add(new LutPoint(-1d, 2d));
            lut.UpdateBoundingBox();
            Assert.AreEqual(-1d, lut.MinX);
            Assert.AreEqual(1d, lut.MinY);
            Assert.AreEqual(1d, lut.MaxX);
            Assert.AreEqual(2d, lut.MaxY);
        }
Esempio n. 7
0
        private static Lut ConvertToValues(JArray obj)
        {
            var values = new Lut();

            if (obj == null)
            {
                return(values);
            }

            foreach (var entry in obj.OfType <JArray>().Where(x => x.Count == 2))
            {
                if (FlexibleParser.TryParseDouble(Convert.ToString(entry[0], CultureInfo.InvariantCulture), out var x) &&
                    FlexibleParser.TryParseDouble(Convert.ToString(entry[1], CultureInfo.InvariantCulture), out var y))
                {
                    values.Add(new LutPoint(x, y));
                }
            }

            return(values);
        }
Esempio n. 8
0
        public void MinMax() {
            var lut = new Lut();
            lut.UpdateBoundingBox();
            Assert.AreEqual(double.NaN, lut.MinX);
            Assert.AreEqual(double.NaN, lut.MinY);
            Assert.AreEqual(double.NaN, lut.MaxX);
            Assert.AreEqual(double.NaN, lut.MaxY);

            lut.Add(new LutPoint(1d, 1d));
            lut.UpdateBoundingBox();
            Assert.AreEqual(1d, lut.MinX);
            Assert.AreEqual(1d, lut.MinY);
            Assert.AreEqual(1d, lut.MaxX);
            Assert.AreEqual(1d, lut.MaxY);

            lut.Add(new LutPoint(-1d, 2d));
            lut.UpdateBoundingBox();
            Assert.AreEqual(-1d, lut.MinX);
            Assert.AreEqual(1d, lut.MinY);
            Assert.AreEqual(1d, lut.MaxX);
            Assert.AreEqual(2d, lut.MaxY);
        }
Esempio n. 9
0
        public static Lut LoadCarTorque(IDataWrapper data, bool considerLimiter = true, int detalization = 100) {
            /* read torque curve and engine params */
            var torqueFile = data.GetLutFile("power.lut");
            if (torqueFile.IsEmptyOrDamaged()) throw new FileNotFoundException("Cannot load power.lut", "data/power.lut");

            var engine = data.GetIniFile("engine.ini");
            if (engine.IsEmptyOrDamaged()) throw new FileNotFoundException("Cannot load engine.ini", "data/engine.ini");

            /* prepare turbos and read controllers */
            var turbos = ReadTurbos(engine);
            for (var i = 0; i < turbos.Count; i++) {
                turbos[i].Controllers = ReadControllers(data.GetIniFile($"ctrl_turbo{i}.ini"));
            }

            /* prepare torque curve and limits */
            var torque = torqueFile.Values;
            torque.UpdateBoundingBox();

            var limit = considerLimiter && engine.ContainsKey("ENGINE_DATA") ? engine["ENGINE_DATA"].GetDouble("LIMITER", torque.MaxX) : torque.MaxX;
            var startFrom = considerLimiter ? 0d : torque.MinX;

            /* build smoothed line */
            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 && p.X >= 0) {
                        result.Add(new LutPoint(p.X, ConsiderTurbo(turbos, p.X, p.Y)));
                    }
                }

                var baseTorque = torque.InterpolateLinear(rpm);
                result.Add(new LutPoint(rpm, ConsiderTurbo(turbos, rpm, baseTorque)));
                previousRpm = rpm;
            }

            return result.Optimize();
        }