コード例 #1
0
        public void LoadGraph(IEnumerable <CSVEntry> PowerRun, Color Clr, string Name)
        {
            float MinTime = float.MaxValue;
            float MaxTime = float.MinValue;

            foreach (CSVEntry Entry in PowerRun)
            {
                if (Entry.DeviceTime < MinTime)
                {
                    MinTime = Entry.DeviceTime;
                }

                if (Entry.DeviceTime > MaxTime)
                {
                    MaxTime = Entry.DeviceTime;
                }

                //series.Points.AddXY(Entry.RPM, Entry.HP);
            }

            CSVEntry FirstEntry = PowerRun.First();
            int      ItemCount  = FirstEntry.Length;

            for (int i = 0; i < ItemCount; i++)
            {
                if (i == 2)
                {
                    continue;
                }

                Series series = CreateSeries(Name + "_" + FirstEntry.GetIndexName(i), MinTime, MaxTime, Utils.RandomColor());
                PrintGraph(PowerRun, series, i);
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: sbarisic/EngineCalculator
        public static void FindNearest(IEnumerable <CSVEntry> PowerRun, int RPM, out CSVEntry Prev, out CSVEntry Next)
        {
            Prev = PowerRun.Where(D => (D.RPM - RPM) < 0).LastOrDefault();

            /*if (Prev.RPM > RPM)
             *      Prev = null;*/

            int Skip = 1;

            if (Prev == null)
            {
                Skip = 0;
            }

            Next = PowerRun.Where(D => (D.RPM - RPM) > 0).Skip(Skip).FirstOrDefault();
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: sbarisic/EngineCalculator
        /*static void LoadAndDisplayRun(GraphForm Frm, string InputName, string RunName, Color Clr) {
         *      IEnumerable<CSVEntry> PowerRunNew = LoadRun(InputName, false);
         *      Frm.LoadGraph(PowerRunNew, Clr, RunName);
         * }*/

        static IEnumerable <CSVEntry> LoadRun(string InputName, bool UseNewMethod)
        {
            string[]        InputLines    = File.ReadAllLines(InputName);
            List <CSVEntry> ParsedEntries = new List <CSVEntry>();

            for (int i = 0; i < InputLines.Length; i++)
            {
                if (i == 0)
                {
                    string[] Names = InputLines[i].Split(new[] { ',' }).Select(StripQuotes).ToArray();

                    for (int j = 0; j < Names.Length; j++)
                    {
                        switch (Names[j])
                        {
                        case "Fuel/Air commanded equivalence ratio ()":
                            AFR_Idx = j;
                            break;

                        case "Throttle position (%)":
                            TPS_Idx = j;
                            break;

                        case "Engine RPM (rpm)":
                            RPM_Idx = j;
                            break;

                        case "Vehicle speed (km/h)":
                            SPD_Idx = j;
                            break;

                        case "Intake manifold absolute pressure (kPa)":
                            MAP_Idx = j;
                            break;
                        }
                    }
                }
                else
                {
                    CSVEntry Ent = new CSVEntry(InputLines[i]);

                    if (Ent.IsValid())
                    {
                        ParsedEntries.Add(Ent);
                    }
                }
            }

            ParsedEntries.OrderBy(E => E.Time);
            float MinTime     = ParsedEntries.Min(E => E.DeviceTime);
            float MaxThrottle = ParsedEntries.Max(E => E.TPS);

            while (RunFixup(ParsedEntries))
            {
                ;
            }

            //float FROM = 140.42f;
            //float TO = 152.46f;

            float FROM = 0;
            float TO   = 0;

            for (int i = 0; i < ParsedEntries.Count; i++)
            {
                ParsedEntries[i].TPS = ParsedEntries[i].TPS * (100.0f / MaxThrottle);

                if (!ParsedEntries[i].FixupTime(MinTime, FROM, TO))
                {
                    ParsedEntries[i].MarkInvalid();
                }

                if (i >= 1)
                {
                    if (ParsedEntries[i].RPM == ParsedEntries[i - 1].RPM)
                    {
                        ParsedEntries[i].MarkInvalid();
                    }
                }
            }

            for (int i = ParsedEntries.Count - 2; i >= 0; i--)
            {
                if (ParsedEntries[i].TPS >= 99 && ParsedEntries[i + 1].TPS < 99)
                {
                    ParsedEntries[i].TPS += 10;
                }
            }

            ParsedEntries = new List <CSVEntry>(ParsedEntries.Where(E => E.IsValid()));


            for (int i = 1; i < ParsedEntries.Count; i++)
            {
                float CurRPM  = ParsedEntries[i].RPM;
                float PrevRPM = ParsedEntries[i - 1].RPM;

                float CurTime  = ParsedEntries[i].DeviceTime;
                float PrevTime = ParsedEntries[i - 1].DeviceTime;

                float CurSpeed  = ParsedEntries[i].SPD;
                float PrevSpeed = ParsedEntries[i - 1].SPD;

                float HP = 0;

                if (UseNewMethod)
                {
                    HP = Calculator.Calculate(CurSpeed, PrevSpeed, CurTime, PrevTime);
                }
                else
                {
                    HP = Calculator.Calculate(2, CurRPM, PrevRPM, CurTime, PrevTime, out CurSpeed);
                }

                ParsedEntries[i].HP  = HP;
                ParsedEntries[i].SPD = CurSpeed;
            }

            if (File.Exists("out.csv"))
            {
                File.Delete("out.csv");
            }

            string OutText = CSVEntry.GetFormat() + "\n" + string.Join("\n", ParsedEntries.Select(E => E.ToString()));

            File.WriteAllBytes("out.csv", Encoding.UTF8.GetBytes(OutText));

            Console.WriteLine(CSVEntry.GetFormat());
            IEnumerable <CSVEntry> PowerRun = ParsedEntries.Where(E => E.TPS >= 99 && E.TPS <= 101);

            Console.WriteLine(string.Join("\n", PowerRun.Select(E => string.Format("{0} => {1} whp", E.ToString(), E.HP)).ToArray()));

            CSVEntry MaxHP = PowerRun.OrderByDescending(Run => Run.HP).First();

            Console.WriteLine("Max {0} whp @ {1} RPM", MaxHP.HP, MaxHP.RPM);

            return(PowerRun);
        }